TwinCAT CoE: Schreiben an Slave Data Object

DK999

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute!
Ich bin noch ziemlich neu im EtherCAT/CANopen Universum und versuche momentan, einen selbst geschriebenen Slave über eine Beckhoff CX5120 SPS an zu sprechen.
Mein Slave Device durchläuft den Conformance Test von Beckhoff und kann mit PySOEM mit dem PC verbunden auch beschrieben/gelesen werden.
Jetzt habe ich ein kleines XAE Projekt im Visual Studio aufgesetzt, das ESI File ins TwinCAT-Verzeichnis kopiert (C:\TwinCAT\3.1\Config\Io\EtherCAT), als Ziel die SPS ausgewählt und konnte CX5120 und meinen Slave finden / das Object Dictionary auslesen.
LovOa.png
MhxkA.png

Mit einem kleinen SPS Structured Text Programm versuche ich nun an die Adresse 0x607A einen Wert zu schreiben und nutze dafür die FB_EcCoESdoWrite Funktion. Während der Aktivierung bekomme ich eine Meldung, dass die CX5120 einen Sync Master benötigt. Wenn ich mich mit dem Gerät verbinde und die Funktion ausführen lasse, bekomme ich von ihr ebenfalls einen Fehler zurück (bError wird TRUE).
Soweit ich mich eingelesen habe, muss ich eine Variable aus meinem ST Programm mit einer Variable aus meinem Slave oder CX5120 linken, damit der Sync Manager zugewiesen ist.
Nur scheine ich keine Variablen zu benötigen, da der Funktionsaufruf doch die Pakete versenden/empfangen sollte?
Was habe ich bei der Konfiguration/Programmierung übersehen?
Gibt es irgendwo ein Minimal-Beispiel, wie man in einem Projekt mit SDOs kommuniziert?
Code:
PROGRAM MAIN
VAR
    heartbeat         : UINT;    
    fbSdoWrite      : FB_EcCoESdoWrite;
    sNetId          : T_AmsNetId := '5.76.204.148.2.1'; (* NetId of EtherCAT Master *)
    nSlaveAddr      : UINT := 1001; (* Port Number of EtherCAT Slave *)
    nIndex          : WORD := 16#607A; (* CoE Object Index *)
    nSubIndex       : BYTE := 0; (* Subindex of CoE Object *)
    nValue          : UINT := 16#AAAA; (* variable to be written to the CoE Object *)
    bExecute                : BOOL; (* rising edge starts writing to the CoE Object *)
    bError          : BOOL;
    nErrId          : UDINT;
END_VAR

fbSdoWrite(
        sNetId          := sNetId,
        nSlaveAddr      := nSlaveAddr,
        nIndex          := nIndex,
        nSubIndex       := nSubIndex,
        pSrcBuf         := ADR(nValue),
        cbBufLen        := SIZEOF(nValue),
        bExecute        := bExecute
);


IF NOT fbSdoWrite.bBusy THEN
        bExecute := FALSE;
        IF NOT bError THEN 
                (* write successful *)
                bError := FALSE;
                nErrId := 0;
        ELSE 
                (* write failed *)
                bError := fbSdoWrite.bError;
                nErrId := fbSdoWrite.nErrId;
        END_IF

        fbSdoWrite(bExecute := FALSE);
END_IF
 
Zuletzt bearbeitet:
Probiere doch mal als erstes die korrekte AmsNetID (die vom Master = 6.1 wie es aus deinem Screenshot hervorgeht).

Guga
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Probiere doch mal als erstes die korrekte AmsNetID (die vom Master = 6.1 wie es aus deinem Screenshot hervorgeht).

Ups, war Code und Screenshot nicht konsistent.
Die IP stammt aus einem Umsteckversuch, die im Code war zur Ausführung richtig.
Bekomme den Fehlercode 1805 als Error-ID von der Funktion zurück. IP und Slave Address stimmen soweit.
 
AmsNetID im Code: 5.76.204.148.1.1

die letzte zwei Ziffern .1.1 bedeuten eigentlich das es "das Gerät" ist. Du brauchst aber eine Komponente des Gerätes.
Hier wird dann vom System durchnummeriert z.B. 2.1 oder 3.1....

Ich glaube deshalb nicht an die 1.1

Ansonsten noch: Mach mal nen Dopppelclick auf das Objekt 0x607A im CoE-Online Tab.. Ich vermute das es 32 Bit sind und nicht 16 (UINT).
 
Es ist im aktuellen Aufbau die 2.1.
Du hast recht, es ist anscheinend ein LWORD(64Bit).
Damit konnte ich den Wert nun auch setzen!
Danke dir :)
 
Zurück
Oben