Beispiel 3: 2 dynamische Messungen gleichzeitig

<< Click to Display Table of Contents >>

Navigation:  Irinos-System Betriebsanleitung > Messung / Steuerung via MscDll > Beispiele zur dynamischen Messung >

Beispiel 3: 2 dynamische Messungen gleichzeitig

Aufgabenstellung

Es sollen zwei Werkstücke parallel zeit-gesteuert vermessen werden. Aufgrund der unterschiedlichen Werkstück-Eigenschaften ist für das Werkstück 1 eine Abtastrate von 4.000 Messwerten/s erforderlich, für das Werkstück 2 ist eine Abtastrate von 1.000 Messwerten/s ausreichend.

Für die Bewertung von Werkstück 1 sind Messwerte der Mess-Kanäle T1, T2, T3 und T9 erforderlich.

Für die Bewertung von Werkstück 2 sind Messwerte der Mess-Kanäle T2, T6, T7, T8, T10, T11 und T12 erforderlich.

Beide dynamische Messungen sollen gleichzeitig gestartet werden. Die erste Messung dauert 2,5 Sekunden. Die zweite Messung soll beendet werden, nachdem 5000 Messwerte aufgezeichnet wurden.
 

Beispiel-Code

// Kanalliste 1 mit den Tastern T1, T2, T3 und T9 erstellen und zum Gerät
// schreiben. Diese wird für die erste dynamische Messung benötigt.

ansiString = “#1;T1;T2;T3;T9#”;

WriteCommandStr(opcWCL, ansiString);

if (ansiString != “#0#”) return -101; // Abbruch aufgrund eines Fehlers

 

// Kanalliste 2 mit den Tastern T5, T6, T7, T8, T10, T11 und T12 erstellen und
// zum Gerät schreiben. Diese wird für die zweite dynamische Messung benötigt.

ansiString = “#2;T2;T6;T7;T8;T10;T11;T12#”;

WriteCommandStr(opcWCL, ansiString);

if (ansiString != “#0#”) return -201; // Abbruch aufgrund eines Fehlers

 

// Trigger 1 definieren. Dieser wird für die erste dynamische Messung benötigt.
// TriggerNr 1; Zeitgesteuert; * = kein Eingangskanal erforderlich; Divisor = 1; // Intervall = 0.25ms (-> 4000 Messwerte/s); Start = 0ms; Ende = 2500ms
ansiString = “#1;T;*;1;0.25;0;2500#”;

WriteCommandStr(opcDT, ansiString);

if (ansiString != “#0#”) return -102; // Abbruch aufgrund eines Fehlers

 

// Trigger 2 definieren. Dieser wird für die zweite dynamische Messung benötigt.
// TriggerNr 2; Zeitgesteuert; * = kein Eingangskanal erforderlich; Divisor = 1; // Intervall = 1ms (-> 1000 Messwerte/s); Start = 0ms; Ende: * = ohne
ansiString = “#2;T;*;1;1;0;*#”;

WriteCommandStr(opcDT, ansiString);

if (ansiString != “#0#”) return -202; // Abbruch aufgrund eines Fehlers

 

// Dynamische Messung 1 definieren:
// TriggerNr 1; Kanalliste 1; Dyn. Messung aktiv;
// Anzahl Messwerte: * = unbegrenzt

ansiString = “#1;1;1;*#”;

WriteCommandStr(opcDDM1, ansiString);

if (ansiString != “#0#”) return -103; // Abbruch aufgrund eines Fehlers

 

// Dynamische Messung 2 definieren:
// TriggerNr 2; Kanalliste 2; Dyn. Messung aktiv;
// Anzahl Messwerte: * = unbegrenzt

ansiString = “#2;2;1;5000#”;

WriteCommandStr(opcDDM2, ansiString);

if (ansiString != “#0#”) return -203; // Abbruch aufgrund eines Fehlers

 

// Übertragungs-Kanal für dynamische Messung 1 einrichten

result = MSC_SetupExtendedDynamicChannel(pDevice, opcRDM1, 4, 1, NULL);

if (result != MSC_STATUS_SUCCESS) return -104;

 

// 4 Puffer mit jeweils 2,5s * 4000Messwerte/s * 4 Bytes/Messwert = 40000 Bytes // für die Messwerte der  ersten dynamischen Messung allokieren und der DLL
// zuweisen

for (i = 0; i < 4; i++) {

 bufDyn1[i] = malloc(40000);

 result = MSC_AttachSubChannelBuffer(pDevice, opcRDM1, i, 40000, &bufDyn1[i]);

 if (result != MSC_STATUS_SUCCESS) return -105;

}

 

// Übertragungs-Kanal für dynamische Messung 2 einrichten

result = MSC_SetupExtendedDynamicChannel(pDevice, opcRDM2, 7, 1, NULL);

if (result != MSC_STATUS_SUCCESS) return -204;

 

// 7 Puffer mit jeweils 5000 * 4 Bytes = 20000 Bytes für die Messwerte der
// zweiten dynamischen Messung allokieren und der DLL zuweisen

for (i = 0; i < 7; i++) {

 bufDyn2[i] = malloc(20000);

 result = MSC_AttachSubChannelBuffer(pDevice, opcRDM2, i, 20000, &bufDyn2[i]);

 if (result != MSC_STATUS_SUCCESS) return -205;

}

 

// Trigger 1 aktivieren. Damit wird die erste dynamische Messung gestartet.

ansiString = “#1#”;

WriteCommandStr(opcAT, ansiString);

if (ansiString != “#0#”) return -106; // Abbruch aufgrund eines Fehlers

 

// Trigger 2 aktivieren. Damit wird die zweite dynamische Messung gestartet.

ansiString = “#2#”;

WriteCommandStr(opcAT, ansiString);

if (ansiString != “#0#”) return -206; // Abbruch aufgrund eines Fehlers

 

// Ende der dynamischen Messung abwarten

do {

 result = MSC_GetPosition(pDevice, opcRDM1, &nMesswerteDyn1);

 if (result != MSC_STATUS_SUCCESS) return -107;

 result = MSC_GetPosition(pDevice, opcRDM2, &nMesswerteDyn2);

 if (result != MSC_STATUS_SUCCESS) return -207;

 Sleep(50); // 50 ms Pause als Beispiel

} while ( (nMesswerteDyn1 < 10000) && (nMesswerteDyn2 < 5000) );

 

// Trigger 1 de-aktivieren

ansiString = “#1#”;

WriteCommandStr(opcIT, ansiString);

 

// Trigger 2 de-aktivieren

ansiString = “#2#”;

WriteCommandStr(opcIT, ansiString);

 

// Die Messwerte stehen nun zur Verfügung und können ausgewertet werden

 

Anmerkungen

oIn diesem Beispiel werden die beiden dynamischen Messungen gleichzeitig gestartet. Dies könnte auch unabhängig voneinander erfolgen.

oDie beiden zeitgesteuerten Messungen werden unterschiedlich beendet: einmal über die Zeit, einmal über die Anzahl der Messwerte. Bei der zeitgesteuerten Messung sind diese beiden Möglichkeiten gleichwertig.
In der Praxis würde man für beide Messungen dieselbe Möglichkeit anwenden.

oEs wird in der do-while - Schleife gewartet, bis beide dynamischen Messungen beendet sind. Erst dann wird mit der Messwert-Auswertung begonnen.
Die erste dynamische Messung ist aber viel früher fertig. Deshalb könnte mit der Auswertung auch schon früher begonnen werden.

oDer Mess-Kanal T2 wird in beiden dynamischen Messungen verwendet. Dies ist kein Problem, da die Messwert-Aufzeichnung unabhängig voneinander ist.