Modbus란?
1979년 Schneider Electric (구 Modicon) 에서 개발한 Serial 통신 프로토콜
PLC와 산업 자동화 장비 간 제어를 위한 목적으로 개발
- PLC : Programmable Logic Controller
- 초기에는 제조공장 및 놀이공원의 기계들을 자동화하고 제어하기 위해 사용
- 단순하지만 장비 제어와 모니터링에 필요한 기능을 갖춤
- 현재에는 사실 상의 표준 프로토콜 지위를 얻음
Modbus가 산업용으로 널리 이용되는 이유
- 개발 목적 – 산업용 통신 프로토콜을 목적하여 개발됨
- 비용 – 프로토콜이 공개되어 있으며, 무료로 사용 가능
- 구조 – 간단한 구성으로 설치와 유지보수가 용이
- 제어 – 비트 단위 또는 워드 (16bit) 단위로 정보 조작이 용이
Modbus는 약 240개의 장비들을 서로 연결할 수 있다. 예를 들면, 온도와 습도를 측정하는 여러 장비들이 모니터링 서버로 현재 상태를 보고하도록 할 수 있다. 일반적으로 서버에서 센싱 장비들에게 질의를 보내고 장비들은 이에 대해 응답하는 형태로 동작한다. Supervisory control and data acquisition (SCADA) 시스템에서도 모니터링 서버와 remote terminal unit (RTU)을 연결하기 위해 Modbus protocol을 자주 사용한다.
Modbus의 종류
- Modbus RTU – Serial 통신을 이용, 프레임에 이진(binary) 정보를 사용
- Modbus ASCII – Modvus RTU와 동일하나, 프레임에 ASCII 코드를 사용한다는 점이 차이
- Modbus TCP – Standard Ethernet based TCP/IP 프로토콜 상에서 동작
Modbus의 특징
Master – Slave 기반의 요청(Request)과 응답(Response) 구조
Modbus는 master/slave 기반 프로토콜이다. 시리얼 통신에서는 master로 설정된 장비만이 slave로 정보를 요청할 수 있는 반면, 이더넷 통신에서는 네트워크상의 어떤 노드도 정보를 요청할 수 있다. 요청정보는 읽기와 쓰기 모두 가능하다. 하지만, 대부분의 경우 master는 하나만 존재한다.
네트워크상에 연결된 모든 노드들이 요청을 받을 수는 있지만, 요청정보에 들어있는 목적주소 장비만이 이에 응답한다. 물론 목적지 주소가 브로드캐스트 주소일 때는 예외이다. 목적지 주소를 0으로 설정하면, 수신한 모든 노드에서 요청을 처리하지만, 응답은 보내지 않는다. 또한, Modbus 요청 정보에는 통신 오류를 검출하기 위한 코드를 포함한다.
Modbus의 Frame Format
통신 네트워크의 종류와 요청 정보의 형식에 따라 여러가지 프레임 포맷이 존재한다. Modbus RTU는 시리얼 통신망을 이용하며, 프레임에서는 이진정보를 사용한다. Modbus Ascii도 시리얼 통신망을 이용하지만, 프레임에 ascii 문자를 넣어 통신한다. 즉 0을 넣으면, 실제 프레임에는 0의 ascii 코드인 48이 한 바이트를 차지하게 된다.
Name | Length (bits) | Function |
---|---|---|
Start | 28 | at least 3 1⁄2 character times of silence (mark condition) |
Address | 8 | Station Address |
Function | 8 | Indicates the function code, eg read coils / inputs |
Data | n * 8 | Data + length will be filled depending on the message type |
CRC | 16 | Error checks |
End | 28 | at least 3 1⁄2 character times of silence between frames |
Name | Length (char.) | Function |
---|---|---|
Start | 1 | starts with colon ( : ) (ASCII hex value is 0x3A) |
Address | 2 | Station Address |
Function | 2 | Indicates the function codes like read coils / inputs |
Data | n | Data + length will be filled depending on the message type |
LRC | 2 | Error checks |
End | 2 | carriage return – line feed(CR/LF) pair (ASCII values of 0x0D & 0x0A) |
Name | Length (bytes) | Function |
---|---|---|
Transaction Identifier | 2 | For synchronization between messages of server & client |
Protocol Identifier | 2 | Zero for Modbus/TCP |
Length Field | 2 | Number of remaining bytes in this frame |
Unit Identifier | 1 | Slave Address (255 if not used) |
Function code | 1 | Function codes as in other variants |
Data bytes | n | Data as response or commands |
Modbus/TCP의 unit identifier는 modbus 게이트웨이 내부의 RTU 장비들을 지칭할 목적으로 사용되며, 이런 경우가 아니라면 IP 주소를 사용해 목적지를 인식할 수 있으므로 사용되지 않는다. 바이트 순서는 빅 엔디언을 사용한다. 즉 첫번째 바이트가 MSB이다.
프레임 포멧의 Function code와 data부분을 특별히 Protocol Data Unit (PDU)라고 부르며, 위 프레임 포맷 표에서 Name 부분에 푸른색으로 표시된 부분이 PDU이다. PDU는 Request PDU, Response PDU, Exception Response PDU의 3가지 종류가 정의되어 있다.
Modbus에서 지원하는 기능 코드
읽기와 쓰기를 비롯한 다른 몇몇 기능들이 아래 표에 정리되어 있다. 프로토콜이 만들어진 초창기부터 있었던 기능들은 굵은 글자로 표시되어 있으며, 1~6까지의 기능 코드를 갖는다.
Function type | . | . | Function name | Function code |
---|---|---|---|---|
Data Access | Bit access | Physical Discrete Inputs | Read Discrete Inputs | 2 |
. | . | Internal Bits
or Physical Coils |
Read Coils | 1 |
. | . | . | Write Single Coil | 5 |
. | . | . | Write Multiple Coils | 15 |
. | 16-bit access | Physical Input Registers | Read Input Register | 4 |
. | . | Internal Registers
or Physical Output Registers |
Read Holding Registers | 3 |
. | . | . | Write Single Register | 6 |
. | . | . | Write Multiple Registers | 16 |
. | . | . | Read/Write Multiple Registers | 23 |
. | . | . | Mask Write Register | 22 |
. | . | . | Read FIFO Queue | 24 |
. | File Record Access | . | Read File Record | 20 |
. | . | . | Write File Record | 21 |
Diagnostics | . | . | Read Exception Status | 7 |
. | . | . | Diagnostic | 8 |
. | . | . | Get Com Event Counter | 11 |
. | . | . | Get Com Event Log | 12 |
. | . | . | Report Slave ID | 17 |
. | . | . | Read Device Identification | 43 |
Other | . | . | Encapsulated Interface Transport | 43 |
modbus는 센서나 LED등을 모니터링하고 제어하기 위한 특수한 data type들을 제공한다. 다음 표에 data type들을 정리하였다. 이 표는http://jamod.sourceforge.net/kbase/protocol.html 에서 가져온 것이다. java 로 구현한 modbus에 대한 문서이며, 볼 만한 내용들이 있다.
Name | Type | Access | Visual |
---|---|---|---|
Discrete Input | single bit | read-only | ![]() |
Discrete Output (Coils) | single bit | read-write | ![]() |
Input Registers | 16-bit word | read-only | ![]() |
Holding Registers (Registers) | 16-bit word | read-write | ![]() |
출처: http://system-monitoring.readthedocs.io/en/latest/modbus.html