Forum: Mikrocontroller und Digitale Elektronik CanOpen DS301 - Emergency Message


von Peter U. (pulli00)


Lesenswert?

Hallo,

ich habe eine grundlegende Frage zur Emergency Message des CanOpen 
Protokolls.
Die DS301 Spezifikation habe ich bereits zu diesem Thema gelesen.

Und zwar besteht die Emergency Message aus dem Error Register (1Byte, 
Objekt 1001h) und dem Error Code (2Byte, in Objekt 1003h enthalten).

Der Error Code bezieht sich ja auf den aufgetretenen Fehler aus dem 
Error Register.

Nun zu meiner Frage...
Was passiert mit dem Error Code (1003h) wenn mehrere Fehler gleichzeitig 
aufgetreten sind und damit mehrere Bits im Error Register (1001h) 
gesetzt sind?
Der Error Code bezieht sich ja immer auf einen spezifischen Fehler. 
Werden die anderen Fehler dann ignoriert?


Beispiel:

Allgemeiner Fehler (Bit0), Überstrom (Bit1) und Übertemperatur (Bit3) 
sind im Error Register gesetzt.

Wie sieht nun der Error Code in der Emergency Message aus?
Error Code Allgemeiner Fehler = 1000h
Error Code für Überstrom = 2300h
Error Code für Übertemperatur = 4200h

Gibt es da eine Priorität oder werden drei Emergency Nachrichten 
nacheinander abgesetzt?

von void (Gast)


Lesenswert?

Peter U. schrieb:
> Was passiert mit dem Error Code (1003h) wenn mehrere Fehler gleichzeitig
> aufgetreten sind und damit mehrere Bits im Error Register (1001h)
> gesetzt sind?
> Der Error Code bezieht sich ja immer auf einen spezifischen Fehler.
> Werden die anderen Fehler dann ignoriert?

Der Error Code (1003h) ist laut Spec ein Array, kann also mehrere 
Fehler-Einträge haben.
Ob das aber wirklich genutzt wird, scheint Implementations-Spezifisch zu 
sein:

http://www.elmomc.com/support/manuals/MAN-CAN301IG.pdf
"The present version of SimplIQ digital servo drives store one error at 
the most."
- Nur ein Fehler, aber welcher?

http://www.medelelektronik.com/wp-content/uploads/2015/06/SRVO-CAN-Manual.pdf
"0x1003.1 → Last error code"
- Letzten Fehler (aber nur einen).

http://www.ps-log.si/dokumenti/UnidriveSP/Opcijske_kartice/SM-CanOpen_User_Guide_.pdf
"0x1003.1 Returns the last emergency object codes
 (...)
 0x1003.4 Returns the 4th last emergency object codes."
- Die vier letzten Fehler. Zuletzt Aufgetretener zu erst.

von Peter U. (pulli00)


Lesenswert?

void schrieb:
> Der Error Code (1003h) ist laut Spec ein Array, kann also mehrere
> Fehler-Einträge haben.
> Ob das aber wirklich genutzt wird, scheint Implementations-Spezifisch zu
> sein

Das stimmt schon. Das Objekt 1003h ist eine Fehlerhistorie. Sobald ein 
Fehler auftritt und die Emergency Message abgesetzt wurde, wird im 
Objekt 1003h ein neuer Eintrag mit dem jeweiligen Error Code der letzten 
Emergency Message gemacht.
Das habe ich verstanden.

Was mir unklar ist...
Wenn nun im Objekt 1001h mehrere Bits gesetzt sind, da min. zwei Fehler 
gleichzeitig aufgetreten sind, was ja durchaus mal vorkommen kann.
Der Error Code ist ja eine genauere Fehlerbeschreibung, aber bezieht 
sich immer nur auf ein Bit aus Objekt 1001h.
Müssen in dem Fall mehrere Emergency Messages nacheinander abgesetzt 
werden? Dazu finde ich leider nichts in der Spezifikation.
Aktuell ist mein Verständnis so, dass pro Fehlerevent eine Emergency 
Message abgesetzt werden muss und nicht pro Fehlereintrag im Register 
1001h.

von Steffen R. (steffen_rose)


Lesenswert?

Das Gerät hat einen Fehler.
Das Bit für diesen aktuellen Fehler wird im 0x1001 hinzugeodert.
(0x1001 zeigt die aktuelle Fehlersituation)
Die Emergency mit dem jeweiligen Fehlercode wird generiert.

Existiert eine Error History 0x1003 (optional) wird dieser Fehler in den 
Sub1 eingetragen. Ältere Fehler rutschen nach Sub 2 und folgende. Der 
letzte Fehler rutscht heraus.

D.h.
Für alle Fehler müssen auch Emergencies generiert werden.

0x1001 muss unabhängig von diesen Emergencies aktuell gehalten werden.

Einen Beziehung zwischen 0x1001 und 0x1003 existiert nicht direkt. 
0x1003 kann 1..254 Einträge fassen, je nach Implementierung.

Es gibt einige Implementierungen, die 0x1003 nicht nach Standard 
implementierung und Fehler aus der History wieder löschen. Eigentlich 
ist nur ein komplettes löschen (0x1003:0 = 0) erlaubt.

von Peter U. (pulli00)


Lesenswert?

Steffen R. schrieb:
> Für alle Fehler müssen auch Emergencies generiert werden.

Danke erstmal für den Beitrag.

So wie Sie es beschreiben, macht es auch durchaus Sinn.
Nur ein Punkt stört mich dann noch...

Und zwar wird das Bit Generic Error (Bit0) im Objekt 1001h ja immer 
zusätzlich zu jedem anderen Fehler gesetzt. Würde dann ja bedeuten, dass 
ich dann bei einem Fehler z.B. Overcurrent die Bits 0 und 1 gesetzt sind 
und damit dann zwei Emergency Messages abgesetzt werden mit den Error 
Codes 1000h und 2300h ?!

Gleichzeitig bläht mir damit die Fehlerhistorie in Objekt 1003h mit 
Generic Error Einträgen auf, die nicht wirklich aussagekräftig sind.

Das scheint mir an dieser Stelle noch nicht ganz so sinnvoll zu sein. 
Gibt es für den Generic Error vielleicht eine Ausnahmeregelung? In der 
Spezifikation finde ich dazu leider nichts.

von Steffen R. (steffen_rose)


Lesenswert?

Ausschlaggebend sind aber die Gerätefehler.

Entsprechend der vorliegenden Gerätefehler wird 0x1001 gesetzt. Dies 
selbst bewirkt nicht das Senden von Emergencies. Über 0x1001 selbst 
könnte man garnicht (genau) feststellen, welcher Fehler eigentlich 
vorliegt.

Entsprechend dem vorliegenden Gerätefehler wird die Emergency mit dem 
passenden Fehlercode gesendet. Dabei überträgt der Dienst auch die Daten 
aus dem Objekt 0x1001.

Das Bit 0 in 0x1001 wird dabei meist nur temporär gesetzt, teilweise 
automatisch. Objekt 0x1001 kann ja auch 0 werden und zeigt damit an, 
dass kein Fehler mehr vorliegt.
Oder es wird, sobald ein Fehler nicht mehr vorliegt, dies per Emergency 
mit Fehlercode 0x0000 angezeigt. Über das mitgesendete Objekt 0x1001 
kann man nun feststellen, ob noch andere Fehler anliegen oder nicht. Oft 
wird daber nicht das Bit 0 gesetzt. Wäre meiner Meinung nach auch 
falsch.

D.h. nicht die Veränderung von 0x1001 sendet Emergencies, sondern die 
Fehlerbehandlung muss beides bedienen.

von Peter U. (pulli00)


Lesenswert?

Steffen R. schrieb:
> D.h. nicht die Veränderung von 0x1001 sendet Emergencies, sondern die
> Fehlerbehandlung muss beides bedienen.

Danke für deinen Beitrag. So ist es auf jeden Fall sauberer. Ich habe es 
mir wohl etwas zu einfach gemacht.

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.