Beispiel 1: Zeitgesteuerte dynamische Messung

<< 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 dynamische Messung

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 MscDll_Dyn_Beispiel1_FormelWerkstücklänge 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.