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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: ADS-Protokoll: Fragen zum Daten-Frame

  1. #1
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich sende ein ADS-Packet an einen PC mit TwinCat drauf. Das Packet wird mit Python zusammengebastelt. Ich öffne einen Socket , um dann Daten zu senden. Die bestehen aus der Spec von Beckhoff. Daher baue ich zuerst einen AMS-Header zusammen, um dann 0 Daten anzuhängen. Das reicht für Kommando 1 aus (Read Device Info). Was mir aber fehlt, ist, dass ich eine AMS-Source-Adresse und einen AMS-Source-Port angeben muss. Weil ich das von Python machen will, gibt es das natürlich nicht. Es kommt auch nichts zurück.

    Kann da jemand helfen?
    Zitieren Zitieren ADS-Protokoll: Fragen zum Daten-Frame  

  2. #2
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard

    Weil ich das von Python machen will, gibt es das natürlich nicht
    du musst dir in deinem System eine AMS-Net ID und einen AMS-Port selber festlegen bzw. definieren, und dann die ID und den Port im ADS-Frame als Source Port und ID eintragen.

    als Port wird standardmäßig 801 dezimal verwendet und als Net-ID, deine IP-Adresse + 1.1

    Für diese ausgedachte Net-ID musst du dann am Beckhoff System manuell eine ADS-Route anlegen - solange die Route nicht existiert, wird das Beckhoff-System nie was zurückschicken !

  3. #3
    Registriert seit
    19.10.2009
    Beiträge
    194
    Danke
    8
    Erhielt 50 Danke für 44 Beiträge

    Standard

    Als AmsSenderNetID sollte die IP-Adresse erweitert um .1.1 tun. Wenn nichts zurückkommt, dann ist evtl. auf dem Python-Rechner der TCP-Port 0xBF02 durch Firewall blockert. Vielleicht muss man auch für das Python-System auf dem Steuerungsrechner eine AMS-Route eintragen, ich würde aber zunächst mal ohne Route probieren mit AmsSenderNetID = IpAdresse + ".1.1" Vielleicht mal vorher auf dem Steuerungsrechner schauen, ob es bereits eine Route mit dieser AmsNetId gibt.
    Als Ams Sender Port kann nach meiner Meinung eine beliebige positive Zahl verwendet werden, z.B. die Socket-ID.

  4. #4
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard

    dann ist evtl. auf dem Python-Rechner der TCP-Port 0xBF02 durch Firewall blockert
    der Port 0xBF02 bzw. 48898 dez. ist der "Listen" bzw. TCP-Server-Port des Beckhoff-Rechners. Am Python Rechner kann und wird vermutlich als Client-Port ein anderer Port verwendet.
    Wenn die Socket-Verbindung zustande kommt - das schreibt er ja - dann kann man das "Firewall"-Problem ausschliessen.

    Wie bereits im vorigen Post beschrieben, muss auf jeden Fall am Beckhoff-System eine ADS-Route hinterlegt sein - sonst geht gar nichts.
    Weiterhin besteht der ADS-Frame ja aus 38 Byte (6 Byte TCP-Header und 32 Byte AMS-Header) - die wollen erst mal richtig zusammengebaut sein.
    Auch die Byte-Reihenfolge (Little-Endian, Big-Endian) muss bedacht sein, sonst versteht das Beckhoff System die Anfrage u.U. auch nicht.

    Das Twincat-System sollte natürlich auch gestartet sein. Im Config-Mode wird das System vermutlich auch nicht antworten.

  5. #5
    Registriert seit
    27.11.2009
    Ort
    BW - Ecke Ulm
    Beiträge
    439
    Danke
    139
    Erhielt 36 Danke für 33 Beiträge

    Standard

    Hi,

    ich bastle auch gerade mit dem ADS Protokoll rum. Allerdings in C. Was ja aber nichts weiter zur Sache tut.

    Wie uncle_tom richtig sagt muss das Packet korrekt zusammengestöpselt werden.
    Ich habe zuerst versucht mit tcpdump zu überprüfen was bei mir auf der Leitung los ist. Leider war ich da etwas zu blöd zu, weil ich immer nur die Header-Daten sah, nicht aber den eigentlichen Inhalt.
    Daher habe ich mir dann Wireshark geholt. Die beste Entscheidung seit dem "Projekt".

    Wireshark hat nen AMS-Parser drinne mit dem man schön sieht, was raus an die SPS geht.
    Die aktuelle hat zwar nen Bug drinne (malformed packet) aber das sollte für die weitere Entwicklung erst mal unwichtig sein.

    Bisher hatte ich genau die von uncle_tom beschriebenen Fehler im Frame, hier und da ein little/big endian Dreher, durch Byte Padding in der Header-Strucktur ein Offset mit Null-Bytes, ....
    Ohne "Debugger" in dem Fall Wireshark oder tcpdump (oder ....) stehst das schnell im Wald.

    Hoffe das hilft dir weiter und ich muss nun auch schauen wie ich meinen Rechner (Macbook) in den ADS-Router vom CX eingetragen bekomme.
    Hat dazu evtl. jemand nen Tip?

    Gruß ohm200x
    --
    ohm200x

  6. Folgender Benutzer sagt Danke zu ohm200x für den nützlichen Beitrag:

    drfunfrock (11.05.2012)

  7. #6
    Registriert seit
    07.06.2006
    Ort
    Bayern
    Beiträge
    623
    Danke
    27
    Erhielt 156 Danke für 139 Beiträge

    Standard

    Hoffe das hilft dir weiter und ich muss nun auch schauen wie ich meinen Rechner (Macbook) in den ADS-Router vom CX eingetragen bekomme.
    Hat dazu evtl. jemand nen Tip?
    einfach manuell eine statische Route hinzufügen

    http://infosys.beckhoff.com/content/...g.htm?id=19363

    als Net-ID und IP-Adresse die Daten deines Macbooks eintragen.

    Bzgl. Protokoll Diagnose gibt es von Beckhoff auch noch ein Tool, damit kann man sich auch die ADS-Datenpackete anschauen:

    http://infosys.beckhoff.com/content/...e.htm?id=19146

  8. #7
    drfunfrock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    ich hab gerade herausgefunden, dass die Byteorder natürlich Intel ist, im gegensatz zu den adressen

  9. #8
    Registriert seit
    24.04.2008
    Ort
    Lübeck
    Beiträge
    324
    Danke
    8
    Erhielt 64 Danke für 62 Beiträge

    Standard

    Zitat Zitat von ohm200x Beitrag anzeigen
    Hoffe das hilft dir weiter und ich muss nun auch schauen wie ich meinen Rechner (Macbook) in den ADS-Router vom CX eingetragen bekomme.
    Hat dazu evtl. jemand nen Tip?
    Code:
    /// <summary>
    /// USE AT OWN RISK!! THIS IS NOT DOCUMENTED BY BECKHOFF AS FAR AS I KNOW
    /// You can use this to add a route on the remote target
    /// </summary>
    /// <param name="amsNetIdSource">The NetID from this device</param>
    /// <param name="ipTarget">The IP of the target device</param>
    /// <param name="routeName">Route name</param>
    /// <param name="address">IP or Hostname</param>
    /// <param name="username">Username (default Administrator)</param>
    /// <param name="passwd">password (default empty)</param>
    /// <returns></returns>
    public static void AddRoute(string amsNetIdSource, string ipTarget, string routeName, string address, string username="Administrator", string passwd="")
    {
        int port = 48899;
        AmsNetId netIdSource = new AmsNetId(amsNetIdSource);
        byte[] receivemsg = new byte[100];
        IEnumerable<byte> message = new List<byte>();
        message = message.Concat(new byte[] { 0x03, 0x66, 0x14, 0x71 });                        //No idea what it means
        message = message.Concat(new byte[] { 0x00, 0x00, 0x00, 0x00 });                        //No idea what it means
        message = message.Concat(new byte[] { 0x06, 0x00, 0x00, 0x00 });                        //No idea what it means
        message = message.Concat(netIdSource.Bytes);                                            //AmsNetIdSource
        message = message.Concat(new byte[] { 0x10, 0x27 });                                    //No idea what it means
        message = message.Concat(new byte[] { 0x05, 0x00, 0x00, 0x00 });                        //No idea what it means
        message = message.Concat(new byte[] { 0x0c, 0x00 });                                    //Routename tag?
        message = message.Concat(BitConverter.GetBytes((UInt16)(routeName.Length + 1)));        //Length routename + 1
        message = message.Concat(routeName.ToAdsBytes());                                       //Routename
        message = message.Concat(new byte[] { 0x07, 0x00 });                                    //AmsNetIdSource tag?
        message = message.Concat(BitConverter.GetBytes((UInt16)(netIdSource.Bytes.Count)));     //Length AmsNetId
        message = message.Concat(netIdSource.Bytes);                                            //AmsNetId
        message = message.Concat(new byte[] { 0x0d, 0x00 });                                    //Username tag?
        message = message.Concat(BitConverter.GetBytes((UInt16)(username.Length + 1)));         //Length username + 1
        message = message.Concat(username.ToAdsBytes());                                        //Username
        message = message.Concat(new byte[] { 0x02, 0x00 });                                    //Password tag?
        message = message.Concat(BitConverter.GetBytes((UInt16)(passwd.Length + 1)));           //Length password + 1
        message = message.Concat(passwd.ToAdsBytes());                                          //Password
        message = message.Concat(new byte[] { 0x05, 0x00 });                                    //Address tag?
        message = message.Concat(BitConverter.GetBytes((UInt16)(address.Length + 1)));          //Length Address + 1
        message = message.Concat(address.ToAdsBytes());                                         //Address
        byte[] sendmsg = message.ToArray<byte>();
    
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        //socket.Bind(new IPEndPoint(IPAddress.Any, port));
        socket.Connect(ipTarget, port);
        socket.Send(sendmsg);
        socket.Receive(receivemsg);
        socket.Shutdown(SocketShutdown.Both);
        socket.Close();
    
        uint error = BitConverter.ToUInt32(receivemsg, 28);
        if (error > 0) throw new AdsException(error);
    }
    Hier nur als Hinweis aufgeführt. Gebt mal bitte Rückmeldung wie es funktioniert.

    Quelle: http://adsclient.codeplex.com
    Geändert von Neals (11.05.2012 um 12:47 Uhr)

  10. #9
    drfunfrock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Ich bekomme jetzt auch Antworten und kann die auch interpretieren. Python ist recht schön dafür geeignet, weil man wirklich wenig Code zu schreiben braucht. Da sind dann Checks der AMSID im ASCII-Format nur eine Formalität.

    Mein Plan ist es ein Framework zu schreiben, dass es ermöglicht, Web-Frameworks wie web2py oder Django zu füttern.

  11. #10
    Registriert seit
    27.11.2009
    Ort
    BW - Ecke Ulm
    Beiträge
    439
    Danke
    139
    Erhielt 36 Danke für 33 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    klingt gut. Bin allerdings ein völliger NOOB in python. Wüsste jetzt erst mal gar nicht wie ich ne Message zusammenkleben würde.
    Hab bei nem Kollegen zwar mal bissel über die Schulter geschaut aber das war zu kurz.

    Mal schauen, wie es die Zeit zu lässt. Wenn ich mal in C meine ersten Antworten bekommen habe, also die Kommunikation mal "bewiesen" ist kann ich ja das "Framework" beliebig wechseln.
    Möchte auch quasi ne Visu oder Steuermöglichkeit zusammenklickern. Da sind script-sprachen, wie python eigentlich geschickter für.
    Bzw. machst einfacher wie jedes mal den Compiler anzuwerfen

    Jetzt kommt aber erst mal eine Woche Urlaub.

    Gruß ohm200x

    P.S: Das Beckhoff in ADS die intel Byte-Order wählt war fast zu vermuten, wo ja TWinCat für Total WINDOZE Integration oder sowas steht.
    Das man allerdings wenn man schon ein Netzwerk-Protokoll entwickelt, und noch wiederum auf TCP aufsetzt dann hätte man auch die Netzwerk-Byte-Order nehmen können. Wäre durchgängiger.
    --
    ohm200x

Ähnliche Themen

  1. ADS-protokoll in Python 2.7 implementieren
    Von drfunfrock im Forum CODESYS und IEC61131
    Antworten: 37
    Letzter Beitrag: 30.07.2015, 11:30
  2. Fragen zum DB
    Von SPS_Neuling im Forum Simatic
    Antworten: 22
    Letzter Beitrag: 11.10.2011, 19:37
  3. Offenes ADS Protokoll
    Von s.murauer im Forum CODESYS und IEC61131
    Antworten: 17
    Letzter Beitrag: 19.09.2011, 07:50
  4. ADS Protokoll in Visual Studio 08
    Von td97 im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 17.03.2009, 21:07
  5. Beckhoff ADS-Protokoll
    Von drfunfrock im Forum Feldbusse
    Antworten: 5
    Letzter Beitrag: 01.07.2005, 17:01

Lesezeichen

Berechtigungen

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