Errori comunicazione Modbus RTU
Home › Forum › Programmazione IEC 61131 (LogicLab) › Errori comunicazione Modbus RTU
Taggato: modbus rtu
- Questo topic ha 10 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 1 anno, 11 mesi fa da
Sergio Bertana.
-
AutorePost
-
Aprile 4, 2023 alle 9:29 am #71387
domenico.romano
PartecipanteBuongiorno, 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) ?
Aprile 4, 2023 alle 9:39 am #71390domenico.romano
PartecipanteLa 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
Aprile 4, 2023 alle 9:39 am #71391Sergio Bertana
Amministratore del forumIntanto 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.
Aprile 4, 2023 alle 10:57 am #71397domenico.romano
PartecipanteGrazie 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 ?
Aprile 4, 2023 alle 11:33 am #71398Stefano
PartecipanteSe 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.
Aprile 4, 2023 alle 7:26 pm #71406Stefano
PartecipanteNoto 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?
Aprile 5, 2023 alle 8:56 am #71425Sergio Bertana
Amministratore del forumConsiderazione 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?
Aprile 5, 2023 alle 4:22 pm #71442domenico.romano
PartecipanteInnanzitutto 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?
Aprile 5, 2023 alle 4:57 pm #71445Sergio Bertana
Amministratore del forumQuindi 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.
Aprile 26, 2023 alle 9:39 am #71661domenico.romano
PartecipanteDopo 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!
Aprile 26, 2023 alle 9:39 am #71668Sergio Bertana
Amministratore del forumCon 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).
-
AutorePost
- Devi essere connesso per rispondere a questo topic.