What this validator checks
The parser requires a declared table, start address, and length for every row. It verifies the 16-bit PDU address boundary, normalizes common table names, warns when a bit datatype appears in a 16-bit register table (or the reverse), checks 32- and 64-bit datatype widths, highlights write access declared for read-only data tables, and reports overlapping ranges. Overlap is a review finding rather than an automatic rejection because manuals sometimes publish intentional aliases or multiple interpretations of the same words.
How polling blocks are formed
Readable rows are sorted independently within coils, discrete inputs, input registers, and holding registers; rows declared write-only are excluded from polling. Contiguous ranges are grouped. A nonzero gap setting may join ranges across unmapped addresses, and the gap quantity remains visible. Each span is then divided at the requested maximum without exceeding the Modbus Application Protocol maxima for FC01/02 (2,000 bits) or FC03/04 (125 registers). The displayed PDU bytes contain only function code, zero-based starting address, and quantity; they are not complete RTU or TCP requests.
PDU offsets versus register references
The Modbus data model separates four primary tables. Protocol data units carry a zero-based address, while a data item numbered X is addressed as X − 1. Conventional five-digit notation labels coils 00001…, discrete inputs 10001…, input registers 30001…, and holding registers 40001…. Modern vendor manuals do not apply that convention consistently, and offsets beyond item 9999 are especially ambiguous. Select the notation actually used by the source document; do not infer it from a familiar-looking number.
Interpretation and safety boundary
A tidy map is not proof that a device supports the plan. Modbus standardizes tables, addresses, functions, and request shapes, but device mapping is application-specific. This page does not connect to hardware, determine unit IDs, infer byte or word order, decode values, apply engineering scaling, select timeouts, evaluate transport limits, or prove that undocumented gaps are readable. It does not generate writes. Confirm every address, datatype, access rule, scale, and polling rate in the exact device revision’s documentation before commissioning or controlling equipment.
Frequently asked questions
Why does holding register 40001 become PDU address 0?
40001 is the conventional label for the first holding-register item. The function code already identifies the table, so the PDU sends the zero-based address 0. If a manual says “address 40001” but its software expects 40001 directly, that software is accepting a human reference rather than the raw PDU field.
Does float32 always use two registers in the same order?
It uses 32 bits, so it occupies two 16-bit registers, but Modbus does not standardize how a device orders the two words or the bytes within a multi-register value. This tool checks span width only and deliberately leaves word/byte order unresolved.
Why is an overlap only a warning?
Overlaps can be mistakes, but some maps intentionally provide aliases, a raw register alongside decoded bit fields, or alternate datatypes over the same range. The report makes the conflict visible so a person can compare it with the manual.
Should I allow gaps when planning reads?
Start with zero. Reading across a documented but unused address may work, but a server may instead return Illegal Data Address for the whole block. Increase the gap only when device documentation or testing confirms the intervening addresses are readable.
Primary references: MODBUS Application Protocol Specification V1.1b3 and the Modbus Organization’s addressing and function-code introduction.
Build or validate a Modbus RTU frame · Analyze a GNU ld map · Browse electronics tools