*
FUNCTION_BLOCK FB 10
TITLE =alt/neuwert-vergleich
//baustein zum zeitversetzten einlesen und vergleichen eines REAL-wertes
//
//DATE: 17.06.2008
//AUTHOR: 4lagig
//VERSION: V0.1 BasicVer
AUTHOR : '4lagig'
VERSION : 0.1
VAR_INPUT
xPlcPulse : BOOL ; //CPU-Taktmerker z.b. Mx.5 (1Hz)
xTrigger : BOOL ; //Startimpuls
rValue : REAL ; //Wert
iTime : INT ; //Zeitverzug
END_VAR
VAR_OUTPUT
xActEquOld : BOOL ; //neuer Wert == alter Wert
xActBiggerOld : BOOL ; //neuer Wert > alter Wert
xActLowerOld : BOOL ; //neuer Wert < alter Wert
rValueActOut : REAL ;
rValueOldOut : REAL ;
END_VAR
VAR
iTimer : INT ;
xOnAir : BOOL ;
xHelpFlag1 : BOOL ;
xHelpFlag2 : BOOL ;
rValueAct : REAL ;
rValueOld : REAL ;
END_VAR
BEGIN
NETWORK
TITLE =
UN #xOnAir; //noch nicht getriggert
U #xTrigger; //und getriggert
FP #xHelpFlag1; //nehmen aber nur die flanke
SPBN notn; //wenn das nich, dann gucken wir mal ob schon läuft
L #rValue; //wenn doch, dann den wert
T #rValueAct; //in den aktuellen wert schieben
R #xActEquOld; //vergleichsergebnisse
R #xActBiggerOld; //rücksetzen
R #xActLowerOld; //
S #xOnAir; //und aufzeichnungsbit setzen
notn: U #xOnAir; //es wurde getriggert
U #xPlcPulse; //und der CPU-takt-merker (z.b. 1s)
FP #xHelpFlag2; //davon aber auch nur die flanke
SPBN end;
L #iTimer; //macht uns einen timer
+ 1; //den wir inkrementieren
T #iTimer; //und speichern
L #iTimer; //hat unser timer den
L #iTime; //selben wert wie die vorgabe
==I ;
SPBN end;
R #xOnAir; //stoppen wir die aufzeichnung
L 0; //setzen den
T #iTimer; //timer zurück
L #rValueAct; //und verschieben den letzten aktuellen wert
T #rValueOld; //in den speicherplatz alter wert
L #rValue; //und den aktuellen wert
T #rValueAct; //in den speicherplatz des aktuellen werts
L #rValueAct; //aktueller wert
L #rValueOld; //alter wert
==R ; //gleich?
SPBN noeq;
= #xActEquOld; //gleich-bit schreiben
noeq: L #rValueAct; //aktueller wert
L #rValueOld; //alter wert
>R ; //größer?
SPBN nobi;
= #xActBiggerOld; //größer-bit schreiben
nobi: L #rValueAct; //aktueller wert
L #rValueOld; //alter wert
<R ; //kleiner
SPBN end;
= #xActLowerOld; //kleiner-bit schreiben
end: L #rValueAct; //und die werte noch
T #rValueActOut; //nach außen schreiben
L #rValueOld; //wenn das wirklich
T #rValueOldOut; //notwendig sein sollte
SET ; //und den baustein
SAVE ; //geordnet verlassen
END_FUNCTION_BLOCK