Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 3 von 3

Thema: Probleme mit ADS

  1. #1
    Registriert seit
    06.02.2012
    Beiträge
    20
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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.
    Zitieren Zitieren Probleme mit ADS  

  2. #2
    fontsix ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    06.02.2012
    Beiträge
    20
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

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

    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

  3. #3
    Registriert seit
    08.10.2011
    Ort
    Belgien
    Beiträge
    32
    Danke
    1
    Erhielt 4 Danke für 3 Beiträge

    Daumen hoch


    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

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

    Code:
    sdoRead : SDO_READ;
    
    sdoRead(       
      StartReading :=  ReadStart,         
    CO_Index := 16#1000,         
    CO_SubIndex :=  16#0,         
    DataLength := 4,         
    PortNr := 16#1001,          
    ADSNetID:='192.168.10.11.2.1'         
    ); 
    
    IF sdoRead.ReadDataAvailable  THEN         
    ReadStart := FALSE;         
    ReadError :=  sdoRead.Error;         
    ReadData := sdoRead.ReadData; 
    END_IF
    gruss,
    Peter

Ähnliche Themen

  1. Beckhoff BK mit BC verbinden mit ADS-Befehlen
    Von DiX im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 28.01.2012, 18:45
  2. Mit Elau per ADS kommunizieren
    Von mimuel im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 03.03.2011, 12:04
  3. ADS: SDO lesen über ads ocx von Visualisierung
    Von traveler im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 10.01.2011, 11:00
  4. Antworten: 1
    Letzter Beitrag: 25.01.2010, 15:57
  5. Per ADS einen Nicht-ADS-fähigen Server ansprechen!
    Von Superfly im Forum CODESYS und IEC61131
    Antworten: 16
    Letzter Beitrag: 14.05.2008, 17:10

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •