Modbus란? Modbus RTU·ASCII·TCP 차이와 산업용 통신 원리
Modbus란? Modbus RTU·ASCII·TCP 차이와 산업용 통신 원리#
1장 1979년에 등장한 Modbus를 왜 지금도 사용할까#
공장, 빌딩, 물류 설비, 계측 시스템이나 각종 산업 장비를 다루다 보면 상당히 오래된 Protocol 하나를 계속 만나게 됩니다.
바로 Modbus입니다.
Modbus는 1979년 Modicon에서 산업용 장비 통신을 위해 도입한 Protocol입니다. 지금은 Modbus Organization을 중심으로 관련 사양이 공개되어 있으며 다양한 PLC, 계측기, Sensor, Controller, Gateway에서 지원합니다.
그렇다면 이런 의문이 생깁니다.
이렇게 오래된 Protocol을 왜 아직도 사용하는가?
이유는 의외로 단순합니다.
Modbus의 기본 구조가 비교적 단순하기 때문입니다.
어느 장비에
어떤 데이터를
읽을 것인가?
또는
어떤 값을 쓸 것인가?이 질문을 Address와 Function Code, Data로 표현합니다.
복잡한 산업 시스템에서도 이 단순한 구조가 매우 유용합니다.
1.1 산업 현장에서는 최신 기술만 사용할 수 없다#
일반적인 Web Service라면 오래된 Protocol을 비교적 쉽게 교체할 수 있습니다.
산업 현장은 다릅니다.
한 번 설치된:
PLC
전력 계측기
온도 Controller
Sensor
Motor Controller
차단기 Controller가 10년 이상 사용되기도 합니다.
전체 설비를 Protocol 하나 때문에 교체하기는 어렵습니다.
그래서 새 Server와 오래된 장비를 연결해야 하는 상황이 계속 생깁니다.
이런 환경에서 오래전부터 여러 제조사가 지원해온 Modbus는 여전히 실용적인 선택지가 됩니다.
2장 Modbus는 RS-485 자체가 아니다#
가장 먼저 구분해야 할 것이 있습니다.
Modbus
=
RS-485는 아닙니다.
Modbus는 Application Layer의 Message Protocol이고 RS-485는 전기적인 Serial Interface입니다. 공식 Modbus Application Protocol 역시 Modbus가 TCP/IP와 비동기 Serial 전송 등 서로 다른 Network나 Bus 위에서 구현될 수 있다고 설명합니다.
관계를 단순화하면:
Modbus RTU
↓
RS-485 / RS-232 등
Modbus ASCII
↓
Serial 통신
Modbus TCP
↓
TCP/IP
↓
Ethernet 등을 사용하는 Network처럼 볼 수 있습니다.
따라서:
RS-485를 사용한다.는 것만으로 Modbus 장비라는 뜻은 아닙니다.
RS-485 위에서 제조사 자체 Binary Protocol을 사용할 수도 있습니다.
3장 Modbus의 기본 구조는 요청과 응답이다#
Modbus의 핵심 동작은 비교적 간단합니다.
Client가 요청합니다.
이 장비의 Register를 읽어줘.Server가 응답합니다.
현재 값은 125입니다.전체 흐름:
Modbus Client
│
│ Request
▼
Modbus Server
│
│ Response
▼
Modbus Client공식 Modbus Application Protocol은 이를 Request/Reply Protocol로 정의하며, 수행할 작업은 Function Code로 지정합니다.
3.1 Master·Slave와 Client·Server#
오래된 현장 문서에서는 흔히:
Master
Slave라는 용어를 볼 수 있습니다.
최근 Modbus 문서와 관련 도구에서는 주로:
Client
Server를 사용합니다.
기본 개념은:
Client
→ Request를 시작
Server
→ Request를 처리하고 Response입니다.
따라서 오래된 장비 Manual의 Slave Address와 최신 Software의 Server Address 또는 Device ID가 같은 종류의 개념을 가리키는 경우가 있습니다.
4장 Modbus RTU·ASCII·TCP는 무엇이 다른가#
Modbus를 처음 접하면 가장 먼저 세 가지 이름을 만나게 됩니다.
Modbus RTU
Modbus ASCII
Modbus TCP기본적인 Application 의미는 비슷하지만 Message를 전달하는 방식이 다릅니다.
4.1 Modbus RTU#
RTU는 Binary 형태의 Serial Frame을 사용합니다.
개념적으로:
[Address]
[Function]
[Data]
[CRC]형태입니다.
Binary 방식이기 때문에 같은 데이터를 ASCII 문자로 표현하는 것보다 비교적 작은 Frame을 만들 수 있습니다.
RS-485 기반 산업 장비에서 흔히 볼 수 있습니다.
4.2 Modbus ASCII#
Modbus ASCII에서는 Data를 ASCII 문자로 표현합니다.
예를 들어 Binary Byte:
01 03을 문자 형태로 표현하면:
0103처럼 전송될 수 있습니다.
Frame은 :로 시작하고 CR/LF로 끝나는 구조를 사용하며 오류 검출에는 LRC를 사용합니다.
사람이 Terminal에서 확인하기 상대적으로 편하지만 같은 정보를 표현할 때 RTU보다 많은 Byte가 필요합니다.
현대 현장에서는 RTU보다 접할 기회가 적은 편입니다.
4.3 Modbus TCP#
Modbus TCP는 Modbus Message를 TCP/IP Network에서 전달합니다.
일반적으로:
Modbus Client
↓
TCP
↓
IP
↓
Ethernet Network
↓
Modbus Server구조로 사용합니다.
표준적으로 TCP Port 502를 사용합니다.
5장 RTU Frame을 보면 Modbus가 이해되기 시작한다#
Modbus RTU의 기본적인 구조를 단순화하면 다음과 같습니다.
[Device Address]
[Function Code]
[Data]
[CRC]예를 들어:
01 03 00 00 00 02 C4 0B이라는 Frame을 생각해봅시다.
구조적으로 보면:
01
→ Device Address
03
→ Function Code
00 00
→ 시작 Address
00 02
→ 읽을 Register 수
C4 0B
→ CRC처럼 해석할 수 있습니다.
HEX 한 줄도 Field를 분리하면 의미 있는 명령이 됩니다.
5.1 Device Address#
Serial Modbus에서는 대상 장비를 식별할 Address가 필요합니다.
예:
Device 1
Address = 1
Device 2
Address = 2
Device 3
Address = 3Client가:
01 ...을 보내면 Address 1인 Device가 처리합니다.
6장 Function Code가 Modbus의 핵심이다#
Modbus에서는 Function Code가 어떤 작업을 할지 결정합니다.
공식 Modbus Application Protocol에는 대표적으로 다음 Function이 정의되어 있습니다.
| Function Code | 기능 |
|---|---|
0x01 |
Read Coils |
0x02 |
Read Discrete Inputs |
0x03 |
Read Holding Registers |
0x04 |
Read Input Registers |
0x05 |
Write Single Coil |
0x06 |
Write Single Register |
0x0F |
Write Multiple Coils |
0x10 |
Write Multiple Registers |
예를 들어:
03은 Holding Register를 읽는 Function입니다.
그래서:
01 03 ...을 보면:
Device 1에게
Holding Register를 읽어달라는 요청이라고 해석하기 시작할 수 있습니다.
7장 Coil과 Register가 무엇인가#
Modbus를 이해하려면 네 가지 Data Model을 알아야 합니다.
공식 Modbus Data Model 역시 Coil, Discrete Input, Input Register, Holding Register의 네 영역을 정의합니다.
7.1 Coil#
1 Bit 단위의 Read/Write Data입니다.
개념적으로:
0
→ OFF
1
→ ON입니다.
예를 들어 장비 제조사가 다음처럼 Mapping할 수 있습니다.
Coil 0
→ Gate Open Command
Coil 1
→ Light ON/OFF단 실제 의미는 제조사 Register Map에서 확인해야 합니다.
7.2 Discrete Input#
1 Bit 상태값이며 일반적으로 읽기 용도로 사용합니다.
예:
Vehicle Sensor
Door Sensor
Alarm Contact등을 Mapping할 수 있습니다.
7.3 Input Register#
16 Bit 단위의 읽기용 Data 영역입니다.
예:
온도
전압
전류
Sensor 측정값등을 표현하는 데 사용할 수 있습니다.
7.4 Holding Register#
16 Bit 단위 Register로 읽기와 쓰기에 널리 사용됩니다.
예:
설정값
Device 상태
Counter
Threshold
운전 Parameter등을 저장하도록 제조사가 정의할 수 있습니다.
8장 가장 헷갈리는 것이 Register Address다#
Modbus 개발에서 초보자가 자주 만나는 문제가 있습니다.
문서에는:
40001이라고 되어 있는데 Library에서는:
address=0을 사용해야 하는 경우입니다.
일부 문서에서 사용하는 4xxxx 표기는 Holding Register 영역을 사람이 쉽게 구분하기 위한 Reference 방식이고 실제 Protocol Address는 0부터 시작할 수 있습니다.
예:
문서 표시
40001
Protocol Address
0문서 표시
40100
Protocol Address
99처럼 대응할 수 있습니다. 현재 PyModbus 문서도 이 차이를 명시하고 있습니다.
8.1 무조건 1을 빼면 된다는 뜻은 아니다#
여기서 더 중요한 것이 있습니다.
장비 제조사 Manual이:
40001방식을 쓰는지:
0
1
2
3같은 Raw Address 방식을 쓰는지 먼저 확인해야 합니다.
제조사마다 Register Map 표현 방식이 다를 수 있습니다.
따라서 다음을 확인합니다.
Register 번호인가?
Protocol Address인가?
0-based인가?
1-based인가?Modbus에서 매우 흔한 장애 원인입니다.
9장 Modbus RTU와 ASCII는 오류 검출 방식도 다르다#
9.1 RTU는 CRC#
Modbus RTU Frame에는 CRC가 포함됩니다.
[Address]
[Function]
[Data]
[CRC]수신 장비는 Frame을 이용해 CRC를 계산하고 전달된 CRC와 비교합니다.
다르면 Frame을 정상 요청으로 처리하지 않습니다.
9.2 ASCII는 LRC#
Modbus ASCII에서는 LRC를 사용합니다.
따라서:
Modbus RTU
→ CRC
Modbus ASCII
→ LRC라고 기억하면 됩니다.
9.3 Modbus TCP에는 RTU의 CRC Field가 없다#
Modbus TCP에서는 RTU Frame을 단순히 TCP에 그대로 넣는 것이 아닙니다.
Modbus TCP는 MBAP Header를 사용합니다.
개념적으로:
[MBAP Header]
[Function Code]
[Data]형태입니다.
Serial RTU의 CRC Field를 그대로 붙이지 않습니다.
10장 Modbus TCP의 MBAP Header는 무엇인가#
Modbus TCP를 분석하면 RTU에는 없던 Header가 나타납니다.
MBAP는 Modbus Application Protocol Header입니다.
주요 Field는:
Transaction Identifier
Protocol Identifier
Length
Unit Identifier입니다.
구조를 단순화하면:
[Transaction ID]
[Protocol ID]
[Length]
[Unit ID]
[Function]
[Data]입니다.
10.1 Transaction ID#
TCP에서는 여러 요청을 구분할 필요가 있습니다.
Transaction Identifier를 이용하면 Request와 Response를 연결할 수 있습니다.
Request
Transaction ID = 15
Function = 03Response:
Transaction ID = 15
Function = 03처럼 Matching할 수 있습니다.
10.2 Unit Identifier#
특히 Modbus TCP와 Serial Modbus 사이에 Gateway가 존재할 때 뒤쪽 Serial Device를 식별하는 용도로 활용될 수 있습니다.
예:
Modbus TCP Client
│
▼
Gateway
│
├─ RTU Device 1
├─ RTU Device 2
└─ RTU Device 3이런 구조에서 Unit Identifier의 의미가 중요해질 수 있습니다.
11장 주차관제 같은 산업 현장에서는 어떻게 사용할까#
예를 들어 다음 시스템을 생각해보겠습니다.
Central Server
│
│ TCP/IP
▼
Modbus Gateway
│
│ RS-485
├── Controller 1
├── Controller 2
└── Controller 3각 Controller에 다음 상태가 Mapping되어 있다고 가정합니다.
Coil 0
→ Gate Open Command
Discrete Input 0
→ Vehicle Detected
Discrete Input 1
→ Gate Fully Open
Holding Register 0
→ Device Status
Holding Register 1
→ Error CodeServer는 주기적으로 상태를 읽을 수 있습니다.
Read Discrete Inputs또 필요한 경우 설정값을 읽거나 쓸 수 있습니다.
중요한 점은 Modbus가 Gate나 차량이라는 의미를 정의하는 것은 아니라는 것입니다.
11.1 Register의 업무 의미는 제조사가 정의한다#
Modbus는:
Holding Register를 읽어라.라는 방법을 정의합니다.
하지만:
Register 100
=
Gate 상태라고 정해주는 것은 아닙니다.
그 의미는 장비 제조사가 Register Map에서 정의합니다.
그래서 Modbus 장비를 연동할 때 Protocol Specification 못지않게 중요한 문서가:
제조사 Register Map입니다.
12장 RS-485 Modbus RTU 현장에서 무엇을 확인해야 할까#
Modbus RTU가 동작하지 않는다면 Protocol만 봐서는 안 됩니다.
먼저 Serial 설정을 확인합니다.
Baud Rate
Data Bits
Parity
Stop Bits예:
9600-8-E-1장비 양쪽 설정이 동일해야 합니다.
12.1 RS-485 배선도 확인한다#
확인 항목:
A / B 또는 D+ / D-
배선 극성
종단저항
Bias
Topology
공통 기준 전위
Shield / Ground입니다.
특히 A/B 명칭은 제조사마다 표기가 다르게 사용되는 경우가 있으므로 이름만 믿기보다 Manual의 D+, D-, Non-inverting, Inverting 정의까지 확인하는 편이 안전합니다.
12.2 종단저항은 모든 장비에 다는 것이 아니다#
RS-485 Bus에서는 일반적으로 Cable의 특성 임피던스에 맞는 Termination을 전기적 양 끝에 배치하는 방식을 사용합니다.
흔히 약 120Ω이 사용되지만:
모든 Device에 120Ω을 연결하는 것은 올바른 일반 원칙이 아닙니다.
Cable, Topology, Transceiver와 제조사 권장사항을 확인해야 합니다.
13장 Modbus TCP 장애는 다른 순서로 본다#
Modbus TCP에서는 먼저 Network 계층부터 확인합니다.
IP Address
Subnet Mask
Gateway
VLAN
Routing
TCP Port
Firewall그리고:
TCP 502 연결 가능여부를 확인합니다.
그다음 Modbus Application Layer를 확인합니다.
Transaction ID
Unit ID
Function Code
Register Address
Quantity
Exception Response즉:
Ping 성공만으로 Modbus가 정상이라고 판단해서는 안 됩니다.
13.1 Port 502가 열려 있어도 Modbus 요청은 실패할 수 있다#
TCP Connection:
CONNECTED상태더라도:
잘못된 Function Code
잘못된 Register Address
지원하지 않는 Quantity
잘못된 Unit ID때문에 Modbus 요청은 실패할 수 있습니다.
Network 연결 성공과 Application 요청 성공을 분리해서 판단해야 합니다.
14장 Modbus Exception Response를 읽을 줄 알아야 한다#
Modbus Server가 요청을 정상적으로 수행하지 못하면 Exception Response를 반환할 수 있습니다.
대표적으로:
Illegal Function
Illegal Data Address
Illegal Data Value
Server Device Failure같은 유형이 있습니다. 공식 Application Protocol은 Function Code별 동작과 함께 Exception Response 체계를 정의합니다.
예를 들어:
FC 03
Read Holding Registers를 보냈는데 대상 Register가 존재하지 않는다면 Illegal Data Address 계열의 응답을 받을 수 있습니다.
이 경우 계속 Retry한다고 문제가 해결되지는 않습니다.
Register Map을 다시 확인해야 합니다.
15장 Modbus TCP를 Python으로 읽어보자#
현재 PyModbus 문서 기준으로 TCP Client는 다음과 같이 가져올 수 있습니다.
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient(
host="192.168.0.100",
port=502
)
if client.connect():
result = client.read_coils(
address=0,
count=1,
slave=1
)
if not result.isError():
print(result.bits[0])
client.close()이 코드는 읽기 예제입니다.
중요한 것은:
address=0이 제조사 Manual에서 어떤 Coil을 의미하는지 확인하는 것입니다.
15.1 Holding Register 읽기#
예:
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient("192.168.0.100", port=502)
if client.connect():
result = client.read_holding_registers(
address=0,
count=2,
slave=1
)
if not result.isError():
print(result.registers)
client.close()Function Code로 보면:
03
Read Holding Registers에 해당합니다.
실제 현장에서는 Timeout과 예외 처리, Connection 복구 등을 함께 구현해야 합니다.
16장 Register 두 개를 읽었다고 바로 값이 되는 것은 아니다#
Modbus Register 하나는 기본적으로 16 Bit입니다.
32-bit Integer나 Float를 표현하려면 두 Register를 사용할 수 있습니다.
예:
Register 100
12 34
Register 101
56 78그런데 문제는 순서입니다.
장비에 따라:
12 34 56 78일 수도 있고:
56 78 12 34일 수도 있습니다.
Byte Order뿐 아니라 Word Order까지 확인해야 할 수 있습니다.
16.1 Float 해석 오류가 자주 발생하는 이유#
예를 들어 장비에는:
25.5°C가 저장되어 있는데 Application에서:
-0.00000001같은 이상한 값이 나온다고 하겠습니다.
가능한 원인:
Register Address 오류
Data Type 오류
Byte Order 오류
Word Order 오류
Scale 적용 오류입니다.
Modbus 자체가 이 두 Register는 IEEE 754 Float이다라고 자동으로 알려주는 것이 아닙니다.
제조사 Register Map을 확인해야 합니다.
17장 Serial-to-Ethernet Gateway에서는 더 조심해야 한다#
현장에서는 오래된 Modbus RTU 장비를 Network에 연결하기 위해 Gateway를 많이 사용합니다.
Server
│
│ Ethernet
▼
Serial-to-Ethernet Gateway
│
│ RS-485
▼
Modbus RTU Device이때 장애 지점이 하나 더 늘어납니다.
Server
TCP Network
Gateway
Serial 설정
RS-485 Bus
Device중 어느 곳에서든 문제가 생길 수 있습니다.
17.1 Gateway가 있다고 반드시 Modbus TCP는 아니다#
중요한 구분입니다.
어떤 Serial-to-Ethernet 장비는 단순히:
TCP Byte Stream
↔
Serial Byte Stream을 변환하는 Transparent Mode로 동작합니다.
이 경우 TCP 안으로 Modbus RTU Frame이 그대로 전달될 수도 있습니다.
다른 Gateway는:
Modbus TCP
↔
Modbus RTU를 실제로 변환합니다.
둘은 전혀 다른 구조이므로 Gateway Mode를 확인해야 합니다.
18장 Timeout과 Polling 주기를 잘못 잡으면 시스템이 느려진다#
Modbus는 상태를 주기적으로 읽는 Polling 방식으로 많이 사용됩니다.
예:
Device 1 조회
↓
Device 2 조회
↓
Device 3 조회
↓
Device 4 조회
↓
다시 Device 1장비 하나가 응답하지 않으면 Timeout만큼 기다립니다.
예를 들어:
Timeout
2초
Offline Device
10대라면 전체 Polling Cycle이 크게 느려질 수 있습니다.
18.1 Retry를 많게 하는 것이 항상 안정적인 것은 아니다#
예:
Timeout 2초
Retry 3회라면 Offline Device 하나 때문에 상당한 시간이 소비될 수 있습니다.
특히 하나의 RS-485 Bus에 여러 장비가 연결되어 있다면 다른 장비 Polling까지 늦어집니다.
따라서:
Timeout
Retry
Polling Interval
Offline Device 처리를 함께 설계해야 합니다.
19장 왜 현장에서는 결국 Modbus를 계속 사용하게 될까#
Modbus가 최신 Protocol보다 모든 면에서 뛰어나기 때문은 아닙니다.
오히려 기능적으로는 단순합니다.
그런데 산업 현장에서는 그 단순함이 장점이 됩니다.
Protocol 구조가 비교적 단순
많은 제조사가 지원
PLC·Sensor·Meter 등 장비가 풍부
Serial과 TCP 환경 모두 존재
Gateway 제품이 많음
Troubleshooting 자료가 풍부그리고 가장 중요한 것은:
이미 설치된 수많은 장비가 Modbus를 사용하고 있다는 사실입니다.
그래서 새로운 시스템에서도 기존 설비와 연결하기 위해 Modbus 지원이 필요해집니다.
20장 Modbus가 모든 상황에 좋은 것은 아니다#
Modbus에는 한계도 있습니다.
기본적인 Modbus Protocol은:
사용자 인증
권한 관리
암호화를 기본 기능으로 제공하도록 설계된 Protocol이 아닙니다.
따라서 일반 Modbus TCP를 신뢰할 수 없는 Network에 그대로 노출하는 것은 적절하지 않습니다.
20.1 Modbus Security도 존재한다#
현재 Modbus Organization은 기존 Modbus에 TLS를 결합한 Modbus Security Protocol도 제공합니다.
Modbus Security는 TLS를 통해 인증과 Message Integrity 보호를 제공하고 X.509v3 인증서를 이용한 Client·Server 인증을 정의하며 Port 802를 사용합니다.
하지만 실제 산업 현장에는 기존 Modbus TCP 장비도 매우 많습니다.
따라서 현실적인 보안에서는:
Network 분리
Firewall
VLAN
ACL
VPN
Gateway
접근 통제같은 대책도 함께 사용합니다.
21장 Modbus 장애를 계층별로 나누면 빨리 찾을 수 있다#
Modbus RTU#
1. 전원
↓
2. RS-485 배선
↓
3. A/B 극성
↓
4. 종단·Bias
↓
5. Baud / Parity / Stop Bit
↓
6. Device Address
↓
7. Function Code
↓
8. Register Address
↓
9. CRC
↓
10. Application Data 해석Modbus TCP#
1. Link
↓
2. IP
↓
3. VLAN / Routing
↓
4. TCP Port
↓
5. Connection
↓
6. Unit ID
↓
7. Function Code
↓
8. Register Address
↓
9. Exception Response
↓
10. Application Data 해석Modbus가 안 된다라는 한 문장을 이렇게 분해하면 진단이 훨씬 쉬워집니다.
22장 현장에서 자주 하는 잘못된 판단#
Modbus는 RS-485 Protocol이다#
아닙니다.
Modbus는 Application Protocol이며 Serial과 TCP/IP 등 여러 방식으로 사용할 수 있습니다.
Modbus RTU는 무조건 RS-485다#
RS-485에서 매우 흔하지만 Modbus Serial 통신 자체를 RS-485 하나로만 제한해서 이해하면 안 됩니다.
Register 40001을 Library에 40001이라고 넣으면 된다#
Library가 Protocol Address를 요구한다면 0을 넣어야 할 수도 있습니다.
주소 표기 방식을 반드시 확인해야 합니다.
TCP 502가 열려 있으면 Modbus가 정상이다#
Network Connection과 Modbus 요청 성공은 다른 문제입니다.
Modbus TCP에는 RTU CRC가 그대로 붙는다#
일반적인 Modbus TCP ADU에서는 Serial RTU CRC를 사용하지 않습니다.
CRC Error면 CRC Algorithm이 잘못됐다#
Noise나 Serial 설정 문제로 Byte가 손상된 결과일 수도 있습니다.
Modbus TCP는 TCP니까 안전하다#
TCP는 암호화를 의미하지 않습니다.
Register 값은 Modbus가 의미까지 정의한다#
Modbus는 Data Model과 접근 방법을 정의하지만 실제 Register가 무엇을 의미하는지는 제조사 Device Map이 정의합니다.
23장 현장 점검 체크리스트#
□ Modbus RTU·ASCII·TCP 중 어떤 방식인가?
□ Serial인가 TCP/IP인가?
□ Device Address 또는 Unit ID는 무엇인가?
□ Baud Rate는 같은가?
□ Data Bit·Parity·Stop Bit는 같은가?
□ RS-485 A/B 배선은 제조사 정의와 일치하는가?
□ 종단과 Bias 구성이 적절한가?
□ Function Code는 무엇인가?
□ Coil·Register Address가 맞는가?
□ 주소가 0-based인지 1-based인지 확인했는가?
□ Data Type을 확인했는가?
□ Byte Order를 확인했는가?
□ Word Order를 확인했는가?
□ Scale 값을 확인했는가?
□ RTU라면 CRC가 정상인가?
□ TCP라면 Port와 Firewall을 확인했는가?
□ Exception Response를 확인했는가?
□ Gateway가 Transparent Mode인지 Protocol 변환 방식인지 확인했는가?
□ Timeout과 Retry가 적절한가?
□ Network 보안 대책이 적용되어 있는가?24장 자기 점검#
Modbus RTU와 Modbus TCP의 가장 큰 차이는 무엇인가#
Modbus Application의 기본적인 Function과 Data Model은 공유하지만 전달 방식과 Frame 구조가 다릅니다. RTU는 Serial Line에서 Binary Frame과 CRC를 사용하고, Modbus TCP는 TCP/IP와 MBAP Header를 사용합니다.
Coil과 Holding Register의 차이는 무엇인가#
Coil은 1 Bit 단위의 Read/Write Data이고 Holding Register는 16 Bit 단위의 Read/Write Data 영역입니다.
Function Code 03은 무엇인가#
Holding Register를 읽는 Read Holding Registers입니다.
문서에 40001이라고 되어 있는데 왜 코드에서는 address=0을 사용할 수 있는가#
문서의 Register Reference 표기와 실제 Protocol Address가 서로 다를 수 있기 때문입니다. 제조사 Manual과 Library의 Address 방식을 모두 확인해야 합니다.
Modbus TCP가 연결되어 있으면 장비가 정상인가#
아닙니다. TCP Connection이 정상이어도 Unit ID, Function Code, Register Address 또는 장비 내부 상태 때문에 Modbus 요청이 실패할 수 있습니다.
25장 이 글을 마치며#
Modbus는 오래된 Protocol입니다.
하지만 단순히 오래됐다는 이유만으로 사라지지 않습니다.
산업 현장에서 중요한 것은:
가장 최신인가?보다:
기존 장비와 연결할 수 있는가?
구조를 쉽게 이해할 수 있는가?
현장에서 진단할 수 있는가?
여러 제조사가 지원하는가?인 경우가 많기 때문입니다.
Modbus의 전체 구조를 정리하면:
Client
↓
Request
↓
Device / Unit Address
↓
Function Code
↓
Coil / Register
↓
Server
↓
Response 또는 Exception으로 이해할 수 있습니다.
그리고 전송 환경에 따라:
Modbus RTU
→ Serial + Binary Frame + CRC
Modbus ASCII
→ Serial + ASCII 표현 + LRC
Modbus TCP
→ TCP/IP + MBAP Header로 구분할 수 있습니다.
특히 다음 다섯 가지를 기억하면 됩니다.
Modbus는 RS-485 자체가 아니라 장비가 데이터를 읽고 쓰기 위한 Application Protocol입니다.
Modbus RTU·ASCII·TCP는 같은 계열이지만 Frame 구성과 전달 방식이 다릅니다.
Modbus를 이해하려면 Function Code와 Coil·Discrete Input·Input Register·Holding Register의 관계를 알아야 합니다.
Register 주소 표기와 실제 Protocol Address가 다를 수 있으므로 0-based·1-based 문제를 반드시 확인해야 합니다.
Modbus 통신 장애는 Protocol만 볼 것이 아니라 RS-485 배선부터 TCP Network, Address, Function Code, Register Mapping까지 계층별로 추적해야 합니다.
결국 Modbus를 이해하는 핵심은 HEX 값을 암기하는 데 있지 않습니다.
어느 장비에 어떤 Function Code를 보내 어떤 Coil 또는 Register를 읽고 쓰는지를 이해하고, 그 요청과 응답이 Serial 또는 TCP 환경에서 어떻게 전달되는지를 추적할 수 있는 것이 핵심입니다.