[PLC] PLC 프로그래밍에서 활용할 수 있는 디자인 패턴 정리
PLC(Programmable Logic Controller)는 산업 자동화에서 중요한 역할을 하며, 효율적이고 유지보수하기 쉬운 코드를 작성하려면 디자인 패턴을 활용하는 것이 필수적입니다. 이번 글에서는 Mitsubishi MELSEC-Q 시리즈와 Keyence KV 시리즈 등 다양한 PLC 환경에서 적용할 수 있는 디자인 패턴을 정리해보겠습니다.
1️⃣ 상태 기계 패턴 (State Machine Pattern)
✅ 적용 사례:
-
공장 자동화 시스템에서 여러 동작 상태(대기, 시작, 실행, 정지 등)를 관리할 때
-
컨베이어, 로봇 팔, 어셈블리 라인 등 순차적인 작업이 필요한 경우
🛠 구현 방식:
-
각 상태를 별도의 래더 다이어그램 블록(STD, SFC) 또는 Structured Text(ST)로 구현
-
트랜지션(상태 전이)을 명확히 정의하여 이벤트 기반으로 상태 전환 수행
-
Mitsubishi의 SFC (Sequential Function Chart) 활용 가능
2️⃣ 싱글톤 패턴 (Singleton Pattern)
✅ 적용 사례:
-
PLC 내부에서 단 하나만 존재해야 하는 데이터 저장소 (예: 설정 값, 네트워크 매개변수, 센서 캘리브레이션 값 등)
-
HMI(터치스크린)와 공유하는 전역 변수 관리
🛠 구현 방식:
-
D 레지스터(DM) 또는 M 비트를 사용하여 전역 데이터 영역을 할당
-
해당 데이터에 접근하는 함수(FC, FB)를 만들어 불필요한 중복 선언을 방지
-
Mitsubishi Q 시리즈에서는 Global Label을 활용하면 효과적
3️⃣ 옵저버 패턴 (Observer Pattern)
✅ 적용 사례:
-
센서 데이터가 변경될 때마다 여러 개의 액추에이터(모터, 솔레노이드 등)가 반응해야 하는 경우
-
HMI의 입력값이 변경되면 여러 장치가 영향을 받아야 할 때
🛠 구현 방식:
-
M 비트 또는 D 레지스터의 값이 변경될 때, 여러 FB(Function Block)에서 이를 참조하여 작동하도록 구현
-
이벤트 기반 인터럽트(Interrupt Task) 사용
4️⃣ 명령 패턴 (Command Pattern)
✅ 적용 사례:
-
작업 스케줄링: 예를 들어, 로봇이 A → B → C로 이동하는 순차적인 명령을 수행해야 할 때
-
HMI에서 버튼을 눌렀을 때 특정 작업을 수행하는 명령을 관리하는 경우
🛠 구현 방식:
-
명령을 D 레지스터 배열에 저장하고, 실행할 명령을 큐(Queue) 형태로 관리
-
명령을 실행할 때마다 상태 플래그를 업데이트하고, 완료되면 다음 명령으로 진행
5️⃣ 팩토리 패턴 (Factory Pattern)
✅ 적용 사례:
-
다양한 생산 공정(예: 서로 다른 제품 조립 공정)을 하나의 코드 구조로 통합할 때
-
여러 유형의 모터, 밸브, 컨베이어를 공통적인 방식으로 제어할 때
🛠 구현 방식:
-
D 레지스터 값에 따라 FB를 동적으로 호출하여 다른 프로세스를 실행
-
PLC 프로그램에서 제품 유형별로 동작을 다르게 설정하는 경우 사용 가능
6️⃣ 템플릿 메서드 패턴 (Template Method Pattern)
✅ 적용 사례:
-
공통된 로직을 여러 개의 장비에서 공유할 때
-
예를 들어, 여러 종류의 컨베이어가 존재하지만, 속도 조절, 정지, 시작 로직은 공통적일 때
🛠 구현 방식:
-
공통 기능을 FB(Function Block)으로 구현하고, 특정 동작만 개별 오버라이드(Override) 가능하도록 설계
-
Keyence KV 시리즈에서는 User Function을 활용하면 깔끔하게 구현 가능
7️⃣ 데코레이터 패턴 (Decorator Pattern)
✅ 적용 사례:
-
기본 동작에 추가적인 기능을 쉽게 덧붙여야 할 때 (예: 기본 모터 동작에 로그 기능 추가)
-
PLC에서 로깅이나 상태 모니터링을 동적으로 추가해야 할 때
🛠 구현 방식:
-
기본 동작을 수행하는 FB에 추가적인 FB(로깅, 모니터링 등)를 결합하는 방식으로 구현
-
FB의 인자로 추가 기능을 설정할 수 있도록 설계
🔥 결론
PLC 프로그래밍에서도 객체지향적인 사고를 적용할 수 있으며, 유지보수성과 확장성을 높이려면 디자인 패턴을 활용하는 것이 중요합니다. 특히 State Machine, Singleton, Observer, Command 패턴은 PLC에서 가장 많이 사용됩니다. 어떤 패턴이든 Structured Text (ST)나 래더 로직에서 재사용이 가능하도록 모듈화하는 것이 핵심입니다.
PLC ST(Language) 기반 디자인 패턴 예제 모음
PLC 프로그래밍에서 Structured Text(ST) 언어를 활용하여 디자인 패턴을 적용하는 방법을 살펴보겠습니다. Mitsubishi MELSEC-Q, Keyence KV 시리즈 등 다양한 PLC 환경에서도 응용할 수 있습니다.
1️⃣ 상태 기계 패턴 (State Machine Pattern)
✅ 적용 사례:
-
공장 자동화의 여러 상태(대기, 동작, 정지 등)를 관리
-
컨베이어 시스템 또는 로봇 팔 제어
🛠 ST 코드 예제:
PROGRAM StateMachine
VAR
currentState : INT := 0; (* 0: 대기, 1: 실행, 2: 정지 *)
startButton : BOOL;
stopButton : BOOL;
END_VAR
CASE currentState OF
0: (* 대기 상태 *)
IF startButton THEN
currentState := 1;
END_IF;
1: (* 실행 상태 *)
IF stopButton THEN
currentState := 2;
END_IF;
2: (* 정지 상태 *)
currentState := 0; (* 리셋 *)
END_CASE;
END_PROGRAM
2️⃣ 싱글톤 패턴 (Singleton Pattern)
✅ 적용 사례:
-
전역적으로 단 하나의 데이터 블록을 유지할 때
-
설정값을 중앙에서 관리할 때
🛠 ST 코드 예제:
FUNCTION_BLOCK SingletonConfig
VAR
instance : POINTER TO SingletonConfig;
END_VAR
IF instance = NULL THEN
instance := ADR(SingletonConfig);
END_IF;
RETURN instance;
END_FUNCTION_BLOCK
3️⃣ 옵저버 패턴 (Observer Pattern)
✅ 적용 사례:
-
센서 값 변경 시 여러 장치에 알림을 보낼 때
🛠 ST 코드 예제:
PROGRAM ObserverPattern
VAR
SensorValue : INT;
Motor1, Motor2 : BOOL;
END_VAR
IF SensorValue > 100 THEN
Motor1 := TRUE;
Motor2 := TRUE;
ELSE
Motor1 := FALSE;
Motor2 := FALSE;
END_IF;
END_PROGRAM
4️⃣ 명령 패턴 (Command Pattern)
✅ 적용 사례:
-
여러 단계의 명령을 저장하고 실행할 때
🛠 ST 코드 예제:
FUNCTION_BLOCK Command
VAR
CommandQueue : ARRAY[0..9] OF INT;
CurrentCommand : INT := 0;
END_VAR
IF CommandQueue[CurrentCommand] <> 0 THEN
ExecuteCommand(CommandQueue[CurrentCommand]);
CurrentCommand := CurrentCommand + 1;
END_IF;
END_FUNCTION_BLOCK
5️⃣ 팩토리 패턴 (Factory Pattern)
✅ 적용 사례:
-
서로 다른 장비 유형을 하나의 코드에서 처리할 때
🛠 ST 코드 예제:
FUNCTION_BLOCK MotorFactory
VAR_INPUT
MotorType : INT; (* 1: Servo, 2: Stepper *)
END_VAR
VAR_OUTPUT
Motor : POINTER TO MotorBase;
END_VAR
CASE MotorType OF
1: Motor := ADR(ServoMotor);
2: Motor := ADR(StepperMotor);
END_CASE;
END_FUNCTION_BLOCK
6️⃣ 템플릿 메서드 패턴 (Template Method Pattern)
✅ 적용 사례:
-
기본 로직을 공유하고 특정 동작만 변경할 때
🛠 ST 코드 예제:
FUNCTION_BLOCK ConveyorBase
METHOD MoveConveyor
ConveyorStart();
SpecificProcess();
ConveyorStop();
END_METHOD
END_FUNCTION_BLOCK
FUNCTION_BLOCK CustomConveyor EXTENDS ConveyorBase
METHOD SpecificProcess
ProcessA();
END_METHOD
END_FUNCTION_BLOCK
7️⃣ 데코레이터 패턴 (Decorator Pattern)
✅ 적용 사례:
-
기존 기능에 로깅, 모니터링 추가
🛠 ST 코드 예제:
FUNCTION_BLOCK MotorDecorator
VAR_INPUT
Motor : POINTER TO MotorBase;
END_VAR
METHOD Start
Log("Motor Start");
Motor^.Start();
END_METHOD
END_FUNCTION_BLOCK
🔥 결론
Structured Text(ST) 언어를 활용하면 디자인 패턴을 효과적으로 적용할 수 있습니다. 유지보수성과 확장성을 고려할 때 이러한 패턴들을 적절히 조합하여 사용하면 더욱 안정적인 PLC 프로그램을 작성할 수 있습니다. 😊
댓글
댓글 쓰기