czwartek, 14 stycznia 2016

Podstawy ST - zbocza

Zbocze to moment zmiany sygnału. Jeśli sygnał zmienia się z niskiego na wysoki to jest to zbocza narastające, w przeciwnym przypadku mówimy o zboczu opadającym.


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