本文重点讲解三类决定程序运行逻辑的核心语句:
选择语句:依据条件与数值判定,选定对应执行分支,包含IF...THEN...END_IF; CASE...OF...END_CASE语句;
循环语句:批量处理数据、简化重复程序,涵盖FOR、WHILE、REPEAT;
跳转语句:灵活调整程序执行流向,优化代码结构,常用EXIT、RETURN、CONTINUE、GOTO。
正式讲解前,先说明 SCL 标识符规范:
标识符由字母、数字、下划线构成,首字符仅限字母或下划线,编写时不区分大小写。标识符严禁使用系统关键字,例如 AND、BEGIN、BOOL、CASE 等,误用关键字会直接引发编译报错,编程过程中务必留意。
选择语句依靠条件判断结果分流程序走向,是编写逻辑控制程序必不可少的核心语句。
1.1 IF...THEN...END_IF 语句
语法结构:
IF <条件1> THEN
<语句组1>;
ELSIF <条件2> THEN
<语句组2>;
ELSIF <条件3> THEN
<语句组3>;
ELSE
<默认语句组>;
END_IF;
语法说明:
1、IF、ELSIF 后填写的判断条件,必须为布尔型(BOOL)表达式。
2、ELSIF 分支可按需增设多个,也可省略;ELSE 分支同样可省略不写。
3、程序自上而下逐级判定,仅执行首个条件成立的分支,其余分支直接跳过不再执行。
4、IF 判断语句书写完毕后,必须以 END_IF; 结束。
1.2 CASE...OF...END_CASE 语句
CASE 语句可依据整型或枚举类型表达式的数值,匹配对应分支执行程序,相比多层 ELSIF 嵌套,代码逻辑更简洁直观,可读性更强。
语法结构:
CASE <整数表达式> OF
<值1>:
<语句组1>;
<值2>, <值3>: // 多个值共享同一分支
<语句组2>;
<值4>..<值6>: // 连续值范围
<语句组3>;
ELSE
<默认语句组>;
END_CASE;
语法说明:1、CASE 后匹配表达式,仅支持整型(INT、DINT、SINT、USINT、UINT、UDINT)与枚举类型; 2、分支匹配值可设置单值、多值或数值区间,写法灵活;
3、语句编写完成必须以 END_CASE; 收尾。
1.3应用示例:
用SCL语言编写一个主程序,实现对一台电动机的简单启停控制。本例采用软件截图方式进行示例:
循环语句可实现代码段重复运行,SCL 内置三种常用循环结构:
FOR 循环:适用于循环次数确定的场景
WHILE 循环:先判定条件,满足后再执行程序
REPEAT 循环:先执行一次程序,再进行条件判断
2.1 FOR 语句
FOR 循环是计数循环,适合已知循环次数的场景,例如遍历数组。
2.1.1 语法结构
FOR <循环变量> := <初值> TO <终值> [BY <步长>] DO
<循环体语句>;
END_FOR;
语法说明:
<循环变量>仅限整型数据(INT、DINT 等),禁止使用浮点型 REAL;
初始值、终止值、步长均为整型表达式,步长 BY 可正可负,默认步长为 1;
循环启动时一次性确定初值与终值,运行中修改终值不会生效;
正向递增循环:循环变量大于终值则退出;反向递减循环:循环变量小于终值则退出;
每完成一轮循环体执行,循环变量自动按照设定步长完成自增或自减。
2.1.2 示例代码
// 正向遍历数组(步长默认+1)
FOR i := 0 TO 9 DO
DataArray := 0; // 将数组前10个元素清零
END_FOR;
// 反向遍历(步长-1)
FOR i := 9 TO 0 BY -1 DO
IF DataArray > 0 THEN
LastNonZeroIdx := i;
EXIT;
END_IF;
END_FOR;
WHILE 循环属于前置判断型循环:先校验布尔条件,结果为 TRUE 时才执行循环体;若初始条件不成立,循环直接跳过,一次都不会运行。
2.2.1 语法结构
WHILE <bool条件> DO
<循环体语句>;
END_WHILE;
语法说明:
每次执行循环体前都会重新判定条件,条件为FALSE即刻退出循环;
若判定条件恒为真,会造成死循环,编写代码务必设置合理终止条件;
适用于循环次数未知、仅明确结束条件的应用场景。
2.2.2 示例代码
// 示例:查找数组中第一个大于阈值的位置
idx := 0;
WHILE idx < ArraySize AND DataArray[idx] <= Threshold DO
idx := idx + 1;
END_WHILE;
IF idx < ArraySize THEN
FoundIndex := idx;
Found := TRUE;
ELSE
Found := FALSE;
END_IF;
2.3 REPEAT...UNTIL...END_REPEAT 语句
REPEAT 是后置条件循环:先执行循环体,再判断退出条件,因此循环体至少执行一次。
2.3.1 语法结构
REPEAT
<循环体语句>;
UNTIL <退出条件>; (* 条件为 TRUE 时退出 *)
END_REPEAT;
语法说明:
当UNTIL后条件结果为 TRUE 时,即刻终止循环(逻辑与 WHILE 恰好相反:WHILE 条件成立持续执行,REPEAT 条件成立直接退出)
循环体至少执行一次,适合"至少要做一次,再根据条件判断是否继续"的场景。
2.3.2 示例代码
Sum := 0;
Counter := 1;
REPEAT
Sum := Sum + Counter;
Counter := Counter + 1;
UNTIL Sum >= TargetSum;
END_REPEAT;
跳转语句可打破程序顺序执行逻辑,灵活调整运行流向。SCL 常用四类跳转指令:EXIT、CONTINUE、RETURN、GOTO。
3.1 EXIT 语句
EXIT 用于立即退出当前最内层循环(FOR/WHILE/REPEAT),跳至该循环 END_FOR/END_WHILE/END_REPEAT 之后的下一条语句继续执行。
示例
// 在数组中搜索目标值,找到后立即退出循环
Found := FALSE;
FOR i := 0 TO ArraySize - 1 DO
IF DataArray = SearchValue THEN
FoundIndex := i;
Found := TRUE;
EXIT;
END_IF;
END_FOR;
3.2 CONTINUE 语句
CONTINUE 用于跳过本次循环迭代中剩余的语句,直接进入下一次循环;
示例
// 对数组求和,跳过负数元素
PositiveSum := 0;
FOR i := 0 TO ArraySize - 1 DO
IF DataArray < 0 THEN
CONTINUE;
END_IF;
PositiveSum := PositiveSum + DataArray;
END_FOR;
3.3 RETURN 语句
RETURN 用于从当前函数(FC)或功能块(FB)中提前跳出。
3.4 GOTO 语句
GOTO 语句可让程序无条件跳转至同程序块内由 LABEL 定义的标签位置,它是 SCL 最基础的跳转指令,使用灵活但极易打乱代码逻辑,存在较高使用风险。
语法
GOTO <标签名>;
<标签名>:
<目标语句>;
示例
IF A>B THEN
GOTO LAB1; //当A>B 跳转到LAB1
ELSIF A>C THEN
GOTO LAB2;
本文系统介绍了 S7-SCL 三大类控制语句,要点归纳如下:
文章来源于:高工电气原文链接:https://mp.weixin.qq.com/s/jK_dht7j7rrtrHNdJI2qJA