Libreria per lettura variabili Modbus da diversi dispositivi
Home › Forum › Programmazione IEC 61131 (LogicLab) › Libreria per lettura variabili Modbus da diversi dispositivi
- Questo topic ha 4 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 7 anni, 11 mesi fa da
Sergio Bertana.
-
AutorePost
-
Gennaio 13, 2017 alle 4:38 pm #36097
Marco
PartecipanteSto cercando di interfacciarmi con il modulo SDM120C, l’energy Meter in modbus che ho acquistato da voi. Utilizzando il vs. blocco funzione, tutto funziona correttamente (il che indica chiaramente che tutto è configurato bene). Sto cercando però di realizzare una mia libreria general-purpose per leggere i dati da modbus da vari vendor visto che lo SlimLine dovrà interfacciarsi con vari dispositivi, sono partito da questo vostro esempio.
Ad ora sono riuscito a farlo dialogare… ho faticato un attimo perchè non rispondeva ai messaggi, ho poi scoperto che era la parity sbagliata, io inserivo ‘E’ mentre voleva ‘N’ (nonostante sul manuale c’è scritto parità pari, quindi E , even). Se gli do dei registri da leggere, riesco a leggerli ma i dati letti sono incomprensibili. Mi estrae correttamente i due registri… tramite Toolly ho verificato che la chiamata fosse corretta (c’è un esempio di chiamata nel manuale per la lettura dei volts). Ho provato a convertire in REAL ma senza risultati.
Gennaio 14, 2017 alle 7:17 am #39820Sergio Bertana
Amministratore del forumSempre stimolante per noi vedere clienti che si impegnano nella scrittura di programmi l potenzialità dei nostri prodotti è proprio nel permettere ai clienti di costruirsi le proprie librerie. Nel forum ci sono una serie di spunti che aiutano i clienti in tal senso, tu hai trovato uno spunto, ma se cercavi ancora un po avresti trovato questo topic che è esattamente quello che vuoi fare dove era anche indicato il refuso sulla parità.
Nel topic ci sono due programmi di esempio il LD ed ST che acquisiscono i dati da un misuratore di energia. I dati acquisiti in Modbus sono già in REAL il problema è l’endianness che non è corretta. Questo problema lo troverai trattato in molti topic, il protocollo Modbus non specifica l’endianness dei dati nelle acquisizioni a doppia WORD e REAL (32 bits), quindi puoi trovarti con questo problema. Nel programma riportato nel topic viene corretta l’endiannes con una operazione di ROL come indicato anche nel Manuale programmazione IEC61131-3, al capitolo Swap variabile DWORD.
MdbCfg[MIDx].@Buffer:=ROL(MdbValue, 16);
Gennaio 14, 2017 alle 9:15 am #39819Sergio Bertana
Amministratore del forumProprio per semplificare il lavoro a chi come te vuole acquisire valori via Modbus da diversi dispositivi connessi tutti in multidrop sulla porta seriale dello SlimLine o su porta seriale virtualizzata via TCP/IP (Topic), abbiamo realizzato nella libreria eLLabMdbDevsLib il FB SAModbusCmd (Estratto manuale).
Come vedi dal programma MdbRegsAcquire di esempio è possibile “collegare” al FB ModbusMsCore più FB SAModbusCmd che eseguono comandi modbus sullo stesso dispositivo e/o su dispositivi diversi. I vari FB collegati sono automaticamente sequenziati dal FB core (Download progetto).
Maggio 6, 2017 alle 7:45 am #39932Stefano
PartecipanteÈ possibile eseguire ModbusMsCore nella task back e SAModbusCmd in altre task, oppure devono essere obbligatoriamente tutte in back ?
Maggio 12, 2017 alle 4:36 pm #39933Sergio Bertana
Amministratore del forumE’ essenziale che la SAModbusCmd sia eseguita nella stessa task della ModbusMsCore. Poi volendo puoi eseguirle entrambe anche nella task Slow anche se sinceramente trattandosi di comunicazione seriale non ne sento l’esigenza.
Queste FB eseguite in task Back fanno egregiamente il loro lavoro e comunque sono in grado di reggere il traffico seriale anche a baud rates molto elevati. Poi comunque tiene presente che normalmente (Almeno se non fai un utilizzo massiccio del file system) la task Back viene eseguita molto piu velocemente della task Slow.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.