HMI·SCADA·PC 프로그램에서 Modbus 장비의 값을 읽을 때, 태그(값)마다 요청을 하나씩 보내면 장비 수와 태그 수가 늘수록 한 바퀴가 길어집니다. 요청 하나에는 실제 데이터 말고도 요청 전송, 장비 처리 시간, 다음 요청 전 쉼이 붙기 때문입니다. 그래서 주소가 가까운 값들을 한 요청으로 «묶어» 읽습니다. 이 글은 묶는 규칙과 한계를 정리합니다.
규칙 1 — 한 요청은 한 표, 연속한 칸
- 함수 코드가 표를 정합니다: 01 코일, 02 이산 입력, 03 보유 레지스터, 04 입력 레지스터. 40001(보유)과 30001(입력)은 둘 다 통신 주소 0 이지만 한 요청에 넣을 수 없습니다.
- 요청은 «시작 주소 + 개수» 라서 연속한 칸만 읽습니다. 40001 과 40010 을 한 번에 읽으려면 40001~40010, 10칸을 읽어야 하고, 그 사이 8칸은 쓰지 않아도 함께 옵니다.
- 규격 예(§6.3)도 이렇게 생겼습니다 — 레지스터 108~110 을 읽는 요청은 시작 주소 0x006B(107), 개수 3 입니다. 번호 X 의 통신 주소는 X − 1 입니다(§4.4).
규칙 2 — 개수 한도
| 함수 | 한 요청 최대(규격) | 응답 데이터 |
|---|---|---|
| 01 코일 읽기 | 2000 | ⌈개수 ÷ 8⌉ 바이트 |
| 02 이산 입력 읽기 | 2000 | ⌈개수 ÷ 8⌉ 바이트 |
| 03 보유 레지스터 읽기 | 125 | 2 × 개수 바이트 |
| 04 입력 레지스터 읽기 | 125 | 2 × 개수 바이트 |
레지스터 125개를 읽으면 응답 PDU 는 함수 1 + 바이트 수 1 + 데이터 250 = 252 바이트로, 규격이 정한 PDU 최대 253 바이트(§4.1) 안에 들어갑니다. 장비는 이보다 적게 받을 수 있습니다 — 장비 레지스터 맵의 «한 번에 최대» 값이나 매뉴얼을 봅니다. 한도를 넘기면 장비는 예외 03(Illegal Data Value)으로 답합니다.
규칙 3 — 빈 주소와 예외 02
묶은 요청 안에 장비가 정의하지 않은 주소가 끼면, 많은 장비가 요청 «전체» 를 예외 02(Illegal Data Address)로 거절합니다. 규격의 처리 순서도 «시작 주소 + 개수» 가 장비의 범위에 맞는지를 보고 아니면 02 를 냅니다. 어떤 장비는 빈 칸을 0 으로 채워 돌려주기도 하는데, 이것은 장비마다 다르므로 매뉴얼이나 시험으로 확인합니다.
- 처음에는 «붙어 있는 것만» 묶고(허용 빈칸 0), 예외가 없으면 빈칸을 조금씩 늘려 봅니다.
- 예외 02 가 났다면, 그 요청의 시작·개수를 반으로 나눠 읽어 보며 어느 주소가 비었는지 좁힙니다.
- 32비트 값(float·누적 전력량)은 두 워드를 한 요청에서 읽어야 합니다. 다른 요청으로 나누면 그 사이에 값이 바뀌어 위아래 워드가 어긋날 수 있습니다.
묶으면 얼마나 빨라지나 — 계산 예
보유 레지스터 10개(40001~40010)를 9600 bps·8E1 로 읽고, 장비가 요청을 받고 10 ms 뒤에 답한다고 합시다. 값마다 따로 읽으면 요청 10개, 한 요청은 요청 8 바이트 + 응답 7 바이트입니다. 한 번에 읽으면 요청 1개, 요청 8 + 응답 25 바이트입니다.
| 방법 | 요청 수 | RTU 바이트 | 한 바퀴(계산) |
|---|---|---|---|
| 값마다 따로 | 10 | 150 | 약 312 ms |
| 한 요청으로 | 1 | 33 | 약 52 ms |
바이트는 4.5배 줄었고 시간은 6배 줄었습니다. 요청마다 붙는 장비 처리 시간(여기서는 10 ms)과 3.5문자 쉼이 요청 수만큼 반복되기 때문입니다. 장비 처리 시간이 길수록 묶는 효과가 커집니다. Modbus TCP 도 시리얼 전송 시간만 없을 뿐, 요청마다 장비 처리와 네트워크 왕복이 붙는 것은 같습니다.
읽는 주기도 나누기
- 측정값(전류·온도처럼 자주 바뀌는 값)과 설정값(가끔 바뀌는 값)을 같은 주기로 읽을 필요는 없습니다. 측정값 블록은 짧은 주기, 설정값 블록은 긴 주기로 나눕니다.
- 장비 여러 대를 한 RS-485 선에서 돌리면 한 바퀴 = 장비마다 블록 수 × 거래 시간의 합입니다. 목표 주기에 맞는지 계산해 보고 블록 수를 줄입니다.
- PortDock Modbus Master 는 표(탭)마다 국번·함수·시작·개수·주기를 따로 두므로, 묶은 블록 하나를 표 하나로 만들고 주기를 블록마다 정하면 됩니다. «장비 프로필» 로 내장 장비 맵을 고르면 함수 코드별로 붙어 있는 레지스터끼리만 표로 묶어 줍니다 — 빈 주소에 예외 02 를 내는 장비가 많아서입니다. 통신 기록에 요청·응답이 그대로 남아 예외가 난 요청을 바로 봅니다.
근거
- MODBUS Application Protocol Specification V1.1b3 — §4.4 주소 모델, §6.1~6.4 개수 한도, §7 예외 코드
작성 2026-10-29