-> 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 ?
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
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:03 | Framing error | Es 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