Forum: Mikrocontroller und Digitale Elektronik CAN Botschaften synchronisieren


von Hano (Gast)


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

von Rene Z. (renezimmermann)


Lesenswert?

Was meinst du mit synchron? Botschaften auf dem Can-Bus werden immer 
nacheinander nach ihrer Priorität verschickt.

von Florian F. (flof3000)


Lesenswert?

Was verstehst du unter synchron?
Kann ja nur eine Nachricht gleichzeitig über den Bus laufen...

von Dieter M. (Gast)


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)

von Hano (Gast)


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 :(

von ?!? (Gast)


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.

von Johannes (Gast)


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 ->...

von Johannes (Gast)


Lesenswert?

Achso

Hano schrieb:
> und dann werden beide
> Nachrichten zur gleichen Zeit rausgesendet oder?

Nein

von Hano (Gast)


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..)

von Hano (Gast)


Lesenswert?

Johannes, jetzt habe ich es verstanden, danke.
Aber wie müsste man einen Zähler einbauen um das ganze synchron zu 
kriegen?

von Johannes (Gast)


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 -> ...

von Johannes (Gast)


Lesenswert?

Was verstehst du unter synchron?
Bau einen Timer ein und gut ist.

von Hano (Gast)


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).

von Stefan (Gast)


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.

von Rene Z. (renezimmermann)


Lesenswert?

Oder man packt, wenn möglich, beide Werte in eine Nachricht. Sind ja bis 
zu 8 Byte möglich.

von rcc (Gast)


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.

von Ste N. (steno)


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

von Hano (Gast)


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?

von Thomas F. (igel)


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.

von Klaus (Gast)


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?

von PittyJ (Gast)


Lesenswert?

Da bekommt man schon Angst, wenn Leute im Auto was programmieren, ohne 
überhaupt den Can-Bus verstanden zu haben.
Nicht dass jetzt in Wolfsburg weitere Probleme erzeugt werden.

von rcc (Gast)


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.

von rcc (Gast)


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.

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.