Go Down

Topic: Modbus errore CRC (Read 793 times) previous topic - next topic

Zirba84

Buongiorno a tutti,
è la prima volta che scrivo in questo forum.
Da pochi mesi mi sto addentrando nel mondo di arduino con molta soddisfazione.
Sto realizzando un controllo per automatizzare la gestione delle taparelle di casa e in particolare ho pensato di utilizzare il protocollo ModBus RTU per interfacciare le varie taparelle.
Ho provato ad  usare la seguente libreria
https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
ma ho dei problemi col calcolo del crc nel messaggio di rispost dello slave.
per testare l'hardware ho utilizzato l'esempio Simple_Slave modificando la configurazione come segue
Modbus slave(1,2,2); // this is slave @1 and RS-232 or USB-FTDI
per potere usare la seconda seriale e il pin R/T.
Ho utilizzato il software qModMaster per testare la comunicazione ma il mio slave trasmette sempre un CRC non corretto.
Riporto un esempio per la lettura di un singolo registro:

TX: 01 03 00 00 00 01 84 0A
RX: 00 01 03 02 00 65 78 6F 00

Verificando con un tool per il calcolo del crc online

gli ultimi due byte della stringa di risposta dovrebbero essere BF 40 e non 6F 00.


Prima di verificare se era un errore nella libreria volevo sapere se vi era mai capitato o se sono io a sbagliare qualcosa.

Grazie a tutti


nid69ita

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
my name is IGOR, not AIGOR

Zirba84

Grazie infinite,
provvedo immediatamente.


ORSO2001

ciao Zirba84,

la risposta che ricevi è "strana" in quanto inizia per 00...il primo byte dovrebbe essere il numero di ID dello slave, seguito da un byte della funzione, un byte di quanti DATA bytes è la risposta, data byte*2 rispetto al numero registri letti, e CRC.

a me capitava una cosa del genere quando non c'era il GND del segnale (SG) in comune...cioè non c'era il riferimento per i livelli di tensione.

Zirba84

Ciao a tutti,
Grazie mille ORSO2001,
effettivamente la causa era il convertitore usb/485 che usavo... ho provoato a usare un convertitore che avevo a lavoro e tutto funziona finalmente...



Zirba84

Ciao a tutti,
adesso finalmente tutto funziona o quasi...
Dal master sto tentando anche di inviare dei comandi broadcast e da quanto ne so per farlo è sufficiente inviare il comando all'indirizzo 0 ma purtroppo facendolo nessuno degli slave esegue il comando inviato.
Sono io che sbaglio qualcosa o magari è la libreria che non gestisce le chiamate broadcast?

Grazie ancora a tutti

ORSO2001

ciao...la libreria supporta il broadcast...se tu invii lo stesso comando ad un ID specifico funziona?

Zirba84

Ciao,
si se invio il comando ad uno specifico slave viene eseguito
Ad esempio se scrivo il registro 07 dello slave 1 (01  06  00  07  00  04  39  C8) tutto funziona. lo slave risponde ed esegue il comando.
Se invece invio lo stesso comando con indirizzo 0(00  06  00  07  00  04  38  19) nessuno slave risponde (giustamente) ma nessuno esegue il comando.

Al momento sto lavorando sul firmware per i dispositivi slave e utilizzo QmodMaster per simulare le richieste del master.

 

ORSO2001

ciao...sinceramente io non ho la certezza che tutti gli slave gestiscano il broadcast...anche se dovrebbe essere così.
il CRC sembra corretto.

con la frase:
Quote
Al momento sto lavorando sul firmware per i dispositivi slave e utilizzo QmodMaster per simulare le richieste del master.
intendi che usi QmodMaster per verificare i dati che stanno passando per la linea?

Zirba84

Si esatto,
uso qmodbuds per testare la comunicazione e inviare comandi.

tutti i comandi indirizzati ad uno slave specifico funzionano perfettamente in realtà uso solo due funzioni (03 read holding registers ; 06 write single register)

quest'ultima infatti speravo di riuscire ad utilizzarla anche per inviare comandi broadcast.

Nel weekend provo a spulciare la libreria per vedere se gestisce o meno l'invi di comandi broadcast

Go Up