Modbus TCP è il protocollo industriale più semplice in assoluto. Ed è anche quello dove ci si perde di più, perché chi lo implementa lato macchina usa convenzioni diverse e nessuno le documenta.
1. Slave ID (Unit ID) sbagliato
Modbus TCP eredita dal Modbus RTU il campo Unit ID nel header. Su molti gateway IP→RTU lo Unit ID identifica lo slave RTU dietro al gateway. Su CPU "native TCP" spesso è 1 o 255 e ignorato dal device — ma a volte è 0, a volte è quello configurato in CPU. Se non leggi niente, il sospettato numero uno è lo Unit ID.
2. Offset registri: 0-based vs 1-based
Lo standard Modbus dice indirizzi 0-based. Molti device legacy (e tutti i manuali italiani) li espongono 1-based. Il tag "Holding Register 40001" della documentazione corrisponde all'indirizzo Modbus 0, non 40001. Sbagliare il mapping vuol dire leggere dati con offset di +1 o leggere zone di memoria sbagliate.
3. Tipo di dato: Word, DWord, Float
I registri Modbus sono di 16 bit (Word). Un Float a 32 bit occupa 2 registri consecutivi. Un DWord pure. Ma l'ordine dei due registri non è definito dallo standard: alcuni device mettono prima il word alto (big-endian), altri prima il basso (little-endian). I client seri permettono di scegliere fra ABCD, CDAB, BADC, DCBA.
Sintomo tipico: leggi un float che dovrebbe valere 3.14 e ti esce 1.6e+20. Cambia il byte order e riprova.
4. Function code sbagliato
0x03 Read Holding Registersper leggere registri lettura/scrittura.0x04 Read Input Registersper leggere registri sola lettura.0x01 Read Coilsper leggere bit lettura/scrittura.0x02 Read Discrete Inputsper leggere bit sola lettura.
Se il device risponde con eccezione 01 (Illegal function), hai usato il codice sbagliato per quel tipo di registro.
5. Timeout vs polling rate
Molti device economici hanno solo una coda di richieste Modbus profonda 1 e rispondono in 50-200 ms. Se si pollano 30 tag ogni secondo, alcuni vanno in timeout. La cura: polling rate diviso per il numero di tag, oppure raggruppamento dei registri contigui in un'unica richiesta multi-register (Modbus la supporta nativamente).