Modbus 읽기 요청 묶기 계산기
읽을 Modbus 주소 목록(40001·30001 표기)을 함수 코드별로 모아 125개 한도·허용 빈칸 안에서 요청 몇 개로 묶고, RTU 한 바퀴 시간과 바이트를 비교합니다.
어떻게 묶나
- 함수 코드는 표가 정합니다: 코일 01, 이산 입력 02, 보유 레지스터 03, 입력 레지스터 04 — 표가 다르면 한 요청에 넣을 수 없습니다.
- 한 요청은 시작 주소부터 «연속한» 칸만 읽습니다. 떨어진 두 주소를 한 번에 읽으려면 그 사이 칸까지 함께 읽어야 합니다.
- 주소순으로 늘어놓고, 다음 값까지의 빈 칸이 «허용 빈칸» 이하이고 개수가 한도 안이면 지금 요청을 늘립니다. 아니면 새 요청을 시작합니다.
- 40021*2 처럼 적은 2칸짜리 값은 두 요청으로 쪼개지 않습니다. 한도 끝에 걸리면 통째로 다음 요청으로 넘깁니다.
- RTU 바이트: 03·04 요청 8, 응답 5 + 2 × 개수 · 01·02 응답 5 + ⌈개수 ÷ 8⌉. TCP 는 국번·CRC 3 바이트 대신 MBAP 7 바이트.
- 한 바퀴 시간 = 요청마다 (요청 전송 + 장비 응답 지연 + 응답 전송 + 다음 요청 전 3.5문자) 의 합.
허용 빈칸에 따라 (기본 목록, 9600 bps 8E1, 응답 지연 10 ms)
| 허용 빈칸 | 요청 수 | 안 쓰는 칸 | RTU 바이트 | 한 바퀴 |
|---|---|---|---|---|
| 0 | 5 | 0 | 97 | 181.198 ms |
| 10 | 5 | 0 | 97 | 181.198 ms |
| 100 | 3 | 90 | 251 | 329.635 ms |
같은 목록을 값마다 따로 읽으면 요청 27개, 397 바이트, 한 바퀴 833.177 ms 입니다. 요청 하나마다 응답 지연과 3.5문자 쉼이 붙어서, 요청 수를 줄이는 것이 바이트를 줄이는 것보다 시간에 더 듭니다.
읽는 법
- «안 쓰는 칸» 은 목록에 없는데 함께 읽는 칸입니다. 장비에 따라 비어 있는(정의되지 않은) 주소를 읽으면 예외 02(Illegal Data Address)로 요청 전체를 거절합니다. 그런 장비면 허용 빈칸을 0 으로 두세요.
- 규격 한도는 레지스터 125개, 비트 2000개입니다. 장비가 더 적게 받는 경우가 많습니다(예: 장비 맵의 «한 번에 최대» 값). 한도를 넘기면 예외 03(Illegal Data Value)이 납니다.
- TCP 는 시리얼 전송 시간이 없어서 요청 수가 곧 왕복 횟수입니다. 장비 처리 시간과 네트워크 왕복이 요청마다 붙으므로 묶을수록 유리한 것은 같습니다.
- 값이 자주 바뀌는 것(측정값)과 거의 안 바뀌는 것(설정값)을 다른 주기로 나눠 읽는 것도 방법입니다 — 그때는 목록을 둘로 나눠 각각 묶어 보세요.
현장에서 쓰는 곳
- HMI·SCADA·PLC 의 Modbus 마스터 태그 목록을 만들 때 — 태그를 주소순으로 모아 블록(요청) 수를 줄입니다.
- 폴링 주기가 목표보다 길게 나올 때, 요청이 몇 개인지와 그 가운데 빈 칸 때문에 나뉜 것이 무엇인지 볼 때.
- 장비가 예외 02 를 낼 때 — 묶은 요청 안에 장비가 없는 주소가 끼었는지 확인할 때.
자주 묻는 것
Modbus 로 한 번에 레지스터를 몇 개까지 읽을 수 있나요?
규격(Application Protocol V1.1b3 §6.3·§6.4)상 함수 03·04 는 1~125개, 01·02 는 1~2000비트입니다. 장비는 이보다 적게 받을 수 있으니 매뉴얼의 한도를 따릅니다.
떨어진 주소 두 개를 한 요청으로 읽을 수 있나요?
한 요청은 연속한 칸만 읽으므로, 사이 칸까지 함께 읽어야 합니다. 그 사이에 장비가 정의하지 않은 주소가 있으면 예외 02 가 날 수 있습니다.
40001 과 30001 을 한 요청에 넣을 수 있나요?
아니요. 40001 은 보유 레지스터(함수 03), 30001 은 입력 레지스터(함수 04)라서 요청이 따로 필요합니다. 둘 다 통신 주소는 0 입니다.
32비트 값(float)이 요청 경계에 걸리면?
두 워드를 서로 다른 요청으로 읽으면 그 사이에 값이 바뀌어 위아래 워드가 어긋날 수 있습니다. 이 계산기는 «*2» 로 적은 값을 쪼개지 않습니다.
요청 하나의 프레임을 만들어 보려면 Modbus RTU 요청 만들기. 통신 속도별 문자 시간·타임아웃은 시리얼 통신 시간 계산기. 예외 02·03 이 왜 나는지는 Modbus 예외 코드 가이드. 장비별 주소와 한 번에 읽을 수 있는 수는 장비 레지스터 맵.
근거
MODBUS Application Protocol Specification V1.1b3(2012-04-26) — §4.4 주소 모델(번호 X 는 PDU 주소 X−1, p.7–8), §6.1·6.2 읽기 1~2000(p.11–12), §6.3·6.4 읽기 1~125(p.15–16), 각 함수의 요청·응답 모양. 3.5문자 시간은 MODBUS over Serial Line V1.02 §2.5.1.1. 규격 문서는 Modbus Organization 규격 페이지.