CAN Botschaften synchronisieren

Gast #4309782
Lesenswert?

Hallo

ich habe zwei CAN Botschaften mit unterschiedlichen Identifer auf einem 
Steuergeräteines Fahrzeugs.
Wie kann ich dafür sorgen, dass beide Botschaften synchron gesendet 
werden?
Man gab mir mal den Tipp das über einen Counter auf dem Steuergerät zu 
machen, aber ich kann mir nicht vorstellen wie das gehen soll? Muss der 
Zähler in beide Botschaften zugefügt werden? Wie funktioniert es dann im 
Prinzip?

Ich dachte bislang dass die Botschaften immer synchron gesendet 
werden;;;

Mike
Gast #4309806
Lesenswert?

Mir ist nicht ganz klar, was genau die Aufgabe ist.
Aber vorab, ist Dir klar wie CAN funktioniert?
Auf einem Bus kann nur eine Botschaft zur gleichen Zeit gesendet werden.
Zwei Botschaften werden immer nacheinander gesendet.
Für Dich ist dann höchstens die Reihenfolge interessant.
Wenn ein Steuergerät beide Botschaften sendet, bestimmt das Steuergerät 
die Reihenfolge.
Wenn zwei Steuergeräte zur gleichen Zeit starten, sorgt die CAN-ID für 
die Reihenfolge (=Priorisierung)
Gast #4309810
Lesenswert?

ist das so? Ich bin noch relativ neu auf dem gebiet und ich dachte wenn 
2 botschaften eine Zykluszeit von 100ms haben, dann werden diese vom 
Steuergerät doch zur gleichen zeit rausgesendet auf den CAN Bus oder?
Oder ist hier der Hund begraben und deshalb diesen Zähler? Um genau 
diese Synchronität zu erzielen? Also 1. Nachricht wird gesendet, Zähler 
macht was bis die 2. Nachricht dran ist und dann werden beide 
Nachrichten zur gleichen Zeit rausgesendet oder?

Bin etwas verwirrt :(
Gast #4309814
Lesenswert?

Hano schrieb:
> Also 1. Nachricht wird gesendet, Zähler
> macht was bis die 2. Nachricht dran ist und dann werden beide
> Nachrichten zur gleichen Zeit rausgesendet oder?

Nein, es kann immer nur eine Message gesendet werden. Und wenn die raus 
ist, kann die nächste drankommen. Die Priorität richtet sich nach der 
CAN-ID. Aber zwei gleichzeitig sind schon physikalisch unmöglich.
Gast #4309818
Lesenswert?

Hano schrieb:
> 2 botschaften eine Zykluszeit von 100ms haben,

Beide können zwar im Zyklus vn 100ms gesendet werden, aber nacheinander. 
Also
100ms vorbei -> Sende 1. NAchricht -> 1. Nachricht gesendet -> Sende 2. 
Nachricht -> 2. Nachricht gesendet -> warte -> 100ms vorbei ->...
Gast #4309821
Lesenswert?

Aso, werden die dann in Abhängigkeit der Zykluszeit rausgesendet: Also 
Nachricht 1 senden -> 100ms später die 2. Nachricht usw...
Oder passiert das unabhängig davon bzw. abhängig von der Bus 
Geschwindigkeit (100Hz, 500Hz..)
Gast #4309826
Lesenswert?

je nachdem wie du das umsetzt.

entweder (hier wird aber jede Nachricht nur alle 200ms gesendet)
Nachricht eins senden -> Nachricht eins gesendet -> 100ms warten -> 
Nachricht zwei senden -> Nachricht zwei gesendet -> 100ms warten -> 
Nachricht eins senden....

oder wie ich es meine, beide Nachrichten alle 100ms aber direkt 
hintereinander
Nachricht eins senden -> Nachricht eins gesendet -> Nachricht zwei 
senden -> Nachricht zwei gesendet -> 100ms warten -> Nachricht eins 
senden -> Nachricht eins gesendet -> Nachricht zwei senden -> Nachricht 
zwei gesendet -> 100ms warten -> ...
Gast #4309837
Lesenswert?

Ich meine mit synchron, dass beide Nachrichten gleichzeitig beim 
Empfänger ankommen.
Kannst du mir ein Beispiel mit einem Timer anschaulich darstellen?

Nur mal angenommen beide Nachrichten müssen beim Empfänger gleichzeitig 
ankommen, da beide Nachrichten Winkel beinhalten, die zwei Motoren 
steuern (parallel).
Gast #4309846
Lesenswert?

Es können keine zwei Nachrichten bei CAN gleichzeitig ankommen. Daher 
muss man da nicht überlegen.
Wenn du sowas erreichen willst, nimmt man einen geeigneten "Arbeitstakt" 
in dem die Regler der Motoren laufen. Solange beide Nachrichten in der 
Zeitspanne bis zur nächsten Abarbeitung ankommen, dann sind sie 
gleichzeitig in der Motorsteuerung da.
Gast #4309888
Lesenswert?

Du willst die Daten die in zwei Botschaften aufgeteilt sind zeitlich 
zueinander synchron beim Empfänger haben, oder? Also Sicherstellen dass 
immer zueinander gehörenden Wertepaare ankommen.
Dann schick jeweils noch einen gleichen Zähler/Index mit jedem 
Botschaftspaar mit.


Bsp

B1 I1
B2 I1
B1 I2
B2 I2
B1 I3
B2 I3

Da Can ja zeitlich nicht deterministisch ist kann der Empfäger danach 
die passenden Pärchen wieder zusammen suchen wenn mal was gedreht 
ankommt oder ein Pärchen verwerfen wenn nur die eine Hälfte durchkommt.
#4309892
Lesenswert?

Oder man sendet z.B. alle 100ms einen Sync_Frame. Deine beiden Geräte 
welche die Position liefern, müssen nun auf den Sync lauschen und danach 
ihre Daten absetzen. Beim nächsten Sync werden die Werte dann in die 
Steuerung übernommen.

_||________________________||_ Sync

____||________________________ Position 1

________||____________________ Position 2
Gast #4310457
Lesenswert?

Hallo rcc,

das ist genau das was ich meine und brauche.
Nur um da sicher zu gehen dass ich das verstanden habe.

Beispiel Ablauf:

Nachricht 1 wird mit Index 1 rausgesendet ----> Empfänger empfängt 
Msg1/Id1
Nachricht 2 wird mit Index 1 rausgesendet -- Verzögerung --> noch nicht 
angekommen
Wait 100ms

Nachricht 1 wird mit Index 2 rausgesendet ----> Empfänger empfängt 
Msg1/Id2
Nachricht 2 mit Idx1 kommt erst jetzt an  ----> Empfänger verarbeitet 
nun Msg1/Idx1 und Msg2/Idx1

Ist das so richtig oder?
#4310464
Lesenswert?

Hano schrieb:
> Ich meine mit synchron, dass beide Nachrichten gleichzeitig beim
> Empfänger ankommen.

Wie beschrieben geht das nicht da immer nur eine Nachricht über den Bus 
gehen kann. Die zeitliche Verschiebung zwischen Nachricht 1 und 2 hängt 
von deiner Busgeschwindigkeit ab. Ohne jetzt nachzurechnen: Bei 500kBit 
liegt der Abstand wit unter 1ms. Dann können 100ms lang andere 
Botschaften gesendet werden bis deine beiden wieder dran kommen sollen.

Programmtechnisch habe ich das mit einem Schreibpuffer für 
CAN-Botschaften gelöst: Das Hauptprogramm kennt seine Laufzeit ja und 
schiebt dann alle 100ms die entsprechenden Botschaften in einen 
Sende-Puffer.
Eine Unterroutine, welche von einem Timer z.B jede Millisekunde 
aufgerufen wird, prüft, ob im Puffer zu sendende Nachrichten stehen. 
Dann wird ein (oder mehrere) freier CAN-Sendeslot auf dem Controller 
gesucht und die Botschaft(en) aus dem Puffer in die Sendeslots 
geschoben. Die CAN-Hardware versendet diese dann schnellstmöglich 
selbständig. Welche Botschaft nun eine Millisekunde früher vor der 
anderen ankommt muss egal sein, die Software muss damit zurecht kommen.
Gast #4310482
Lesenswert?

Vielleicht wäre es hilfreich, wenn man sich von dem ohnehin falschen 
Begriff "synchron" in diesem Zusammenhang verabschiedet.
Die akzeptierte Lösung besteht in der gegenseitigen "Zuordnung" von 
Botschaften anhand eines Identifizierers.

Abgesehen davon: Wenn es möglich ist den Botschaften einen 
Identifizierer hinzuzufügen, warum schickt man dann nicht die Inhalte 
der beiden Botschaften in einer einzelnen?
Gast #4311228
Lesenswert?

Hano schrieb:
> Hallo rcc,
>
> das ist genau das was ich meine und brauche.
> Nur um da sicher zu gehen dass ich das verstanden habe.
>
> Beispiel Ablauf:

> Ist das so richtig oder?

Im Prinzip ja. Ob der Empfänger warten kann oder Idx1 einfach wegwirft 
wenn nur die hälfte da ist und dann mit Idx2 weitermacht sobald alle da 
sind kommt auf die Anwendung drauf an.
Gast #4311241
Lesenswert?

Klaus schrieb:
> Abgesehen davon: Wenn es möglich ist den Botschaften einen
> Identifizierer hinzuzufügen, warum schickt man dann nicht die Inhalte
> der beiden Botschaften in einer einzelnen?

Weil die Anzahl der max. übertragbaren Nutzbits pro Botschaft beim CAN 
hart begrenzt ist? Für den Index reichen ein paar wenige Bits, für ein 
weiteres Messsignal oft nicht mehr. Dann macht man hald Index oder 
Mutiplex-Botschaften.
#4311282
Lesenswert?

Hano schrieb:

> Ich dachte bislang dass die Botschaften immer synchron gesendet
> werden;;;

Ich denke auch, dass ein guter Teil deiner Verwirrung hier her rührt.
Der Begriff 'synchron' wird in unterschiedlichem Zusammenhang 
unterschiedlich benutzt.
In der Tat gibt es den Begriff 'synchron' in der Datenübermittlung auch 
auf unterster Übertragungsebene. Gemeint ist damit normalerweise, dass 
es ein Taktsignal gibt, welches einer der beiden Teilnehmer generiert 
und das dem anderen Teilnehmer erlaubt die Bits anhand der Flanken in 
diesem Taktsignal festzunaglen.
Im Gegensatz dazu gibt es die asynchrone Übertragung, bei der es eben 
kein derartige Taktsignal gibt und bei dem der Empfänger zb anhand 
zeitlicher Zusammenhänge die Bits identifizieren muss.

Das hat aber nichts damit zu tun, dass ein Baustein mehrere Nachrichten 
gleichzeitig (aka. synchron, so wie in Synchronschimmer - alle machen 
gleichzeitig dasselbe) rausgeben kann. Auch in einer synchronen 
Datenverbindung können Nachrichten nur nacheinander übertragen werden.

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