IEC 61131-3编程语言
IEC 61131-3编程语言标准是第一个为工业控制系统提供标准化语言的国际标准。
没有编程语言标准便没有今天PLC走向开放式系统的坚实基础。
IEC 61131-3标准编程语言分为公用元素和编程语言两部分。
公用元素部分:说明各种编程语言中使用的字符集、标识符、关键字等,定义数据的外部表示、数据类型、变量和程序组织单元等,并对顺序功能表图的基本元素等进行了定义。
编程语言部分:定义了两大类编程语言:文本化编程语言和图形化编程语言。
文本化编程语言:包括指令表编程语言(Instruction List,IL)和结构化文本编程语言(Structured Text,ST)
图形化编程语言:包括梯形图编程语言(Ladder Diagram,LD)和功能块编程语言(Function Block Diagram,FBD)
顺序功能表图(Sequence Function Chart,SFC)作为公用元素定义。
IEC 61131-3标准编程语言严格定义了有关变量的数据类型,一防止发生因对变量定义了不同数据类型而造成的错误。
IEC 61131-3标准不仅是工控编程语言的规范,也是编程系统的实现架构的参考标准。标准编程语言来自工控软件和软逻辑PLC软件,编程语言中大量语言的表达方式与常用计算机编程语言的表达方式类似。
公用元素和程序组织单元
IEC 61131-3软件模型分为输入输出界面、通信界面和系统界面3部分。
配置是语言元素,相当于IEC 61131-3标准所定义的可编程控制系统。位于软件模型的最上层,是最大的语言元素。等效于一个PLC所需的软件。
可将配置认为是一个特定类型的控制系统,包括硬件装置、处理装置、I/O通道的存储地址和系统能力,即等同于一个PLC应用程序。
配置用关键字CONFIGURATION开始,随后是配置名称和配置声明,最后用END_CONFIGURATION结束。配置声明包括定义改配置的有关类型和全局变量的声明、在配置内资源的声明、存取路径变量的声明和配置变量声明等。
一个配置的示例:
CONFIGURATION CELL_1 (*CELL_1是配置名称*)
VAR_GLOBAL w:UNIT;END_VAR (*w是在配置CELL_1内的全局变量名*)
RESOURCE STATION_1 ON PROCESSOR_TYPE_1(*STATION_1是资源名,该资源类型名为PROCESSOR_TYPE_1*)
VAR_GLOBAL z1:BYTE;END_VAR(*z1是资源STATION_1内的全局变量名,数据类型是字节*)
TASK SLOW_1(INTERVAL: = t#20ms, PRIORITY : =2);(*SLOW_1是任务名*)
TASK FAST_1(INTERVAL: = t#10ms, PRIORITY : =1);(*FAST_1是任务名*)
PROGRAM P1 WITH SLOW_1: (*P1是程序名,它与SLOW_1任务结合*)
F(x1: = %IX1.1);
PROGRAM P2 :G(OUT1 = > w, (*P2是程序名,G程序实例名*)
FB1 WITH SLOW_1, (*FB1是功能块实例名,它与SLOW_1任务结合*)
FB2 WITH FAST_1); (*FB2是功能块实例名,它与FAST_1任务结合*)
END_RESOURCE
RESOURCE STATION_2 ON PROCESSOR_TYPE_2 (*STATION_2是资源名*)
VAR_GLOBAL z2:BOOL;(*两个全局变量,一个变量名是z2,其数据类型是布尔量*)
AT %QW5:INT;(*地址QW5的变量是STATION_2内直接表示的全局变量,直接表示变量,数据类型是整数*)
END_VAR
TASK PER_2(INTERVAL:= t#50ms,PRIORITY:=2);(*PER_2是周期执行的任务名*)
TASK INT_2(SINGLE: =z2,PRIORITY: =1);(*INT_2是事件触发的任务名*)
PROGRAM P1 WITH PER_2:
F(x1: = z2,x2: = w);(*使用全局变量实现数据通信*)
PROGRAM P2 WITH INT_2:
H(HOUT1 = > %QW5,
FB1 WITH PER_2);
END_RESOURCE
VAR_ACCESS(*存取路径变量声明*)
(*存取路径变量名*) (*存取路径*) (*数据类型*) (*读写属性*)
ABLE :STATION_1.%IX1.1 :BOOL READ_ONLY;
BAKER :STATION_1.P1.x2 :UINT READ_WRITE;
CHARLIE :STATION_1.z1 :RYTE;
DOG :w :UINT READ_ONLY;
ALPHA :STATION_2.P1.y1 :BYTE READ_ONLY;
BETA :STATION_2.P4.HOUT1 :INT READ_ONLY;
GAMMA :STATION_2.z2 :BOOL READ_WRITE;
S1_COUNT :STATION_1.P1.COUNT :INT ;
THETA :STATION_2.P4.FB2.d1 :BOOL READ_WRITE;
ZETA :STATION_2.P4.FB1.c1 :BOOL READ_ONLY;
OMEGA :STATION_2.P4.FB1.c3 :INT READ_WRITE;
END_VAR
VAR_CONFIG(*配置变量声明*)
STATION_1.P1.COUNT :INT:=1;
STATION_2.P1.COUNT :INT:=100;
STATION_1.P1.TIME1 :TON:=(PT: = t#2.5s);
STATION_2.P1.TIME1 :TON:=(PT: = t#4.5s);
STATION_2.P4.FB1.C2 AT %QB25 :BYTE;
END_VAR
END_CONFIGURATION
STATION_1中的全局变量的数据只能从资源STATION_1中存取,不能从资源STATION_2存取,反之亦然。
如果希望从资源STATION_2也能存取,则必须在配置CELL_1中作为全局变量进行声明,如配置中的全局变量w。
资源
主要功能:提供程序和PLC物理I/O通道之间的界面
用关键字RESOURCE开始,随后是资源名称和ON关键字、资源类型名和资源声明,最后用END_RESOURCE关键字结束。
在资源声明段中,ON关键字用于限定“处理功能”类型、“人机接口”和“传感器执行器接口”功能。上例中的PROCESSOR_TYPE_2限定了资源STATION_2内处理器类型的功能。
任务
主要功能:规定程序组织单元POU在运行期的特性。
一个资源中可以有多个任务。
任务由关键字TASK开始,随后是任务名、任务初始化设置(用圆括号将任务的有关参数分列其中)。
如:TASK SLOW_1(INTERVAL: = t#20ms, PRIORITY : =2);
表示任务名为SLOW_1的任务是周期执行的任务,周期间隔任务时间20ms,优先级为2.
与该任务结合的程序表示为PROGRAM P1 WITH SLOW_1:F(x1: = %IX1.1);
P1是程序实例名,F是程序的接口
任务的3个输入参数:SIGNAL、INTERVAL和PRIORITY属性。
1、SIGNAL:单任务输入端,不为0时,在该时间触发信号的上升沿,触发与任务相结合的程序组织单元执行一次。
2、INTERVAL:周期执行的时间间隔。当其值为0,表示该任务由时间触发执行,如任务INT_2
3、PRIORITY:对任务设置的优先级。0表示最高优先级,优先级越低,数值越高。
无优先调度:任务执行中不会被中断,其他优先级高的需等当前任务执行完再执行。
优先调度:即高优先级任务可中断低优先级任务的执行。
如果与任务结合的程序执行时间大于设置的任务周期执行时间间隔,可编程控制器会发送一个运行期故障报告。
没有任务结合的程序具有最低的优先级。
全局变量
声明格式:
VAR_GLOBAL
全局变量名声明
END_VAR
在哪声明就在哪个范围内可用
在每个使用它的程序组织单元中,需用VAR_EXTERNAL声明该去全局变量
存取路径
用文本表示的结构声明:
WAR_ACCESS
存取路径变量名:外部存取路径:存取路径变量的数据类型和读写属性
END_VAR
两种存取方式:读写和只读,默认只读
在上例中:ABLE :STATION_1.%IX1.1 :BOOL READ_ONLY;
ABLE是存取路径变量名,STATION_1.%IX1.1是外部存取路径,即从外部资源STATION_1的直接表示变量%IX1.1存取数据。存取路径的数据类型是BOOL,存取方式是只读READ_ONLY,可不列。
一个存取路径变量对应一个变量元素,不能是整个数组。
软件模型的特点
IEC61131-3标准允许一个配置内有多个资源,每个资源科支持多个程序。在一台PLC中可以同时装载、启动和执行多个独立程序。而传统的PLC只能同时运行一个程序。
公用元素
字符集:支持小写字母时,变量名或标识符不区分大小写
标识符:由字母、数字、下划线组成,开头不能是数字,结尾不能是下划线。字母不区分大小写,不允许下划线连着写。有的系统只识别前六个有效位,应保证前六字符名唯一。
分界符:很多,查表或看实例,如逗号,冒号
关键字:比如平时用于声明的标识符,类型名,标准函数名等
空格和注释:空格不包含在分界符内,只要不拆散关键字等标识符就可以插入。注释由(*
开始,由*)
结束,不可嵌套。
数据外部表示
数值文字:十进制或其他进制数,如表示十进制255,则二进制2#1111_1111(这里的下划线无意义,仅增加可读性),十六进制16#FF,表达负数是-255,16#-FF
字符串文字:应用场合1)处理批量的标识,如‘Batch number AX08_0321’。2)操作显示的报文,如‘Start to feed’。3)经通信设备发送报到另一个设备,如PARTNER:=‘PLC1’。
表示单字节字符串:STRING#‘YES’ 表示双字节字符串:WSTRING#“YES”
$相当于C语言中的转义符
如'This $"book $" cost $$5'
和"This $'book $' cost $$5"
时间文字
1、持续时间:不区分大小写,T#3D4H5M6S
2、当前时刻:TOD#12:34:56.25,TOD意为TIME_OF_DAY
3、日期:D#2005-05-10,D与DATE、date等效
4、日期和时刻:DT#2008-05-12-14:28:04
数据类型
分为基本数据类型、一般数据类型和衍生数据类型
基本数据类型:即常见的整数INT,布尔BOOL等
一般数据类型:前缀为ANT,在标准函数和功能块的输入输出连接时用到
衍生数据类型:这类数据类型所定义的变量是全局变量,用户根据应用所定义
衍生数据类型有5种,见书上36页表2-14
1、直接衍生数据类型,类似于C语言的define ,将3.1415赋给字母PI
2、枚举数据类型,罗列某变量可取的值
3、子范围数据类型,可用来约束数据范围
4、数组数据,即数组,可多维
5、结构化数据类型,用关键字STRUCT开始,中间是数据罗列,用END_STRUCT结束,将多个不同数据类型的变量放在一起
变量
分为单元素变量和多元素变量
单元素变量
(1)直接变量:用百分数符号%
开始,随后是位置前缀符号和大小前缀符号,如果有分级,则用整数表示分级,用小数点.
分隔的无符号整数直接表示变量,如%IX0.0,%QW0
(2)符号变量:用符号表示的变量,例:VAR_INPUT SW_1 AT %IX1.1:BOOL;END_VAR
用符号变量SW_1 表示从%IX1.1地址读取布尔量,AT是定位前缀关键字
多元素变量
(1)数组数据类型的变量:例AI:ARRAY[1..3,1..8] OF REAL
表示数组变量AI,由3*8个实数数据类型的变量组成。各组成变量是AI[1,1],…,AI[1,8],AI[2,1],…,AI[2,8]等
(2)结构数据类型的变量:
例:
TYPE
AI_Board:
STRUCT
Range : SIGNAL_RANGE;
Min :Analog: = 4;
Max:Analog: = 20;
END_STRUCT
END_TYPE
如果结构变量MODULE_5已经被声明为AI_Board的数据类型,则MODULE_5.Range是SIGNAL_RANGE,根据枚举数据类型,若其值为BIPOLAR_10V,有
MODULE_5.Range:= BIPOLAR_10V;
变量的属性和初始化
例:
TYPE
MODE_LIST:(INIT ,REDAY,RUNNING,STOPPPED);
END_TYPE
VAR_IN_OUT
AUTO: MODE_LIST;
END_VAR
定义了模式列表数据类型,并用输入输出变量定义AUTO是模式列表数据类型,考虑功能模块带输入输出变量AUTO,假设功能模块参数AUTO连接到一个外部变量MODE_LIST。当功能模块执行时,将自动将MODE_LIST的值存放进AUTO变量。
系统热启动:电源掉电后再启动,具有附加属性RETAIN的变量可以恢复到掉电前的值。没有该属性则称为冷启动
标准功能块
1、双稳元素功能块:置位端S(SET),复位端R (RESET),输出有状态记忆性
SR:当S、R同时置一时,优先S,输出Q1置一
RS:当S、R同时置一时,优先R,输出Q1置0
2 、边沿检测功能块:对输入信号的上升沿和下降沿进行检测
R_TRIG:检测输入信号CLK上升沿,从0到1时输出Q保持1一段时间
F_TRIG:检测输入信号CLK下降沿,从1到0时输出Q保持1一段时间
3、计数器功能块:加计数器、减计数器、加减计数器,(上升沿触发脉冲信号用“>”号表示,强调是脉冲?)
加计数器:三输入,两输出,输入CU上升沿触发,复位输入R,计数设定值PV。每次计数脉冲上升沿,加计数器将计数值加1,当计数值CV(可输出)大于或等于设定值PV,计数器输出Q置1。
减计数器:输入CD–上升沿触发,计数设定值–PV,复位LD–将计数器当前计数恢复到预设值PV,每次计数脉冲上升沿,减计数器将计数减1,当计数值CV小于等于0时,输出Q置1。
加减计数器:五输入,三输出。输入CU–加计数脉冲信号,输入CD–减计数脉冲信号,复位R将当前计数值CV置0,复位LD将当前计数值CV置为PV,CU使CV加1,CD使CV减1,CV大于等于PV时,QU置1。CV小于等于0时,QD置1。
4、定时器功能块:用定时器实现接通延迟、断开延迟和定时脉冲(定时器的计时开始时间是输入IN上升沿,但不是脉冲,从功能图上看,IN前没有“>”)
接通延时定时器:输入IN为1时,开始计时,当前计时值ET(可输出)等于输入预设值PT时,输出Q为1。Q为1是IN一定要是1。
断开延时定时器:当输入IN为1时,输出Q立即为1,当IN回到0,定时器开始计时,当前计时值ET(可输出)达到设定值PT时,才将输出Q置0。
定时脉冲定时器:当输入IN变为1时,输出立即为1,同时定时器开始计数,当前计时时间ET等于设定时间PT时,定时器输出Q回0,即输出Q脉冲宽度等于设定时间PT。意思是触发一次输入的上升沿,就输出一个设定宽度的脉冲。
衍生功能块
由标准功能块和函数导出的功能块
下例说明如何在程序中调用已定义的功能块,若有功能块COUNTER,输入为MODE,输出为OUT。在程序中调用:
PROGRAM COUNT1
VAR_INPUT
InputMode:ModeTye;(*ModeTye是在功能块COUNTER中定义的枚举数据*)
END_VAR
VAR_OUTPUT
Max_Count:INT;
END_VAR
VAR
C1:COUNTER;
END_VAR
C1(MODE:=InputMode);
Max_Count:=C1.OUT;
END_PROGRAM
例中C1即为功能块COUNTER的实例
程序
声明格式:
PROGRAM 程序名
程序变量声明
程序本体
END_PROGRAM
函数和功能块用于构成用户子程序,程序用于构成用户主程序。程序的变量类型更丰富。
赋值符“=>”,表示左侧变量值赋值给右边的变量。