WHILE_DO
WHILE_DO 循环用于在某些条件为真时一直执行某项操作。
操作数
WHILE bool_expression DO
<语句>;
结构化文本
操作数 | 类型 | 格式 | 说明 |
|---|---|---|---|
bool_expression | BOOL | 标签 表达式 | 赋值为 BOOL 值的 BOOL 标签或表达式 |
重要提示:
- 在一个扫描周期内,循环的迭代次数不应过多。
- 控制器在完成循环前不会执行例程中的其他任何语句。
- 如果完成循环所用的时间超过了任务的看门狗计时器时间,将出现严重故障。
- 请考虑使用其他结构,例如 IF_THEN。
说明
语法如下:

下图解释了 WHILE_DO 循环的执行过程以及如何通过 EXIT 语句提前退出循环。
![]() | ![]() |
当 bool_expression 为真时,控制器 只执行 WHILE_DO 循环内的语句。 | 要在条件为真前终止循环,请使用 EXIT 语句。 |
影响数学状态标志
否
故障条件
在以下情况下会发生严重故障 | 故障类型 | 故障代码 |
结构循环过长 | 6 | 1 |
示例 1
如果执行以下操作, | 输入以下结构化文本 | |
WHILE_DO 循环首先评估其条件。如果条件为真,则控制器执行循环内的语句。 该循环不同于 REPEAT_UNTIL 循环,因为 REPEAT_UNTIL 循环首先执行结构内的语句,然后在再次执行语句前确定条件是否为真。REPEAT_UNTIL 循环中的语句始终至少执行一次。而 WHILE_DO 循环中的语句可能从不执行。 | pos := 0; | |
While ((pos <= 100) & structarray[pos].value <> targetvalue)) do | ||
pos := pos + 2; | ||
String_tag.DATA[pos] := SINT_array[pos]; | ||
end_while; | ||
示例 2
如果执行以下操作, | 输入以下结构化文本 |
将 SINT 数组中的 ASCII 字符移入字符串标签。(在 SINT 数组中,每个元素保存一个字符。)到达回车时停止。 将 Element_number 初始化为 0。 计算 SINT_array(含有 ASCII 字符的数组)中的元素数,并将结果存入 SINT_array_size(DINT 标签)中。 如果 SINT_array[element_number] 中的字符 = 13(回车的十进制值),则停止。 将 String_tag[element_number] 设置为 SINT_array[element_number] 处的字符。 将 element_number 加 1。这会使控制器检查 SINT_array 中的下一个字符。 设置 String_tag 的长度成员 = element_number。(其将记录当前 String_tag 中的字符数。) 如果 element_number = SINT_array_size,则停止。(已执行到数组末尾但无回车。) | element_number := 0; |
SIZE(SINT_array, 0, SINT_array_size); | |
While SINT_array[element_number] <> 13 do | |
String_tag.DATA[element_number] := SINT_array[element_number]; | |
element_number := element_number + 1; | |
String_tag.LEN := element_number; | |
If element_number = SINT_array_size then | |
exit; | |
end_if; | |
end_while; |
提供反馈

