正文02.docx
《正文02.docx》由会员分享,可在线阅读,更多相关《正文02.docx(33页珍藏版)》请在冰豆网上搜索。
正文02
2WAGO-I/O-PRO32V2.2概述
2.1WAGO-I/O-PRO32软件简介
WAGO-I/O-PRO32是一套完整的PLC开发系统,(WAGO-I/O-PRO32代表ControlledDevelopmentSystem)。
WAGO-I/O-PRO32采用IEC编程语言,编辑器及调试工具类似于高级语言(如:
VisualC++),可为PLC应用程序开发人员提供简单易学同时又功能强大的开发环境。
2.2WAGO-I/O-PRO32功能概述
2.2.1项目结构
一个项目的所有相关信息存储于用户定义的项目文件中。
新建项目的第一个POU(程序组织单元
)被自动命名为PLC_PRG,程序的编写从此处开始(应遵循的主要功能是通过C语言编写的),其它的POU也从此处进行访问(程序、功能块、功能)。
一旦定义了任务配置,就不再需要建立名为PLC_PRG的程序(详见任务配置一章)。
一个项目中包含多种不同的对象如:
POU,数据类型、显示元件(可视化组件)和程序资源等。
对象管理器包含有一个项目中所用对象的列表。
2.2.2项目创建
首先要对PLC进行配置以确保项目中所用到的PLC地址的准确性。
然后根据需要创建POU。
再选用合适的语言对POU进行编程。
程序设计工作完成后便可对项目进行编译并修改程序中存在错误。
2.2.3项目测试
项目中的错误完全被排除以后即可启动仿真器,连接并将项目下载至仿真PLC中,此时,你便处于在线模式。
打开PLC配置窗口检测项目是否正确执行。
测试方法可通过手动改变变量的值,然后观察输出值是否与期望的一致,也可通过POU中定义的本地变量观察一系列值的变化情况。
在WatchandReceiptManager中配置需要检测的数据记录。
2.2.4调试
当项目中存在错误时可采用设置断点的方法帮助排除。
程序运行至断点处停止,检查此时各个变量的当前值,了解程序的运行情况,继续单步运行程序,检查程序中的逻辑关系是否正确。
.
2.2.5其它在线工具
更多的调试功能可供使用:
程序变量及输入输出通道可手动置数。
通过流程控制(flowcontrol)检查哪个程序线程在运行。
日志文件按时间顺序记录联机过程中的各种用户操作和内部过程。
采样轨迹用于跟踪和显示变量在一定的时间段内数据的实际变化情况。
使用PLC浏览器可以从PLC中提取有关的状态信息。
当项目设计完成并经过测试通过后即可被装载至硬件系统中做进一步调试,所有仿真状态下的在线功能同样可以使用。
2.2.6辅助功能
整个项目可以打印或导出为文本格式。
2.2.7总结
WAGO-I/O-PRO32是一套功能完备的PLC程序开发工具,可大量减少工程项目所需的开发设计时间。
2.3项目单元
2.3.1项目
一个项目包含有PLC程序的所有对象。
项目的相关信息存储于用户命名的文件中。
一个项目中可以包含如下对象:
POU(程序组织单元),数据类型、可视化组件,程序资源和功能库。
2.3.2POU(程序组织单元)
功能、功能块和程序均为POU,它们都可以被调用。
每个POU均包含变量声明和程序指令
两部分,程序指令部分可采用IL、ST、SFC、FBD、LD或CFC中任何一种IEC编程语言编写。
WAGO-I/O-PRO32支持所有IEC标准的POU,如需使用这些POU,必须将库文件standard.lib引入到你的项目中。
POU之间可以相互调用,但不能
递归调用。
2.3.3功能(FUNCTION)
功能是一种类型的POU,功能被调用时返回一个数据元素(可含有多个子元素如:
数组或结构体)。
功能在文本程序设计语言(如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,并且不允许从外部进行读写操作。
VAR
inst:
fubo;
var:
int;
END_VAR
var1:
=2;
inst(instout1:
=var1^);
下列情况是不允许的:
inst(instout1:
=2);或inst.inout1:
=2;
例如:
调用功能块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:
VAR
Inst:
Counter;
END_VAR
在IL中调用:
CALInst.Reset(In:
=FALSE)
LDInst.out
STERG
在ST中调用:
Inst.Reset(In:
=FALSE);
Erg:
=Inst.out;
在FBD中调用:
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:
如果该指令前的表达式结果为“假”,则执行该
指令。
N:
其它操作符:
用于操作数(布尔量)取反。
(累加器除外)
下列表格中列出IL语言中所有的操作符及可用的修饰符以及相关的含义:
操作符
修饰符
含义
LD
N
将操作数写入缓存
ST
N
将运算结果写入指定操作数
S
置位布尔操作数
R
复位布尔操作数
AND
N,(
位逻辑“与”运算
OR
N,(
位逻辑“或”运算
XOR
N,(
位逻辑“异或”运算
操作符
修饰符
含义
ADD
(
“加”运算
SUB
(
“减”运算
MUL
(
“乘”运算
DIV
(
“除”运算
GT
(
>“>”
GE
(
>=
EQ
(
=
NE
(
<>“<>”
LE
(
<=“<=”
LT
(
<“<”
JMP
C,N
跳转到“label”
CAL
C,N
调用程序或功能块
RET
C,N
调用返回
)
求推迟执行的运算值
从附录中可以查看所有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。
然而,如果取圆括弧中的值:
LD2
MUL(2
ADD3
)
STERG
在这里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
加法
减法
+
-
比较
<,>,<=,>=
等于
不等于
=
<>
逻辑与
AND
逻辑异或
XOR
逻辑或
OR
最低
以下为ST语句表及实例:
语句
示例
赋值
A:
=B;CV:
=CV+1;C:
=SIN(X);
功能块调用及功能块输出
CMD_TMR(IN:
=%IX5,PT:
=300);
A:
=CMD_TMR.Q
RETURN
RETURN;
IF
D:
=B*B;
IFD<0.0THEN
C:
=A;
ELSIFD=0.0THEN
C:
=B;
ELSE
C:
=D;
END_IF;
CASE
CASEINT1OF
1:
BOOL1:
=TRUE;
2:
BOOL2:
=TRUE;
ELSE
BOOL1:
=FALSE;
BOOL2:
=FALSE;
END_CASE;
FOR
J:
=101;
FORI:
=1TO100BY2DO
IFARR[I]=70THEN
J:
=I;
EXIT;
END_IF;
END_FOR;
WHILE
J:
=1;
WHILEJ<=100ANDARR[J]<>70
DO
J:
=J+2;
END_WHILE;
REPEAT
J:
=-1;
REPEAT
J:
=J+2;
UNTILJ=101ORARR[J]=70
END_REPEAT;
EXIT
EXIT;
空指令
;
2.4.2.3赋值语句
赋值语句(:
=)用于将右边的数值赋给左边的操作数(变量、地址)。
例如:
Var1:
=Var2*10;
变量Var2的十倍数值被赋值给变量Var1。
2.4.2.4在ST中调用功能块。
在ST中调用功能块,需写明功能块的实例名,然后在圆括号中给参数赋值。
通过下面的例子可以看到,调用定时器并给参数IN和PT赋值,然后将结果变量Q的值赋给变量A。
.
同IL一样,结果变量由功能块名,点号和变量名表示。
CMD_TMR(IN:
=%IX5,PT:
=300);
A:
=CMD_TMR.Q
2.4.2.5RETURN语句
RETURN语句用于当条件满足时脱离一个POU。
2.4.2.6IF语句
IF语句用于检查某个执行条件,并根据具体条件执行相应的指令。
语法结构:
IFTHEN
{ELSIFTHEN
ELSIFTHEN
ELSE
}
END_IF;
花括号{}中的部分为可选项。
如果返回TRUE,则只有被执行。
否则从开始的逻辑表达式将被逐一检测,直到某个表达式返回TRUE,则此逻辑表达式之后到下一个ELSE或ELSIF之前的语句被执行。
如果没有任何一个逻辑表达式返回TRUE,则被执行。
例子:
IFtemp<17
THENheating_on:
=TRUE;
ELSEheating_on:
=FALSE;
END_IF;
程序中当温度降至17度以下时加热器被打开,否则保持关闭状态。
2.4.2.7CASE语句
CASE语句可以根据同一个条件变量的数值变化而去执行多个不同的程序段。
语法结构:
CASE<变量1>OF
<变量值1>:
<程序1>
<变量值2>:
<程序2>
<变量值3,变量值4,变量值5>:
:
<程序3>
<变量值6..变量值10>:
<程序4>
...
<变量值n>:
<程序n>
ELSE
END_CASE;
CASE语句按以下方式执行:
·如果<变量1>的数据值为<变量值i>,则<程序i>中的语句被执行。
·如果<变量1>不等于所列的任何值,则中的语句被执行。
·如果<变量1>在等于多个不同的值的条件下而执行同一程序段时,则需将变量值逐一写明并用逗号分开。
·如果条件变量的值在某一数值范围内执行相同的程序段时,则需将条件变量的下限值和上限值分别给出并用逗号分开。
例如:
CASEINT1OF
1,5:
BOOL1:
=TRUE;
BOOL3:
=FALSE;
2:
BOOL2:
=FALSE;
BOOL3:
=TRUE;
10..20:
BOOL1:
=TRUE;
BOOL3:
=TRUE;
ELSE
BOOL1:
=NOTBOOL1;
BOOL2:
=BOOL1ORBOOL2;
END_CASE;
2.4.2.8FOR循环语句
FOR循环语句可以编写可重复执行的程序。
语法结构:
INT_Var:
INT;
FOR<整形变量>:
=<开始值>TO<结束值>{BY<步长>}DO
<程序>
END_FOR;
花括号{}中的部分为可选项。
只要计数器<整形变量>不大于<结束值>则<程序>会被连续重复执行。
<程序>每次被执行前都会进行比较,如果<开始值>大于<结束值>,<程序>不再被执行。
当<程序>执行后,<整形变量>会按<步长>增加。
步长可以设为任意整数,缺省值为1。
由于<整形变量>只能逐渐增大,因此循环一定会终止。
例如:
FORCounter:
=1TO5BY1DO
Var1:
=Var1*2;
END_FOR;
Erg:
=Var1;
假定Var1的缺省值为1,则FOR循环执行结束后的值应为32。
提示:
<结束值>不能与计数器<整形变量>的极限值相等。
例如:
如果变量Counter类型为SINT而<结束值>的值为127则会形成死循环。
2.4.2.9WHILE循环语句
WHIL