ISaGRAF. Version 3.4

         

Îñíîâíûå îïåðàòîðû 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

Çíà÷åíèå:                   çàêàí÷èâàåò âûïîëíåíèå òåêóùåé ïðîãðàììû

Ñèíòàêñèñ:                 RETURN;

Îïåðàíäû:                 (íåò)

 áëîêå SFC îïåðàòîð RETURN îïðåäåëÿåò êîíåö âûïîëíåíèÿ òîëüêî äàííîãî áëîêà.

Ïðèìåð:

(* FBD ïðîãðàììà: ïðîãðàììèðóåìûé ñ÷åò÷èê *)

(* 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-ELSE

Èìÿ:                              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;

        Îïåðàòîð CASE


Èìÿ:                              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;

       
Èòåðàöèîííûé îïåðàòîð WHILE

Èìÿ:                              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;

       
Èòåðàöèîííûé îïåðàòîð REPEAT

Èìÿ:                              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;

       
Îïåðàòîð FOR

Èìÿ:                              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;

        Îïåðàòîð EXIT


Èìÿ:                              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;


Ñîäåðæàíèå ðàçäåëà