Modbus TCP 는 Modbus 요청(PDU)에 7바이트 MBAP 머리를 붙여 TCP 로 보냅니다. RTU 의 CRC 는 없고, 국번 자리는 MBAP 의 Unit ID 가 맡습니다. «안 된다» 는 증상은 아래 네 층 중 하나에서 나므로 아래층부터 차례로 확인합니다. 규격 내용은 Modbus Messaging on TCP/IP Implementation Guide V1.0b 를 따릅니다.
| 층 | 확인 | 통과하면 |
|---|---|---|
| 1. 네트워크 | 같은 대역인가, ARP·핑이 닿는가 | 장비가 네트워크에 있음 |
| 2. TCP 접속 | 502(또는 설정한 포트)에 접속되는가 | Modbus 서버가 듣고 있음 |
| 3. Modbus 응답 | 요청에 MBAP 응답이 오는가 | Unit ID·함수가 맞음 |
| 4. 값 | 값이 말이 되는가 | 주소 표기·워드 순서가 맞음 |
1. 네트워크: 대역부터
공장 장비는 192.168.1.x 같은 고정 IP 로 나오는 경우가 많아, PC 가 다른 대역이면 핑도 닿지 않습니다. PC 에 그 대역의 IP 를 하나 더 붙이면 지금 네트워크를 끊지 않고 장비에 닿을 수 있습니다(예: 장비 192.168.1.10 → PC 192.168.1.200, 서브넷 마스크 255.255.255.0). 핑을 막아 둔 장비도 있으므로 «핑 안 됨» 만으로 장비가 없다고 단정하지 않습니다 — 같은 대역이면 ARP 로 물어 찾을 수 있습니다.
2. 502 포트에 접속되는가
- 규격은 Modbus TCP 서버가 기본으로 TCP 502 를 듣도록 정하고, 다른 포트도 설정할 수 있게 하라고 권합니다. 장비 설정에서 포트가 바뀌어 있지 않은지 봅니다.
- 접속이 곧바로 거절되면 그 포트를 듣는 프로그램이 없는 것이고, 한참 기다리다 실패하면 방화벽·라우터가 막고 있거나 주소가 틀린 경우가 많습니다.
- 동시에 받는 TCP 접속 수는 규격이 정하지 않고 장비 능력에 맡깁니다. HMI·SCADA 가 이미 자리를 다 쓰고 있으면 새 접속이 거절되거나 포트가 닫힌 것처럼 보입니다. 시험하는 동안 다른 마스터를 잠시 끊거나, 매뉴얼에서 최대 접속 수를 확인합니다.
- PC 가 서버(슬레이브 흉내) 쪽이면 처음 열 때 윈도우 방화벽이 허용을 묻습니다. 허용하지 않으면 다른 장비가 접속하지 못합니다.
3. 접속은 되는데 답이 없을 때: MBAP 와 Unit ID
보유 레지스터 0 부터 2개를 읽는 요청과 그 응답(값 100, 200)입니다.
요청 00 01 00 00 00 06 01 03 00 00 00 02 응답 00 01 00 00 00 07 01 03 04 00 64 00 C8
| 바이트 | 뜻 |
|---|---|
| 00 01 | 트랜잭션 ID — 서버가 응답에 그대로 돌려줌 |
| 00 00 | 프로토콜 ID — Modbus 는 0 |
| 00 06 | 길이 — 뒤따르는 바이트 수(Unit ID + PDU) |
| 01 | Unit ID |
| 03 00 00 00 02 | PDU — 함수 03, 시작 주소 0, 개수 2 |
- 장비가 직접 Modbus TCP 를 말하면 IP 주소로 이미 구분되므로, 규격은 Unit ID 에 의미 없는 값 0xFF(255)를 권하고 0 도 받도록 정합니다. 실제로 어떤 값을 받는지는 장비마다 다르니 매뉴얼을 보고, 모르면 1·255·0 을 차례로 넣어 봅니다.
- 게이트웨이(TCP ↔ RTU 변환기) 뒤의 시리얼 장비라면 Unit ID 가 곧 그 장비의 국번(1~247)입니다. 게이트웨이가 예외 0A(경로 없음)·0B(대상 응답 없음)를 돌려주면 TCP 쪽은 정상이고 게이트웨이 뒤 시리얼 쪽을 봐야 합니다.
- 길이 칸이 실제 바이트 수와 다르면 장비가 요청을 버릴 수 있습니다. 바이트를 손으로 만들어 보낼 때 자주 생깁니다.
- TCP 는 메시지 경계를 지키지 않아 응답이 쪼개지거나 두 개가 붙어 올 수 있습니다. 응답은 MBAP 길이 칸으로 끊고, 트랜잭션 ID 로 요청과 짝지어야 합니다.
4. 접속이 자꾸 끊기거나 다시 안 붙을 때
- 규격은 요청마다 접속을 열고 닫지 말고 열어 둔 채 쓰라고 권합니다. 요청마다 다시 접속하는 마스터는 장비의 접속 자리를 빨리 써 버릴 수 있습니다.
- 서버도 접속을 닫을 수 있고, 클라이언트는 닫힘을 받아들인 뒤 필요할 때 다시 열어야 합니다.
- 케이블이 빠지거나 상대가 꺼진 채 접속이 남으면 장비가 그 자리를 계속 쥐고 있을 수 있습니다. 규격은 양쪽에서 TCP Keep-Alive 를 켜 끊긴 접속을 알아내라고 권합니다. 장비를 껐다 켜야만 다시 접속된다면 이 경우를 의심합니다.
응답은 오는데 값이 이상하면
통신이 아니라 해석 문제입니다. 값이 한 칸씩 밀리면 주소 표기(0 기준·40001), 32비트 값만 이상하면 워드 순서를 봅니다. 예외 응답이 오면 Modbus 응답 없음 점검 글의 예외 표를 보세요.
PortDock 에서는
- Net Scan: 대역을 ARP·핑으로 훑어 502 가 열린 장비를 보여 주고 «IP:502» 를 복사해 줍니다. 장비 정보 읽기(FC 2B/0E)는 Unit ID 1 로 묻고, 안 되면 255 로 묻습니다.
- Modbus Master: Modbus TCP 로 연결하면 트랜잭션 번호로 응답을 맞추고, 늦게 온 지난 요청의 응답은 버립니다.
- TCP: 클라이언트로 502 에 접속해 MBAP 가 붙은 요청을 직접 보내고, 응답의 트랜잭션 ID·길이 칸·Unit ID 를 풀어 봅니다. 중계 모드로 HMI 와 PLC 사이를 오가는 요청을 볼 수도 있습니다.
- 웹 도구 «Modbus 프레임 해석기»: MBAP 가 붙은 HEX 를 붙여 넣으면 머리와 PDU 를 풀어 줍니다.
작성 2026-10-22