Modbus RTU 마스터(PLC·HMI·PC 프로그램)에는 보통 «응답 타임아웃», «재시도 횟수», «요청 간격», «폴링 주기» 설정이 있습니다. 타임아웃이 너무 짧으면 멀쩡한 장비가 «응답 없음» 으로 보이고, 너무 길면 장비 하나가 꺼졌을 때 버스 전체의 갱신이 느려집니다. 이 글은 보율과 프레임 길이로 «적어도 얼마가 필요한지» 를 계산하는 방법입니다.
1. 문자 시간 — 한 바이트에 몇 ms
시리얼은 한 바이트를 시작 비트·데이터 비트·패리티·정지 비트로 묶어 보냅니다. Modbus RTU 규격의 문자는 데이터 8 비트에 짝수 패리티 1·정지 1 이고(기본값), 패리티를 쓰지 않으면 정지 비트를 2 로 둡니다. 어느 쪽이든 한 문자는 11 비트이고, 문자 시간 = 11 ÷ 보율 입니다.
| 보율 | 문자 시간 | t1.5 | t3.5 | 초당 최대 바이트 |
|---|---|---|---|---|
| 9600 | 1.146 ms | 1.719 ms | 4.010 ms | 872 |
| 19200 | 0.573 ms | 0.859 ms | 2.005 ms | 1745 |
| 38400 | 0.286 ms | 0.75 ms (고정) | 1.75 ms (고정) | 3490 |
| 115200 | 0.095 ms | 0.75 ms (고정) | 1.75 ms (고정) | 10472 |
RTU 에는 프레임 길이 칸이 없어서, 받는 쪽은 «조용한 시간» 으로 프레임을 나눕니다. 규격은 바이트 사이 틈이 1.5 문자(t1.5)를 넘으면 그 프레임을 버리고, 3.5 문자(t3.5) 이상 조용하면 프레임이 끝난 것으로 봅니다. 19200 bps 를 넘으면 이 시간이 너무 짧아 처리 부담이 커지므로 t1.5 = 750 µs, t3.5 = 1.75 ms 고정값을 권장합니다.
2. 프레임 길이 — 몇 바이트를 주고받나
RTU 프레임은 국번 1 + 함수 1 + 데이터 + CRC 2 바이트입니다. 읽기 요청은 늘 8 바이트이고, 응답 길이는 읽는 개수에 따라 늘어납니다.
| 함수 | 요청 | 정상 응답 | 개수 한도 |
|---|---|---|---|
| 03·04 레지스터 읽기 | 8 | 5 + 2N | 125 |
| 01·02 코일·입력 읽기 | 8 | 5 + ⌈N ÷ 8⌉ | 2000 |
| 05·06 단일 쓰기 | 8 | 8 | 1 |
| 10 여러 레지스터 쓰기 | 9 + 2N | 8 | 123 |
| 예외 응답 | — | 5 | — |
보유 레지스터 125 개를 한 번에 읽으면 응답이 255 바이트라, 9600 bps 8E1 에서 전송에만 약 292 ms 가 걸립니다. 블록이 클수록 요청 수는 줄지만 응답 하나가 길어지므로 타임아웃도 그만큼 길어야 합니다.
3. 거래 하나에 걸리는 시간
9600 bps 8E1 에서 레지스터 10 개(FC03)를 읽으면 요청 8 바이트 9.2 ms, 응답 25 바이트 28.6 ms, t3.5 4.0 ms 입니다. 슬레이브 처리 시간이 10 ms 라면 거래 하나에 약 51.8 ms, 장비 5 대를 차례로 읽으면 한 바퀴에 약 259 ms 가 걸립니다. 폴링 주기를 이보다 짧게 잡아도 버스가 하나라 더 빨라지지 않습니다.
슬레이브 처리 시간은 장비마다 다릅니다. 매뉴얼에 «응답 시간» 이나 «응답 지연(Response delay)» 설정이 있으면 그 값을 쓰고, 없으면 통신 기록에서 요청과 응답 사이 시간을 잽니다. 처리 시간이 전송 시간보다 긴 장비가 많아, 보율만 올려서는 한 바퀴가 생각만큼 줄지 않습니다.
4. 응답 타임아웃 정하기
- 하한: 슬레이브 처리 시간 + 응답 전송 시간. 위 예라면 약 38.6 ms 입니다. 이보다 짧으면 응답이 오는 도중에 타임아웃이 납니다.
- USB-시리얼 변환기를 쓰면 받은 바이트가 묶여서 PC 에 넘어오므로(FTDI 기본 16 ms) 그만큼 더합니다.
- 규격의 예: 9600 bps 에서 응답 타임아웃은 보통 1 초~수 초, 방송(국번 0) 뒤 다음 요청까지 기다림(Turnaround delay)은 보통 100~200 ms 입니다.
- 실제 값은 하한보다 넉넉하게 두되, 장비 하나가 꺼졌을 때 버스가 «타임아웃 × (1 + 재시도)» 만큼 멈춘다는 점과 맞바꿉니다. 장비 10 대 중 하나가 꺼지면 타임아웃 1 초·재시도 2 회일 때 한 바퀴마다 3 초가 더 걸립니다.
5. 증상으로 보는 잘못된 설정
| 증상 | 의심할 것 |
|---|---|
| 가끔 응답 없음, 다음 요청의 응답이 이전 요청의 답처럼 보임 | 타임아웃이 처리 + 응답 시간보다 짧음 — 늦게 온 응답이 다음 요청 자리에 들어옴 |
| 큰 블록 읽기만 실패하고 작은 읽기는 됨 | 응답 전송 시간(5 + 2N 바이트)이 타임아웃보다 김 |
| 응답이 둘로 쪼개져 CRC 틀림 | USB 변환기 지연, 또는 장비가 바이트 사이를 t1.5 보다 길게 띄움 |
| 장비 하나가 꺼지면 전체 갱신이 몇 초씩 멈춤 | 타임아웃 × 재시도가 큼 |
| 연달아 보낸 요청 중 일부만 응답 없음, 예외 06(바쁨) | 요청 사이 쉼이 장비가 처리하기에 짧음 — 요청 간격을 늘림 |
PortDock 에서는
- 웹 도구 «시리얼 통신 시간 계산기»: 보율·패리티·함수·개수·처리 시간을 넣으면 t3.5, 요청·응답 시간, 거래 하나·한 바퀴 시간, 타임아웃 하한을 계산합니다.
- Modbus Master: «통신 세부» 에서 응답 기다림(기본 1000 ms)·재시도·요청 간격(기본 20 ms)을, 표마다 읽는 주기를 정합니다. 표 위 줄에 평균·최대 응답 시간이 나오고, 응답 시간은 요청을 보내는 순간부터 응답이 다 올 때까지(전송 시간·USB 지연 포함)입니다.
- Modbus Slave 의 «장애 주입» 으로 응답 지연·무응답을 걸어 마스터의 타임아웃·재시도가 어떻게 동작하는지 장비 없이 미리 봅니다.
- Serial 의 «Modbus RTU» 끊기 방식은 함수 코드로 길이를 아는 응답은 바로 끊고, 나머지는 3.5 문자 시간(최소 3 ms)으로 끊습니다.
작성 2026-10-23