Go Down

Topic: Richiesta d'aiuto per protocollo ModBus (Read 1 time) previous topic - next topic

Ambrogio

Ciao a tutti, volevo fare una rete composta da 3 o 4 Arduini connessi tra loro in modalità multimaster attraverso l'interfaccia RS485. Ho pensato al modbus ma ho cercato un po' in rete ma mi rimangono dei dubbi:

Credo che questo esempio faccia al caso mio:

http://code.google.com/p/modbusmaster/

ma non ho capito una cosa:

Code: [Select]
// instantiate ModbusMaster object as slave ID 2
// defaults to serial port 0 since no port was specified
ModbusMaster node(2);


Questo significa che il nodo su cui sta girando lo sketch è il numero 2 oppure significa che sto effettuando una comunicazione verso il nodo 2 ?

Se "2" è il nodo corrente, come faccio a sapere a chi è indirizzato il comando ?

Se invece "2" è l'indirizzo del destinatario, come faccio ad impostare l'ID del nodo corrente ?

Non dovrebbe essere una cosa del tipo: Sono il nodo 3, questo comando è indirizzato al nodo 5, quest'altro comando è indirizzato al nodo 8 ... ecc ?!?

uwefed

Se i Arduino non sono troppo distanti puoi usare I2C. Per I2C non serve altra hardware ecetto 2 resistenze.
Ciao Uwe

Ambrogio

Purtroppo gli arduino sono un po' distanti tra di loro. Il circuito con i max485 l'ho già fatto, Volevo usare il Modbus perchè ho anche scritto un semplice protocollo di comunicazione ma ho dei problemi, se faccio trasmettere un dato dall'arduino 1 all'arduino 2 nessun problema, ma quando tento di far andare i messaggi in entrambe le direzioni i messaggi non arrivano correttamente. Ho usato questa sequenza:

Arduino 1 setta il pin di direzione per trasmettere
Arduino 1 dice ad arduino 2 di settare/resettare un'uscita
Arduino 1 resetta il pin di direzione per ricevere
Arduino 2 riceve il messaggio e setta l'uscita
Arduino 2 setta il pin di direzione per trasmettere
Arduino 2 dice ad arduino 1 che ha ricevuto correttamente il messaggio
Arduino 2 resetta il pin di direzione per ricevere

Invece di settare/resettare le uscite desiderate ne setta/resetta altre, è come se il messaggio non arriva correttamente. Eppure ho anche fatto un sistema per controllare che i dati arrivino correttamente e funziona.

Ho anche provato ad aggiungere dei delay per essere sicuro che i messaggi siano arrivati completamente prima di utilizzarli ma niente !

BrainBooster

@Uwfed ma quando carichi la libreria per usare I2c, non vengono attivate automaticamente le resistenze interne di pullup?

uwefed

#4
Oct 10, 2010, 09:47 am Last Edit: Oct 10, 2010, 08:37 pm by uwefed Reason: 1
@brainbooster
Non so dirtelo su 2 piedi, ma so dirti che le resistenze dipendono dalla capacitá parasita dei cavi; Metti resistenze anche molto piú basse di quella pull up che sono da 20 a 50kOhm.
Ciao Uwe

Ambrogio

No no, forse mi sono espresso male, non ho usato l'I2C ho usato l' RS485 senza nessun protocollo già fatto. Praticamente se il programma è fatto in questo modo, funziona tutto (anche inviando tanti comandi)

Arduino 1 setta il pin di direzione per trasmettere
Arduino 1 dice ad arduino 2 di settare/resettare un'uscita
Arduino 1 resetta il pin di direzione per ricevere
Arduino 2 riceve il messaggio e setta l'uscita

Se invece aggiungo anche la parte dove "Arduino 2" rimanda indietro un messaggio di conferma non funziona:

Arduino 1 setta il pin di direzione per trasmettere
Arduino 1 dice ad arduino 2 di settare/resettare un'uscita
Arduino 1 resetta il pin di direzione per ricevere
Arduino 2 riceve il messaggio e setta l'uscita
+
Arduino 2 setta il pin di direzione per trasmettere
Arduino 2 dice ad arduino 1 che ha ricevuto correttamente il messaggio
Arduino 2 resetta il pin di direzione per ricevere


Per non impazzire ulteriormente avevo pensato di passare a Modbus che è già fatto e lavora già su RS485

Andrea Ivetich

AAARRRGHHHHH... io uso gia modbus su arduino ... sia RTU cioe seriale si su ETHernet  va da dio..

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy