Modbus 통신 오류 해결 방법, 타임아웃·CRC 오류·예외 코드 점검
요약
Modbus 통신 오류는 마스터가 보낸 요청에 슬레이브가 응답하지 않거나(타임아웃), 깨진 응답을 보내거나(CRC 오류), 요청을 거절하는(예외 응답) 상태입니다.
세 증상은 원인이 서로 달라서 증상부터 구분해야 점검 범위를 줄일 수 있습니다.
이 글에서는 국번·통신속도·패리티·배선·종단저항·폴링 간격을 증상별 점검표로 정리하고, 예외 코드 01~0B의 뜻과 현장 진단 순서를 다룹니다. Modbus 직렬 규격의 기본값은 19,200bps, 짝수(Even) 패리티이고 국번은 1~247을 씁니다.
센서를 새로 달고 Modbus RTU 로 묶었는데 화면에 값이 뜨지 않는 일은 현장에서 아주 흔합니다. 반대로 몇 달 잘 돌던 시스템이 어느 날부터 몇 분에 한 번씩 값이 끊기기도 합니다. 둘 다 "통신이 안 된다"로 보고되지만 원인은 설정 한 글자일 수도 있고 배선 한 가닥일 수도 있습니다.
통신 오류를 빨리 잡는 방법은 증상을 먼저 세 가지로 나누는 것입니다. 응답이 아예 없는지, 응답은 오는데 깨지는지, 응답이 왔는데 거절인지에 따라 봐야 할 곳이 완전히 달라집니다. 아래 순서대로 보면 대부분의 문제는 현장에서 한 시간 안에 원인을 좁힐 수 있습니다.
1. Modbus 통신 오류란?
Modbus 는 마스터(클라이언트)가 묻고 슬레이브(서버)가 답하는 방식의 통신 규약입니다. 마스터는 요청을 보낸 뒤 정해진 시간 동안 응답을 기다리며, 이 과정 어디서든 문제가 생기면 통신 오류로 기록됩니다.
Modbus 직렬 규격에는 중요한 규칙이 하나 있습니다. 슬레이브는 받은 프레임에서 오류(패리티 오류, CRC 불일치)를 발견하면 아무 응답도 보내지 않습니다. 그래서 배선 노이즈로 요청이 깨져도 마스터 쪽에는 CRC 오류가 아니라 타임아웃으로 찍히는 경우가 많습니다. 로그에 타임아웃만 보인다고 해서 배선 문제를 빼면 안 되는 이유가 여기 있습니다.
2. Modbus 오류의 세 가지 종류는?
2-1. 타임아웃 (응답 없음)
마스터가 설정한 응답 대기 시간 안에 응답이 하나도 오지 않은 상태입니다. 국번이 틀렸거나 통신속도·패리티가 맞지 않거나 배선이 끊긴 경우가 가장 많고, 장비 전원이 꺼진 경우도 여기에 포함됩니다.
2-2. CRC 오류 (응답이 깨짐)
Modbus RTU 프레임 끝에는 2바이트 오류 검사 값(CRC, Cyclic Redundancy Check)이 붙습니다. CRC 는 16비트 레지스터를 모두 1로 채운 상태에서 계산을 시작하고, 낮은 바이트를 먼저 붙여 보냅니다. 마스터가 받은 응답으로 다시 계산한 값과 붙어 온 값이 다르면 CRC 오류입니다. 응답이 오기는 하므로 국번과 기본 설정은 대체로 맞고, 전송 도중 신호가 망가진 쪽을 의심합니다.
2-3. 예외 응답 (요청 거절)
슬레이브가 요청을 정상으로 받았지만 처리할 수 없을 때 돌려주는 응답입니다. 응답의 함수 코드에 0x80 을 더해 보내므로 03 읽기 요청이 거절되면 0x83 이 돌아옵니다. 통신 선로는 정상이라는 뜻이므로 배선을 볼 필요가 없고, 요청 내용(함수 코드, 주소, 개수)을 고칩니다.
| 증상 | 선로 상태 | 먼저 볼 곳 |
|---|---|---|
| 타임아웃 (항상) | 통신이 성립하지 않음 | 국번, 통신속도, 패리티, A/B 배선, 전원 |
| 타임아웃 (가끔) | 대체로 성립, 간헐적 손실 | 폴링 간격, 응답 대기 시간, 노이즈, 종단저항 |
| CRC 오류 | 응답은 오지만 손상됨 | 종단저항, 바이어스, 접지, 차폐, 국번 중복 |
| 예외 응답 | 정상 | 함수 코드, 레지스터 주소, 읽는 개수, 쓰기 값 |
3. Modbus 타임아웃 원인과 점검표
Modbus RTU 타임아웃은 통신 설정이 하나라도 다르면 바로 생깁니다. 마스터와 슬레이브는 통신속도, 데이터 비트, 패리티, 정지 비트가 모두 같아야 하고 국번도 정확히 맞아야 합니다.
| 점검 항목 | 확인 방법 | 자주 보이는 실수 |
|---|---|---|
| 국번(Slave ID) | 장비 설정 화면·DIP 스위치와 마스터 설정 비교 | 출고 기본값 1 그대로 여러 대 연결, DIP 스위치 이진수 오독 |
| 통신속도 | 양쪽 bps 값 비교 | 장비는 9,600, 마스터는 19,200 |
| 패리티·정지 비트 | 8-E-1, 8-N-2, 8-N-1 중 무엇인지 확인 | 장비 8-N-1, 마스터 8-E-1 (규격 기본값과 제조사 기본값이 다름) |
| A/B(+/-) 배선 | 두 선을 바꿔 연결해 보기 | 제조사마다 A/B 표기 기준이 달라 반대로 연결 |
| 통신 방식 | RTU 인지 ASCII 인지 확인 | 마스터는 RTU, 장비는 ASCII 로 설정 |
| 응답 대기 시간 | 장비 응답 시간보다 넉넉한지 확인 | 게이트웨이를 거치는데 100ms 로 짧게 설정 |
Modbus 직렬 규격은 짝수 패리티를 기본값으로 정하고, 패리티를 쓰지 않으면 정지 비트를 2개로 채워 한 글자를 11비트로 맞추라고 합니다. 하지만 실제 장비 상당수는 출고 설정이 8-N-1 이므로 규격만 믿지 말고 장비 설명서의 값을 확인합니다. 규격상 필수 통신속도는 9,600bps 와 19,200bps 이며 기본값은 19,200bps 입니다.
국번은 1~247 을 장비마다 하나씩 씁니다. 0 은 모든 장비에 한꺼번에 보내는 방송(Broadcast) 주소라서 슬레이브가 응답하지 않으며, 248~255 는 예약된 번호입니다. 국번 0 으로 읽기를 시도하면 타임아웃이 나는 것이 정상입니다.
4. Modbus CRC 오류 원인과 해결
CRC 오류가 반복되면 신호 품질 문제일 가능성이 큽니다. RS-485 선로는 꼬임 쌍선(Twisted Pair)으로 데이지 체인(한 줄로 이어 가는 방식) 배선을 하고, 선로 양 끝 두 곳에만 종단저항을 답니다.
4-1. 종단저항과 바이어스(극성) 저항
Modbus 직렬 규격은 종단저항으로 150Ω(0.5W) 저항을 쓸 수 있다고 하며, 바이어스 저항을 함께 쓰는 경우에는 120Ω(0.25W) 저항에 1nF 커패시터를 직렬로 단 구성을 더 낫다고 봅니다. 바이어스 저항은 아무도 송신하지 않을 때 선로 전압을 한쪽으로 고정해 잡음이 데이터로 읽히는 것을 막는 저항이고, 규격이 정한 값은 450~650Ω 입니다. 종단저항을 중간 장비마다 모두 켜 두면 신호가 너무 약해져 오히려 오류가 늘어납니다.
4-2. 거리와 장비 수
규격은 중계기(Repeater) 없이 32대까지는 언제나 연결할 수 있다고 정하고, 9,600bps 이하에서 AWG26 이상 굵기의 선을 쓸 때 간선 최대 길이를 1,000m 로 봅니다. 통신속도를 올리면 허용 거리는 짧아지므로 장거리 현장에서 CRC 오류가 잦다면 통신속도를 한 단계 낮춰 보는 것이 빠른 확인 방법입니다. RS-485 배선 전반은 RS485 완전정리 글에 자세히 정리했습니다.
4-3. 노이즈와 접지
인버터, 모터 동력선과 통신선을 같은 전선관에 넣으면 CRC 오류가 운전 상황에 따라 늘었다 줄었다 합니다. 차폐선의 차폐는 한쪽 끝에서만 접지하고, 통신선은 동력선과 떨어뜨려 배선합니다. 원인별 대책은 산업용 센서 노이즈와 신호 안정성 글을 함께 보면 좋습니다.
4-4. 국번 중복
같은 국번을 가진 장비 두 대가 동시에 답하면 두 신호가 겹쳐 CRC 오류가 됩니다. 장비를 하나씩 떼어 가며 오류가 사라지는 시점을 찾으면 중복 장비를 금방 찾을 수 있습니다.
5. Modbus 예외 코드는 무엇을 뜻할까?
예외 응답에는 1바이트 예외 코드가 들어 있습니다. 함수 코드별 요청 구조는 Modbus 함수 코드 01~16 정리 글에 프레임 예시로 정리했으니, 여기서는 현장 대처 위주로 봅니다.
| 코드 | 이름 | 현장에서 흔한 원인과 대처 |
|---|---|---|
| 01 | Illegal Function | 장비가 지원하지 않는 함수 코드. 03 대신 04 로 읽어야 하는 장비인지 설명서 확인 |
| 02 | Illegal Data Address | 없는 레지스터 주소, 또는 시작 주소+개수가 범위를 넘음. 주소 1 차이(오프셋) 확인 |
| 03 | Illegal Data Value | 요청 데이터 칸의 값이 허용되지 않음. 한 번에 읽는 개수를 줄여 보기 |
| 04 | Server Device Failure | 장비 내부 오류. 센서 단선, 장비 재시작 후 재확인 |
| 05 | Acknowledge | 처리에 시간이 걸린다는 접수 응답. 마스터 타임아웃을 막으려는 용도 |
| 06 | Server Device Busy | 다른 작업 처리 중. 폴링 간격을 늘리고 나중에 재시도 |
| 0A | Gateway Path Unavailable | 게이트웨이 설정 오류나 과부하. 게이트웨이의 국번·포트 대응 설정 확인 |
| 0B | Gateway Target Device Failed to Respond | 게이트웨이 뒤쪽 RS-485 장비가 응답하지 않음. 사실상 아래쪽 선로의 타임아웃 |
가장 흔한 예외는 02 입니다. 설명서에 40001 로 적힌 레지스터를 프로그램에서 0 으로 보내야 하는지 1 로 보내야 하는지는 프로그램마다 다르기 때문입니다. 주소 표기 방식은 Modbus 주소 체계 글을 참고하고, 값이 한 칸씩 밀려 나오면 주소를 1 빼거나 더해 다시 읽어 봅니다.
6. 폴링 간격과 응답 대기 시간은 어떻게 계산할까?
간헐적 타임아웃은 설정이 맞더라도 폴링이 너무 촘촘해서 생기기도 합니다. RTU 는 프레임 사이에 3.5글자 길이 이상의 빈 시간(t3.5)을 두어 프레임을 구분하고, 19,200bps 를 넘는 속도에서는 이 값을 1.75ms 로 고정해 쓰도록 권장합니다.
9,600bps 에 한 글자 11비트(시작 1 + 데이터 8 + 패리티 1 + 정지 1)로 계산해 보겠습니다.
- 한 글자 시간 : 11 ÷ 9,600 = 약 1.15ms
- t3.5 : 1.15 × 3.5 = 약 4.0ms
- 요청 프레임 (03 함수, 8바이트) : 8 × 1.15 = 약 9.2ms
- 응답 프레임 (레지스터 10개 = 국번 1 + 함수 1 + 바이트 수 1 + 데이터 20 + CRC 2 = 25바이트) : 25 × 1.15 = 약 28.8ms
- 한 번 주고받는 시간 : 9.2 + 4.0 + 장비 처리 시간 + 28.8 + 4.0 = 약 46ms + 장비 처리 시간
장비 처리 시간이 50ms 라면 한 대에 약 0.1초가 걸리고, 20대를 돌면 한 바퀴에 약 2초가 듭니다. 여기서 한 대가 꺼져 있고 응답 대기 시간이 1초, 재시도가 2번이면 그 장비 하나에 3초를 기다리게 되어 한 바퀴가 5초로 늘어납니다. 폴링 주기를 3초로 잡아 두었다면 다음 요청이 밀리면서 멀쩡한 장비까지 타임아웃이 번지는 현상이 생깁니다.
그래서 응답 대기 시간은 장비 응답 시간의 2~3배 정도로 두고, 응답이 없는 장비는 일정 횟수 실패 후 점검 주기를 늘리도록 설정하는 편이 좋습니다. 게이트웨이를 거쳐 Modbus TCP 로 읽는 경우에는 게이트웨이 뒤쪽 RS-485 구간의 시간까지 더해 대기 시간을 잡습니다.
7. Modbus 통신 오류 현장 진단 순서
원인을 빨리 찾으려면 전체를 한꺼번에 보지 말고 범위를 반씩 줄여 나갑니다. 아래 순서는 현장에서 실제로 쓰기 좋은 흐름입니다.
- 전원 확인 : 장비 전원 LED, 공급 전압을 확인합니다. 통신 LED 가 깜빡이는지도 봅니다.
- 한 대만 연결 : 문제 장비 하나만 노트북의 USB-RS485 변환기에 짧은 선으로 직접 연결합니다.
- 설정 일치 : 국번, 통신속도, 패리티·정지 비트, RTU/ASCII 를 장비 설명서 기준으로 맞춥니다.
- 시험 프로그램으로 읽기 : Modbus 마스터 시험 프로그램으로 레지스터 하나만 읽어 봅니다. 응답이 없으면 A/B 를 바꿔 다시 시도합니다.
- 예외 코드 확인 : 예외가 오면 5절 표대로 함수 코드와 주소를 고칩니다.
- 현장 선로에 다시 연결 : 단독으로는 되는데 선로에서 안 되면 종단저항, 바이어스, 국번 중복, 노이즈를 봅니다.
- 폴링 조정 : 간헐적 타임아웃이 남으면 응답 대기 시간과 폴링 간격을 6절 계산대로 다시 잡습니다.
단독 연결에서 정상인지 아닌지가 가장 중요한 갈림길입니다. 단독에서도 안 되면 설정이나 장비 문제이고, 단독에서는 되는데 선로에서 안 되면 배선과 선로 구성 문제입니다. 점검이 끝나면 장비별 국번·통신 설정·종단저항 위치를 배선도에 기록해 두어야 다음 고장 때 같은 일을 반복하지 않습니다.
8. 관련 산업용어
■ 국번 (Slave ID, Unit ID)
한 선로 안에서 장비를 구분하는 번호입니다. Modbus RTU 에서는 1~247 을 쓰고, Modbus TCP 에서는 게이트웨이 뒤 장비를 가리킬 때 Unit ID 로 씁니다.
■ CRC (Cyclic Redundancy Check)
프레임이 전송 중에 바뀌지 않았는지 확인하는 2바이트 검사 값입니다. Modbus RTU 에만 쓰이며 ASCII 방식은 LRC 를 씁니다.
■ 종단저항
선로 양 끝에서 신호 반사를 줄이는 저항입니다. 데이지 체인 선로의 맨 끝 두 장비에만 답니다.
■ 바이어스 저항 (Polarization)
송신이 없을 때 RS-485 선로 전압을 정해진 상태로 붙잡아 두는 풀업·풀다운 저항입니다. 선로 전체에 한 곳만 둡니다.
■ 폴링 (Polling)
마스터가 장비들에 차례로 값을 묻는 동작입니다. 한 바퀴 도는 시간이 폴링 주기보다 길면 요청이 밀립니다.
9. 자주 묻는 질문
Q. Modbus 타임아웃인데 배선 문제일 수도 있나요?
네, 그럴 수 있습니다. 슬레이브는 깨진 요청을 받으면 응답하지 않으므로 노이즈나 A/B 반대 연결도 마스터에는 타임아웃으로 보입니다.
Q. Modbus CRC 오류는 왜 가끔씩만 나나요?
대부분 노이즈나 선로 구성 문제입니다. 모터·인버터가 돌 때만 늘어난다면 통신선 경로와 차폐 접지를 먼저 보고, 그렇지 않다면 종단저항과 국번 중복을 확인합니다.
Q. 예외 코드 02 Illegal Data Address 는 어떻게 해결하나요?
레지스터 주소를 1 빼서 다시 읽어 보는 것이 첫 번째 방법입니다. 그래도 안 되면 읽는 개수를 줄여 장비가 가진 범위를 넘지 않는지 확인합니다.
Q. RS485 종단저항은 모든 장비에 달아야 하나요?
아니요, 선로 양 끝 두 곳에만 답니다. 중간 장비의 종단저항 스위치까지 켜면 신호가 약해져 오류가 늘어납니다.
Q. Modbus RTU 패리티 기본값은 무엇인가요?
규격 기본값은 짝수(Even) 패리티입니다. 다만 출고 설정을 8-N-1 로 두는 장비도 많으므로 장비 설명서 값에 마스터를 맞춥니다.
Q. 응답 대기 시간(Timeout)은 몇 ms 로 잡나요?
정해진 값은 없고 장비 응답 시간의 2~3배를 권합니다. 직결 RS-485 라면 수백 ms, 게이트웨이를 거치면 그보다 길게 잡는 경우가 많습니다.
10. 마무리
Modbus 통신 오류는 타임아웃, CRC 오류, 예외 응답으로 나누면 봐야 할 곳이 분명해집니다. 타임아웃은 설정과 배선, CRC 오류는 신호 품질, 예외 응답은 요청 내용 쪽입니다. 문제 장비 하나를 떼어 단독으로 읽어 보는 단계가 진단 시간을 가장 많이 줄여 주며, 점검 뒤에는 국번과 종단저항 위치를 배선도에 남겨 둡니다.
참고 기준 : Modbus Organization 「MODBUS over Serial Line Specification and Implementation Guide V1.02」(2006), Modbus Organization 「MODBUS Application Protocol Specification」
태그 : Modbus, Modbus통신오류, ModbusRTU, 타임아웃, CRC오류, 예외코드, IllegalDataAddress, RS485, 종단저항, 바이어스저항, 국번, 패리티, 통신속도, 폴링간격, 통신진단
- 이전글HMI SCADA PLC 차이, 제어 계층별 역할과 연결 구조 26.10.27
- 다음글LN2(액체질소) 보관실 산소결핍 위험과 산소 감지기 설치 26.10.26