SPOSÓB KLASYCZNY
Oczywistym sposobem na obsługę zmian sygnału jest zapamiętanie poprzedniego stanu.
VAR
stan : BOOL;
stanPoprzedni : BOOL;
END_VAR
IF stan <> stanPoprzedni THEN
reakcja na zbocze
END_IF
IF stan <> stanPoprzedni AND stan THEN
reakcja na zbocze narastające
END_IF
IF stan <> stanPoprzedni AND NOT stan THEN
reakcja na zbocze opadające
END_IF
stanPoprzedni := stan;
Bardzo istotna jest ostatnia linijka przykładu.
SPOSÓB ELEGANCKI
Język ST udostępnia specjalne bloki funkcyjne służące go obsługi zmian sygnału. R_TRIG zwraca na wyjściu stan wysoki przy zboczu narastającym, a F_TRIG przy zboczu opadającym.
Wejścia i wyjścia:
- wejście CLK : BOOL
- wyjście Q : BOOL
Przykład:
VAR_INPUT
stan : BOOL;
zboczeNarastajace : R_TRIG;
zboczeOpadajace : F_TRIG;
END_VAR
zboczeNarastajace(CLK := stan);
zboczeOpadajace(CLK := stan);
IF zboczeNarastajace.Q OR zboczeOpadajace.Q THEN
reakcja na zbocze
END_IF
IF zboczeNarastajace.Q THEN
reakcja na zbocze narastające
END_IF
IF zboczeOpadajace.Q THEN
reakcja na zbocze opadające
END_IF
Do zapamiętania zmiany można lekko zmodyfikować wywołanie bloku.
IF NOT zboczeNarastajace.Q THEN
zboczeNarastajace(CLK := stan);
END_IF
W tym przypadku by wyresetować, wystarczy dodatkowo wywołać blok z negatywnym parametrem na wejściu.
zboczeNarastajace(CLK := FALSE);
Dwa powyższe przykłady pozwalają bardzo prosto poczekać na kilka zboczy.
VAR_INPUT
stanNr1 : BOOL;
stanNr2 : BOOL;
zboczeNr1 : R_TRIG;
zboczeNr2 : R_TRIG;
END_VAR
IF NOT zboczeNr1.Q THEN
zboczeNr1(CLK := stanNr1);
END_IF
IF NOT zboczeNr2.Q THEN
zboczeNr2(CLK := stanNr2);
END_IF
IF zboczeNr1.Q AND zboczeNr2.Q THEN
instrukcje dla obu zboczy narastających
zboczeNr1(CLK := FALSE);
zboczeNr2(CLK := FALSE);
END_IF
Dodatkowo możemy określić kolejność, w jakiej sygnały mają się zmienić. W tym celu zmieniamy instrukcję warunkową towarzyszącą wywołaniu drugiego bloku.
IF zboczeNr1.Q AND NOT zboczeNr2.Q THEN
zboczeNr2(CLK := stanNr2);
END_IF
Brak komentarzy:
Prześlij komentarz