pyqt modbus tcp实现例程
以下是一个使用PyQt和Modbus TCP协议实现的简单例程,用于读取和写入Modbus设备寄存器:
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout
import pymodbus.client.sync as modbus
class ModbusThread(QThread):
# 定义一个信号,用于在主线程中更新UI
update_signal = pyqtSignal(str)
def __init__(self, address, port, register, value=None):
super().__init__()
self.address = address
self.port = port
self.register = register
self.value = value
def run(self):
# 连接Modbus设备
client = modbus.ModbusTcpClient(self.address, self.port)
try:
# 读取或写入寄存器
if self.value is None:
result = client.read_holding_registers(self.register, 1)
self.update_signal.emit(str(result.registers[0]))
else:
client.write_register(self.register, self.value)
self.update_signal.emit("写入成功!")
except:
self.update_signal.emit("操作失败!")
finally:
client.close()
class ModbusWidget(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建控件
self.address_label = QLabel("设备地址:")
self.address_edit = QLineEdit("192.168.1.1")
self.port_label = QLabel("端口号:")
self.port_edit = QLineEdit("502")
self.register_label = QLabel("寄存器地址:")
self.register_edit = QLineEdit("0")
self.value_label = QLabel("写入的值:")
self.value_edit = QLineEdit()
self.read_button = QPushButton("读取")
self.write_button = QPushButton("写入")
self.result_label = QLabel()
# 创建布局
layout = QVBoxLayout()
layout.addWidget(self.address_label)
layout.addWidget(self.address_edit)
layout.addWidget(self.port_label)
layout.addWidget(self.port_edit)
layout.addWidget(self.register_label)
layout.addWidget(self.register_edit)
layout.addWidget(self.value_label)
layout.addWidget(self.value_edit)
layout.addWidget(self.read_button)
layout.addWidget(self.write_button)
layout.addWidget(self.result_label)
# 设置主窗口布局
self.setLayout(layout)
# 绑定事件处理函数
self.read_button.clicked.connect(self.read_register)
self.write_button.clicked.connect(self.write_register)
def read_register(self):
# 创建线程,读取寄存器
address = self.address_edit.text()
port = int(self.port_edit.text())
register = int(self.register_edit.text())
thread = ModbusThread(address, port, register)
thread.update_signal.connect(self.update_result)
thread.start()
def write_register(self):
# 创建线程,写入寄存器
address = self.address_edit.text()
port = int(self.port_edit.text())
register = int(self.register_edit.text())
value = int(self.value_edit.text())
thread = ModbusThread(address, port, register, value)
thread.update_signal.connect(self.update_result)
thread.start()
def update_result(self, result):
# 更新UI
self.result_label.setText(result)
if __name__ == '__main__':
app = QApplication([])
widget = ModbusWidget()
widget.show()
app.exec_()
在这个例程中,我们创建了一个继承自QThread的ModbusThread类,用于在后台线程中执行Modbus读写操作。我们还创建了一个继承自QWidget的ModbusWidget类,用于创建UI界面和处理事件。在read_register和write_register方法中,我们创建了ModbusThread实例并启动它,然后在update_result方法中更新UI。最后,在主程序中创建了一个QApplication实例,并显示了ModbusWidget。
原文地址: https://www.cveoy.top/t/topic/bIki 著作权归作者所有。请勿转载和采集!