摘要:信息技术和传统制造技术深度融合,给生产制造的智能化铺好了路。在工控领域,具体表现就是像(Structured text 西门子 SCL)ST 结构化文本这种高级编程语言,在编程设计里被广泛运用。它的好处在于能把复杂的算法方程变简单,能做梯形图做不了的复杂计算,
信息技术和传统制造技术深度融合,给生产制造的智能化铺好了路。在工控领域,具体表现就是像(Structured text 西门子 SCL)ST 结构化文本这种高级编程语言,在编程设计里被广泛运用。它的好处在于能把复杂的算法方程变简单,能做梯形图做不了的复杂计算,还能把算法方程式给建立起来。就因为它对复杂算法适应能力强,移植通用性又高,ST 在工业控制里用得越来越多,会 ST 结构化文本设计已经是电气工程师必须要会的了。不过对于那些没接触过高级语言的传统电气从业人员来说,搞 ST 编程还是有一定难度的。所以,本文基于 CoDeSys 提出了一种基于梯形图编程思维快速实现 ST 编程的设计办法。
一,ST语言语法基础:
CODESYS(Controller Development System)是一个集成开发环境,是一种广泛应用于工业自动化领域的编程软件。支持 IEC 61131-3 标准的多种编程语言,如结构化文本(ST)、梯形图(LD)、指令列表(IL)等。它的强大功能和灵活性使其成为许多 PLC(可编程逻辑控制器)工程师的首选工具。本文将主要聚焦于 CODESYS 中的结构化文本(ST)语言,介绍其基本语法和运算符。
1,语法介绍
1.1,赋值语法
在 CODESYS 中,赋值操作是将一个值赋给一个变量。赋值语句使用 := 运算符。以下是一个简单的赋值语句示例:
VAR
iValue1 : INT; // 定义一个整数变量
iValue2 : INT; // 定义另一个整数变量
END_VAR
iValue1 := 10; // 将值 10 赋给变量 iValue1
iValue2 := iValue1; // 将 iValue1 的值赋给 iValue2
1.2,选择语法
选择语句用于根据不同条件执行不同的代码。最常用的选择语句是 IF 语句和 CASE 语句。
IF 语句
IF 语句用于在条件为真时执行特定代码块。
IF iValue1 > 5 THEN
iValue2 := iValue1 * 2;
ELSE
iValue2 := iValue1 / 2;
END_IF
CASE 语句
CASE 语句用于根据变量的不同值执行不同的代码块。
CASE iValue1 OF
1: iValue2 := 10;
2: iValue2 := 20;
3: iValue2 := 30;
ELSE
iValue2 := 0;
END_CASE
1.3,循环语法
循环语句用于重复执行代码块。CODESYS 支持 FOR 循环和 WHILE 循环。
FOR 循环
FOR 循环用于在已知次数内重复执行代码。
FOR i := 1 TO 10 DO
iValue2 := iValue2 + i;
END_FOR
WHILE 循环
WHILE 循环用于在条件为真时重复执行代码。
WHILE iValue1
iValue1 := iValue1 + 5;
END_WHILE
1.4,其他语法
REPEAT 循环
REPEAT 循环类似于 WHILE 循环,但它会先执行一次代码块,然后再检查条件。
REPEAT
iValue1 := iValue1 - 1;
UNTIL iValue1 = 0
END_REPEAT
EXIT 语句
EXIT 语句用于提前退出循环。
FOR i := 1 TO 10 DO
IF i = 5 THEN
EXIT;
END_IF
iValue2 := iValue2 + i;
END_FOR
2,运算符介绍
CODESYS 中的运算符分为算术运算符、比较运算符、逻辑运算符和位运算符。
2.1,算术运算符
算术运算符用于数学计算。
+:加法-:减法*:乘法/:除法MOD:取模
iValue1 := 10 + 5; // iValue1 为 15
iValue2 := 10 - 5; // iValue2 为 5
iValue1 := 10 * 2; // iValue1 为 20
iValue2 := 10 / 2; // iValue2 为 5
iValue1 := 10 MOD 3; // iValue1 为 1
2.2,比较运算符
比较运算符用于比较两个值。
=:等于:不等于>:大于=:大于等于
IF iValue1 = 10 THEN
iValue2 := 1;
END_IF
IF iValue1 5 THEN
iValue2 := 2;
END_IF
2.3,逻辑运算符
逻辑运算符用于逻辑操作。
AND:逻辑与OR:逻辑或NOT:逻辑非
IF (iValue1 > 5) AND (iValue2
iValue1 := iValue1 + 1;
END_IF
IF (iValue1 > 5) OR (iValue2
iValue2 := iValue2 + 1;
END_IF
IF NOT (iValue1 = 10) THEN
iValue1 := 10;
END_IF
2.4,位运算符
位运算符用于位级操作。
&:按位与|:按位或^:按位异或NOT:按位非
iValue1 := 5; // 二进制 0101
iValue2 := 3; // 二进制 0011
iValue3 := iValue1 & iValue2; // 结果为 1 (二进制 0001)
iValue4 := iValue1 | iValue2; // 结果为 7 (二进制 0111)
iValue5 := iValue1 ^ iValue2; // 结果为 6 (二进制 0110)
iValue6 := NOT iValue1; // 结果为 -6 (二进制 1010)
下面这张图展示的是电机的启动、保持、停止梯形图控制程序,这里面有启动、停止、自锁这三个触点,还有一个输出线圈。它们全都是开关型的变量,也就是只有开和关这两种状态。在高级语言里,这种数据类型被叫做 BOOL 型,其实就是二进制的开关变量,闭合的时候是 1(TRUE),断开的时候是 0(FALSE)。像下面这个梯形图的本质,可以大概理解成“触点+触点×触点=线圈”,也就是(M0 + Y0)×M1 = Y0 。
图1.1 启保停控制梯形图
在 ST 这类高级语言里,M0 和 Y0 的逻辑关系是“或”,也就是 OR,M0 和 M1 的逻辑关系是“与非”,这里的 NOT 意思是逻辑关系“非”,也就是取反。上面说的那个梯形图算式能写成(M0 OR Y0)AND NOT M1 = Y0,不过在 ST 语言中,“=”表示的是比较两个数值,赋值用的是“:=”,而且高级语言是从右往左进行赋值的。所以,像上面这个梯形图程序转变成 ST 的标准表达式是:
图1.2 启保停ST程序
同理电机正反转控制程序亦可实现如下转换:
图1.3 启保停ST程序
图1.4 启保停ST程序
通过参考像上面提到的启动、保持、停止以及电机正反转控制程序的转换例子,已经能够实现基本逻辑控制梯形图程序向 ST 的转换,也就是线圈 := 触点这样的逻辑关系表达式。接下来呢,会逐步对 ST 的一些应用基础知识展开分析。
三、数据类型介绍下面这张图展示的是 ST 语言编程里最常用的数据类型,有开关型变量 BOOL 型,整数 INT 型,小数浮点型 REAL ,另外还有基于上面这些类型的数据类型,像 UINT、LREAL 等等。对于刚开始学的人,建议从简单到复杂,先重点留意 BOOL、INT、REAL 这三种数据类型。BOOL 型是用来表示二进制的,像启动、停止、开关这类变量。整型通常用在当作步和命名上,小数一般用于映射速度、转矩、位置这些物理量,具体情况就像下面小车控制的例子展示的那样。
图2.1三种常用数据类型
图2.2运料小车工作示意
就像图里说的,小车的控制动作是这样的:启动系统后,小车在 A 点装料,装完料去 B 点卸一半的料,接着去 C 点卸料,卸完料再返回 A 点,就这样一直循环。小车的控制系统要考虑的控制 IO 有输入的:启动、停止、A 位置、B 位置、C 位置,输出的有小车前进、小车后退。从工作要求来分析,这个控制对象适合用顺序控制编程的方法,也就是步进。在 ST 语言里,步进是通过 CASE 功能语句来实现的。CASE 的用法是 CASE 运行步变量(INT) OF A 步(INT): ………;B 步…….;当运行步是 A 步的时候,就执行 A 步,同样的道理,也适用于其他条件,下面的程序实例里有。
IF…THEN…END_IF 是最常用的逻辑判断语句,它的意思是当某个条件成立了,就会得到某个结果。这里要特别说明一下,IF 是条件成立了才执行,条件不成立的话不会影响已经生成的结果,这和梯形图里的开关逻辑不一样。比如说在梯形图里,启动按钮闭合(是 TRUE),线圈就有电,启动按钮断开(是 FALSE),线圈就没电。但是在 IF 条件里(IF 启动 THEN 线圈 END_IF),只有启动是 TRUE 的时候,才会让线圈变成 TRUE,启动是 FALSE 的时候,线圈的状态不会有任何变化。具体可以参考下面图 2.3 里展示的小车运行最简系统:
图2.3运料小车ST控制程序
接下来重点给您介绍一些常用的运算符。最常见的逻辑运算符有“与 AND、或 OR、非 NOT”。然后还有一些常用的算术运算符,像“+、-、*、/、=”。这里要特别留意的是,在 C 语言里,赋值用的是“=”,但在 ST 语言里,“=”的意思是用来比较两个变量的大小,ST 语言里赋值用的是“:=”。弄清楚了上面这些运算符,编写简单的 ST 逻辑程序就不是什么难事了,从简单的开始,慢慢深入研究。像图 3.1 展示的就是常用的运算符以及它们的优先级:
图3.1常用运算符及其优先级
在这一节,会用上前面讲的基本语法来实现运动控制系统。下面通过图示,功能块是运动控制里伺服轴使能和点动的功能集合,能够用 ST 语句来控制它的外部输入,从而实现对伺服电机的正反转控制。下面这个实例表明,学习 ST 入门的时候,只要掌握了一些基础规则,就能实现简单逻辑和运动控制系统程序的设计,然后从简单到复杂,很快就能学会新的编程方法。
图4.1伺服电机点动控制实现
这篇文章简单总结了一些学习 ST 的小经验,讲了梯形图编程和 ST 语言编程的相同地方。上面这些知识点也是我自己在学习 ST 的过程中碰到的问题。刚开始入门的时候,掌握基础的通用知识就行,然后不断地使用和实践,就能起到不断加深理解的效果。所以我建议 ST 的初学者可以参考上面说的这些,抓住通用的知识点,举一反三,从简单到复杂,慢慢地深入学习,自然而然就能学好。对国产 CoDeSys 运动控制系统感兴趣的朋友欢迎留言。
来源:PLC技术玩