PLC 프로그램 구조란?|Main·Function·Function Block 이해하기
PLC 프로그램 구조란 제어 로직을 Main·Function·Function Block 등으로 구분해 체계적으로 실행하고 관리하는 방식입니다. 각 프로그램 단위의 역할과 차이를 알아봅니다.
PLC 프로그램 구조란 무엇이며 왜 나눠서 작성할까?
PLC 프로그램 구조는 자동화설비의 Control Logic을 기능과 역할에 따라 여러 Program Unit으로 나누어 작성하고 실행하는 방식을 의미합니다. 소규모 설비에서는 모든 Ladder Logic을 하나의 Main Program에 작성할 수도 있지만 설비가 복잡해지면 Motor, Cylinder, Alarm, Communication과 Sequence Logic이 수천 줄 이상으로 늘어날 수 있습니다. 이때 모든 Logic을 한곳에 작성하면 수정할 부분을 찾기 어렵고 동일한 기능이 반복되어 Maintenance 효율도 떨어집니다. 그래서 PLC Programming에서는 Main Program을 중심으로 Function과 Function Block 등을 이용하여 Logic을 기능별로 Modularization합니다. IEC 61131-3 계열의 개념에서는 Program, Function, Function Block 같은 Program Organization Unit을 활용할 수 있으며 실제 명칭과 호출방식은 PLC 제조사와 Programming Environment에 따라 달라질 수 있습니다. 구조화된 프로그램은 단순히 보기 좋게 만드는 것이 아니라 Logic의 재사용성과 Troubleshooting, 설비 확장 및 여러 개발자가 함께 작업할 때의 유지보수성을 높이는 중요한 Software Design 방법입니다.
Main Program은 PLC에서 어떤 역할을 할까?
Main Program은 PLC가 정상적인 Cyclic Scan을 수행할 때 전체 제어흐름을 구성하는 중심 Program으로 이해할 수 있습니다. PLC는 일반적으로 Input 상태를 읽고 사용자 Program을 실행한 뒤 Output을 갱신하는 Scan Cycle을 반복하며 Main에서는 필요한 Function이나 Function Block을 정해진 순서에 따라 호출할 수 있습니다. 예를 들어 Main에서 Safety·Interlock 상태 확인, Auto Sequence, Manual Control, Alarm Processing과 Communication 관련 Program을 순서대로 실행하도록 구성할 수 있습니다. 중요한 점은 PLC마다 Program Execution Model이 동일하지 않다는 것입니다. 어떤 PLC는 Main Routine에서 Subroutine을 호출하고, 다른 System은 여러 Program이나 Task를 Cyclic Task에 등록하여 실행합니다. 또한 Periodic Task와 Event·Interrupt Task처럼 Main Scan과 다른 주기로 실행되는 구조도 존재합니다. 따라서 Main이라는 명칭 자체보다 어떤 Task에서 어떤 Program이 어느 순서와 주기로 실행되는지 파악하는 것이 중요합니다. 실행순서를 명확하게 설계하면 동일한 Variable이나 Output을 여러 Logic에서 중복으로 제어하는 문제도 줄일 수 있습니다.
Function은 어떤 작업을 모듈화할 때 사용할까?
Function은 반복적으로 필요한 Calculation이나 Data Processing Logic을 하나의 독립적인 Program Unit으로 만들어 재사용하는 데 적합합니다. 예를 들어 섭씨와 화씨 변환, Analog Scaling, 거리계산, 단위변환 또는 여러 조건을 이용한 판정 Logic을 Function으로 구성할 수 있습니다. IEC 61131-3의 일반적인 개념에서 Function은 Input을 받아 연산한 뒤 Result를 반환하며 동일한 Input에 대해 동일한 연산결과를 제공하도록 상태를 내부에 지속적으로 보관하지 않는 형태에 적합합니다. 예를 들어 ScaledValue = Scaling(RawValue)와 같이 여러 Sensor Channel에서 동일한 Function을 반복 호출할 수 있습니다. 이렇게 하면 같은 Calculation Logic을 여러 곳에 복사하지 않아도 되므로 수정이 필요할 때 한곳만 변경할 수 있습니다. 다만 PLC 제조사에 따라 Function의 Local Variable, Static Data와 호출규칙이 다를 수 있으므로 해당 Programming Manual을 확인해야 합니다. 핵심은 Function을 특정 장비의 장기적인 상태관리보다는 입력값을 처리하여 결과를 만드는 재사용 가능한 Logic 단위로 활용하는 것입니다.
Function Block은 Function과 무엇이 다를까?
Function Block, 즉 FB는 Function과 마찬가지로 Logic을 Module화하지만 내부 State를 Instance별로 유지할 수 있다는 점이 중요한 차이입니다. 예를 들어 Motor Control FB를 만들고 Start, Stop, Interlock와 Fault를 Input으로 받아 Run Command, Running Status와 Alarm을 Output으로 구성할 수 있습니다. Motor가 20대라면 같은 FB Logic을 20번 복사하는 대신 하나의 Motor FB를 만들고 Motor별 Instance를 생성하여 사용할 수 있습니다. 각 Instance에는 해당 Motor의 Timer, Previous State, Alarm State 등 독립적인 Internal Data가 유지됩니다. Timer와 Counter처럼 이전 Scan의 상태가 다음 Scan에서도 필요한 기능은 이러한 Stateful 구조와 잘 맞습니다. 반면 단순한 수학연산처럼 상태를 기억할 필요가 없는 작업에는 Function이 더 적합할 수 있습니다. 제조사에 따라 FB Instance를 Instance DB, Tag Structure 또는 별도의 Memory 영역과 연결하기도 합니다. 따라서 Function Block은 동일한 장비나 제어기능을 반복적으로 사용하는 자동화설비에서 Object-oriented Design과 유사한 방식으로 Logic과 Data를 묶어 관리하는 데 유용합니다.
Main·Function·Function Block은 어떻게 구성하는 것이 좋을까?
효율적인 PLC Program에서는 Main에 모든 세부 Logic을 직접 작성하기보다 전체 실행흐름을 쉽게 파악할 수 있도록 구성하는 것이 좋습니다. Main에서는 설비의 주요 Module을 호출하고 실제 Motor, Valve, Cylinder, Analog Processing과 Alarm Logic은 각각 Function이나 Function Block으로 분리할 수 있습니다. 예를 들어 Analog Scaling처럼 상태가 필요 없는 Calculation은 Function으로 만들고 Motor나 Valve처럼 운전상태를 지속적으로 기억해야 하는 Equipment Logic은 FB와 Instance로 구성할 수 있습니다. 하지만 지나치게 작은 Logic까지 모두 별도의 Block으로 분리하면 호출관계가 복잡해져 오히려 Troubleshooting이 어려워질 수 있습니다. 따라서 설비기능, 재사용 가능성, Data Ownership과 Maintenance 단위를 기준으로 적절한 Module 크기를 결정해야 합니다. 또한 Block Name과 Variable Name을 일관된 Naming Convention으로 작성하고 Input·Output Interface를 명확하게 정의하면 다른 개발자도 Program Structure를 빠르게 이해할 수 있습니다. 결국 좋은 PLC 프로그램 구조는 Main이 전체 흐름을 관리하고 Function과 Function Block이 세부기능을 담당하도록 역할을 분리하여 복잡한 자동화 Logic을 읽기 쉽고 재사용 가능한 형태로 만드는 것입니다.




댓글 0
첫 댓글을 남겨보세요.