콘텐츠로 건너뛰기

   자 료 실 > 매뉴얼 / 카달로그   

LSE ST(Structured Text)


출처: LS Electric XG5000 PLC 프로그래밍 언어 — ST(Structured Text) 문법 정리 (IEC 61131-3 규격 기반)


목 차

  • 14.1 개요

    • 14.1.1 ST 언어
    • 14.1.2 특징

  • 14.2 ST 언어의 구성

    • 14.2.1 표현식

      • 연산자 목록 및 우선순위 〈표1〉
      • 산술 연산자: + - * / MOD **
      • 비트 연산자: AND/& OR XOR NOT
      • 비교·관계 연산자: = <> > < >= <=
      • 부호 연산자: - (단항)

    • 14.2.2 명령문

      • 명령문 목록 〈표2〉
      • 할당문 / 선택문 / 반복문
      • IF / CASE / FOR / WHILE / REPEAT / EXIT 문

    • 14.2.3 비 실행문(설명문)


14.1 ST 문법 개요


14.1.1 ST 언어

오픈 컨트롤러에서 로직(논리)의 기술 방식에 대해서 규정한 국제 규격 IEC 61131-3에서 정의된 언어입니다.

ST 언어에서는 연산자, 제어구문, 함수를 지원하며, 아래와 같은 기술이 가능합니다.

  • 조건문에 의한 선택분기, 반복문에 의한 반복 등의 제어구문
  • 연산자(*, /, +, -, <, >, = 등)를 사용한 식
  • 사용자가 정의한 펑션 블록(FB)의 호출
  • 함수의 호출(IEC 함수)
  • 한자/한글 등의 전각 문자를 포함한 코멘트 기술


14.1.2 특징

1) 텍스트 형식의 자유로운 기술 ST 언어는 영/숫자의 텍스트 형식으로 기술됩니다. 코멘트, 문자열 내에서는 한자/한글 등의 전각 문자도 사용할 수 있습니다.

2) C 언어 등의 고급 언어와 동등한 프로그래밍 가능 ST 언어는 C 언어 등의 고급 언어와 같이 조건문에 의한 선택 분기나, 반복문에 의한 반복 등, 구문에 의한 제어를 기술할 수 있습니다. 따라서 프로그램을 간결하게 나타낼 수 있습니다.

3) 연산 처리를 용이하게 기술 가능 ST 언어는 IL이나 LD에서는 기술하기 어려운 연산 처리를 간결하고 보기 쉽게 기술할 수 있기 때문에, 프로그램의 가시성이 양호하며, 복잡한 산술 연산 및 비교 연산 등을 실행하는 분야에 적용되고 있습니다.



14.2 ST 언어의 구성

14.2.1 표현식

  1. 표현식은 연산자(operator) 들과 피연산자(operand) 들로 구성됩니다. 피연산자는 정의된 문자(숫자 문자, 문자열, 시간 문자), 정의된 변수(일반변수, 직접변수), 정의된 함수(펑션, 펑션 블록) 또는 다른 표현식일 수 있습니다.

  2. 표현식의 계산은 〈표1〉의 연산자 우선순위로 정의된 순서대로 이루어집니다. 가장 높은 우선순위를 가진 연산자가 첫 번째로 수행되고, 다음 우선순위 연산자가 차례로 수행되며, 이 순서가 계산이 끝날 때까지 계속됩니다.

    • 예) A + B * C : 먼저 B와 C를 곱하고, 그 결과를 A에 더합니다.

  3. 동일한 우선순위를 가진 연산자들은 표현식의 왼쪽에서 오른쪽 순으로 수행합니다.

    • 예) A + B - C : 먼저 A와 B를 더하고, 그 결과에서 C를 뺍니다.

  4. 연산자가 2개의 피연산자를 가질 때 왼쪽 끝의 피연산자가 먼저 수행합니다.

    • 예) SIN(A) * COS(B) : SIN(A)를 먼저 실행한 후 COS(B)를 연산합니다.

5) 연산 시 다음 조건은 에러로 처리합니다.

  • (1) 0의 값으로 나눌 경우 — 예) A/(B*C) 에서 B*C 결과가 0이면 CPU에서 연산 에러 발생
  • (2) 피연산자가 연산을 위한 정확한 데이터 타입이 아닌 경우 — 예) ADD(1,2,3) 은 숫자의 데이터 타입을 결정할 수 없어 컴파일 시 에러 발생
  • (3) 산술 연산 결과가 데이터 타입의 값 범위를 벗어난 경우 — 예) B*C 에서 B, C가 UINT 타입이고 결과가 65,535 이상이면 CPU에서 연산 에러 발생


연산자 목록 및 우선순위 〈표1〉

번호연산기호우선순위
1괄호로 묶음(표현식)가장 높음 ▲
2함수 계산함수 식별자(파라미터 리스트) 예) ADD(X, Y)


3부정 / 보수- / NOT


4지수**


5곱셈 / 나눗셈 / 나머지* / / / MOD


6더하기 / 빼기+ / -


7비교<, >, <=, >=


8동등(일치) / 부등(불일치)= / <>


9부울 논리곱& / AND


10부울 배타적 논리합XOR▼
11부울 논리합OR가장 낮음


14.2.1.1~6 산술 연산자


14.2.1.1 + 연산자 (덧셈)

연산자 양쪽의 두 값을 더합니다.

문법

result := expression1 + expression2
항목설명
result변수 또는 직접변수
expression1ANY_NUM 타입의 표현식
expression2ANY_NUM 타입의 표현식

사용 예 — 두 변수 값을 더해 Result에 대입. 결과 값은 24.

Val1 := 20;
Val2 := 4;
Result := Val1 + Val2;   // 결과 = 24

피연산자(Val1, Val2)는 상수와 변수 모두 사용 가능합니다.

알아두기 — ANY_NUM 타입은 ANY_REAL 타입과 ANY_INT 타입을 포함합니다. (데이터 타입 계층도는 3.2.2 참고)


14.2.1.2 - 연산자 (뺄셈)

- 연산자 앞의 값에서 뒤의 값을 뺍니다.

문법

result := expression1 - expression2
항목설명
result변수 또는 직접변수
expression1ANY_NUM 타입의 표현식
expression2ANY_NUM 타입의 표현식

사용 예 — 결과 값은 16.

Val1 := 20;
Val2 := 4;
Result := Val1 - Val2;   // 결과 = 16

14.2.1.3 * 연산자 (곱셈)

연산자 양쪽의 두 값을 곱합니다.

문법

result := expression1 * expression2
항목설명
result변수 또는 직접변수
expression1ANY_NUM 타입의 표현식
expression2ANY_NUM 타입의 표현식

사용 예 — 20과 In1을 곱해 대입. 결과 값은 40.

In1 := 2;
Result := 20 * In1;   // 결과 = 40

14.2.1.4 / 연산자 (나눗셈)

/ 연산자 왼쪽 값을 오른쪽 값으로 나눕니다.

나눗셈은 변수 타입이 정수형인지 실수형인지에 따라 다르게 계산됩니다. 실수형 나눗셈은 실수형 값을, 정수형 나눗셈은 정수형 값을 출력합니다. 정수는 소수점이 없으므로 5를 3으로 나누면 소수점 이하 부분을 버린 결과가 출력됩니다.

문법

result := expression1 / expression2
항목설명
result변수 또는 직접변수
expression1ANY_NUM 타입의 표현식
expression2ANY_NUM 타입의 표현식

사용 예 — 결과 값은 10.

In1 := 2;
Result := 20 / In1;   // 결과 = 10

알아두기 — 0 값으로 나눈 경우 연산 에러 플래그(_ERR)가 On 됩니다. 이 경우에도 CPU는 런(RUN) 모드를 유지합니다.


14.2.1.5 MOD 연산자 (나머지)

MOD 연산자 왼쪽 값을 오른쪽 값으로 나누었을 때의 나머지를 출력합니다.

문법

result := expression1 MOD expression2
항목설명
result변수 또는 직접변수
expression1ANY_NUM 타입의 표현식
expression2ANY_NUM 타입의 표현식

사용 예 — 12를 10으로 나눈 나머지 2를 대입.

In1 := 10;
Result := 12 MOD In1;   // 결과 = 2

알아두기 — 0 값으로 나눈 경우 연산 에러 플래그(_ERR)가 On 됩니다. 이 경우에도 CPU는 런(RUN) 모드를 유지합니다.


14.2.1.6 ** 연산자 (지수)

** 연산자 왼쪽의 값을 오른쪽의 승수만큼 곱합니다.

문법

result := expression1 ** expression2
항목설명
result변수 또는 직접변수
expression1ANY_REAL 타입의 표현식
expression2ANY_REAL 타입의 표현식

사용 예 — 10을 In1만큼 거듭제곱. 결과 값은 1000.

In1 := 3;
Result := 10 ** In1;   // 결과 = 1000 (10^3)


14.2.1.7~9 비트 논리 연산자


14.2.1.7 AND 또는 & 연산자

이항 연산자(AND 또는 &)는 두 피연산자 사이의 비트끼리 비교합니다. 두 피연산자에 대응하는 비트가 모두 1이면 결과 비트도 1이 됩니다.

문법

result := expression1 AND expression2
result := expression1 & expression2
항목설명
result변수 또는 직접변수
expression1ANY_BIT 타입의 표현식
expression2ANY_BIT 타입의 표현식

진리표 (AND)

expression1expression2result
000
010
100
111

사용 예 — 두 피연산자에서 5번째·1번째 비트만 둘 다 1이므로 결과는 2#00010001.

Result := 2#10010011 AND 2#00111101;   // 결과 = 2#00010001

14.2.1.8 OR 연산자

이항 연산자(OR)는 두 피연산자 사이의 비트끼리 비교합니다. 대응하는 비트 중 어느 하나라도 1이면 결과 비트도 1이 됩니다.

문법

result := expression1 OR expression2
항목설명
result변수 또는 직접변수
expression1ANY_BIT 타입의 표현식
expression2ANY_BIT 타입의 표현식

진리표 (OR)

expression1expression2result
000
011
101
111

사용 예 — 7번째 비트를 제외한 모든 위치에 최소 하나의 1이 존재하므로 결과는 2#10111111.

Result := 2#10010011 OR 2#00111101;   // 결과 = 2#10111111

14.2.1.9 XOR 연산자

이항 연산자(XOR)는 두 피연산자 사이의 비트끼리 비교합니다. 대응하는 비트 중 어느 하나만 1이면(둘 다 1이면 안 됨) 결과 비트도 1이 됩니다.

문법

result := expression1 XOR expression2
항목설명
result변수 또는 직접변수
expression1ANY_BIT 타입의 표현식
expression2ANY_BIT 타입의 표현식

진리표 (XOR)

expression1expression2result
000
011
101
110

사용 예 — 두 피연산자의 1번째 비트가 모두 1이므로 결과의 1번째 비트는 0. 결과는 2#10101110.

Result := 2#10010011 XOR 2#00111101;   // 결과 = 2#10101110


14.2.1.10~15 비교·관계 연산자

아래 진리표는 비트(부울) 단위 연산 결과를 나타냅니다.


14.2.1.10 = 연산자 (동등)

두 피연산자가 같은지 비교합니다.

문법

result := expression1 = expression2
항목설명
result변수 또는 직접변수
expression1ANY 타입의 표현식
expression2ANY 타입의 표현식
expression1expression2result
001
010
100
111

사용 예 — 같으므로 결과 값은 1.

Val1 := 20;
Val2 := 20;
Result := Val1 = Val2;   // 결과 = 1

14.2.1.11 <> 연산자 (부등)

두 피연산자가 같지 않은지 비교합니다.

문법

result := expression1 <> expression2
항목설명
result변수 또는 직접변수
expression1ANY 타입의 표현식
expression2ANY 타입의 표현식
expression1expression2result
000
011
101
110

사용 예 — 같으므로 결과 값은 0.

Val1 := 20;
Val2 := 20;
Result := Val1 <> Val2;   // 결과 = 0

14.2.1.12 > 연산자 (보다 큼)

왼쪽 피연산자가 오른쪽 피연산자보다 큰지 비교합니다.

문법

result := expression1 > expression2
항목설명
result변수 또는 직접변수
expression1ANY 타입의 표현식
expression2ANY 타입의 표현식
expression1expression2result
000
010
101
110

사용 예 — 20 > 10 이 참이므로 결과 값은 1.

Val1 := 20;
Val2 := 10;
Result := Val1 > Val2;   // 결과 = 1

14.2.1.13 < 연산자 (보다 작음)

< 연산자 앞의 피연산자가 뒤의 피연산자보다 작은지 비교합니다.

문법

result := expression1 < expression2
항목설명
result변수 또는 직접변수
expression1ANY 타입의 표현식
expression2ANY 타입의 표현식
expression1expression2result
000
011
100
110

사용 예 — 20 < 10 이 거짓이므로 결과 값은 0.

Val1 := 20;
Val2 := 10;
Result := Val1 < Val2;   // 결과 = 0

14.2.1.14 >= 연산자 (크거나 같음)

앞의 피연산자가 뒤의 피연산자보다 크거나 같은지 비교합니다.

문법

result := expression1 >= expression2
항목설명
result변수 또는 직접변수
expression1ANY 타입의 표현식
expression2ANY 타입의 표현식
expression1expression2result
001
010
101
111

사용 예 — 20 >= 20 이 참이므로 결과 값은 1.

Val1 := 20;
Val2 := 20;
Result := Val1 >= Val2;   // 결과 = 1

14.2.1.15 <= 연산자 (작거나 같음)

앞의 피연산자가 뒤의 피연산자보다 작거나 같은지 비교합니다.

문법

result := expression1 <= expression2
항목설명
result변수 또는 직접변수
expression1ANY 타입의 표현식
expression2ANY 타입의 표현식
expression1expression2result
001
010
101
111

사용 예 — 2 <= 20 이 참이므로 결과 값은 1.

Val1 := 2;
Val2 := 20;
Result := Val1 <= Val2;   // 결과 = 1


14.2.1.16~17 단항 연산자


14.2.1.16 NOT 연산자 (비트 반전)

비트 값을 반전합니다.

문법

result := NOT expression
항목설명
result변수 또는 직접변수
expressionANY_BIT 타입의 표현식

사용 예 — Val1을 반전. 결과는 2#0011.

Val1 := 2#1100;
Result := NOT Val1;   // 결과 = 2#0011

14.2.1.17 - 연산자 (단항, 부호 변경)

피연산자의 부호를 변경합니다.

문법

result := - expression
항목설명
result변수 또는 직접변수
expressionANY_NUM 타입의 표현식

사용 예 — Val1의 부호를 반전. 결과는 -10.

Val1 := 10;
Result := - Val1;   // 결과 = -10


14.2.2 명령문

  1. ST 언어의 명령문들이 〈표2〉에 요약되어 있습니다.
  2. 명령문들은 세미콜론(;) 으로 마칩니다.

명령문 목록 〈표2〉

번호명령문 형태예
1할당문A:=B; CV:=CV+1; C:=SIN(X);
2펑션 블록 호출 / 출력 사용CMD_TMR(IN:=%IX5, PT:=T#300ms); / A:=CMD_TMR.Q;
3리턴RETURN;
4IF 문아래 코드 참조
5CASE 문아래 코드 참조
6FOR 문아래 코드 참조
7WHILE 문아래 코드 참조
8REPEAT 문아래 코드 참조
9EXIT 문EXIT;
10널/공백 명령문;

EXIT 문은 지원되는 모든 반복문(FOR, WHILE, REPEAT)에 사용됩니다.

4) IF 문 예

D := B*B - 4*A*C;
IF D < 1.0 THEN NROOTS := 0;
ELSIF D = 0.0 THEN
    NROOTS := 1;
    X1 := -B/(2.0*A);
ELSE
    X1 := (-B+SQRT(D))/(2.0*A);
    X2 := (-B-SQRT(D))/(2.0*A);
END_IF;


5) CASE 문 예

TW := WORD_BCD_TO_INT(THUMBWHEEL);
TW_ERROR := 0;
CASE TW OF
    1,5:      DISPLAY := OVEN_TEMP;
    2:        DISPLAY := MOTOR_SPEED;
    3:        DISPLAY := GROSS - TARE;
    4, 6..10: DISPLAY := ADD(TW, 4);
    ELSE      DISPLAY := 0;
              TW_ERROR := 1;
END_CASE;
%MW100 := INT_TO_BCD_WORD(DISPLAY);


6) FOR 문 예

J := 101;
FOR I := 1 TO 100 BY 2 DO
    IF WORDS[I] = 'KEY' THEN
        J := I;
        EXIT;
    END_IF;
END_FOR;


7) WHILE 문 예

J := 1;
WHILE J <= 100 & WORDS[J] <> 'KEY' DO
    J := J+2;
END_WHILE;


8) REPEAT 문 예

J := -1;
REPEAT
    J := J+2;
UNTIL J = 101 OR WORDS[J] = 'KEY'
END_REPEAT;


14.2.2.1 할당문

  1. 할당문은 왼쪽에 변수, 그 뒤를 따르는 할당 연산자(:=), 마지막으로 연산할 표현식으로 구성됩니다.

    • 예) A := B + C;
  2. 할당문은 펑션 이름을 연산자 왼쪽에 위치시킴으로써 펑션의 리턴값을 대입하는 데도 사용합니다.


14.2.2.2 선택문

선택문은 IF문과 CASE문 두 종류가 있으며, 특정 조건에 기초하여 구성 명령문 중 하나(혹은 그룹)를 선택합니다.

(1) IF 문

  • 관련 부울 표현식이 1(참)이면 명령문 그룹을 실행합니다.
  • 조건이 거짓이면 어떤 명령문도 실행되지 않습니다. 단, ELSE가 있으면 ELSE 이하 그룹이 실행되고, ELSIF 조건이 참이면 해당 ELSIF 그룹이 실행됩니다.

(2) CASE 문

  • INT 형의 변수(“선택자”)를 계산하는 표현식과 명령문 그룹 리스트로 구성됩니다.
  • 각 그룹의 라벨은 하나 이상의 정수 및 정수 값의 범위로 설정할 수 있습니다.
  • 선택자 계산 값을 포함하는 범위의 명령문 그룹이 수행되며, 어떤 값도 해당되지 않으면 ELSE 그룹이 수행됩니다. ELSE가 없으면 어떤 명령문도 수행되지 않습니다.


14.2.2.3 반복문

반복문은 FOR문, WHILE문, REPEAT문 세 종류가 있으며, 관련 명령문 그룹이 반복적으로 수행됩니다.

(1) FOR 문

  • 반복 횟수가 미리 결정되어 있는 경우에 사용됩니다.
  • 명령문 시퀀스가 END_FOR까지 반복 수행되며, 값의 진행은 FOR 루프의 제어 변수에 지정됩니다.
  • 제어 변수, 초기값, 최종값은 같은 정수형(SINT, INT, DINT) 표현식으로 나타내며 반복 문장에 의해 바뀌지 않습니다. 종료 조건 검사는 각 반복 시작 시 행해져, 초기값이 최종값을 초과하면 더 이상 수행되지 않습니다.

(2) WHILE 문과 REPEAT 문

  • WHILE문은 관련 부울 표현식이 거짓이 될 때까지 END_WHILE까지의 시퀀스를 반복 수행합니다.
  • REPEAT문은 관련 부울 조건이 참이 될 때까지 UNTIL까지의 시퀀스를 (최소한 한 번은) 반복 수행합니다.
  • WHILE/REPEAT문은 외부적으로 결정되는 종료 조건을 가진 “대기 루프(wait loop)”와 같은 프로세스 간 동기화 용도로 사용하지 않습니다.
  • EXIT문은 종료 조건 만족 전에 반복을 중단하는 데 사용됩니다. 중첩 반복 구조 내에서는 EXIT가 위치한 가장 안쪽 루프에 적용되며, 제어는 해당 루프 종료자(END_FOR, END_WHILE, END_REPEAT) 이후의 명령문으로 전달됩니다.
  • 루프 종료 조건 만족 또는 EXIT 수행이 보장될 수 없는 알고리즘에 사용되면 에러입니다.


14.2.2.4 IF 문

IF문은 프로그램이 한 가지 이상 선택해야 하는 경우 갈림길을 제공하므로 분기문이라 불립니다.

문법

IF condition THEN statements [ELSE elsestatements] END_IF

또는

IF condition THEN
    statements
[ELSIF condition-n THEN
    elseifstatements] . . .
[ELSE
    elsestatements]
END_IF
항목설명
conditionTRUE이면 THEN 이하 statements를 수행. FALSE면 ELSIF 또는 ELSE로 분기
statementscondition이 TRUE이면 하나 이상의 상태문을 수행
condition-ncondition을 N개 사용할 수 있음
elseifstatementscondition-n이 TRUE이면 하나 이상의 상태문을 수행
elsestatements이전 condition 또는 condition-n이 모두 FALSE이면 하나 이상의 상태문을 수행

사용 예 ① — IF

IF Val1 <= 10 THEN
    Result := 10;
END_IF;

사용 예 ② — IF ~ ELSE

IF Val1 <= 10 THEN
    Result := 10;
ELSE
    Result := 20;
END_IF;

사용 예 ③ — IF ~ ELSIF ~ ELSE

IF Val1 <= 10 THEN
    Result := 10;
ELSIF Val1 <= 20 THEN
    Result := 20;
ELSE
    Result := 30;
END_IF;


14.2.2.5 CASE 문

프로그램의 제어가 CASE 다음 표현식의 값으로 분기합니다. 표현식은 모두 정수값(INT형) 이어야 합니다. 값이 케이스 목록 범위에 포함되지 않으면 ELSE 이후 상태문이 실행되며, ELSE가 없으면 어떤 상태문도 실행하지 않고 흐름을 진행합니다.

문법

CASE expression OF
    case_list : statement_list
    { case_list : statement_list }
[ELSE
    statement_list]
END_CASE
항목설명
expressionINT형 상태문만 가능
case_listcase_list_element {',' case_list_element} — 조건이 여러 개 올 수 있음
case_list_elementsubrange 또는 signed_integer만 가능
subrangesigned_integer .. signed_integer 형태
statement_list하나 이상의 상태문을 수행

사용 예

CASE Val1 OF
    1     : Result := 10;   // Val1 = 1 이면 10
    2..5  : Result := 20;   // Val1 이 2~5 범위면 20
    7, 10 : Result := 30;   // Val1 = 7 또는 10 이면 30
    ELSE
            Result := 40;   // 그 외의 값이면 40
END_CASE;


14.2.2.6 FOR 문

FOR문은 순환 처리를 위해 구분자로 분리된 세 개의 제어문을 사용합니다. 먼저 초기화 수식이 실행되고, TO 수식이 참이면(현재 counter 값이 end 값보다 작은 경우) 루프가 한 번 실행됩니다. 이후 BY 수식 값만큼 counter가 갱신되고 조건을 다시 검사합니다. FOR문은 선(先) 조건 검사 루프로, 루프를 전혀 수행하지 않을 수도 있습니다.

문법

FOR counter := start TO end [BY step] DO
    statements
END_FOR
항목설명
counter정수형(SINT, INT, DINT) 변수. start, end, step은 모두 동일한 타입이어야 함
startcounter의 초기값
endcounter의 마지막 값
step루프 수행마다 증가되는 수. 생략 시 기본 1 증가
statements설정된 횟수만큼 수행되는 하나 이상의 상태문

사용 예 ① — 기본(1씩 증가) : 0~10까지 11회 수행, 최종 SUM = 11.

SUM := 0;
FOR counter := 0 TO 10 DO
    SUM := SUM + 1;
END_FOR;   // SUM = 11

사용 예 ② — BY 2(2씩 증가) : 0,2,4,6,8,10 — 6회 수행, 최종 SUM = 6.

SUM := 0;
FOR counter := 0 TO 10 BY 2 DO
    SUM := SUM + 1;
END_FOR;   // SUM = 6

알아두기

  1. 스캔 시간이 오래 걸려 워치독(watchdog)이 걸릴 수 있습니다.
  2. BY 부분은 생략 가능하며, 생략 시 루프 카운터는 기본 1씩 증가합니다.
  3. 초기값이 최종값보다 큰 경우 FOR문을 수행하지 않습니다.


14.2.2.7 WHILE 문

WHILE문은 조건 수식이 거짓(0)이 될 때까지 반복하는 순환문입니다. 선(先) 조건 검사 루프로, 조건이 만족하지 않으면 내부 상태문을 전혀 수행하지 않을 수 있습니다.

문법

WHILE condition DO
    statements
END_WHILE
항목설명
conditionTRUE이면 DO 이하 statements를 수행. FALSE면 순환문을 빠져나감
statementscondition이 TRUE이면 하나 이상의 상태문이 처리됨

사용 예 — Counter가 20이 되면 조건이 FALSE가 되어 종료.

Counter := 0;
WHILE Counter < 20 DO
    Counter := Counter + 1;
END_WHILE;

알아두기 — 조건 수식이 거짓(0)이 되지 않으면 무한 루프에 빠질 수 있습니다. 이 경우 스캔 타임이 길어져 스캔 워치독이 걸릴 수 있으니, 조건 수식이 항상 TRUE가 되지 않도록 주의하십시오.


14.2.2.8 REPEAT 문

REPEAT문은 조건식이 TRUE가 될 때까지 반복하는 순환문입니다. 후(後) 조건 검사 루프로, 루프 통과 후에 반복 여부를 검사하므로 적어도 한 번은 실행합니다.

문법

REPEAT
    statements
UNTIL condition
END_REPEAT
항목설명
conditionFALSE면 반복 수행, TRUE면 빠져나감
statements조건이 TRUE가 될 때까지 반복 수행

사용 예 — Counter가 21이 되면 조건이 TRUE가 되어 종료.

Counter := 0;
REPEAT
    Counter := Counter + 1;
UNTIL Counter > 20
END_REPEAT;

알아두기 — 조건 수식이 거짓(0)에서 변하지 않으면 무한 루프에 빠질 수 있습니다. 스캔 워치독에 주의하십시오.


14.2.2.9 EXIT 문

  1. EXIT문은 반복문(WHILE, FOR, REPEAT)에서 빠져나가는 데 사용됩니다.
  2. EXIT문을 반복문 밖에서 사용하면 에러가 발생합니다.

문법

EXIT

사용 예 ① — FOR 내 EXIT : 첫 반복에서 바로 탈출. Counter = 0, SUM = 1.

SUM := 0;
FOR Counter := 0 TO 10 DO
    SUM := SUM + 1;
    EXIT;
END_FOR;

사용 예 ② — WHILE + IF + EXIT : Counter = 10이면 탈출.

Counter := 0;
WHILE Counter < 20 DO
    Counter := Counter + 1;
    IF Counter = 10 THEN
        EXIT;
    END_IF;
END_WHILE;

사용 예 ③ — REPEAT + IF + EXIT : Counter = 10이면 탈출.

Counter := 0;
REPEAT
    Counter := Counter + 1;
    IF Counter = 10 THEN
        EXIT;
    END_IF;
UNTIL Counter > 20
END_REPEAT;


14.2.3 비 실행문(설명문)

  1. 비 실행문(설명문)은 2가지 형태를 제공합니다 — 한 라인 비 실행문과 블록 비 실행문.
  2. 한 라인 비 실행문은 //를 사용하며, 해당 라인의 끝까지 비 실행문 처리됩니다.
  3. 블록 비 실행문은 (* 과 *) 사이의 문자들을 비 실행문 처리합니다.
  4. 설명문도 동일한 형태로 작성 가능합니다.

예1) 블록 비 실행문 설정 시 — (* ~ *) 로 둘러싼 전체가 주석 처리됨

(* CASE Line OF
    1: Start_switch := TRUE;
    2: Start_switch := FALSE;
    3: Start_switch := TRUE;
    ELSE Warnig_lamp := TRUE;
   END_CASE;

   IF Start_switch = TRUE THEN
   FOR Num_of_process := 0 TO 100 BY 1 DO
    Parts_A := Parts_A + 1;
    END_FOR;
    END_IF; *)

예2) 한 라인 비 실행문 설정 시 — // 가 붙은 라인만 주석 처리됨

 CASE Line OF
//  1: Start_switch := TRUE;
    2: Start_switch := FALSE;
//  3: Start_switch := TRUE;
    ELSE Warnig_lamp := TRUE;
    END_CASE;

    IF Start_switch = TRUE THEN
//  FOR Num_of_process := 0 TO 100 BY 1 DO
    Parts_A := Parts_A + 1;
    END_FOR;
    END_IF;

출처: LS Electric XG5000 사용 설명서 — 제14장 ST(Structured Text). IEC 61131-3 규격 기반.