Modbus는 산업 장비에서 널리 사용하는 애플리케이션 계층 통신 프로토콜입니다. 클라이언트가 요청을 보내면 서버가 기능 코드에 따라 응답합니다. 프로토콜은 메시지 형식을 정하지만 온도 같은 값의 레지스터 위치는 제조사가 정합니다. 실제 장비를 연결할 때는 해당 장비의 레지스터 표를 함께 확인하세요.이 글의 기능 코드와 메시지 바이트는 16진수입니다. 0F는 10진수 15, 10은 10진수 16입니다.
1. 네 가지 데이터 영역
- 코일: 읽고 쓸 수 있는 1비트. 주로 읽기 01, 단일 쓰기 05, 다중 쓰기 0F를 사용합니다.
- 이산 입력: 읽기 전용 1비트. 기능 코드 02를 사용합니다.
- 입력 레지스터: 읽기 전용 16비트. 기능 코드 04를 사용합니다.
- 홀딩 레지스터: 프로토콜 모델상 읽고 쓸 수 있는 16비트. 읽기 03, 단일 쓰기 06, 다중 쓰기 10을 사용합니다. 장비가 특정 레지스터의 쓰기를 제한할 수 있습니다.
03과 04는 모두 16비트를 읽지만 서로 다른 데이터 영역을 사용합니다. 장비 설명서에서 기능 코드, 레지스터 번호, 자료형, 배율, 접근 권한을 확인하세요.
2. Modbus RTU와 Modbus TCP
RTU는 RS-485 같은 직렬 링크에서 흔히 사용됩니다. 프레임에는 국번, 기능 코드와 데이터, CRC16이 들어갑니다. 같은 버스의 장비는 서로 다른 국번을 사용해야 하며 양쪽의 전송 속도, 데이터 비트, 패리티, 정지 비트가 일치해야 합니다. CRC의 하위 바이트를 먼저 전송합니다.
Modbus TCP는 TCP/IP를 사용하며 일반적으로 포트 502를 사용합니다. 7바이트 MBAP 헤더에 트랜잭션 ID, 프로토콜 ID, 길이, 유닛 ID가 들어갑니다. TCP 프레임에는 RTU의 끝부분 CRC가 없습니다. TCP/직렬 게이트웨이를 거치면 유닛 ID로 뒤쪽 장비를 선택하는 경우가 많습니다.
3. 40001과 주소 0의 관계
문서의 40001은 보통 첫 번째 홀딩 레지스터를 뜻합니다. 앞의 4는 데이터 영역을 나타내며 실제 요청에는 0부터 시작하는 오프셋을 넣습니다. 이 방식에서 40001은 코드 03과 시작 주소 0000, 40002는 0001입니다. 설명서나 도구는 1부터 시작하는 번호 또는 0부터 시작하는 오프셋을 표시할 수 있으므로 쓰기 전에 확인하세요.
레지스터 하나는 16비트입니다. 32비트 정수나 부동소수점은 보통 두 레지스터를 쓰지만 두 워드의 순서는 장비별로 다릅니다. 온도 값을 10으로 나누는 배율도 장비 설명서에 따라 결정됩니다.
4. 홀딩 레지스터 두 개를 읽는 예
예시 장비에서 40001과 40002가 온도와 습도이고 원시 값이 250과 400, 각각 배율이 0.1이라고 가정합니다. 기능 코드 03으로 오프셋 0부터 두 레지스터를 읽습니다. 값과 단위는 설명용이며 모든 장비에 적용되지 않습니다.
PDU request: 03 00 00 00 02
PDU response: 03 04 00 FA 01 90
TCP request: 00 01 00 00 00 06 01 03 00 00 00 02
TCP response: 00 01 00 00 00 07 01 03 04 00 FA 01 90
요청 PDU의 03은 기능 코드, 00 00은 시작 오프셋, 00 02는 개수입니다. 응답의 04는 뒤따르는 데이터의 바이트 수이고 00 FA는 250, 01 90은 400입니다. 가정한 배율을 적용하면 25.0 °C와 40.0%입니다. TCP 예시의 트랜잭션 ID는 0001, 프로토콜 ID는 0000, 유닛 ID는 01이며 MBAP 길이는 0006과 0007입니다. RTU는 같은 PDU 앞에 국번, 뒤에 올바른 CRC16을 붙입니다.
5. 첫 연결 점검
- 처음에는 쓰지 말고 설명서에 명시된 읽기 가능한 값을 선택합니다. 인터페이스, 국번 또는 IP, 포트, 직렬 설정을 확인합니다.
- 데이터 영역과 기능 코드를 선택하고 도구가 “40001” 또는 “오프셋 0” 중 무엇을 요구하는지 확인합니다.
- 적은 수의 레지스터를 읽고 응답 코드와 바이트 수를 확인한 뒤 설명서에 따라 값을 변환합니다.
- 시간 초과라면 배선, 네트워크, 주소를 살펴봅니다. 83 02는 기능 코드 03이 예외 02(잘못된 데이터 주소)를 반환한 것입니다. 시작 오프셋과 개수를 확인하세요.
안전 및 참고 자료
읽기와 특히 쓰기는 실제 설비에 영향을 줄 수 있습니다. 첫 시험에서 쓰기를 피하고 운영망 접근을 제한하세요. 기존 Modbus TCP를 공용 인터넷에 직접 노출하지 말고 지원되는 Modbus Security 또는 네트워크 분리를 검토하세요.