VAR_IN_OUT
i_oCycCountMax : INT ; // max Anzahl Zyklen bis gültig // 2)
VAR_END
VAR_INPUT
inpNumOfBits : INT ; // Anzahl Bits in inpPattern
inpPattern : DWORD ; // u.a. BCD (rechtsbündig!)
VAR_END
VAR_OUTPUT
outBCDvalid : DWORD ; // gültige BCDzahl
outCycCount : INT ; // akt Anzahl Zyklen bis gültig // 1)
outDecValid : DINT ; // gültige DezZahl
outInvalid : BOOL ; // Eingabe ist ungültig
outSteady : BOOL ; // Eingabe ist stabil
VAR_END
VAR_STATIC
statCycCount : INT ; // Anzahl Zyklen bis gültig
statPreInvalid : BOOL ; // vorheriger ungültig-Zustand
statPrePattern : DWORD ; // vorheriges Bitmuster (maskiert)
VAR_END
VAR_TEMP
tmpPattern : DWORD ; // aktuelles Bitmuster (maskiert)
VAR_END
L 28 // Anzahl Bit gegrenzen
L inpNumOfBits // max : 28
>=I
SPB MAX
TAK
MAX: L 4 // min : 4
<=I
SPB MIN
TAK
MIN: L 1
SLD
+ -1 // Maske
L inpPattern // Bitmuster maskieren
UD
T tmpPattern
L statPrePattern // Bitmuster stabil?
TAK
T statPrePattern
==I
= outSteady
SLD 1 // PseudoTetraden?
OD
SLD 1
UD
UD #16#8888888
O <>0
ON outSteady
= outInvalid
SPB IVAL
L tmpPattern // gültig
T outBCDvalid
BTD
T outDecValid
UN statPreInvalid
SPB CONT // gültig geworden
L i_oCycCountMax // wenn Zähler > bisher // 2)
L statCycCount
T outCycCount // akt Zähler ausgeben // 1)
>=I // 2)
SPB CONT // 2)
T i_oCycCountMax // MaxZähler aktualisieren // 2)
CONT: L 0
SPA STOR
IVAL: L 255 // 1..32767
L statCycCount // OberGrenze ZyklZähler
>I
+I 1
SPB STOR
TAK
STOR: T statCycCount
U outInvalid
= statPreInvalid
BE
// 1) nur erforderlich für Ausgabe "akt. ZyklenAnzahl bis gültig"
// 2) nur erforderlich für Ausgabe "max. ZyklenAnzahl bis gültig"
// Prüft das EingangsBitmuster in 'inpPattern'.
// Die BCD-Zahl muss dort rechtsbündig stehen.
// Die Anzahl auszuwertende Bits werden in 'inpNumOfBits' vorgegeben.
// 1..7 BCD-Stellen sind möglich, also 4..28 Bits.
// Wenn sich die relevanten Bits in zwei aufeinander folgenden Zyklen
// nicht geändert haben und keine PseudoTetraden festgestellt
// werden, wird die BCD-Zahl in 'outBCDvalid' ausgegeben und die
// in Dezimal gewandelte Zahl in 'outDecValid'.
// Beide bleiben anstehen, bis wieder ein Bitmuster stabil ansteht,
// das keine PseudoTetraden enthält.
// In 'outCycCount' wird ausgegeben, wieviele Zyklen lang das
// Bitmuster nicht stabil bzw. nicht frei von PseudoTetraden war.
// In 'i_oCycCountMax' wird der maximal aufgetretene Wert seit dem
// Löschen dieser Variable ausgegeben.
// Ein Überlaufen des ZyklenZählers wird verhindert, um FehlInter-
// pretationen zu vermeiden. Die Obergrenze kann im Bereich 1..32767
// gewählt werden und ist z.Z. auf 255 festgelegt (s. Label IVAL:).