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 - SDO's schreiben

WolfgangW
2015-04-20
2017-01-24
  • WolfgangW - 2015-04-20

    Hallo,

    ich habe an den CANopen Manager (CODESYS V3.5) ein CANopen-Device angehängt. Bei diesem Device möchte ich per Service Data Object die Konfiguration ändern. Gibt es ein Beispiel oder Tutorial zum Schreiben und Lesen von SDO's ?

    Danke und Gruß
    Wolfgang

     
  • eschwellinger

    eschwellinger - 2015-04-20

    Hallo Wolfgang,

    schau mal in die CAA CIA405 Library
    und dann das Code Snippet:

            ciaSDORead    : CIA405.SDO_READ;
       usiNetwork    : USINT         := 1;        // NetId = 0 <=> Network = NetId + 1 = 1
       xEnable       : BOOL;
       udiTimeout    : UDINT         := 0;
       Device        : CIA405.DEVICE := 1;       // Addressed device
                                          // range 0 … 127
                                          // 0 means local device
                                       
       wIndex        : WORD          := 16#1008;
       bySubIndex    : BYTE          := 16#00;
       aData         : ARRAY[0..gc_iMAX_Buffer] OF BYTE;
       uiDataLength  : UINT := SIZEOF(aData);
       psData        : POINTER TO STRING(256);
       i             : INT;
       xLastEnable   : BOOL;
    IF xEnable AND NOT xLastEnable THEN
       FOR i := 0 TO gc_iMAX_Buffer DO 
          aData[i] := 16#00;
       END_FOR
       
       uiDataLength := SIZEOF(aData);
       psData       := ADR(aData);
    END_IF
    ciaSDORead(Network    := usiNetwork,   // NetId = 0 <=> Network = 1
               Enable     := xEnable,
               Timeout    := udiTimeout,
               Device     := Device,
               Channel    := 1,
               Index      := wIndex,
               SubIndex   := bySubIndex,
               Data       := ADR(aData),
               DataLength := uiDataLength); (* IMPORTANT: uiDataLength is a VAR_IN_OUT variable! *)
    IF ciaSDORead.CONFIRM THEN
       xEnable := FALSE;
       ciaSDORead(Enable := xEnable, DataLength := uiDataLength);
    ELSIF ciaSDORead.ERROR <> CiA405.CANOPEN_KERNEL_ERROR.CANOPEN_KERNEL_NO_ERROR THEN
       //Error occured
       xEnable := FALSE;
       ciaSDORead(Enable := xEnable, DataLength := uiDataLength);
    END_IF
    xLastEnable := xEnable;
    

    Grüße
    Edwin

     
  • WolfgangW - 2015-04-27

    Hallo Edwin,

    Danke für die Anrwort, hat mir sehr geholfen.

    Gruß
    Wolfgang

     
  • SebastianRaPi - 2016-11-04

    Gibt es auch ein Beispiel für SDOwrite??

    Ich will an ein Device mit der NodeID 10 (16#A) den Befehl senden um in den PreOperational-Mode zu wechseln....

    Wenn ich mich mit einem anderen Tool auf den Bus klemme, muss ich "80 0A" senden... NUn muss ich das aber auch über Codesys schaffen...

       ciaSDOWrite : CIA405.SDO_WRITE;
    ciaSDOWrite.????
    

    Welche Unterpunkte muss ich dann noch aktivieren?? Bzw. mit welchen Daten füttern??

    Grüße

     
  • plcmax - 2016-11-06

    Hallo,

    Beispiel:

    VAR
       ciaSDOWrite4 : CiA405.SDO_WRITE4;
       usiNetwork    : USINT         := 1;        // NetId = 0 <=> Network = NetId + 1 = 1
       xEnable       : BOOL;
       udiTimeout    : UDINT         := 0;
       Device        : CIA405.DEVICE := 1;       // Addressed device
                                          // range 0 … 127
                                          // 0 means local device
                                       
       wIndex        : WORD          := 16#1020;
       bySubIndex    : BYTE          := 16#02;
       aData         : ARRAY[0..3] OF BYTE := [16#11,16#22,16#33,16#44];
       usiDataLength  : USINT := 4;
       xLastEnable   : BOOL;
    END_VAR
    
    (*This example code writes a 4 byte object with a SDO Write Expedited Transfer*)
    ciaSDOWrite4(
       NETWORK:= usiNetwork, 
       ENABLE:= xEnable, 
       TIMEOUT:= udiTimeout, 
       DEVICE:= Device, 
       CHANNEL:= 1, 
       INDEX:= wIndex, 
       SUBINDEX:= bySubIndex, 
       DATA:= aData, 
       DATALENGTH:= usiDataLength, 
    );
    IF ciaSDOWrite4.CONFIRM THEN
       xEnable := FALSE;
       ciaSDOWrite4(Enable := xEnable);
    ELSIF ciaSDOWrite4.ERROR <> CiA405.CANOPEN_KERNEL_ERROR.CANOPEN_KERNEL_NO_ERROR THEN
       //Error occured
       xEnable := FALSE;
       ciaSDOWrite4(Enable := xEnable);
    END_IF
    xLastEnable := xEnable;
    

    Grüße
    plcmax

     
  • SebastianRaPi - 2017-01-23

    Hallo plcmax,

    hat nun doch eine ganze Weile gedauert, bis ich mich wieder mit SDO-write beschäftigen durfte...

    Wenn ich den Code von dir nehme uns auf mein Device anpasse, läuft mein Programm leider nicht...

    Was muss denn wie eingestellt werden, damit ich SDO's senden kann??

    Gibt es noch einen anderen Weg? Oder eine detailliertere Beschreibung?

    Danke schon mal...

     
  • SebastianRaPi - 2017-01-23

    Um mein Problem bei der Anwendung nochmals kurz zu konkretisieren

    ciaSDOWrite4  : CiA405.SDO_WRITE4;
    usiNetwork     : USINT := 1;         // NetId = 0 <=> Network = NetId + 1 = 1                               ;; Was ist mit der NetID gemeint??
    xEnable          : BOOL;      ;;;; mit xEnable high wird dann meine SDO-Nachricht 1-Mal gesendet??
    udiTimeout     : UDINT         := 0;
    Device        : CIA405.DEVICE := 1;       // Addressed device                            ;;    Hier ist das Gerät gemeint, welches ich ansprechen möchte, nehme ich an.
                                                          // range 0 … 127
                                                               // 0 means local device
    
    wIndex        : WORD          := 16#1020;    ;; welche Werte muss ich hier hinschreiben, um die im Bild dargestellte Nachricht zu senden??
    bySubIndex    : BYTE          := 16#02;
    aData         : ARRAY[0..3] OF BYTE := [16#11,16#22,16#33,16#44];
    usiDataLength  : USINT := 4;
    xLastEnable   : BOOL;
    

    Channel ;; Muss ich hier einen bestimmten Channel einstellen??

    Was macht dieser Block??

    IF ciaSDOWrite4.CONFIRM THEN
    xEnable := FALSE;
    ciaSDOWrite4(Enable := xEnable);
    ELSIF ciaSDOWrite4.ERROR <> CiA405.CANOPEN_KERNEL_ERROR.CANOPEN_KERNEL_NO_ERROR THEN
    //Error occured
    xEnable := FALSE;
    ciaSDOWrite4(Enable := xEnable);
    END_IF

    Benötige ich diesen zwingend??

    Danke

    IMG: ResetCommunication.JPG

     
  • eschwellinger

    eschwellinger - 2017-01-23

    Hi,

    ich denke du willst NMT Reset Communication ausführen?
    Dann den NMT FB verwenden.

    Grüße
    Edwin

    IMG: NMTReset.jpg

     
  • SebastianRaPi - 2017-01-24

    Danke für die Antwort.

    habe mich nun mit dem FB NMT auseinandergesetzt...

    leider vergebens.

    der NMT-State meines Device (ist SDO fähig) ändert sich nicht... Mit einem anderen Toll (pCAN-View von peak) kann ich den NMT-State problemlos umschalten...

    Nun muss es aber auch automatisiert mit Codesys klappen.

    Was muss ich bei Network übergeben?? Es ist mir nicht klar, was ich damit machen muss... Auch nicht mit der Erklärung... Was ist mit CAN0, CAN1 usw gemeint?

    Im ERROR steht etwas, dass ein falscher Parameter vorhanden ist... Welcher Parameter das ist, weiß man nicht.

    Mein Device hat die NodeID 10...

    Den intCount habe ich nur, um zu sehen ob der Funktionsbaustein auch aufgerufen wird.

    Grüße
    Sebastian

    IMG: NMT.JPG

     
  • SebastianRaPi - 2017-01-24

    Hallo,

    ich habe das Problem nun in den Griff bekommen...

    Die Beschreibung für "Network" lautet:

    Zitat:
    CAN network number the function block should operate on. Note: It is not the same like the network number in CANBus configurator. The CiA405 NETWORK is calculated by NetID + 1. Example: 1 = CAN0, 2 = CAN1, 3 = CAN2, ...

    Die ID des EtherCat_Masters ist bei meinem Project >Zitat:
    0000 0001

    ==> Die Lösung ist nun, dass die NetID auf "2" eingestellt werden muss. Damit funktioniert die Funktion auch...

    IMG: EtherCAT_Master_NetID.JPG

     

Log in to post a comment.