【问题标题】:Python pymodbus in gui classgui类中的Python pymodbus
【发布时间】:2015-01-15 18:32:43
【问题描述】:

我正在尝试开发一个 python gui 应用程序,它使用 pymodbus 与 PLC 通信。使用网站上的文档和我在网上找到的内容,我可以轻松地进行交流,并且一切正常。我正在努力解决如何使用各种方法将所有这些合并到一个 gui 类中。我是 python 和 oo 编程的新手,因为我的背景是机械工程。

请看下面的代码。当用户单击 & 按钮时,我想使用“modbusConnect”方法连接到设备。因此,我创建了 ModbusTcpClient 的“客户端”实例。

然后如何在“dialValueChanged”方法中引用此实例来读取或写入寄存器。如果我的代码结构不正确,请告诉我,我应该有各种类等。

提前谢谢你。

大卫

from pymodbus.client.sync import ModbusTcpClient
import struct
import sys
from PyQt4 import QtCore, QtGui, uic

form_class = uic.loadUiType("C:\Users\David\.PyCharm30\VC-22D Modbus TCP\UI Design\Modbus-     MainScreen.ui")[0]
form_class2 = uic.loadUiType("C:\Users\David\.PyCharm30\VC-22D Modbus TCP\UI Design\Modbus- ConnectMenu.ui")[0]

class MyWindowClass(QtGui.QMainWindow, form_class):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.setFixedSize(1500,1200)
        self.dial.valueChanged.connect(self.dialValueChanged)
        self.pushButton_Connect.clicked.connect(self.modbusConnect)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.setWindowIcon(QtGui.QIcon("C:\Users\David\.PyCharm30\VC-22D Modbus TCP\UI  Design\Cla-Val_30px.png"))

    def modbusConnect(self):
        #modbus connection
        ipaddress = str(self.lineEdit_IP.text())
        client = ModbusTcpClient(ipaddress)
        testconnection = client.connect()
        if testconnection == True:
            print ("Connection Successful")
        else:
            print ("Connection Not Successful")
            print (self.lineEdit_IP.text())
            exit()

    def dialValueChanged(self):
        setvalue = float(self.label.text())
        if setvalue == 0:
            setvalueint = 0
        else:
            setvaluehex = str(hex(struct.unpack('<I', struct.pack('<f', setvalue))[0]))
            setvaluehexstr = setvaluehex[:-4]
            setvalueint = int(setvaluehexstr, 16)


app = QtGui.QApplication(sys.argv)
myWindow = MyWindowClass(None)
myWindow.show()
app.exec_()

【问题讨论】:

    标签: python class methods instance modbus


    【解决方案1】:

    client变成这个GUI的实例属性:

    def modbusConnect(self):
        #modbus connection
        ipaddress = str(self.lineEdit_IP.text())
        self.client = ModbusTcpClient(ipaddress)
    

    然后您可以从dialValueChanged 参考它:

    def dialValueChanged(self):
        [... 7 lines omitted from output ...]
        self.client.write_coil(some_register, setvalueint)  #write_coil or write_register, depends on your communication
    

    但是,这意味着 GUI 类在创建时并未完全实例化。您还应该为再次单击 pushButtonConnect 时添加一些故障保护措施。

    【讨论】:

    • 有道理!非常感谢您的回复。非常感激! - 大卫
    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多