# Modbus RTU

> Modbus su un bus seriale, con la linea fisica modellata esplicitamente e condivisa dai dispositivi indirizzati per unità.

Il driver Modbus RTU parla con dispositivi Modbus su un bus seriale, RS-485 o RS-232,
raggiunto attraverso una porta COM fisica, un adattatore USB oppure una porta
virtuale o reindirizzata. Poiché il bus è condiviso fisicamente, la topologia è
**Driver → Linea → Dispositivo → Tag**: la **linea** possiede tutto ciò che è
elettrico (porta, velocità, formato, tempi), e ogni **dispositivo** su di essa
possiede soltanto il proprio indirizzo di unità, l'interrogazione e i tag.

## Linea seriale {#serial-line}

| Campo | Significato | Predefinito |
| --- | --- | --- |
| **Nome** | Il nome parlante del bus. Modificabile in qualunque momento. | obbligatorio |
| **Porta seriale** | La porta del sistema operativo, per esempio `COM3`. Il campo è a testo libero (funzionano porte fisiche, virtuali e reindirizzate) e la freccia accanto offre le porte che Windows rileva in questo momento (con un **Aggiorna** per l'inserimento a caldo di un adattatore); l'elenco rilevato è una comodità, mai un elenco di ammessi. | `COM1` |
| **Velocità (baud)** | La velocità di trasmissione condivisa da ogni dispositivo del bus. | 9600 |
| **Modalità di trasmissione** | Come ogni dispositivo del bus compone i suoi messaggi: **RTU**, trame binarie verificate da un CRC, oppure **ASCII**, trame scritte come testo dai due punti a un a capo e verificate da un LRC, che parlano i dispositivi meno recenti. Un bus parla una sola modalità, che quindi appartiene alla linea. | RTU |
| **Formato seriale** | Scelta chiusa tra `8N1`, `8N2`, `8E1`, `8E2`, `8O1`, `8O2`, e su una linea ASCII anche `7N2`, `7E1`, `7E2`, `7O1`: la cifra è il numero di bit di dati, la lettera la parità (`N` nessuna, `E` pari, `O` dispari), l'ultima cifra i bit di stop. Una trama RTU richiede 8 bit di dati, quindi una linea RTU offre solo i formati a 8 bit; un formato a 7 bit rimasto da una linea ASCII appare vuoto ed è rifiutato finché non se ne sceglie un altro. Altre larghezze, la parità mark/space e 1,5 bit di stop non sono supportati. | `8E1` |
| **Timeout di risposta (ms)** | L'attesa massima per la risposta di un'unità, da 100 a 60.000. Timeout più lunghi si adattano alle apparecchiature lente ma rendono più lento il riconoscimento delle unità mancanti, e il rilevamento. | 1000 |
| **Intervallo minimo tra transazioni (ms)** | La cadenza di compatibilità valida per tutta la linea, da 0 a 1000. Zero mantiene solo il silenzio automatico di protocollo; un valore positivo lo può alzare, mai ridurre. | 0 |

Su una linea ASCII il silenzio descritto qui sotto non si applica: una trama ASCII termina con il suo a capo, quindi il silenzio automatico indica 0 ms e l'**Intervallo minimo tra transazioni (ms)** è l'unica pausa tra le trame, come dice la scheda sotto di esso: «Le trame ASCII terminano con un a capo, quindi la linea non aggiunge un silenzio proprio: questo intervallo è l'unica pausa tra le trame.» La modalità di trasmissione è un'impostazione fisica, bloccata insieme a porta, velocità, formato e timeout di risposta finché la linea è abilitata; l'indirizzo di runtime di un dispositivo su una linea ASCII termina con `/ascii`.

Il protocollo stesso richiede silenzio tra una trama e l'altra, e la linea lo impone
sempre: fino a 19.200 baud il silenzio automatico è di 3,5 tempi di carattere,
calcolati dal formato configurato; sopra i 19.200 baud è il valore fisso di 1,75 ms
che la specifica raccomanda. Il silenzio effettivo è il **maggiore** tra quel pavimento
automatico e l'intervallo configurato, mai la loro somma, e il pannello mostra
entrambi i valori. Alzare l'intervallo rallenta deliberatamente ogni unità della
linea; è un aiuto di compatibilità, non un rimedio per cablaggio, terminazione, messa
a terra o disturbi.

Una linea nuova nasce **disabilitata**, così le sue impostazioni fisiche si possono
configurare prima. Ogni porta fisica appartiene al massimo a una linea, confrontata
senza distinguere maiuscole e minuscole e anche mentre le linee sono disabilitate. Il
nome e l'intervallo tra transazioni restano modificabili mentre la linea è in
funzione (una modifica di tempi ha effetto senza far ripartire la porta); la porta, la
velocità, il formato e il timeout di risposta sono bloccati mentre la linea è
abilitata: disabilitarla e salvarla prima. Disabilitare una linea ferma la
comunicazione di tutti i suoi dispositivi senza cambiare le loro scelte Abilitato
individuali.

La linea riferisce il trasporto fisico separatamente dai suoi dispositivi:
**Spenta**, **Inattiva** (nessun dispositivo abilitato), **Connessione**, **Connessa**
oppure **Guasto della porta** con una diagnostica. Eliminare una linea vuota rimuove
solo la linea; eliminarne una che contiene dispositivi chiede una conferma esplicita
ed elimina anche quei dispositivi e i loro tag.

## Dispositivo {#device}

| Campo | Significato | Predefinito |
| --- | --- | --- |
| **Linea seriale** | Fissa: un dispositivo viene creato sotto la sua linea e ne eredita i parametri fisici, mostrati in sola lettura nel pannello. Aggiungi il dispositivo sotto la linea giusta. | la linea sotto cui viene aggiunto |
| **ID unità** | L'indirizzo Modbus del dispositivo sul bus, da 1 a 247, unico dentro la linea (dispositivi disabilitati compresi). | 1 |
| **Intervallo di interrogazione (ms)** | La cadenza di interrogazione predefinita per i tag che non la ridefiniscono. | 1000 |

L'indirizzo interno di runtime è
`modbus+rtu://<line-id>/<port>/<baud>/<format>/<timeout>/<unitId>/<interval>`: porta
l'identità stabile della linea e le sue impostazioni fisiche complete, mai il suo nome
parlante.

## Il comportamento della linea condivisa {#shared-line-behavior}

Il driver apre **una sola sessione seriale per linea** e serializza ogni richiesta di
ogni dispositivo attraverso un unico dispatcher, così letture e scritture non si
sovrappongono mai sul bus. Una scrittura in attesa prende il primo turno libero con
priorità limitata: le scritture vengono servite subito, ma uno scrivere continuo non
può affamare l'interrogazione. I timeout di ciascuna unità sono isolati con
allontanamento progressivo, quindi un dispositivo muto rallenta solo se stesso.
Un'eccezione Modbus con CRC valido è un errore della singola richiesta su quel tag, e
la linea resta sana. Solo un guasto fisico di I/O (la porta che scompare,
l'adattatore staccato) invalida la sessione condivisa e avvia una sola riapertura
coordinata per tutta la linea. L'ultimo dispositivo rilasciato chiude la porta.

## Indirizzamento dei tag {#tag-addressing}

L'indirizzamento dei tag è identico a quello di [Modbus TCP](driver-modbus-tcp): una
**Classe di registro** (Bobina (0xxxx), Ingresso discreto (1xxxx), Registro di ingresso
(3xxxx), Registro di mantenimento (4xxxx), ricavata per impostazione predefinita dal tipo e
dall'accesso del tag), un **Numero di
registro** in base 0, una **Quantità (registri, vuoto = automatico)** automatica
(Boolean, Int16 e UInt16 1 registro, Int32 e Float 2, String 4; la casella viene
disegnata solo sui tag String, perché ogni altra larghezza è fissa), e le due caselle
d'ordine: **Byte più significativo per primo (MSB first, big-endian)** per l'ordine dei byte e
**Parola più significativa per prima (parola alta per prima)** per l'ordine delle parole
(disegnata solo sui tipi a due registri, Int32 e Float), entrambe attive per impostazione
predefinita. La scheda Sorgente termina con **Indirizzo nel manuale**, l'indirizzo del tag
come lo stampa il manuale del dispositivo (il registro di ingresso 0 è 30001).
I tipi di valore supportati sono gli stessi sei (Boolean, Int16, UInt16, Int32, Float e
String): Int16 e UInt16 leggono un solo registro a 16 bit, con o senza segno, e a loro si
applica solo l'ordine dei byte (la casella dell'ordine delle parole non viene disegnata). I codici di funzione di lettura e scrittura e le
disposizioni sul bus sono documentati nella
pagina [Modbus TCP](driver-modbus-tcp) e valgono qui senza cambiamenti.

## Rilevamento {#discovery}

Il rilevamento sonda un intervallo di ID unità su una linea esistente e vive nel
pannello di quella linea:

| Campo | Significato | Predefinito |
| --- | --- | --- |
| **ID unità iniziale** | Il primo id di unità da sondare, da 1 a 247. | 1 |
| **ID unità finale** | L'ultimo id di unità, crescente rispetto al primo. | 32 |

Su una linea ASCII il sondaggio è la stessa richiesta in una trama ASCII e l'LRC prende il posto del CRC: un'eccezione con LRC valido prova che un'unità è presente, una trama con LRC non valido non prova nulla.

La scansione ricarica le impostazioni fisiche salvate della linea, apre la porta una
volta sola e sonda l'intervallo **in sequenza** con Read Basic Device Identification
(funzione 43/14), cadenzando ogni sondaggio con il silenzio tra trame effettivo della
linea. Non prova mai combinazioni di impostazioni e non legge mai registri.
Un'eccezione Modbus con CRC valido prova che un'unità è presente senza dichiararne
l'identità; un timeout o una trama non valida no.

Una linea in uso non viene mai interrotta né commutata automaticamente: va disabilitata
prima di scansionare, e riabilitata a mano dopo. L'annullamento chiude la sessione seriale
e lascia i risultati già mostrati come candidati transitori finché non li aggiungi
esplicitamente. Un id di unità già configurato viene marcato come tale e apre il
dispositivo esistente invece di crearne un duplicato; i risultati non portano tag: i
registri si configurano dopo **Aggiungi**.

Il rilevamento e la configurazione della linea condividono una sola prenotazione a
fallimento immediato per ogni porta fisica, così una scansione e una modifica di
impostazioni non si possono contendere la porta: a chi perde viene detto quale
operazione la tiene.

## Limiti da conoscere {#limits-worth-knowing}

- I sei tipi di valore sono tutto il vocabolario del codificatore del bus; le altre
  larghezze intere e Double non vengono offerti.
- La portata è una proprietà del bus: ogni dispositivo della linea condivide un solo
  flusso di richieste, cadenzato dal silenzio tra trame effettivo, quindi molti
  dispositivi o un intervallo alzato allungano ogni ciclo di interrogazione.
