PortDock

Modbus 읽기 요청 묶기 계산기

읽을 Modbus 주소 목록(40001·30001 표기)을 함수 코드별로 모아 125개 한도·허용 빈칸 안에서 요청 몇 개로 묶고, RTU 한 바퀴 시간과 바이트를 비교합니다.

40001 · 40001-40010(범위) · 40021*2(2칸짜리 32비트 값) · hr 100 / ir 0x10*2 / co 5 / di 0(표 이름 + 0 기준 주소). # 뒤는 메모.

요청
함수시작 (0 기준 · PLC 표기)개수안 쓰는 칸덮는 줄
합계
요청 수 (묶음 / 따로)
RTU 바이트 (요청 + 응답)
TCP 바이트 (MBAP 포함)
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 바이트한 바퀴
05097181.198 ms
105097181.198 ms
100390251329.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 규격 페이지.