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
Was meinst du mit synchron? Botschaften auf dem Can-Bus werden immer nacheinander nach ihrer Priorität verschickt.
Was verstehst du unter synchron? Kann ja nur eine Nachricht gleichzeitig über den Bus laufen...
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..)
Johannes, jetzt habe ich es verstanden, danke. Aber wie müsste man einen Zähler einbauen um das ganze synchron zu kriegen?
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 -> ...
Was verstehst du unter synchron? Bau einen Timer ein und gut ist.
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.
Oder man packt, wenn möglich, beide Werte in eine Nachricht. Sind ja bis zu 8 Byte möglich.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.