Modbus RS485: Wie oft Stopp/Startbits ?

Gast #4126314
Lesenswert?

Ich werd aus den offiziellen Modbus-Protokollen nicht schlau. Wie muss 
ich die Stopp/Startbit setzen? Alle 8-Bit oder nur einmal um die gesamte 
Nachricht drumherum?
Hier (http://www.simplymodbus.ca/ASCII.htm) steht beispielsweise:
"In Modbus RTU each byte is sent as a string of 8 binary characters 
framed with a start bit, and a stop bit, making each byte 10 bits."
Also wirklich jedes Byte? Wie verhält es sich mit dem 16-Bit-CRC?


Anbenommen ich habe folgende Nachricht:

H=Haltebit (Stoppbit)
S=Startbit
Da ich no-Parity hab zwei Haltebits!?

Sieht meine Nachricht also so aus?:

S-[Byte1:Functioncode:8Bit]-HH-S-[Byte2:Adress:8Bit]-HH-S-[Byte3:DATA:8B 
it]-HH-S-[Byte4:CRC_LSB:8Bit]-HH-S-[Byte5:CRC_MSB:8Bit]-HH

(CRC muss ja getauscht werden MSB<->LSB)
Gast #4126340
Lesenswert?

Danke für die schnelle Antwort. Allerdings müssten es trotzdem 2 
Stoppbit sein pro Byte oder? In anderen Quellen liest man davon:

http://www.camillebauer.com/src/download/Modbus_Grundlagen.pdf

"Zeichenformat:     Normalerweise programmierbar

1 Start-, 8 Daten-, 1 Stopbit,  even parity
1 Start-, 8 Daten-, 1 Stopbit,  odd parity
1 Start-, 8 Daten-, 2 Stopbit,  no parity "

Ich hab wie gesagt bei meinem Gerät "no parity".
Gast #4126374
Lesenswert?

Vielen Dank!

Hätte ich nicht gedacht, dass ich das eine Bit auch weglassen kann. 
Woher weiss das Gerät denn, dass ich nur ein Bit anstatt zwei verwende 
und das nächste Bit nicht schon zum nächsten Nachrichten-Byte gehört?
Gast #4126450
Lesenswert?

StartStoppSchwindel schrieb:
> Woher weiss das Gerät denn, dass ich nur ein Bit anstatt zwei verwende
> und das nächste Bit nicht schon zum nächsten Nachrichten-Byte gehört?

In dem du beiden Geräten die sich unterhalten sollen das erzählst.
also:
Baudrate bei beiden gleich und

1 Start-, 8 Daten-, 1 Stopbit,  even parity
oder
1 Start-, 8 Daten-, 1 Stopbit,  odd parity
oder
1 Start-, 8 Daten-, 2 Stopbit,  no parity

auch bei beiden gleich, sonst können sie sich gar nicht verstehen.
Gast #4126468
Lesenswert?

Ok, hab mich vielleicht etwas sehr doof ausgedrückt.

Hab in der englischen wiki das Bildchen gefunden:
http://upload.wikimedia.org/wikipedia/commons/thumb/f/f2/RS-485_waveform.svg/487px-RS-485_waveform.svg.png


Ich denke das ich daraus folgendes ablese:

- Der Idle-Zustand ist der Ruhezustand, den ich für RS485 RTU brauche. 
Dieser Zustand muss auch 3,5 Character lang sein zwischen den 
Nachrichten.

- Start und Stoppbits haben umgekehrte Polarität (Und sind nicht der 
Ruhezustand)

- das niederwertigste Bit wird zuerst gesendet
#4126772
Lesenswert?

StartStoppSchwindel schrieb:
> Ok, hab mich vielleicht etwas sehr doof ausgedrückt.
>
> Hab in der englischen wiki das Bildchen gefunden:
> http://upload.wikimedia.org/wikipedia/commons/thum...
>
> Ich denke das ich daraus folgendes ablese:
>
> - Der Idle-Zustand ist der Ruhezustand, den ich für RS485 RTU brauche.
> Dieser Zustand muss auch 3,5 Character lang sein zwischen den
> Nachrichten.
>
> - Start und Stoppbits haben umgekehrte Polarität (Und sind nicht der
> Ruhezustand)
>
> - das niederwertigste Bit wird zuerst gesendet

Nein, der Ruhezustand ist der Stop-Pegel. Guck dir mal das Datenblatt 
typische RS485 Empfänger an, oft ist der Bereich von -0,3V - -0,02V 
nicht definiert, dh der Ausgang spinnt da zT sogar.
Darum verwendet man oft FailSave Terminierungen, z.Bsp:
0V  |--- 750Ohm --- A --- 100Ohm --- B --- 750Ohm ---> 5V

So wird der Bus im Idle auf einen Definierten Pegel gezogen.
Einige Empfänger nutzen aber auch Hysteresen über diesen Bereich, oft 
bezeichnet als FailSave RS485.

Den Ruhezustand sieht der IC hinter dem Transceiver also garnicht, er 
sollte da ein dauerhaften "Stop", dh ein A > B sehen.
Das Start ist dann ein A < B, danach 8 Datenbits, dann Parity und als 
Stop 2 Bit mit A > B. Danach darf wieder die Flanke zum Stop kommen.

Zur Erkennung zB beim ATMega (Zitat aus irgendeiner Ausarbeitung von 
mir):

Mikrocontroller der AVR-Familie wie der im Versuchsaufbau genutzte 
AT90USB162 tasten das Signal am RX-Eingang mit dem 16fachen der Baudrate 
ab, nutzen allerdings nur wenige der aufgenommenen Samples. Bei anderen 
Controllern kann dies gegebenenfalls abweichen und ist entsprechend zu 
beachten.
Befindet sich die Empfangseinheit im Leerlauf, wartet sie auf die erste 
negative Flanke. Diese wird als Beginn eines Startbits interpretiert. Um 
zu prüfen ob das erkannte Startbit gültig ist, werden die drei Samples 
in der Mitte des Startbits überprüft, sind zwei der drei Samples logisch 
0, so ist das Startbit gültig, andernfalls wird es als Fehler verworfen. 
Bei gültigem Startbit werden immer die drei mittleren Samples eines Bits 
ausgewertet und bei Mehrheit von logisch 0 als 0, bei Mehrheit von 
logisch 1 entsprechend als 1 gewertet.

Nach: Datenblatt AT90USB162, 17.7 Asynchronous Data Reception

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren