Probleme mit ADS

fontsix

Level-1
Beiträge
20
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich habe wieder mal ein paar Probleme mit den Beckhoff Komponenten

Momentan sind folgende Komponenten verbaut

  • CX9010 mit TwinCAT PLC Runtime
  • CANopen Master EL6751
An dem Bus hängen 2 Geräte, ein Drehgeber und ein Lichtgitter von denen ich gerne per ADS die Gerätenamen auslesen möchte.

Im System Manager sind alle Geräte vorhanden und es ist auch möglich per ADS Online Zugriff im Systemmanager Daten zu lesen.

Nun hab ich mit der PLC Control ein kleines Programm geschrieben um per SDO Read den Gerätenamen auszulesen.


Code:
PROGRAM MAIN
VAR
    Read_Data : STRING;
    ReadSdo : FB_EcCoESdoRead;
END_VAR

Code:
IF ReadSdo.bBusy = FALSE THEN
ReadSdo(bExecute := TRUE);

ELSE
ReadSdo(
    sNetId := '5.16.31.202.5.1',    (* AMS-NET ID vom Master *)
    nSlaveAddr :=16#1002 ,        (* EtherCAT-Adresse vom Slave      PORT ???? *)

    nIndex := 16#1008,                (* Index im Objektverzeichnis der ausgelesen werden soll  DEVICE NAME*)
    nSubIndex := 0,                (* Subindex im Objektverzeichnis *)

    pDstBuf :=ADR(Read_Data),
    cbBufLen := 7,                (* Anzahl an Bytes des Index *)

    bExecute := FALSE,
    tTimeout := T#500ms,
    );
END_IF

bei der nSlaveAddr bin ich mir allerdings nicht ganz sicher ob die Adresse des Gerätes stimmt, vielleicht weiß jemand wo ich diese Adresse des Gerätes finden kann.

Logge ich mich auf der Steuerung ein und Starte das Programm erhalte ich auf der nErrId des Funktionsbausteines FB_EcCoESdoRead immer einen Wert, zuerst war es eine 0x6 was auf einen fehlerhaften Target Port hinweist und nun erhalte ich nur noch Werte die in der Fehlerbeschreibung nicht mehr beschrieben sind.

Zudem erhalte ich im System Manager immer eine Meldung das der CANopen Master, also meine EL6751, eine Verknüpfung zu einer Task braucht, ich glaube da stand etwas mit Sync Unit.


Ich hoffe die Infos reichen erstmal fürs Erste, ansonsten würde ich noch ein paar Screenshots hochladen.

Wäre toll wenn mir jemand behilflich sein könnte.
 
Hab leider immernoch Probleme irgendwelche Werte mit der SPS aus dem Knoten zu lesen. Wie gesagt, an der SPS hängt die CANopen Masterklemme (EL6751) und 2 Geräte von denen ich Daten lesen möchte.

Nun habe ich folgende Codezeilen in dem Handbuch der EL6751 gefunden ...


Code:
[FONT=Courier New]SDO_READ(
        StartReading :=  ReadStart,
        CO_Index := 16#1000,
        CO_SubIndex :=  16#0,
        DataLength := 4,
        PortNr := 16#1001,
         ADSNetID:='192.168.10.11.2.1'
        );
IF SDO_READ.ReadDataAvailable  THEN
        ReadStart := FALSE;
        ReadError :=  SDO_READ.Error;
        ReadData := SDO_READ.ReadData;
END_IF[/FONT]

Code:
[FONT=Courier New]FUNCTION_BLOCK SDO_READ
VAR_INPUT
     ADSNetID:STRING(23); (* The AMSNetID addresses the EL6751. Can be empty if only  one local single channel card is present*)
    PortNr:WORD;         (* This  Port No. addresses the CANopen Node (see System Manager) *)
     CO_Index:DWORD;      (* This is the Index of the CANopen Object Dictionary  Entry*)
    CO_SubIndex:DWORD;   (* This is the Sub-Index of the CANopen  Object Dictionary Entry*)
    DataLength:DWORD;    (* This is the Length of  the CANopen Object Dictionary Entry*)
    StartReading:BOOL;   (* only reset  to FALSE after ReadDataAvailable=TRUE*)
END_VAR
VAR_OUTPUT
     ReadData:ARRAY[0..255] OF BYTE;
    ReadDataAvailable:BOOL;
     Error:DWORD;
END_VAR
VAR
    state:BYTE := 0;
     ADSREAD:ADSREAD;
END_VAR[/FONT]

Code:
[FONT=Courier New]CASE state OF
    0:
        IF StartReading  THEN
            ReadDataAvailable := FALSE;
            Error :=  0;
            ADSRead(
                NETID:=  ADSNetID,
                PORT:= PortNr,
                IDXGRP:=  CO_Index,
                IDXOFFS:= CO_SubIndex,
                LEN:=  DataLength,
                DESTADDR:= ADR(ReadData),
                 READ:= TRUE,
                TMOUT := T#1s
                 );
            IF ADSRead.err THEN
                state :=  2;
                ReadDataAvailable := TRUE;
                Error :=  ADSRead.ErrId;
            ELSE
                state := 1;
             END_IF
        ELSE
            ADSRead(
                NETID:=  ADSNetID,
                PORT:= PortNr,
                IDXGRP:=  CO_Index,
                IDXOFFS:= CO_SubIndex,
                LEN:=  DataLength,
                DESTADDR:= ADR(ReadData),
                 READ:= FALSE,
                TMOUT := T#1s
            );
         END_IF
    1:
        ADSRead(READ:= FALSE);
        IF ADSRead.err  THEN
            state := 2;
            ReadDataAvailable :=  TRUE;
            Error := ADSRead.ErrId;
        ELSE
            IF  NOT ADSRead.busy THEN
                state := 2;
                 ReadDataAvailable := TRUE;
            END_IF
        END_IF
     2:
        ADSRead(READ:= FALSE);
        state := 0;
END_CASE[/FONT]


Dieser Code scheint so aber nicht lauffähig zu sein. Beim Übersetzen bekomme ich die Fehlermeldungen

Fehler 4051: MAIN(1): 'SDO_READ' ist keine Funktion
Fehler 4051: MAIN(12): 'SDO_READ' ist keine Funktion
Fehler 4051: MAIN(13): 'SDO_READ' ist keine Funktion
Fehler 4250: MAIN(14): Kein korrekter Anfang für eine 'ST' Anweisung


Warum wird ein neuer Funktionsbaustein SDO_READ erstellt, wo es doch schon so viele fertige Funktionsbausteine für ADS-Funktionen in den Bibliotheken gibt ? Oder sehe ich das falsch ?

Kann ich nicht einfach einen fertigen Funktionsbaustein benutzen und den gelesen Wert in einer Variablen abspeichern ? Das war eigentlich mein Grundgedanke.

Ich hatte anfangs an den Baustein FB_EcCoESdoRead aus der TcEtherCAT.lib gedacht, denn schließlich setzt doch die CANopen Masterklemme wieder auf den E-Bus,also EtherCAT um.


Hoffe das ist nicht zu viel Input und jemand nimmt sich diesen Problems an. Finde leider kaum gut erklärte Beispiele :(


Freundliche Grüße
fontsix
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

schau im system manager die terminal an, dahr bekommt menige tabs, wie "General", "EtherCAT", "Process data" etc...
Auf die "EtherCAT" tab habe sie eine field : "EtherCAT Addr" standard 100x .... das ist die nSlaveAddr.

nSubIndex und nIndex sind hex in the manual of COE , eine fehle das ich auch schön gemacht habe :cool:

Die andere fehle sind das sie eine FB gemacht habe und in ihre program benutze sie nich einer instanz...

Code:
sdoRead : SDO_READ;

[FONT=Courier New]sdoRead(       
  StartReading :=  ReadStart,         
CO_Index := 16#1000,         
CO_SubIndex :=  16#0,         
DataLength := 4,         
PortNr := 16#1001,          
ADSNetID:='192.168.10.11.2.1'         
); 

IF [/FONT][FONT=Courier New]sdoRead[/FONT][FONT=Courier New].ReadDataAvailable  THEN         
ReadStart := FALSE;         
ReadError :=  [/FONT][FONT=Courier New]sdoRead[/FONT][FONT=Courier New].Error;         
ReadData := [/FONT][FONT=Courier New]sdoRead[/FONT][FONT=Courier New].ReadData; 
END_IF[/FONT]

gruss,
Peter
 
Zurück
Oben