ModBus 프로토콜은 PLC 장치와 주변 장치들과의 통신을 위해서 만들어졌다. 이 프로토콜의 특징은 통신에 참여하는 장치를 마스터 역할을 담당하는 마스터 장치와 슬레이브 역할을 하는 슬레이브 장치로 구분해서 구성되며 마스터 장치와 슬레이브 장치를 1:N으로 연결해 준다. 즉, PLC를 마스터 장치로 하고 주변 센서 및 출력 장치를 슬레이브 장치로 구성한 후 PLC를 로더를 통해서 프로그래밍한 후 시스템을 컨트롤하는 방식으로 사용하였다.
그러나 이러한 방식은 일반 사용자가 시스템을 컨트롤하기에는 매우 어려웠으므로 사용자가 손쉽게 시스템을 컨트롤 할 수 있는 방법을 찾게 되었다. 즉 사용자의 입력을 받아들여 시스템 장치를 제어하고 현재 상태 및 출력을 보여주는 도구의 개발이 요구되었다. 그리고 이러한 요청에 따른 장치가 개발되었는데 이것이 바로 HMI(Human Machine Interface)라는 장치이다. 이는 우리가 보통 터치 스크린이라고 부르는 장치이다.
이러한 HMI 장치는 모드버스 프로토콜에서 기존 PLC가 가진 마스터 지위를 넘겨 받았다. 물론, 마스터는 하나여야 하므로 PLC는 슬레이브 역할을 담당하게 되었다.
그러면 PLC는 다른 슬레이브와 어떻케 데이타를 주고 받는가?
기존에는 마스터여서 데이타를 가지고 오거나 출력을 직접 제어할 수 있었는데 이제는 슬레이브가 되어서 다른 슬레이브와 직접적으로 통신할 수 있는 수단이 없어진 상태이기 때문이다.
첫 번째 방법은 마스터가 데이타를 중개해주는 방식이다.
두 번째 방법은 슬레이브끼리 통신이 가능하도록 해주는 별도의 프로토콜을 운용하는 것이다. LS에서는 이를 P2P라고 한다.
상기의 방식(HMI를 채택하여 장치들간의 통신은 ModBus 프로토콜이 담당)은 산업현장에서 일반적으로 사용되고 있다. 끝으로 마스터와 슬레이브 말고 클라이언트 서버라고 불리기도 한다.
마스터와 슬레이브 관계는 1:N의 관계와 주/종의 관계로 본다. 그런데 LS PLC에서는 클라이언트/서버(C/S 관계)라고 한다. 즉, 마스터가 클라이언트이고 슬레이브가 서버이다. 이러한 C/S 관계는 웹브라우저가 웹서버에 http 프로토콜을 사용하여, 요청하고 응답하는 관계와 동일한 형태이다.
이름을 어떻케 부르건, 클라이언트(마스터)는 서버(슬레이브)에게 데이타를 송신하게 하거나 데이타를 수정하라고 요청할 수 있다.
이것은 클라이언트(마스터)가 하는 요청은 서버(슬레이브)의 메모리를 ModBus 프로토콜을 이용해서 접근한다는 의미이다. 이는 아래 설명을 읽으면, 충분히 이해할 수 있을 것이다.
모드버스 프로토콜은 아래에 정의되어 있다.
https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf
1. 모드버스 프로토콜은 ModBus RTU, ModBus ASCII, ModBus TCP 등등 많은 형제 프로토콜을 낳았으나 원조는 ModBus RTU이다.
2. 여러 슬레이브 장치를 구분하기 위해서 국번을 만들어서 각 슬레이브 장치가 자기 국번이 불리면 응답토록 한다.
3. PLC처럼 Bit 접근과 Word 데이타 접근을 위해서 메모리 블록을 만들었다.
Code(명령어 또는 펑션 코드)만을 보면 어떤 주소(어떤 블록)을 사용하는지 알 수 있다.
이 중 십진수 빨간 색 블록으로 감싸여 있는 1, 2, 3 및 4는 데이타 모니터링에 사용되는 평션 코드이다. 또한 십진수 파란색 화살표가 가리키는 5,6,15 및 16은 쓰기에 사용되는 펑션 코드이다.
4. 읽기만 가능한 비트 및 워드영역이 있고 읽기/쓰기가 가능한 비트 및 워드영역이 있다.
먼저 읽기만 가능한 메모리는 I.O system에서 접근하는 메모리이며 Discretes Input 메모리와 Input Registers 메모리 블록이 있다. I.O 시스템이라 함은 입출력 장치라고 보면 된다.
예를 들면 PLC의 P장치(메모리)는 센서값을 읽고(Discrete Inputs), 액추에이터를 작동(On 또는 Off)하는 장치(Coils) 이다. LS PLC XBCDR20E에서 P00~P11는 Discretes Input Port로 사용하고 P40~P47은 Coil로 사용하고 있다. 위에서 코일은 시퀀스에서 사용되는 릴레이의 코일을 의미한다. 즉, 코일을 여자(On/Off)해서 출력을 제어하기 때문에 코일이라는 이름을 사용한 것 같다. 또한, 출력을 유지하기 위해서는 값을 유지해야 하므로 Holding bit이라고 볼 수 있다.
이와 비슷하게 워드 또는 더블워드 단위로 데이타를 읽고 쓸 수 있는 메모리가 있다. 데이타는 단순히 ON/OFF 가 아닌 물리량, 문자 등을 말하는 것으로 PLC에 추가 장착하는 카드를 통해서 송/수신 할 수 있다.
여기서도 읽기만 가능한 레지스터인 Input Register와 읽기 쓰기가 모두 가능한 Holding Register로 나눌 수 있다. 상기 PLC에서는 추가 장착 카드 없이, CNET 설정을 통해서 시리얼 또는 RS485포트와 연결된 다른 장치로 부터 워드 또는 더블워드 데이타를 읽어 들이거나 쓸수 있다.
상기의 내용은 프로토콜 정의인데 이것만을 읽고 프로토콜의 동작을 이해하기는 매우 어렵다. 또한, ModBus 장치들간의 물리적/논리적 연결을 테스트해야 하는 경우가 종종발생한다. 왜냐하면 각 장치들이 다른 회사에서 만들어졌기 때문이다. 그러나 표준 ModBus 프토토콜을 탑재하였으며 서로 약속된 번지를 교환토록 했다면 통신은 이루어져야 하는데 사실 별의 별 일이 다 발생하는 것이 현장이다.
이 때, 아래에서 소개한 프로그램을 깔아서 테스트해서 이상 없었다라고 한다면 그리고 또 한 번 보여준다면 상대방이 수긍하니 아래 프로그램은 꼭 구비토록 해보자.
ModBus 시뮬레이터
ModBus 연결이 성공적으로 이루어졌는지 테스트하기 위한 프로그램이 있다. 회사 Witte Sowfwaret사의 Modbus Poll과 "Modbus Slave" 프로그램이다. Modbus Poll은 ModBus 마스터 장치를 시뮬레이션하는 프로그램이고 "Modbus Slave" 는 ModBus 슬레이브 장치를 시뮬레이션해준다.
1. 설정
HMI는 모드버스 마스터 장치이므로 "Modbus Slave" 프로그램을 다운로드 후, 시리얼 또는 이더넷으로 HMI와 연결 후 자기 자신의 설정을 아래와 같이 한다. 국번을 2번으로 한 이유는 1번에 PLC를 넣어 두었기 때문이다.
2. 연결
그림 2에서 주의 깊게 볼 것은, "Function: 03 Holding Register (4x)"로 설정하는 이유이다. 펑션 코드(기능 코드) 03은 Read Holding Register이다. 그런데 괄호 열고 (4x)라는 말이 나온다. 아래 그림을 보자.
즉, 펑션 코드 3번은 4x번지에 있는 데이타를 읽어오라는 명령어이다. 그리고 4x번지는 Holding Register이므로 이 값은 다른 펑션코드(DEC16)로 변경이 가능함을 알 수 있다.
이러한 관계, 특정 번지 블록에는 특정한 펑션 코드와 1:1 연결되는 관계는 최초의 PLC라 불리는 Medford사의 MODICON(Modular Digital Controller)에 기술된 것 같다. (정확히는 모름)
3. 작화와 연동
그래서 HMI에서 작화 생성 중, 종종 아래와 같은 메모리 번지 대역을 선택하는 옵션을 볼 수 있는 것이다.
위에서 보면 4번은 알겠는데 다른 번호는 무었일까?
그것은 "Modbus Slave" 프로그램에서 "Slave 정의화면"에서의 펑션코드를 지정할 때 나타나는 리스트메뉴를 보면 쉽게 이해할 수 있다.
즉, 윗 평선 리스트는 아래의 내용을 함축하고 있다.
Function Code | 내용 |
01 Coil Status (0x) | 0x0001부터 시작하는 메모리는 코일의 상태를 표시하고 있는데 이 값을 읽으라는 의미. |
02 Input Status (1x) | 1x0001부터 시작하는 메모리는 입력상태만을 표시하고 있다. 변경안됨. |
03 Holding Register (4x) | 04x0001부터 시작하는 메모리는 홀딩레지스터의 값을 표시하고 있는데 이 값을 읽으라는 의미. |
04 Input Registers (3x) | 03x0001부터 시작하는 메모리는 인풋레지스터의 값을 표시하고 있다. 변경안됨. |
4. 패킷과 마스터/슬레이브
디스플레이 메뉴의 Communication을 클릭 한 후 통신로그를 살펴보면 패킷형태로 된 데이타이며 그 형식은 아래와 같음을 확인할 수 있다.
패킷형태 : 국번-CODE-데이타-CRC
여기서 데이타는 요청과 관련된 데이타이다. 즉, 읽거나 쓸 레지스터의 주소, 개수 또는 값 등등.
아래의 데이타는 "Modbus Slave"의 Communicaion 메뉴에서 추출한 패킷 데이타이다. 슬레이브 장치에서 패킷을 읽어 왔기 때문에 RX가 오면 TX로 응답을 내 보냄을 볼 수 있다.
Rx:000001-02 03 00 00 00 08 44 3F
Tx:000002-02 03 10 00 02 00 00 80 00 43 51 80 00 43 D1 00 05 00 00 C9 AA
<RX해석>
국번 : 장치번호이다. PLC를 설정하면 항상 장치번호를 셋팅하게 된다. 내 국번이 02이므로 내 패킷임을 알게된다.
CODE : <그림1>에서 말하는 명령어이다.
시작주소 : 데이타에 포함된다. 데이타의 시작 주소이다.
길이 : 데이타에 포함된다. 데이타의 워드 갯수이다.
CRC : 체크섬이며 자동 계산된다.
<TX해석>
국번 : 장치번호이다. 자신의 국번을 내보내면 된다.
CODE : <그림1>에서 말하는 명령어이다. RX가 받은 펑션 코드이므로 내가 이런 펑션 코드를 받았다라고 그대로 쓰면된다.
바이트수: 데이타에 포함된다. 전송할 바이트 수이다. 10이므로 0X10 -> 16바이트이다.
데이타: 데이타에 포함된다. 16바이트의 데이터값이다.
CRC : 체크섬이며 자동 계산된다.
------------------------------------------------
*2024-12-23 수정
"Modbus Slave" 프로그램을 이용해서 Modbus 프로토콜에 대한 설명을 추가하였다.
*2024-12-27 수정
ModBus 프로토콜에서 접근하는 메모리는 슬레이브(서버) 메모리임을 명확히 기술하였다.
'PLC' 카테고리의 다른 글
PLC 표준언어 (0) | 2022.11.28 |
---|---|
PLC란? (0) | 2022.11.28 |
EasyBuilder Pro의 매크로 (0) | 2022.11.15 |
EasyBuilder Pro의 전역 화면전환 기능 (0) | 2022.11.15 |
PLC의 COM(공통단자)의 의미 (3) | 2022.11.14 |