ADS-protokoll in Python 2.7 implementieren

Zuviel Werbung?
-> Hier kostenlos registrieren
Aber seltsam ist es schon das ein Python Script auf 2 (nicht Windows) Kisten nicht geht und auf einem (Windows) tut.
Wo nun mal TwinCat für "Total Windows Control and Automation Technology" steht.
Wenn ich mir z.B. das ADS Protokoll ansehe und du ja selbst meintest, komisch das sie für ihre längen die Intel-Byte-Order für hernehmen, anstatt konsequent die Netzwerk-Byte-Order frage ich mich schon ob Beckhoff selbst das schon mal fern der Windows Insel getestet hat.
Müssen sie ja an sich nicht. Ihre Systeme laufen ja durchweg auf Windows, sei es NT, 2000, ..... Win7 oder eben WinCE5.... .

Ich habe bereits funktionierende ADS Clients auf Debian und Ubuntu gesehen. Außerdem mehrfach ADS Client die auf Windows ohne TwinCAT funktionieren.
Hier ist eventuell eher die Frage ob sich die Socket-Implementierung auf Windows aquivalent zur Implementierung auf Mac oder Linux verhält? Bekanntlich ist der Socket ja vom Betriebssystem abhängig und dort gibt es kein Standard-Interface.

Auf weder meinem MacBook, noch der Linux-Büchse habe ich net ADS-Route eingetragen, kann ich ja auch nicht.
Läuft a) kein Windows drauf und daher b) kein ADS-Router.

Ich habe jedoch mein Macbook als ADS-Teilnehmer im ADS-Router des CX eingetragen.
Die Linux-Büchse heute früh noch nicht, werde ich im nächsten Schritt noch machen.

Das du lokal auf der Mac/Linux-System keien Route eintragen kannst ist klar. Aber auf dem TwinCAT-Zielsystem muss die Route vorhanden sein.

Aber unabhängig davon sollte ich auf dem ADS/AMS Logger / Viewer auf dem CX zumindest meinen Request als Paket eintrudeln sehen.
Dass der CX die Response dazu ggf. nicht los werden kann, weil er nicht weiß wohin sollte ein zweites Problem sein.
Oder sehe ich das falsch?

Wenn keine Route eingetragen ist, wird die TCP/IP-Verbindung abgelehnt und damit können die Requests auch nicht im ADS Logger zu sehen sein. Du siehst nur mit Wireshark/Ethereal den Aufbau einer TCP-Verbindung und das erste Command.

Dass drfunfrock's client geht scheint ja bewiesen zu sein. Sonst hätte er den Code (noch) nicht offengelegt.
Und bei mir geht's ja unter Windows auch. Da das ding in Python geschrieben ist, erwarte ich als Anwender erst mal keine Probleme, wenn ich das auf nem andern System ausführe. Zumal ja in Wireshark der ADS-Teil von beiden PCs aus identisch aus schaut.

Diese Aussage bestätigt nur, dass der Python Client auf Windows funktioniert. Das sagt aber nicht aus, dass der Client auf Mac, Linux oder sonstigen Systemen korrekt funktioniert und erst recht nicht ob du alles korrekt konfiguriert hast!

Wenn du Unterstüzung erhalten möchtest, solltest du vielleicht weniger bashen, als mehr Informationen liefern:

An den Logs von dir sieht man, dass direkt nach dem ersten Request die TCP-Connection vom Server Resettet wird.
Daher gehe ich davon aus, dass es ein Fehler in den Routen auf dem Zielsystem ist.
Hast du auch jedem System, bzw. bei jeder Route eine andere AMS Net ID verwendet?
Hast du die IP-Adresse und nicht den DNS-Namen für die Route eingetragen?
Wenn der ADS Router mehrere Routen mit gleicher AMS Net ID findet, kann er diese natürlich nicht eindeutig einer IP-Adresse zuordnen.
Du könntest ja mal deine Registry-Einträge auf dem Zielsystem posten...

Eigenartig finde ich auch, das bei mit der ADS-Interpreter von Wireshark zu deinen ADS Requests immer "Malformed Packet: AMS" ausgibt.
Außerdem sind die Frames bei Mac und Linux 104 Bytes lang, bei Windows ist der Frame nur 92 Bytes lang.

ADS Requests:
0000200000000 50778ca0101 2103 0aff020f0101 2103 01000400000000000000000001000000 Windows
0000200000000 50778ca0101 2103 c0a8b21b0101 2103 01000400000000000000000001000000 Mac
0000200000000 50778ca0101 2103 c0a8b21b0101 2103 01000400000000000000000001000000 Linux

Daran sehe ich doch schon, das die AMS Net ID von Mac und Linux gleich ist..... also kann es garnicht funktionieren.
 
Zuletzt bearbeitet:
Ich habe bereits funktionierende ADS Clients auf Debian und Ubuntu gesehen. Außerdem mehrfach ADS Client die auf Windows ohne TwinCAT funktionieren.

Gut, dann besteht ja die Chance das ich es doch noch hin bekomme.
Habe im Netz auch schon davon gelesen, auch schon den Source-Code dazu runter geladen, Stichwörter: Zottel oder gass und PLCtalk.
Ich hatte bisher das Zeug noch nicht übersetzt, da ich mich mal selbst an Socket-Programmiereung austoben wollte, bzw. dann mit dem Python Client von drfunfrock als funktionierenden Plan B prüfen wollte was bei mir schief läuft

Hier ist eventuell eher die Frage ob sich die Socket-Implementierung auf Windows aquivalent zur Implementierung auf Mac oder Linux verhält? Bekanntlich ist der Socket ja vom Betriebssystem abhängig und dort gibt es kein Standard-Interface.

Das war mir bisher in der Tragweite nicht bekannt.
Allerdings, widersprichst du dier hiermit ein Stück weit selbst.
Es soll ADS-Clients für Debian / Ubuntu geben (read: es gibt ADS-Clients ....), aber hier bei mir daheim soll der Ubuntu-Socket schuld sein das es nicht geht.

Das du lokal auf der Mac/Linux-System keien Route eintragen kannst ist klar. Aber auf dem TwinCAT-Zielsystem muss die Route vorhanden sein.

ACK. Im Falle vom Mac habe ich das von Anfang an getan und in meinen gestrigen Versuchen für den Linux-PC ja auch.

Wenn keine Route eingetragen ist, wird die TCP/IP-Verbindung abgelehnt und damit können die Requests auch nicht im ADS Logger zu sehen sein. Du siehst nur mit Wireshark/Ethereal den Aufbau einer TCP-Verbindung und das erste Command.

ACK.

Diese Aussage bestätigt nur, dass der Python Client auf Windows funktioniert. Das sagt aber nicht aus, dass der Client auf Mac, Linux oder sonstigen Systemen korrekt funktioniert und erst recht nicht ob du alles korrekt konfiguriert hast!

OK, bin nun mal davon ausgegangen, das wenn ein Python Script (was ja weitgehend Platformunabhängig ist (sein soll)) auf Rechner A geht, es auf Rechner B auch tut.
Ich habe den python Client absichtlich her genommen um zu sehen warum mein C-Client nicht tut.
Da sich aufm Mac beide gleich verhalten, der Beweis, dass das Python Teil ja aber zumindest unter Windows geht, erbracht ist muss es wie du ja auch sagst entweder der Bereich Socken / TCP-Stack unter der Haube sein, oder die Konfiguration.

Wenn du Unterstüzung erhalten möchtest, solltest du vielleicht weniger bashen, als mehr Informationen liefern:

Tut mir Leid wenn ich ein manchen Stellen etwas zu laut gedacht habe. Allerdings verstehe ich nicht ganz was du meinst. (Lass mal die Aussage wegen Beckhoff und intel Byte Order außen vor)

Sonst habe ich denke ich nach und nach einige Infos geliefert. Anfangs war dieser Thread ja auch eher ein Chat zwischen drfunfrock und mir (plus zwei PNs dazwischen).

Zudem was für Infos fehlen? Viele Fragezeichen gibt es in dem Thread von anderen usern nicht.

Ich habe mit meinen Versuchen auf verschiedenen Rechnern und diversen Traces ja selbst erst mal versucht zu verstehen oder einzukreisen wo der Fehler liegen könnte. Mein ADS-Request von meinem C-Client sah nach kurzer Zeit aus wie in der Spec resp. wie das was drfunfrocks Client so raus schickt.

An den Logs von dir sieht man, dass direkt nach dem ersten Request die TCP-Connection vom Server Resettet wird.
Daher gehe ich davon aus, dass es ein Fehler in den Routen auf dem Zielsystem ist.

OK, das ist ne Aussage. Frage, was kann man groß Falsch machen?
Fassen wir nochmal zusammen:
CX90xx im Keller: CE5xx IP 192.168.178.210 AMS ID 5.7.120.202.1.1
Macbook: OS X 10.7.3 IP 192.168.178.26 AMS ID 192.168.178.26.1.1
Virtual Box Win XP (Netzwerk gebrückt) IP 192.168.178.232 AMS ID 192.168.178.232.1.1
Linux: Ubuntu xxx IP 192.168.178.27 AMS ID 192.168.178.27.1.1

Wenn ich es recht verstanden habe muss ich also alle Clients dem CX ADS Router bekannt machen.
Die Clienst selbst wissen von ADS Routen nichts, Windows kann / muss aber nicht oder?

Hast du auch jedem System, bzw. bei jeder Route eine andere AMS Net ID verwendet?
Hast du die IP-Adresse und nicht den DNS-Namen für die Route eingetragen?

- ACK
- ACK

Wenn der ADS Router mehrere Routen mit gleicher AMS Net ID findet, kann er diese natürlich nicht eindeutig einer IP-Adresse zuordnen.
Du könntest ja mal deine Registry-Einträge auf dem Zielsystem posten...

ads_route_linux.pngads_route_mac.png

Eigenartig finde ich auch, das bei mit der ADS-Interpreter von Wireshark zu deinen ADS Requests immer "Malformed Packet: AMS" ausgibt.

Das ist "normal". Zumal wie er das wie du selbst schreibst _immer_ macht. Ist ein Bug in Wireshark. Habe ich hier im Forum aber auch geschrieben:
https://www.sps-forum.de/showthread.php/52984-ADS-Protokoll-Fragen-zum-Daten-Frame Post 5.
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6710

Außerdem sind die Frames bei Mac und Linux 104 Bytes lang, bei Windows ist der Frame nur 92 Bytes lang.

<Sarkasmus>Nicht, dass ich das selbst nicht schon bemerkt hätte.</Sarkasmus>
Evtl. habe ich das hier nicht erwähnt sondern ging nur per PN an drfunfrock. Wir waren uns dabei aber eigentlich einig, dass solange das ADS-Paket OK ist der Rest vom TCP-Paket zweitrangig sein sollte.
Habe ich doch aber gestern Nacht auch noch selbst (nach langem im Nebel stochern) entschlüsselt bekommen und hier geschrieben.
Liegt an RFC1323. Hab ich aber sowohl am Mac und am Linux-PC deaktiviert und brachte auch nichts neues.

ADS Requests:
0000200000000 50778ca0101 2103 0aff020f0101 2103 01000400000000000000000001000000 Windows
0000200000000 50778ca0101 2103 c0a8b21b0101 2103 01000400000000000000000001000000 Mac
0000200000000 50778ca0101 2103 c0a8b21b0101 2103 01000400000000000000000001000000 Linux

Daran sehe ich doch schon, das die AMS Net ID von Mac und Linux gleich ist..... also kann es garnicht funktionieren.

Stichwort Copy und Paste Error. Mehr sage ich dazu nicht.

Danke für die Hinweise. Wenn ich noch was am CX so hinbiegen kann, dass er meine Mac mag bin ich offen für Ideen.

Gruß ohm200x
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

neues von der Front der Basher (von mir), damit der Thread nicht so offen endet.

Der letzte Stromausfall war hilfreich. Wie es scheint muss man den CX neustarten, damit die ADS Routen übernommen werden.
<bash>Wie blöd ist das den bei einer 24/7-Anlage?</bash>
Kann das jemand bestätigen?

Jedenfalls kann ich nun mit dem Python client von drfrunfrock von Linux aus auf meinen CX zugreifen.
Vom Mac aus geht's noch nicht so recht aber das sei mal das kleinere Problem. Das Target-System für meine Anwendung ist später Linux.

Jetzt muss ich dann nur noch ADS weiter studieren um an die richtigen Werte zu wie Idx-Group und Offset zu kommen und zu verstehen was ich damit alles anstellen kann.

Nochmals danke an drfunfrock für seinen Client.

Gruß ohm200x
 
Moin,

Jetzt muss ich dann nur noch ADS weiter studieren um an die richtigen Werte zu wie Idx-Group und Offset zu kommen und zu verstehen was ich damit alles anstellen kann.

Nochmals danke an drfunfrock für seinen Client.

Gruß ohm200x


Hol dir die Dokus zu ADS und TwinCat. Die IDX ist festgelegt nach Variablenart und der Offset einfach den den du selbst festlegst.

Ich hab den Client weiterentwickelt, aber der bleibt zu, bis es vielleicht mal mehr Beteiligung gibt.
 
Zuletzt bearbeitet:
So, dann krame ich den alten Thread mal raus - um mich zu bedanken. Bei drfunrock und ohm200x für die geleistete Arbeit. Ich finde es super, wie ihr die ADS via Python-Anstrengungen hier offen diskutiert und dokumentiert habt, anstatt mangels weiterer Interessenten einfach unter euch zu bleiben! Weil ich sonst vermutlich nicht ansatzweise die Chance hätte, mein kleines Projekt hier weiterzuführen.

Noch kann ich nichts Konkretes zum eigentlichen Thema beisteuern, weil ich den Punkt ADS - mit obiger Grundlage - jetzt erst angehe. Aber vielleicht ist das, was ich vorhabe, ja auch für andere interessant. Ich versuche also mal einen Überblick über den Plan und die schon gelösten Punkte zu geben.

Ich habe im Keller - welch Überraschung - eine CX fürs Eigenheim. Und einen Wechselrichter von SMA, dessen Leistung ich gerne in der Küche anzeigen möchte. Dafür gibt es zwar Produkte von SMA, aber die sind mir zu speziell. Zumal ich es sexy fände, auch die aktuell gemessene Leistung des Zweirichtungszählers mit anzuzeigen (also die tatsächlich noch verfügbare Kapazität).

Hier (http://www.photovoltaikforum.com/datenlogger-f5/pv-monitoring-mit-einem-kindle-t92498.html) wird berichtet, wie ein Amazon Kindle für die Visu genutzt wird, zusammen mit einem separaten kleinen Linux-Server im Netz, etwa so:

Wechselrichter -> Ethernet -> Linux-Server (Vorverarbeitung) -> Kindle

Die Grundidee stammt von Matthew Petroff, der auf die Art die Wettervorhersage visualisiert hat (http://www.mpetroff.net/archives/2012/09/14/kindle-weather-display/). Er nutzt ein SVG mit Platzhaltern, die skriptbasiert (Python) durch die tatsächlichen Werte der Vorhersage ersetzt werden. Da das Kindle keine SVGs anzeigen kann, konvertiert er es in PNG und holt das dann aufs Kindle. Sieht sehr schick aus, wie ich finde.

Bei mir soll die Informationskette so ausschauen:


Wechselrichter -> Ethernet ---+
+-> SPS -> Kindle
Stromzähler -> Infrarot
/RS485-+

Also:
- ohne zusätzlichen Linux-Server, die Vorverarbeitung soll direkt auf dem Kindle laufen (erledigt)
- mit Abfrage des Stromzählers durch die Beckhoff (offen, Infos zu Bastelhardware und Protokoll liegen vor)
- Abfrage der Werte von der CX aus Python heraus (offen)

Den letzten Punkt habe ich mir gerade vorgenommen und bin in dem Zuge auf eure Diskussion hier gestoßen. Von Python habe ich noch keine Erfahrung, es wird also wohl etwas dauern, bis ich Erfolge vermelden kann. Aber mit eurer Vorarbeit scheint eine Lösung zumindest machbar. Ich halte euch auf dem Laufenden, falls es euch interessiert.

Grüße,
mattsches
 
Ich nutze mal den Thread um ein bischen Webung für meine ADS Bibliothek für machen. Im Gegensatz zu der hier gezeigten Implementierung steht sie unter der LGPL. Download hier: https://github.com/simonwaid/adshli

Ich war vor einiger Zeit auf der Suche nach etwas um meine Python GUI mit der Twincat SPS verbinden zu können. Die in diesem Thread gezeigte Implementierung schien die einzige existierende Lösung zu sein. Allerdings war sie ungeeignet für mein Projekt, da der Author keine Lizenz zur Benutzung erteilt. Auf eine PN erhielt ich keine Antwort, also entstand kurzerhand eine neue Bibliothek. Diese steht unter der LGPL, ist also nutzbar.

Abgesehen davon möchte ich auf auf eine Python ADS Bibliothek, welche die Beckhoff ADS DLL verwendet aufmerksam machen. Siehe hier: https://pypi.python.org/pypi/pyads.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo GreenChili,
vielen Dank, dass du deine Lib öffentlich gemacht hast. Ich habe am Wochenende mal versucht, eine ADS-Verbindung zwischen meiner SPS und einem RaspberryPi herzustellen. Leider noch ohne Erfolg.
Könnte das Problem sein, dass ich auf dem Pi kein TwinCat habe und deswegen keine AMSNetId und auch keine Routes? Und welchen Port nehme ich auf dem Pi?
Ich bekomme immer einen Timeout-Fehler. Ich kann im Netzwerk irgendwie auch noch nicht den Verbindungsaufbau sehen. Hast du eine Idee?
Gruß
Holger
 
Moin,

... Ich habe am Wochenende mal versucht, eine ADS-Verbindung zwischen meiner SPS und einem RaspberryPi herzustellen. Leider noch ohne Erfolg.
Könnte das Problem sein, dass ich auf dem Pi kein TwinCat habe und deswegen keine AMSNetId und auch keine Routes?

TwinCat wird nicht benötigt. Ich hatte es dann wie weiter oben geschrieben auch noch irgendwie hinbekommen. Allerdings nicht mehr weiter verfolgt.
Bin gerade an was anderem in der Richtung dran.

Was du machen musst ist der SPS eine Route zu deinem PI geben. Das geht mit dem TcAmsRemoteMgr (\Hard Disk\System\).
IP eingeben, eine AMSNetid erfinden (<IP vom PI>.1.1) und gut.

Und welchen Port nehme ich auf dem Pi?

Was meinst du mit Port?
In Richtung SPS hast du AFAIR zwei Optionen. Port 300 ist der IO Teil, also quasi der Buskoppler der von TwinCAT auch via ADS ausgelesen wird.
Was du denke ich eher möchtest ist Port 801 - das ist die (erste) SPS Runtime

Ich bekomme immer einen Timeout-Fehler. Ich kann im Netzwerk irgendwie auch noch nicht den Verbindungsaufbau sehen. Hast du eine Idee?

Check mal die oben genannten Punkte. Falls das nicht geht könntest mal mit tcpdump auf dem PI schauen, (ob) was rein kommt (das hier hilft mir meist). Im Netzwerk selbst wirst du mit Wireshark oder so nichts sehen, da du höchstwahrscheinlich ein Netzwerk mit nem Switch hast.

Hoffe das hilft.

Gruß ohm200x
 
Ich habe einmal nach langer Zeit hier einen Besuch gemacht und möchte noch die Anmerkung machen, dass man sehr gut mit dem Webserver Tornado (Python was sonst) und Web sockets eine Echtzeitkommunikation zwischen Web client und server hinbekommt. Mit Tornado ist das recht einfach. Ich habe das mit Python für das Omron FINS Protokoll gemacht, indem ich die Daten lese und in einen zentralen Pool (Dictionary) stelle. Tornado sendet einfach jede Sekunde dann die Daten über ein Websocket an den Client, der die Daten mit simplen Javascript entgegennimmt.. Mit Javascript lassen sich dann Zeiger, Instrument etc animieren. Die notwendige Interprozesskommunikation zwischen Webserver und Datenpool mach ich mit ZMQ, dass schon zu einfach ist. Multithreading ist definitiv nicht so gut geeignet.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich häng mich da mal in das Thema mit ein, da ich mit einem Cx9020 über TCP/IP kommunizieren möchte und von Python noch keine Ahnung hab. Bisher findet der Transfer über einen TCP/Ip-Stack via Laptop und Python 2.7 statt.
Nun sollen die Daten aber vom Cx9020 und TC 3 ausgelesen werden. Den Cx hab ich in soweit mal vorbereitet und die TF6310 für die TCP/IP-Kommunikation installiert, sowie das Beispiel_02 der TCP bib geladen, aber irgendwie komm ich da nicht mehr weiter. :confused:
Für die weitere Vorgehensweise wäre ich für Tipps dankbar.
Grüße
 
Danke für die schnelle Antwort.
Was brauch ich denn alles aus der adshli-Bibliothek? Muss ich das Python Skript aus Sample_Code.py in TwinCAT einbinden oder ist das für meine Gegenstelle gedacht, die mit dem Cx kommuniziert?
Kann ich auf dem Besipiel_02 von Beckhoff aufbauen, wer ist dann Server/Client?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist für die Gegenstelle, also um von einem Client aus Daten von deiner TwinCAT Steuerung zu lesen.

Ohne das Setup auszuführen, benötigst du nur den Unterordner adshli. In deiner Beckhoff-Steuerung musst du wahrscheinlich eine passende ADS-Route anlegen, sonst nichts.
Mit den Beckhoff-Beispielen kannst du nichts tun. Du gibst ganz einfach nur den Variablennamen und den Datentyp an, und dann wird dieser Wert aus der Steuerung gelesen. Wesentlich einfacher als mit den Beckhoff-Ads-Dlls.

Das einzige was in der Doku zu adshli nicht explizit erwähnt ist, dass du für die Typen die gleichem Formatzeichen wie auch für das struct-Modul von Python verwenden musst.
 
In meinem Fall möchte ich Daten mit der TwinCAT Steuerung auslesen. Dann ist wahrscheinlich der Cx9020 der Client und meine Gegenstelle der Server.
Die Route lege ich mir im Cx-Config unter RAS-Control an?
attachment.php
 

Anhänge

  • P1150560.JPG
    P1150560.JPG
    266,1 KB · Aufrufe: 49
In meinem Fall möchte ich Daten mit der TwinCAT Steuerung auslesen. Dann ist wahrscheinlich der Cx9020 der Client und meine Gegenstelle der Server.
Daten mit der TwinCAT Steuerung auslesen...von was?

Du kannst auch eine nackte TCP-Verbindung nehmen über die du die Daten übermittelst, dann musst du dich um ADS nicht kümmern wenn dir das zu kompliziert ist. Ich kenne mich mit den CXen nicht aus, kann sein dass du für TCP eine kostenpflichtige Bibliothek von Beckhoff benötigst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte quasi Daten von einem Datenlogger via TcpIp auslesen. Die TF6310 hab ich bereits installiert. Dann versuch ich das mal, ob ich das mit der "nackten TCP-Verbindung" hinbekomme :rolleyes:
 
Zurück
Oben