Vai al contenuto

Libreria per lettura variabili Modbus da diversi dispositivi

Home Forum Programmazione IEC 61131 (LogicLab) Libreria per lettura variabili Modbus da diversi dispositivi

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Autore
    Post
  • #36097
    Marco
    Partecipante

    Sto 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.

    #39820
    Sergio Bertana
    Amministratore del forum

    Sempre 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);

    #39819
    Sergio Bertana
    Amministratore del forum

    Proprio 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).

    #39932
    Stefano
    Partecipante

    È possibile eseguire ModbusMsCore nella task back e SAModbusCmd in altre task, oppure devono essere obbligatoriamente tutte in back ?

    #39933
    Sergio Bertana
    Amministratore del forum

    E’ 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.

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Devi essere connesso per rispondere a questo topic.