Skip to main content

자동화를 위한 코딩: PLC 프로그래밍

글/마이클 파크스(Michael Parks, P.E.), 마우저 일렉트로닉스

 

PLC(programmable logic controller)의 역사는 정보 혁명과 융합된 산업 혁명의 일부이다. 1910년대 초 이동식 조립 라인이 처음 등장한 이후, 제조 과정을 빠르고 안정적이며 지속적으로 반복 가능한 방식으로 만드는 것이 꾸준히 요구되었다. 1차 산업 혁명기의 공장들은 대량 생산 문제를 해결하기 위해 순전히 기계 및 전기 동력에 의존했었다. 이는 조립 라인을 자주 재구성하지 않는 한 잘 작동했다. 그러나 1960년대에 들어서면서 자동차 산업은 차량 모델이 새롭게 바뀔 때마다 조립 라인을 재구성할 필요가 있었는데, 이는 기술자들이 센서와 솔레노이드를 일일이 손으로 다시 배선해야 하는 번거로운 작업을 요구했다.

같은 시기, 초기 컴퓨터 산업은 물리적으로 견고하고 비용 효율적인 솔루션을 제공할 만큼 성숙해졌다. 자동차 제조사들은 현대식 PLC에 하드웨어 전구체를 설치하기 시작했고, 조립 라인을 완전히 재배선하는 대신 새로운 코드를 업로드하는 것으로 제조 공정을 변경하는 것이 가능해졌다.

이번 글에서는 국제 표준 IEC 61131-3에 의해 정의된 최신 PLC 프로그래밍의 다양한 옵션들을 살펴보고자 한다. 그러나 모든 PLC 제조사들은 특정 하드웨어를 프로그래밍하기 위한 소프트웨어를 제공하므로 코딩 기법은 제조사마다 다소 차이가 있을 수 있다.

  

자동화 기술의 초기 프로그래밍

 

PLC의 전신에 해당하는 다양한 기계, 전기, 전자 제어 시스템과 공압 그리고 유압 제어 시스템은 초기에는 잘 작동했지만, 한 가지 심각한 결점이 있었다. 이를 다시 프로그래밍하려면 어셈블리(Assembly) 또는 포트란(Fortran) 같은 프로그래밍 언어에 대한 지식이 필요했다. 하지만 유지보수 및 업데이트 작업을 담당하는 전기 및 기계 기술자들은 프로그래머가 아니었다. 대신 그들은 ‘래더 로직(Ladder Logic)’이라는 언어를 사용했다. 전자공학 엔지니어들은 제도판으로 다시 돌아가 오늘날 우리가 PLC라고 부르는 1세대 프로그래밍 언어를 개발했다. 그 후 몇 십 년 동안 추가적인 프로그래밍 방법이 도입되었지만, 오늘날까지도 이 래더 로직은 산업계에서 독보적인 프로그래밍 방법으로 남아 있다.
  

래더 로직 

  

처음에 래더 로직은 제조 및 공정 제어에 사용되는 릴레이 랙의 설계와 구성을 시각적으로 문서화하기 위해 작성되었다(그림 1). 이는 릴레이 로직 하드웨어의 개략적인 다이어그램과 유사하다. 래더 다이어그램은 두 개의 수직선 그려진 전원 레일로 시작한다. 이 전원 레일 사이의 수평선, 즉 렁(rung)은 상수 논리 연산(atomic logical operation)을 나타낸다. 입력 부호(접점(contact)이라고도 함)는 센서, 스위치, 푸시 버튼을 나타내며 각 렁의 왼쪽과 중앙에 배치된다. 반면 출력(코일(coil)이라고도 함)은 모터, 릴레이, 표시등, 사이렌 등을 나타내며 렁의 오른쪽에 배치된다. 시스템의 제어 로직은 접점과 코일을 배열하여 입력과 출력 간의 논리적 관계(예: AND, OR, NOT)를 생성함으로써 구현된다.

  

AR(자동화)-1.jpg
[그림 1] 래더 로직 다이어그램의 예 (출처: Green Shoe Garage)

  

일반적인 두 가지 입력 논리 기호로는 ‘Examine On (EON, 때때로 ‘Examine if Closed’ 또는 ‘XIC’로도 불림)’과 ‘Examine Off(EOF, 또는 “Examine if Open” 또는 ‘XIO’)’를 들 수 있다. EON은 평상시 열린 접점이나 버퍼를 나타낼 수 있다. 반대로, EOF는 평상시 닫힌 접점이나 인버터를 나타낼 수 있다. 마지막으로, 출력 논리 기호는 출력 활성화(OUT, 그림 2)라고 한다. 이는 출력 코일이 제어하는 출력 장치에 전원을 공급하는 것을 의미한다.

 

 

AR(자동화)-2.jpg
[그림 2] 일반적인 래더 로직 기호. 왼쪽부터 examine On(EON), examine Off(EOF), 출력 활성화(OUT). (자료 출처: Green Shoe Garage)

  

병렬로 구성할 경우, 입력은 논리식 OR과 같은 방식으로 배열된다. 반대로 직렬로 배열할 경우, 입력은 AND 관계를 형성한다. 또 한 가지 명심할 점은 각 출력의 상태를 제어하는 입력 시퀀스가 하나만 있도록 하기 위해 래더 다이어그램에서 출력은 한 번만 나타나야 한다는 것이다. 

  

PLC는 프로그램 스캔 주기(program scan cycle)라는 방식으로 작동하며, 프로그램을 반복적으로 실행한다. 평균적으로, PLC가 모든 입력을 명령과 비교하고 현재의 기계 상태를 반영하도록 출력을 변경하는 데는 수십 밀리초(millisecond)가 걸린다. 통상적으로 제어 프로그램의 래더 로직은 왼쪽에서 오른쪽으로, 위에서 아래로 읽는다. 스캔 주기는 대체로 다음과 같은 흐름을 따른다:

1. 입력 읽기

2. 프로그램 실행

3. 출력 비트 쓰기

래더 로직 프로그래밍을 위한 몇 가지 최종 규칙: 

• 래더 로직 코드의 체계적 정리: 래더 로직 코드는 논리적으로 따라가기 쉽게 정리해야 한다. 또한 관련 기능을 함께 그룹화하고, 서브루틴을 사용하여 코드를 모듈화한다.

• 렁 크기 제한: 지나치게 큰 렁들은 문제 해결을 어렵게 만들 가능성이 있기 때문에 크기를 제한한다. 또한 복잡한 논리를 더 작고 관리하기 쉬운 단계로 세분화한다.

• PLC 소프트웨어에 비상 정지 프로그래밍 금지: 센서 고장과 같은 예기치 못한 사건이 발생할 경우, 프로그램이 어떻게 작동하게 해야 할 지를 고려해야 하며, 위험을 최소화하기 위해 페일-세이프 작동(fail-safe operation)을 설계해야 한다. 비상 정지는 반드시 기계의 전기 배전 시스템에 직접 연결해야 하며, 생명과 안전에 관련된 문제는 PLC 자체에 의존해서는 안된다.

• 입력을 버퍼 또는 인버터에 연결: 기계를 재배선하는 대신 소프트웨어에 기반한 변경(software-based changes)을 하려면 입력을 버퍼 또는 인버터에 연결해야 한다. 산업 분야계에서는 다운타임이 재정적인 측면과 인력적인 측면에서 상당한 영향을 미친다는 점을 기억해야 한다. 코드를 변경하는 것이 재배선하는 것보다 더 쉽다.

• 일관된 논리 원칙 적용: 프로그램 전반에 일관된 논리 원칙이 적용되어야 한다. 예를 들어, 시작 조건에 일상적으로 열림(normally open, NO) 접점을 사용했다면, 특별한 이유가 없는 한 유사 기능에 대해서는 NO 접점을 계속 사용해야 한다. 또한, 계수기(카운터)를 사용하는 경우에는 카운트업(count-up) 타이머와 카운트다운(count-down) 타이머를 일관되게 사용해야 한다.

• 메모리 맵(Memory Map)의 이해: 데이터 테이블(data table)이라고도 일컫는 메모리 맵을 이해하고 있어야 한다. PLC는 메모리 용량이 제한된 장치이고 I/O를 위해 하드 코딩된 메모리 주소를 사용하므로, 성공적인 프로그래밍을 위해서는 개발자가 데스크톱 애플리케이션과 같은 다른 유형의 소프트웨어 개발보다는 PLC 내부의 메모리 구조에 대해 깊이 있게 이해하고 있어야 한다. 또한, 서로 다른 데이터 유형(일부 제조사에서는 이를 ‘파일 유형’이라고 부름)은 서로 다른 비트 수로 표현한다. 메모리의 다양한 구성 요소를 나타내기 위해 다음과 같은 특수 문자들도 사용된다: 

 

O:3.1/0

[File Type or Number] : [Element Number] . [Word Number] / [Bit Number]

 

파일 유형이나 번호(File Type or Number)는 입력, 출력 또는 카운터와 같은 데이터 유형을 나타낸다. 요소 수(Element Number)는 I/O 슬롯을 나타낸다. 데이터 유형이 다중 워드인 경우, 워드 수(Word Number)는 액세스할 단어를 나타낸다. 마지막으로, 비트 수(Bit Number)는 워드에서 액세스할 수 있는 비트를 나타낸다. 따라서 이 예제는 세 번째 출력 슬롯의 두 번째 워드의 첫 번째 비트를 나타내는 것이다. 

이러한 형식은 공급회사마다 다를 수 있지만, 일반적으로 개별 비트가 어디에 설정되었는지에 대해 정확한 지식을 갖는 것이 매우 중요하며, 특히 외부 I/O의 경우는 더욱 그렇다.

  

래더 로직 이외의 PLC 프로그래밍 

  

래더 다이어그램 외에도 IEC 61131-3은 두 가지 다른 그래픽 PLC 프로그래밍 방법인 기능 블록 다이어그램(function block diagram, FBD)방식과 순차 함수 차트(sequential function chart, SFC) 방식에 대해 규정하고 있다. 또한 이 표준은 파스칼(Pascal)과 문법적으로 유사한 블록 구조 프로그래밍 언어인 구조화된 텍스트(structured text, ST)라는 텍스트 기반 방법에 대해서도 자세히 설명하고 있다. 아두이노(Arduino)는 최근 실시간 클라우드 연결 및 데이터 교환에 필수적인 아두이노 옵타(Arduino Opta) 계열의 PLC를 프로그래밍하기 위해 아두이노 기반(자체적으로 C 언어 래퍼) 방법도 도입했다. 다른 PLC 제조사들은 기존의 독자적 프로그래밍 언어에서 벗어나 파이썬(Python), 자바(Java), C++와 같은 언어를 채택하기 시작했다.

구조화된 텍스트 PLC 프로그래밍 방법은 제조 공정을 산업용 사물인터넷(IIoT)과 호환성 있게 만들고자 하는 기업들 사이에서 점점 더 관심을 나타내고 있다. IIoT(인터넷에 연결되거나 대규모 사설 WAN에 연결)는 기존에 네트워크 연결이 되어 있지 않은 공장 자동화 기술에 대해 일부 제조회사가 관심을 갖게 할 만한 몇 가지 장점들(및 몇 가지 위험성)을 제공한다. 

IIoT의 등장으로, 현대 PLC는 더 발전된 네트워킹 기능을 갖추게 되어, 인터넷에 쉽게 연결되고 IIoT 생태계 안에 있는 다른 장치들과 통신할 수 있게 되었다. 여기에는 MQTT, AMQP, OPC UA와 같은 다양한 통신 프로토콜에 대한 지원도 포함되는데, 이들은 실시간 클라우드 연결 및 데이터 교환에 필수적이다. 이러한 기능은 전사적 자원 관리(ERP) 시스템 통합, 디지털 트윈(digital twinning), 예방 정비, 원격 모니터링 등과 같은 여러 분야에 이상적이다.