VAR_INPUT
biLSoben : BOOL ; // LichtSchranke "oben" (Low-Signal, wenn unterbochen)
biLSunten : BOOL ; // LichtSchranke "unten" (Low-Signal, wenn unterbochen)
biResetFlach : BOOL ; // SchnittstellenBit zum Rücksezen des "Flach"ZählWertes
biResetHoch : BOOL ; // SchnittstellenBit zum Rücksezen des "Hoch"ZählWertes
END_VAR
VAR_OUTPUT
boFehlerLSunten : BOOL ; // Fehler: LS "unten" hat nicht gemeldet (optional!)
END_VAR
VAR // statisch !!! Falls in FC, dann stattdessen VAR_IN_OUT !
bsFehlerLSunten : BOOL ; // Fehler: LS "unten" hat nicht gemeldet
// wird rückgesetzt, sobald Flanke an 'biLSunten' auftritt
bsHochGesp : BOOL ; // Speicher für Zustand "hoch"
// wird rückgesetzt durch High-Signal an 'biLSunten'
bsLSobenZuvor : BOOL ; // FlankenMerker für LichtSchranke "oben"
bsLSuntenZuvor : BOOL ; // FlankenMerker für LichtSchranke "unten"
END_VAR
// wsFlachZählBCD : WORD ; // DatenWort für "Flach"ZählWert
// wsHochZählBCD : WORD ; // DatenWort für "Hoch"ZählWert
// Z_univ : WORD ; // S7-Zähler
L 0
U biResetHoch // BCD-ZählWert hohe Pakete rücksetzen
SPBN SKRH
T wsHochZählBCD // BCD-ZählWert hohe Pakete
SKRH: U biResetFlach // BCD-ZählWert flache Pakete rücksetzen
SPBN SKRF
T wsFlachZählBCD // BCD-ZählWert flache Pakete
SKRF: UN biLSunten // beide LS unterbrochen
UN biLSoben
S bsHochGesp
X biLSunten // beliebige Flanke von biLSunten
X bsLSuntenZuvor
R bsFehlerLSunten
L wsHochZählBCD
U biLSoben // neg Flanke biLSoben
UN bsLSobenZuvor
UN bsHochGesp
S bsFehlerLSunten
SPB CNT
ON biLSunten
O bsLSuntenZuvor
SPB ALWY
U bsHochGesp // neg Flanke biLSunten
SPB CNT
L wsFlachZählBCD
CNT: CLR // S7-Zähler
S Z_univ
ZV Z_univ
SET // pos Flanke bilden
S Z_univ
ZV Z_univ
LC Z_univ // S7-Zähler in BCD auslesen
O bsHochGesp
O bsFehlerLSunten
SPB HIGH
T wsFlachZählBCD
SPA ALWY
HIGH: T wsHochZählBCD
ALWY: U biLSunten // FlankenMerker bilden
= bsLSuntenZuvor
U biLSoben
= bsLSobenZuvor
U biLSunten // Zustand hoch rücksetzen
R bsHochGesp
// optional:
U bsFehlerLSunten // Fehler: LS "unten" hat nicht gemeldet
= boFehlerLSunten // --> Ausgang