Serielle Schnittstelle RS232

mkersch

Level-1
Beiträge
111
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forenmitglieder,

in der Vergangenheit habe ich bereits die RS232 (Onboard CX9020) Schnittstelle verwendet.
Bis jetzt habe ich nur Strings empfangen und gesendet.

Jetzt möchte ich einen RS232 Bus abfragen auf dem folgende Bytes gesendet bzw. empfangen werden.
Baudrate 9600,8,1,N
Empfang.
- Break-Signal für ca. 13 Bit's ==> wird als Empfang 00 dargestellt
- Synchronisationszeichen 55H
- Data 1A
- ...
- Data XA
- CRC
<== evtl. Statustelegramm senden
Pause von ca. 6 ms.


Empfang
- Breaksignal für ca 13 Bit's ==> wird als Empfang 00 dargestellt
- Synchronisationszeichen 55H
- Data 1B
- ...
- Data XB
- CRC

usw. ==> Im Moment werden 16 Telegramme mit einem Zeitabstand von ca. 6ms empfangen. Tel.1 (<==Senden) 6ms Tel. 6ms Tel. 6ms usw. Nach einer Pause von ca. 500ms wiederholt sich dieser Vorgang. Je nach Telegrammtyp kann es sein, dass nach jedem Telegramm noch ein Statustelegramm zurückgesendet werden muss.


Das Problem dabei ist, dass zwischen den einzelnen Empfangsdatenblöcken nur ca. 6ms Pausenzeit ist. Außerdem sind die Datenblöcke unterschiedlich lang.
Ein weiteres Problem ist, dass auch in den Nutzdaten eine 00 gefolgt von 55H vorkommen kann. Je nach Kommando-Telegramm kann es sein, dass vor dem nächsten Empfang ein Statustelegramm gesendet werden muss.

Ich wollte mit der ReceiveData Funktion und Timout (4ms) dies realisieren, was aber nicht funktioniert.
Danach habe ich direkt das Prozessabbild ausgewertet (COM_Status + Com_Data[0] .. [x]. Jedoch bekomme ich hier auch nicht die zeitliche Auflösung,
die ich benötige (ich denke aufgrund Hardware-FIFO, Prozessabbild-Puffer mit 64 Bytes, usw.)

Wie würdet ihr dies realisieren ?
Kann man nach jedem Zeichenempfang ein Ereignis (Interrupt) in der Steuerung auslösen ?

In meiner Steuerung habe ich eine COM-Task (Priorität 0 mit 1ms) am laufen, um diesen Empfang auszuwerten.
Gibt es evtl. die Möglichkeit diese Task noch schneller zu machen ?

Oder muss ich für diese Aufgabe eine EL6001 einsetzen, die auch einen Frame-Error erkennt bzw.
die Daten in kleinerer Einheiten (ohne Puffer, bzw. FIFO) verarbeitet ?

4072:03Framing errorEs ist ein Framing-Error aufgetreten. Das betroffene Datum wird
nicht in das Empfangs-FIFO der Klemme geladen und geht verloren.

Dies könnte ich evtl. hernehmen um ein neues Telegramm zu identifizieren.


Da das Timing dieser RS232 Kommunikation sehr speziell ist, kann ich nicht beurteilen, ob dies mit einer Beckhoff-Steuerung zu realisieren ist.
Dies ist der Grund warum ich mich, mit der Bitte um Rat, an Euch wende.

mfg.
mkersch
 
Ohne jetzt auf die CX-Details eingehen zu wollen, aber wenn ich eine Meldung wie Framing Error sehe, würde ich mal prüfen ob die eingestellte Baudrate und Anzahl Stopbits zusammenpassen.
Ein Framing Error tritt auf wenn nach den 8 (bzw. eingestellen) Datenbits kein Stopbit erkannt wurde. Das kann mehrere Ursachen haben. Entweder das aufsynchronisieren beim Startbit schlägt schon fehl, oder die Taktgeneratoren der Teilnehmer laufen auseinander. Das kannst du eigentlich nur mit einem Oszilloskop prüfen, indem du z.B. 0x55 oder 0xaa sendest und empfängst. Bei 9600 Baud sollten die 104 µs lang sein.

Ein "Break-Signal" (was auch immer das sein mag, ich gehe mal davon aus du meinst, es passiert nichts auf der Leitung) sollte auch nicht als 0 empfangen werden, sondern es wird garnichts empfangen. Darum würde ich meinen, bei dir ist auch im Ruhezustand kein Ruhepegel auf der Leitung.

Wenn du meinst du kannst nicht schnell genug lesen, solltest du evtl. Hardware-Handshake aktiveren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für die schnelle Antwort.

Noch ein paar Hinweise zu meiner Kommunikation.

Im Prinzip "läuft" ein quasi LIN Bus (nicht konform mit Standard LIN) der jedes Telegramm mit einem Break-Signal (13Bit LOW) Signal startet. Danach folgt ein SYC Zeichen 55H, Databyte1 .. Databyte X, CRC. Die LIN Physik wandle ich mit einem speziellen Baustein zu RXD/TXD.

Das Break-Signal wird von der Master-Kommunikationsbaugruppe erzeugt (13 Bit Low).

Im Normalfall hängen an diesen Bus einige "Slave-Geräte" welche über diesen Bus angesprochen bzw. Daten an den Master, nach Anforderung senden.

Mit einer CX-9020 möchte ich jetzt eine Art Simulation des "Slave-Geräts" aufbauen um eine Testumgebung für das Master-Gerät zu haben. Jetzt könnte ich die empfangenen Daten (RS232 LIN) mittels ADS Kommunikation zurücklesen und entsprechend verifizieren.

mfg.
mkersch
 
Zuletzt bearbeitet:
Zurück
Oben