SCL 与 PLC 编程
大多数 PLC 程序员使用 LAD 或 FBD 等图形化语言。然而,第四次工业革命为自动化工程师带来了新的挑战。如今许多应用要求计算和数据处理发生在工业设备栈的最底层,也就是直接在 PLC 中完成。
要构建更高级的应用,你需要掌握一门高级文本语言,对西门子控制器而言,这门语言就是 SCL(结构化控制语言)。
如果需要把梯形图程序转化为SLC,可以使用 LAD2SCL 插件。
1、PLC 的编程语言
IEC 61131-3 是工业自动化编程的国际标准,由国际电工委员会(IEC)制定,为工业自动化系统中的编程语言、开发环境和用户界面定义规范。该标准通过建立编程和通信的通用规则,确保不同自动化系统之间的互操作性,使构建和集成不同系统成为一个连贯的整体变得容易。IEC 61131-3 在全球自动化行业中被广泛使用。你可以在 IEC 61131-3 页面阅读官方范围说明。
IEC 61131-3 为工业自动化系统定义了五种编程语言:
- LD(梯形图):用梯形图构建程序。在电工中很流行,以简单直观著称。
- FBD(功能块图):用功能块构建程序。面向电气和电子工程师。
- SFC(顺序功能图):用顺序图构建程序。面向过程和自动化工程师。
- ST(结构化文本):用结构化文本语言构建程序。面向程序员和软件工程师。
- IL(指令表):用指令列表构建程序。面向电工和电子工程师。
所有这些语言都符合 IEC 61131-3,可用于工业应用中的 PLC 编程。每种语言各有优劣,正确选择取决于程序员的个人需求和偏好。
2、SCL 与 IEC 61131-3 标准
西门子 PLC 编程语言符合 IEC 61131-3,SCL 也不例外。SCL 是西门子对 ST(结构化文本)语言的等价实现。
2.1 SCL 语法
SCL 语法基于过程式语言的结构,如循环和条件语句,这使得编写高效精确的控制算法成为可能。SCL 还支持布尔逻辑,允许对逻辑值(真/假)执行运算,并使用比较运算符(例如大于、小于)比较值。
2.2 SCL 中的布尔运算
SCL 提供布尔指令,允许对布尔值(即 TRUE 或 FALSE)执行逻辑运算。
SCL 中布尔指令的示例:
- AND:AND 指令检查两个布尔值是否同时为真。如果两者都为真,则返回 TRUE,否则返回 FALSE。例如,"A AND B" 在 A 和 B 都为真时返回 TRUE。
// Check whether both A and B are true
IF (A AND B) THEN
// Execute these statements if A and B are true
...
ELSE
// Execute other statements if A or B is false
...
END_IF
- OR:OR 指令检查是否至少有一个布尔值为真。如果至少一个为真,则返回 TRUE,否则返回 FALSE。例如,"A OR B" 在 A 为真、B 为真或两者都为真时返回 TRUE。
// Check whether at least one of A or B is true
IF (A OR B) THEN
// Execute these statements if at least one of A or B is true
...
ELSE
// Execute other statements if both A and B are false
...
END_IF
- NOT:NOT 指令对布尔值取反。如果值为真,则返回 FALSE,否则返回 TRUE。例如,"NOT A" 在 A 为 FALSE 时返回 TRUE,在 A 为 TRUE 时返回 FALSE。
// Negate the value of variable A
A := NOT A;
如果你想通过动手示例深入了解这些运算符,请参阅 SCL 中的布尔运算,第 1 部分。
2.3 IF...ELSE 条件语句
SCL 中的 IF-ELSE 条件语句允许根据条件是否满足来运行特定指令。它包含三部分:IF 语句中的条件、条件满足时执行的 THEN 分支中的指令段,以及条件不满足时执行的 ELSE 分支中的指令段。它还可以包含额外的 ELSIF 子句,在第一个条件不满足时检查另一个条件。下面的示例说明了 SCL 中 IF-ELSE 条件语句的用法:
// Check whether variable A is greater than B
IF (A > B) THEN
// If so, execute these statements
...
// Otherwise check whether A equals B
ELSIF (A = B) THEN
// If so, execute other statements
...
// Otherwise execute the statements in the ELSE branch
ELSE
...
END_IF
IF-ELSE 条件语句对于在 PLC 中实现各种算法很有用,它使程序能够对控制过程中不断变化的条件做出动态反应。另请参阅 SCL 中的 IF...THEN 指令,第 2 部分。
2.4 比较运算符
SCL 中的比较运算符允许你检查变量或表达式值之间的关系。它们将结果作为 BOOL 值返回,即 TRUE 或 FALSE。
这些运算符包括:
=等于:检查两个值是否相等<>不等于:检查两个值是否不同<小于:检查左值是否小于右值>大于:检查左值是否大于右值<=小于等于:检查左值是否小于或等于右值>=大于等于:检查左值是否大于或等于右值
比较运算符通常在 IF-ELSE 条件语句中使用,以检查给定条件是否满足。下面的示例说明了 SCL 中比较运算符的用法:
// Check whether variable A is greater than B
IF (A > B) THEN
// If so, execute these statements
...
ELSE
// Otherwise execute other statements
...
END_IF
3、使用数字液位传感器的水罐液位控制程序
下面的 SCL 程序使用数字低液位和高液位传感器以及启停泵来控制水罐中的液位。它使用布尔 NOT 指令和 IF-ELSE 条件语句。
// Check whether the liquid level is below the low level
IF (NOT xLevelLow) THEN
// If so, turn the pump on
xPump := TRUE;
// Otherwise check whether the liquid level is above the high level
ELSIF (xLevelHigh) THEN
// If so, turn the pump off
xPump := FALSE;
END_IF
滞后控制意味着泵只在液位降至低液位以下时才开启,只在液位升至高液位以上时才关闭。这避免了液位接近阈值时泵频繁启停的情况,从而防止不必要的能源消耗和磨损。低液位和高液位值可以根据具体应用进行调整,以获得液位控制系统的最佳行为。
4、使用模拟液位传感器的水罐液位控制程序
下面的 SCL 程序使用模拟液位传感器和启停泵来控制水罐中的液位。它使用 IF-ELSE 条件语句和比较运算符来检查当前液位,并在合适的时机开启或关闭泵。
// Store the low and high setpoints in variables
rSetpointLow_mm := 500.0;
rSetpointHigh_mm := 1000.0;
// Check whether the current level is below the low setpoint
IF (rLevel_mm < rSetpointLow_mm) THEN
// If so, turn the pump on
xPump := TRUE;
// Otherwise check whether the current level is above the high setpoint
ELSIF (rLevel_mm > rSetpointHigh_mm) THEN
// If so, turn the pump off
xPump := FALSE;
END_IF
该程序通过启停泵,将水罐液位保持在低、高阈值之间的理想范围内。你可以根据具体需求自由修改和调整它,例如更改液位设定值或添加额外指令以实现更高级的控制行为。
5、总结:SCL 适合什么场景?
SCL 拥有丰富的数学运算符,支持加、减、乘、除等基本算术运算,也支持更高级的计算,如平方根、幂和对数。
SCL 语法让你能够以极其紧凑的方式编程实现处理数据的函数和功能块。同样的程序用图形化语言编写,在代码编辑器中会占据大得多的空间。
下面的 SCL 代码实现了一个函数,用于计算形如 ax^2 + bx + c = 0 的二次方程的根。该函数接受三个参数——系数 a、b 和 c,并返回两个值,即方程的根。如果没有实数解,函数返回 NaN(非数字)。
FUNCTION fcQuadraticRoots(REAL a, REAL b, REAL c, REAL rRoot1, REAL rRoot2)
VAR
// Variables holding the roots of the equation
rRoot1, rRoot2 : REAL;
BEGIN
// Calculate the discriminant
rDelta := b * b - 4 * a * c;
// If the discriminant is greater than or equal to 0, calculate the roots
IF (rDelta >= 0) THEN
// Calculate the first root
rRoot1 := (-b + SQRT(rDelta)) / (2 * a);
// Calculate the second root
rRoot2 := (-b - SQRT(rDelta)) / (2 * a);
ELSE
// If the discriminant is less than 0, there is no real solution
rRoot1 := NaN;
rRoot2 := NaN;
END_IF
END_FUNCTION
原文链接: The SCL Text Language and PLC Programming
汇智网翻译整理,转载请标明出处