Modbus TCP
Registri e coil Modbus su TCP/IP, con indirizzamento tipizzato, controllo dell'ordine dei byte e una scansione di rete limitata.
Il driver Modbus TCP legge e scrive registri e coil Modbus su TCP/IP: PLC, contatori, gateway e qualunque server che parli Modbus/TCP. L'indirizzamento è interamente tipizzato: si sceglie una classe di registro e un numero di registro in base 0, e l'applicazione compone la richiesta sul bus; non c'è alcun indirizzo a testo libero da sbagliare.
Dispositivo
| Campo | Significato | Predefinito |
|---|---|---|
| Indirizzo host | Nome DNS, indirizzo IPv4 o IPv6 del server o del gateway Modbus. | localhost quando resta vuoto |
| Porta TCP | La porta TCP. | 502 (uno 0 configurato ricade su 502) |
| ID unità | L'id di unità (slave) Modbus portato in ogni richiesta: quello che un gateway usa per instradare verso il dispositivo che ha dietro. Da 0 a 255. | 1 |
| Intervallo minimo tra transazioni (ms) | Cadenza di compatibilità: il silenzio minimo dopo il completamento di una transazione prima che parta la successiva, da 0 a 1000. Zero non aggiunge alcun ritardo artificiale. | 0 |
| Intervallo di interrogazione (ms) | La cadenza di interrogazione predefinita per i tag che non la ridefiniscono. | 1000 |
L'URI di base mostrato nell'intestazione del pannello è
modbus+tcp://host:port/unitID, più ?minimumTransactionIntervalMs=n quando
l'intervallo è impostato.
I dispositivi che condividono host e porta condividono anche un'unica porta di transazione: le richieste verso lo stesso endpoint non si sovrappongono mai, e a cadenzarle tutte è l'intervallo minimo tra transazioni più grande configurato tra i dispositivi abilitati su quell'endpoint. Il pannello dice quando un altro dispositivo alza l'intervallo effettivo sopra quello configurato qui. L'intervallo governa solo il traffico che questa applicazione emette: è un aiuto di compatibilità per un server o un gateway lento, non un rimedio per i guasti di rete.
La connessione attende al massimo 5 secondi; una risposta viene attesa al massimo 10 secondi; non ci sono ritentativi a livello di protocollo. La riconnessione appartiene al ciclo di ritentativi in secondo piano, quindi un dispositivo spento non costa altro che una lettura di cattiva qualità.
Indirizzamento dei tag
| Campo | Significato | Predefinito |
|---|---|---|
| Classe di registro | Quale entità Modbus il tag indirizza: HoldingRegister, InputRegister, Coil oppure DiscreteInput. |
Ricavata dal tipo e dall'accesso: i tag Boolean prendono DiscreteInput (sola lettura) oppure Coil (scrivibile); ogni altro tipo prende InputRegister (sola lettura) oppure HoldingRegister (scrivibile). |
| Numero di registro (base 0) | L'indirizzo grezzo di protocollo. È l'indirizzo in base 0 sul bus, non la classica notazione 4xxxx: il registro holding « 40001 » è il numero di registro 0. Il registro viaggia sul bus come un numero a 16 bit, quindi il campo accetta da 0 a 65535 e rifiuta qualunque cosa più larga dove viene scritta. | 0 |
| Quantità (registri, vuoto = automatico) | Quanti registri a 16 bit occupa il valore. La casella viene disegnata solo sui tag String: ogni altro tipo ha una larghezza fissa, quindi non c'è nulla da ridefinire. | Per tipo: Boolean 1, Int32 e Float 2, String 4 |
| Byte più significativo per primo | Quale byte di ogni registro a 16 bit viene per primo sul bus. Solo per i tag numerici. | attivo (quello che la specifica Modbus chiede) |
| Parola più significativa per prima | Quale registro di un valore a due registri porta la metà alta. Solo per i tag numerici. | attivo |
La scheda Origine mostra l'indirizzo di bus composto (per esempio 100?quantity=2)
come anteprima in sola lettura, così quello che il pannello mostra è esattamente
quello che la richiesta porta.
Tipi di valore e quantità
Vengono offerti quattro tipi di valore, e la larghezza di protocollo di ciascuno è fissa:
| Tipo di dato | Registri | Forma sul bus |
|---|---|---|
| Boolean | 1 | Su una classe di registro: qualunque registro diverso da zero legge true, e una scrittura invia 1 oppure 0. Su Coil/DiscreteInput: il bit stesso. |
| Int32 | 2 | Intero con segno a 32 bit su una coppia di registri. |
| Float | 2 | IEEE 754 a precisione singola su una coppia di registri. |
| String | 1 o più (predefinito 4) | Byte UTF-8 impacchettati due per registro. Una lettura si ferma al primo byte NUL; una scrittura deve stare nella quantità dichiarata (2 byte per registro) e viene riempita di zeri. |
Un tag String viene letto e scritto nell'ordine in cui il dispositivo tiene i byte, e una scrittura invia sempre UTF-8. I byte che non sono UTF-8 valido, che è l'aspetto di un intervallo che il dispositivo non ha mai inizializzato o di un testo scritto in un'altra codifica, si leggono come il carattere Unicode di sostituzione invece di far fallire la lettura: il tag mostra qualcosa di visibilmente sbagliato, e ogni altro tag di quel dispositivo continua a leggere.
La Quantità viene chiesta solo sui tag String. Le larghezze di Boolean, Int32 e Float sono fisse, quindi su quei punti la casella non viene disegnata, né nel pannello del tag né nella griglia dei tag; la ridefinizione esiste per dimensionare i tag String.
Ordine dei byte e delle parole
Le due caselle d'ordine vengono disegnate sui tag numerici. Sono due domande
indipendenti: quale byte guida dentro ogni registro, e quale registro guida lungo una
coppia. Modbus non definisce nessuna delle due per il testo, quindi a un tag String
non vengono offerte: i suoi byte viaggiano nell'ordine in cui il dispositivo li tiene.
Per il valore 0x01020304, con A come byte più significativo, le quattro
disposizioni sono:
| Byte più significativo per primo | Parola più significativa per prima | Byte sul bus |
|---|---|---|
| attivo | attivo | AB CD (il valore predefinito della specifica) |
| attivo | disattivo | CD AB (il classico scambio di parole) |
| disattivo | attivo | BA DC |
| disattivo | disattivo | DC BA |
Le letture e le scritture applicano le stesse due risposte nello stesso ordine, quindi una scrittura depone esattamente i byte che una lettura avrebbe riportato.
Codici di funzione
| Classe di registro | Lettura | Scrittura |
|---|---|---|
| HoldingRegister | 3 (Read Holding Registers) | 6 (registro singolo) oppure 16 (più registri) |
| InputRegister | 4 (Read Input Registers) | sola lettura; una scrittura viene rifiutata |
| Coil | 1 (Read Coils) | 5 (Force Single Coil, un solo coil) |
| DiscreteInput | 2 (Read Discrete Inputs) | sola lettura; una scrittura viene rifiutata |
Una scrittura riesce solo quando la risposta di protocollo del server ne conferma l'accettazione; solo allora il valore in cache avanza.
Rilevamento
La scansione è esplicita e limitata: l'applicazione non deduce né spazza mai la tua sottorete locale. Il modulo dell'ambito prende:
| Campo | Significato | Predefinito |
|---|---|---|
| Host IPv4 o CIDR | Un indirizzo (192.168.1.10) oppure una sottorete non più ampia di /24 (192.168.1.0/24). Gli indirizzi di rete e di trasmissione vengono saltati. |
obbligatorio |
| Porta TCP | La porta da sondare. | 502 |
| ID unità | Valori, elenchi separati da virgola o intervalli crescenti: 1, 1,5,9, 1, 3, 8-16 (da 0 a 255). |
1 |
| Intervallo minimo tra transazioni (ms) | La cadenza tra sondaggi completati sullo stesso host, da 0 a 1000. | 0 |
Una singola scansione può inviare al massimo 256 sondaggi (host × ID unità); un piano più grande viene rifiutato prima che si apra un socket. L'unica richiesta inviata è Read Basic Device Identification (funzione 43/14): il rilevamento non legge mai registri e non indovina mai una mappa di registri. Una risposta di eccezione Modbus perfettamente valida prova che un'unità è presente senza dichiararne l'identità; la raggiungibilità TCP, i timeout e le trame malformate no. Vengono scansionati fino a quattro host in parallelo, in sequenza dentro ciascun host, con timeout di connessione e di sondaggio di 750 ms.
I risultati portano l'endpoint completo e un nome suggerito, costruito dal fornitore e dal codice di prodotto quando il dispositivo li riferisce. I candidati hanno zero tag: i registri si configurano dopo Aggiungi. Un'unità già configurata viene marcata come tale e offre Apri invece di creare un duplicato.
Limiti da conoscere
- I tipi interi larghi (Int64, le larghezze senza segno) e Double non vengono offerti: il codificatore del bus percorre esattamente i quattro tipi qui sopra in entrambe le direzioni.
- Su ogni endpoint c'è una sola richiesta in sospeso per volta; molti dispositivi dietro un unico gateway condividono quella serializzazione per costruzione.
- Le scritture indirizzano un coil o una sequenza di registri per volta; non esiste la scrittura su più coil.