WHILE_DO
특정 조건이 참이면 WHILE_DO 루프를 사용하여 작업을 계속 수행합니다.
피연산자
WHILE bool_expression DO
<statement>;
구조화된 텍스트
피연산자 | 유형 | 형식 | 설명 |
|---|---|---|---|
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 루프의 문은 항상 최소 1회 실행됩니다. 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(캐리지 리턴 십진수 값)일 경우 중지합니다. Set 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; |
의견을 작성 부탁드립니다.

