PLC 프로그램을 사용하면 주로 LD, 펑션블록등을 자주 사용하게된다. LD, FBD등은 그래픽적으로, 시각적으로 보기가 쉽게되어있다. 그와 상반되게 ST언어는 텍스트로서 로직을 만들게 된다. 여기서는 기본적인 ST언어를 쓰는 방법을 알아보았다. 이 코드는 CODESYS를 기반으로 작성되었다.
IF 사용이 ST언어의 기본
첫번째, ST언어에서 변수를 텍스트로 먼저 만들어준다. 그리고나서 IF THEN 구조를 이용해서 접점을 켜고 끄게된다.
위 예시에서는 PUSH 버튼과, 센서 둘중 하나라도 켜지면, 모터가 켜진다 라는 간단한 로직을 만들었다.
여기서, OR를 이용하면, 둘중하나라도 참일시 라는뜻이다.
PROGRAM STBasic
VAR
Pushbtn:BOOL;
Motor:BOOL;
Sensor:BOOL;
END_VAR
IF Pushbtn = 1 OR Sensor = 1 THEN
Motor:=1;
ELSE
Motor:=0;
END_IF
논리연산자 사용
PROGRAM ST_LogicAndArray
VAR
Pushbtn1 :BOOL;
Pushbtn2 :BOOL;
OutputOrGate:BOOL;
FaultAlert:BOOL;
NoFault:BOOL;
Motor:BOOL;
END_VAR
//1. First Code ( it is Too simple... but might be hard to read and understand)
//IF (((Pushbtn1 = 1) OR (Pushbtn2 =1)) AND FaultAlert =1) THEN
// Motor:=1;
//ELSE
// Motor:=0;
//END_IF
//2. Second Code. This code is more looks like Modules. So easy to read, but kind of long
IF (Pushbtn1 =1 OR Pushbtn2 =1) THEN
OutputOrgate :=1;
ELSE
OutputOrgate :=0;
END_IF
IF FaultAlert =1 THEN
NoFault :=0;
ELSE
NoFault :=1;
END_IF
IF (OutputOrgate = 1 AND NoFault=1) THEN
Motor :=1;
ELSE
Motor:=0;
END_IF
///In conclusion, St is great, but you don't need to use ST for this kind of simple code. Just use FBD or LD
두번째 코드는 더 다양한 논리 연산자를 사용해보았다. AND와 OR 두가지를 사용하였고, 이 논리연산자를 사용할때 마다 괄호를 활용하였다. 그이유는 나중에 코드를 읽기 쉽게 하기위해서 이고, 변수를 헷갈리게 하지 않기 위함이다. 그리고 코드를 찬찬히 읽다보면 알겠지만, 논리연산자는 3개의 연산도 가능하다. 3개의 연산을 동시에하면 코드가 짧아지는 효과는 있지만, 코드를 이해하기 어려울 가능성이있다. 그래서 두개의 변수만을 사용하는 코드도있다. 이는 코드가 더 모듈(구조적) 으로 보이는 효과가있다. 마치 두개의 입력만 가진 논리게이트만 사용하는것과 비슷하다고 볼수있겠다.
배열사용
세번째 코드는 배열을 이용해보았다. 배열을 이용하면, 수많은 변수를 한꺼번에 선언할수있는 효과가있고, 관리가 쉬워진다. 아래는 모터가 5개가 있다고 가정하고 만든 코드이다. 변수를 지정할때 동시에 5개씩 선언하였고, 변수선언 코드 아래에서는 배열안의 4번째 변수를 꺼내서 사용하고있다. 만약 배열을 사용하지 않았다면, 변수지정시 5줄씩 사용해야했을것이다.
PROGRAM ST_LogicAndArray
VAR
/////////Array Part
MotorOverloadAlarms : ARRAY[1..5] OF BOOL; // 배열의 크기는 1부터 5이고 불리안이다.
MotorOverCurrentAlarms : ARRAY[1..5] OF BOOL;
MotorStartPB : ARRAY[1..5] OF BOOL;
MotorStopPB : ARRAY[1..5] OF BOOL;
MotorRelay : ARRAY[1..5] OF BOOL;
END_VAR
///ARRAY ///
IF MotorStartPB[4] = 1 THEN /4번째 모터 PUSH버튼을 누르면
MotorRelay[4] :=1; / 4번째 모터 릴레이가 ONE된다
ELSIF MotorStopPB[4] =1 OR MotorOverloadAlarms[4] =1 OR MotorOverCurrentAlarms[4]=1 THEN
MotorRelay[4] :=0;
END_IF
///////////////////////// In conclusion, I can say Array makes us help manage many variable.
DUT(DATA UNIT TYPE)
5번째는 DUT를 직접 만드는방식이다. 이를 사용하면 Array보다 더욱 변수를 구조적으로 만들수있다. Array는 여러개의 변수를 만들때 하나의 데이터 타입만 선언할수있는것과 달리, DUT를 이용하면, 여러개의 데이터 타입을 한꺼 번에 만들수있다. 한마디로 다시말하자면, 데이터 타입자체를 새로 만드는거라 할수있겠다. 무슨소린지 모르겠다면 그냥 아래 코드를 보자.
먼저 새로운 DUT를 추가해줘야한다. Application에 커서를 가져가서 우클릭수 개체를 추가한다.
///Structure///
TYPE Pump :
STRUCT
Manual_Start:BOOL;
Auto_Start:BOOL;
Coil : BOOL;
AutomaticManual : BOOL;
EMGC : BOOL;
Overload : BOOL;
Stop : BOOL;
PresSensor : INT;
Pressure_preset : INT;
LevelSensor : INT;
Level_preset : INT;
END_STRUCT
END_TYPE
먼저 위 코드에서 Pump라는 데이터 타입을 만들어버린다. 그리고 이 구조안에는 어떤 변수와 그 변수들의 데이터 타입까지 정해준다.
위에서 pump라는 타입의 데이터 유닛을 만들고, 이를 변수선언시 활용하면, 코드작성이 훨씬 원활해진다.
아래 예시에서 Pump1, Pump2라는 변수를 선언하고, 데이터 타입을 아까 생성한 Pump라고 등록해준다.
심지어 여기서 Array까지 합쳐서 사용한다면, 정말 깔끔하게 데이터 타입을 구조적으로 정리할수있다.
아래 코드에서는 Pumps라는 변수를 배열로 10개, Pump라는 데이터 타입으로 선언되었다.
PROGRAM ST_Structure
VAR
//Pump1 : Pump; //데이터 타입을 Pump로 정한다.
//Pump2 : Pump;
Pumps : ARRAY[1..10] OF Pump;
//Pumps에 10개의 Pump 데이터타입를 선언한다.
// Pumps[1]~Pumps[10]까지의 변수가 Pump라는 데이터 타입으로 선언이 되었다.
END_VAR
//IF Pump1.Manual_Start = 1 THEN
// Pump1.Coil :=1;
//ELSIF (Pump1.Stop = 1) OR (Pump1.EMGC=1)THEN
// Pump1.Coil := 0;
//END_IF
//IF Pump2.Manual_Start = 1 OR (Pump2.EMGC=1)THEN
// Pump2.Coil :=1;
//ELSIF Pump2.Stop = 1THEN
// Pump2.Coil := 0;
//END_IF
IF Pumps[1].Manual_Start = 1 THEN
Pumps[1].Coil := 1;
ELSIF Pumps[1].Stop = 1 OR Pumps[1].EMGC = 1 THEN
Pumps[1].Coil := 0;
END_IF
이렇게하면, 변수 Pump[2]을 쓰고나서 dot (.) 를 누르면 해당 데이터 타입 아래에있는 각종변수들이 float되면서 이를 즉시 사용할수있게된다. 이로써 변수를 더욱쉽게 사용할수있게되었다.
'전기기사 > PLC' 카테고리의 다른 글
CODESYS CFC 프로그램의 예시 (0) | 2024.11.17 |
---|---|
Rslogix emulate500 설정 후 사용해보기 (0) | 2024.11.16 |
Rs Logix plc 프로그램 다운로드 방법 (0) | 2024.11.16 |
PLC 기본 탱크로직을 짜보자 (0) | 2024.07.28 |
PLC MAUNAL(HAND), OFF, AUTO 프로그램으로 블로어 제어 (0) | 2024.07.28 |
댓글