Ho aperto questo topic per illustrare come sia possibile risolvere un problema affrontato su un nostro prodotto Netlog utilizzando i nuovi sistemi SlimLine. Il problema da affrontare come si vede da questo post è quello di gestire 8 contatori su altrettanti ingressi logici, il valore conteggiato deve essere mantenuto allo spegnimento del sistema e deve essere possibile acquisire il valore dei contatori da modbus.
Ho pensato di realizzare il programma in ladder, come si vede dall’estratto del listato vi sono 8 rami ladder identici in cui sul fronte di attivazione dell’ingresso viene incrementato il valore di una variabile di memoria. Le variabili di memoria Counter sono definite come array di tipo UINT (16 bits) e sono allocate nella DB 100 a partire dall’indirizzo 2048 che è il primo dell’area tampone.
I sistemi SlimLine supportano nativamente il protocollo Modbus RTU sulle porte seriali (Indirizzo di nodo 01, comunicazione a 115200, e, 8, 1), e se disponibile la porta ethernet è supportato anche il protocollo modbus over IP (Indirizzo di nodo 01 porta TCP 502).
Ecco un esempio di lettura contemporanea degli 8 contatori eseguita da Toolly. Come si vede dallo screenshot inviando sulla porta seriale il comando Modbus 03 per la lettura di 8 registri a partire dall’indirizzo 41024 si ha come ritorno il valore degli 8 counters. Nello screenshot si vede anche il valore dei counters cosi come visualizzato in debug da LogicLab.
Attenzione all’indirizzamento modbus, nel comando 03 agendo su variabili 16 bits occorre dividere per 2 l’indirizzo reale della variabile da leggere (Nel nostro caso 2048 diventa 1024), la DB 100 si raggiunge da modbus definendo offset 40000. Quindi il primo counter si trova ad indirizzo modbus 41024 (0xA040), ma occorre sottrarre 1 all’indirizzo reale quindi 0xA03F. Allego il programma sorgente per il download.