[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 프로그램을 작성할 수 있습니다. 😊

댓글

이 블로그의 인기 게시물

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

[PLC] PLC 아날로그 입출력 기본

제너 다이오드에 저항을 연결하는 이유

[농사] 실내 식물 재배 조명, 어떤 걸 선택해야 할까?

공압 속도 제어: 미터인 vs 미터아웃

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

[스마트팜] 아쿠아포닉스에서 pH 제어를 자동화해보자! (Python 활용)

커패시터에 저장된 에너지 계산

[PLC] 릴레이와 전자 접촉기 (MC)

[아두이노] 74HC595 시프트 레지스터 연동