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
时,您应该添加一些故障保险。
我正在尝试开发一个 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
时,您应该添加一些故障保险。