Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
wir haben in unserem System einen CANopen-Manager laufen, den wir in bestimmten Zuständen gerne deaktivieren möchten. Unser System erfordert es, bestimmte Geräte abzuschalten, um Strom zu sparen. Darunter fallen auch alle CAN-Knoten und selbst die Versorgungsspannung der CAN-Schnittstelle. (Das Schalten der Betriebsspannungen erfolgt über Ausgänge der Steuerung. Die Steuerung selbst läuft immer.) Das hat zur Folge, dass CAN-Nachrichten des CANopen-Managers nicht mehr bestätigt werden und somit in der Transmit-Queue hängen bleiben. Der CAN-Treiber versucht dann die CAN-Nachrichten immer wieder zu versenden. In der Steuerung steigt dann die CPU-Last der CAN-Prozesse. Beim Wiedereinschalten wird dann erstmal die gesamte Transmit-Queue gesendet.
Daher suche ich gerade nach einer Möglichkeit, den CANopen-Manager per Code zu deaktivieren, vor allem mit dem Ziel, dass keine Nachrichten mehr gesendet werden. Wir nutzen Heartbeat und Pollen optionaler Slaves.
Den Heartbeat des Masters kann man vermutlich abschalten, indem man das SDO für die Heartbeat-Time auf 0 setzt.
Aber kann man auch das Pollen optionaler Slaves deaktivieren?
Gibt es sonst noch eine Möglichkeiten, den CANopen-Manager geordnet zu deaktivieren?
Grüße,
Jan
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich habe mich nun etwas mit dem Beispiel beschäftig und begonnen daraus etwas eigenes zu bauen. Allerdings lief erstmal gar nichts (das Beispiel klappte aber). Ich habe das dann soweit vereinfacht, dass ich nur den Aufruf von DED.GetRoot() im Projekt hatte. Die Funktion gab immer nur 0 zurück.
Nach einiger Sucherei habe ich dann endlich herausgefunden, dass man in den SPS-Einstellungen "Diagnose für Geräte aktivieren" setzen muss. Ich hatte mir dir Bibliothek "CAA Device Diagnosis" selbst in den Bibliotheksverwalter gezogen. Eigentlich wird diese automatisch angezogen, wenn man diese Funktion aktiviert.
Vielleicht hilf das hier ja mal jemanden mit einem ähnlichen Problem. So etwas dürfte ruhig in dem PDF, was dem Beispiel beiliegt, einmal erwähnt werden.
Zumindest kann ich die gewünschte Funktion nun relativ einfach erreichen. Das Deaktivieren des CANopen-Managers habe ich soweit vereinfacht:
VAR
  _itfNode : DED.INode;
  _fbReconfig : DED.Reconfigure;
  _xEnable : BOOL;
  _xEnableNode : BOOL;END_VAR----------------------------------------------//hierdasGerätzuweisen_itfNode :=CANopen_Manager;//_xEnableeinmaligsetzen, umdenVorgangzustarten//_xEnableNodesetzten/zurücksetzenjenachgewünschterFunktion(aktivieren/deaktivieren)IF_xEnable=TRUETHEN
  _xEnable :=FALSE;
  _itfNode.Enable :=_xEnableNode;
  _fbReconfig.xExecute :=TRUE;END_IF_fbReconfig(itfNode :=_itfNode);IF_fbReconfig.xDoneOR_fbReconfig.xErrorTHEN
  _fbReconfig.xExecute :=FALSE;END_IF
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo,
wir haben in unserem System einen CANopen-Manager laufen, den wir in bestimmten Zuständen gerne deaktivieren möchten. Unser System erfordert es, bestimmte Geräte abzuschalten, um Strom zu sparen. Darunter fallen auch alle CAN-Knoten und selbst die Versorgungsspannung der CAN-Schnittstelle. (Das Schalten der Betriebsspannungen erfolgt über Ausgänge der Steuerung. Die Steuerung selbst läuft immer.) Das hat zur Folge, dass CAN-Nachrichten des CANopen-Managers nicht mehr bestätigt werden und somit in der Transmit-Queue hängen bleiben. Der CAN-Treiber versucht dann die CAN-Nachrichten immer wieder zu versenden. In der Steuerung steigt dann die CPU-Last der CAN-Prozesse. Beim Wiedereinschalten wird dann erstmal die gesamte Transmit-Queue gesendet.
Daher suche ich gerade nach einer Möglichkeit, den CANopen-Manager per Code zu deaktivieren, vor allem mit dem Ziel, dass keine Nachrichten mehr gesendet werden. Wir nutzen Heartbeat und Pollen optionaler Slaves.
Den Heartbeat des Masters kann man vermutlich abschalten, indem man das SDO für die Heartbeat-Time auf 0 setzt.
Aber kann man auch das Pollen optionaler Slaves deaktivieren?
Gibt es sonst noch eine Möglichkeiten, den CANopen-Manager geordnet zu deaktivieren?
Grüße,
Jan
Hi,
schau mal in folgendes Beispiel:
CAA Device Diagnosis Example:
https://store.codesys.com/caa-device-di ... ample.html
The example use cases demonstrate how to use the CAA Device Diagnosis library for the following:
Activating and deactivating devices
Traversing the device tree
Collecting device and bus information
Grüße
Edwin
Hallo Edwin,
das klingt gut. Ich schaue es mir an.
Danke für den Tipp.
Grüße,
Jan
Ich habe mich nun etwas mit dem Beispiel beschäftig und begonnen daraus etwas eigenes zu bauen. Allerdings lief erstmal gar nichts (das Beispiel klappte aber). Ich habe das dann soweit vereinfacht, dass ich nur den Aufruf von DED.GetRoot() im Projekt hatte. Die Funktion gab immer nur 0 zurück.
Nach einiger Sucherei habe ich dann endlich herausgefunden, dass man in den SPS-Einstellungen "Diagnose für Geräte aktivieren" setzen muss. Ich hatte mir dir Bibliothek "CAA Device Diagnosis" selbst in den Bibliotheksverwalter gezogen. Eigentlich wird diese automatisch angezogen, wenn man diese Funktion aktiviert.
Vielleicht hilf das hier ja mal jemanden mit einem ähnlichen Problem. So etwas dürfte ruhig in dem PDF, was dem Beispiel beiliegt, einmal erwähnt werden.
Zumindest kann ich die gewünschte Funktion nun relativ einfach erreichen. Das Deaktivieren des CANopen-Managers habe ich soweit vereinfacht:
Danke ich werde das demnächst benötigen, da ich bei bestimmten Anlagen auch den CAN-Bus abschalten möchte um CPU-Last zu sparen!