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 표현식
- 표현식은 연산자(operator) 들과 피연산자(operand) 들로 구성됩니다. 피연산자는 정의된 문자(숫자 문자, 문자열, 시간 문자), 정의된 변수(일반변수, 직접변수), 정의된 함수(펑션, 펑션 블록) 또는 다른 표현식일 수 있습니다.
표현식의 계산은 〈표1〉의 연산자 우선순위로 정의된 순서대로 이루어집니다. 가장 높은 우선순위를 가진 연산자가 첫 번째로 수행되고, 다음 우선순위 연산자가 차례로 수행되며, 이 순서가 계산이 끝날 때까지 계속됩니다.
- 예) A + B * C : 먼저 B와 C를 곱하고, 그 결과를 A에 더합니다.
동일한 우선순위를 가진 연산자들은 표현식의 왼쪽에서 오른쪽 순으로 수행합니다.
- 예) A + B - C : 먼저 A와 B를 더하고, 그 결과에서 C를 뺍니다.
연산자가 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 | 변수 또는 직접변수 |
| expression1 | ANY_NUM 타입의 표현식 |
| expression2 | ANY_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 | 변수 또는 직접변수 |
| expression1 | ANY_NUM 타입의 표현식 |
| expression2 | ANY_NUM 타입의 표현식 |
사용 예 — 결과 값은 16.
Val1 := 20; Val2 := 4; Result := Val1 - Val2; // 결과 = 16
14.2.1.3 * 연산자 (곱셈)
연산자 양쪽의 두 값을 곱합니다.
문법
result := expression1 * expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY_NUM 타입의 표현식 |
| expression2 | ANY_NUM 타입의 표현식 |
사용 예 — 20과 In1을 곱해 대입. 결과 값은 40.
In1 := 2; Result := 20 * In1; // 결과 = 40
14.2.1.4 / 연산자 (나눗셈)
/ 연산자 왼쪽 값을 오른쪽 값으로 나눕니다.
나눗셈은 변수 타입이 정수형인지 실수형인지에 따라 다르게 계산됩니다. 실수형 나눗셈은 실수형 값을, 정수형 나눗셈은 정수형 값을 출력합니다. 정수는 소수점이 없으므로 5를 3으로 나누면 소수점 이하 부분을 버린 결과가 출력됩니다.
문법
result := expression1 / expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY_NUM 타입의 표현식 |
| expression2 | ANY_NUM 타입의 표현식 |
사용 예 — 결과 값은 10.
In1 := 2; Result := 20 / In1; // 결과 = 10
알아두기 — 0 값으로 나눈 경우 연산 에러 플래그(_ERR)가 On 됩니다. 이 경우에도 CPU는 런(RUN) 모드를 유지합니다.
14.2.1.5 MOD 연산자 (나머지)
MOD 연산자 왼쪽 값을 오른쪽 값으로 나누었을 때의 나머지를 출력합니다.
문법
result := expression1 MOD expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY_NUM 타입의 표현식 |
| expression2 | ANY_NUM 타입의 표현식 |
사용 예 — 12를 10으로 나눈 나머지 2를 대입.
In1 := 10; Result := 12 MOD In1; // 결과 = 2
알아두기 — 0 값으로 나눈 경우 연산 에러 플래그(_ERR)가 On 됩니다. 이 경우에도 CPU는 런(RUN) 모드를 유지합니다.
14.2.1.6 ** 연산자 (지수)
** 연산자 왼쪽의 값을 오른쪽의 승수만큼 곱합니다.
문법
result := expression1 ** expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY_REAL 타입의 표현식 |
| expression2 | ANY_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 | 변수 또는 직접변수 |
| expression1 | ANY_BIT 타입의 표현식 |
| expression2 | ANY_BIT 타입의 표현식 |
진리표 (AND)
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
사용 예 — 두 피연산자에서 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 | 변수 또는 직접변수 |
| expression1 | ANY_BIT 타입의 표현식 |
| expression2 | ANY_BIT 타입의 표현식 |
진리표 (OR)
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
사용 예 — 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 | 변수 또는 직접변수 |
| expression1 | ANY_BIT 타입의 표현식 |
| expression2 | ANY_BIT 타입의 표현식 |
진리표 (XOR)
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
사용 예 — 두 피연산자의 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 | 변수 또는 직접변수 |
| expression1 | ANY 타입의 표현식 |
| expression2 | ANY 타입의 표현식 |
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
사용 예 — 같으므로 결과 값은 1.
Val1 := 20; Val2 := 20; Result := Val1 = Val2; // 결과 = 1
14.2.1.11 <> 연산자 (부등)
두 피연산자가 같지 않은지 비교합니다.
문법
result := expression1 <> expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY 타입의 표현식 |
| expression2 | ANY 타입의 표현식 |
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
사용 예 — 같으므로 결과 값은 0.
Val1 := 20; Val2 := 20; Result := Val1 <> Val2; // 결과 = 0
14.2.1.12 > 연산자 (보다 큼)
왼쪽 피연산자가 오른쪽 피연산자보다 큰지 비교합니다.
문법
result := expression1 > expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY 타입의 표현식 |
| expression2 | ANY 타입의 표현식 |
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
사용 예 — 20 > 10 이 참이므로 결과 값은 1.
Val1 := 20; Val2 := 10; Result := Val1 > Val2; // 결과 = 1
14.2.1.13 < 연산자 (보다 작음)
< 연산자 앞의 피연산자가 뒤의 피연산자보다 작은지 비교합니다.
문법
result := expression1 < expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY 타입의 표현식 |
| expression2 | ANY 타입의 표현식 |
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 0 |
사용 예 — 20 < 10 이 거짓이므로 결과 값은 0.
Val1 := 20; Val2 := 10; Result := Val1 < Val2; // 결과 = 0
14.2.1.14 >= 연산자 (크거나 같음)
앞의 피연산자가 뒤의 피연산자보다 크거나 같은지 비교합니다.
문법
result := expression1 >= expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY 타입의 표현식 |
| expression2 | ANY 타입의 표현식 |
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
사용 예 — 20 >= 20 이 참이므로 결과 값은 1.
Val1 := 20; Val2 := 20; Result := Val1 >= Val2; // 결과 = 1
14.2.1.15 <= 연산자 (작거나 같음)
앞의 피연산자가 뒤의 피연산자보다 작거나 같은지 비교합니다.
문법
result := expression1 <= expression2
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression1 | ANY 타입의 표현식 |
| expression2 | ANY 타입의 표현식 |
| expression1 | expression2 | result |
|---|---|---|
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
사용 예 — 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 | 변수 또는 직접변수 |
| expression | ANY_BIT 타입의 표현식 |
사용 예 — Val1을 반전. 결과는 2#0011.
Val1 := 2#1100; Result := NOT Val1; // 결과 = 2#0011
14.2.1.17 - 연산자 (단항, 부호 변경)
피연산자의 부호를 변경합니다.
문법
result := - expression
| 항목 | 설명 |
|---|---|
| result | 변수 또는 직접변수 |
| expression | ANY_NUM 타입의 표현식 |
사용 예 — Val1의 부호를 반전. 결과는 -10.
Val1 := 10; Result := - Val1; // 결과 = -10
14.2.2 명령문
- ST 언어의 명령문들이 〈표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; |
| 4 | IF 문 | 아래 코드 참조 |
| 5 | CASE 문 | 아래 코드 참조 |
| 6 | FOR 문 | 아래 코드 참조 |
| 7 | WHILE 문 | 아래 코드 참조 |
| 8 | REPEAT 문 | 아래 코드 참조 |
| 9 | EXIT 문 | 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 할당문
할당문은 왼쪽에 변수, 그 뒤를 따르는 할당 연산자(:=), 마지막으로 연산할 표현식으로 구성됩니다.
- 예) A := B + C;
- 할당문은 펑션 이름을 연산자 왼쪽에 위치시킴으로써 펑션의 리턴값을 대입하는 데도 사용합니다.
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| 항목 | 설명 |
|---|---|
| condition | TRUE이면 THEN 이하 statements를 수행. FALSE면 ELSIF 또는 ELSE로 분기 |
| statements | condition이 TRUE이면 하나 이상의 상태문을 수행 |
| condition-n | condition을 N개 사용할 수 있음 |
| elseifstatements | condition-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| 항목 | 설명 |
|---|---|
| expression | INT형 상태문만 가능 |
| case_list | case_list_element {',' case_list_element} — 조건이 여러 개 올 수 있음 |
| case_list_element | subrange 또는 signed_integer만 가능 |
| subrange | signed_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은 모두 동일한 타입이어야 함 |
| start | counter의 초기값 |
| end | counter의 마지막 값 |
| 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알아두기
- 스캔 시간이 오래 걸려 워치독(watchdog)이 걸릴 수 있습니다.
- BY 부분은 생략 가능하며, 생략 시 루프 카운터는 기본 1씩 증가합니다.
- 초기값이 최종값보다 큰 경우 FOR문을 수행하지 않습니다.
14.2.2.7 WHILE 문
WHILE문은 조건 수식이 거짓(0)이 될 때까지 반복하는 순환문입니다. 선(先) 조건 검사 루프로, 조건이 만족하지 않으면 내부 상태문을 전혀 수행하지 않을 수 있습니다.
문법
WHILE condition DO
statements
END_WHILE| 항목 | 설명 |
|---|---|
| condition | TRUE이면 DO 이하 statements를 수행. FALSE면 순환문을 빠져나감 |
| statements | condition이 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| 항목 | 설명 |
|---|---|
| condition | FALSE면 반복 수행, TRUE면 빠져나감 |
| statements | 조건이 TRUE가 될 때까지 반복 수행 |
사용 예 — Counter가 21이 되면 조건이 TRUE가 되어 종료.
Counter := 0;
REPEAT
Counter := Counter + 1;
UNTIL Counter > 20
END_REPEAT;알아두기 — 조건 수식이 거짓(0)에서 변하지 않으면 무한 루프에 빠질 수 있습니다. 스캔 워치독에 주의하십시오.
14.2.2.9 EXIT 문
- EXIT문은 반복문(WHILE, FOR, REPEAT)에서 빠져나가는 데 사용됩니다.
- 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 비 실행문(설명문)
- 비 실행문(설명문)은 2가지 형태를 제공합니다 — 한 라인 비 실행문과 블록 비 실행문.
- 한 라인 비 실행문은 //를 사용하며, 해당 라인의 끝까지 비 실행문 처리됩니다.
- 블록 비 실행문은 (* 과 *) 사이의 문자들을 비 실행문 처리합니다.
- 설명문도 동일한 형태로 작성 가능합니다.
예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 규격 기반.