Vai al contenuto

Errori comunicazione Modbus RTU

Home Forum Programmazione IEC 61131 (LogicLab) Errori comunicazione Modbus RTU

Taggato: 

Stai visualizzando 11 post - dal 1 a 11 (di 11 totali)
  • Autore
    Post
  • #71387
    domenico.romano
    Partecipante

    Buongiorno, sto cercando di interrogare più nodi con le librerie ACModbus_v2  e ModbusMaster_v2.

    Dopo qualche secondo in cui va tutto bene e ricevo i dati, da spydata leggo i seguenti errori e il PLC smette di comunicare :

    09:21:03.710352|ModbusMaster:Rx|03 06 00 01 00 00 D9 E8
    09:21:04.697110|ModbusMaster:Rx|03 06 00 02 00 00 29 E8
    09:21:05.687743|ModbusMaster:Rx|03 03 0A 82 3F 00 00 00 00 E8 B8 00 00 25 A2
    09:21:06.673863|ModbusMaster:Rx|03 05 00 01 00 00 9D E8
    09:21:07.884571|ModbusMaster:Rx|
    09:21:07.885153|ModbusMaster:Er|Error:10007050, On Case:211, Back:71
    09:21:09.095376|ModbusMaster:Rx|
    09:21:09.095938|ModbusMaster:Er|Error:10007050, On Case:211, Back:71
    09:21:09.712189|ModbusMaster:Rx|04 06 00 01 00 00 D8 5F
    09:21:09.712913|ModbusMaster:Er|Error:10007170, On Case:71, Back:71
    09:21:10.446056|ModbusMaster:Rx|04 06 00 01 00 00 D8 5F
    09:21:10.446780|ModbusMaster:Er|Error:10007170, On Case:71, Back:71
    09:21:11.177069|ModbusMaster:Er|Error:10007652, On Case:211, Back:51
    09:21:11.910858|ModbusMaster:Er|Error:10007650, On Case:211, Back:71
    09:21:12.644185|ModbusMaster:Er|Error:10007650, On Case:211, Back:71
    09:21:13.854624|ModbusMaster:Rx|
    09:21:13.855359|ModbusMaster:Er|Error:10007050, On Case:211, Back:71
    09:21:15.065566|ModbusMaster:Rx|
    09:21:15.066145|ModbusMaster:Er|Error:10007050, On Case:211, Back:71

    Riuscireste ad aiutarmi sul significato di questo tipo di errori (10007050, 10007170, 10007652) ?

    #71390
    domenico.romano
    Partecipante

    La comunicazione non si chiude mai se interrogo sempre lo stesso nodo ma sono comunque presenti degli errori ripetuti ciclicamente :

    09:37:11.032825|ModbusMaster:Rx|03 03 0A 82 3F 03 E8 23 F0 E8 B8 00 00 4A FF
    09:37:12.018824|ModbusMaster:Rx|03 05 00 01 00 00 9D E8
    09:37:12.019576|ModbusMaster:Er|Error:10007153, On Case:61, Back:61
    09:37:13.005968|ModbusMaster:Rx|03 05 00 01 FF 00 DC 18
    09:37:13.992708|ModbusMaster:Rx|03 06 00 01 00 00 D9 E8
    09:37:14.978813|ModbusMaster:Rx|03 06 00 02 00 00 29 E8
    09:37:15.969282|ModbusMaster:Rx|03 03 0A 82 3F 00 00 00 00 E8 B8 00 01 E4 62
    09:37:16.955459|ModbusMaster:Rx|03 05 00 01 FF 00 DC 18
    09:37:16.956336|ModbusMaster:Er|Error:10007152, On Case:61, Back:61
    09:37:17.942685|ModbusMaster:Rx|03 05 00 01 00 00 9D E8
    09:37:18.929504|ModbusMaster:Rx|03 06 00 01 03 E8 D9 56
    09:37:19.915316|ModbusMaster:Rx|03 06 00 02 23 F0 30 9C
    09:37:20.905934|ModbusMaster:Rx|03 03 0A 82 3F 03 E8 23 F0 E8 B8 00 00 4A FF
    09:37:21.892275|ModbusMaster:Rx|03 05 00 01 00 00 9D E8
    #71391
    Sergio Bertana
    Amministratore del forum

    Intanto nel report SpyData non vedo i frames Tx dei comandi Modbus inviati al dispositivo, immagino tu abbia eseguito lo spionaggio triggerando solo i pacchetti Rx. Per quanto riguarda gli errori puoi fare riferimento alla pagina elenco.

    • 10007050 Timeout esecuzione, dopo l’invio del comando il sistema non ha risposto nel tempo definito di timeout.
    • 10007170 Valore address errato in risposta a comando “Preset single register”, è stato definito un indirizzo nel comando di preset single register ed il sistema slave ha risposto con un’altro.
    • 10007652 Codice funzione errato in frame risposta a comando, è stato inviato un codice di comando ed il sistema ha risposto con un’altro codice.
    • 10007152 Valore dato reset bit errato in risposta a comando “Force single coil”, è stato inviato un comando di Force single coil di reset bit ma il sisatema slave ha risposto con il valore di bit set “FF00”.
    • 10007153 Valore dato set bit errato in risposta a comando “Force single coil”,  è stato inviato un comando di Force single coil di set bit ma il sisatema slave ha risposto con il valore di bit reset “0000”.

    Mi sembra che ci siano problemi di comunicazione con il tuo sistema slave. Ti consiglio di testare i singolo comandi Modbus utilizzando Toolly per verificare se sono corretti e se il sistema slave risponde correttamente.

    #71397
    domenico.romano
    Partecipante

    Grazie mille Sergio!

    C’è sicuramente qualche chiamata che sto effettuando che è sbagliata, ma il problema principale si verifica quando vado ad interrogare più nodi.

    Ho provato ad effettuare sempre la stessa lettura dal nodo 3 e va avanti senza mai interrompersi, appena inizio ad alternare la lettura dal nodo 3 e dal nodo 4 il PLC mi restituisce errore di timeout all’infinito, nonostante le prime letture vadano a buon fine, Esempio :

    10:48:03.911872|ModbusMaster:Tx|03 03 00 00 00 05 84 2B
    10:48:04.229805|ModbusMaster:Rx|03 03 0A 82 3F 00 00 00 00 E8 B8 00 00 25 A2
    10:48:04.730514|ModbusMaster:Tx|04 03 00 00 00 05 85 9C
    10:48:05.553558|ModbusMaster:Rx|04 03 0A 82 3F 00 00 00 00 08 78 08 91 DF 75
    10:48:06.054401|ModbusMaster:Tx|03 03 00 00 00 05 84 2B
    10:48:07.183762|ModbusMaster:Rx|03 03 0A 82 3F 00 00 00 00 E8 B8 00 00 25 A2
    10:48:07.684226|ModbusMaster:Tx|04 03 00 00 00 05 85 9C
    10:48:07.914834|ModbusMaster:Rx|04 03 0A 82 3F 00 00 00 00 08 72 08 98 3F 71
    10:48:08.415358|ModbusMaster:Tx|03 03 00 00 00 05 84 2B
    10:48:09.914539|ModbusMaster:Rx|
    10:48:09.915090|ModbusMaster:Er|Error:10007050, On Case:211, Back:51
    10:48:10.415550|ModbusMaster:Tx|04 03 00 00 00 05 85 9C
    10:48:11.915648|ModbusMaster:Rx|
    10:48:11.916211|ModbusMaster:Er|Error:10007050, On Case:211, Back:51
    10:48:12.416508|ModbusMaster:Tx|03 03 00 00 00 05 84 2B
    10:48:13.916551|ModbusMaster:Rx|
    10:48:13.917108|ModbusMaster:Er|Error:10007050, On Case:211, Back:51
    10:48:14.417409|ModbusMaster:Tx|04 03 00 00 00 05 85 9C
    10:48:15.917548|ModbusMaster:Rx|
    10:48:15.918106|ModbusMaster:Er|Error:10007050, On Case:211, Back:51
    10:48:16.418389|ModbusMaster:Tx|03 03 00 00 00 05 84 2B

    Hai qualche consiglio ?

    #71398
    Stefano
    Partecipante

    Se la comunicazione è in RS485 hai provato ad aumentare il valore “Delay” nel blocco ModbusMaster_V2?

    Alcuni dispositivi ci mettono un po’ di tempo a liberare il bus RS485 dopo aver finito di trasmettere. Per esperienza finchè si interroga un dispositivo solo non ci sono grossi problemi, quando se ne interrogano di più è meglio assicurare una congrua pausa (10ms? dipende dai dispositivi) tra la richiesta ad un nodo e ad un altro.

    #71406
    Stefano
    Partecipante

    Noto anche una cosa, sempre che io stia interpretando bene i dati:

    10:48:04.730514|ModbusMaster:Tx|04 03 00 00 00 05 85 9C
    10:48:05.553558|ModbusMaster:Rx|04 03 0A 82 3F 00 00 00 00 08 78 08 91 DF 75
    10:48:06.054401|ModbusMaster:Tx|03 03 00 00 00 05 84 2B
    10:48:07.183762|ModbusMaster:Rx|03 03 0A 82 3F 00 00 00 00 E8 B8 00 00 25 A2

    Tra il primo invio e la ricezione passano 800ms,
    tra il secondo invio e la ricezione passano 1100ms.

    I devices sono estremamente lenti a rispondere e la cosa mi sembra strana.

    Sicuro che la ModbusMaster venga eseguita abbastanza spesso?

    #71425
    Sergio Bertana
    Amministratore del forum

    Considerazione corretta, aggiungo solo un suggerimento, se si usa il comando SpyData con l’opzione -v 3, si avrà la visualizzazione diretta del tempo trascorso tra un report e l’altro.

    SpyData -v 3
    Spy data active, type "Ctrl-C" to exit...
    00:14:23(   0)|ModbusSlave:Rx|03 0D 00 00 00 06 01 03 9C 40 00 0A
    00:14:23(   2)|ModbusSlave:Tx|03 0D 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
    00:14:24(1038)|ModbusSlave:Rx|03 0E 00 00 00 06 01 03 9C 40 00 0A
    00:14:24(   2)|ModbusSlave:Tx|03 0E 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    Una domanda ma il programma che esegue la ModbusMaster è eseguito nella task Back?

    #71442
    domenico.romano
    Partecipante

    Innanzitutto grazie a entrambi per i preziosi consigli.

    Il programma  è sulla task back ma effettivamente, dopo un pò di studio per capire anche meglio il funzionamento del bus, è evidente che gli slave che sto interrogando hanno difficoltà a tornare in idle (arduino mkr zero con shield rs485) e il problema sembra essere nella gestione dell’interframe delay e non ne riesco a venire a capo.

    Lato PLC invece, avrei solo un quesito al momento: sto utilizzando un programma che chiama un FB che sfrutta ACModbus_v2 e con SpyData, come diceva anche Sergio in un post precedente, leggo solo i pacchetti Rx.

    Se imposto l’ENABLE in FALSE e poi in TRUE leggo il primo Tx da SpyData e poi smette nuovamente. Come potrei risolvere?

    #71445
    Sergio Bertana
    Amministratore del forum

    Quindi mi sembra di capire che stai comunicando in seriale RS485, con che modello di CPU stai lavorando.

    Se è il modello con la porta RS485 integrata la gestione del commutazione Rx/Tx è automatica ma devi settare opportunamente il FB SysSerialPort.

    Sp.DTRManagement:=DTR_AUTO_WO_TIMES; //DTR management
    Sp.DTRComplement:=FALSE; //DTR complement
    Sp.EchoFlush:=FALSE; //Received echo flush
    Sp.DTROnTime:=0; //DTR On time delay (mS)
    Sp.DTROffTime:=0; //DTR Off time delay (mS)
    Sp.FlushTm:=0; //Flush time (mS)

    Se invece utilizzi un convertitore RS232/RS485 devi verificare che gestisca correttamente la commutazione.

    Invece non mi spiego perchè non vedi i pacchetti Tx, che sicuramente ci sono visto che ci sono i pacchetti Rx. Però se guardo i tuoi post solo nel primo post non si vedono i pacchetti Tx negli altri due sono presenti. Un motivo per non vederli è se attivi lo SpyData con il trigger sui soli pacchetti Rx ed errori (Vedi articolo):

    SpyData -t 40000001

    Ma non credo sia il tuo caso.

    #71661
    domenico.romano
    Partecipante

    Dopo essermi dedicato ad altro ho ripreso questo progetto. Utilizzo la CPU con RS485 integrata e la configurazione è quella descritta. Continua ad essere un mistero perchè con SpyData non vedo i pacchetti Tx ma diciamo che al momento è il male minore.

    Mi piacerebbe capire se c’è un modo per dare priorità alle funzioni di scrittura holding register qualora venisse aggiornato un valore.  Invio per eMail il programma così magari è più facile capire cosa intendo

    Allo stato attuale il bus impiega 1 minuto e mezzo per fare il giro e tornare ad interrogare il primo dispositivo.

    Il problema è che non riesco a diminuire ulteriormente i valori di delay (1.2 al momento) e timeout (1.4) di comunicazione a causa probabilmente di un problema con i dispositivi che sto interrogando che liberano la seriale “con difficoltà”.

    Vorrei come workaround riuscire ad interrompere il loop di lettura qualora la variabile “setpoint” che viene scritta su ogni dispositivo venisse modificata lato PLC ed eseguire il comando di scrittura prima di tornare al loop di lettura.

    Esiste qualche esempio dal quale poter prendere spunto ? Come sempre grazie mille per il supporto!

    #71668
    Sergio Bertana
    Amministratore del forum

    Con il programma mi è più facile capire dove stanno i problemi. Hai realizzato un FB che poi hai utilizzato con la tecnica in cascata, ma hai commesso un errore molto grave, la tecnica prevede che il Done di ogni FB rimanga attivo fino alla disabilitazione dell’Enable, ma nel tuo caso non è così. Il codice

      Done:=ACMdb.Done; //Execution done

    Essendo l’istanza Mdb di tipo ModbusMaster_v2 la stessa per tutti i FB di gestione moduli, connessa al FB ACMdb di tipo ACModbus_v2, in questo modo il Done del FB Mdb si propaga in tutti i FB andando a resettare fuori sequenza il relativo Done.

    Ho realizzato un esempio con una nuova FB di gestione modulo, che vista la necesità di solo 2 comandi modbus ho preferito utilizzare direttamente la chiamata al FB Mdb senza utilizzare la ACModbus_v2. Ecco il listato.

    FUNCTION_BLOCK IOModule
    VAR
        CaseNr : USINT; (* Program case *)
        AOutputs : ARRAY[0..8] OF WORD; (* Digital outputs value *)
        HW : ARRAY[0..1] OF WORD;
    END_VAR
    
    VAR_INPUT
        Enable : BOOL; (* Enable *)
        Node : USINT; (* Modbus node *)
        Setpoint : UINT;
        MMdb : @ModbusMaster_v2; (* Modbus master *)
    END_VAR
    
    VAR_OUTPUT
        Done : BOOL; (* Execution done *)
        Ao00 : UINT;
        Ao01 : UINT;
        Ao02 : UINT;
        Ao03 : UINT;
        Ao04 : UINT;
        Ao05 : UINT;
        Ao06 : UINT;
        Ao07 : UINT;
        Ao08 : UINT;
    END_VAR
    
    // *****************************************************************************
    // FUNCTION BLOCK "IOModule"
    // *****************************************************************************
    // Gestione modulo I/O.
    // -----------------------------------------------------------------------------
    
        // -------------------------------------------------------------------------
        // GESTIONE INIZIALIZZAZIONE
        // -------------------------------------------------------------------------
        // Gestione disabilitazione.
    
        IF NOT(Enable) THEN CaseNr:=0; Done:=FALSE; RETURN; END_IF;
        IF (Done) THEN RETURN; END_IF;
    
        // -------------------------------------------------------------------------
        // GESTIONE SEQUENZE PROGRAMMA
        // -------------------------------------------------------------------------
        // Gestione sequenze programma.
    
        CASE (CaseNr) OF
    
            // ---------------------------------------------------------------------
            // Eseguo impostazione valori.
    
            0:
            HW[0]:=1000;
            HW[1]:=Setpoint;
    
            @MMdb.Enable:=TRUE; //Modbus enable
            @MMdb.Node:=Node; //Node number
            @MMdb.FCode:=16#10; //Modbus function code
            @MMdb.Address:=1; //Modbus register address
            @MMdb.Points:=SIZEOF(HW)/2; //Modbus register points
            @MMdb.Buffer:=ADR(HW); //Memory buffer address
            IF NOT(@MMdb.Done) THEN RETURN; END_IF;
            @MMdb.Enable:=FALSE; //Modbus enable
            CaseNr:=CaseNr+1; //Program case
    
            // ---------------------------------------------------------------------
            // Eseguo lettura valori.
    
            1:
            @MMdb.Enable:=TRUE; //Modbus enable
            @MMdb.Node:=Node; //Node number
            @MMdb.FCode:=16#03; //Modbus function code
            @MMdb.Address:=1; //Modbus register address
            @MMdb.Points:=SIZEOF(AOutputs)/2; //Modbus register points
            @MMdb.Buffer:=ADR(AOutputs); //Memory buffer address
            IF NOT(@MMdb.Done) THEN RETURN; END_IF;
            @MMdb.Enable:=FALSE; //Modbus enable
            Done:=TRUE; //Execution done
          END_CASE;
    
    // [End of file]

    Allego il programma IoModbus, con la versione originale del tuo programma e la versione da me modificata (Download).

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