Ausgabe eines laufende Python Skript in CODESYS lesen?

eddykl
2021-06-05
2021-06-05
  • eddykl - 2021-06-05

    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

     
  • Ingo

    Ingo - 2021-06-05

    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.

     
    • eddykl - 2021-06-05

      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...

       
      • Ingo

        Ingo - 2021-06-05

        Hey Eddy,
        hab' dir das Projekt mal angehängt. Ist ein "proof of concept". Also erwarte nicht zu viel 😉

        Folgende Zeilen sind vielleicht interessant:

            // call main
            szCommand := CONCAT(CONCAT('hugo=', DWORD_TO_STRING(hugo)), '$n');
            SysFile.SysFileWrite(hFifo, ADR(szCommand), LEN(szCommand), 0);
            szCommand := CONCAT('main', '$n');
            SysFile.SysFileWrite(hFifo, ADR(szCommand), LEN(szCommand), 0);
        

        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 ;)

         

Log in to post a comment.