Beispielprogramm 4 (LookUp-Tabelle erzeugen)
Download TwinCAT 3 Projekt: Programlink
Programmbeschreibung/ Funktion:
Aufnahme von LookUp-Tabellenstützwerten aus einem Eingangssignal der Klemme in eine Feldvariable (und wahlweise anschließender Übertragung der LookUp-Tabellenstützwerte per CoE‑Zugiff in die Klemme mittels Beispielprogramm 3).
Vorgesehen ist die Verwendung eines Rampengenerators mit Trigger-Eingang, dessen Pegel zusammen mit einem Eingang einer digitalen Eingangsklemme (z.B. EL1002) über eine Verknüpfung die Variable „bStartRecord“ auf TRUE setzt (z.B. Taster an +24V verschaltet). Dadurch kann die Aufnahme der Werte mit der Rampeneingangsspannung synchronisiert werden. Alternativ kann auch eine Ausgangsklemme verwendet werden (z.B. EL2002), dessen Ausgang den Trigger-Eingang ansteuert und dann über die Entwicklungsumgebung TwinCAT auf TRUE gesetzt wird („bStartRecord“ müsste dann entsprechend als AT%Q* deklariert werden und mit einem Ausgang der Klemme verknüpft sein).
Variablendeklaration Beispielprogramm 4
// Variablendeklaration for example program 4PROGRAM MAINVAR CONSTANT nEndX : BYTE := 50; // Anzahl StützwerteEND_VARVAR nPAISampleIn AT%I* : DINT; // PDO PAISamples bStartRecord AT%I* : BOOL; // Elektrische Verbindung zum Trigger für Rampe bGetMinMax : BOOL := FALSE; bRecordLUT : BOOL := FALSE; r_trigStartRecord : R_TRIG; nX : BYTE := 0; aValues : ARRAY[0..nEndX-1] OF DINT; nYstepValue : DINT; tp_timer : TP; ton_timer : TON; nMinValue : DINT := 7812500; nMaxValue : DINT := -7812500; nYvalue : DINT; tRepeatTimerValue : TIME := T#51MS; aLUT : ARRAY[0..99] OF DINT;END_VARAusführungsteil:
// Beispielprogramm 4:// ################# Aufnahme von 50 Messpunkten: #################// a) Ermittlung der min./max. Werte (entspricht Wertebereich des Sensors)tp_timer(IN:=bGetMinMax, PT:=T#2.51S); // Periodendauer der Rampe (+Reserve)IF tp_timer.Q THEN nMinValue := MIN(nPAISampleIn, nMinValue); nMaxValue := MAX(nPAISampleIn, nMaxValue);END_IF// b) Aufnahme der Werte: Startr_trigStartRecord(CLK:=bStartRecord);IF r_trigStartRecord.Q THEN nX := 0; memset(ADR(aLUT), 0 , 100); bRecordLUT := TRUE;END_IFton_timer();IF bRecordLUT OR ton_timer.Q THEN bRecordLUT := FALSE; ton_timer(IN:=FALSE); IF(nX < nEndX) THEN // b.1) Aufnahme der Werte: aValues[nX] := nPAISampleIn; nX := nX + 1; ton_timer(IN:=TRUE, PT:=tRepeatTimerValue); // T=2,5s/49 = 51ms ELSE // b.2) Speicherung abgeschlossen: // Erzeuge Linearisierte Werte: nYstepValue := (nMaxValue - nMinValue) / nEndX; // Y-Schritte nYvalue := aValues[0]; // Gemeinsamer Startwert der LUT FOR nX:=0 TO nEndX DO // Erstelle LUT (X = IST-Werte, Y = SOLL-Werte): aLUT[nX*2] := aValues[nX]; // X-Wert aLUT[nX*2+1] := nYvalue; // Y-Wert // Nächster Y-Wert der LUT (erzeuge "Gerade"): nYvalue := nYvalue + nYstepValue; // f(x) = b+x END_FOR END_IFEND_IF