在西门子TIA Portal的SCL(结构化控制语言)编程中,WHILE
循环是处理条件迭代任务的核心工具。它根据布尔表达式动态控制循环执行,适用于不确定循环次数的场景。下面从语法、执行流程、注意事项到实际案例全面解析。
一、WHILE
循环基本语法
WHILE <布尔表达式> DO // 循环体:执行的代码块 END_WHILE;
-
布尔表达式:循环条件,结果为
TRUE
时执行循环体,FALSE
时退出。 -
循环体:可包含任意SCL代码(如计算、赋值、函数调用等)。
二、WHILE
循环执行流程
-
检查布尔表达式:
-
若为
TRUE
→ 执行循环体 → 返回步骤1。 -
若为
FALSE
→ 跳过循环体 → 执行后续代码。
-
流程图:
三、关键注意事项
-
避免死循环:
-
必须确保循环体内存在修改条件的逻辑(如计数器递增),否则PLC可能进入死循环导致看门狗超时停机。
-
错误示例:
WHILE TRUE DO // 永远为真 → 死循环!// 无退出条件 END_WHILE;
-
-
循环效率优化:
-
循环体内避免复杂耗时操作(如嵌套多重循环),防止扫描周期过长。
-
-
变量初始化:
-
循环条件依赖的变量需在进入循环前正确初始化(如计数器归零)。
-
四、实战案例
案例1:计算1到100的累加和
VAR Counter : INT := 1; // 初始化计数器 Sum : INT := 0; // 初始化累加和 END_VAR WHILE #counter <= 100 DO //条件:#counter <= 100(即循环执行100次,覆盖数字1~100)#sum := #sum + #counter; // 将当前计数器的值累加到总和中 #counter := #counter + 1; // 计数器自增(确保循环最终退出) END_WHILE; //当 #counter 增至101时,不满足条件 <=100,循环结束。 //最终 #sum = 1 + 2 + ... + 100 = 5050。 // 结果:Sum = 5050
-
首次执行:
#sum = 0 + (1+2+...+100) = 5050
✅ -
第二次执行:
#sum = 5050 + (1+2+...+100) = 10100
❌ -
后续执行:每次增加5050
案例2:寻找数组中的最大值
VAR Values : ARRAY[1..10] OF INT := [5, 9, 3, 17, 2, 8, 11, 4, 6, 13]; MaxValue : INT := Values[1]; // 假设第一个元素为最大值 Index : INT := 2; // 从第二个元素开始比较 END_VAR WHILE #Index <= 10 DO // 遍历索引1~10(或0~9)的元素IF #Values[#Index] > #MaxValue THEN // 检测当前元素是否大于已知最大值#MaxValue := #Values[#Index]; // 发现更大值则更新记录 END_IF;#Index := #Index + 1; // 移动至下一个元素 END_WHILE;// 结果:MaxValue = 17
案例3:超时检测(设备启动超时报警)
VAR StartTimer : TIME := T#0s; // 启动计时器 TimeoutLimit : TIME := T#10s; // 超时阈值 IsRunning : BOOL := FALSE; // 设备运行状态 AlarmActive : BOOL := FALSE; // 报警输出 END_VAR // 当设备开始启动时 IF #StartCommand THEN //当收到启动命令(StartCommand=TRUE)时#IsRunning := TRUE; //设置运行状态标志 IsRunning=TRUE#StartTimer := T#0s; //将计时器 StartTimer 归零(T#0s 表示0秒时间量) END_IF;// 超时检测循环 WHILE #IsRunning AND (#StartTimer < #TimeoutLimit) DO //设备正在运行且未超时#StartTimer := #StartTimer + T#100ms; // 增加时间(在循环中模拟等待) IF #DeviceReady THEN //检查设备就绪信号 DeviceReady#IsRunning := FALSE; // 若收到就绪信号,立即设置 IsRunning=FALSE 退出循环END_IF; END_WHILE;//退出循环后检测计时器: IF #StartTimer >= #TimeoutLimit THEN //超时 → 激活报警(AlarmActive=TRUE)#AlarmActive := TRUE; // 触发报警 ELSE#AlarmActive := FALSE; //未超时 → 关闭报警(AlarmActive=FALSE) END_IF;
五、调试技巧
-
临时变量监控:
-
在TIA Portal的“监控表”中添加循环变量(如
Counter
、Index
),实时观察值的变化。
-
-
断点调试:
-
在循环体内设置断点,逐步执行分析逻辑。
-
-
看门狗处理:
-
若循环可能耗时较长,在循环体内调用
COMM_BLOCK
指令刷新通信看门狗。
-
总结
WHILE
循环在SCL中用于动态条件迭代,比FOR
循环更灵活,但需谨慎:
-
✅ 确保条件变量在循环体内被修改
-
✅ 避免无限循环
-
✅ 优化性能以防扫描周期超时
通过本文案例,可快速掌握其在累加计算、数据搜索、超时控制等场景的应用。实际项目开发中,建议结合函数块(FB/FC)封装复杂循环逻辑,提升代码复用性和可读性。