Hi zusammen,
ich möchte gerade ein Netzteil der Firma Elektro Automatik per Python
ansteuern. Leider gibt es seitens des Herstellers keine Beispiele
ausserhalb von LabVIEW.
Die Programmierung soll per Python erfolgen und über die SCPI
Kommunikation per TCP/IP stattfinden.
Es ist eine uralt Schnittstellenkarte verbaut, wodurch man nicht einfach
die SCPI Kommandos schicken kann, sondern es braucht vorher noch ein
Paket mit der Länge des nachfolgenden Kommandos.
Die Vorgehensweise ist hier beschrieben:
https://elektroautomatik.com/wp-content/uploads/an008_tcpip_access_ifex_ethernet_card.pdf
Allerdings komme ich da mit meinen bisherigen Versuchen das in Python zu
bewerkstelligen nicht weit.
Da ich leider nicht mal Wireshark installieren darf um den Transfer zu
checken bleibt mir nur Try & Error oder euer Fachwissen.
Hättet ihr eine Idee wie ich die Kommunikation aufbauen muss, damit das
Ansteuern des Netzteils klappt?
Aktueller code:
1
import socket
2
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3
s.settimeout(2)
4
s.connect(('169.254.227.240', 80))
5
data = bytes.fromhex('00000006')
6
s.sendall(data)
7
s.sendall(b'LOCK 1\n')
8
print(s.recv(1024))
Damit bekomme ich immerhin eine Fehlermeldung des Keil Compilers als
Antwort, die besagt, dass das Kommando nicht bekannt ist.
Moin,
ich glaube Wireshark gibt es auch als Portable. Ich weiß aber nicht, ob
es dann ohne Adminrechte oder mit ner ggf. alten Version funktioniert.
Ist die die Umwandlung von LOCK1 in Byte so in Ordnung?
Was sagt den der Compiler? Ggf. muss da nen Encoding angegeben werden?
Grüße
Soder D. schrieb:> Damit bekomme ich immerhin eine Fehlermeldung des Keil Compilers als
Python vs. Keil Compiler - ich hab noch nicht alles auf dieser Welt
gesehen, vielleicht sollte ich doch mal aus meinem Keller kriechen...
Soder D. schrieb:> s.connect(('169.254.227.240', 80))
Ich hoffe dass APIPA-Addressen Dir keine unnötigen Umstände machen (aus
welchen Gründen auch immer...)
Da es um Port 80 geht: ist das HTTP[S]? (ich habe nicht ins verlinkte
PDF geguckt)
Falls ja: Bekommst Du da irgendwas nützliches hin mit wget oder curl
? (ausserhalb Python natürlich!)
Soder D. schrieb:> s.sendall(b'LOCK 1\n')
Das \n gehört da nicht hin.
> Damit bekomme ich immerhin eine Fehlermeldung des Keil Compilers als> Antwort, die besagt, dass das Kommando nicht bekannt ist.
Schon mal direkt mit einem Python-Interpreter probiert?
Es macht keinen Sinn eine Implementierung zu versuchen, wenn man nicht
mal weiß, wie der Netzwerktraffic aussehen soll.
Wie weiter oben steht: Wireshark gibt es portable.
Wenn das nicht erlaubt ist wäre unter linux tcpdump, unter Windows
pktmon, noch eine Möglichkeit, Taffic mitzuschneiden.
Wenn beides nicht geht würde ich mit der IT reden, die sollen sich was
einfallen lassen. Ein Extra-Rechner, ein Testnetz, irgendwas.
Informationssicherheitsmanagement ist wichtig, aber wo gehobelt wird da
fallen Späne.
Dirk B. schrieb:> Soder D. schrieb:>> s.sendall(b'LOCK 1\n')> Das \n gehört da nicht hin.
In der Tat, das '\n' hat in dem Kommando nichts zu suchen, UND macht den
String 7 Zeichen lang anstelle der angekündigten 6.
Aber du machst glaube ich noch einen anderen Fehler. Das Manual sricht
von einem raw socket. Du benutzt aber einen AF_INET SOCK_STREAM socket,
also den vollen TCP stack. Dieser Stack wird aber deine zwei sendall zu
einem Frame zusammenfassen wenn du dazwischen keine Wartezeit einbaust.
Und das Manual sagt es sollen zwei Frames sein ...
LG, Sebastian
Hi zusammen, danke für die vielen Kommentare soweit.
Erst mal zur Entwirrung hinsichtlich des KEIL Compilers. Die Meldung mit
dem unbekannten Kommando bekomme ich nicht von Python, sondern vom
Netzteil als Antwort auf meine Anfrage. Bei ähnlichen Abfragen kam
bisher nur ein timeout.
Grundsätzlich geht die Kommunikation unüblicherweise über Port 80. Das
liegt wohl an der Schnittstellenkarte für die es eben jene angehängte
AppNote gibt.
Man kann auch per Browser auf ein Interface zugreifen, aber wie gesagt,
ich möchte es mit Python automatisieren. Bei dieser Netzwerkkarte läuft
wohl auch die Ansteuerung alles über einen Raw Socket und Port 80.
Ich verwende gerade auch keine Programmierumgebung aktuell sondern
reines Python in der command shell. Wenn die Kommunikation läuft werde
ich zu VisualStudio Code wechseln denke ich.
mitleser schrieb:> Ist die die Umwandlung von LOCK1 in Byte so in Ordnung?
Das weiß ich leider nicht. Ich hoffe hier auf die Antwort zu stoßen :)
Einer geht noch schrieb:> Falls ja: Bekommst Du da irgendwas nützliches hin mit wget oder curl
Bin auf nem Windows PC, gibts da Alternativen?
Dirk B. schrieb:> Soder D. schrieb:>> s.sendall(b'LOCK 1\n')>> Das \n gehört da nicht hin.
Stimmt, guter Punkt. Ich hatte es - soweit in Erinnerung- auch mal ohne
\n probiert und dann kam auch entweder der KEIL fehler oder ein timeout.
Am Donnerstag bin ich wieder vor Ort am Gerät und kann gern etwas
ausprobieren.
Einer geht noch schrieb:> (keine Reaktion vom Fragesteller seit ~3h)
Ja Feierabend und ne Runde laufen. :)
Tilo R. schrieb:> Wie weiter oben steht: Wireshark gibt es portable.>> Wenn das nicht erlaubt ist wäre unter linux tcpdump, unter Windows> pktmon, noch eine Möglichkeit, Taffic mitzuschneiden.
Das werde ich mal probieren.
Sebastian schrieb:> Aber du machst glaube ich noch einen anderen Fehler. Das Manual sricht> von einem raw socket. Du benutzt aber einen AF_INET SOCK_STREAM socket,> also den vollen TCP stack. Dieser Stack wird aber deine zwei sendall zu> einem Frame zusammenfassen wenn du dazwischen keine Wartezeit einbaust.> Und das Manual sagt es sollen zwei Frames sein ...
Das klingt plausibel, das schaue ich mir auch gern am Donnerstag am
Gerät vor Ort an.
Vielen herzlichen Dank soweit für eure Anregungen
> Da ich leider nicht mal Wireshark installieren darf...> Bin auf nem Windows PC, gibts da Alternativen?
Ja.
Du sagst deinen Chef -- wenn er einen Deppen sucht, der mit ungeeigneten
Werkzeugen alten Schrott zum laufen bringt -- dann soll er halt so einen
Deppen einstellen.
Du machst doch den Eindruck, als würdest du sofort eine bessere Stelle
finden.
> Einer geht noch schrieb:>> Falls ja: Bekommst Du da irgendwas nützliches hin mit wget oder curl>> Bin auf nem Windows PC, gibts da Alternativen?
Diese Rückfrage ist jetzt aber nicht ernst gemeint, oder?
Klar gibt es CURL.EXE und WGET.EXE m-) ausserdem auch WSL2...
Und erwachsene Netzerkbetriebssysteme als Alternative zu GameLoader mit
Mausbedienung!
Einer geht noch schrieb:>> Einer geht noch schrieb:>>> Falls ja: Bekommst Du da irgendwas nützliches hin mit wget oder curl>>>> Bin auf nem Windows PC, gibts da Alternativen?>> Diese Rückfrage ist jetzt aber nicht ernst gemeint, oder?>> Klar gibt es CURL.EXE und WGET.EXE m-) ausserdem auch WSL2...> Und erwachsene Netzerkbetriebssysteme als Alternative zu GameLoader mit> Mausbedienung!
Schande über mein Haupt.
Ich guck am Donnerstag mal mit curl.exe was man so findet auf dem Gerät.
Die Meldung, die ich mit dem initial Code zurück bekomme ist:
1
b'HTTP/1.1 501 Not Implemented\r\nServer: Keil-EWEB/2.1\r\nContent-type: text/html\r\nConnection: close\r\n\r\n<head><title>Server Error</title></head><body><h2>Error 501 - Not Implemented</h2>The requested Method is not supported.<hr><br><i>Keil Embedded WEB Server V2.00, 2011<br><a h_ref=http://www.keil.com>www.keil.com </a> - Embedded Development Tools</i></body>'
ohne das angesprochene
1
\n
bekomme ich die selbe Meldung zurück.
Wenn ich den Socket ändere zu:
1
s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
denn bekomme ich ein timeout (auch ohne \n).
Kleine Info noch: über den Browser werde ich mit der Geräte IP auf
1
http://169.254.227.240/Home.cgi
weitergeleitet.
Per curl Befehl bekomme ich bei Eingabe der IP und Port zu folgender
Rückmeldung:
Wireshark schaut genau so aus wie beim verlinkten Dokument von Elektro
Automatik:
Bilder 1-3 (sorry Bild 1 noch eiin paar weitere Male hochgeladen..)
Zeile. 4 -> Anzahl des nachfolgenden Packetes
Zeile. 5 -> Antwort von Netzteil
Zeile. 6 -> Kommando
Zeile. 7 -> Antwort von Netzteil
Zeile. 8 -> Die Keil Fehlermeldung
Jetzt stellt sich mir noch die Frage ob das jetzt eigene Packete oder
ein Stream ist was Sebastian gesagt hat. Damit kenn ich mich leider
weder mit Wireshark noch mit Paketen/Frames und TCP Stacks zu wenig aus.
Jemand eine Idee?
Edit:
mit
1
s = socket.socket(socket.AF_INET, socket.SOCK_RAW)
Soder D. schrieb:> Die Meldung, die ich mit dem initial Code zurück bekomme ist:
Da läuft ein Webserver, der normale HTTP-Kommandos haben will.
Soder D. schrieb:> The requested Method is not supported
Klar. "LOCK1" ist kein HTTP-Kommando.
Soder D. schrieb:> Kleine Info noch: über den Browser werde ich mit der Geräte IP> aufhttp://169.254.227.240/Home.cgi> weitergeleitet.
Und was kannst du da machen? Ggf. kannst du ja auch einfach einen HTTP
Request an das Device schicken
Netzwerker schrieb:> Soder D. schrieb:>> Die Meldung, die ich mit dem initial Code zurück bekomme ist:>> Da läuft ein Webserver, der normale HTTP-Kommandos haben will.>> Soder D. schrieb:>> The requested Method is not supported>> Klar. "LOCK1" ist kein HTTP-Kommando.
Laut Application Note soll Port 80 verwendet werden und SCPI Kommandos
sollen funktionieren, siehe Beispiel in der AppNote.
Hans schrieb:> Mach mal einen Portscan mit nmap. Du bist da auf dem falschen Port.
Ich bin wie in der AppNote beschrieben auf Port 80.
Hans schrieb:> Soder D. schrieb:>> Kleine Info noch: über den Browser werde ich mit der Geräte IP>> aufhttp://169.254.227.240/Home.cgi>> weitergeleitet.>> Und was kannst du da machen? Ggf. kannst du ja auch einfach einen HTTP> Request an das Device schicken
Auf dem Interface werden mir die Confiuration, Ist und Soll Werte der
Spannungen/Ströme etc angezeigt. Dort gibt es auch ein Eingabefeld wo
ich SCPI Kommandos (wie "LOCK 1" oder "*IDN?") schicken kann. Im
Antwortfenster bekomme ich auch die Rückmeldungen für Abfragen und
Anforderungen werden auch durchgeführt (wie Output On/Off).
Soder D. schrieb:> Jetzt stellt sich mir noch die Frage ob das jetzt eigene Packete oder> ein Stream ist was Sebastian gesagt hat. Damit kenn ich mich leider> weder mit Wireshark noch mit Paketen/Frames und TCP Stacks zu wenig aus.> Jemand eine Idee?
Die Kommunikation sieht im Prinzip gut aus und wie in AN008 beschrieben.
Es werden einzelne Pakete versandt und nicht wie von mir befürchtet vom
TCP-Stack zusammengefasst.
Was mich etwas stutzig macht ist das Bestehen auf "raw socket" und dann
die seltsame MAC-Adresse des Netzteils (37:35:30:30:30:36) in den
Beispielpaketen ...
Soder D. schrieb:> Dort gibt es auch ein Eingabefeld wo> ich SCPI Kommandos (wie "LOCK 1" oder "*IDN?") schicken kann. Im> Antwortfenster bekomme ich auch die Rückmeldungen für Abfragen und> Anforderungen werden auch durchgeführt (wie Output On/Off
Eine Alternative wäre es also die Bedienung dieses Eingabefeldes mit
Python zu automatisieren, also die URL so aufzurufen wie sie bei
Absenden des SCPI-Kommandos aus dem Eingabefeld heraus aufgerufen wird
...
LG, Sebastian
Soder D. schrieb:> Ich bin wie in der AppNote beschrieben auf Port 80.
Dann ist die AppNote falsch und du immer noch auf dem falschen Port.
Soder D. schrieb:> Auf dem Interface werden mir die Confiuration, Ist und Soll Werte der> Spannungen/Ströme etc angezeigt. Dort gibt es auch ein Eingabefeld wo> ich SCPI Kommandos (wie "LOCK 1" oder "*IDN?") schicken kann. Im> Antwortfenster bekomme ich auch die Rückmeldungen für Abfragen und> Anforderungen werden auch durchgeführt (wie Output On/Off).
Perfekt. Dann sende deine SCPI Kommandos über HTTP. Dafür kannst du
Python Requests nehmen.
Soder D. schrieb:> Dort gibt es auch ein Eingabefeld wo> ich SCPI Kommandos (wie "LOCK 1" oder "*IDN?") schicken kann.
Lässt sich das Teil dann eventuell ganz klassisch über VISA ansteuern?
Da gibts PyVISA, das nutzen wir und das klappt sogar für uralte GPIB
Messgeräte prima.
https://pyvisa.readthedocs.io/en/latest/
Christian R. schrieb:> Da gibts PyVISA, das nutzen wir und das klappt sogar für uralte GPIB> Messgeräte prima.
Wenn man eine GPIB Schnittstelle am PC hast, ist das ok.
Wenn man direkt übers Netzwerk geht eher nicht.
So Leute ich glaubs nicht, will hier nochmal Rückmeldung geben weil ihr
so fleißig am miträtseln seid.
Mir ist heute Nachmittag gekommen, dass ich mit dem Test Netzteil nicht
unbedingt die gleiche Schnittstellenkarte habe wie am eigentlichen
Prüfstand.
Habe das überprüft und wie ich vom Support erfahren habe gilt die App
Note nur für die Geräte mit Ethernetkarte IF-E1 und nicht für die mit
IF-E1B.
Aus dem Grund hab ich beim Testnetzteil den Port aus der eigentlichen
Dokumentation für das Netzteil genommen (1001). Und damit gehts super
easy.
Allerdings gibts noch ein paar Probleme auf dem Netzteil im eigentlichen
Prüfstand. Klar kann ich einfach die Schnittstellenkarten austauschen,
aber mein Ehrgeiz will auch mit der IF-E1 und der AppNote zum Ziel
kommen.
Die Kommunikation funktioniert, ich kann ein bis zwei Kommandos
schicken, die Verbindung ist aber dann nach wenigen Sekunden
geschlossen. Ein provisorisches gegoogeltes Keep Alive in der
Socketdefinition hilft bisher nicht. Ausserdem bekomme ich teilweise
keine Antworten auf meine requests. Mal sehen.
Aber das gucke ich mir mal morgen in einer einsamen Minute an.
Dirk B. schrieb:> Christian R. schrieb:>> Da gibts PyVISA, das nutzen wir und das klappt sogar für uralte GPIB>> Messgeräte prima.>> Wenn man eine GPIB Schnittstelle am PC hast, ist das ok.>> Wenn man direkt übers Netzwerk geht eher nicht.
Mal kurz bei pyvisa geschaut (damit will ich auch die Multimeter
einbinden, klappt soweit). Dort gibt es wohl auch TCPIP Socket
Verbindungen. Wenn ich mal zwei einsame Minuten habe werde ich das auch
mal abchecken ob ich da einzelne packages schicken kann
Soder D. schrieb:> Habe das überprüft und wie ich vom Support erfahren habe gilt die App> Note nur für die Geräte mit Ethernetkarte IF-E1 und nicht für die mit> IF-E1B.
Nun ja, das steht ja nur in rotem Text oben in der Note.
Sogar mit einem "Achtung!"
Braucht man für PyVisa noch Ni-Visa als Gerätreiber?
Dirk B. schrieb:> Soder D. schrieb:>> Habe das überprüft und wie ich vom Support erfahren habe gilt die App>> Note nur für die Geräte mit Ethernetkarte IF-E1 und nicht für die mit>> IF-E1B.>> Nun ja, das steht ja nur in rotem Text oben in der Note.> Sogar mit einem "Achtung!"
Also das wusste ich vom Support schon davor, der hat mich auf die
AppNote verwiesen. Aber ich ging davon aus, dass unsere gleichen
Netzteile auch die gleichen Schnittstellenkarten haben.
> Braucht man für PyVisa noch Ni-Visa als Gerätreiber?
Hab NI MAX und auch Ni Visa drauf, sollte also schon gehen. Aber ob
pyvisa ohne dem NI Visa Gerätetreiber läuft weiß ich leider auch nicht
Klar geht Visa auch über LAN, auch über USB und alles mögliche andere.
Wir nutzen das für LAN, USB und GPIB. Das schöne ist, dass der Top Level
Code immer gleich ist.
Laut der pyVisa Homepage kann man auch das pyvisa-py Backend nehmen
anstatt das NI. Bei Lan dürfte das ziemlich egal sein denn das braucht
ja keinen Treiber. Bei USB Geräten sieht das eventuell anders aus.
Wir haben NI VISA drauf, weil wir noch andere Software haben, die die NI
Libs nutzt.
Christian R. schrieb:> Klar geht Visa auch über LAN, auch über USB und alles mögliche> andere.> Wir nutzen das für LAN, USB und GPIB. Das schöne ist, dass der Top Level> Code immer gleich ist.>> Laut der pyVisa Homepage kann man auch das pyvisa-py Backend nehmen> anstatt das NI. Bei Lan dürfte das ziemlich egal sein denn das braucht> ja keinen Treiber. Bei USB Geräten sieht das eventuell anders aus.>> Wir haben NI VISA drauf, weil wir noch andere Software haben, die die NI> Libs nutzt.
Ohne NI VISA die USB Geräte ansteuern zu können wär schon klasse. Das
kommt auch noch auf die irgendwann to do Liste.
Soder D. schrieb:> Ohne NI VISA die USB Geräte ansteuern zu können wär schon klasse. Das> kommt auch noch auf die irgendwann to do Liste.
USB ist blöd, weil man immer einen angepassten Treiber für das
Betriebssytem braucht.
Bei RS232 und Ethernet braucht man das nicht.
Bei GPIB braucht man nur Treiber für die Schnittstellenkarte
Da kann man Geräte auch noch nach 50 Jahren programmieren.
Dirk B. schrieb:>> Braucht man für PyVisa noch Ni-Visa als Gerätreiber?
Klares Nein. Es gibt das Paket PyVisa-py das ist eine pure Python
Implementierung von VISA. Andere VISA Bibliotheken könnten schneller
sein, aber für ein paar Messgerät zur Steuerung reicht es.
Bei mir läuft da fast alles drüber und Hersteller die kein vernünftiges
Interface bieten das ich Problemlos mit Python ansprechen kann kaufe ich
einfach nicht mehr. Die Vertreter kommen dann gerne mit kostenlosen
LabView zeug, aber damit bin ich durch.
Es gibt auch noch eine PyMeasure Bibliothek fur einfache Messungen,
benutze ich allerdings nicht da ich etwas ähnliches schon selber
programmiert hatte bevor ich das gefunden hatte und noch weitreichender
Anforderungen von PA und QM habe.
Die meisten Geräte stellen per USB ja nur einen VCP zur Verfügung, den
kann man doch wunderbar per PyVisa nutzen.
Viele der USB Messgeräte haben die USB Test and Measurement Class
(USBTMC) implementiert, das geht zumindest unter Windows direkt so. Aber
ob pyVISA dann ohne das NI VISA drauf arbeiten kann weiß ich nicht.
Unsere Tektronix AFG3000 waren an USB ziemlich unzuverlässig, mit LAn
und PyVISA klappt das bestens.
Christian R. schrieb:> Viele der USB Messgeräte haben die USB Test and Measurement Class> (USBTMC) implementiert, das geht zumindest unter Windows direkt so. Aber> ob pyVISA dann ohne das NI VISA drauf arbeiten kann weiß ich nicht.> Unsere Tektronix AFG3000 waren an USB ziemlich unzuverlässig, mit LAn> und PyVISA klappt das bestens.
Genau, solche Geräte die USB als VCP oder TMC arbeiten haben wir auch,
da wärs praktisch ohne NI VISA. Das werd ich mal mit dem Rechner vom
Kollegen ohne NI Visa probieren.
MeinName schrieb:> Die meisten Geräte stellen per USB ja nur einen VCP zur Verfügung, den> kann man doch wunderbar per PyVisa nutzen.
Zumindest über VCP scheint es ja wohl zu gehen. Das wär echt klasse :)
Hi zusammen,
ich hab mich mal eben noch an das alte Schnittstellengerät gehockt.
Per
1
import socket
2
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3
s.connect(('169.254.227.244', 80))
verbinde ich mich einfach nur und nach wenigen Sekunden wird die
Verbindung vom Netzgerät abgebrochen.
Irgendwelche Ideen?
Ich habe das Gefühl der Socket ist falsch konfiguriert, wenn ich aber
"socket.SOCK_RAW" statt "socket.SOCK_STREAM" verwende gibt es gar keine
Kommunikation laut Wireshark.
Wenn ich nach dem connecten sofort eine weitere Anweisung an des Gerät
sende wird es auch ausgeführt, allerdings wird früher oder später die
Verbindung danach dennoch abgebrochen (circa. 5 sek)
Sebastian schrieb:> Der Server auf Port 80 scheint die Verbindung abzubrechen wenn er> innerhalb von 3 Sekunden kein Kommando erhält ...>> LG, Sebastian
Der Server ist in diesem Fall das Netzteil. Laut
Schnittstellenbeschreibung bricht das Gerät die Verbindung nach 10 min
Inaktivität auf dem Port erst ab.
Wenn ich direkt noch ein Kommando schicke, dann braucht es danach so
8-10 Sekunden bis das Netzteil die Verbindung abbricht.
Ansteuern mit pyvisa ohne Visa Bibliothek ging schonmal auch mit dem
Netzteil.
Man musste aber den write und read end character "\n" noch definieren
damit es klappt.
Jetzt fehlts noch das Netzteil mit der alten Schnittstelle mit den zwei
Paketen anzusteuern ohne dass die Verbindung direkt abgebrochen wird.
Leider fehlt mir da jegliche Idee.
zu Wireshark: Schalte einn Switch dazwischen, bei dem sich ein Port in
den Monitoring-Modus schalten lässt (quasi Hub-Modus). Da hängst du dann
einen privaten Rechner mit Wireshark dran ...