Vai al contenuto
PLC Forum


Temporizzazioni Modbus


wer180m

Messaggi consigliati

Salve a tutti, sto realizzando una periferica Modbus Master qui http://www.plcforum.it/forums2/index.php?showtopic=50687

vi scrivo perchè ci sono delle cose sul protocollo che non riesco a trovare:

- il tempo tra una comunicazione e l'altra deve essere di 3,5 volte superiore a quello di un carattere, e quello tra un carattere e un altro di 1,5 inferiore al tempo del carattere.

quindi per una comunicazione a 9600 bps, come converto i tempi? (inoltre nel datasheet delle periferiche che uso, mi dice che tra una comunicazione e l'altra devono passare 25ms) però tra un carattere ed un altro non saprei.

- Se non ricevo risposta, dopo quanto tempo rimando il comando?

Spero qualcuno di voi possa darmi un'indicazione :)

Massimo

Link al commento
Condividi su altri siti


quindi per una comunicazione a 9600 bps, come converto i tempi?

Sperando di scrivere qualche cavolata... :rolleyes:

Ipotesi con il classico formato delle trasmissioni che si utilizzano solitamente come 9600,8,n,1.

Ogni bit prende:

1/9600= circa 104 usec

Ogni carattere e' composto da 8bit + 1 di parita'+ 1 di stop = 10 bit

Quindi, ogni carattere impiega:

104usec x 10 = 1.04 msec

la temporizzazione (minima) dei 3.5 caratteri sara quindi di:

1.04msec x 3.5 = 3.64msec

Stai sopra a questo tempo (es. 10msec o piu') e non dovresti avere problemi.

P.S. ho scritto anche nell' altra sezione.

Link al commento
Condividi su altri siti

Grazie mf2hd :)

Leggendoti ho capito meglio come funziona la cosa, dal datasheet vedo che:

- Le due periferiche che devo collegare possono andare a 19200 bps, ma la pausa tra un messaggio e l'altro la devo fare comunque di 25ms

- Ogni byte è composto da 1 bit di start, 8 bit di dati (trasmessi dal meno significativo), 1 bit di parità + 1 bit di stop, nel caso non vi sia il bit

di parità si utilizzano 2 bit di stop

-Il campo dati è formato da word=2bit, e la word viene trasmessa sempre dal byte più significativo.

CALCOLIAMO:

• indirizzo dispositivo (8 bit)

• codice funzione (8 bit)

• dati (N x 16 bit)

• CRC (16 bit)

carattere = 1 start + 8 di dati + 1 parità + 1 stop =11

quindi in 1 secondo manda 19200 bit, in un millisecondo ne manda 19,2, per mandarne 11 ci vuole 11/19,2= 0,57ms. La distanza tra un carattere e un alto deve essere inferiore a esattamente 0,859375.

Se ho capito bene, un comando va mandato nel seguente modo:

Esempio comando:

1h 03h 1000h 0003h CRC

1 start+8dati+ 1 parità+1 di stop o se parità ok (no bit) 2 di stop (Giusto?)

1h___________indirizzo di Slave--------------------------> 1 00000001 11

03h__________comando di lettura------------------------> 1 00000011 0 11

1000h________primo registro di lettura----------->è 1 word---> 10 00------->1 00010001 0 11 + 1 00000000 0 11

0003h________lettura dei 3 registri contigui------>è 1 word---> 00 03------->1 00000000 0 11 + 1 00000011 0 11

CRC_________controllo errori

a questo punto se ho detto bene il messaggio sarebbe:

10000000111 100000011011 100010001011 100000000011 crc

Mi sono incasinato del tutto perchè a questo punto servirebbe anche il tempo tra un byte e l'altro :ph34r:

forse conviene usare in esadecimale e appoggiarsi alle librerie

PS: grazie ancora mf2hd

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...