Îñíîâíûå îïåðàòîðû ST
Îñíîâíûå îïåðàòîðû ÿçûêà ST:
Ïðèñâîåíèå
Îïåðàòîð RETURN
Ñòðóêòóðà IF-THEN-ELSIF-ELSE
Îïåðàòîð CASE
Èòåðàöèîííûé îïåðàòîð WHILE
Èòåðàöèîííûé îïåðàòîð REPEAT
Èòåðàöèîííûé îïåðàòîð FOR
Îïåðàòîð EXIT
Name: :=
Çíà÷åíèå: ïðèñâàèâàåò çíà÷åíèå âûðàæåíèþ
Ñèíòàêñèñ: <variable> := <any_expression>;
Îïåðàíäû: ïåðåìåííàÿ äîëæíà áûòü âíóòðåííÿÿ èëè âûõîä, ïåðåìåííàÿ è âûðàæåíèå äîëæíû èìåòü îäèí è òîò æå òèï
Âûðàæåíèå ìîæåò áûòü âûçîâîì ïîäïðîãðàììû èëè ôóíêöèè èç áèáëèîòåêè ISaGRAF.
Ïðèìåð:
(* ST ïðîãðàììà ñ ïðèñâîåíèåì *)
(* variable <<= variable *)
bo23 := bo10;
(* variable <<= expression *)
bo56 := bx34 OR alrm100 & (level >= over_value);
result := (100 * input_value) / scale;
(* ïðèñâîåíèå âîçâðàùàåìîãî çíà÷åíèÿ ïîäïðîãðàììû *)
rc := PSelect ( );
(* ïðèñâîåíèå ñ âûçîâîì ôóíêöèè *)
limited_value := min (16, max (0, input_value) );
Èìÿ: RETURN
Çíà÷åíèå: çàêàí÷èâàåò âûïîëíåíèå òåêóùåé ïðîãðàììû
Ñèíòàêñèñ: RETURN;
Îïåðàíäû: (íåò)
 áëîêå SFC îïåðàòîð RETURN îïðåäåëÿåò êîíåö âûïîëíåíèÿ òîëüêî äàííîãî áëîêà.
Ïðèìåð:
(* FBD ïðîãðàììà: ïðîãðàììèðóåìûé ñ÷åò÷èê *)
![](image/index-image357.gif)
(* ST ïðîãðàììà *)
If not (CU) then
Q := false;
CV := 0;
RETURN; (* çàêîí÷èòü ïðîãðàììó*)
end_if;
if R then
CV := 0;
else
if (CV < PV) then
CV := CV + 1;
end_if;
end_if;
Q := (CV >= PV);
Èìÿ: IF... THEN... ELSIF... THEN... ELSE... END_IF
Çíà÷åíèå: âûïîëíÿåò îäèí èëè äâà ñïèñêà ST îïåðàòîðîâ, âûáîð îñóùåñòâëÿåòñÿ â ñîîòâåòñòâèè ñî çíà÷åíèåì áóëåâñêîãî âûðàæåíèÿ
Ñèíòàêñèñ: IF <boolean_expression> THEN
<statement> ;
<statement> ;
...
ELSIF <boolean_expression> THEN
<statement> ;
<statement> ;
...
ELSE
<statement> ;
<statement> ;
...
END_IF;
Îïåðàòîðû ELSE è ELSIF - äîïîëíèòåëüíûå. Åñëè ELSE îïóùåí è óñëîâèå ðàâíî FALSE, òî íèêàêèõ èíñòðóêöèé íå âûïîëíÿåòñÿ.
Ïðèìåð:
(*ST ïðîãðàììà , èñïîëüçóþùàÿ îïåðàòîð IF*)
IF manual AND not (alarm) THEN
level := manual_level;
bx126 := bi12 OR bi45;
ELSIF over_mode THEN
level := max_level;
ELSE
level := (lv16 * 100) / scale;
END_IF;
(* IF ñòðóêòóðà áåç ELSE *)
If overflow THEN
alarm_level := true;
END_IF;
![](image/a-11-ispolzovanie-redaktora-soedinenij-v-v_1.gif)
Èìÿ: CASE... OF... ELSE... END_CASE
Çíà÷åíèå: âûïîëíÿåò îäèí èëè íåñêîëüêî ñïèñêîâ ST îïåðàòîðîâ, âûáîð îñóùåñòâëÿåòñÿ â ñîîòâåòñòâèè ñ öåëûì âûðàæåíèåì
Ñèíòàêñèñ: CASE <integer_expression> OF
<value> : <statements> ;
<value> , <value> : <statements> ;
...
ELSE
<statements> ;
END_CASE;
Çíà÷åíèåì CASE äîëæíà áûòü öåëàÿ êîíñòàíòà. Íåñêîëüêî çíà÷åíèé ðàçäåëåííûõ çàïÿòûìè ìîãóò óêàçûâàòü íà îäèí è òîò æå ñïèñîê îïåðàòîðîâ.
Îïåðàòîð ELSE - äîïîëíèòåëüíûé.
Ïðèìåð:
(*ST ïðîãðàììà , èñïîëüçóþùàÿ îïåðàòîð CASE*)
CASE error_code OF
255: err_msg := 'Division by zero';
fatal_error := TRUE;
1: err_msg := 'Overflow';
2, 3: err_msg := 'Bad sign';
ELSE
err_msg := 'Unknown error';
END_CASE;
![](image/a-11-ispolzovanie-redaktora-soedinenij-v-v_1.gif)
Èìÿ: WHILE... DO... END_WHILE
Çíà÷åíèå: èòåðàöèîííàÿ ñòðóêòóðà äëÿ ãðóïïû ST îïåðàòîðîâ, óñëîâèå âû÷èñëÿåòñÿ ïðåæäå âûïîëíåíèÿ èòåðàöèè
Ñèíòàêñèñ: WHILE <boolean_expression> DO
<statement> ;
<statement> ;
...
END_WHILE ;
Ïðåäóïðåæäåíèå:
Òàê êàê ISaGRAF ñèíõðîííàÿ ñèñòåìà âõîäíûå ïåðåìåííûå íå îáíîâëÿþòñÿ âî âðåìÿ èòåðàöèé WHILE. Èçìåíåíèå ñîñòîÿíèÿ âõîäíûõ ïåðåìåííûõ íå ìîæåò áûòü èñïîëüçîâàíî äëÿ îïèñàíèÿ óñëîâèÿ îïåðàòîðà WHILE.
Ïðèìåð:
(*ST ïðîãðàììà , èñïîëüçóþùàÿ îïåðàòîð WHILE*)
(* ýòà ïðîãðàììà èñïîëüçóåò "C" ôóíêöèè äëÿ ÷òåíèÿ *)
(* ñèìâîëîâ èç ïîñëåäîâàòåëüíîãî ïîðòà *)
string := ''; (* empty string *)
nbchar := 0;
WHILE ((nbchar < 16) & ComIsReady ( )) DO
string := string + ComGetChar ( );
nbchar := nbchar + 1;
END_WHILE;
![](image/a-11-ispolzovanie-redaktora-soedinenij-v-v_1.gif)
Èìÿ: REPEAT... UNTIL... END_REPEAT
Çíà÷åíèå: èòåðàöèîííàÿ ñòðóêòóðà äëÿ ãðóïïû ST îïåðàòîðîâ, óñëîâèå âû÷èñëÿåòñÿ ïîñëå âûïîëíåíèÿ èòåðàöèè
Ñèíòàêñèñ: REPEAT
<statement> ;
<statement> ;
...
UNTIL <boolean_condition>
END_REPEAT ;
Ïðåäóïðåæäåíèå:
Òàê êàê ISaGRAF ñèíõðîííàÿ ñèñòåìà âõîäíûå ïåðåìåííûå íå îáíîâëÿþòñÿ âî âðåìÿ èòåðàöèé REPEAT. Èçìåíåíèå ñîñòîÿíèÿ âõîäíûõ ïåðåìåííûõ íå ìîæåò áûòü èñïîëüçîâàíî äëÿ îïèñàíèÿ óñëîâèÿ îïåðàòîðà REPEAT.
Ïðèìåð:
(*ST ïðîãðàììà , èñïîëüçóþùàÿ îïåðàòîð REPEAT*)
(* ýòà ïðîãðàììà èñïîëüçóåò "C" ôóíêöèè äëÿ ÷òåíèÿ *)
(* ñèìâîëîâ èç ïîñëåäîâàòåëüíîãî ïîðòà *)
string := ''; (* empty string *)
nbchar := 0;
IF ComIsReady ( ) THEN
REPEAT
string := string + ComGetChar ( );
nbchar := nbchar + 1;
UNTIL ( (nbchar >= 16) OR NOT (ComIsReady ( )) )
END_REPEAT;
END_IF;
![](image/a-11-ispolzovanie-redaktora-soedinenij-v-v_1.gif)
Èìÿ: FOR... TO... BY... DO... END_FOR
Çíà÷åíèå: âûïîëíÿåò îãðàíè÷åííîå ÷èñëî èòåðàöèé, èñïîëüçóÿ öåëóþ àíàëîãîâóþ èíäåêñíóþ ïåðåìåííóþ
Ñèíòàêñèñ: FOR <index> := <mini> TO <maxi> BY <step> DO
<statement> ;
<statement> ;
END_FOR;
Îïåðàíäû: index: âíóòðåííÿÿ àíàëîãîâàÿ ïåðåìåííàÿ, óâåëè÷èâàþùàÿñÿ íà êàæäîì âèòêå
mini: íà÷àëüíîå çíà÷åíèå äëÿ èíäåêñà (ïåðåä ïåðâîé èòåðàöèåé)
maxi: ìàêñèìàëüíî-äîïóñòèìîå çíà÷åíèå èíäåêñà
step: ïðèðàùåíèå èíäåêñà íà êàæäîì øàãå
Îïåðàòîð [BY step] - äîïîëíèòåëüíûé. Åñëè îí íå îïðåäåëåí òî ïðèðàùåíèå ðàâíî 1.
“While” ýêâèâàëåíò îïåðàòîðà FOR:
index := mini;
while (index <= maxi) do
<statement> ;
<statement> ;
index := index + step;
end_while;
Ïðèìåð:
(*ST ïðîãðàììà , èñïîëüçóþùàÿ îïåðàòîð FOR*)
(* ýòà ïðîãðàììà èçâëåêàåò öåëûå ÷èñëà èç ñòðîêè *)
length := mlen (message);
target := ''; (* empty string *)
FOR index := 1 TO length BY 1 DO
code := ascii (message, index);
IF (code >= 48) & (code <= 57) THEN
target := target + char (code);
END_IF;
END_FOR;
![](image/a-11-ispolzovanie-redaktora-soedinenij-v-v_1.gif)
Èìÿ: EXIT
Çíà÷åíèå: âûõîä èç èòåðàöèîííûõ îïåðàòîðîâ FOR, WHILE, REPEAT
Ñèíòàêñèñ: EXIT;
Îïåðàíäû: (íåò)
EXIT, îáû÷íî, èñïîëüçóåòñÿ â îïåðàòîðå IF âíóòðè áëîêîâ FOR, WHILE, REPEAT.
Ïðèìåð:
(*ST ïðîãðàììà , èñïîëüçóþùàÿ îïåðàòîð EXIT*)
(* ýòà ïðîãðàììà èùåò ñèìâîë â ñòðîêå *)
length := mlen (message);
found := NO;
FOR index := 1 TO length BY 1 DO
code := ascii (message, index);
IF (code = searched_char) THEN
found := YES;
EXIT;
END_IF;
END_FOR;