<< Click to Display Table of Contents >> Navigation: Irinos-System Betriebsanleitung > Messung / Steuerung via MscDll > Beispiele zur dynamischen Messung > Beispiel 2: Positionsgesteuerte dynamische Messung |
Aufgabenstellung
An einem Werkstück soll eine Rundlaufmessung durchgeführt werden. Das Werkstück befindet sich dazu auf einem Drehteller und wird von einem ungeregelten Antrieb in ca. 5 Sekunden einmal gedreht. Während dieser Umdrehung sollen 720 Messwerte in 0,5°-Schritten aufgezeichnet werden.
Zwischen Antrieb und Drehteller befindet sich ein inkrementeller Drehgeber mit 3600 Inkrementen pro Umdrehung (Drehrichtung: positiv). Das Werkstück wird mittels zweier induktiver Messtaster vermessen (siehe Abbildung).
Der Inkrementalgeber befindet sich am Mess-Eingang T12, die beiden induktiven Messtaster an den Mess-Eingängen T4 und T5.
Beispiel "positionsgesteuerte dynamische Messung"
Vorüberlegung
Basierend auf der Inkrementalgeber-Auflösung von 3600 Inkrementen pro Umdrehung und der Schrittweite von 0,5°, beträgt die Schrittweite zwischen zwei Messwerterfassungen 5 Inkremente.
Beispiel-Code
// Kanalliste 1 mit den Tastern T4 und T5 erstellen und zum Gerät schreiben
ansiString = “#1;T4;T5#”;
WriteCommandStr(opcWCL, ansiString);
if (ansiString != “#0#”) return -1; // Abbruch aufgrund eines Fehlers
// Trigger definieren:
// TriggerNr 1; Positionsgesteuert; Positionsgeber = Messkanal T12; Divisor = 1; // Intervall = 5; Start = 0; Ende: * = ohne
ansiString = “#1;P;T12;1;5;0;*#”;
WriteCommandStr(opcDT, ansiString);
if (ansiString != “#0#”) return -2; // Abbruch aufgrund eines Fehlers
// Dynamische Messung 1 definieren:
// TriggerNr 1; Kanalliste 1; Dyn. Messung aktiv; 720 Messwerte
ansiString = “#1;1;1;720#”;
WriteCommandStr(opcDDM1, ansiString);
if (ansiString != “#0#”) return -3; // Abbruch aufgrund eines Fehlers
// Übertragungs-Kanal für dynamische Messwerte einrichten
result = MSC_SetupExtendedDynamicChannel(pDevice, opcRDM1, 2, 1, NULL);
if (result != MSC_STATUS_SUCCESS) return -4;
// 2 Puffer mit jeweils 720 * 4 Bytes = 2880 Bytes für die Messwerte allokieren // und der DLL zuweisen
for (i = 0; i < 2; i++) {
buffer[i] = malloc(720*4);
result = MSC_AttachSubChannelBuffer(pDevice, opcRDM1, i, 720*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 < 720);
// Trigger de-aktivieren
ansiString = “#1#”;
WriteCommandStr(opcIT, ansiString);
// Die Messwerte stehen nun zur Verfügung und können ausgewertet werden
Beginn der dynamischen Messung
Ein häufig auftretendes Anwendungs-Problem bei derartigen Messungen, ist der Beginn der dynamischen Messung. In obigem Beispiel-Code wird von der Start-Position 0 ausgegangen. Dies funktioniert aber nur dann, wenn der Drehteller vor Beginn der Messung soweit zurückgedreht wird, dass die Position des Inkrementalgebers T12 negativ ist. Dies ist nicht in allen Fällen möglich oder sinnvoll.
Zur Lösung des Problems kann die Position des Inkrementalgebers mit der Funktion MSC_WriteCommand in Verbindung mit dem Opcode opcSP (0x35) auf einen definierten Wert gesetzt werden. Wenn der Inkrementalgeber einer Referenzmarke hat, dann ergibt sich damit eine sehr elegante Lösung:
a)Vor Beginn der Messung wird die Inkrementalgeber-Position auf einen Wert gesetzt, der vor dem Start der Messung liegt. Im Beispiel also < 0, z.B. -100.000. Gleichzeitig wird die Referenzmarke aktiviert.
b)Die Messung wird gestartet. Der Antrieb beginnt zu drehen.
c)Mit Erreichen der Referenzmarke wird die Inkrementalgeber-Position auf 0 gesetzt. Die dynamische Messung nimmt ab jetzt die Messwerte auf.
An obigem Beispiel-Code müsste dazu vor dem Aktivieren des Triggers folgender Code ausgeführt werden:
// Inkrementalgeber-Position setzen und Referenzmarke aktivieren
ansiString = “#T12;-100000;REFON#”;
WriteCommandStr(opcSP, ansiString);
if (ansiString != “#0#”) return -8; // Abbruch aufgrund eines Fehlers
Für manche Applikationen hat diese Lösung den Nachteil, dass die Position nach erneutem Überschreiten der Referenzmarke, also im Beispiel nach 3600 Inkrementen, wieder auf 0 gesetzt wird. Wenn dies nicht gewünscht ist, so kann während der dynamischen Messung die Referenzmarke wieder deaktiviert werden, ohne die Inkrementalgeber-Position zu verändern. Dazu wird in die do-while – Schleife wie folgt abgeändert:
// Ende der dynamischen Messung abwarten
merkerEinmalig = true;
do {
result = MSC_GetPosition(pDevice, opcRDM1, &nMesswerte);
if (result != MSC_STATUS_SUCCESS) return -7;
if ((merkerEinmalig == true) && (statischerMesswertT12 > 0)) {
merkerEinmalig = false;
ansiString = “#T12;*;REFOFF#”;
WriteCommandStr(opcSP, ansiString);
if (ansiString != “#0#”) return -9; // Abbruch aufgrund eines Fehlers
}
Sleep(50); // 50 ms Pause als Beispiel
} while (nMesswerte < 720);
Es wird davon ausgegangen, dass die statische Messung parallel läuft. Die Variable statischerMesswertT12 enthält dabei den Messwert des Inkremental-Gebers T12, der zuletzt mit der statischen Messung übertragen wurde.