Modbus TCP

Registri e coil Modbus su TCP/IP, con indirizzamento tipizzato, controllo dell'ordine dei byte e una scansione di rete limitata.

Visualizza come Markdown

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.