SerialTool을 이용한 Modbus RTU, ASCII 및 TCP

Modbus란

Modbus는 1979년에 Modicon®(현재 Schneider Electric의 일부)에 의해 만들어진 시리얼 통신 프로토콜로, 이 회사의 프로그래머블 논리 컨트롤러(PLC)를 연결하기 위해 개발되었습니다. 이는 산업 통신에서 사실상의 표준이 되었으며 산업용 전자 장치 간의 연결 프로토콜로 전 세계에서 가장 널리 사용되는 연결 프로토콜 중 하나입니다. Modbus는 Modbus Organization 웹 사이트에서 사양으로 선언된 로열티 프리 프로토콜입니다.

간단하게 말하면 이는 전자 장치 간에 직렬 라인을 통해 정보를 전송하는 방법입니다. 정보를 요청하는 장치를 Modbus 클라이언트라고 하며 정보를 제공하는 장치는 Modbus 서버입니다. 표준 Modbus 네트워크에서는 하나의 클라이언트와 1에서 247까지의 고유한 서버 주소를 가진 최대 247개의 서버가 있을 수 있습니다. 클라이언트는 또한 서버에 정보를 쓸 수도 있습니다.


원래 산업용으로 설계된 이 프로토콜은 시간이 흐르면서 다양한 분야에서 채택되어 가장 보편적인 프로토콜 중 하나가 되었습니다. 오늘날에도 40년이 넘은 시간이 흐른 지금도 이 프로토콜은 운영 패널, PLC, 홈 오토메이션과 같은 여러 장치에서 사용되며 심지어 Arduino와 같은 간단한 장치에 통합되어 있습니다.

시리얼을 통한 Modbus RTU 및 ASCII 전송

프로토콜이 만들어진 초기에는 통신이 시리얼 포트를 통해 이루어지도록 의도되었기 때문에 SerialTool에 구현되었습니다. Modbus는 종종 감시 및 제어 시스템(SCADA)에서 감시 컴퓨터와 원격 단말 장치(RTU)를 연결하기 위해 사용됩니다. 데이터 전송 형식에 따라 프로토콜은 다음과 같이 나뉩니다.

  • MODBUS RTU - 데이터는 16진수 형식으로 전송됩니다.
  • MODBUS ASCII - 데이터는 ASCII 형식으로 전송됩니다.

두 경우에서 오류 제어가 다릅니다. MODBUS RTU에서는 명령 후에 순환 중복 확인(CRC)이 사용되어 전송되고, MODBUS ASCII에서는 명령 후에 Longitudinal Redundancy Check (LRC)가 전송됩니다.

Modbus TCP 전송

1999년에 "Modbus TCP"가 개발되었습니다. 이는 TCP/IP 프로토콜 스위트를 사용하는 네트워크를 위한 표준입니다. 본질적으로 Modbus 시리얼 RTU를 기반으로 한 TCP/IP의 버전으로, 인터넷/이네트워크를 통한 통신을 가능하게 합니다. 최근 몇 년간 TCP/IP 버전이 증가하고 있으며 이는 오픈 소스이며 구현이 쉽고 개발 비용이 낮으며 하드웨어 지원이 최소화되어 있기 때문입니다.

두 경우에서 오류 제어가 다릅니다. MODBUS RTU에서는 명령 후에 순환 중복 확인(CRC)이 사용되어 전송되고, MODBUS ASCII에서는 명령 후에 Longitudinal Redundancy Check (LRC)가 전송됩니다.

Modbus TCP/IP 프로토콜은 데이터의 이진 인코딩과 TCP/IP 오류 감지 메커니즘을 사용합니다. 시리얼 Modbus와 달리 TCP/IP 버전은 연결 지향형이며 동일한 슬레이브 또는 여러 장치에서 동시 실행을 허용합니다. Modbus TCP/IP도 마스터-슬레이브 패러다임을 사용하며 이 통신은 네 가지 유형의 메시지를 사용합니다.

Modbus는 ISO/OSI 스택의 레이어 7 (응용 프로그램 레이어)에 위치하며, 프레이밍 및 데이터 및 제어 기능의 전송 모드를 정의하는 메시지 포매팅을 정의합니다. 통신은 클라이언트-서버 패러다임을 통해 이루어집니다. 프로토콜은 기본 통신 레이어에 의존하지 않는 프로토콜 데이터 유닛 (PDU)를 정의합니다. 응용 프로그램 데이터 유닛 (ADU)은 주소 지정 및 오류 제어를 위한 추가 필드를 도입합니다.

SerialTool Modbus Client

SerialTool은 RTU, ASCII 및 Modbus TCP 전송 모드를 지원하여 Modbus 클라이언트의 최대 전문적인 유연성을 제공합니다.
SerialTool은 또한 모든 개발자의 요구를 쉽게하기 위해 Raw 명령을 전송하는 옵션을 제공합니다.

Screen with the log of sent commands

Screen with low-level commands sent


Modbus 기능

다음은 SerialTool이 Modbus 프로토콜에 대해 구현한 기능입니다.

Function Code Action Table Name
0x01 Read Discrete Output Coils
0x02 Read Discrete Input Contacts
0x03 Read Analog Output Holding Register
0x04 Read Analog Input Registers
0x05 Write Single Discrete Output Coil
0x06 Write Single Analog Output Holding Register
0x0F (dec 15) Write Multiple Discrete Output Coils
0x10 (dec 16) Write Multiple Analog Output Holding Registers

Modbus 데이터 구조

정보는 서버 장치에 네 가지 다른 테이블에 저장됩니다. 두 테이블은 이산형 온/오프 값(코일)을 저장하고 두 테이블은 숫자 값(레지스터)을 저장합니다. 코일과 레지스터 모두 읽기 전용 테이블과 읽기/쓰기 테이블이 있습니다. 각 테이블에는 9999개의 값이 있습니다. 각 코일 또는 연락은 1비트이며 데이터 주소는 0000에서 270E 사이입니다. 각 레지스터는 1 워드 = 16비트 = 2바이트이며 데이터 주소도 0000에서 270E 사이입니다.

Coil/Registers numbers Data Addresses Type Table Name
1-9999 0x0000 to 0x270E Read/Write Discrete Output Coils
10001-19999 0x0000 to 0x270E Read Only Discrete Input Contacts
30001-39999 0x0000 to 0x270E Read Only Analog Input Register
40001-49999 0x0000 to 0x270E Read/Write Analog Output Holding Register