Beispielprogramm 4 (LookUp-Tabelle erzeugen)

Download TwinCAT 3 Projekt: Programlink

Programmbeschreibung/ Funktion:

Aufnahme von LookUp-Tabellenstützwerten aus einem Eingangssignal der Box in eine Feldvariable (und wahlweise anschließender Übertragung der LookUp-Tabellenstützwerte per CoE‑Zugiff in die Box 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