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
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
                       //range0 … 127
                       //0meanslocaldevice
                      Â
  wIndex    : WORD     :=16#1008;
  bySubIndex  : BYTE     :=16#00;
  aData     : ARRAY[0..gc_iMAX_Buffer] OFBYTE;
  uiDataLength : UINT :=SIZEOF(aData);
  psData    : POINTERTOSTRING(256);
  i       : INT;
  xLastEnable  : BOOL;IFxEnableANDNOTxLastEnableTHEN
  FORi :=0TOgc_iMAX_BufferDO
    aData[i] :=16#00;
  END_FOR
 Â
  uiDataLength :=SIZEOF(aData);
  psData    :=ADR(aData);END_IFciaSDORead(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! *)IFciaSDORead.CONFIRMTHEN
  xEnable :=FALSE;
  ciaSDORead(Enable :=xEnable, DataLength :=uiDataLength);ELSIFciaSDORead.ERROR<>CiA405.CANOPEN_KERNEL_ERROR.CANOPEN_KERNEL_NO_ERRORTHEN
  //Erroroccured
  xEnable :=FALSE;
  ciaSDORead(Enable :=xEnable, DataLength :=uiDataLength);END_IFxLastEnable :=xEnable;
Grüße
Edwin
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
VAR  ciaSDOWrite4:CiA405.SDO_WRITE4;  usiNetwork  :USINT     :=1;     //NetId=0<=>Network=NetId+1=1  xEnable    :BOOL;  udiTimeout  :UDINT     :=0;  Device    :CIA405.DEVICE:=1;    //Addresseddevice                       //range0…127                       //0meanslocaldevice                         wIndex    :WORD     :=16#1020;  bySubIndex  :BYTE     :=16#02;  aData     :ARRAY[0..3]OFBYTE:=[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,);IFciaSDOWrite4.CONFIRMTHEN  xEnable:=FALSE;  ciaSDOWrite4(Enable:=xEnable);ELSIFciaSDOWrite4.ERROR<>CiA405.CANOPEN_KERNEL_ERROR.CANOPEN_KERNEL_NO_ERRORTHEN  //Erroroccured  xEnable:=FALSE;  ciaSDOWrite4(Enable:=xEnable);END_IFxLastEnable:=xEnable;
Grüße
plcmax
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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;;;;;mitxEnablehighwirddannmeineSDO-Nachricht1-Malgesendet??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 devicewIndex:WORD:=16#1020;;;welcheWertemussichhierhinschreiben,umdieimBilddargestellteNachrichtzusenden??bySubIndex:BYTE:=16#02;aData:ARRAY[0..3]OFBYTE:=[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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
Hallo Wolfgang,
schau mal in die CAA CIA405 Library
und dann das Code Snippet:
Grüße
Edwin
Hallo Edwin,
Danke für die Anrwort, hat mir sehr geholfen.
Gruß
Wolfgang
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...
Welche Unterpunkte muss ich dann noch aktivieren?? Bzw. mit welchen Daten füttern??
Grüße
Hallo,
Beispiel:
Grüße
plcmax
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...
Um mein Problem bei der Anwendung nochmals kurz zu konkretisieren
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
Hi,
ich denke du willst NMT Reset Communication ausführen?
Dann den NMT FB verwenden.
Grüße
Edwin
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
Hallo,
ich habe das Problem nun in den Griff bekommen...
Die Beschreibung für "Network" lautet:
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...