以下是一个使用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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录