<< Click to Display Table of Contents >> Navigation: Irinos-System Betriebsanleitung > Messung / Steuerung via MscDll > Beispiele zur dynamischen Messung > Beispiel 1: Zeitgesteuerte dynamische Messung |
Aufgabenstellung
An einem 12cm langen Werkstück soll von zwei Seiten die Planarität der Oberfläche ermittelt werden. Dazu wird auf jeder Seite ein inkrementeller Messtaster aufgesetzt (T2 und T3). Das Werkstück wird über einen Servo-Antrieb mit praktisch konstanter Geschwindigkeit entlang des Werkstücks bewegt.
Es dauert ca. 2 Sekunden, um das Werkstück an den Messtastern entlang zu bewegen. Um auch kleinste Unebenheiten zu erfassen, ist eine Abtastrate von 5.000 Messwerten/s erforderlich.
Die Position des Werkstücks wird über einen linearen Inkrementalgeber mit 32000 Inkrementen/cm erfasst (T4) und zur anschließenden Verrechnung der Messtaster-Werte benötigt.
Beispiel "zeitgesteuerte dynamische Messung"
Vorüberlegungen
Es ist bekannt, dass die Messung ca. 2 Sekunden dauert, eine genaue Dauer ist aber nicht bekannt. Deshalb muss die dynamische Messung zunächst mit einer Dauer gestartet werden, die länger ist. Es werden 4 Sekunden gewählt. Während der dynamischen Messung wird dann anhand der Position des Werkstückes (T4) geprüft, ob alle erforderlichen Messwerte aufgenommen wurden. Falls ja, wird die dynamische Messung beendet.
Die Werkstücklänge in Inkrementen des Inkrementalgebers T4 beträgt Sobald dieser Wert erreicht ist, ist die dynamische Messung beendet.
Beispiel-Code
// Kanalliste 1 mit den Tastern T2, T3 und T4 erstellen und zum Gerät schreiben
ansiString = “#1;T2;T3;T4#”;
WriteCommandStr(opcWCL, ansiString);
if (ansiString != “#0#”) return -1; // Abbruch aufgrund eines Fehlers
// Trigger definieren:
// TriggerNr 1; Zeitgesteuert; * = kein Eingangskanal erforderlich; Divisor = 1;
// Intervall = 0.2ms (-> 5000 Messwerte/s); Start = 0ms; Ende = 4000ms
ansiString = “#1;T;*;1;0.2;0;4000#”;
WriteCommandStr(opcDT, ansiString);
if (ansiString != “#0#”) return -2; // Abbruch aufgrund eines Fehlers
// Dynamische Messung 1 definieren:
// TriggerNr 1; Kanalliste 1; Dyn. Messung aktiv;
// 5s * 4000 Messwerte/s = 20000 Messwerte
ansiString = “#1;1;1;20000#”;
WriteCommandStr(opcDDM1, ansiString);
if (ansiString != “#0#”) return -3; // Abbruch aufgrund eines Fehlers
// Übertragungs-Kanal für dynamische Messwerte einrichten
result = MSC_SetupExtendedDynamicChannel(pDevice, opcRDM1, 3, 1, NULL);
if (result != MSC_STATUS_SUCCESS) return -4;
// 3 Puffer mit jeweils 20000 * 4 Bytes = 80000 Bytes für die Messwerte
// allokieren und der DLL zuweisen
for (i = 0; i < 3; i++) {
buffer[i] = malloc(20000*4);
result = MSC_AttachSubChannelBuffer(pDevice, opcRDM1, i, 20000*4, &buffer[i]);
if (result != MSC_STATUS_SUCCESS) return -5;
}
// Trigger aktivieren
ansiString = “#1#”;
WriteCommandStr(opcAT, ansiString);
if (ansiString != “#0#”) return -6; // Abbruch aufgrund eines Fehlers
// Ende der dynamischen Messung abwarten
do {
result = MSC_GetPosition(pDevice, opcRDM1, &nMesswerte);
if (result != MSC_STATUS_SUCCESS) return -7;
Sleep(50); // 50 ms Pause als Beispiel
} while ((nMesswerte < 20000) && (statischerMesswertT4 < 384000));
// Trigger de-aktivieren
ansiString = “#1#”;
WriteCommandStr(opcIT, ansiString);
// Die Messwerte stehen nun zur Verfügung und können ausgewertet werden
Es wird davon ausgegangen, dass die statische Messung parallel läuft. Die Variable statischerMesswertT4 enthält dabei den Messwert des Inkremental-Gebers T4, der zuletzt mit der statischen Messung übertragen wurde.