CODESYS - das IEC 61131-3 Programmiersystem

Willkommen im offiziellen CODESYS - Forum von 3S-Smart Software Solutions | A member of the CODESYS Group
Deutsche Version English version russian version 
Aktuelle Zeit: Mi Jul 17, 2019 4:38 pm

Alle Zeiten sind UTC




Ein neues Thema erstellen  Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: CANOpen - SDO's schreiben
BeitragVerfasst: Mo Apr 20, 2015 7:59 am 
Offline

Registriert: Mi Feb 25, 2015 7:59 am
Beiträge: 7
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


Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Mo Apr 20, 2015 4:52 pm 
Offline
Site Admin

Registriert: Mo Sep 05, 2005 8:42 am
Beiträge: 3348
Hallo Wolfgang,

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

Code:
        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


Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Mo Apr 27, 2015 5:36 am 
Offline

Registriert: Mi Feb 25, 2015 7:59 am
Beiträge: 7
Hallo Edwin,

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

Gruß
Wolfgang


Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Fr Nov 04, 2016 11:00 am 
Offline

Registriert: Do Jun 16, 2016 1:57 pm
Beiträge: 21
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...

Code:

   ciaSDOWrite : CIA405.SDO_WRITE;

ciaSDOWrite.????



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

Grüße


Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: So Nov 06, 2016 2:38 pm 
Offline

Registriert: Fr Feb 07, 2014 6:21 am
Beiträge: 86
Hallo,

Beispiel:
Code:
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

Code:
(*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


Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Mo Jan 23, 2017 2:33 pm 
Offline

Registriert: Do Jun 16, 2016 1:57 pm
Beiträge: 21
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...


Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Mo Jan 23, 2017 3:00 pm 
Offline

Registriert: Do Jun 16, 2016 1:57 pm
Beiträge: 21
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


Dateianhänge:
Dateikommentar: Diesen SDO-Befehl möchte ich schicken
ResetCommunication.JPG
ResetCommunication.JPG [ 25.61 KiB | 2543 mal betrachtet ]
Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Mo Jan 23, 2017 6:18 pm 
Offline
Site Admin

Registriert: Mo Sep 05, 2005 8:42 am
Beiträge: 3348
Hi,

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

Grüße
Edwin


Dateianhänge:
NMTReset.jpg
NMTReset.jpg [ 223.17 KiB | 2535 mal betrachtet ]
Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Di Jan 24, 2017 11:52 am 
Offline

Registriert: Do Jun 16, 2016 1:57 pm
Beiträge: 21
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


Dateianhänge:
Dateikommentar: Funktion NMT aus der CiA405
NMT.JPG
NMT.JPG [ 82.35 KiB | 2524 mal betrachtet ]
Nach oben
   
 Betreff des Beitrags: Re: CANOpen - SDO's schreiben
BeitragVerfasst: Di Jan 24, 2017 2:42 pm 
Offline

Registriert: Do Jun 16, 2016 1:57 pm
Beiträge: 21
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...


Dateianhänge:
Dateikommentar: EtherCAT Master NetID
EtherCAT_Master_NetID.JPG
EtherCAT_Master_NetID.JPG [ 23.45 KiB | 2521 mal betrachtet ]
Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de