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