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 4
PROGRAM MAIN
VAR CONSTANT
nEndX : BYTE := 50; // Anzahl Stützwerte
END_VAR
VAR
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_VAR
Ausfü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: Start
r_trigStartRecord(CLK:=bStartRecord);
IF r_trigStartRecord.Q THEN
nX := 0;
memset(ADR(aLUT), 0 , 100);
bRecordLUT := TRUE;
END_IF
ton_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_IF
END_IF