SerialTool과 함께하는 Modbus RTU, ASCII 및 TCP
최종 업데이트 작성자 Oliver ReedModbus란 무엇인가
Modbus 프로토콜은 1979년 Modicon®(현재 Schneider Electric 그룹 소속)이 자사의 프로그래머블 로직 컨트롤러(PLC) 간 통신을 위해 만든 직렬 통신 프로토콜입니다. 이 프로토콜은 산업용 통신의 de facto 표준이 되었으며, 오늘날 산업용 전자 장치 사이에서 가장 널리 사용되는 연결 프로토콜 중 하나입니다. Modbus는 로열티 프리 프로토콜이며, 그 사양은 The Modbus Organization 웹사이트에 공개되어 있습니다.
간단히 말하면, 전자 장치 사이에서 직렬 회선을 통해 정보를 전송하는 방법입니다. 정보를 요청하는 장치는 Modbus Client라고 하며, 정보를 제공하는 장치는 Modbus Server라고 합니다. 표준 Modbus 네트워크에는 하나의 client와 최대 247개의 server가 존재하며, 각 server는 1부터 247까지의 고유한 주소를 가집니다. client는 server에 정보를 기록할 수도 있습니다.
원래는 산업 분야를 위해 설계되었지만, 시간이 지나면서 다른 분야에도 널리 채택되어 가장 보편적인 프로토콜 중 하나가 되었습니다. 40년이 넘은 지금도 운영 패널, PLC, 홈 오토메이션 시스템, 심지어 Arduino 같은 단순한 장치에서도 여전히 사용되고 있습니다.
직렬 통신을 통한 Modbus RTU 및 ASCII 전송
이 프로토콜이 만들어졌을 당시 통신은 직렬 포트를 통해 사용되도록 설계되었기 때문에, 이 기능이 SerialTool에 구현되었습니다. Modbus는 SCADA(Supervisory Control and Data Acquisition) 시스템에서 감독용 컴퓨터와 원격 터미널 장치(RTU)를 연결하는 데 자주 사용됩니다. 데이터 전송 형식에 따라 프로토콜은 다음과 같이 나뉩니다.
- MODBUS RTU - 데이터는 16진수 형식으로 전송됩니다.
- MODBUS ASCII - 데이터는 ASCII 형식으로 전송됩니다.
오류 검사 방식은 두 경우에 따라 다릅니다. MODBUS RTU에서는 명령 뒤에 CRC(Cyclic Redundancy Check)가 추가되고, MODBUS ASCII에서는 명령 뒤에 LRC(Longitudinal Redundancy Check)가 사용됩니다.
Modbus TCP 전송
1999년에 “Modbus TCP”가 개발되었습니다. 이는 TCP/IP 프로토콜 스위트를 사용하는 네트워크를 위한 표준으로, 사실상 TCP/IP 위에 구현된 직렬 Modbus RTU 버전입니다. 따라서 인터넷/인트라넷 네트워크를 통한 통신이 가능합니다. 최근 몇 년 동안 TCP/IP 버전은 Open Source이며 구현이 쉽고 개발 비용이 낮고 필요한 하드웨어 지원도 매우 적기 때문에 점점 더 널리 사용되고 있습니다.
오류 검사 방식은 두 경우에 따라 다릅니다. MODBUS RTU에서는 명령 뒤에 CRC(Cyclic Redundancy Check)가 추가되고, MODBUS ASCII에서는 명령 뒤에 LRC(Longitudinal Redundancy Check)가 사용됩니다.
Modbus TCP/IP 프로토콜은 바이너리 데이터 인코딩과 TCP/IP 오류 검출 메커니즘을 사용합니다. 직렬 Modbus와 달리 TCP/IP 버전은 연결 지향적이며 동일한 slave 또는 여러 장치에 대한 동시 연결을 허용합니다. Modbus TCP/IP 역시 master-slave 패러다임을 사용하며, 이 통신은 추가로 네 가지 메시지 유형을 사용합니다.
Modbus는 ISO/OSI 스택의 7계층(Application Layer)에 위치하며, framing이라 불리는 메시지 형식과 데이터 및 제어 기능의 전송 방식을 정의합니다. 통신은 client-server 패러다임으로 이루어집니다. 이 프로토콜은 하위 통신 계층에 의존하지 않는 Protocol Data Unit(PDU)을 정의합니다. Application Data Unit(ADU)은 주소 지정과 오류 제어를 위한 추가 필드를 포함합니다.
SerialTool Modbus Client (Master / Polling)
SerialTool은 polling, 레지스터 스캔, 트래픽 모니터링, 실시간 차트를 제공하는 Modbus RTU/ASCII/TCP 클라이언트로, 산업용 장치의 테스트와 디버깅에 적합합니다.
Modbus Client를 사용하면 Serial(RTU 또는 ASCII) 또는 Network(IPv4/IPv6 기반 TCP)를 통해 Modbus Slave/server 장치에 연결하고, 표준 Modbus 기능으로 데이터를 읽고 쓰며, 자체 매핑을 가진 Modbus 장치를 생성하여 예약 polling을 수행할 수 있습니다.
프로토타입 장치 안에는 Modbus 구조(Discrete Output Coils, Discrete Input Contacts, Analog Input Register, Analog Output Holding Register)를 추가하고 장치를 저장하여 필요할 때 다시 불러올 수 있습니다. 또한 이 Modbus 프로토타입 장치는 Text, CSV 또는 PDF 형식으로도 내보낼 수 있어 간단하고 직관적으로 공유할 수 있습니다.
올바른 매핑을 가진 장치가 만들어지면 예약 polling을 통해 Slave 장치에서 직접 읽은 값을 실시간 차트로 표시할 수 있습니다.
SerialTool은 생성 및 수신된 Modbus 트래픽(Serial 및 TCP)을 전용 터미널에서 볼 수 있는 기능도 제공합니다. 고급 터미널은 데이터 내보내기와 입출력 데이터의 실시간 필터링을 지원합니다.
또한 Modbus Scanner 기능을 통해 원격 Slave 장치를 스캔할 수 있습니다. 적절한 필터를 설정하면 현재 지원되는 레지스터를 모르는 경우에도 원격 장치(Modbus Slave)의 매핑을 시도할 수 있습니다. Modbus Scanner 기능은 장치의 특성이 전혀 알려져 있지 않거나 일부만 알려진 경우 특히 유용합니다.
다음은 SerialTool Modbus 모듈의 메인 화면입니다.
SerialTool Modbus Client 메인 화면
메인 화면은 SerialTool과 Modbus Client(Master)의 핵심 기능을 보여줍니다.
SerialTool Modbus Client (Master / Polling)
화면 왼쪽에서 Serial 또는 TCP 연결 모드를 선택할 수 있습니다.
Modbus Client 연결 화면
앞서 설명한 것처럼 직렬 Modbus 프로토콜은 RTU와 ASCII 두 가지 유형으로 나뉩니다. 원격 장치와 올바르게 통신하려면, 직렬 연결의 경우 Slave 장치가 어떤 Modbus 프로토콜 유형을 지원하는지 반드시 알아야 합니다.
반면 ModBus TCP 연결은 IPv4와 IPv6를 지원합니다. TCP를 통한 Modbus 연결을 설정하려면 slave의 IP와 접속할 원격 포트를 지정해야 합니다.
연결 화면에는 Modbus Slave 장치가 응답해야 하는 시간에 대한 두 개의 파라미터가 있습니다.
하나는 일반 응답 타임아웃(Response Timeout)으로, 이 시간이 지나면 Client(Master)는 slave의 응답을 더 이상 기다리지 않습니다. 다른 하나는 Slave로부터 마지막 바이트를 받은 시점부터 계산되는 타임아웃입니다.
Modbus ENRON/Daniel 에뮬레이션
연결 파라미터 중에는 ENRON/Daniel 에뮬레이션(종종 Enron Modbus 또는 Daniels Modbus라고도 부름)이 있으며, 이는 표준 Modbus 통신 프로토콜의 특정 변형을 의미합니다.
이 기능은 원래 Enron Corporation에서 개발되었고 Daniel Measurement and Control의 flow computer에 널리 구현되었습니다. 시간이 지나면서 특히 Oil & Gas 분야의 전자 유체 계측(EFM)에서 사실상 표준이 되었습니다.
장치에서 ENRON/Daniel 에뮬레이션을 활성화하면 Modbus 동작이 변경되어 다음과 같은 핵심 기능을 지원합니다.
- 1. 단일 레지스터에서의 32비트 데이터 처리: 이것이 가장 중요한 기술적 차이입니다. Standard Modbus에서는 레지스터가 16비트(2바이트)이므로 32비트 값을 읽으려면 두 개의 레지스터가 필요합니다. Enron Modbus에서는 32비트 값이 하나의 레지스터(레지스터당 4바이트)에 매핑됩니다.
- 2. 특정 주소 매핑: 32비트 데이터에 대해 사전 정의된 범위를 사용합니다. 5000번대(예: 45001 - 45999)는 Long Integers용이고, 7000번대(예: 47001 - 47999)는 Floating Points용입니다.
- 3. 이력 데이터와 이벤트: 표준 Modbus가 거의 실시간 읽기만을 위해 설계된 것과 달리, 이력 로그와 알람 아카이브를 추출하기 위한 특수 명령을 지원합니다.
- 4. Offset 없음: 요청 주소가 레지스터 번호와 정확히 일치하므로 표준 Modbus에서 흔한 “+1 offset” 문제를 제거합니다.
요약: Oil & Gas 분야에서 네이티브 32비트 데이터를 전송하는 장치와 연결할 때 이 에뮬레이션은 통신 오류(바이트 정렬 불일치)를 방지하는 데 매우 중요합니다.
Modbus Client 기능
화면 중앙 영역에서 SerialTool이 지원하는 Modbus 기능을 확인할 수 있습니다.
Modbus Client 모드에서 지원되는 기능
ModBus Client 기능은 다음 표로 요약할 수 있습니다.
| 기능 코드 | 동작 | 테이블 이름 / 설명 |
|---|---|---|
| 0x01 | 읽기 | Discrete Output Coils |
| 0x02 | 읽기 | Discrete Input Contacts |
| 0x03 | 읽기 | Analog Output Holding Register |
| 0x04 | 읽기 | Analog Input Registers |
| 0x05 | 단일 쓰기 | Discrete Output Coil |
| 0x06 | 단일 쓰기 | Analog Output Holding Register |
| 0x07 | 읽기 | Exception Status |
| 0x08 | 진단 | 진단 (Serial Line only) |
| 0x0B (dec 11) | 읽기 | Comm Event Counter (Serial Line only) |
| 0x0F (dec 15) | 다중 쓰기 | Discrete Output Coils |
| 0x10 (dec 16) | 다중 쓰기 | Analog Output Holding Registers |
| 0x11 (dec 17) | 리포트 | Server ID (Serial Line only) |
| 0x16 (dec 22) | 마스크 쓰기 | Holding Register |
| 0x17 (dec 23) | 다중 읽기/쓰기 | Holding Registers |
| 0x2B / 0x0E (dec 43 / 14) | 읽기 | Device Identification |
Modbus 데이터 구조
정보는 Server 장치의 네 가지 서로 다른 테이블에 저장됩니다. 두 개의 테이블은 이산적인 on/off 값(coils)을 저장하고, 다른 두 개는 수치 값(registers)을 저장합니다. coils와 registers에는 각각 읽기 전용 테이블과 읽기/쓰기 테이블이 있습니다. 각 테이블은 9999개의 값을 가집니다. 각 coil 또는 contact는 1비트이며 0000~270E 범위의 데이터 주소를 가집니다. 각 register는 1 word = 16 bits = 2 bytes이며 역시 0000~270E 범위의 데이터 주소를 가집니다.
| Coil/Register 번호 | 데이터 주소 | 유형 | 테이블 이름 |
|---|---|---|---|
| 1-9999 | 0x0000 to 0x270E | 읽기/쓰기 | Discrete Output Coils |
| 10001-19999 | 0x0000 to 0x270E | 읽기 전용 | Discrete Input Contacts |
| 30001-39999 | 0x0000 to 0x270E | 읽기 전용 | Analog Input Register |
| 40001-49999 | 0x0000 to 0x270E | 읽기/쓰기 | Analog Output Holding Register |
Modbus 장치
SerialTool은 연결하려는 Slave 장치의 레지스터 매핑을 나타내는 Modbus Slave 장치를 생성할 수 있게 해줍니다. 이 매핑은 매우 중요하며, 원격 slave 장치에 존재하는 값을 로컬 테이블에 표시할 수 있게 해줍니다.
Modbus Client 기능
Modbus Client에서 사용할 수 있는 기능
기능 바에서 "Load Device" 기능으로 이전에 만든 장치를 불러오고, "Save Device"로 현재 장치를 저장하며, "Add Item"으로 단일 레지스터를 또는 "Add Items"로 여러 레지스터를 장치 매핑에 추가할 수 있습니다.
Modbus 장치 매핑에 Modbus 레지스터 추가
Modbus Slave 장치 메모리 영역(Modbus 장치)
Modbus Slave 장치 매핑이 생성되면 SerialTool은 나중에 사용할 수 있도록 이를 저장하거나, 내용을 CSV, Text 또는 PDF 형식으로 내보내 제3자와 공유 및 처리할 수 있게 해줍니다. 다음 이미지는 Modbus Slave 장치 매핑을 내보낸 예를 보여줍니다.
Modbus Slave 장치 매핑의 PDF 내보내기 예
이 링크에서 PDF를 다운로드할 수 있습니다.
Modbus Polling
Modbus Slave 장치를 생성하면 연결된 slave 장치의 일부 레지스터를 주기적으로 읽는 polling을 수행할 수 있습니다.
이를 위해 먼저 Slave를 생성하고 매핑한 뒤, polling을 수행할 레지스터를 추가해야 합니다. 아래 그림을 참조하십시오.
이미지는 slave 방향 polling에 항목을 추가하는 모습을 보여줍니다.
하나 이상의 항목이 polling에 추가되면, polling 목록에 연결된 항목들에 대해 polling을 시작할 수 있습니다.
이미지는 polling을 위해 선택된 항목들을 보여줍니다.
Modbus 기능 접근
SerialTool Modbus Client(Master/Polling)는 세 가지 방식으로 기능을 실행하도록 설계되었습니다.
Modbus 기능 실행
- "Execute from Device Table" - 장치 매핑을 기준으로 Modbus 기능을 실행합니다.
- "Execute Function" - 직접 Modbus 기능을 실행하고 로그 창에 결과를 표시합니다.
- "Send Raw Data" - 16진수 바이트로 구성된 직접 요청을 보내고 응답을 기다립니다.
Execute from Device Table
이 모드에서는 로컬에서 로드했거나 생성한 장치 테이블을 직접 사용하여 선택한 Modbus 기능을 실행합니다.
사용자는 Coils, Discrete Inputs, Holding Registers 또는 Input Registers와 같은 Modbus 참조 유형을 선택하고,
시작 주소와 읽거나 쓸 요소 수를 지정한 후 한 번의 클릭으로 명령을 slave에 보낼 수 있습니다.
이 모드의 가장 큰 장점은 결과가 즉시 장치 맵에 반영되어 로컬 테이블에 표시된 값이 업데이트된다는 점입니다.
이를 통해 원격 장치 상태를 정돈되고 지속적인 방식으로 표현할 수 있어 테스트뿐 아니라 모니터링 및 유지보수 작업에도 유용합니다.
명령이 쓰기 기능과 관련된 경우, SerialTool은 데이터 유형, 표시 형식 및 선택한 레지스터에 기록할 내용을 선택하여 전송할 데이터를 쉽게 준비할 수 있게 해줍니다.
따라서 Modbus 장치의 논리 구조에 직접 작업하고자 할 때 특히 적합한 모드입니다.
Execute Function
Execute Function 모드에서는 사용 가능한 기능 코드 목록에서 직접 Modbus 기능을 선택하여 실행할 수 있습니다.
여기에는 coils 읽기, discrete inputs 읽기, holding registers 읽기, input registers 읽기, 단일/복수 쓰기 및 프로토콜이 지원하는 기타 기능이 포함됩니다.
이 경우 결과는 장치 맵 표시로만 제한되지 않고 애플리케이션의 로그 영역에도 표시됩니다.
따라서 수신한 응답 내용을 빠르게 확인하거나 특정 Modbus 기능을 테스트하거나, 장치 매핑을 변경하지 않고도 다양한 주소와 수량에 대해 목표 지향 테스트를 수행할 때 매우 유용합니다.
또한 Execute Function 모드는 실행 결과, slave가 반환한 오류, 요청 및 응답과 관련된 정보를 즉시 확인할 수 있어 디버깅에도 매우 편리합니다.
Send Raw Data
이 기능은 slave로 임의의 명령을 16진수 형식으로 송수신합니다.
사용자는 직렬 또는 TCP/IP 같은 활성 연결을 통해 전송할 바이트 시퀀스를 수동으로 입력할 수 있으며, 소프트웨어가 자동으로 프레임을 구성하지 않습니다.
이 기능은 고급 테스트, 리버스 엔지니어링, 진단 또는 Modbus 장치 및 호환 프로토콜 검증에 매우 유용합니다.
실제로 client는 사용자가 입력한 바이트를 그대로 전송하므로 패킷 내용에 대한 완전한 제어가 가능합니다. 따라서 사용자 정의 요청을 시뮬레이션하거나 비정상 응답을 테스트하거나 수동으로 준비한 완전한 프레임을 보낼 수 있습니다.
응답 대기 옵션을 활성화하면 SerialTool은 slave가 보낸 반환 프레임을 받아 트래픽 로그에 표시할 수도 있어 송신 데이터와 수신 데이터를 즉시 비교할 수 있습니다.
Raw 데이터 전송
Modbus Scanner 기능
SerialTool에는 연결된 Slave 장치의 Modbus 주소를 스캔하는 기능이 포함되어 있습니다.
이 기능을 사용하면 시작 주소부터 종료 주소까지의 범위를 빠르게 탐색할 수 있으며, 스캔 중 사용할 기능 코드도 지정할 수 있습니다.
스캐너는 원격 장치의 전체 매핑을 정확히 모를 때나 어떤 주소가 유효하고 어떤 주소가 의미 있는 데이터를 포함하는지 확인하고 싶을 때 특히 유용합니다.
질의된 각 주소에 대해 SerialTool은 테이블에 사용된 기능 유형, 주소, 읽은 값 및 작업 결과를 표시합니다.
이 모드는 제3자 장치와의 진단 및 통합 작업을 크게 가속화하며, slave가 실제로 사용하는 Modbus 메모리 영역을 빠르게 파악하고 나중에 분석하거나 공유할 수 있도록 스캔 결과를 내보낼 수 있게 해줍니다.
주소 테이블
Slave Modbus 레지스터 차트
Modbus 레지스터 값은 차트로 표시할 수 있습니다.
이 기능을 사용하면 장치 매핑의 하나 이상의 요소를 전용 차트 창에 연결하여 polling 또는 업데이트 작업 중 시간에 따라 값을 표시할 수 있습니다.
차트에 연결된 각 레지스터는 고유한 색상과 Modbus 참조, 주소, 현재 값, 요소 이름 등의 정보로 식별되는 자체 트레이스로 표시할 수 있습니다.
이를 통해 장치 동작 중 변화하는 아날로그 변수, 설정값, 측정값 또는 수치 레지스터의 시간 추이를 쉽게 관찰할 수 있습니다.
차트 기능은 모니터링, 테스트 및 동적 분석에 특히 유용하며, 단순 표 형태의 읽기에만 머무르지 않고 데이터가 시간에 따라 어떻게 변화하는지 즉시 확인할 수 있게 해줍니다.
Modbus 레지스터 차트
Modbus 트래픽 로그
송수신된 모든 명령은 Modbus 트래픽 로그 창에 바이트 단위로 표시됩니다.
트래픽 로그는 client가 전송한 데이터와 slave 장치에서 수신한 데이터를 읽기 쉬운 바이트 시퀀스 형태로 자세히 보여주기 때문에 통신 디버깅의 핵심 도구입니다.
이 창을 통해 실제 프레임 내용을 확인하고, 생성된 명령이 올바른지 검증하며, 타임아웃 문제, 비정상 응답, Modbus 예외 또는 예상치 못한 데이터를 진단할 수 있습니다.
트래픽은 일반적인 client 사용 중, 자동 polling 중 또는 raw 데이터 전송 중에도 확인할 수 있습니다.
또한 트래픽 창은 ASCII 또는 16진수 형식으로 데이터 복사, 파일 저장, 내용 검색, 줄 선택, 색상, 글꼴, 간격 및 표시 설정과 같은 그래픽 사용자 정의 기능도 제공합니다.
따라서 트래픽 로그는 단순한 뷰어를 넘어 개발자, 기술자 및 시스템 통합자를 위한 매우 유용한 실무 도구입니다.
Modbus 트래픽