Generic serial and TCP

Apparecchiature che parlano un protocollo proprio fatto di testo o di byte, come bilance e lettori di codici a barre, su una linea seriale, in TCP o in UDP: come finiscono e si verificano i loro messaggi, e come ogni tag ne ricava il valore.

Visualizza come Markdown

Il driver Generic serial and TCP legge e scrive apparecchiature che parlano un protocollo proprio, fatto di testo o di byte semplici, dove nessun protocollo standard si applica: una bilancia, un lettore di codici a barre o RFID, uno strumento datato, una stampante di etichette. A un'apparecchiatura così non si può chiedere che cosa sia, quindi non si rileva nulla. Spetta all'operatore dire al dispositivo come finisce un messaggio che invia e come si verifica il suo checksum, e a dire a ogni tag come ottiene il valore, quali messaggi sono suoi e quali caratteri del messaggio sono il valore.

Un dispositivo raggiunge la sua apparecchiatura in uno di tre modi, scelto quando viene creato:

Trasporto Come si raggiunge il dispositivo Che cosa possono fare i suoi tag
Su una linea seriale Una linea seriale di questo driver, condivisa con gli altri dispositivi che porta, una richiesta alla volta. Richiesta e risposta, ascolto, scritture.
Client TCP Una connessione propria all'host e alla porta dell'apparecchiatura. Richiesta e risposta, ascolto, scritture.
Ascolto UDP Una porta di questa stazione a cui l'apparecchiatura invia datagrammi. La stazione non invia nulla. Solo ascolto, sola lettura.

Un dispositivo su una linea seriale sta sotto la sua linea, così quella parte dell'albero si legge Driver → Linea → Dispositivo → Tag, come sotto Modbus RTU. Un dispositivo di rete sta sotto il driver e può essere archiviato in cartelle come il dispositivo di qualsiasi altro driver, Driver → Cartella → Dispositivo → Tag. Un dispositivo resta dalla parte in cui è stato creato: TCP e UDP si scambiano, ma un dispositivo non passa mai da una linea alla rete né dalla rete a una linea.

La pagina del driver

La frase sotto l'intestazione dice « Le linee seriali portano gli strumenti che condividono un bus, e i dispositivi di rete stanno sotto il driver. Aggiungere una linea o un dispositivo, poi aprirlo per descriverne i messaggi. » e la pagina porta due tabelle, una sotto l'altra:

Tabella Che cosa la fa crescere Che cosa elenca
Linee seriali Aggiungi linea, a destra del titolo. Le linee del driver: Linea, Parametri fisici (porta · baud · formato, senza timeout, perché una linea di questo driver non ne ha), Dispositivi, Stato, e le azioni Apri, Abilita, Disabilita ed Elimina. Vuota, dice « Nessuna linea seriale. »
Dispositivi Aggiungi dispositivo, a destra del titolo. Crea un dispositivo di rete, un Client TCP. Tutti i dispositivi del driver, quelli su una linea compresi, con le colonne della tabella dei dispositivi di qualsiasi driver. Vuota, dice « Nessun dispositivo. »

L'intestazione conta i dispositivi tra parentesi, e la riga del driver nell'albero conta i due livelli appena esiste una linea (« 1 linea · 2 dispositivi »). La barra del driver non ha Rileva. Il clic destro sulla riga del driver offre Aggiungi dispositivo, Aggiungi linea, Nuova cartella e Aggiorna, poi, dopo un separatore, Rimuovi driver; nel menu Nuovo… della colonna la voce del driver offre Nuovo dispositivo, Nuova linea seriale e Nuova cartella, poi le sue linee, cartelle e dispositivi. Una volta aggiunto, il driver sta sotto la cartella Driver dell'albero, con o senza linea o dispositivo.

Linea seriale

Una linea di questo driver è la linea descritta in Linee seriali, con meno campi. La sua pagina dice « Un solo bus seriale fisico: le impostazioni della porta condivise dai suoi strumenti, una richiesta alla volta. » e la sua scheda Linea fisica porta:

Campo Significato Predefinito
Nome Il nome descrittivo del bus, mostrato nell'albero e su ogni dispositivo che porta. « Nuova linea »
Porta seriale La porta COM di Windows, fisica, virtuale o reindirizzata, digitata o scelta tra le porte che Windows riferisce (Aggiorna le rilegge). Una porta appartiene a una linea, qualunque sia il driver della linea. la prima porta libera
Velocità (baud) La velocità del bus, condivisa da ogni dispositivo della linea. 9600
Formato seriale Bit di dati, parità e bit di stop: 8N1, 8N2, 8E1, 8E2, 8O1, 8O2, 7N2, 7E1, 7E2 o 7O1. Sono offerti tutti e dieci, perché questo driver non ha bisogno di 8 bit di dati. 8E1

Una linea creata qui parte disabilitata, così le impostazioni della porta si digitano prima che la porta si apra. La porta, la velocità e il formato cambiano solo con la linea disabilitata; il nome cambia in qualsiasi momento. Una linea di questo driver non ha modalità di trasmissione, timeout di risposta, intervallo minimo tra le transazioni né silenzio automatico: ogni dispositivo che porta indica nel proprio pannello come finiscono i suoi messaggi e quanto attende una risposta, come dice la scheda Dispositivi sotto la linea: « Tutti i dispositivi di questa linea ne condividono le impostazioni della porta. Ciascuno indica nel proprio pannello come finiscono i suoi messaggi e quanto attende una risposta. » Non ha la scheda Rileva unità e la sua tabella Dispositivi non ha la colonna ID unità, perché uno strumento si riconosce da ciò che dicono le sue richieste, non da un indirizzo.

Aggiungi dispositivo sulla linea, o nel suo menu del clic destro, crea un dispositivo di questo driver su quella linea. Una linea appartiene per sempre al driver sotto cui è stata creata: un dispositivo Modbus RTU e un dispositivo di questo driver non condividono mai una linea, e un agente che collega un dispositivo a una linea dell'altro driver viene rifiutato. Gli stati della linea (Spenta, Inattiva, Connessione…, Connessa, Guasto della porta) sono quelli di ogni linea seriale, in Abilitazione e stato di salute.

Sulla linea, il driver apre la porta una volta per tutti i dispositivi che porta e invia una richiesta alla volta, aspettando la risposta prima della successiva. Tra una richiesta e l'altra, ciò che arriva viene offerto a ogni dispositivo della linea, e ciascuno lo divide in messaggi secondo le proprie regole. Una porta che si guasta viene riaperta dalla linea per tutti i suoi dispositivi, con un'attesa che si allunga tra un tentativo e l'altro finché continua a guastarsi.

Dispositivo

Connessione

Campo Significato Predefinito
Trasporto di rete Solo per un dispositivo di rete. Client TCP: « La stazione si collega all'host e alla porta del dispositivo. » Ascolto UDP: « La stazione ascolta su una porta locale ciò che il dispositivo invia, e non invia nulla. » I due si scambiano; un dispositivo su una linea mostra al loro posto la sua linea. Client TCP
Indirizzo host TCP: il nome host o l'indirizzo IP dell'apparecchiatura. Si può incollare un indirizzo intero, con tcp:// davanti e la porta dopo l'host. vuoto
Porta TCP: la porta su cui risponde l'apparecchiatura, da 1 a 65535. Nessuna porta è standard per questo tipo di apparecchiatura, quindi un dispositivo nuovo non ne ha. vuoto
Accetta da UDP, al posto dell'host: « Si leggono solo i datagrammi da questo indirizzo. Vuoto: qualsiasi mittente. » vuoto
Porta locale UDP, al posto della porta: « La porta di questa stazione a cui il dispositivo invia. Il firewall di Windows deve lasciarla passare. » vuoto
Linea seriale · fissa Un dispositivo su una linea: il nome della linea sopra la sua porta, la sua velocità e il suo formato, in sola lettura. la linea sotto cui viene aggiunto

Un nuovo dispositivo TCP dice « Indirizzo host non ancora inserito » e non viene collegato finché non ha un host e una porta. Un dispositivo con un host e senza porta, e un dispositivo UDP senza la sua porta locale, non si possono salvare: « Indicare la porta: quella del dispositivo via TCP, la porta locale di ascolto via UDP. » Un dispositivo su una linea non ha host, porta, cartella né ID unità.

La Base URI che l'intestazione mostra è l'indirizzo di esecuzione: generic://tcp/<host>:<port>, generic://udp/<local port> (con from=<sender> quando Accetta da è compilato) o generic://serial/<line id>/<port>/<baud>/<format>, seguita da come i messaggi finiscono e si verificano (end, start, terminator, length, gap, timeout, checksum e il resto). I byte che porta sono byte, mai la notazione in cui il dispositivo viene scritto. La copia di un dispositivo su una linea resta su quella linea; la copia di un dispositivo di rete va al livello del driver.

La scheda Messaggi

Sotto la scheda Connessione, la scheda Messaggi dice come si scrivono i byte e come finisce un messaggio.

Campo Significato Predefinito
Scritto come Come si scrivono il marcatore di inizio, il terminatore e, per ogni tag, la richiesta, il filtro, il separatore, il messaggio di scrittura e la risposta attesa. Testo con sequenze di escape: i caratteri stampabili così come sono, \r, \n, \t, \\ e \xNN per qualsiasi altro byte. Byte in esadecimale: due cifre per byte, ad esempio 02 30 31 0D. Cambiarlo riscrive ogni campo di byte del dispositivo e dei suoi tag, così ognuno continua a inviare gli stessi byte; finché uno di essi non è fatto di byte validi, il cambio viene rifiutato: « La notazione non è stata cambiata: un campo di byte di questo dispositivo o dei suoi tag non è valido nella notazione in uso. Correggerlo prima. » Testo con sequenze di escape
Il messaggio finisce con Terminatore, Lunghezza fissa o Silenzio. In UDP ogni datagramma è un messaggio, qualunque cosa dica questo campo. Terminatore
Terminatore Con Terminatore: i byte che chiudono ogni messaggio. Non fanno parte di ciò che leggono i tag. \r\n
Lunghezza del messaggio (byte) Con Lunghezza fissa, da 1 a 1024: « Ogni messaggio ha questo numero di byte, marcatore di inizio e checksum compresi. »
Silenzio (ms) Con Silenzio, da 5 a 10000: « Un messaggio finisce quando non arriva nulla per questo tempo. » 50
Marcatore di inizio Facoltativo. I byte con cui inizia ogni messaggio, ad esempio \x02. I byte che lo precedono vengono scartati, il che rimette anche in passo un flusso preso a metà di un messaggio, e conta come i primi caratteri del messaggio. vuoto
Timeout di risposta (ms) Da 50 a 60000: « Quanto attende una richiesta la sua risposta, e una scrittura la risposta attesa. » 1000
Tempo massimo senza messaggi (s) Da 0 a 86400, dove 0 vuol dire mai: « I tag in ascolto smettono di valere come letture quando non arriva nulla per questo tempo. 0: mai, per un dispositivo che invia solo ogni tanto, come un lettore di codici a barre. Impostarlo per un dispositivo che invia di continuo, come una bilancia. » 0

Un campo che la fine scelta non legge non viene mostrato e conserva il suo valore per quando quella fine ritorna. Un valore con cui il dispositivo non può lavorare non viene salvato, e il registro delle azioni dice perché, ad esempio « Indicare il terminatore con cui finiscono i messaggi, ad esempio \r\n. » o « La lunghezza del messaggio deve essere compresa tra 1 e 1024 byte. »

La scheda Somma di controllo

Campo Significato Predefinito
Algoritmo Il checksum che porta ogni messaggio: Nessuno, Somma (8 bit), Complemento a due della somma (LRC), Complemento a due della somma a 7 bit (Toledo), XOR (8 bit), CRC-16/MODBUS o CRC-16/CCITT. « Un messaggio il cui checksum non corrisponde viene scartato e contato nel diario tecnico, mai letto come valore. » Nessuno
Scritto come Testo esadecimale, il checksum scritto in cifre esadecimali, o Byte grezzi, i byte stessi del checksum. Testo esadecimale
Posizione Prima della fine: gli ultimi byte prima del terminatore, o gli ultimi byte del messaggio. Dopo il terminatore: subito dopo di esso, che allora copre; offerto solo quando i messaggi finiscono con un terminatore. Prima della fine
Byte esclusi all'inizio Da 0 a 255: « Byte all'inizio del messaggio che il checksum non copre, ad esempio un STX o un $. » 0
Byte esclusi subito prima Da 0 a 255: « Byte subito prima del checksum che questo non copre, ad esempio l'* di una frase NMEA. Neanche i tag li leggono. » 0

Tutti i campi tranne l'algoritmo compaiono solo dopo che si è scelto un checksum. Il checksum copre il messaggio dal primo byte al byte che precede il checksum, tranne i byte esclusi. Un messaggio il cui checksum non corrisponde non viene mai letto come valore: viene scartato, e il diario tecnico lo segnala sotto il dispositivo al massimo una volta al minuto. Il checksum viene solo verificato: le richieste e le scritture partono esattamente come sono state digitate, quindi una richiesta che ha bisogno di un checksum lo porta nei propri byte.

Algoritmo Uso tipico
Somma (8 bit) Indicatori.
Complemento a due della somma (LRC) Indicatori, trame nello stile di Modbus ASCII.
Complemento a due della somma a 7 bit (Toledo) L'uscita continua di un indicatore Toledo, come byte grezzo dopo il CR.
XOR (8 bit) Frasi NMEA 0183 ($…*hh), indicatori, lettori RFID.
CRC-16/MODBUS Trame binarie; il byte basso per primo in byte grezzi.
CRC-16/CCITT Trame binarie (la variante CCITT-FALSE); il byte alto per primo in byte grezzi.

Indirizzamento del tag

Un tag di questo driver non ha un indirizzo da digitare: la sua scheda Sorgente chiede come ottiene il valore, nei campi qui sotto. I byte si digitano nella notazione del dispositivo.

Campo Significato Predefinito
Modalità di lettura Richiesta e risposta: « La stazione invia la richiesta all'intervallo di interrogazione del tag e legge il valore dalla risposta. » Ascolto: « Il dispositivo invia da solo, e il tag conserva l'ultimo messaggio accettato dal suo filtro. » Un dispositivo UDP offre solo Ascolto: « Questo dispositivo ascolta via UDP e non invia nulla: i suoi tag sono solo in ascolto e di sola lettura. » Richiesta e risposta
Richiesta Solo in richiesta e risposta: « Ciò che la stazione invia all'intervallo di interrogazione del tag, scritto come indica il dispositivo. Il primo messaggio che il filtro accetta entro il timeout di risposta è la risposta. » obbligatoria
Filtro dei messaggi Quali messaggi appartengono al tag: Ogni messaggio, Inizia con (i byte con cui iniziano) o Corrisponde a un'espressione regolare (l'Espressione regolare a cui corrispondono). Per una richiesta, « Quale messaggio risponde alla richiesta. Gli altri passano ai tag in ascolto. » Ogni messaggio
Il valore è Come il valore viene ritagliato dal messaggio: L'intero messaggio, Posizione fissa (Primo carattere e Lunghezza), Campo tra separatori (Separatore e Numero del campo) o Gruppo di cattura di un pattern (Pattern di ricerca). « Posizioni e campi si contano da 1. Il pattern deve avere esattamente un gruppo di cattura, il valore. I numeri si leggono con il punto decimale. » L'intero messaggio
Il dispositivo scrive una virgola come separatore decimale Solo tag Float e Double. La virgola è il separatore decimale in lettura e in scrittura. disattivato
Messaggio di scrittura Tag che vengono scritti, non in UDP: « Ciò che invia una scrittura, con dove va il valore, ad esempio SP \r, o per formattarlo. Su un tag Boolean un messaggio di scrittura senza è un comando, inviato quando si scrive true. » vuoto
Risposta attesa « Facoltativo. Con che cosa inizia la risposta del dispositivo a una scrittura. La scrittura riesce solo quando quella risposta arriva entro il timeout di risposta. » vuoto

I caratteri si contano dall'inizio del messaggio, marcatore di inizio compreso; il terminatore, il checksum e i byte che il checksum esclude subito prima non fanno parte di ciò che un tag legge. Un pattern è un'espressione regolare .NET, e un messaggio che richiede più di 250 ms per essere letto non viene letto. Un tag di sola scrittura non ha campi di richiesta, filtro o valore; un tag senza messaggio di scrittura è di sola lettura.

I tipi di dati sono Boolean, Int32, Int64, Float, Double e String. Il testo ritagliato viene letto nel tipo del tag prima che le fasi del tag stesso lo convertano, come per ogni driver (vedi La catena di conversione): un Boolean legge 1, true, on o yes e 0, false, off o no; un intero legge un numero intero (12.0 si legge 12, 12.5 viene rifiutato); un Float o un Double legge un numero decimale; uno String prende i caratteri così come sono. Gli spazi attorno a un numero, e tra il segno e le cifre, vengono ignorati, perché gli indicatori riempiono i loro numeri di spazi. Un tag i cui campi non possono funzionare non viene salvato, e la pagina del tag dice che cosa gli manca, ad esempio « Indicare la richiesta che questo tag invia. » o « Il pattern deve avere esattamente un gruppo di cattura, attorno al valore. »

L'anteprima in sola lettura dell'indirizzo di bus mostra ask o listen seguito da ciò che si applica, ad esempio listen?extract=position&start=5&length=6, o ask?send=01RD%0D&extract=field&separator=,&field=3 per un tag che invia 01RD e un CR e legge il terzo campo separato da virgole della risposta.

Lettura

Situazione Tag in richiesta e risposta Tag in ascolto
Il valore Dal primo messaggio verificato che il filtro accetta entro il timeout di risposta dopo la richiesta. Dall'ultimo messaggio verificato che il filtro accetta, datato al suo arrivo.
Quando viene letto All'intervallo di interrogazione del tag. Ogni volta che l'apparecchiatura invia; il tag mostra l'ultimo messaggio al suo intervallo di interrogazione.
Prima del primo messaggio Non si applica. Il tag aspetta: nessun valore e nessun errore, come ogni tag prima della sua prima risposta.
Nessuna risposta, o un'apparecchiatura muta Nessuna risposta entro il timeout di risposta è una lettura fallita, e la regola del tag per un dispositivo che non ha risposto decide che cosa mostra. Passato il Tempo massimo senza messaggi (s) del dispositivo, ogni tag in ascolto fallisce la lettura e la sua regola decide che cosa mostra. Una connessione TCP che cade li fa fallire qualunque cosa dica quel tempo.
Un messaggio che il tag non riesce a leggere Una lettura fallita, con il motivo: un campo che manca, il valore che va oltre la fine del messaggio, o un testo che il tipo non può contenere. Lo stesso.

I messaggi che non rispondono a nessuna richiesta passano ai tag in ascolto dello stesso dispositivo, quindi un dispositivo può avere entrambi i tipi di tag. I tag in ascolto con lo stesso filtro condividono ciò che è stato sentito, e possono prendere campi diversi dallo stesso messaggio.

Scrittura

Una scrittura passa per lo stesso imbuto di quella di qualsiasi altro driver: la casella di scrittura riceve il valore ingegneristico, e le fasi di conversione vengono invertite prima di inviare il valore grezzo (vedi Connector).

Messaggio di scrittura Che cosa viene inviato Che cosa riporta la scrittura
Con {value} I byte digitati, con il valore dove sta {value}: un numero in cultura invariante (con la virgola come separatore decimale quando il tag lo dice), o formattato da {value:FORMAT} con un formato numerico .NET (W{value:000.0}\r invia 12,5 come W012.5 e un CR); un Boolean come 1 o 0; un testo così com'è. Fatta appena inviata. Con una Risposta attesa, fatta solo quando arriva entro il timeout di risposta una risposta che inizia con essa; un'altra risposta rifiuta la scrittura con quella risposta come motivo, e il silenzio è una mancata risposta.
Senza {value}, su un tag Boolean Un comando, come una tara o una stampa: scrivere true lo invia, scrivere false viene rifiutato. Lo stesso.
Nessuno Nulla: il tag è di sola lettura.

Le scritture aspettano il loro turno nella coda del dispositivo come quelle di ogni driver: su una linea condividono la richiesta alla volta della linea, in TCP la connessione propria del dispositivo. Un dispositivo UDP non invia nulla, quindi i suoi tag non si possono scrivere.

Esempio: una bilancia su RS-232

Un indicatore nello stile dell'uscita continua Toledo invia, molte volte al secondo, uno STX, tre byte di stato, sei cifre di peso, sei di tara, un CR e un byte di checksum. Sulla stazione:

  1. Aggiungi linea sulla pagina del driver; chiamarla Scale line, scegliere COM3, lasciare Velocità (baud) a 9600 e scegliere 7E1 come Formato seriale, poi Abilita la linea.
  2. Aggiungi dispositivo sulla linea; chiamarlo Scale. Nella scheda Messaggi lasciare Testo con sequenze di escape e Terminatore, impostare il Terminatore a \r, il Marcatore di inizio a \x02 e il Tempo massimo senza messaggi (s) a 10, così un cavo staccato si vede come comunicazione persa.
  3. Nella scheda Somma di controllo scegliere Complemento a due della somma a 7 bit (Toledo), Byte grezzi e Dopo il terminatore, con entrambi i conteggi di byte esclusi a 0.
  4. Aggiungi tag; chiamarlo Weight, Double, di sola lettura. Nella scheda Sorgente scegliere Ascolto, Ogni messaggio e Posizione fissa, con Primo carattere 5 e Lunghezza 6: lo STX è il carattere 1, i tre byte di stato vanno dal 2 al 4, il peso dal 5 al 10.
  5. Le cifre non hanno il punto decimale, quindi la fase Scalatura del tag lo mette al suo posto, ad esempio un fattore di 0,01 per un indicatore impostato su due decimali.

Un agente fa lo stesso con tre chiamate di strumento:

serial_line_upsert driver=GenericSerialTcp name="Scale line" serialPort=COM3 baudRate=9600 serialFormat=7E1
device_upsert driver=GenericSerialTcp name=Scale transport=SerialLine serialLineId=<id> messageEnd=Terminator terminator=\r startMarker=\x02 checksum=SumTwosComplement7Bit checksumFormat=Raw checksumPlacement=AfterEnd silenceTimeoutSeconds=10
tag_upsert device=Scale name=Weight opcUaType=Double tagMode=Listen valueExtraction=FixedPosition valueStart=5 valueLength=6

Esempio: un lettore di codici a barre su TCP

Un lettore di codici a barre con porta Ethernet invia un codice per riga, e solo quando ne legge uno:

  1. Aggiungi dispositivo sulla pagina del driver; chiamarlo Reader, lasciare Client TCP, e inserire Indirizzo host 192.168.0.40 e Porta 2001.
  2. Nella scheda Messaggi lasciare Testo con sequenze di escape, Terminatore \r\n e Tempo massimo senza messaggi (s) a 0: un lettore che non invia nulla per un'ora non è guasto. Lasciare Nessuno nella scheda Somma di controllo.
  3. Aggiungi tag; chiamarlo Code, String, di sola lettura. Nella scheda Sorgente scegliere Ascolto, Ogni messaggio e L'intero messaggio.

Lo stesso con gli strumenti dell'agente:

device_upsert driver=GenericSerialTcp name=Reader transport=TcpClient host=192.168.0.40 port=2001 messageEnd=Terminator terminator=\r\n
tag_upsert device=Reader name=Code opcUaType=String tagMode=Listen valueExtraction=WholeMessage

driver_capabilities descrive questo driver sotto genericSerialTcp, con questi due esempi, e serial_line_upsert crea una linea di questo driver con driver=GenericSerialTcp; gli altri strumenti sono in Gli strumenti, area per area.

Limiti da conoscere

  • Non si rileva nulla: non c'è un protocollo per chiedere a un'apparecchiatura così che cosa sia o che cosa contenga.
  • Una trama binaria che annuncia la propria lunghezza in un'intestazione non viene letta; un messaggio finisce con un terminatore, una lunghezza fissa, un silenzio o un datagramma.
  • Il checksum viene solo verificato: nessun checksum viene aggiunto a ciò che la stazione invia.
  • Un tag ricava un valore da un messaggio, come testo letto nel suo tipo; i numeri impacchettati come interi o virgola mobile binari dentro il messaggio non vengono decodificati.
  • Un dispositivo UDP si limita ad ascoltare: non invia richieste e non accetta scritture.
  • Un dispositivo non si può spostare tra una linea seriale e la rete, né su un'altra linea: lo si crea dove deve stare e si elimina quello vecchio.