PLC#ST(Structured Text) 엔트리1
ST(Structured Text)란 무엇입니까?
제어 과정이 갈수록 복잡해지면서 현재 자동화 시스템도 더욱 복잡한 데이터 처리 기능과 계산을 필요로 한다.
ST(Structured Text)는 이를 위해 설계된 언어입니다.IEC 61131-3에서 설계한 것으로 PASCAL-base의 고급 언어, 프로그래머가 임무를 간단하게 완성하도록 하는 것이 목표이다.씨엠네스뿐만 아니라 미쓰비시, 옴론, 코드시스템에도 다양한 제조사가 있는데 통상 명령만 다르다.
Siemens With TIA
GXWorks2
Simotion
시엠엔스의 SIMOTION ST는 SIMOTION 기기 동작 제어와 Technology를 간단하게 제어할 수 있는 테크놀로지 명령도 제작했다.(예: 포지셔닝, CAM 등...)
이번 입문편은 씨모션의 ST를 바탕으로 썼다.잘 부탁드립니다.
전언
먼저 영어 ST 어학처리서가 1천쪽 정도 나와 시엠니스를 의식을 잃게 했다.
여기에는 자주 등장하는'Syntax diaagram'이 있다.시엠슨의 설명서는 이런 그래프상의 일을 설명하는 것을 좋아하는 것 같지만 이해하기 어렵다.
여기서 먼저 익숙해져라.
1. Rule name: 즉, 해당 구문 이름
2.option: 있어도 되고 없어도 되는 선언
3. Iteration: Looping·반복.
4. Alternative: OR처럼 느껴지면 문제 없어요.
ST Source의 구성
ST Source는 일반 문자이며 여러 개의 Logical 선택 항목으로 나눌 수 있습니다.
ST Source의 주요 선택은 다음과 같습니다.
먼저 영어 ST 어학처리서가 1천쪽 정도 나와 시엠니스를 의식을 잃게 했다.
여기에는 자주 등장하는'Syntax diaagram'이 있다.시엠슨의 설명서는 이런 그래프상의 일을 설명하는 것을 좋아하는 것 같지만 이해하기 어렵다.
여기서 먼저 익숙해져라.
1. Rule name: 즉, 해당 구문 이름
2.option: 있어도 되고 없어도 되는 선언
3. Iteration: Looping·반복.
4. Alternative: OR처럼 느껴지면 문제 없어요.
ST Source의 구성
ST Source는 일반 문자이며 여러 개의 Logical 선택 항목으로 나눌 수 있습니다.
ST Source의 주요 선택은 다음과 같습니다.
기본 문법
PASCAL-base라서 쓰는 게 어렵지 않아요.
중요한 것은 ";"잊지 않으면~ 웃어.자꾸 까먹어서... 그리고 SIMOTION의 EDOTR는 너무 약해요.
변수, 함수가 없는 Auto-Fill입니다.
변수 이름
이것만 봐Graph, 응?라는 인상을 남겼다.
나는 먼저 이 Graph를 두 개의 큰 틀로 나누었다.
Identifier는 음~즉 변수 이름의 규정입니다.
예를 들면 다음과 같습니다.
경계 1: A, A,A、_9
프레임 2의 5:A,A、_9
경계 2의 6:A1,_9A
프레임 2의 7: 그리고 Letter, Digit를 더하면 5로 돌아갈 수 있습니다.
프레임 2의 8: 선언 끝
A、A1、_A、_9、AB,ABC,_9A,_9_A...이러한 변수 이름이 적용됩니다.
○예약어는 당연히 사용할 수 없다.
변수 정의
기본 형식은 간단합니다. 변수 설명 이후에만 데이터 형식을 정의합니다.
MyReal:REAL;
MyBOOL:BOOL;
MyInt:INT:=100;
UDT(User defined Type)
구조는 다음과 같은 세 곳에서 정의할 수 있다.
INTERFACE
TYPE
bRun :BOOL;
bCmdSet :ARRAY[0..100]OF BOOL;
sDrive :STRUCT
ActSpeed :REAL;
SetSpeed :REAL;
ActPos :REAL;
SetPos :REAL;
END_STRUCT
END_TYPE
PROGRAM pou1;
END_INTERFACE
IMPLEMENTATION
VAR_GLOBAL
Drive1Run :bRun;
Drive1 :sDrive;
END_VAR
PROGRAM pou1
Drive1.SetSpeed :=100.0;
Drive1.SetPos :=50.0;
END_PROGRAM
END_IMPLEMENTATION
배열
MyVar1:ARRAY[0..10]OF INT;
MyRealArray:ARRAY[0..999]OF REAL;
CONSTANT 선언
VAR CONSTANT
VAR CONSTANT
PI :REAL:=3.1415;
BuzzerONTime :TIME:=TIME#1h1m1s;
Message :STRING[40]:='Something Wrong..';
TwoPI :REAL:=PI*2;
END_VAR
VAR GLOBAL CONSTANT
VAR_GLOBAL CONSTANT
RefSpeed :REAL:=1500.0;
RefCurrent :REAL:=14.5;
END_VAR
Statements
여기에 3가지 기본 기능을 설명한다.
제공 값(Value assignment)
//Real
r32Temp:=0.0;
r32Temp:=3.3;
//String
str40 :='Hello World!';
str40_1 :=str40;
byteValue:=str40[5];
str40[20]:=byteValue;
MyArray1:=MyArray2;
MyArray1[i]:=10;
MyArray[5]:=23;
struct1.element1:=TRUE;
struct1.element2:=3.92;
제어(제어)
IF
만약~이라면 이것을 해라, 그렇지 않으면 이렇다.
IF r32Temp > 0.0 THEN
str40:='r32Temp is >0';
ELSIF r32temp = 0.0 THEN
str40:='r32Temp is 0';
ELSE
str40:='r32Temp is <0';
END_IF;
Case
IF 문은 복잡한 조건을 조합하여 조건 분류를 할 수 있으며, 변수가 이 값에서 시작되면
그 가격부터 다른 처리를 한다면 CASE를 사용하는 것이 이해하기 쉽다.
Valus List
CASE i16Value OF
1:
speedSetPoint:=300.0;
2:
speedSetPoint:=600.0;
3..10:
speedSetPoint:=1500;
ELSE
speedSetPoint:=0.0;
;
END_CASE;
FOR Loop
FOR i16Value:=0 TO 10 DO
//
boolList[i16Value]:=FALSE;
END_FOR ;
FOR i16Value:=0 TO 2 DO
//
boolList[i16Value]:=FALSE;
END_FOR ;
FOR i16Value:=10 TO -2 DO
//
boolList[i16Value]:=FALSE;
END_FOR ;
WHILE Loop
여건이 생기기 전까지 LOOPING으로
주의해야 할 것은 LOOPING이 시작되기 전에 조건을 검사하는 것이다.
WHILE i16Value <=10 DO
boolList[i16Value]:=TRUE;
i16Value:=i16Value+1;
END_WHILE;
REPEAT
WHILE LOOP과 비슷하게 같은 조건이 성립될 때까지 LOOPING을 유지했다.
이곳은 WHHILE LOOP과 달리 LOOPING이 한 번 끝나고 조건을 점검한다.
최소한 한번 시행한다는 얘기다.
i16Value:=0;
REPEAT
boolList[i16Value]:=FALSE;
UNTIL i16Value=10
END_REPEAT;
FOR i16Value:=10 TO -2 DO
//
boolList[i16Value]:=FALSE;
IF bStopSw THEN
EXIT;
END_IF;
END_FOR ;
EXIT
LOOPING이 중도에 종료하고 싶을 때 사용합니다.FOR i16Value:=10 TO -2 DO
//
boolList[i16Value]:=FALSE;
IF bStopSw THEN
EXIT;
END_IF;
END_FOR ;
CONTINUE
LOOPING에서 조건이 있으면 프로그램을 실행하고 싶지 않지만, LOOPING은 계속 사용하고 싶을 때 사용한다.//if bStopSw is FALSE,i16sum=15
//if bStopSw is TRUE,i16sum=9
i16sum:=0;
FOR i:=0 TO 2 DO
FOR j:=0 TO 1 DO
i16sum:=i16sum+1;
IF bStopSw THEN
CONTINUE;
i16sum:=i16sum+1;
END_IF;
END_FOR;
i16sum:=i16sum+1;
END_FOR;
RETURN
RETURN 사용으로 LOOPING에서 멀어지는 것은 물론 프로그램이 종료된다.
따라서 아래의 예는 RETURN의 조건이 성립된 후 i16sum:=1999이다.프로그램을 더 이상 실행하지 않습니다.
Siemens의 STL "BEU"의 생각과 같으면 됩니다.FOR i16Value:=0 TO 10 DO
//
boolList[i16Value]:=FALSE;
IF bStopSw THEN
RETURN;
END_IF;
END_FOR ;
//This statement will not be execute if bStopSw is TRUE
i16sum:=1999;
WAITFORCONDITION
Motion Task에서 활동 대기 중조건이 TRUE가 되기 전에 프로그램 실행이 지연됩니다.
WITH 이후의 Expression에는 다음 두 가지 상태만 표시됩니다.
//Real
r32Temp:=0.0;
r32Temp:=3.3;
//String
str40 :='Hello World!';
str40_1 :=str40;
byteValue:=str40[5];
str40[20]:=byteValue;
MyArray1:=MyArray2;
MyArray1[i]:=10;
MyArray[5]:=23;
struct1.element1:=TRUE;
struct1.element2:=3.92;
IF r32Temp > 0.0 THEN
str40:='r32Temp is >0';
ELSIF r32temp = 0.0 THEN
str40:='r32Temp is 0';
ELSE
str40:='r32Temp is <0';
END_IF;
CASE i16Value OF
1:
speedSetPoint:=300.0;
2:
speedSetPoint:=600.0;
3..10:
speedSetPoint:=1500;
ELSE
speedSetPoint:=0.0;
;
END_CASE;
FOR i16Value:=0 TO 10 DO
//
boolList[i16Value]:=FALSE;
END_FOR ;
FOR i16Value:=0 TO 2 DO
//
boolList[i16Value]:=FALSE;
END_FOR ;
FOR i16Value:=10 TO -2 DO
//
boolList[i16Value]:=FALSE;
END_FOR ;
WHILE i16Value <=10 DO
boolList[i16Value]:=TRUE;
i16Value:=i16Value+1;
END_WHILE;
i16Value:=0;
REPEAT
boolList[i16Value]:=FALSE;
UNTIL i16Value=10
END_REPEAT;
FOR i16Value:=10 TO -2 DO
//
boolList[i16Value]:=FALSE;
IF bStopSw THEN
EXIT;
END_IF;
END_FOR ;
FOR i16Value:=10 TO -2 DO
//
boolList[i16Value]:=FALSE;
IF bStopSw THEN
EXIT;
END_IF;
END_FOR ;
//if bStopSw is FALSE,i16sum=15
//if bStopSw is TRUE,i16sum=9
i16sum:=0;
FOR i:=0 TO 2 DO
FOR j:=0 TO 1 DO
i16sum:=i16sum+1;
IF bStopSw THEN
CONTINUE;
i16sum:=i16sum+1;
END_IF;
END_FOR;
i16sum:=i16sum+1;
END_FOR;
FOR i16Value:=0 TO 10 DO
//
boolList[i16Value]:=FALSE;
IF bStopSw THEN
RETURN;
END_IF;
END_FOR ;
//This statement will not be execute if bStopSw is TRUE
i16sum:=1999;
Expression
IMPLEMENTATION
EXPRESSION TriggerSensor
TriggerSensor:=%I10.0;
END_EXPRESSION
PROGRAM pou1
WAITFORCONDITION TriggerSensor WITH TRUE DO
%Q10.0:=TRUE;
;
END_WAITFORCONDITION;
;
END_PROGRAM
END_IMPLEMENTATION
GOTO
대체로 사용할 수 있다.POU에서 좋아하는 곳으로 날아갈 수 있어요.
Manual도 특수한 상황에서만 GOTO를 사용합니다.예를 들어, Troubleshooting은 구조 프로그램에 사용할 수 없습니다.
Comments
LineComment 및 BlockComment 가 있습니다.
//This is a line comment
a:=0;
(*
This is a Block comment
TEXTTEXTTEXTTEXTTEXT
*)
b:=0
인스턴스
앞의 글에는 인터페이스, PROGRAM 등 다양한 엉뚱한 단어들이 등장했으니 여기서 잠시 무시하자.
나는 다음 입문2에서 이런 뜻을 설명하고 싶다.
TIA SIMOTION
먼저 TIA로 D445 1개를 추가합니다.
Project>Oepn SIMOTION Configuration.
PLC_1>PROGRAMS>Insert ST source file 을 클릭합니다.
ST 소스의 이름을 입력하고 OK 를 클릭합니다.
이런 화면이 나올 거예요.
TIA는 GXWORKS와 조금 다르기 때문에 여기에 특별히 쓰지 않습니다.
그럼 프로그램과 Function을 하나 쓰라고 가정해 보세요.
Program에는 MyPB와 MyVariable 두 변수가 있는데, MyPB가 ON이면 MyVariable에 10을 쓴다.MyPB가 OFF인 경우 MyVariable에 0을 씁니다.간단명료하다.
Function에는 정수 매개변수가 있으며, Function 내에서 정수를 실수로 변환한 다음 제곱을 *3.14로 반환합니다.
먼저 INTERRACE에서 그 프로그램과 Function을 정의합니다.
fcCal 및 myPou1 을 정의합니다.
다음은 IMPLENTATION에서 프로그램을 작성합니다.
이것은 fccal의 내용입니다.
이것은 myPou1입니다.
여러분 PROGRAM이에요?FUNCTION?아마도 각양각색의 의문이 나타날 것이다. 그러나 나는 다음에 이런 생각을 쓰기 시작할 것이라고 생각한다.그럼, 수고하셨습니다!
기사도 여기에 실렸다.
http://soup01.com/ja/2020/05/09/simotion-structuredtext-1/
Reference
이 문제에 관하여(PLC#ST(Structured Text) 엔트리1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soup01/items/aee7799827590fed1737
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(PLC#ST(Structured Text) 엔트리1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/soup01/items/aee7799827590fed1737텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)