Python 图形界面中的 pymodbus class

Python pymodbus in gui class

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

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

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

提前致谢。

大卫

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_()

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 class 在创建时并未完全实例化。当再次单击 pushButtonConnect 时,您应该添加一些故障保险。