Comunicazione Modbus tra host e Smart Display
Per facilitare l'utilizzo dei WINSTAR Smart Display e consentire agli sviluppatori di comprenderne più rapidamente il funzionamento, continuiamo a proporre progetti demo pratici dedicati a diversi scenari applicativi. In questo articolo presentiamo un ulteriore esempio basato su Modbus, pensato per illustrare in modo chiaro i principi di base sia a chi si avvicina per la prima volta a questa tecnologia sia agli sviluppatori con maggiore esperienza.
Modbus è un protocollo ampiamente utilizzato nell'automazione industriale per la comunicazione e il controllo di dispositivi e sensori. In questa applicazione, una scheda Arduino svolge la funzione di controller host per l'integrazione del sistema. Tramite Modbus, Arduino può interagire con diversi sensori e Toggle Button per controllare lo Smart Display, il Gauge, l'Indicator e i LED. La demo utilizza Arduino Mega 2560 con uno Shield RS485 per comunicare con lo Smart Display tramite Modbus.
Il programma mostra come leggere i valori dei sensori, cambiare le pagine visualizzate e controllare i LED in funzione dei valori rilevati, utilizzando i registri Modbus.

Schema a blocchi del sistema
Per realizzare questa applicazione sono necessari i seguenti componenti:
- Smart Display da 7 pollici con Modbus
- Arduino Mega 2560
- Shield RS485 Modbus per Arduino Mega 2560
- Arduino IDE v2.0.4
- Dongle Modbus RS485
- Pulsante fisico
- Sensore a resistore variabile (Rotary Angle)
- LED
- GUI Builder v0.4.2 o versione successiva
La demo è suddivisa in tre fasi:
- Progettazione del progetto demo in GUI Builder.
- Build e caricamento del progetto.
- Programmazione dell'host Arduino.
Progettazione del progetto demo in GUI Builder
Per prima cosa, aprire una versione aggiornata di GUI Builder e creare un nuovo progetto. Inserire il nome del progetto e verificare la cartella di progetto, selezionata automaticamente per impostazione predefinita. Selezionare quindi il tipo di dispositivo; per questa applicazione viene utilizzato un dispositivo da 7 pollici. Impostare il protocollo di comunicazione e mantenere l'orientamento del display nella modalità Landscape predefinita. In UI Template selezionare Blank e infine fare clic sul pulsante Create per creare il nuovo progetto, come mostrato nella figura seguente.

Dopo la creazione del progetto viene visualizzata la seguente schermata.

Per realizzare lo scenario previsto dalla demo è necessario aggiungere una seconda pagina. Fare clic sul pulsante Page, quindi sul pulsante + per aggiungere la nuova pagina.

Nel pannello Resource è possibile selezionare uno sfondo personalizzato e impostare lo stile dello sfondo.

Lo stile dello sfondo può essere selezionato anche nella sezione Page.

Tornare quindi alla sezione Controls della prima pagina. In base allo scenario della demo, selezionare il Toggle Button e trascinarlo nell'area di layout della pagina. Procedere allo stesso modo per i widget Gauge e Indicator.

Build e caricamento del progetto
Dopo aver completato i passaggi precedenti, creando due pagine separate e posizionando i widget Toggle Button, Gauge e Indicator sulla prima pagina, è possibile procedere con la build del progetto. Accedere alla sezione Page Info, fare clic sul pulsante Device e selezionare Device Properties. Verificare l'impostazione Protocol, quindi selezionare la porta COM e impostare il baud rate. Fare clic sul pulsante "Connect to device" per stabilire la connessione con il dispositivo. Infine, come mostrato nella figura seguente, fare clic sul pulsante Upload per caricare il progetto e attendere il completamento dell'operazione.

Al termine del caricamento del progetto, fare clic sul pulsante OK come mostrato nella figura seguente.

Una volta completato il caricamento, viene visualizzata la schermata di avvio mostrata nella figura seguente.

Dopo la schermata di avvio, il display passa alla prima pagina. A questo punto, la build e il caricamento del progetto tramite GUI Builder sono completati.

Programmazione dell'host Arduino
Tutti gli indirizzi di registro necessari per questo esempio sono definiti nel programma Arduino IDE, come mostrato nella figura seguente. Il programma inizia definendo i pin del pulsante fisico, del sensore a resistore variabile e dei LED. Successivamente inizializza la comunicazione Modbus utilizzando la libreria ModbusMaster. Vengono quindi impostati gli indirizzi dei registri Modbus utilizzati per controllare la pagina visualizzata, l'Indicator, il Gauge e il Toggle Button.

Per comprendere più nel dettaglio questo processo di comunicazione, consultare il log di comunicazione nella sezione Test Device o Simulator di GUI Builder, dove è possibile verificare come avviene la comunicazione Modbus RS485 tra il dispositivo host e lo Smart Display.
Nell'immagine seguente sono mostrati i dati del messaggio di log relativi al Toggle Button. Questi dati indicano come accedere ai dati del Toggle Button sullo Smart Display. Il secondo byte del Data Byte contiene il valore esadecimale 00 06, che rappresenta l'indirizzo del Toggle Button. Convertito in formato decimale, il valore corrisponde a 6. Questo indirizzo può essere utilizzato per scrivere o inserire dati nel Toggle Button. In questa applicazione, tuttavia, il Toggle Button viene utilizzato per leggere o acquisire dati dallo Smart Display. Per leggere i dati del Toggle Button viene utilizzato l'indirizzo di registro "7".

Perché viene utilizzato l'indirizzo di registro "7" per ricevere i dati dal Toggle Button? Per maggiori dettagli sul processo di comunicazione, si consiglia di consultare il datasheet del Modbus Smart Display. Nell'immagine seguente è riportata una sezione del datasheet che mostra l'indirizzo utilizzato dal primo oggetto (widget), il Toggle Button.

Nell'immagine seguente sono mostrati i dati del messaggio di log relativi al Gauge. Questi dati indicano come accedere all'indirizzo del Gauge. Il secondo byte del Data Byte contiene il valore esadecimale 00 6A, che rappresenta l'indirizzo del Gauge. Convertito in formato decimale, il valore corrisponde a 106. Questo indirizzo può essere utilizzato per scrivere o inserire dati nel widget Gauge.

Nell'immagine seguente sono mostrati i dati del messaggio di log relativi all'Indicator. Questi dati indicano come accedere all'indirizzo dell'Indicator. Il secondo byte del Data Byte contiene il valore esadecimale 00 CE, che rappresenta l'indirizzo dell'Indicator. Convertito in formato decimale, il valore corrisponde a 206. Questo indirizzo può essere utilizzato per scrivere o inserire dati nel widget Indicator.

La costante ADC_REF è impostata a 5 V e rappresenta la tensione di riferimento dell'ADC (convertitore analogico-digitale); viene utilizzata per regolare la sensibilità del pulsante fisico. La costante GROVE_VCC è impostata a 5 e rappresenta la tensione VCC dell'interfaccia Grove utilizzata nel circuito. La costante FULL_ANGLE è impostata a 300 e rappresenta il valore dell'angolo di rotazione completo utilizzato nel circuito. Come indicato nel commento del codice, questo valore è espresso in gradi.

In questa sezione vengono definite le variabili necessarie, dichiarati i relativi tipi di dati e inizializzati i valori a zero.

Vengono definite le modalità dei pin e le impostazioni per i componenti esterni, come il pulsante fisico e il LED. Viene inoltre impostato il baud rate per la comunicazione seriale, come mostrato nella figura seguente.

La figura seguente mostra la definizione di "ChangePageFunction". Per la scrittura dei dati viene utilizzata la funzione "writeSingleRegister".

La figura seguente mostra il funzionamento quando l'host Arduino rileva una variazione del valore del sensore a resistore variabile (Rotary Angle). Il valore viene inviato allo Smart Display tramite Modbus per aggiornare il valore del Gauge. Quando il valore del Gauge è inferiore a 120, il LED collegato al pin 13 rimane spento e l'Indicator è verde. Quando il valore del Gauge è uguale o superiore a 120, il LED si accende e l'Indicator diventa rosso.

La figura seguente mostra il funzionamento quando l'host Arduino rileva una variazione dello stato del pulsante fisico. Il valore viene inviato allo Smart Display tramite Modbus per cambiare la pagina visualizzata.

L'immagine seguente mostra come l'host Arduino riceve dallo Smart Display, tramite Modbus, la variazione del valore del Toggle Button e utilizza tale valore per accendere il LED collegato al pin 12.

Questa è una sezione particolarmente importante. Per la comunicazione con lo Smart Display viene utilizzata la funzione "writeSingleRegister" per scrivere o inserire i dati, mentre la funzione "readHoldingRegisters" viene utilizzata per leggere o ricevere i dati dallo Smart Display. È inoltre importante prestare attenzione alla gestione del delay durante la comunicazione con widget attivi come il Gauge. Nel protocollo Modbus, dopo l'invio dei dati è necessario ricevere la relativa conferma prima di procedere con una nuova trasmissione. Per questo motivo, nella trasmissione e ricezione dei dati tramite Modbus è necessario prevedere un delay adeguato.

Dopo aver verificato e caricato correttamente il programma tramite Arduino IDE, è possibile eseguire gli scenari previsti dalla demo. Quando il Toggle Button è nello stato OFF, anche il LED esterno collegato al pin 12 rimane spento. Quando il Toggle Button viene portato nello stato ON, il LED esterno si accende immediatamente, come mostrato nella figura seguente.

Nello scenario della demo, il Gauge è controllato dal sensore a resistore variabile. Quando il valore del Gauge è compreso tra 0 e 120, l'Indicator viene visualizzato in verde e il LED collegato al pin 13 rimane spento. Quando il valore del Gauge supera 120, l'Indicator diventa rosso e il LED collegato al pin 13 si accende, come mostrato nella figura seguente.

In questo scenario è possibile passare da una pagina all'altra utilizzando il pulsante fisico. Premendo il pulsante, il display passa alla seconda pagina; premendolo nuovamente, torna alla prima pagina, come mostrato nella figura seguente.

A questo punto, il progetto demo sullo Smart Display da 7 pollici è completato. La demo utilizza diversi sensori e LED per cambiare le pagine visualizzate tramite un pulsante fisico e controllare il Gauge, gli Indicator e i LED esterni. Per scaricare il programma e consultare ulteriori informazioni sul progetto, fare riferimento al programma demo su GitHub.
Nota: per maggiori informazioni sul Modbus RS485 Shield utilizzato in questo progetto demo, consultare la documentazione del Modbus RS485 Shield. La configurazione hardware effettiva è mostrata nella figura seguente.

Conclusione
Nel complesso, il programma rappresenta un esempio pratico di utilizzo di una scheda Arduino e del protocollo Modbus per il controllo di sensori e Indicator. Mostra come leggere i valori dei sensori tramite i registri Modbus, cambiare le pagine visualizzate e controllare i LED in base ai valori rilevati. Questo esempio può essere un utile riferimento sia per chi si avvicina per la prima volta al protocollo Modbus sia per gli sviluppatori più esperti che desiderano approfondirne l'impiego nel controllo degli Smart Display.