[1] 王永华. 现代电气控制及PLC应用技术[M]. 第5版. 北京:北京航空航天大学出版社, 2018.
IEC61131-3是IEC61131标准的第三部分,它定义了PLC的软件结构、编程语言和程序执行方式,它综合了世界上广泛流行的编程语言的特点,并使其成为一种面向未来的PLC编程语言。
IEC61131-3提供了5种PLC的标准编程语言,其中有3种图形语言:梯形图(LAD)、功能块图(FBD)和顺序功能图(SFC);两种文本语言:结构化文本(ST)和指令表(IL)。
采用IL、LAD、SFC编程制作的顺控程序都通过指令 (指令表编程时的内容 )保存到可编程控制器的程序内存中, 使用如下图所示的各种输入方式编制的程序都可以相互转换后进行显示、编辑。
SFC在新标准中作为一种公共元素出现,其目的是要把它定义成构成PLC程序和功能块内部组织的元素,但其实质仍是一种编程语言,且主流出版物都将其作为一种编程语言看待。
在模块化程序设计环境下,程序组织单元POU(Program Organization Unit) 是用户程序中最小的、独立的软件单元。它相当于传统编程系统中的块(Blocks),POU之间可以带参数或不带参数地相互调用。
在IEC61131-3中定义了三种类型的POU,按其功能的递增顺序依次为函数(Function,FUN)、功能块(Function Block,FB)和程序(Program,PROG)。
函数没有存储器,不存储暂态结果、状态信息或内部数据,故称其无记忆。
PROGRAM 程序名/FUNCTION_BLOCK 功能块名/FUNCTION 函数名:数据类型
指令
END_PROGRAM/END_FUNCTION_BLOCK /END_FUNCTION
PLC程序是由一定数量的基本语言元素(最小单元)组成的,把它们组合在一起形成“说明”或“语句”。
IEC61131-3定义了PLC编程中最常用的数据类型,并允许用户自己定义导出的数据类型。
类(ANY)数据类型:类数据类型由单个数据类型集合而成,ANY-INT表示所有整数的数据类型。
TYPE
变量名: 变量类型;
PRESSURE: REAL;
END_TYPE
TYPE PRESSURE_SENSOR
STRUCT
INPUT: PRESSURE;
STATUS: BOOL;
CALIBRATION: REAL;
ALARM_COUNT: INT;
END_STRUCT
END_TYPE
TYPE DEVICE_MODE:
(INITIALISING,RUNNING,STANDBY,FAULTY)
END_TYPE
在编程中使用导出数据类型时,使用”数据类型#具体变量名“
G := DEVICE_MODE#INITIALISIN;
TYPE VESSEL_PRESS_DATA:
ARRAY[1..20] OF PRESSURE;
END_TYPE
关于数据范围
在对变量进行数据类型定义时可增加。
TYPE
PRESSURE(0.1..30.0): REAL; (*压力范围0.1~30*)
END_TYPE
关于初始值
数据变量的初始缺省值是“0”,字符串的初始缺省值是空串,日期的缺省值是“D#0001-01-01”。
外部变量和输入/输出变量以外的数据变量可定义初始值。
在编制POU之前,必须对变量进行定义和声明,使用变量的地方不同,所使用的变量也会有区别。
输入/输出概念不同于外部物理输入/输出,而是用于FUN/FB。
在IEC61131-3中设置了一些限定符,使用它们可以将附加的特性赋给变量。
RETAIN具有带电保持功能的变量。
CONSTANT常数变量。带有变量名的常数。
(下述两种属性只对VAR_INPUT有效)
R_EDGE上升沿。
Q_EDGE下降沿。
当用到上升沿或下降沿功能时,更多会使用相应标准功能块。
(下述两种属性只对VAR_ACCESS有效)
READ_ONLY只读
READ_WRITE读写
模板:
VAR_变量类型 变量类型
变量名 数据类型:=初始值;
END_VAR
举例:
VAR_OUTPUT RETAIN
Motor1: BOOL := FALSE;
Message: STRING(10);
END_VAR
可以以逗号隔开的方式连续定义几个相同类型的变量:
VAR_变量类型 变量类型
变量名1,变量名2,变量名3 数据类型 :=初始值;
SB1,SB2,SB3 BOOL:= FALSE;
END_VAR
在传统PLC中,当使用其内部资源时,用的是直接地址。在IEC61131-3中,这种变量也可以用地址直接表达或以符号变量的形式出现(即使用变量来表达地址)。它们以%开始,然后表示I(输入)、Q(输出)和M(中间继电器)的字母,接下来是表示PLC地址数据宽度的字母,如X(位)、B(字节)、W(字)、D(双字)等,最后使用分级地址表示的具体的直接地址。对这种变量进行说明时,要通过关键字AT指定。
分级地址,位置的数量和解释取决于制造商。Z-位、Y-字、X-模块、W-机架、V-PLC
PLC的处理器被称为资源(RESOURCE),对资源可以进行定义或说明,定义从关键词RESOURCE开始,以END_RESOURCE结束。在资源说明中,其内容一般包括全局变量说明、通径变量说明和任务定义等。(这里的全局变量限于同一个资源。)
RESOURCE 资源名 ON Resource
全局变量说明
TASK说明
END_RESOURCE
在实时控制系统中,由于控制对象不同阶段的任务和工作过程不同,相应的程序也不同,因而需要对这些不同的程序进行灵活调用和组态。
在IEC61131-3中,若干个程序能同时运行于同一个资源,它们可以有不同的优先权和类型,即程序可以是单周期执行、循环执行、按不同优先级执行。实现这样的功能由任务(TASK)来完成,每一个程序与一个任务相关联(使用关键字WITH),这样就可以使程序进入运行期。
与POU开始部分进行类型说明的PROGRAM含义不同,在一个资源内,关键字PROGRAM…WITH用于将一个任务链接到类型为PROGRAM的一个POU。
因此,定义任务的目的就在于规定程序以及功能块的运行期特性。在配置时,没有被说明的程序也可以运行,但其优先级最低。
使用配置(CONFIGURATION)将PLC系统的所有资源集合起来。
CONFIGURATION 变量名
全局变量说明
RESOURCE说明
ACCESS说明
END_CONFIGURATION
IEC61131-3中定义了典型的PLC函数和功能块,它们的名字作为关键字保留。
注意: 编程软件不一定能提供IEC61131-3全部标准函数。
IEC61131-3定义了以下8组标准函数:
重载(Overload)
若函数的输入变量以类数据类型描述,则称为重载。使用重载函数时,编程系统会自动选择合适的类型化函数。
可以把一个重载的标准函数限制为某一数据类型,称为类型化(Typed)的标准函数,这时需要把一个下划线及相应数据类型附加到该函数名字后。
可扩展(Extensible)
若函数的输入变量数可变,则称其为可扩展的。
功能块是一种重要的POU,它按一定的算法和动作组成一段程序,在某一个给定条件下产生新的输出数据,类似子程序。
功能块有输入变量、输出变量、内部变量以及临时变量等。功能块的程序段由各种算法、动作和传递等组成。当功能块执行时,它会组合属于它的变量和程序来产生新的输出数据和内部数据。
功能块和函数之间最大的区别就是它有储存功能,因而被应用于需要有数据保持功能的地方。
使用功能块时需要将其实例化,简单来讲就是给使用的功能块取专用名,编程系统会自动生成内部绝对编号。
IEC61131-3定义了5组标准功能块:双稳态元素(置复位)、边沿检测、计数器、定时器和通信。
此处仅列举梯形图(LD)和结构化文本(ST)。
梯形图适合在以开关量为主的简单的顺序逻辑控制系统中使用,在复杂的具有数值计算的过程控制系统或逻辑判断系统中,显得不够方便和灵活。
梯形图编程语言是从继电器控制系统原理图的基础上演变而来的,其基本思想是一致的,只是在使用符号和表达方式上有一定区别。
梯形图的一个关键概念是能流(能流在梯形图中实际上不存在,引入此概念是为了和继电接触器控制系统相比较)。在梯形图中,把左边的母线假想为电源相线,右边的母线假想为电源零线。如果有能流从左至右流向线圈,则线圈通电;如没有能流,则线圈不通电。能流在任何时候都不会通过触点自右向左流。
IEC61131-3为用户提供了线条连接、触点、线圈、执行控制等常用的基本元素,线条连接元素包括水平连接和垂直连接等。不建议在LD中使用执行控制类的指令。
结构化文本编程语言ST是一种文本化的高级编程语言,源自PASCAL,适合数值计算、循环和选择等复杂应用的场合。
ST中最基本的元素是表达式,表达式由操作数和操作符组成。操作数为直接量或变量。操作符的优先级决定一个表达式中的计算顺序。
一个ST程序由一定数量的语句组成,语句间用分号(;)隔开,注释需放在两个星号(**)之间。
a := 1;
IF<条件1>
THEN<语句块1>
[ELSIF<语句块2>] (*可省*)
[ELSE<语句块3>] (*可省*)
END_IF;
举例:
IF A = 1 THEN
B := 1;
ELSIF A = 2 THEN
B := 2;
ELSE
B:=0;
END_IF;
IF语句可进行嵌套,ELSE部分可进行判断的嵌套,即使用ELSIF…THEN…ELSE语句。
CASE <整数表达式> OF
<整数选择值>:<语句块1>
<整数选择值>:<语句块2>
...
ELSE
<备选语句块>
END_CASE;
常被当做CASE状态机。
整数选择值除了可以是一个数,也可以是一组数(2,3,4:)或一个数值范围内的数(5…10:),或者参数化的变量。
FOR <索引变量>:=<起始值> TO <结束值> [BY<增量值>] DO
<语句块>;
END_FOR;
省略BY时,默认增量值为1.
RETURN语句
用于中止当前的POU的执行。
EXIT语句
使程序跳出当前迭代语句的循环。
嵌套循环时,可使用EXIT语句跳出内部循环,执行外部循环。
函数只有一个返回值,其调用属于表达式的范畴;FB的调用属于语句的范畴,因为FB可能有多个输出值,所以在一个表达式中不允许调用FB。
由于一个形式参数包括每个参数的名称和实际值,因此形式参数的顺序是任意的。 如果不写参数
允许在调用时使用“=>”,直接把输出值赋给指定变量。
2022.1.2 补充与改写。