Buonasera,
dopo diverse settimane che utilizzo arduino mega attraverso modbus RTU (RS485) in modalità MASTER vorrei provare a farlo funzionare in modalità SLAVE per l'acquisizione di diversi dati.
Sto cercando su internet, ma non trovo niente di interessante.
Voi cosa mi potete consigliare ?
ciao...
se ti serve un master slave potresti usare QUESTA libreria.
Ne avevo discusso un po' qui nel forum...prova a fare qualche ricerca.
ovviamente tutto dipende da cosa vuoi "scambiare"...cioè se il pacchetto dati scambiato riguarda sempre le solite informazioni allora nessun problema...se l'interrogazione, e quindi la risposta, è variabile, cioè una volta inerroghi il registro 300...un'altra 6 registri a partire dal 305...altra ancora scrivi etc...è un po' più complesso.
Ciao Orso, di solito un dispositivo Slave dà la possibilità di leggere o scrivere solo un indirizzo oppure leggere più indirizzi contemporaneamente.
Vorrei creare un dispositivo SLAVE a tutti gli effetti.
ciao...la libreria ti mette a disposizione un "metodo" di lavoro...prova a dare un occhio agli esempi (dato che sono correlati) "advanced_slave" ed "advanced_master"
Perfetto, appena possiedo il tempo necessario cercherò di studiare la libreria e fare qualche prova.
TI ringrazio sempre per la tanta pazienza che possiedi.
Buongiorno Orso,
sto provando l'esempio simple_slave che ho trovato all'interno della libreria che mi hai consigliato.
Quanto ho capito, io possiedo un registro di 16 (n-1) indirizzi e in ogni singolo indirizzo mi trovo il valore che trovo all'interno delle parentesi graffe.
Successivamente dichiaro l'indirizzo dello SLAVE (2), che tipo di seriale utilizzo (Serial1) e quale integrato utilizzo (RS485);
Nel Void loop comincio la comunicazione modbus.
#include <ModbusRtu.h>
uint16_t au16data[16] = {
3, 1415, 9265, 4, 2, 7182, 28182, 8, 0, 0, 0, 0, 0, 0, 1, -1 };
Modbus slave(2,1,1); // this is slave @1 and RS-232 or USB-FTDI
void setup() {
slave.begin( 9600 ); // baud-rate at 19200
}
void loop() {
slave.poll( au16data, 16 );
}
La prova istantanea che ho fatto, è stata quella di scaricare il programma QModBus e provare a ricevere i diversi registri.
Di seguito ti riporto la programmazione e l'errore che ricevo:
Forse non ho capito come funziona il tutto ?
ciao...immagino tu stia usando un ARDUINO MEGA giusto?...perchè il MEGA ha anche Serial 1,2,3 oltre al Serial0 che è l'unica per ARDUINO UNO.
detto questo ... se non sbaglio...di base le Serial sono impostate come 8N1...cioè 8 bit di data, parity NONE e STOP BIT 1...nel programma di connessione qmodbus hai data bit a 7.
poi...in ogni caso...evita i pin 0 ed 1 come pin per la gestione di TX ed RX...in quanto i pin 0 ed 1 sono sempre della Serial 0.
prova e fammi sapere.
ciao
Io utilizzo l'arduino mega e come seriale utilizzo la SERIAL1.
Provando l'esempio advanced_slave, riesco a comunicare con il programma ma ricevo tutti i registri = 0.
si qmodbus cambia funzione e leggi registri non coils
Quindi leggo dei registri non corretti ?
secondo me non stai usando la funzione giusta per l'esempio...dai un occhio a QUESTO link...vengono spiegate abbastanza bene tutte le funzioni del protocollo MODBUS...vedrai che la funzione "read coils" (0x01), ed ovviamente anche il "write coils", funziona in modo diverso dalla lettura e scrittura registri.
ciao...giusto per completezza...ho provato il programma qmodbus...sia per leggere registri che coils...e funziona tutto...per ogni dubbio chiedi
Buono a sapersi, quale esempio hai utilizzato ?
per entrambi (registers and coils) ho usato l'esempio "advanced_slave"...così modificato:
#include <ModbusRtu.h>
#define ID 1
Modbus slave(ID, 0, 0); // this is slave ID and RS-232 or USB-FTDI
// data array for modbus network sharing
uint16_t au16data[9]={1,2,3,4,5,6,7,8,9};
void setup() {
slave.begin( 19200 );
}
void loop() {
state = slave.poll( au16data, 9 );
}
io ho messo ID 1...tu metti quello che vuoi...in pratica se da qmodbus usi la funzione 0x03 (leggi registri) e parti dal registro 0 per 9 registri (coils) ti ritorneranno i valori 1,2,3,4,5,6,7,8,9.
se usi la funzione 0x01 (read coils) e lo fai per 48 coils avrai 1 al coil 0 al coil 17 al 32 e 33...tutti gli altri 0...questo perchè, con 48 BIT, leggi la composizione dei bit dei primi 3 int dell'array...che sono, in decimale, 1,2,3.
Purtroppo ricevo sempre lo stesso errore.
Ora penso che possa essere un problema di collegamenti.
Io collego DI a TX1 e Ri a RX1 e DE - RE al piedino 53.
anch'io ho usato una MEGA per le prove...ma ho utilizzato la USB per passare i dati
Io utilizzo un dispositbo USB con convertitore RS-485
forse sta sera (notte) riesco a fare delle prove con un modulo MAX485 ed un convertitore USB-RS485...non garantisco di trovare tempo...ma sono abbastanza fiducioso del risultato...intento hai provato il programma che ho postato?...se si come hai impostato il qmodbus (foto)?
Ciao orso,
di seguito puoi trovare la foto:
Foto
ciao...quando inizializzi lo slave in questo modo:
Mdbus slave (ID,2,1);
gli stai dicendo che l'ID dello slave ha il valore della variabile ID; che vuoi scambiare dati sulla Serial2 e che il pin, per il max485, per convertire da TX ad RX, è il PIN 1 di arduino...mi avevi detto che stavi usando il PIN 53 o sbaglio?