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

CANopen Manager per Code aktivieren / deaktivieren

jago85
2019-03-14
2019-04-10
  • jago85 - 2019-03-14

    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

     
  • eschwellinger

    eschwellinger - 2019-03-14

    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:

    Starting, stopping, and resetting devices
    

    Activating and deactivating devices
    Traversing the device tree
    Collecting device and bus information

    Grüße
    Edwin

     
  • jago85 - 2019-03-15

    Hallo Edwin,

    das klingt gut. Ich schaue es mir an.

    Danke für den Tipp.

    Grüße,
    Jan

     
  • jago85 - 2019-03-20

    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
    ----------------------------------------------
    // hier das Gerät zuweisen
    _itfNode := CANopen_Manager;
    // _xEnable einmalig setzen, um den Vorgang zu starten
    // _xEnableNode setzten / zurücksetzen je nach gewünschter Funktion (aktivieren / deaktivieren)
    IF _xEnable = TRUE THEN
       _xEnable := FALSE;
       _itfNode.Enable := _xEnableNode;
       _fbReconfig.xExecute := TRUE;
    END_IF
    _fbReconfig(itfNode := _itfNode);
    IF _fbReconfig.xDone OR _fbReconfig.xError THEN
       _fbReconfig.xExecute := FALSE;
    END_IF
    
     
  • Dave-76 - 2019-04-10

    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!

     

Log in to post a comment.