『7x24小时有问必答』

本文重点讲解三类决定程序运行逻辑的核心语句:

选择语句:依据条件与数值判定,选定对应执行分支,包含IF...THEN...END_IF; CASE...OF...END_CASE语句;

循环语句:批量处理数据、简化重复程序,涵盖FOR、WHILE、REPEAT;

跳转语句:灵活调整程序执行流向,优化代码结构,常用EXIT、RETURN、CONTINUE、GOTO。

正式讲解前,先说明 SCL 标识符规范:
标识符由字母、数字、下划线构成,首字符仅限字母或下划线,编写时不区分大小写。标识符严禁使用系统关键字,例如 AND、BEGIN、BOOL、CASE 等,误用关键字会直接引发编译报错,编程过程中务必留意。

1   选择语句

选择语句依靠条件判断结果分流程序走向,是编写逻辑控制程序必不可少的核心语句。

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语言编写一个主程序,实现对一台电动机的简单启停控制。本例采用软件截图方式进行示例:

1.3.1新建程序块

1.3.2建立变量表

1.3.3示例程序

2   循环语句
循环语句可实现代码段重复运行,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;

2.2   WHILE 语句

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;

3   跳转语句
跳转语句可打破程序顺序执行逻辑,灵活调整运行流向。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;

4   总结

本文系统介绍了 S7-SCL 三大类控制语句,要点归纳如下:

文章来源于:高工电气

原文链接:https://mp.weixin.qq.com/s/jK_dht7j7rrtrHNdJI2qJA

免费资料领取

资料介绍:S7-1200 1500资料包

扫码添加免费领取资料

</bool条件>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码