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
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)
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 :(
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.
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 ->...
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..)
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 -> ...
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).
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.
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.
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
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?
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.
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?
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.
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.
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.
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.