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