127
ÓÄÊ 681.5 ÁÁÊ 32.96 Ï30 Ïåòðîâ È. Â. Ï30 Ïðîãðàììèðóåìûå êîíòðîëëåðû. Ñòàíäàðòíûå ÿçûêè è èíñòðó- ìåíòû / Ïîä ðåä. ïðîô. Â. Ï. Äüÿêîíîâà. — Ì.: ÑÎËÎÍ-Ïðåññ, 2003. — 256 ñ.: èë. — (Ñåðèÿ «Ïðîåêòèðîâàíèå??????») ISBN 5-98003-079-4 Îïèñàíà ïðàêòèêà ïðèìåíåíèÿ ïðîìûøëåííûõ ïðîãðàììèðóåìûõ êîíòðîëëåðîâ, øèðîêî ïðèìåíÿþùèõñÿ äëÿ àâòîìàòèçàöèè ïðîèçâîäñò- âà. Èçëàãàþòñÿ ÿçûêè ïðîãðàììèðîâàíèÿ íà îñíîâå äåéñòâóþùåãî ñòàí- äàðòà ÌÝÊ 61131-3 è ìíîãî÷èñëåííûå ïðèìåðû ïîäãîòîâêè ïðîãðàìì äëÿ ïðîìûøëåííûõ ïðîãðàììèðóåìûõ êîíòðîëëåðîâ. Äëÿ ñïåöèàëèñòîâ ïî àâòîìàòèçàöèè ïðîèçâîäñòâåííûõ ïðîöåññîâ è ïðîèçâîäñòâåííîãî îáîðóäîâàíèÿ, à òàêæå äëÿ ñòóäåíòîâ è ïðåïîäàâàòå- ëåé âûñøèõ òåõíè÷åñêèõ çàâåäåíèé. ISBN 5-98003-079-4 © Ìàêåò è îáëîæêà «ÑÎËÎÍ-Ïðåññ», 2003 © Ïåòðîâ È. Â., 2003 Êíèãè èçäàòåëüñòâà «ÑÎËÎÍ-Ïðåññ» ìîæíî çàêàçàòü íàëîæåííûì ïëàòå- æîì ïî ôèêñèðîâàííîé öåíå. Îôîðìèòü çàêàç ìîæíî îäíèì èç äâóõ ñïîñîáîâ: 1) âûñëàòü îòêðûòêó èëè ïèñüìî ïî àäðåñó: 123242, Ìîñêâà, à/ÿ 20; 2) ïåðåäàòü çàêàç ïî ýëåêòðîííîé ïî÷òå ïî àäðåñó: [email protected] Ïðè îôîðìëåíèè çàêàçà ñëåäóåò ïðàâèëüíî è ïîëíîñòüþ óêàçàòü àäðåñ, ïî êîòîðîìó äîëæíû áûòü âûñëàíû êíèãè, à òàêæå ôàìèëèþ, èìÿ è îò÷åñòâî ïî- ëó÷àòåëÿ. Æåëàòåëüíî óêàçàòü äîïîëíèòåëüíî ñâîé òåëåôîí è àäðåñ ýëåêòðîí- íîé ïî÷òû. ×åðåç Èíòåðíåò Âû ìîæåòå â ëþáîå âðåìÿ ïîëó÷èòü ñâåæèé êàòàëîã èçäàòå- ëüñòâà «ÑÎËÎÍ-Ïðåññ». Äëÿ ýòîãî íàäî ïîñëàòü ïóñòîå ïèñüìî íà ðîáîò-àâòîîò- âåò÷èê ïî àäðåñó: [email protected] Ïîëó÷àòü èíôîðìàöèþ î íîâûõ êíèãàõ íàøåãî èçäàòåëüñòâà Âû ñìîæåòå, ïîäïèñàâøèñü íà ðàññûëêó íîâîñòåé ïî ýëåêòðîííîé ïî÷òå. Äëÿ ýòîãî ïîøëèòå ïèñüìî ïî àäðåñó: [email protected]  òåëå ïèñüìà äîëæíî áûòü íàïèñàíî ñëîâî SUBSCRIBE. Ïðåäèñëîâèå íàó÷íîãî ðåäàêòîðà Áîëåå òðèäöàòè ëåò ïðîøëî ñî çíàìåíàòåëüíîãî ñîáûòèÿ — ïî- ÿâëåíèÿ ïåðâîãî ìèêðîïðîöåññîðà êîðïîðàöèè Intel — 4004. ×àñ- òîòà åãî ðàáîòû áûëà â òûñÿ÷è ðàç ìåíüøå, ÷åì ÷àñòîòà ýëåêòðîí- íûõ óñòðîéñòâ íà óæå ñîçäàííûõ òîãäà â ÑÑÑÐ ìîùíûõ ÑÂ×-ïîëå- âûõ òðàíçèñòîðàõ. Îäíàêî ìèêðîïðîöåññîð îáëàäàë íîâûì óäèâèòåëüíûì â òå ãîäû êà÷åñòâîì — îí ìîã âûïîëíÿòü ñàìûå ðàç- íîîáðàçíûå ôóíêöèè, èçìåíÿåìûå ïðîãðàììíî. È ýòî îáåñïå÷èëî íåâèäàííûå òåìïû ðàçâèòèÿ ìèêðîïðîöåññîðíîé òåõíèêè. Ñåé÷àñ, êîãäà ÷åðåäà ïðîöåññîðîâ äëÿ ïåðñîíàëüíûõ êîìïüþ- òåðîâ (ÏÊ) òîëüêî îäíîé êîðïîðàöèè Intel íàñ÷èòûâàåò ðÿä ïîêî- ëåíèé (îò óøåäøåãî â èñòîðèþ 8086 äî íîâåéøèõ Pentium 4, Pen- tium M (Centrino) è Inatium) è ñîòíè êîíêðåòíûõ òèïîâ, ó ìíîãèõ ñîçäàëîñü âïå÷àòëåíèå, ÷òî ìèêðîïðîöåññîðû ýòî ïðåæäå âñåãî ïðèíàäëåæíîñòü ïåðñîíàëüíûõ êîìïüþòåðîâ. È âïðÿìü, âçëåòó ðîëè è çíà÷èìîñòè ÏÊ òðóäíî ÷òî-òî ïðîòèâîïîñòàâèòü. À äàííûå î ÷àñòîòàõ ðàáîòû ñîâðåìåííûõ ïðîöåññîðîâ â åäèíèöû ÃÃö (â ïåðñïåêòèâå ÒÃö), î ÷èñëå òðàíçèñòîðîâ â äåñÿòêè ìèëëèîíîâ íà êðèñòàëëå è î íè÷òîæíîé (óæå äî äîëåé âàòòà) ïîòðåáëÿåìîé ìîùíîñòè ýòèõ ñëîæíåéøèõ óñòðîéñòâ äàæå ñïåöèàëèñòû âîñïðè- íèìàþò êàê ôàíòàñòèêó íàøèõ äíåé. È òåì íå ìåíåå íå ñòîèò çàáûâàòü, ÷òî èçíà÷àëüíî ìèêðîïðî- öåññîðû áûëè ñîçäàíû íå ñòîëüêî äëÿ ðàáîòû â ÏÊ, ñêîëüêî â êà- ÷åñòâå ïðîãðàììíî-óïðàâëÿåìûõ óñòðîéñòâ äëÿ àâòîìàòèçàöèè ïðîìûøëåííîñòè è áûòîâîé òåõíèêè. Íà èõ îñíîâå áûëè ñîçäàíû ïðîãðàììèðóåìûå ëîãè÷åñêèå êîíòðîëëåðû (ÏËÊ) — óñòðîéñòâà, àâòîìàòèçèðóþùèå ðàáîòó êàê îòäåëüíûõ àïïàðàòîâ, íàïðèìåð ñòàíêîâ ñ ïðîãðàììíûì óïðàâëåíèåì èëè ñòèðàëüíûõ ìàøèí è ìèêðîâîëíîâûõ ïå÷åé, òàê è îãðîìíûõ ïðîèçâîäñòâåííûõ êîìï- ëåêñîâ. Ñåãîäíÿ â ñâîåé êâàðòèðå ìû, óâû, íå âñåãäà âñòðåòèì ïåðñîíàëüíûé êîìïüþòåð, íî, äàæå íå ïîäîçðåâàÿ îá ýòîì, ïîëü- çóåìñÿ ðàáîòîé äîáðîãî äåñÿòêà ïðîãðàììèðóåìûõ ìèêðîêîíòðîë- ëåðîâ. Òàêèì îáðàçîì, ïðîãðàììèðóåìûå ëîãè÷åñêèå êîíòðîëëå- ðû — äàæå áîëåå ðàñïðîñòðàíåííûå óñòðîéñòâà, ÷åì ÏÊ, êîëè÷å- ñòâî êîòîðûõ âî âñåì ìèðå íåäàâíî ïðåâûñèëî ìàãè÷åñêóþ öèôðó â 1 ìèëëèàðä. Ïî ìèêðîïðîöåññîðàì è ÏÊ ó íàñ íàïèñàíû è èçäàíû ñîòíè êíèã. À âîò ëèòåðàòóðû ïî ïðîãðàììèðóåìûì ëîãè÷åñêèì êîíò- ðîëëåðàì ñåé÷àñ ïðàêòè÷åñêè íåò. Îò÷àñòè ýòî îáóñëîâëåíî îá-

Программируемые контроллеры.Стандартные языки программирования. Дьяков , Петров

  • Upload
    -

  • View
    200

  • Download
    2

Embed Size (px)

Citation preview

681.5

32.96

30

. . 30 . / . . . . . .: -, 2003. 256 .: . ( ??????)

ISBN 5-98003-079-4

, . 61131-3 . , .

- . :

1) : 123242, , / 20; 2) : [email protected]

, , , . .

-. - : [email protected]

, . : [email protected]

SUBSCRIBE.

ISBN 5-98003-079-4

-, 2003 . ., 2003

Intel 4004. , - . , . . , () Intel ( 8086 Pentium 4, Pentium M (Centrino) Inatium) , , . , - . ( ), ( ) . , , - . () , , , . , , , , , . , , , 1 . . . -

4

5

. , , , . . , . , , , . . , . , . , , . . ., ,

, . . , , , , . . , - . , . . , . , , , , , . , , , , . , , . , . . , , , . , ( ), . , . ,

7

, (). , , 61131-3. , 61131-3 . , , , , . . 2002 , , . , . , () , . . , , , . . . 10 [7] , , . . , -

High end. , . , . , 61131-3. . . CoDeSys 3S (Smart Software Solutions). , . , . . , , . 61131-3 . . . . . CD -, (. ) . , . , , , , , . , , , , . , , . [138] -, .

8

9

. , , . . , . , , , . , . , . , , . , , , , . . , ( -). , . , 61131-3. , , IL ( ), . . , , , , . . . . , -

. , - , . , . , .

1. , , . , .

. , , , , . , . , . , . . , , .

1.1. , , , . . , , . -. , , . , , . , , . . , , , . , . , , . , (). , . . 30 .

12

1.

13

, , , (. 1.1). . . - . .

, . , , , . . ( ). , . , , , . 1.2.

. 1.1.

. 1.2.

SIEMENS,

. , . . , . , , . . , , . , , , , . , . [6].

( , 1969 .). , , , , , , , , , , . . . . .

14

1.

15

1.2. -

, , . , , , . . - . , . - , . - . , Actuators/Sensors interface ( ) .

, . . , . , ( ) . () 0. , , , , , . . : , , , . . . , . , , , , , . . , . . , : , , , , , , , . , . ( , , , . .). . , , . , . . . . . - -.

1.3. . . , , . . . . . , . . . .

16

1.

17

. 1.3.

(, . , .)

, , . (). , . . , . , . . , , , . . , . , . , , , . . , . , .

, , . , , . , , , ( IP20), , . . , -, , , .

1.4.

, , : , , - , , (. 1.3). , , -

1.5. () , (). -

18

1.

19

CoDeSys. , , -? : . . OPC-. , . OPC-. , . , , OPC- SCADA-. , . . , . -

. , . , , . . . . . 10 15 . , . . (MMI). (Supervisory Control And Data Acquision System SCADA). SCADA- . , , , , ( , Visual Basic), . . , . OPC (OLE for Process Control), DCOM Microsoft Windows. (DDE) , . (. 1.4). , . 1.4.

20

1.

21

. , , . , . . , , ( PC/104 VME), no name.

, : , , , . (fieldbus). (Bitbus, Modbus, Profibus, CANopen, DeviceNen), , . . 80- . . - . - 64. . . , .

1.8.

1.6.

. . , . , . , .

1.7.

, ( -), (soft PLC). , , .

. , . , . , , , . , . , (), . , , , . . 1. . 2. . 3. . 4. . 5. . 6. . 7. . 8. .

22

1.

23

. , . . . . , . . . , , . CoDeSys : 98% , 2% . , , . . , . , .

. . , . . , . , , , . -, . ( 4). , , , - . , , . : , , , , , , . . . , . . . , , . , . , ,

1.9. . , . , (. 1.5). , . , . , .

24

1.

25

1.10. . . , , . .

. 1.5.

, , . , , . . , , , . , . . 1 . , 61131-3, IL. , . . , 32- . , 8- . , PC- .. 1.6.

MicroLogix 1000 Allen-Bradley (Rockwell Automation),

, . , , -. (. 1.7) - . . -, , . . - , . () -. . , . , , () . -

26

1.

27

8 , 4 , 2 , RS232, SPI CANopen.

1.10.1.

. 1.7.

,

() . , , - , . . -, , . . , . .

. . . 1.8 Easy 215 ( Frenzel + Berg Electronic, ), , , DIP40. , 16- (Infineon C164), , , CoDeSys, 8

1.10.2. . , . . . , . , . . , .

. 1.8.

Easy215 CoDeSys

29

2. 61131

, , 61131, 61131-3.

2.1.

, , , , . 1982 . . . 1. . 2. . 3. . 4. . 5. . 6. . 7. . 8. . 1131, 1997 5- . 61131. , . , , 61131-3. .

. , , . . . , , . . , , . . ( ) . , . , . , . . IBM . 1979 () -

2.2. , ( SFC). , , , . . . . . . .

30

2. 61131

31

. , , 61131-3 . , - . , , , . - . , , , . . , .

, C . , . , . . , , . . . , , .

2.3.

2.4. . , , 61131, . , , . . . . . . C++. , . . , .

, , . , . , , LD FBD. PASCAL C, ST . 100 [21]. , , . , . . , , , . , , , , . : , . , . , . SFC (, UML), , .

3.

33

3.

61131-3, , . CoDeSys, .

3.1. 61131-3CoDeSys

- , , - . . , . , , , , , , . . , . .

3S Smart Software Solutions http://www.3s-software.com CoDeSys 61131-3. CoDeSys. , . , , . CoDeSys , , . . ISaGRAF CJ International http://www.isagraf.com/ ISaGRAF TIC (Target Independent Code), , . - . TIC-, ISaGRAF C . MULTIPROG wt Klpper und Wiege Software GmbH http://www.kw-software.de/ , . -

, , . , , , . . . . , . . , , . , , , . , . , () . -, (Concept Schneider Electric, S7 Siemens).

34

3.

35

ProConOS (Programmable Controller Operating System), . MULTIPROG 80- . . CP/M. MULTIPROG Windows, wt (windows technology) .

OpenPCS

Infoteam Software GmbH http://www.infoteam.de/ OpenPCS IL . , -, Windows . . SmartSIM .

SoftCONTROL

. , , , (. . 3.8). (ANSI-C) . , . . , . , . . , . . , Windows-. , , , . , .

Softing GmbH http://www.softing.com/ Softing . , SoftCONTROL , . . , . , SoftCONTROL , . , . -.

3.2.

iCon-L

ProSign (Process Design) GmbH http://www.pro-sign.de/ , iCon-L 1131 . . , (SFC) . iCon-L -

. . , . , . , , . .

36

3.

37

.

3.2.1.

( ) , , . . .

3.2.2.

. 3.1.

ISaGRAF

: . , - , , , (. . 3.1). , ; (CoDeSys). , : INP1 I 3; 1 :

. .

INP1: INT := 3;

(* 1 *);

.

3.2.3. . : . . (. . 3.2); . . CoDeSys OpenPCS. , (. . 3.3). -

, . . , , ; , ( , . .); . , . , ;

38

3.

39

( . 3.3, ). ; (. 3.4);

. 3.2.

MULTIPROG

. 3.4.

SoftCONTROL

-

. 3.3.

(ISAGRAF)

. (. . 3.5). (. 3.6). : ; . .

40

3.

41

3.2.4. : . -

. , (. 3.7), ;

. 3.5.

FBD (MULTIPROG)

. 3.7.

OpenPCS

-

; . -

. 3.6.

LD- (CoDeSys)

; ; . . -

42

3.

43

; . . . () ; , , . , . . , , . . (. . 3.8, 3.9). , .

. . ; . . . . , . CoDeSys (original), , . , . . . , ; , - . ; , -. . . ; . ; ;. 3.8. iCon-L

44

3.

45

3.2.5.

. , : (. . 5.10). , , . . ; . ; ; . . , ; . - , : t , ; t ; t , , , ; t ; t . , . , . CoDeSys (, . .). . , , .

. , . . . 1. . -. . , IL ST. , - . . , , . . , OpenPCS IL , , . . . 2. . (MULTIPROG, CoDeSys). , . 3. . , , . , , , . , , . . . . , . ( , , .) .

46

3.

CoDeSys

47

. , . , , , , . . . . , , . . .

3.3. CoDeSys. 3.9. CoDeSys

CoDeSys 3S (Smart Software Solutions). 61131-3, , - (. 3.9). CoDeSys . ( PC-). , , -. . . CoDeSys , . -, . , .

-

. , . ( online) . . CoDeSys. , , . SCADA-. (DDE OPC) . , . 150 CoDeSys. 3S . .

48

3.

CoDeSys

49

. , , . CoDeSys , (. - ). 3S ( , , , .). CoDeSys , , .. 3.10.

3.4. CoDeSys

: . . , . , . com- (RS232) - . (RS422, RS485 ). CoDeSys (gateway). Windows -, TCP/IP. , (. 3.10). . . , , .

. 3.11. (CoDeSys)

(local host) . com- (. 3.11) (, , -). . CoDeSys (DDE, OPC), , , , .

51

4.

-, . , . , , .

16- . 32- . , , . . , , , . . . , , , . .

4.1. 4.2. 4.2.1. , , . . BYTE WORD DWORD LWORD SINT INT DINT LINT USINT 8 16 32 64 ,

1 2 4 8 128 32768 231 263 0 127 32767 2311 2631 255 1 2 4 8 1

, . . , . , . , . . . , , , ( 0 1), SINT (128+127), . . , , . , , . . . , . , , 16- -

52

4.

53

,

UINT

0 2321 4 8 2 164

65535

2

UDINT

0

. , . : VAR wVar0, wVar1: WORD; (*2 WORD*) byVar3: BYTE; (* BYTE 0*) byVar2: BYTE := 16#55; (* BYTE 55h*) END_VAR byVar2 := 2#1_0_0_0_1_0_0_0; (* 2#1000_1000*) byVar3 := 2#1_0_0_0__1_0_0_0; (**)

ULINT

0

4.2.2. BOOL. . FALSE () TRUE (). . VAR bVar1: wVar2: END_VAR BOOL := TRUE; WORD;

0, (2n) 1, n . (2n1), (2n1) 1. , 16- : S (short *1/2) , D (double *2) , L (long *4) . U (unsigned) . BYTE, WORD, DWORD LWORD ANY_BIT. . 8, 16 32 , . , . , , . , , #. :

2#0100_1110

8#116

FALSE 0, TRUE 1. wVar2 := BOOL_TO_WORD(bVar1); (* 1*) : wVar2 := 0; bVar1 := WORD _TO_ BOOL (wVar2); (* FALSE*) , , BOOL: bVar1 := wVar2 > 5000;

16#4E

78

10 15 A F. _ . : 10_000, 16#01_88. . .

54

4.

55

BOOL , , , 1 . BOOL, - , . TIME1 := t#1m65s; TIME1 := T#125s; (**) (**)

, . , , , . , , .

4.2.3. TIME1 := T#1.2S;

: (* T#1s200ms*)

4.2.5. , , ISO 8601.

REAL 1038. 32 , , 23 . 6 7 . LREAL 64 . 52- . 15 16 . 10307. , : 14.0, 120.2, 0.33_ : 1.2E10, 3.1e7. DATE TIME_OF_DAY DATE_AND_TIME D TOD DT

1 1970. 00:00 00:00 1 1970.

4.2.4.

TIME . (TIME_OF_DAY) 24 . , , TIME# T#. (d), (h), (m), (s) (ms). , . . :

. ::.. DATE# ( D#), TIME_OF_DAY# ( TOD#), DATE_AND_TIME# ( DT#). DATE#2002-01-31 D#2002-01-31 TIME_OF_DAY#16:03:15.47 TOD#16:03:15.47 DATE_AND_TIME#2002-01-31-16:03:15.47 DT#2002-01-31-16:03:15.47 4 (DWORD). TOD 0 . DATE DT 0 1 1970 .

VAR TIME1: END_VAR

TIME := t#10h_14m_5s;

. , , 59. -

56

4.

57

4.2.5.

4.2.6. . ANY_ . , , ANY_BIT, . ANY_ , , .ANY_INT ANY_REAL ANY_BIT STRING TIME ANY_DATE DATE, TIME_OF_DAY, DATE_AND_TIME

STRING , . . , str1, 20 , str2 60 :

VAR str1: STRING(20); str2: STRING(60) := ; END_VARANY ANY_NUM REAL, LREAL

SINT, INT, DINT, LINT, USINT, UINT, UDINT, ULINT

, . . STRING 1 (WSTRING 2 ). :

BOOL, BYTE, WORD DWORD, LWORD

str1 := ;

, , ($) . .

4.3.

$$

$

( ) ( CoDeSys ). TYPE END_TYPE.

$L $l

4.3.1.

$N $n

$P $p

$R $r

. . (. ): :ARRAY [..,..,..] OF ; li1, li2, li3 ; hi1, hi2 hi3 .

$T $t

58

4.

59

, . :

4.3.2.

XYbass: TxtMsg: Mass1: Mass2:

ARRAY ARRAY ARRAY ARRAY

[1..10,1..20] OF INT; [0..10] OF STRING(32); [1..6] OF SINT := 1,1,2,2,2,2; [1..6] OF SINT := 1,1,4(2);

, . . . N(a,b,c..) a, b, c.. N . :

Mass2d:

ARRAY [1..2,1..4] OF SINT := 1,2,3,4,5,6,7,8;

Mass2d . 4.1.

. , , , . . . , . . , . ( ). , . , , , , . , , . STRUCT END_STRUCT. : TYPE : STRUCT ... END_STRUCT END_TYPE Trolley: TYPE Trolley: STRUCT Start: Distance: Load, On: Articl: END_STRUCT END_TYPE TIME; INT; BOOL; STRING(16);

. 4.1.

Mass2d

:

[1,2,3]

. , , . :

XYbass[2,12] := 1; i := STR_TO_INT(TxtMsg[4]);

, 0. . .

60

4.

61

Telega1 Trolley :

Telega1: Trolley := (Articl:=);

. , . , .

Telega1 . 4.2.

4.3.3. . , . , , : TYPE : (, < 1>, ... < n>); END_TYPE

. 4.2.

Telega1

. , , . :

.

:

Telega1.On := True;

, . :

. . , 0. INT . , . : TYPE TEMPO: (Adagio := 1,Andante := 2,Allegro := 4); END_TYPE : VAR LiftTemp : TEMPO := Allegro; END_VAR , . , : TEMPO#Adagio. CoDeSys .

TrolleySet: ARRAY[0..2] OF Trolley := (Articl := T 1), (Articl := T 2), (Articl := T 3); TrolleySet[i].On := TRUE;

, , :

train.wagon[5]. weight; (*wagon[] *)

, - . -

62

4.

63

4.3.4.

. TYPE END_TYPE:

TYPE : (..)

TEMPERATURA . INT, . . , , .

4.3.6. CoDeSys

END_TYPE

:

TYPE DAC10: INT (0..16#3FF); END_TYPE

:

VAR dac: DAC10; END_VAR dac := 2000;

: Error: Type mismatch: Cannot convert 2000 to INT(0..1023).

4.3.5.

. , , 16- . - , . UINT, INT. :

TYPE TEMPERATURA : UINT; END_TYPE

, -. CoDeSys . ( 2.2) 64- Unicode. , . , CoDeSys , , . . , CoDeSys ( ) Intel 8051 6 . , , . . CoDeSys . BYTE, WORD DWORD , (USINT, UINT UDINT), . TIME . CoDeSys DWORD , 50 . STRING , 80 . CoDeSys

64

4.

65

. . Var1, Var_1 _Var1 . . . VAR1 Var1 . , 6 . CoDeSys . ( ), , . . - (, , . .).

( C-) . . , , , . . . ( 1 ), , , . , , , , . , , ( ). . . CoDeSys , , . (CheckRangeSigned, CheckRangeUnsigned) . : . ( , . .) .

4.4.2.

4.4.

. . , . , .

4.4.1.

( ) . . .

, . 1. . 2. . 3. . 4. (). - . , ( , . .). . . . -. . . AT . . . (VAR_GLOBAL) . -

66 B W D L

4.

67

. , , VAR, VAR_INPUT, VAR_OUTPUT, VAR_IN_OUT VAR_EXTERNAL (. ). ,

RETAIN

, .

CONSTANT

,

4.4.3.

: ; dwHeat wbHeat byHeat

, . : . , , . BOOL. . . , . , , , , . , : AT %MD1: AT %MW2: AT %MB4: BYTE; BYTE; BYTE;

AT%

, :

.D W B

I

0 0 01 1 2 3

1 2 45 3 6 7

Q

M

, :

X

, - , CoDeSys , . . . , -

68

4.

69

VAR a: WORD; bStop AT %IX64.3: END_VAR BOOL; a := 0; a.3 := 1; a.18 := TRUE; IF a.15 THEN (* a.3 := TRUE; 2#0000_1000*) (*, WORD a.18*) (*a ?*)

, . , . I. . Q . M . M , . , . . :

4.4.5.

IF %IW4 > 1 THEN

(* IW4*)

- . , . , 16- (BOOL) WORD. , , STRING BYTE, . , , , .

4.4.4.

. . . . .

. , . , . . . , , siVar (SINT 8 ) iVar (INT 16 ). siVar = 100 iVar = 1000. iVar := siVar , SINT INT (iVar 100). , - . siVar:= iVar . siVar := INT_TO_SINT(iVar). 24 ( 1000 16#03E8 SINT, 16#E8 24). LREAL REAL . - . , _TO _ . : si := INT_TO_SINT(16#55AA); si := TIME_TO_SINT(T#120ms); (* 16#AA*) (*120*)

70

4.

71

i := REAL_TO_INT(2.7); (* 3*) i := TRUNC(2.7); (* 2*) t := STRING_TO_TIME(T#216ms); (* T#116ms*) byX: USINT := 255; byX := byX + 1; byX := byX + 1; byX := byX 2; (* 0*) (* 1*) (* 255*)

: MAX + 1 = 0. : 0 1=MAX. . , (a + b) b = a , a + b . (a b) c = ac bc : a, b, c: USINT; a := 100; b := 50; c := 3; x1 := (a b) * c; x2 := a*c b * c; (* 150*) (* 150*)

TRUNC REAL_TO_INT, . , , (, ). , _TO_STRING PRINT, . , . . .

4.5.

() a + (b c) = (a + b) c . , , , , : (usint#100 + usint#50) * usint#3 = 194; usint#100 * usint#3 + usint#50 * usint#3 = 194. (a + b)c = ac + bc , , , 450, 194. , . , . , . . , -

. , . . . , . , . , . , MAX 1. , . , . , , . :

72

4.

73

, . , , . , , . . . , : X= a c + . b d

. ( 1 ), . . . , . , SINT 127, INT 32767. . , . , : sint#127 + 1 = 128, sint# 128 1= 127. SINT USINT, 8- , :BIN

USINT

SINT

, , . . , , : a,b,c,d: INT; a := 1; c := 2; b := 3; d := 3; x := a/b + c/d; (* 0*) (* 1*) x1 := (a * d + c * b)/(b * d);

0 0000_0001 0111_1111 1000_0000 1111_1110 1111_1111

0

0000_0000

1

1

127

127

128

128

254

2

255

1

. , . , . . , , , .

. . . , . 1/2 , , . 1/3 = 0, 2/3 = 1, , 1. , (. ST-, , .) .

74

4.

75

( ) . , . (. . 4.3).

. 4.3.

. (Charles Simonyi) . , ( ), , . Microsoft, Windows. , . , . , . .

b by si w i dw di r lr st t td d dt

BOOL BYTE, USINT SINT WORD, UINT INT DWORD, UDINT DINT REAL LREAL STRING TIME TIME_OF_DAY DATE DATE_AND_TIME

, , . , . . . #. , . . ? INT, , . , . , , : iVar := USINT#100 byVar.

4.6.

. .

76 BCD 77

4.

:

bStop: bySet: wSize

BOOL; BYTE; UINT;

. , : bStop := wSize * 2; bStop := wSize > 2; . :

a

,

n

c

, . :

, . . . , _bInp1, byOut2_. , . . , . . . . , . . , , .

aiSample: ci:

ARRAY [1..32] OF INT; INT;

4.7. BCD

FOR ci := 1 TO 32 DO siSample[ci] := 1; END_FOR

(* *)

, (BY, AT, D, DT, N, ST). . :

byA, byB, by1, by2:

BYTE;

. , tpUpDelay: TP; . . , -

- BCD (binary coded decimal) , 4 . , 81 2#1000_0001. BCD- , . , , BCD . , ( 10 ). BCD ANY_BIT ( BOOL, ). BCD- . CoDeSys BCD : BCD_TO_INT INT_TO_BCD.

79

5. (POU)

. . . , . POU Program Organization Unit. , .

5.1.

. . () . . . . . , . , . , , . . . , . , , , . , , . , . , , X , . . , . , . . , , . .

, . . , : , , . . , -. . () . , . . - , . , . , . , . -

5.1.1. POU POU . , FUNCTION,

80

5. (POU)

81

FUNCTION_BLOCK PROGRAM. ( ). POU. VAR_INPUT, VAR_OUTPUT - VAR_IN_OUT. VAR. VAR_OUTPUT VAR_IN_OUT . , . . : FUNCTION iNearby : INT POU .

. R_TRIG. CLK. , , bPulse. bPulse CLK. . bPulse , TRUE. CLK, , TRUE. . CLK , bPulse , TRUE . POU . . .

POU PROGRAM VAR_INPUT VAR_OUTPUT VAR_IN_OUT VAR

FUNCTION :

FUNCTION_BLOCK

5.1.3. POU :

VAR_INPUT

VAR_INPUT

VAR_OUTPUT

VAR_IN_OUT

VAR

VAR

. , . , VAR.

VAR_INPUT POU . ( ), . POU . POU. . .

5.1.2.

. . . , . .

VAR_OUTPUT . POU . . VAR_OUTPUT . , . . . VAR_IN_OUT . . , .

82 83

5. (POU)

. VAR_IN_OUT : ; ; , ; , ; VAR_IN_OUT . VAR_IN_OUT . VAR_INPUT VAR_OUTPUT , . . VAR_IN_OUT . . , VAR_IN_OUT . . , .

. . , . . . . . () . . ( ) . IL, ST, LD FBD. SFC . . .

5.2.1. ST , , . ST. : y := MUX(0, x1, x2); (* x1*) , . . (. 5.1).

VAR , . . ( ). . VAR . .

5.2.

, . . , . . -

. 5.1.

84

5. (POU)

5. (POU)

85

, . :

y := MAX(x1, x2); (* *) y := MAX(x2, x1); (* *). 5.2. AND . 5.3. AND

5.2.2.

:

stHhello := CONCAT(STR1:= , STR2:=);

:

stHhello := CONCAT( , );

:

. 5.2 . , . . 5.3. . : y := MUX(x_n, x1, x2, x3, x4, x5); .

stHello := CONCAT( , STR2:=);

, (STR1 := ;), :

stHello := CONCAT(STR1:=STR1, STR2:=);

5.2.4. . , . -, - . -, ST. , (, , ) (+, , *, /). . , . : Y := SUB(MUL(4,x),3); ST : Y := 4 * x 3; : Y = 4x 3.

: , . . CoDeSys . , . . .

5.2.3.

, . , AND (. 5.2).

86 87

5. (POU)

pattern, in1, in2: END_VAR ST : IF ABS(in1 pattern) < ABS(in2 pattern) THEN Nearby_int := in1; ELSE Nearby_int := in2; END_IF

. , . . , ST, , . Y := AND(x1, x2) . : Y := x1 AND x2; , . : y := SQRT(x); , . , ST . in2 pattern tmp in1 pattern tmp ret_in2 in1 Nearby_int

INT;

, VAR...END_VAR . IL :

5.2.5.

, . , MAX . , , SINT REAL, , . . . . . . . , MAX INT INT.

LD SUB ABS ST LD SUB ABS LT NOT JMPC LD ST RET ret_in2: LD ST

in2 Nearby_int tmp, : VAR tmp:INT; END_VAR FBD . . 5.4.

5.2.6.

Nearby_int, pattern in1 in2. :

FUNCTION Nearby_int : INT VAR_INPUT

88 89

5. (POU)

. 5.4.

Nearby_int FBD

5.2.7.

? , , . . , , . . , , . , . . , . , . , , . , , . , . . . , . . . ,

( ) . , . , . SFC . . . , . . CoDeSys , : , . , , . , . , , , . , . , . , . . . , ( VOID C++), . , BOOL. . FALSE. BOOL . LD. EN (ENable), . . LD. , . -

90

5. (POU)

91

. . , .

5.3.

5.2.8.

. . , . . , , , . :

IF func1(x) OR func2(x) THEN

func1(x) TRUE, func2(x) . FBD . 5.5.

, . . , , , . , . , , , . - . , . - () , , . . . . , , .

5.3.1.

. 5.5.

, NORMA 2 . FALSE, , . , , , . . , . , , .

, . . , . . , . . . . , , , (. 5.6). , . , . , -

92

5. (POU)

93

ctuTimeMeter.RESET := FALSE; ctuTimeMeter.PV := 100; x := ctuTimeMeter.CV; . . , . .

5.3.3.

. 5.6.

ctuTimeMeter : IL: CAL

. . , . :=. ST: ctuTimeMeter (RESET := FALSE); ctuTimeMeter(RESET := FALSE)

ctuTimeMeter: CTU;

=> : ctuTimeMeter (RESET := FALSE, CU := Inp1, CV => x); , . PV . 5.7. ST ST : ctuTimeMeter(); (* *)

, . , . , . , . , . . , .

5.3.2.

. . , :

. 5.7.

(FBD)

94

5. (POU)

95

, :

X := ctuTimeMeter.PV ctuTimeMeter.CV + 1;

: ST:

ctuTimeMeter.RESET := FALSE; ctuTimeMeter;

IL:

LD ST CAL

FALSE ctuTimeMeter.RESET ctuTimeMeter

, , . , .

5.3.4.

. :

SyncSw1.Sync FALSE, , . . , , . . , , , , . , . , . . . (ENO). (. ) ( Init SFC ). , . , , (). .

FUNCTION_BLOCK SyncSwitch VAR_INPUT ... ... ... Sync: BOOL := TRUE;

5.3.5. : SyncSw, SyncSw2: SyncSwitch; (* SyncSw1*) ST: SyncSw2 := SyncSw1; LD . 5.8.

SyncSwitch Sync TRUE. , . , , . . , , , .

SyncSw1: SyncSwitch := (Sync := FALSE);

96

5. (POU)

97

. 5.8.

. . . . . .

. , .

5.3.7.

5.3.6.

, , ( CoDeSys variable configuration) . . . , . SHAMAN, bMarvel. : FUNCTION_BLOCK SHAMAN VAR bMarvel AT %I* : BOOL; END_VAR SHAMAN : PROGRAM PLC_PRG VAR Shaman1: SHAMAN; Shaman2: SHAMAN; END_VAR , : VAR_CONFIG PLC_PRG.Shaman1.bMarvel PLC_PRG.Shaman1.bMarvel END_VAR AT %IX1.0 : BOOL; AT %IX1.1 : BOOL; , , .

. . , , , . . , . . , - , , . , , . , , . . . , . . , , . , . , -

98

5. (POU)

99

5.3.8.

SyncSwitch. : Q Start, Sync := TRUE. . 5.9. SR_1(SET1:= Start AND Sync, RESET:= Sync, Q1=> Q);

, . SyncSwitch . , , SR. (ST):

5.3.9.

. 5.9.

: Q = start AND sync, Q = NOT start AND sync. , . IL SyncSwitch :

FUNCTION_BLOCK SyncSwitch VAR_INPUT Sync: BOOL; Start: BOOL; END_VAR VAR_OUTPUT Q: BOOL; END_VAR

. , . , , , . CoDeSys . . . , . . , , . , . . SyncSwitch EmergencyBreak. . CoDeSys Add Action. ST: Q := FALSE; . ST- : SyncSwitch1.EmergencyBreak(Q => q);

LD AND S

Sync Start Q

LD ANDN R

Sync Start Q

.

, , SyncSwitch1.EmergencyBreak. , . . POU . ++. , , , . -

100

5. (POU)

CoDeSys

101

SFC. CoDeSys .

5.4.

. , , . .

, . . - . . .. 5.10. CoDeSys

5.4.1.

:

AuxiliaryPrg(Active := TRUE, Q => q);

, . , , .

5.5. CoDeSys

CoDeSys Add Object. . , , , . , , . . , , . POU , (Library Manager). CoDeSys POUs Object Organizer (. 5.10). . -

CoDeSys . IL, FBD LD. Project Object Convert. CoDeSys VAR_IN_OUT ( ). . CoDeSys VAR_IN_OUT , w . . . VAR_GLOBAL, VAR_ACCESS CoDeSys . POU . , , VAR_EXTERNAL. CoDeSys . CoDeSys . ADD, MUL, AND, OR, XOR MUX . . CoDeSys . .

102

5. (POU)

. :

Nearby_sint, Nearby_int, Nearby_real

, . :

6. . , , . , CoDeSys.

siNearby, iNearby, rNearby

, CoDeSys . . CoDeSys . CoDeSys PLC_PRG. PLC_PRG . PLC_PRG, .

6.1. , . , . (single). . . . (VAR_INPUT), . . -. . CoDeSys (Task configuration), (. . 6.1). , , . , . CoDeSys PLC_PRG. . 0 32. , . , . , , -

104

6.

105

, 55 ( Windows , ), , . 6.2.

. 6.2.

T1, T2, T3

, . ( CoDeSys Set Debug Task). , . . .

. , . . CoDeSys . , , , . . , , . , , , 10 . , . , . , . 5 , 1,52 . , , 2 , . . 6.1 . T1 , 10, 200 . T2 , 20, , . T3 , 1, 800 .

6.2.

. 6.1.

CoDeSys

, . . CoDeSys ( ) , . . (, ) . : ; ; ( , , , . .); . , . , (PLC Browser),

106

6.

. . , .

6.3.

7. . . , CoDeSys.

, , . , (). , , . . (, ) , . - , . CoDeSys, . ( -) . , . . , , (VAR_ACCESS), (MAP MMS) 61131-5 - (CANopen). (configuration) . , , , ( ). , , configuration. , PLC configuration CoDeSys , .

7.1. , , . , . : . , : 1) ; 2) ; 3) ; 4) ; 5) 1 ( ); 6) . . -, . . . 5 . , . , . , .

108

7.

109

. , , . , . , , , . . , , . , . , . . . : 1. , , : a. (, , ); . ; 2. . , . . . ( ) , .

7.1.1.

, . , , , . (X), (Y) (S). , - , ( ). (s0 S) . , . . ( l) -

. , . . , . , ( d). A = {X, Y, S, s0, l, d} . . . . . . , . . . : , , , . . , , . . , . . , . , . , , . (state charts). , - . 7.1. , (. 7.1). .

110

7.

111

. , . , , , , . , - . , .

7.2. 7.2.1. SFC - SFC (Sequential Function Chart) , , . SFC . SFC . SFC . 1962 . . . , , . . (. . 7.2). , . . . . , . -

. , , . . . , , . . . , , . , , . . . . Unified Modeling Language (UML) [37]. Stateflow MATLAB [34]. , MATLAB-Simulink [35]. . . . , , , , . , . . , . CASE -, , , . -

112

7.

113

, , . . . , , ( , , ) . SFC , .

. 7.2.

SFC- SFC . SFC . . (. 7.3). SFC , .

, . () , . , . , . , . . SFC. . 848 (1988 .). 61131-3 . SFC . , , . , , . , . SFC . SFC . , , ().. 7.3.

SFC-, ( IL)

SFC . . . . SFC - . SFC-. , IL, ST, LD FBD. , SFC .

114

7.

115

. , IL , . . .

7.2.3. ST ST (Structured Text) . ST . ST . , , ST . ST C: ST: WHILE Counter0 DO Counter := Counter-1; Var1 := Var1*2; IF Var1 > 100 THEN Var1 := 1; Var2 := Var2 + 1; END_IF END_WHILE : while (Counter ! = 0) { Var1 *= 2; if(Var1 > 100) { Var1 = 1; ++Var2; } }/*while*/

. , . . , , , . . , , . - SFC, . SFC . SFC . , .

7.2.2. IL

ST SFC. , .

7.2.4. LD LD (Ladder Diagram) - () , . . 70- . . . .

IL (Instruction list) . . . IL , . , IL, . , IL. [8]. IL STEP Siemens. IL , , . , IL , . - IL , , . IL , , , -

116

7.

(IL)

117

. , , . FBD- . , FBD- , .

7.3. (IL)7.3.1. IL . . 4 , : :

. . , . C , . ( , ) , , IGBT [36]. , , . LD- . , (. . 7.5). . , . (), () () . LD , . LD , , . METKA1: LD Sync (* IL*) AND Start S Q (* *) METKA2: LD ADD ST 2 2 y (* y = 2 + 2 *)

, , . . . , . . IL-:

7.2.5. FBD

FBD (Function Block Diagram) . FBD (. . 7.16). LD FBD ( ) (, , . .). , . FBD , . , , . , . FBD .

IL . CoDeSys . , . , . , - .

118

7.

(IL)

119

7.3.2.

loop1: (* *) LD Counter ADD 1 ST Counter LE 5 JMP loop1 5 . JMP JMPC. IL . CoDeSys . CoDeSys . IL- . .

IL (. ). , , , . , SUB 10 10 . , . . IL , . BOOL, INT REAL, . , . , . , . (result). , . .

7.3.4.

7.3.3.

IL . . . , , . , , . : 5 (2 1 y 5 2 1 y (*y = 5 * (2 1) = 5*) LD MUL SUB ) ST

IL , . . JMP , -. JMPC . , . , , POU . , :

LD ST

1 Counter

LD MUL SUB ST

(*y = 5 * 2 1 = 9*)

120 XOR NOT ADD SUB MUL DIV MOD GT GE QE NE LE LT JMP CAL RET ( CN CN CN ( ( ( ( >= = ( ( ( ( ( N, (

7.

(IL)

121

. . JMP, RET, CAL LD. .

7.3.5.

C N . N (negation) . BOOL, BYTE, WORD DWORD. C (condition) , . JMPC, CALC, RETC . N . JMPCN, CALCN, RETCN . N C .

7.3.6.

IL .

LD

N

ST

N

S

, ()

R

, ()

S R BOOL. . , . CoDeSys .

AND

N, (

7.3.7. IL . :

OR

N, (

122

7.

(IL)

123

CAL LD ST

CTD_1(CD := TRUE, LOAD := FALSE, PV := 10) CTD_1.CV y

:

LD ST LD ST LD ST CAL LD ST

TRUE CTD_1.CD FALSE CTD_1.LOAD 10 CTD_1.PV CTD_1 CTD_1.CV y

. , . , . : (* 5 *) . (* 5 *) . IL CoDeSys . , . . , . . CoDeSys, . ( ; // ++), , .

7.3.8.

7.3.10. IL

IL . :

LD SEL

TRUE 3,4

ST SEL (TRUE,3,4). , :

CoDeSys . IL . . IL Flow control CoDeSys. , , (.7.4).

LD ivar1 INT_TO_BOOL ST bvar1

7.3.9.

IL . IL . , . . , -

. 7.4. IL

124

7.

(ST)

125

7.4. (ST)

7.4.1. X := 2 + 2 * 2; X := (2 + 2) * 2; (* = 6*) (* = 8*)

(, =); (=); (); AND, XOR OR. . :

ST- . :=, . ;. , :

iVar1 := 1 + iVar2 / ABS(iVar2);

ST , : +, , *, /, . . , . . , , :

. , , . , . . , , . iVar1: SINT; siVar2: SINT := 120; siVar1 := 120 siVar2 + 20; (*120 120 = 0, 0 + 20 = 20*) siVar1 := 120 ( siVar2 + 20); (*120 + 20 = 116, 120 + 116 = 20*)

iVar1 := 1 + (* *) iVar2 / ABS(iVar2); (* 0 *)

. . . . , . , , . :

7.4.3.

bAlarm := byInp1 > byInp2 AND byInp1 + byInp2 0 OR bAlarm2;

; . . ;, . . , , POU. POU . , , IF, THEN:

7.4.2.

. . : ; ; EXPT; (); NOT ; , MOD; (+, );

IF x = Threshold THEN ; (* *) ELSIF x > Threshold THEN bMarker := bMarker 1; (* *) ELSE bMarker := bMarker + 1; (* *) END_IF; (* ; *)

126

7.

(ST)

127

7.4.4. IF

, . IF () :

IF bReset THEN iVar1 := 1; iVar2 := 0; END_IF IF ELSIF , :

IF THEN

;

[

ELSIF

THEN

< ELSEIF 1> ;

...

ELSIF

THEN

< ELSEIF n> ;

IF bReset THEN iVar1 := 1; ELSIF byLeft < 16 THEN iVar1 := 2; ELSIF byLeft < 32 THEN iVar1 := 3; ELSIF byLeft < 64 THEN iVar1 := 4; ELSE bReset := TRUE; END_IF

ELSE

< ELSE> ;

7.4.5. CASE

]

END_IF

CASE . : CASE OF : ; , : ; .. : ; ... [ ELSE ; ] END_CASE

, . , . . , ELSIF. . ELSIF . ELSIF . , ELSE, . ELSE , . IF :

128

7.

(ST)

129

7.4.6. WHILE REPEAT WHILE REPEAT , . , . WHILE: WHILE DO END_WHILE

, . (: ;). , ( , : ;). (.. : ;). ELSE . ( ;).

:

WHILE . , . REPEAT: REPEAT UNTIL END_REPEAT REPEAT . , . : ci := 64; WHILE ci > 1 DO Var1 := Var1 + 1; ci := ci/2; END_WHILE WHILE REPEAT , , . , . . . . :

CASE byLeft/2 OF 0,127: bReset := TRUE; Var1 := 0; 16..24: Var1 := 1; ELSE Var1 := 2; END_CASE

CASE , . , . , :

CASE byLeft OF 20: Var1 := 0; 16..24: Var1 := 1; END_CASE

, CASE IF, . CASE , . , .

130

7.

(ST)

131

ci := 1; WHILE ci 100 DO Var1 := Var1 + 1; ci := ci + 10; END_WHILE

, ci 1 10 100. , . , . : Var1 := 0; FOR w := 1 TO 10 DO Var1 := Var1 + 1; END_FOR

. , . . , . . BY , . . . :

WHILE ci < 5 + x DO Var := Var1 + 2*x*x + 1; ci := ci + 1; END_WHILE

:

iMax := 5+x; iPoly := 2*x*x + 1; WHILE ci < iMax DO Var := Var1 + iPoly; ci := ci + 1; END_WHILE

10 Var1 10. . . , . : Var1 := 0; FOR ci := 10 TO 1 BY -1 DO Var1 := Var1 + 1; END_FOR

7.4.7. FOR

FOR . :

FOR := TO [BY ] DO END_FOR

. , .

FOR . , FOR, . , , ( CoDeSys ) . : . , ; . , 255,

132

7.

(ST)

133

FOR y := 0 TO 9 DO FOR x := 0 TO 99 DO (* Arr[y][x]*) ; IF ... THEN EXIT; (* , *) END_FOR END_FOR , , EXIT:

. . CoDeSys , , . . . . . FOR , . , EXIT , (. EXIT). , , . , . bBreakY := FALSE; FOR y := 0 TO 9 DO FOR x := 0 TO 99 DO ; IF ... THEN bBreakY := TRUE; EXIT; (* *) END_FOR IF bBreakY THEN EXIT; END_FOR

7.4.8. EXIT RETURN

RETURN POU. . RETURN , . . , , , 50 , . , EXIT. , , . () ST : WHILE TRUE DO...

EXIT, WHILE, REPEAT FOR, . , . , , (x). FOR: bObtained:= FALSE; FOR N := 1 TO MaxIndex DO IF x = aX[cN] THEN Index := cN; bObtained := TRUE; EXIT; END_IF END_FOR IF bObtained THEN (* , Index*)

7.4.9. WHILE REPEAT , - . , .

EXIT , . :

134

7.

(ST)

135

FOR icY := 0 TO 8 DO FOR icX := 0 TO 16 DO IF iaPos[icY,icX] > iLevel THEN iBalance := iBalance + 1; ELSE IF iaPos[icY,icX] < iLevel THEN iBalance := iBalance 1; END_IF END_IF END_FOR iLevel := iLevel *2; END_FOR ST- , . , :

, . IF. . , . , , . , :

ENO: BOOL := FALSE; niCounter: INT := 1000; aiVar: ARRAY[0..999] OF INT;

IF niCounter = 0 THEN ENO := TRUE; ... (* *) ELSE niCounter := niCounter 1; aiVar[niCounter] := GetInitVal(niCounter); (* *) END_IF

7.4.10.

FOR icY := 0 TO 8 DO FOR icX := 0 TO 16 DO IF iaPos[icY,icX] > iLevel THEN iBalance := iBalance + 1; ELSE IF iaPos[icY,icX] < iLevel THEN iBalance := iBalance 1; END_IF END_IF END_FOR iLevel := iLevel *2; END_FOR ST , C. , ST ( : begin, end; C: {}). (WHILE .. END_WHILE, IF .. END_IF). . . -

ST- . . . . , . , , , . , , . . , : (. ).

136

7.

(LD)

137

. 7.5 : Lamp1 := (Switch1 OR Switch2) AND Switch3 AND ((Switch4 AND Switch6) OR Switch5);

C . . , . : (*FOR x*). , ST , C .

7.5. (LD)

7.5.1.

LD- . , NEMA. LD-. LD .

LD

, , . , . , ( . 7.5 Lamp1). , .

. 7.5.

LD

LD , . , . . . . . (ON), (OFF). (/).

. |/| , . (), (). . (. . 7.6).

. 7.6.

138

7.

(LD)

139

, (/). , .

S_R1 , R_R1 R1, R1 S_R1. SET/RESET- , LD- .

7.5.2.

7.5.3. . . LD . , . . , . , . . . , . LD- . . 7.8 Key ( ) P2 P3. P1 , Key (). LD-,

, . , . . , . LD SET RESET. SET S (S). RESET R. (S) , . (R). , . , . . . (R) (S) , . (R) (S) , . , , . . 7.7.

. 7.7.

. 7.8.

LD

140

7.

(LD)

141

. . 7.9. P1 .

RETURN LD . RETURN (PLC_PRG), . . , RETURN RETURN .

7.5.5. LD

. 7.9.

7.5.4.

, (labels) (jumps). . . . . , M1: M1 . . , . , . , . , , . (. 7.10). , , . LD , . LD . LD- , . , LD- (), SFC.

LD- . . . 7.11 10 . . . . .

. 7.11. 10 CTD

. 7.10.

, EN (Enable) (. . 7.12). EN . EN.

142

7.

(LD)

143

. 7.12. EQ, EN

, : |P| (P) , |N| (N) . , R_TRIG F_TRIG.

. 7.13.

7.5.6. LD CoDeSys

, FALSE . CoDeSys . CoDeSys . . , MULTIPROG , . 7.11, . 7.14.

, LD- . , 50 , . , . . . , . , . , . . CoDeSys LD- . (. . 7.13). , . LD- . , , -

. 7.14. MULTIPROG

RESET . , . LD . LD . LD- FBD. LD - .

144

7.

(FBD)

145

EN, ENO (Enable Out), . ENO 1993 , . CoDeSys . ENO . CoDeSys . . ST. ENO , .. 7.15.

. Blinker BLINK . 7.15.

7.5.7. LD-

Online , , On ( ), ( ) . CoDeSys (/) . - . . . . Step over Step in.

FBD . LD, , . CoDeSys POU , (. 7.16). , , .

7.6. (FBD)

7.6.1. POU

FBD , . POU , . POU . , . , . -

. 7.16. FBD

146

7.

(FBD)

147

7.6.2.

POU FBD . . , . , . . . FBD . .

7.6.3. FBD

FBD. CoDeSys , . , . , FOR, . , . . , ? FBD CoDeSys . . .

FBD- , . , , . . . , . . . . FBD CoDeSys .

7.6.6. ,

7.6.4.

FBD , . . CoDeSys Negate. . 7.16 Q TOF Warning.

7.6.5.

(connectors) , . -

FBD- , , , . , , , . . . . . , . , . FBD , . 7.17. . 7.17 . TRUE. RETURN FBD , , . . . . .

148

7.

(SFC)

149

. 7.18. FBD-

7.7. (SFC)7.7.1. SFC- , (. . 7.19). . () . SFC , , (). , . , SFC. , , . , . - . 7.19. .

. 7.17.

FBD

7.7.2.

7.6.7. ST FBD

CoDeSys ST . FBD . .

, (. . 7.19). , , . : 1) ( ); 2) TRUE.

150

7.

(SFC)

151

. 7.22. Ready (IL)

, . CoDeSys ST (T1 > 50 . 7.19). . . IL, ST, LD FBD. . 7.20 7.23 Ready . . . , , , (. . 7.19).. 7.23. Ready (ST)

. TRUE, , , . FALSE, .

7.7.3.

. 7.20. Ready (LD)

SFC- , . (. 7.24). ( Init). , .

. 7.21. Ready (FBD)

. 7.24. Reset

152

7.

(SFC)

153

7.7.4.

SFC (. 7.25). . . , .

(. 7.26) Stop . Move_Dwn Move_Up , Stop FALSE.

. 7.26.

. 7.25.

. .

. , . , , , . (. 7.25) Shaking , Digestion Mixing Ready.

7.7.6.

7.7.5.

SFC . . . . , . , .

SFC- . . . , . (jump). , . 7.27, Move_Dwn Move_Up . , Stop , Move_Dwn Move_Up , 2 , . . . . .

154

7.

(SFC)

155

. 7.27.

7.7.7. SFC. 7.28.

, , , . , . , (. 7.29). , . . E (Entry) . X (eXit) . .

- , CoDeSys (easy mode SFC). , SFC-. , . , . , . , . . - . , 3 , . , . , . CoDeSys . , . . 7.28. Digestion ().

. 7.29.

156

7.

(SFC)

157

SFC . CoDeSys SFC, , .

CoDeSys . , Step1. _Step1 Step1. , . . . (_Step1) TRUE, ( ), ( ). (Step1) , . . TRUE . (_Step1, Step1) 4 : (00), (10), (11 10), (01). , , (. 7.30). , Step4 , Step2.

7.7.8. SFC

. 7.30.

, , . - . ( ), , , . . , . , . , , , . SFC- , . , , . 7.31. , . , Cooling () Drying () air_cooling ( ). , , SFC-.

. (_Step) - . . , SFC- , , , , SFC. , , .

. 7.31.

158

7.

(SFC)

159

POU .

R (Reset, . 7.35). .

7.7.9. . 7.35.

, , (. . 7.31). (qualifier) . : N (Non-stored, . 7.32). , .

L (time Limited). -

, , . . 7.36 . , .

. 7.32.

P (Pulse, . 7.33). . 7.36.

.

SL (Stored and ti-

me Limited, . 7.37). , . R.

. 7.33.

S (Stored, . 7.34). -

. , .

. 7.37.

D (Delayed, . 7.38).

. 7.34.

-

160

7.

(SFC)

161

, . , .

. 7.38.

DS

(Delayed and Stored, . 7.39). . , . ( R) .

( R), . . L, D, SD, DS SL TIME. : D T#10s. , . . 7.41 , Init , A_0 . , .

. 7.41.

. 7.39.

( . 7.7.12). , . :

SD (Stored and time Delayed,

(* *) (* *)

. 7.40). , .

IF Step1.X THEN iACount := iACount + 1; ELSE iDCount := iDCount + 1; END_IF

7.7.10.

. 7.40

SFC - . , . ( . 7.42 bMoveUp) , .

162

7.

(SFC)

163

. 7.42.

, . , , SFC-. . , .

7.7.11.

. , , , , . SFCActionControl (.7.43).

, . - , SFCActionControl. Q . . . CoDeSys , . SFCActionControl IECSFC.lib CoDeSys, SFC -. S R S0 R0. . SFCActionControl , . 7.44. , R0 . Q FALSE. . , Q = TRUE Q TRUE FALSE. SFCActionControl . , . SFC. CoDeSys , . SFCActionControl AC -. IF A_3.AC.Q THEN ...; END_IF (* ?*) -, -

. 7.43.

SFCActionControl

164

7.

(SFC)

165

, . 7.46. A_2 , . .

. 7.46.

2

7.7.12.

. 7.44.

SFCActionControl (FBD)

- . BOOL X . SFC. . TIME T . , .x. , POU. : IF MoveCtrl.Moving.X TRUE THEN ... . . 7.47.

. 7.45. . 7.47.

. , . 7.45. . A_2 , .

X . .x Q SFCActionControl.

166

7.

(SFC)

167

7.7.13. SFC

. 7.48. SFC

CoDeSys SFC- . (SFCInit, SFCReset), SFC-.

SFC . , . . LD. SFC . SFC . . RETURN . . SFC POU . POU, . . SFC . , . . . . 7.48. (Idle) . S1S2 . . , , . , , SFC . . , , . , . , .

7.7.14. SFC SFC- : ; ; ; ; ; . SFC- , .

168

7.

(SFC)

169

. . CoDeSys. , , , , . . , . . , . , 100 , . CoDeSys . . , , , , .

. 7.49 SFC- . S1 (, ) , ( T#0.75s). . . , , , . , , , . SFC- .

. 7.49. CoDeSys

MOD EXPT MOVE := ANY IN1 ANY_NUM IN2 ANY_INT MOD ANY_INT

171

8.

: . MUL ADD , . . (. ). ST: ix1:= (ix1 + ix2 + ix3) / 3; FBD . 8.1.

, . -. . . , , , - . . , . , , .

8.1.

. 8.1.

8.1.1.

ST. . ANY_NUM, TIME ANY_NUM, TIME ANY_NUM, TIME ANY_NUM, TIME

TIME , . TIME . TIME. MOD . OUT := IN1 MOD IN2 ST : IF (IN2 = 0) THEN ELSE END_IF OUT := 0 ; OUT := IN1 (IN1/IN2) * IN2 ;

ADD

+

SUB

MUL

*

DIV

/

OUT := EXPT(IN1/IN2) OUT = IN1IN2. IN2 .

172

8.

173

8.1.3. ANY_BIT. AND OR XOR NOT

MOVE . MOVE . IL LD, ST.

8.1.2.

ANY_BIT. 2 :

OUT := (IN,N);

SHL

IN N ,

SHR

IN N ,

NOT . FBD AND, OR XOR , . . (. ). NOT BOOL () (. . 8.3).

ROR

IN N ,

ROL

IN N ,

. 8.2.

. 8.2.

( online)

. 8.3.

( )

ST :

wX := SHL(wY,8) OR SHR(wY,8);

LD , BOOL . AND -

174

8.

175

, OR ( ) (. . 8.4). OUT := MIN(IN0, IN1) OUT := LIMIT(Min, IN, Max) : OUT:=MIN(MAX(IN,Min),Max) ANY

OUT := MUX(K, IN0, ..., IN(K1))

: OUT := INK.

IN0, ..., IN(K1)):ANY K: ANY_INT

. 8.4.

(IL)

ST :

CoDeSys MAX MIN , . MUX (. . 8.5).

bOut := (bX1 AND bX2) OR (bX1 AND bX3) OR (bX2 AND bX3);

IL :

bX1 bX2 ( bX1 bX3. 8.5.

( bX2 bX3

8.1.5. . GT GE EQ IN0, IN1: ANY G: BOOL ANY

LD AND OR AND ) OR AND ) ST

bOut

> >= = LE LT NE iX2 > iX3

176 LN LOG EXP SIN COS TAN ASIN ACOS ATAN ANY_REAL ANY_REAL ANY_REAL ANY_REAL ANY_REAL ANY_REAL ANY_REAL ANY_REAL ANY_REAL

8.

177

. 2 . 2 , BOOL. . , bOUT := IN1 > IN2; TRUE, IN1 IN2. , , . ST : bOut := iX1 > iX2 AND iX1 > iX3 AND iX2 > iX3; AND . . 8.6 .

ABS, . . ST: lrY := EXPT(SIN(lrX),2) + EXPT(COS(lrX),2); (* 1, x*)

. 8.6.

iX1 > iX2 > iX3 (FBD)

8.1.7. .INT := LEN(STR) STR := LEFT(STRING STR, INT SIZE) STR SIZE STR := RIGHT(STRING STR, INT SIZE) STR SIZE STR := DELETE(STRING STR,INT LEN,INT POS) STR, LEN POS

.

8.1.6.

. ANY_NUM ANY_REAL

ABS

SQRT

178

8.

179

INT := LEN(STR)

STR := MID(STRING STR, INT LEN, INT POS)

STR POS LEN

STR := CONCAT(STRING STR1, STRING STR2)

STR := STR1 + STR2

STR := INSERT(STRING STR1, STRING STR2, INT POS)

, . , . . . (WHILE, REPEAT) . TP TP IN PT TIME BOOL Q ET BOOL TIME

STR1 STR2 POS

STR := REPLACE(STR1, STRING STR2, INT LEN, INT POS)

STR1, LEN , POS STR2

INT := FIND(STRING STR1, STRING STR2)

STR2 STR1. STR2 , 0

1.

8.2.

8.2.1.

IN. PT . IN. ET . ET PT , Q 0. TP . 8.7.

. 8.7.

TP

, . (delay, sleep), . , , . , . , . . . . ( CoDeSys StartTime), . , .

. 8.8 TP . . bx = 0. -

. 8.8.

TP

180

8.

181

bx 1 NOT. , IN . .

TOF

PT , IN TRUE. IN Q FALSE. , Q PT, IN. TON . 8.10.

TOF BOOL TIME

IN

BOOL

Q

PT

TIME

ET

. 8.10. TON

IN Q TRUE. ET IN. Q PT . IN TRUE, . , Q , PT. TOF . 8.9. RTC RTC EN PDT BOOL DATE_AND_TIME Q

BOOL CDT DATE_AND_TIME

. 8.9.

TOF

TON

TON BOOL TIME

IN

BOOL

Q

PT

TIME

ET

IN . Q TRUE

, EN FALSE, Q FALSE, CDT DT#1970-01-01-00-00:00:00. EN PD . , Q = FALSE. EN FALSE, CDT . RTC . , . RTC . . , RTC. , .

182

8.

183

! , . RTC . Q1 = NOT RESET1 AND (Q1 OR SET).

SR Q1 = TRUE Q1 = FALSE. ST :

8.2.2.

SET , RESET1 . RESET1 .

8.2.3. , , . R_TRIG R_TRIG CLK BOOL Q BOOL

SR RS . . 2 . , . . SR RS. . SR . RS .

SR

SR BOOL

SET1

BOOL

Q1

RESET

BOOL

R_TRIG . M: BOOL := FALSE. ST : Q := CLK AND NOT M; M := CLK;

SR Q1 = TRUE Q1 = FALSE. ST :

Q1 = (NOT RESET AND Q1) OR SET1.

SET1 , RESET . SET1 .

RS

RS BOOL

SET

BOOL

Q1

RESET1

BOOL

Q TRUE, CLK FALSE, TRUE. FALSE. M CLK . CLK TRUE, Q . , CLK TRUE, R_TRIG . M TRUE, . , , .

184

8.

185

, .CTD CD LOAD BOOL PV WORD CV WORD BOOL BOOL Q BOOL

CTD

F_TRIG

F_TRIG

CLK

BOOL

Q

F_TRIG . M: BOOL := FALSE. ST :

CD ( CV) 1. Q TRUE, . CV , PV LOAD = TRUE. CTUD / CTUD CU CD RESET LOAD PV BOOL BOOL BOOL BOOL WORD CV WORD QU QD BOOL BOOL

Q := NOT CLK AND NOT M; M := NOT CLK;

, F_TRIG R_TRIG NOT. R_TRIG. F_TRIG .

8.2.4.

.

CTU

CTU BOOL

CU

BOOL

Q

RESET = TRUE CV 0. LOAD = TRUE CV PV. CU 1. CD 1 ( 0). QU TRUE, CV >= PV, FALSE. QD TRUE, CV = 0, FALSE.

RESET WORD

BOOL

PV

WORD

CV

8.3. , . CoDeSys (UTILS). , . ., (ST) .

CU ( CV) 1. Q TRUE, PV . (RESET = TRUE) (CV := 0).

186

8.

8.

187

8.3.1.

.

UNPACKER(B:=In, B0=>B7, B1=>B6, B2=>B5, B3=>B4, B4=>B3, B5=>B2, B6=>B1, B7=>B0); Out := PACK(B0, B1, B2, B3, B4, B5, B6, B7);

8.3.2. HYSTERESIS (. . 8.11) , .

EXTRACT . EXTRACT BOOL 2 : DWORD X BYTE N. TRUE, N X 1, FALSE. 0.

PUTBIT . DWORD 2 : DWORD X, BYTE N BOOL B. X 1 N, B TRUE. 0.. 8.11. HYSTERESIS

PACK . PACK B0, B1, ..., B7 BOOL. BYTE .

IN HIGH, OUT FALSE. IN LOW, OUT TRUE. LOW HIGH HYSTERESIS . ST : IF IN < LOW THEN OUT := TRUE; END_IF IF IN > HIGH THEN OUT := FALSE; END_IF IN, LOW OUT INT, OUT BOOL. HYSTERESIS . 8.12.

UNPACK . PUTBIT BOOL BYTE, PACK . Turn, :

FUNCTION_BLOCK Turn VAR_INPUT In: BYTE; END_VAR VAR_OUTPUT Out: BYTE; END_VAR VAR B0,B1,B2,B3,B4,B5,B6,B7: BOOL; UNPACKER: UNPACK; END_VAR

. 8.12.

HYSTERESIS

188

8.

189

8.3.3.

LIMITALARM . , , . IN HIGH LOW . (INT). (BOOL) : O (IN > HIGH); U (IN < LOW); IL (LOW= HIGH). . 8.13. LIMITALARM. 1000 . 600, 600.

ASCEND DESCEND, . . TIMEBASE , . , . TIMEBASE t#0s, . (RESET := TRUE) . . UTILS : INT (RAMP_INT) REAL (RAMP_REAL) (. . 8.14).

. 8.14. RAMP

. 8.13. LIMITALARM

8.3.5. CHARCURVE (. 8.15) - , . , , .

8.3.4.

RAMP . RAMP 1 OUT 5 :

IN

ASCEND

DESCEND

TIMEBASE

/ . 8.15. CHARCURVE

RESET

(BOOL)

190

8.

191

8.3.6. DERIVATE (. 8.16).

x Xi < x < Xi+1. y , (Xi,Yi) (Xi+1,Yi+1). y :

y = Yi +

Yi+1 Yi (x X i ). X i+1 X i

CHARCURVE (Xi1,Yi1) (Xi,Yi). , . :

. 8.16.

y = Yi

Yi Yi 1 (X i x). Xi Xi 1

CHARCURVE ARRAY P[0..10], P POINT, INT X Y. N (BYTE) , 11, . IN (INT) OUT (INT). X. ERR CHARCURVE:

ERR

, . , . , . . , , . . DERIVATIVE , . . 8.17. ( ) . , , -

0

1

2

: IN < P[0].X IN > P[N-1].X

4

N: N < 2 N > 11

OUT . CHARCURVE .

. 8.17.

192

8.

193

DERIVATIVE 3 :IN TM RESET BOOL DWORD ( ) REAL

. . Y0 , Y1 . : T0 Y1 Y0 . . Y1 . Y1 Y2 2,03. (2). (4) (tg = 0,99). CoDeSys DERIVATIVE :

OUT := (3(Y 0 Y 3) + Y 1 Y 2) / (3T 2 + 4T1 + 3T 0).

. . :

Y 3 = Y 2, Y 2 = Y 1, Y 1 = Y 0 . T2 = T1, T1 = T0.

OUT REAL. Y0 IN, T0 TM. (RESET = TRUE) ( ) Y3, Y2 Y1 IN, OUT 0. DERIVATIVE . (ST) . 8.18. , , . DERIVATIVE , . T1. .

8.3.7. INTEGRAL (. . 8.19). INTEGRAL 3 :IN TM RESET REAL DWORD BOOL ( )

. 8.18. DERIVATIVE

OUT. OVERFLOW (BOOL) OUT REAL.

194

8.

195

. 8.19.

(RESET). . . IN . (. . 8.20). . ST ( ) : OUT := OUT + IN * TM. RESET TRUE, .

. 8.21.

. TM , . INTEGRAL (, . .). , . , INTEGRAL .

8.3.8. -

. 8.20. INTEGRAL

INTEGRAL . 0 2p , AC = 10 + 4 sin x + 2 sin 2x. ST . 8.21. [0,2p] 200 . , DERIVATIVE INTEGRAL (, , RAMP). -

-- () . , -. , , , , ( ). , . . ( ) e(t). -

196

8.

197

y(t) , . , , , . . . . . . -. , . - :

. , . . 8.23 , , , . .

t

y (t) = Y0 + Kp (e (t) +

1 de (t) e(t) + Tv dt ), Tn 0

Y0 , e(t) , Kp , Tn , Tv . . 8.22 PID . . -. .

. 8.23.

. . - , . - :ACTUAL SET_POINT KP TN TV Y_OFFSET Y_MIN REAL REAL REAL DWORD DWORD REAL REAL (msec) (msec)

. 8.22.

198

8.

199

Y_MAX

REAL

MANUAL

BOOL

RESET

BOOL

:

(Y_MAX > Y_MIN), . - () TV := 0. () - () CoDeSys PD.

Y

REAL

LIMITS_ACTIVE

BOOL

OVERFLOW

BOOL

(. 8.24). -, CoDeSys . , Y . -

. 8.24.

(PRG LD, SFC)

201

9.

, , . ET- . , .

. . . PRG , . , FUN , FB . CoDeSys.

9.2. (PRG LD, SFC) , . , 1 , . 9.2.

9.1. (PRG LD)

. 9.1. LD .

. 9.1.

. 9.2. LD

Impulse x , , , Pause. x, ( ). x . , (. BLINK CoDeSys). -

Go T1 T3. . Y1 Y3 . BOOL. CoDeSys (. 9.3).

202

9.

(PRG LD)

203

. 9.5.

SFC

. 9.3.

9.3. (PRG LD)

. , . , .

. 9.4.

SFC. .

y1, y2, y3: BOOL; Go: BOOL := TRUE;

. . S1 S2, S3. . Init , Go. y1, y2, y3 . SFC- . 9.5.

. . 9.6 . 2, 3, 4, 5. 2 1. 2 5 , . 6 9 () . , . 9.6.

204

9.

(FUN LD, ST)

205

9.4. (FUN LD, ST)

. 9.7.

LD-

. , , . , , N . , 7 * N . . 7 + N . , . BYTE, , . 9.8. . 9.8. , . , , . , , . , : (HD) (IN). BOOL. HD . : FUNCTION DinLight7 : BYTE VAR_INPUT IN: HD: END_VAR VAR CONSTANT LightCodes: ARRAY[0..15] OF BYTE := 16#3F, 16#06, 16#5B, 16#4F, BYTE; BOOL;

, . 2 9 . 2 5 . . - 10 1 2 : . LD . 9.7. , . 6 . .

206

9.

(FUN ST)

207

16#66, 16#6D, 16#7D, 16#07, 16#7F, 16#6F, 16#77, 16#7C, 16#39, 16#5E, 16#79, 16#71; END_VAR

LightCodes. 0 F, . LightCodes. , . 4 . ST :

. 9.10 . Indicator . byLight1 byLight2. , , (. . 9.8) PLC_PRG.byLight1.1. + TRUE bAddButton, x .

IF HD THEN IN := SHR (IN,4); ELSE IN := IN AND 16#0F; END_IF

DinLight7_ST := LightCodes[IN];. 9.10.

DinLight7 LD, . . 9.9.

, 0..99. BCD . : Light := DinLight7(INT_TO_BCD(byNum), bPulse);.

9.5. (FUN ST)

. 9.9.

LD- DinLight7

. , , . , , 18/10. 1,8. 1, 44%. 2, 11%.

208

9.

(FUN ST)

209

, , , , . . , . . . 2 .. 9.11. y := x/3, x 10 +10

(. . 9.11).

FUNCTION ISMDIV : INT VAR_INPUT iNum: INT; iDen: INT; END_VAR VAR iExcess: INT; bSign: BOOL; END_VAR

(* *) IF (iNum < 0) XOR (iDen < 0) THEN bSign := TRUE; ELSE bSign := FALSE; END_IF

. 9.11. 3 10 . , . , . 2, 1, 0, 1, 2 . CoDeSys. , , , . , , . 9.12.

(* *) ISMDIV := ABS(iNum / iDen); iExcess := ABS(iNum MOD iDen); (**) (* *)

. 9.12. y := x/3 ( , + y)

IF iExcess >= ABS(iDen) iExcess THEN ISMDIV := ISMDIV + 1; (*. *) END_IF

IF bSign THEN ISMDIV := -ISMDIV; END_IF

y = f(x). . x . , . CoDeSys ,

210

9.

(FB ST)

211

. (. 9.13) , , .

a b. b 251, a 170. . 250. . X. . 1 250.

. 9.13. y := ISMDIV(x, 3), x 10 +10

. 9.13 ISMDIV. , . ISMDIV . , . . , . , .

. 9.14.

9.6. (FB ST)

. 0 . Load . , 1.

, [1..250], c . :

X i = bX i 1 aE (b X i 1 a),

a b , E , . , ( E ) 0. [17]. . -

FUNCTION_BLOCK Random VAR_INPUT Load: BOOL; x0: USINT; END_VAR VAR_OUTPUT x: USINT := 1; END_VAR VAR RESET: R_TRIG;

212

9.

FIFO (FB ST)

213

END_VAR

Reset(CLK := Load); IF Reset.Q THEN x := x0; END_IF

16 . , .

x := x * 170 251 *(x * 170/251);

200 . 9.14. .

9.7. FIFO (FB ST)

FIFO , . . (bWREn = TRUE), (byWR) . (bRDEn = TRUE), (byRD). bReady . (bReady = FALSE) byRD 0.

FUNCTION_BLOCK BY_FIFO VAR_INPUT byWR: BYTE; (* *) bWREn: BOOL; (* *) bRDEn: BOOL; (* *) END_VAR VAR_OUTPUT bReady: BOOL; (* *) byRD: BYTE; (* *) END_VAR VAR byBuf: ARRAY[0..15] OF BYTE; nWRPos: WORD := 0; (* *) nRDPos: WORD := 0; (* *) END_VAR IF bWREn THEN byBuf[nWRPos] := byWR; (* FIFO*)

. 9.15. FIFO

IF nWRPos > 14 THEN (*WRPos *) nWRPos := 0; ELSE nWRPos := nWRPos + 1; END_IF END_IF IF nWRPos = nRDPos THEN bReady := FALSE; byRD := 0; ELSE bReady := TRUE; (*FIFO ?*)

. 9.16. FIFO . . , . , , 5 .

. 9.16. FIFO

214

9.

(FB ST)

215

IF bRDEn THEN (* FIFO*) byRD := byBuf[nRDPos]; nWRPos := nWRPos + 1; END_IF IF bRDEn THEN byRD := byBuf[nRDPos]; nRDPos := nRDPos + 1; END_IF (* FIFO*)

IF nRDPos > 14 THEN (*RDPos *) nRDPos := 0; ELSE nRDPos := nRDPos + 1; END_IF END_IF END_IF

, bWREn bRDEn, .

, . . . . .

9.9. (FB ST) (. 9.17) . .

9.8. FIFO (FB ST)

. 9.17. Move Average

. : y[i] = 1 NN 1

, . , . , . . BYTE#255 + BYTE#1 = 0, . FIFO-. :

VAR byBuf: ARRAY[0..255] OF BYTE; nWRPos: BYTE := 0; (* *) nRDPos: BYTE := 0; (* *) END_VAR

x[i j],j=0

. .

IF bWREn THEN byBuf[nWRPos] := byWR;

(* FIFO*)

x[] , y[] , N . , . y[i] x[i] N1 . , , . 9.18 . . , ,

216

9.

(FB ST)

217

, 8- WORD. 257 BYTE (255 * 257 = 65535). . FIFO. IF byShift < byLen THEN (* *) byFIFO(byWR := byIn); wSum := wSum + byIn; byShift := byShift + 1; IF byShift = byLen THEN (* *) bReady := TRUE; byFIFO.bRDEn := TRUE; END_IF ELSE (* *) byFIFO(byWR := byIn); wSum := wSum byFIFO.byRD + byIn; END_IF byOut := WORD_TO_BYTE(wSum / byShift); byShift = byLen . FIFO . . , . .

. , 3 11 : N 1 , . . 9.18. FIFO. , . , , . x[j N] x[j], . . : byIn , byLen : byOut , bReady . , . FIFO , . :

9.10. (FB ST) , . , . , . , .

FUNCTION_BLOCK BY_MOVAVR VAR_INPUT byLen: BYTE; byIn: BYTE; END_VAR VAR_OUTPUT bReady: BOOL := FALSE; byOut: BYTE; END_VAR VAR byShift: BYTE := 0; byFIFO: BY_FIFO := (bWREn := TRUE , bRDEn := FALSE); wSum: WORD; END_VAR

218

9.

(FB ST)

219

9.19 . . , . . . 9.19. , 13 . . , ( ) , . , . , , . . Med(x + y) Med(x) + Med(y). FIFO. . . : FUNCTION_BLOCK BY_MEDIAN VAR_INPUT byLen: BYTE; byIn: BYTE; END_VAR VAR_OUTPUT bReady: BOOL := FALSE; byOut: BYTE; END_VAR VAR byShift: BYTE := 0; byFIFO: BY_FIFO := (bWREn:=TRUE , bRDEn:=FALSE); wSum: WORD; (* *) cby, (* *) byX, (* *) byAvr, (* *) byDifference, (* . *) byXdif: BYTE; (*. *) END_VAR IF byShift < byLen THEN (* *)

:

wNextPos: WORD;

2 . ClrPos :

wNextPos := wRDPos;

GetNext :

byRD := byBuf[wNextPos]; IF wNextPos > 14 THEN (*NextPos *)

wNextPos := 0;

ELSE

wNextPos := wNextPos + 1;

END_IF

wSum := wSum + byIn; byFIFO(byWR :=byIn); byShift := byShift + 1; IF byShift = byLen THEN (* *) bReady := TRUE; byFIFO.bRDEn := TRUE; END_IF ELSE (**) byFIFO(byWR := byIn); wSum := wSum byFIFO.byRD + byIn;

220

9.

(PRG ST)

221

byAvr := WORD_TO_BYTE(wSum / byLen);

9.11. (PRG ST)

byFIFO.ClrPos; byDifference := 255;

(* *)

FOR cby := 1 TO byLen DO byFIFO.GetNext; byX := byFIFO.byRD; byXdif := MAX(byX,byAvr) MIN(byX,byAvr); IF byXdif < byDifference THEN byDifference := byXdif; byOut := byX; END_IF END_FOR END_IF

, . byLen . byX byXdif. . . , . , , . , , . ( . [13], [20]). . 9.20. 8 . . 9.20. .

CHARCURVE. . 220 . . . , 5%. . , . CoDeSys . , . [11] [12]. Microsoft Excel. , Excel (, ). . 9.21 . (). : , ; (5 10) . , Excel ; . , ; Y (5%); , , . -

222

9.

(PRG ST)

223

(X := 960,Y := 8),(X := 1023,Y := 0); END_VAR IF x > 999 THEN x := 0; ELSE x := x+5; END_IF curvLIN(IN := x, N := 8, P := BP, OUT => y); . 9.23. X ,

. 9.21.

. . , , . 9.22. CoDeSys. . ST :

PROGRAM PLC_PRG VAR curvLIN: CHARCURVE; x,y: INT; BP:ARRAY[0..10] OF POINT := (X := 0,Y := 220),(X := 10,Y := 220), (X := 160,Y := 112),(X := 300,Y := 68), (X := 480,Y := 39),(X := 700,Y := 22),

. 9.22.

224

9.

- (FB IL)

225

. 9.24 byRate 30, 50 70.

. 9.24. -

TP. SINT TIME. 100 byRate, 100 byRate.

. 9.23.

5 (x := x + 5). (. 9.21). . , , , . Excel - (. CHARCURVE) . 10 [0 1023]. CAL LD EQ RETCN

FUNCTION_BLOCK PWMTP VAR_INPUT byRate: USINT; END_VAR VAR_OUTPUT bOUT: BOOL; END_VAR VAR PERIOD: TP; tPulse: TIME; tPause: TIME; END_VAR PERIOD PERIOD.Q FALSE (* *) (* ?*)

9.12. - (FB IL)

LD EQ JMPC LD ST LD

bOUT TRUE pause TRUE bOUT byRate

- () , . . -. , , , , , . . 100 . byRate 0 100%.

(**)

226

9.

(FB SFC)

227

SINT_TO_TIME ST PERIOD.PT JMP oscillation

pause: LD ST

FALSE bOUT

(**)

LD 100 SUB byRate SINT_TO_TIME ST PERIOD.PT

oscillation: CAL PERIOD(IN := FALSE) (* *) CAL PERIOD(IN := TRUE) (* *)

. 9.25. CoDeSys

9.13. (FB SFC)

. 9.25 . : Pwr , ; Rew . , , . Pwr; Start . . ; Break . , . . . , . , , (On) (Direction). . tStart tBrake

( 5 ). 4 , . ReversibleEngine SFC- (. 9.26). ST. FUNCTION_BLOCK ReversibleEngine VAR_INPUT Direction, On: BOOL; tStart: TIME := t#5s; (* *) tBrake: TIME := t#5s; (* *) END_VAR VAR_OUTPUT Power, (**) Reversal, (**) Starting, (**) Braking: BOOL; (**) END_VAR VAR Tm: TON; (* *) END_VAR

228

9.

(FB SFC)

229

ENTRY_ACTION Tm(IN := FALSE, PT:= tStart); Tm.IN := TRUE; Starting := TRUE; Power := TRUE; Reversal := Direction; END_ACTION (* *)

, (Motion), , . :

. 9.26. SFC-

TRANSITION FROM Motion TO Braking:= NOT On OR Reversal Direction END_TRANSITION

(Stop) , , On.

TRANSITION FROM Stop TO Run:= On END_TRANSITION

, , . . , , . STEP Motion: END_STEP ENTRY_ACTION Starting := FALSE; END_ACTION : TRANSITION FROM Braking TO Stop:= Tm.Q END_TRANSITION , . , , . (**)

, (Run), tStart. , . , :

TRANSITION FROM Run TO Motion:= Tm.Q OR NOT On OR Reversal Direction END_TRANSITION

, , . :

STEP Run: Tm; END_STEP

(**)

230

9.

(IL, ST, FBD, LD)

231

Braking END_ACTION EXIT_ACTION Braking := FALSE; END_ACTION

:= TRUE;

. , , . . SFC- . CoDeSys (END_ACTION, EXIT_ACTION). , ( 9.27).

9.14. (IL, ST, FBD, LD)

. 9.27. ReversibleEngine

. , .

STEP Braking: (**) Tm; END_STEP

ENTRY_ACTION Tm(IN := FALSE, PT := tBrake); Tm.IN := TRUE; Power := FALSE;

? . . . () ST- IL- . , IL, . , , . SFC. , . SFC . . SFC . , .

232

9.

(IL, ST, FBD, LD)

233

, ( ST) , : VAR state := 0; END_VAR (* *) CASE state OF 0: ; , (return) ; ; 1: 2: ; , state = , ; , ; ; ... ... ... ELSE ; state := 0; ; END_CASE state 1; (*, *) , Reversible Engine ST. , , . State . 2;

. . . , -. . , , , . . . SFC. CoDeSys ( 2.2) : 8- Intel 8051 16- Infineon 16x. ( ) . , .

9.14.1. (ST, IL)

, (C, ), . , . , , . , . ( SFC) . . , .

234

9.

(IL, ST, FBD, LD)

235

Power := TRUE; Reversal := Direction; END_CASE State := State +1;

. State . , , . ST SFC- .

CASE State OF 1: (*STEP Run*) Tm; IF Tm.Q = FALSE AND On AND Reversal = Direction THEN RETURN; END_IF

(*EXIT Run*) Starting := FALSE;

2: (* STEP Motion*) IF On = TRUE AND Reversal = Direction THEN RETURN; END_IF

. State := 0; , . . SFC, CoDeSys. Reversible Engine ST IL. . (* State*)

(*EXIT Motion*) Power := FALSE; Braking := TRUE; Tm(IN := FALSE, PT := tBrake); Tm.IN := TRUE;

3: (*5: STEP Braking*) Tm; IF NOT Tm.Q THEN RETURN; END_IF

LD EQ JMPC LD EQ JMPC LD EQ JMPC LD ST

State 1 case1 State 2 case2 State 3 case3 0 State (*STEP Stop*) On case0: LDN RETC CAL LD ST LD ST

(* *)

(*EXIT Braking*) Braking := FALSE; ELSE State := 0; (* *)

(*IF NOT On THEN RETURN*) (*EXIT Stop*) Tm(IN := FALSE, PT := tStart) Direction Reversal (*Reversal:= Direction;*) TRUE Starting (*Starting := TRUE;*)

(*STEP Stop*) IF NOT On THEN RETURN; END_IF

(*EXIT Stop*) Tm(IN := FALSE, PT:= tStart); Tm.IN := TRUE; Starting := TRUE;

236

9.

(IL, ST, FBD, LD)

237

ST ST JMP ST NextState: LD State ADD 1 ST State (*State := State +1;*)

Power Tm.IN NextState

(*Power := TRUE;*) (*Tm.IN := TRUE*)

(*EXIT Braking*) Braking (*A=FALSE*)

case1: CAL LDN

(*STEP Run*) Tm Tm.Q

(*IF Tm.Q = FALSE AND On AND Reversal = Direction THEN RETURN*)

AND AND EQ ) RETC

On ( Reversal Direction

. 9.28 Reversible Engine SFC- ST- IL-.

LD ST JMP

(*EXIT Run*) FALSE Starting NextState

(*Starting := FALSE;*)

case2: LD

AND EQ ) RETC

(*STEP Motion*) On (*IF On = TRUE AND Reversal = Direction THEN RETURN*) ( Reversal Direction

. 9.28. Reversible Engine

CAL LD ST ST LD ST JMP

(*EXIT Motion*) Tm(IN := FALSE, PT := tBrake) TRUE Tm.IN Braking FALSE Power NextState

IL ST . ( LD TRUE . C : Starting = Power = Tm.IN = TRUE. ST .) LD FBD , , .

case3: CAL LDN RETC

(*STEP Braking*) Tm Tm.Q

9.14.2. (FBD, LD, ST, IL) FBD- .

238

9.

(IL, ST, FBD, LD)

239

. :

VAR TmRun: TmBrake: END_VAR

TON; TOF;

2 : TmRun TmBrake (. 9.29).

. 1. 3 . , . 4 () . AND . . , . FBD- LD. LD - , (. 9.30). , , .

. 9.30. Reversible Engine LD

FBD- , ST.

. 9.29. Reversible Engine FBD

Power. , (Reversal = Direction), (On) (NOT Braking).

Power := (Direction = Reversal) AND On AND NOT Braking; Reversal := On A