Se trovi utile il mio blog sostienimi con una piccola donazione. GRAZIE

7 – Tutorial 4

Tutorial SCADA e HMI open source

<– INDIETROAVANTI–>

Ora cominciamo a sviluppare il nostro “Demone” di acquisizione dati che utilizzarà il protocollo ModBus.

Con PVDevelop aperto (e il progetto tutorial1 caricato) in modalidà edit apriamo il menu Daemon e otterremo quello che vedete sotto :

Daemon Menu

Menu dei demoni di acquisizione

Come vedete abbiamo la possibilità di comunicare in ModBus oppure con protollo Siemens su TCP (Siemens S7) oppure con protocolo PPI sempre per PLC Siemens S7.

Siccome noi dobbiamo creare un Demone di acquisizione ModBus ovviamente seglieremo questo e otterremo la pagina di configurazione che vi riporto sotto :

ModbusDaemon

Configurazione Demone ModBus

Questo sarà il file che dovremo modificare per configurare il nostro Demone.

La prima parte che andremo ad adattare sarà quella sotto :

############################################
# Project file for generating modbusdaemon #
# mkmodbus name.mkmodbus                   #
############################################
shared_memory=/srv/automation/shm/modbus.shm
mailbox=/srv/automation/mbx/modbus.mbx

Queste due voci specificano dove vogliamo che risiedano i file , che nel grafo della pagina dove spiegavamo la struttura di pvbrowser , avevamo indicato come memoria condivisa.

Come potete vedere la notazione è un pò strana perchè in realtà questo è il modo di specificare un path su Linux , quindi noi dovremo modificarlo in qualcosa del genere :

############################################
# Project file for generating modbusdaemon #
# mkmodbus name.mkmodbus                   #
############################################
shared_memory=c:\\automation\\shm\\modbus.shm
mailbox=c:\\automation\\mbx\\modbus.mbx

Ovviamente dovremo creare la directory automation e le due sottodirectory shm e mbx.

I file verranno invece creati in automatico dal Demone al suo primo lancio.

Se stiamo lavorando su Linux non dimentichiamoci di dare i dovuti permessi di scrittura e lettura alle cartelle.

I nomi delle cartelle non sono vincolanti quindi potete chiamarle come volete ma vi consiglio di non farlo e usare i nomi standard così se chiederete aiuto sarà più facile che vi capiscano.

Se qualcuno si chiede perchè nella definizione del path abbimo utilizzato due \\ il motivo è che in C il caratte \ indica un carattere di controllo come \n che significa a capo e quindi per far capire al compiltare che vogliomo scrivere \ dobbiamo ripeterglielo . 😉

Ora passiamo a definire come vogliamo comunicare , se su porta seriale o TCP/IP con la sezione seguente :

#communication=serial
tty=/dev/ttyS0
baudrate=9600
rtscts=1
parity=0   # 0=NONE 1=ODD 2=EVEN
protocol=0 # 0=RTU  1=ASCII
communication=socket
tcpadr=lehrig2
tcpport=502

Nel mio caso , modbus su TCP/IP sarà come segue :

#communication=serial
tty=/dev/ttyS0
baudrate=9600
rtscts=1
parity=0   # 0=NONE 1=ODD 2=EVEN
protocol=0 # 0=RTU  1=ASCII
communication=socket
tcpadr=10.10.100.114
tcpport=502

Se volessimo invece comunicare in modbusRTU ( su seriale) dovremo decommentare la riga seguente ottenendo :

communication=serial

e commentare questa ottenendo :

#communication=socket

Ora dovremo specificare i TAG (locazioni) da leggere e lo faremo adattando la seguente sezione :

#eventlog host=localhost port=6000
# function := 1=ReadCoilStatus | 2=ReadInputStatus | 3=ReadHoldingRegisters | 4=ReadInputRegisters
#             1 coil per bit   | 1 input per bit   | 2 byte per register    | 2byte per register
cycle1 slave=1 function=1 start_adr=0 num_register=3
cycle2 slave=2 function=2 start_adr=0 num_register=3
cycle3 slave=3 function=3 start_adr=0 num_register=3
cycle4 slave=4 function=4 start_adr=0 num_register=3
cycle5 slave=5 function=2 start_adr=0 num_register=3
cycle6 slave=6 function=2 start_adr=0 num_register=3
cycle7 slave=7 function=2 start_adr=0 num_register=3

In modo da leggere quello che ci interessa e come lo vogliamo , un registro (2 byte) o un bit singolo .

Nel mio caso sarà così :

#eventlog host=localhost port=6000
# function := 1=ReadCoilStatus | 2=ReadInputStatus | 3=ReadHoldingRegisters | 4=ReadInputRegisters
#             1 coil per bit   | 1 input per bit   | 2 byte per register    | 2byte per register
cycle1 slave=2 function=3 start_adr=6039 num_register=1
cycle2 slave=2 function=3 start_adr=6038 num_register=1
cycle3 slave=2 function=3 start_adr=6037 num_register=1

Terminato di configurare il tutto se sceglieremo il pulsante COMPILE oppure CLOSE inizierà la compilazione del nostro demone che (in Windows) si chiamerà modbusdaemon.exe e sarà nel direttorio del nostro progetto .

ATTENZIONE

I vari tag che andrete a configurare dovranno assolutamente chiamarsi cycleN dove N è un numero che dovrà essere sequenziale pena il mancato funzionamento del Demone . Se avete dubbi per verificare potete aprire con un editor di testo il file modbusdaemon.h dove sono definiti i tag (non modificate a mano questo file) .

Se siamo in ambiente Linux il demone non avrà estensione ma avrà lo stesso nome e se lo avvieremo otterremo una finetstra di shell simile a quella che vi riporto sotto .

Demone di acquisizione Modbus

Se vediamo la finestra sopra significa che il demone funziona , nel caso specifico il demone non sta riuscendo a raggiungere il nodo modbus invece nel caso che ripoto sotto la comunicazione è stata stabilita correttamente.

Comunicazione modbus in atto

Quando il demone è in funzione esegue queste operazioni :

  1. legge i dati dallo slave che abbiamo scelto e li archivia nella memoria condivisa
  2. verifica se ci sono delle richieste (telegrammi) di scritura e esegue l’operazione verso lo slave

Nella successiva sezione vedremo come recuperare i dati che il Demone avrà preparato .

<– INDIETROAVANTI–>