Echtzeitabfrage mit Pymodbus

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dionysos
User
Beiträge: 7
Registriert: Montag 17. Juni 2019, 09:01

Hallo Allerseits,
ich habe ein Problem bei dem "aktualisieren" meiner ausgelesenen Werte.
Ich lese Werte in einer extra .py-Datei über pymodbus aus und stelle Sie dann in einem mit Qt erstellten GUI dar. Dabei sollen die Werte quasi in Echtzeit ausgelesen werden. Ich als Leihe bekomme es jedoch nur hin, dass die Werte einmal abgefragt werden. Ich bin mir auch nicht sicher welches der beste/einfachste Weg ist dies zu realisieren. Mit einer While-Schleife? Einem neuen Thread? Vermutlich beides.

Abgefragt werden die Werte mit:

Code: Alles auswählen

from agentlib import agent
from agentlib import name

# Auslesen FZ Lufterwäremer
FZ1H1 = agent.AgentClient(215, name.MODBUS_FZL_IP, name.MODBUS_FZL_PORT)
FZ1H1.connect()
try:
    a=FZ1H1.mb_read(12487, count=1, align_one = True)
except:
    a=333
#Default-Wert für mich zum Testen ob die Anlage läuft.


Meine Versuche es umzusetzen sind soweit gekommen, jedoch habe ich nun das Problem das er die Werte überhaupt nicht mehr liest

Code: Alles auswählen

class Trockner:

        def trocknerSchleife(self):
            
            while trockner.checkBox.checkState():
                import Trockner #Programm von oben
                a=Trockner.a
                Ausgabea = str(a)
                trockner.Lufterwaermer.setText(Ausgabea+" Einheit")
                
        t1=threading.Thread(target=trocknerSchleife)
        t1.start()


Ich hoffe jemand kann mir helfen auch wenn es für euch vermutlich zu einfach ist.
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Murmeltierzeit. Wir diskutieren das hier andauernd, für alle Formen der GUI Entwicklung. Es wird wirklich Zeit für irgendeine KI, die Themen vorschlägt, wenn jemand seine Frage formuliert.

Der einfachste und robusteste weg für sowas: QTimer. Damit kannst du periodisch eine Abfrage auslösen. Ja, es gibt auch Threads. Aber die kommen mit mehr Komplexität als die meisten Leute wahrhaben wollen, und sind sowas wie die dunkle Seite der Macht. Wenn man ein Problem ohne sie lösen kann (und deines kann man), sollte man die Finger von Threads lassen.
Dionysos
User
Beiträge: 7
Registriert: Montag 17. Juni 2019, 09:01

Danke dir für deine Antwort. Ich werde es gleich mal ausprobieren.

Ich hab leider im Forum nichts dazu gefunden, muss wohl die falschen Suchwörter benutz haben.
Dionysos
User
Beiträge: 7
Registriert: Montag 17. Juni 2019, 09:01

Hi ich muss nochmal fragen wie man eine periodische Abfrage damit realisiert.
Ich habe das bei mehreren QTimer Beschreibungen so gesehen wie in meinem Code jedoch funktioniert es bei mir leider nicht.

Code: Alles auswählen

from PyQt5 import QtCore

i=0
def funktion(i):
    i+=1
    print(i)

    
timer=QtCore.QTimer()
timer.timeout.connect(funktion)
timer.setInterval(1000)
timer.start()
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heisst "funktioniert nicht"? Nur dieses Beispiel? Das kann sein. Du brauchst eine Anwendung und musst den Mainloop starten. Und wenn das tut, dann bekommst du einen Fehler, weil du i als globale Variable behandelst, ohne das es eine ist. Und auch wenn die Foren-Suche hier nicht die grossartigste ist, QTimer suchen liefert durchaus einiges an brauchbaren Beispielen geschrieben von den ueblichen Verdaechtigen hier.
Dionysos
User
Beiträge: 7
Registriert: Montag 17. Juni 2019, 09:01

Funktioniert nicht heisst das er in der Console keine Ausgabe ausgibt.
Ich versuche gerade einfach nur den QTimer zu verstehen um ihn dann in das eigentliche Programm einzubauen.

Das ist das eigentliche Programm:

Code: Alles auswählen

from PyQt5 import QtWidgets, uic, QtCore
import sys
app = QtWidgets.QApplication(sys.argv)

#Importieren der uis
win = uic.loadUi("hauptfenster.ui")

trockner = uic.loadUi("trockner.ui")

class Hauptfenster():
                
    #Öffne FZWindwo
    def openFZ(self):
        if win.checkBoxFZ.checkState():    
            fz.show()
        else:
            error.show()
        #Mit Button verbinden
    win.FZButton.clicked.connect(openFZ)

class Fertigungszelle:

    #Öffne TrocknerAsset
    def openTrockner(self):
        trockner.show()
    #Mit Button verbinden
    fz.TrocknerButton.clicked.connect(openTrockner)

    class Trockner:
        def trocknerSchleife():
                
            import Trockner
            a=Trockner.a
            Ausgabea = str(a)
            trockner.Lufterwaermer.setText(Ausgabea+" Einheit")
         


        timer = QtCore.QTimer()
        timer.timeout.connect(trocknerSchleife)
        timer.start(500)
        timer.setInterval(500)
                

def main():
    win.show()
    sys.exit(app.exec_())

if __name__=="__main__":
    main()
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie gesagt, wenn der gar nichts tut, liegt das daran, dass du keine Anwendung hast. Der Code ist uebrigens etwas gurkig, eine App zu erzeugen auf Modul-Ebene, aber dann in der main-funktion auf globale Variablen zuzugreifen ist nicht gut. Das gehoert auch alles in die Main. Und trockner als Argument an die Klasse uebergeben.

Code: Alles auswählen

import sys
from PyQt5 import QtWidgets, QtCore


def main():
    app = QtWidgets.QApplication(sys.argv)
    button = QtWidgets.QPushButton("hallo")
    button.show()
    timer = QtCore.QTimer()
    timer.timeout.connect(lambda: print("gefeuert"))
    timer.setInterval(1000)
    timer.start()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Das eigentliche Programm funktioniert nicht. Importe gehören an den Anfang der Datei. Keine globalen Variablen benutzen. Das was Du da an „Klassen“ definiert hast, sind keine, weil Du auch nie eine Instanz davon erzeugst. Man schachtelt auch keine Klassendefinitionen ineinander.

Lerne am besten erst einmal die Basics von Python und mach dann mit einem PyQT-Tutorial weiter.
Antworten