正文02Word格式文档下载.docx
《正文02Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《正文02Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
数组或结构体)。
功能在文本程序设计语言(如ST)中可以作为表达式中的一个操作数。
声明一个功能时必须为其指定相应的数据类型,即在功能名的后面输入一个冒号并注明数据类型。
正确格式如下:
FUNCTIONFct:
INT
此外,必须为功能分配一个输出结果,也就是说功能名即为输出变量。
功能声明以关键字FUNCTIUON开始。
例如:
采用IL语言编写的功能中接收三个输入变量,返回值为前两个变量的乘积除以第三个变量。
在ST中,功能可以作为表达式中一个操作数直接被调用。
功能不具有内部条件,当使用相同的输入参数多次调用同一个功能时,该功能总是返回相同的数据。
在SFC中,功能调用只能应用于某一步或某一转换中。
在IL中调用:
LD7
Fct2,4
STResult
在ST中调用:
Result:
=Fct(7,2,4);
在FBD中调用:
可以在项目中定义名为CheckBounds的功能用于检测项目的溢出范围。
该功能名被定义后便只使用这个标记符。
关于功能的更进一步的解释请参阅在线帮助。
功能CheckDivByte、CheckDivWord、CheckDivDWord和CheckDivReal用于检查除法运算中的除数值,避免因除数为零引起的错误。
功能CheckRangeSigned和CheckRangeUnsigned用于防止Subrange类型变量溢出。
以上所有检测功能名均已预留。
2.3.4功能块
功能块作为一个POU,被调用时输出一个或多个数据。
与功能(Function)不同,功能块没有返回值。
关键字FUNCTION_BLOCK用于声明功能块。
功能块以调用其实例(Instance)的方式执行。
功能块示例(IL):
上例中的功能块有两个输入变量和两个输出变量。
一个输出量为两个输入量的乘积,另一个输出量为两个输入量的大小比较结果。
2.3.5功能块实例
功能块可以实例的方式建立,
每个实例只处理其自身的标识符(实例名)和包含输入输出及内部变量的数据结构。
和变量一样,实例可以声明为局部实例或全局实例,功能块的名字是根据标识符的类型定义的。
功能块FUB的名为INSTANCE的实例可写为:
INSTANCE:
FUB;
功能块通常通过其实例调用。
从功能块实例外部只能操作其输入输出参数,不能操作内部变量。
访问一个输入变量:
功能块FB包含一个名为in1的输入变量,类型为INT。
PROGRAMprog
VAR
inst1:
fb;
END_VAR
LD17
STinst1.in1
CALinst1
END_PROGRAM
功能块和程序的声明部分可以包含实例的声明,功能中不允许实例的声明。
功能块实例只能在声明了该功能块实例的POU中使用,除非将其声明为全局类型。
功能块实例名称可以用作功能或功能块的输入参数。
提示:
功能块的所有变量的数据在被调用后保留直至下一次调用;
然而以同样的参数多次调用功能块,功能块不一定会输出相同的数据。
只要功能块变量中有一个是保留型变量,整个实例将保存在保留区中。
2.3.6功能块调用
可以通过建立功能块实例的方法从其它的POU中存取输入输出变量,并按如下的语法格式设置指定的变量:
<
实例名>
.<
变量名>
如果需要设定功能块输入参数,在文本语言IL、ST中,数值可分配给功能块实例名后括号内的参数中(赋值操作用“:
=”符号,类似于变量的初始化命令)
请注意,功能块的输入输出变量(VAR_IN_OUT)是被当作指针来传递的,所以调用功能块时,不能将常数分配给VAR_IN_OUT,并且不允许从外部进行读写操作。
inst:
fubo;
var:
int;
var1:
=2;
inst(instout1:
=var1^);
下列情况是不允许的:
=2);
或inst.inout1:
调用功能块FUB:
乘积保存在变量ERG中,比较的结果保存在变量QUAD中,在程序中声明名为INSTANCE的功能块FUB的实例。
使用IL语言调用功能块实例的方法:
使用ST语言调用功能块实例(声明部分与IL语言一样):
使用FBD调用功能块实例(声明部分与IL语言一样):
在SFC中功能块只能在步中调用。
2.3.7程序
程序作为一个POU,在执行过程中输出一系列数据。
在一个项目中,程序属于全局元素。
所有数据在程序结束后一直保持直到下一次程序执行。
程序示例:
程序可以被调用,但不能在功能中被调用。
与功能块不同,程序的调用不通过实例。
如果一个POU调用一个程序并且程序中的值被改变,那么这个改变将一直保持至下次此程序被调用,即使这个程序是被其他POU调用的。
功能块调用方式不同于程序,仅功能块指定实例中的数据发生变化。
只有当同一个实例被调用时,变化的数据才发挥作用。
程序的声明由关键字PROGRAM开始,由END_PROGRAM结束。
在IL中调用程序:
CALPRGExample
LDPRGexample.PAR
STERG
在ST中:
PRGExample;
Erg:
=PRGexample.PAR;
在FBD中:
在PLC_PRG中调用程序:
LD0
STPRGexample.PAR(*缺省设置PAR为0*)
CALILcall(*ERG在IL中调用结果为1*)
CALSTcall(*ERG在ST中调用结果为2*)
CALFBDcall(*ERG在FBD中调用结果为3*)
如果程序PRGexample中的变量PAR被主程序初始化为0,然后程序按以上的顺序逐一调用,则ERG的结果为1,2和3。
如果调用的顺序改变,则结果也会相应改变。
2.3.8PLC_PRG
PLC_PRG是一个预定义的特殊POU。
每个项目都必须包含这个特殊程序。
这个POU在每个扫描周期只调用一次。
一个新项目建立后,第一次使用'
Project'
、'
ObjectAdd'
命令时,在POU对话框中显示以PLC_PRG命名的一个缺省程序类型POU名。
不要更改这个缺省设置。
如果已定义了任务,则项目中可以不含有以PLC_PRG命名的程序,执行顺序依赖于任务的分配。
注意:
请勿删除或重命名POUPLC_PRG(假定当前未使用任务配置)!
在单任务程序中PLC_PRG通常作为主程序。
2.3.9动作(Action)
动作可以在功能块和程序中定义。
动作代表由另一种语言编写的程序的进一步执行,。
每个动作都有一个名称。
动作与功能块或程序中的数据合作,使用相同的输入/输出变量和局部变量。
功能块中的动作。
例子中,所调用的功能块Counter会根据输入变量“in”的变化,其输出变量“out”的值会增大或减小。
执行功能块的动作复位(Reset)可将输出变量置零。
两种情况下均可对变量“out”进行写操作。
动作的调用采用<
程序名>
动作名>
或<
的格式。
如果要求某功能块在内部调用其自身的动作,则只需在文本编辑器或图形模式下直接使用动作名而不需要实例名。
举例说明上述调用动作的方法如下:
动作在顺序功能图的程序块中占有重要的位置,参见顺序功能图–SFC部分。
除顺序功能图以外的IEC标准均不识别动作。
各种声明方式举例如下:
PROGRAMPLC_PRG:
Inst:
Counter;
CALInst.Reset(In:
=FALSE)
LDInst.out
STERG
在ST中调用:
Inst.Reset(In:
=FALSE);
Erg:
=Inst.out;
2.3.10程序资源
资源用于配置和组态项目以及跟踪变量值。
2.3.11库文件
一个项目中可包含多个库文件,这些库文件中的POU、数据类型和全局变量可以象用户自定义的变量一样被调用。
名为standard.lib和util.lib的库文件是程序中的标准部分,可根据需要使用。
参见库文件管理一章。
2.3.12数据类型
除了标准数据类型以外,用户还可以自定义数据类型。
结构体、枚举和参考体均可被创建。
参见在线帮助中数据类型一章。
2.3.13可视化工具
WAGO-I/O-PRO32提供可视化工具用于显示项目变量。
可以用它在离线方式下编辑图形界面,在线方式下图形元素的形状、颜色和字符内容等均可根据指定变量数值的变化而变化。
参见可视化工具一章。
2.4编程语言
2.4.1语句表(IL)
语句表程序(IL)包含了一系列的指令。
每条指令占一行,包含一个操作符,根据操作功能的不同还会包含一个或多个操作数,操作数之间用逗号分隔。
指令之前会有一个识别标志(标签)和一个冒号(:
)。
注释文字放在一行的最后。
指令行之间可以插入空行。
LD17
STlint(*comment*)
GE5
JMPCnext
LDidword
EQistruct.sdword
STNtest
next:
2.4.1.1IL语言的修饰符和操作符
IL语言中可使用下列操作符和修饰符。
修饰符:
C:
用于JMP、CAL、RET:
如果该指令前的表达式结果为“真”,则执行该
指令。
N:
用于JMPC、CALC、RETC:
如果该指令前的表达式结果为“假”,则执行该
其它操作符:
用于操作数(布尔量)取反。
(累加器除外)
下列表格中列出IL语言中所有的操作符及可用的修饰符以及相关的含义:
操作符
修饰符
含义
LD
N
将操作数写入缓存
ST
将运算结果写入指定操作数
S
置位布尔操作数
R
复位布尔操作数
AND
N,(
位逻辑“与”运算
OR
位逻辑“或”运算
XOR
位逻辑“异或”运算
ADD
(
“加”运算
SUB
“减”运算
MUL
“乘”运算
DIV
“除”运算
GT
>
“>
”
GE
=
EQ
NE
“<
LE
=“<
=”
LT
JMP
C,N
跳转到“label”
CAL
调用程序或功能块
RET
调用返回
)
求推迟执行的运算值
从附录中可以查看所有IEC操作符。
带有修饰符的IL程序实例:
LDTRUE(*将“TRUE”存入缓存*)
ANDNBOOL1(*“BOOL1”取反与“TRUE”做与运算*)
JMPCmark(*如果结果为“TRUE”,跳转到“mark”*)
LDNBOOL2(*“BOOL2”取反*)
STERG(存入变量“ERG”中*)
label:
LDBOOL2(*取“BOOL2”*)
STERG(*存入变量“ERG”中*)
IL语言允许在操作符后面跟有圆括弧,圆括弧中的值被当作操作数来处理。
LD2
MUL2
ADD3
STERG
在这里ERG的值为7。
然而,如果取圆括弧中的值:
MUL(2
在这里ERG的值则为10,操作符MUL只有当程序进行到“)”才继续执行,这时乘数为5。
2.4.2结构化文本语言(ST)
结构化文本语言包含一系列类似高级语言的语句。
程序中可执行条件语句(“IF..THEN..ELSE”)或循环语句(“WHILE..DO”)。
IFvalue<
7THEN
WHILEvalue<
8DO
value:
=value+1;
END_WHILE;
END_IF;
2.4.2.1表达式
表达式是一种执行运算后返回结果的语句。
表达式由操作符和操作数组成。
操作数可以是常数,变量,功能调用或另一个表达式。
2.4.2.2表达式计算
表达式要根据已确定的操作规则进行解算,优先级高的操作符先运算,优先级低的操作符后运算。
优先级相同的操作符按从左至右的顺序进行运算。
下表按优先级顺序列出ST操作符:
符号
优先级
括号
(…)
最高
功能调用
功能名(参数列表)
指数运算
EXPT
取负数
取反
-
NOT
乘法
除法
求余数
*
/
MOD
加法
减法
+
比较
>
<
=,>
等于
不等于
逻辑与
逻辑异或
逻辑或
最低
以下为ST语句表及实例:
语句
示例
赋值
A:
=B;
CV:
=CV+1;
C:
=SIN(X);
功能块调用及功能块输出
CMD_TMR(IN:
=%IX5,PT:
=300);
=CMD_TMR.Q
RETURN
RETURN;
IF
D:
=B*B;
IFD<
0.0THEN
=A;
ELSIFD=0.0THEN
ELSE
=D;
CASE
CASEINT1OF
1:
BOOL1:
=TRUE;
2:
BOOL2:
=FALSE;
END_CASE;
FOR
J:
=101;
FORI:
=1TO100BY2DO
IFARR[I]=70THEN
=I;
EXIT;
END_FOR;
WHILE
=1;
WHILEJ<
=100ANDARR[J]<
70
DO
=J+2;
END_WHILE;
REPEAT
=-1;
UNTILJ=101ORARR[J]=70
END_REPEAT;
EXIT
空指令
;
2.4.2.3赋值语句
赋值语句(:
=)用于将右边的数值赋给左边的操作数(变量、地址)。
Var1:
=Var2*10;
变量Var2的十倍数值被赋值给变量Var1。
2.4.2.4在ST中调用功能块。
在ST中调用功能块,需写明功能块的实例名,然后在圆括号中给参数赋值。
通过下面的例子可以看到,调用定时器并给参数IN和PT赋值,然后将结果变量Q的值赋给变量A。
同IL一样,结果变量由功能块名,点号和变量名表示。
2.4.2.5RETURN语句
RETURN语句用于当条件满足时脱离一个POU。
2.4.2.6IF语句
IF语句用于检查某个执行条件,并根据具体条件执行相应的指令。
语法结构:
IF<
Boolean_表达式1>
THEN
<
IF_语句>
{ELSIF<
Boolean_表达式2>
ELSIF_语句1>
ELSIF<
Boolean_表达式n>
ELSIF_语句n-1>
ELSE_语句>
}
花括号{}中的部分为可选项。
如果<
返回TRUE,则只有<
被执行。
否则从<
开始的逻辑表达式将被逐一检测,直到某个表达式返回TRUE,则此逻辑表达式之后到下一个ELSE或ELSIF之前的语句被执行。
如果没有任何一个逻辑表达式返回TRUE,则<
例子:
IFtemp<
17
THENheating_on:
ELSEheating_on:
程序中当温度降至17度以下时加热器被打开,否则保持关闭状态。
2.4.2.7CASE语句
CASE语句可以根据同一个条件变量的数值变化而去执行多个不同的程序段。
CASE<
变量1>
OF
变量值1>
:
程序1>
变量值2>
程序2>
变量值3,变量值4,变量值5>
:
程序3>
变量值6..变量值10>
程序4>
...
变量值n>
程序n>
ELSE<
ELSE程序>
CASE语句按以下方式执行:
·
的数据值为<
变量值i>
则<
程序i>
中的语句被执行。
不等于所列的任何值,则<
在等于多个不同的值的条件下而执行同一程序段时,则需将变量值逐一写明并用逗号分开。
如果条件变量的值在某一数值范围内执行相同的程序段时,则需将条件变量的下限值和上限值分别给出并用逗号分开。
1,5:
BOOL1:
BOOL3:
BOOL2:
10..20:
BOOL3:
BOOL1:
=NOTBOOL1;
BOOL2:
=BOOL1ORBOOL2;
2.4.2.8FOR循环语句
FOR循环语句可以编写可重复执行的程序。
INT_Var:
INT;
FOR<
整形变量>
:
=<
开始值>
TO<
结束值>
{BY<
步长>
}DO
程序>
只要计数器<
不大于<
则<
会被连续重复执行。
每次被执行前都会进行比较,如果<
大于<
,<
不再被执行。
当<
执行后,<
会按<
增加。
步长可以设为任意整数,缺省值为1。
由于<
只能逐渐增大,因此循环一定会终止。
FORCounter:
=1TO5BY1DO
Var1:
=Var1*2;
=Var1;
假定Var1的缺省值为1,则FOR循环执行结束后的值应为32。
不能与计数器<
的极限值相等。
如果变量Counter类型为SINT而<
的值为127则会形成死循环。
2.4.2.9WHILE循环语句
WHIL