Ich plane, eine Waage mit einem HX711-ADC in CODESYS zu implementieren, wobei eine Wägezelle mit einem Raspberry Pi verwendet werden soll.
Ich habe ein funktionierendes Python-Skript, das mir das Gewicht in Gramm (in INT) ausgibt.
Das Skript wird beim Boot/Log-in automatisch ausgeführt.
Ich habe von der Funktion SysProcessExecuteCommand2 (FUN) gehört, die es mir ermöglichen sollte, die Prozesswerte aus dem Python-Skript, in CODESYS zu lesen.
Kann mir jemand diese Funktion/Methode erklären, wie ich es zum Laufen bringen kann? Am besten in mit einem kleinen Codebeispiel.
Hi Eddy!
Bin gerade unterwegs. Aber ich habe einen experimentellen aufbau in dem ich was ganz ähnliches probiert hab, was nur noch nicht so stabil und flexibel lief, wie ich es mir gewünscht hätte.
Das kann ich aber gerne mit dir Teilen. Die groben Eckpfeiler was ich gemacht habe:
SysProcessExecuteCommand2 aufgerufen um das script zu starten
im Script den Prozess "daemonized"
im Script eine Pipe angelegt
im FB die pipe geöffnet
aus dem FB Kommandos geschrieben, um Funktionen in dem python skript aufzurufen
Soweit hatte das funktioniert. Cleanup ist noch nicht so gut, und für den Prozessdatenaustausch hat mir noch 'ne zündente Idee gefehlt.
Ich schicks dir heute oder morgen.
SysProcessExecuteCommand hat jedenfalls das Problem, dass es nur einen begrenzten Buffer, einmalig liest. Du bekommst also keinen Stream, wie du es von python kennst.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Okay, wie ich es verstanden habe, wird dann also noch ein Cleanup benötigt, um den Buffer vom SysProcessExecuteCommand zu leeren.
Leider bin ich der Python Sprache nicht mächtig und ich habe bis vor paar Wochen nur mit TIA Portal gearbeitet. Ich hoffe, ich habe mir nicht etwas zu großes vorgenommen...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Damit habe ich einen Zähler in eine Variable, Namens "hugo" geschrieben. Und dann die Methode "main" aufgerufen. In der Funktion "main" in dem Python Skript habe ich dann immer einfach alle Variablen der Klasse ausgegeben, um zu sehen, dass "hugo" auch geschrieben wurde:
class plc_prg(codepy.program): def main(self): print("hello worldz!") print(self.__dict__)
Wie du siehst, die Idee ist, dass jemand mit einem Python Skript, welches eine Klasse enthält, die von "codepy.program" ableitet, einfach Variablen mit CODESYS austauschen kann, und CODESYS Methoden aufrufen kann.
Aktuell geht es nur Variablen zu schreiben. Der nächste Schritt ist aber natürlich das Lesen 😉
Falls dir die Idee gefällt, lass es mich wissen. Das motiviert natürlich, die Idee schöner, und nicht nur für meinen Hausgebrauch umzusetzen ;)
Hallo,
Ich plane, eine Waage mit einem HX711-ADC in CODESYS zu implementieren, wobei eine Wägezelle mit einem Raspberry Pi verwendet werden soll.
Ich habe ein funktionierendes Python-Skript, das mir das Gewicht in Gramm (in INT) ausgibt.
Das Skript wird beim Boot/Log-in automatisch ausgeführt.
Ich habe von der Funktion SysProcessExecuteCommand2 (FUN) gehört, die es mir ermöglichen sollte, die Prozesswerte aus dem Python-Skript, in CODESYS zu lesen.
Kann mir jemand diese Funktion/Methode erklären, wie ich es zum Laufen bringen kann? Am besten in mit einem kleinen Codebeispiel.
Die Funktion:
https://help.codesys.com/webapp/SysProcessExecuteCommand2;product=SysProcess%20Implementation;version=3.5.17.0
Danke im Voraus
Hi Eddy!
Bin gerade unterwegs. Aber ich habe einen experimentellen aufbau in dem ich was ganz ähnliches probiert hab, was nur noch nicht so stabil und flexibel lief, wie ich es mir gewünscht hätte.
Das kann ich aber gerne mit dir Teilen. Die groben Eckpfeiler was ich gemacht habe:
Soweit hatte das funktioniert. Cleanup ist noch nicht so gut, und für den Prozessdatenaustausch hat mir noch 'ne zündente Idee gefehlt.
Ich schicks dir heute oder morgen.
SysProcessExecuteCommand hat jedenfalls das Problem, dass es nur einen begrenzten Buffer, einmalig liest. Du bekommst also keinen Stream, wie du es von python kennst.
Wow super, danke dir!
Okay, wie ich es verstanden habe, wird dann also noch ein Cleanup benötigt, um den Buffer vom SysProcessExecuteCommand zu leeren.
Leider bin ich der Python Sprache nicht mächtig und ich habe bis vor paar Wochen nur mit TIA Portal gearbeitet. Ich hoffe, ich habe mir nicht etwas zu großes vorgenommen...
Hey Eddy,
hab' dir das Projekt mal angehängt. Ist ein "proof of concept". Also erwarte nicht zu viel 😉
Folgende Zeilen sind vielleicht interessant:
Damit habe ich einen Zähler in eine Variable, Namens "hugo" geschrieben. Und dann die Methode "main" aufgerufen. In der Funktion "main" in dem Python Skript habe ich dann immer einfach alle Variablen der Klasse ausgegeben, um zu sehen, dass "hugo" auch geschrieben wurde:
Wie du siehst, die Idee ist, dass jemand mit einem Python Skript, welches eine Klasse enthält, die von "codepy.program" ableitet, einfach Variablen mit CODESYS austauschen kann, und CODESYS Methoden aufrufen kann.
Aktuell geht es nur Variablen zu schreiben. Der nächste Schritt ist aber natürlich das Lesen 😉
Falls dir die Idee gefällt, lass es mich wissen. Das motiviert natürlich, die Idee schöner, und nicht nur für meinen Hausgebrauch umzusetzen ;)
vielleicht wäre "Shared Memory" eine Lösung? Das PythonScript schreibt das Gewicht in den Ram, Codesys greift ebenfalls auf den Ram zu und liest die Werte aus. Wird im Projekt openCV so angewendet um die Koordinaten von im Video/Foto erkannten Objekten an Codesys zu übergeben:
https://forge.codesys.com/prj/codesys-example/opencv-example2/home/Home/
https://forge.codesys.com/prj/codesys-example/shared-memory/home/Home/
https://forge.codesys.com/prj/codesys-example/shared-memory-c/
Über OPCUA sollte es auch möglich sein:
https://www.codesys-blog.com/kommunikation/python-opc-ua-client-mit-codesys-verbinden/
Viel Erfolg!
Last edit: dkugler 2021-06-05