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