Wenn ich über den CAN-Bus ein Telegramm (1 Datenbyte) sende, das beim
Empfängerknoten dafür sorgt (1 bestimmtes Bit im Datenbyte ist gesetzt),
dass ein Relais anzieht, wie kann ich sicher sein, dass das Relais
angezogen hat bzw., dass das Telegramm angekommen ist?
Nun habe ich mir gedacht, dass das Bit, das das Relais anziehen lässt
gleichzeitig auf einen Eingang des Empfängerknotens zulegen und so
abfragen kann (per Remotetelegramm z. B.), ob zumindest das Bit, welches
das Relais anziehen lässt, gesetzt ist.
Ist das üblich - oder gibt es etwas besseres?
es gibt doch ein ACK-Bit wo alle Teilnehmer den Empfang bestätigen.
Damit kannst du aber nicht sicherstellen dass das Relais angezogen hat,
das müsstest du im Entsprechenden Relaiskreis abfragen und mit
zurücksenden.
Es gibt verschiedene Überwachungsalgorithemen beim CAN-Bus, alle durch
entsprechende Software zu erledigen. Hier mal eine kleine Auswahl:
- Der Empfangskonoten überwacht das zyklische Empfangen des Telegramms.
Wenn dies ausbleibt (typ. 3x normale Zeit), werden alle Ausgänge
ausgeschaltet bzw. der sichere Zustand hergestellt
- Der Sendeknoten überwacht ein zyklisches Telegramm des Empfangsknoten
(s.o.)
- Der Sendeknoten macht ein "Nodeguarding" gemäß CANopen-Standard, hier
wird ein Remote-Telegramm gesendet und der Empfänger antwortet mit einem
Bit, was jeweils getoggelt wird (0,1,0,1 usw.). Reaktion ansonsten wie
oben
- Der Empfangsknoten sendet ein "Heartbeat"-Signal und signalisiert so
dem Sender, dass er noch lebt
Wenn Du ganz sicher sein willst (kommt auf die Anwendung an), würde ich
den emfangenen Zustand mittels Telegramm zurücksenden. Dann kannst Du
die Software entsprechend verriegeln.
Noch sicherer ist natürich, ein Hilfskontakt des Relais einzulesen, dann
hast Du gleich noch die Ausgangsstufe und die Relaispule mit überwacht.
Einzuschließen ist dann natürlich auch die Überwachung des
"Aus"-Zustandes.
Ich könnte noch beliebig weiterschreiben, aber ich denke, Du solltest
das Grundprinzip verstehen.
Gruß,
Jürgen
Martin schrieb:> bzw., dass das Telegramm angekommen ist?
Das garantiert dir der CAN-Bus auf Hardwareebene (solange er
funktioniert).
> wie kann ich sicher sein, dass das Relais angezogen hat
Gar niemand. Es könnte ja eine Unterbrechung in der Spule sein, oder der
Schalttransistor ist defekt, oder der Kontakt im Relais ist
abgefackelt...
> Noch sicherer ist natürich, ein Hilfskontakt des Relais einzulesen,> dann hast Du gleich noch die Ausgangsstufe und die Relaispule mit> überwacht.
Mit einem abgebrannten Kontakt im Relais würde nicht mal das helfen...
Du müsstest für eine maximale Sicherheit(=Garantie) also die geschaltete
Last abfragen, ob dort letzendlich der gewünschte Schaltimpuls
angekommen ist.
Vielen Dank für alle Antworten.
>> bzw., dass das Telegramm angekommen ist?> Das garantiert dir der CAN-Bus auf Hardwareebene (solange er> funktioniert).
Das ist nicht richtig. Es ist lediglich garantiert, dass 1 Knoten (mit
der Bestätigung durch das ACK-Bit) das Telegramm korrekt empfangen hat.
> Wenn Du ganz sicher sein willst (kommt auf die Anwendung an), würde ich> den emfangenen Zustand mittels Telegramm zurücksenden. Dann kannst Du> die Software entsprechend verriegeln.
Diesen Weg werde ich gehen :)
Hi Martin,
Martin schrieb:>>> bzw., dass das Telegramm angekommen ist?>>> Das garantiert dir der CAN-Bus auf Hardwareebene (solange er>> funktioniert).>> Das ist nicht richtig. Es ist lediglich garantiert, dass 1 Knoten (mit> der Bestätigung durch das ACK-Bit) das Telegramm korrekt empfangen hat.
Da liegst du falsch. Die ACK-Bits sagen dem Controller (allem Knoten am
Bus, also Sender und Empfänger) das alle Knoten keinen
Übertragungsfehler erkannt haben. Sobald ein einziger Knoten einen
Übertragungsfehler registriert, wird er den Fehlerzustand in der
Nachricht setzen. Lothar hat schon recht. Du musst auch das beachten was
in der Klammer stehen hat. Weil das der einzige Fall ist, in dem die
Nachricht nicht fehlerhaft gekennzeichnet wird und dein Knoten die
Nachricht nicht erhalten hat. Genau dann wenn der Emfangsknoten sich
selber als Fehlerquelle erkannt hat "trennt" er sich vom Bus ab und
startet neu.
Es ist aber ein Unterschied ob der CAN-Controller oder die
Verarbeitungseinheit, die Nachricht erhalten hat. Der CAN-Controller
überwacht nur die reine Übertragung über den Bus und packt die Nachricht
in eine Empfangsbox. Bis hier her ist die Übertragungssicherheit durch
den CAN-Standard sichergestellt. Ob die Nachricht jemals aus der
Empfangsbox ausgelesen verarbeitet wird musst du eben durch die weiter
oben beschrieben Verfahren sicherstellen. Das trifft aber auch auf jede
andere Kommunikation zu und ist somit nicht CAN-spezifisch.
TManiac schrieb:> Hi Martin,>> Martin schrieb:>>>> bzw., dass das Telegramm angekommen ist?>>>>> Das garantiert dir der CAN-Bus auf Hardwareebene (solange er>>> funktioniert).>>>> Das ist nicht richtig. Es ist lediglich garantiert, dass 1 Knoten (mit>> der Bestätigung durch das ACK-Bit) das Telegramm korrekt empfangen hat.>> Da liegst du falsch. Die ACK-Bits sagen dem Controller (allem Knoten am> Bus, also Sender und Empfänger) das alle Knoten keinen Übertragungsfehler> erkannt haben.
Es gibt nur ein ACK-Bit, und das sagt lediglich, daß mindestens ein
Knoten die Nachricht fehlerfrei empfangen hat.
> Sobald ein einziger Knoten einen Übertragungsfehler registriert, wird er> den Fehlerzustand in der Nachricht setzen.
Das geschieht aber nicht über das ACK-Bit, sondern über Error-Flags.
> Lothar hat schon recht. Du musst auch das beachten was> in der Klammer stehen hat. Weil das der einzige Fall ist, in dem die> Nachricht nicht fehlerhaft gekennzeichnet wird und dein Knoten die> Nachricht nicht erhalten hat. Genau dann wenn der Emfangsknoten sich> selber als Fehlerquelle erkannt hat "trennt" er sich vom Bus ab und> startet neu.
Er zieht sich langsam in mehreren Schritten vom Bus zurück, sofern der
Fehler bestehen bleibt. Ob er dann wieder neu startet, ist Sache der
Software.
TManiac schrieb:> Da liegst du falsch. Die ACK-Bits sagen dem Controller (allem Knoten am> Bus, also Sender und Empfänger) das alle Knoten keinen> Übertragungsfehler erkannt haben.
Da das ACK Bit vom Sender rezessiv rausgeblasen wird und von jeder Node,
die den Frame korrekt empfangen hat, dominant gesetzt wird reicht eine
einzige Node aus. Wie der Name schon sagt kann jede Node ein rezessives
Bit auf dominant setzen, aber umgekehrt eben nicht.
Ok da hab ich mich wohl zu schwammig ausgedrückt und zu stark
vereinfacht. Das ACK-Bit kommt nach den Datenbits und dem CRC-Bits. Und
ja es wird von den Empfängern auf dominant gesetzt und überschreibt
somit den rezessiven Zustand des Senders, der nun wiederum das
Überschreiben erkennt.
Aber:
Auf die gleiche Weise nur länger wird auch der Fehlerzustand
signalisiert und damit geht das ACK-Bit zwischen den anderen 5
dominanten Error-Bits unter. Nun wird wieder jemand schreien, aber die
Error-Bits müssen nicht am Ende stehen. Auch das stimmt, sie werden
sofort auf den Bus gelegt sobald die Nachricht als fehlerhaft erkannt
wird. Aber auch dann wird es nie zu einem positiven Acknowledge kommen.
Also, sobald das ACK-Bit als solches erkannt wird ist die Nachricht auch
richtig, zu mindest bis zu dem Bit selber.
Die CAN Spec sagt zum Übergang vom Zustand Bus-off zu active folgendes:
> An node which is ’bus off’ is permitted to become ’error active’> (no longer ’bus off’) with its error counters both set to 0 after 128> occurrances of 11 consecutive ’recessive’ bits have been monitored on> the bus.
Es muss also für einen Restart des CAN Controllers nur ausreichend
Busruhe vorhanden sein.
Aber solche Sachen sehe ich eher als Interna an. mit denen man sich als
Nutzer eigentlich nicht rumschlagen muss. Entweder die Nachricht ist
richtig übertragen oder eben nicht.