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

下图显示了 REPEAT_UNTIL 循环如何执行以及 EXIT 语句如何提前退出循环。
当 bool_expression 为假时,控制器仅执行 REPEAT_UNTIL 循环内的语句。

要在条件为假前终止循环,请使用 EXIT 语句。

影响数学状态标志
否
故障条件
在以下情况下会发生严重故障 | 故障类型 | 故障代码 |
结构循环过长 | 6 | 1 |
示例 1
如果执行以下操作, | 输入以下结构化文本 |
REPEAT_UNTIL 循环首先执行结构内的语句,然后在再次执行语句前确定条件是否为真。该循环不同于 WHILE_DO 循环,因为 WHILE_DO 循环将首先对其条件进行求值。 如果条件为真,则控制器执行循环内的语句。REPEAT_UNTIL 循环中的语句始终至少执行一次。而 WHILE_DO 循环中的语句可能从不执行。 | pos := -1; |
REPEAT | |
pos := pos + 2; | |
UNTIL ((pos = 101) OR (structarray[pos].value = targetvalue)) | |
end_repeat; |
示例 2
如果执行以下操作, | 输入以下结构化文本 |
将 SINT 数组中的 ASCII 字符移入字符串标签。(在 SINT 数组中,每个元素保存一个字符。)到达回车时停止。 将 Element_number 初始化为 0。 计算 SINT_array(含有 ASCII 字符的数组)中的元素数,并将结果存入 SINT_array_size(DINT 标签)中。 设置 String_tag[element_number] = SINT_array[element_number] 中的字符。 将 element_number 加 1。这将使得控制器检查 SINT_array 中的下一个字符。 设置 String_tag 的长度成员 = element_number。(其将记录当前 String_tag 中的字符数。) 如果 element_number = SINT_array_size,则停止。(已执行到数组末尾但无回车。) 如果 SINT_array[element_number] 中的字符 = 13(回车的十进制值),则停止。 | element_number := 0; |
SIZE(SINT_array, 0, SINT_array_size); | |
Repeat | |
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; | |
Until SINT_array[element_number] = 13 | |
end_repeat; |
提供反馈