PLC上用的最多的一个是梯形图,它使用起来直观方便,入门容易,非开发人员也可以很快入手,但是处理复杂的逻辑太麻烦;另外一种就是 ST(structed text, 结构化文本)语言,它写起来跟高级语言类似,学过高级语言的开发人员可以很快入手。这两种语言都是IEC 61131-3 中定义的,这个标准中还定义了其他三种语言:顺序功能图、功能块图、指令表。这里主要对ST语言的基本语法进行一些总结,主要基于codesys类的环境测试。
变量类型
基本类型
类型 | 关键字 | 位数 |
---|---|---|
位 | BIT | 1 |
布尔型 | BOOL | 1 |
字节型 | BYTE | 8 |
字型 | WORD | 16 |
双字型 | DWORD | 32 |
长字型 | LWORD | 64 |
短整型 | SINT | 8 |
无符号短整型 | USINT | 8 |
整型 | INT | 16 |
无符号整型 | UINT | 16 |
双整型 | DINT | 32 |
无符号双整型 | UDINT | 32 |
长整型 | LINT | 64 |
实数 | REAL | 32 |
长实数 | LREAL | 64 |
字符串类型 | STRING | 8的倍数,不超过256乘8,默认81乘8 |
时间戳 | TIME | 32 |
时间 | TIME_OF_DAY | 32 |
日期 | DATE | 32 |
日期时间 | DATE_AND_TIME | 32 |
NOTE: 整形、字节型、字型都可以通过.号引出具体bit的值,e.g. i: INT;
,那么 i
的第三位可以使用 i.3
引出,它的类型为BIT
,可以转化为 BOOL
型。
复合类型
- 数组
- 关键字:ARRAY
- 定义格式:ARRAY[开始索引…结束索引] OF 元素类型;其中包含开始和结束索引值
- e.g.
aiStatus: ARRAY[1..100] OF INT;
- 结构体
- 关键字:STRUCT
- 定义格式:
TYPE 类型名称: STRUCT 变量名称:变量类型; ... END_STRUCT END_TYPE
- 联合体
- 关键字:UNION
- 定义格式:
TYPE 类型名称: UNION 变量名称:变量类型; ... END_UNION END_TYPE
- 枚举
- 关键字:()
- 定义格式:
TYPE 类型名称: (变量名称; ...) 基本类型 END_TYPE
变量定义
- 变量名称: 变量类型;
e.g.bEnable: BOOL;
控制语句
- 条件语句
- 关键字:IF, ELSIF, ELSE
- 格式:
IF 条件表达式 THEN ... ELSIF 条件表达式 THEN ... ELSE ... END_IF
- 循环语句
- 关键字:FOR TO DO END_FOR, WHILE END_WHILE, REPEAT UNTIL END_REPEAT
- 格式:
FOR 变量:=初始值 TO 目标值 DO ... END_FOR WHILE 条件表达式 DO ; END_WHILE REPEAT ... UNTIL 条件表达式 END_REPEAT
- CASE语句
- 关键字:CASE OF
- 格式:
CASE 变量名称 OF 变量值1: ... 变量值2: ... ... ELSE ... END_CASE
- 跳转语句
- EXIT
跳出当前循环,相当于C的 break - CONTINUE
跳出循环的当次执行,与C的continue类似 - RETURN
返回,后面程序不再执行,与C的return有一定区别,ST的函数返回值不用RETURN返回,直接函数名接受值 - JMP
跳转到指定标签位置,相当与C的goto
- EXIT
POU
POU(Programming Organisation Unit) 是IEC 61131-3 标准中最重要的基本编程单元,它包含如下三种类型
- 功能块
功能块实现了数据和操作的封装,类似与C++中的类,但调用起来又有很多不同之处,功能块中定义的变量如果没有特别声明为TEMP临时变量,那么都为静态变量 - 函数
函数对操作进行了封装,与C++中的函数概念类似,函数中定义的变量如果没有特别声明为STAT静态变量,那么都是临时变量 - 程序
程序就是一段顺序执行的代码,当然里面可以调用其他程序,使用函数、功能块