以下是使用pyqt的modbus模块实现tcp读取线圈的示例代码:

from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QTextCursor
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtNetwork import QModbusTcpClient, QModbusDataUnit, QModbusException

class ModbusClient(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(ModbusClient, self).__init__(parent)

        self.setWindowTitle("Modbus Client")
        self.resize(400, 300)

        self.host = "localhost"
        self.port = 502
        self.client = QModbusTcpClient(self)
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.read_coils)

        self.coil_address = 0
        self.coil_count = 10

        self.connect_button = QtWidgets.QPushButton("Connect")
        self.connect_button.clicked.connect(self.connect_to_server)

        self.read_button = QtWidgets.QPushButton("Read Coils")
        self.read_button.clicked.connect(self.read_coils)

        self.result_text = QtWidgets.QTextEdit(self)
        self.result_text.setReadOnly(True)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.connect_button)
        layout.addWidget(self.read_button)
        layout.addWidget(self.result_text)

        self.setLayout(layout)

    def connect_to_server(self):
        if not self.client.isConnected():
            self.client.setConnectionParameter(QModbusTcpClient.NetworkAddressParameter, self.host)
            self.client.setConnectionParameter(QModbusTcpClient.NetworkPortParameter, self.port)

            if not self.client.connectToServer():
                QMessageBox.critical(self, "Error", "Cannot connect to server")

            else:
                self.result_text.setText("Connected to server")
                self.timer.start(1000)

        else:
            self.client.disconnectFromServer()
            self.result_text.setText("Disconnected from server")
            self.timer.stop()

    def read_coils(self):
        if not self.client.isConnected():
            return

        request = QModbusDataUnit(QModbusDataUnit.Coils, self.coil_address, self.coil_count)

        if auto:
            self.coil_address += self.coil_count
            if self.coil_address > 65535:
                self.coil_address = 0

        reply = self.client.sendReadRequest(request, 1)

        if reply.isFinished():
            if reply.error() == QModbusException.NoError:
                values = reply.result().values()
                self.result_text.moveCursor(QTextCursor.End)
                self.result_text.insertPlainText(str(values) + "\n")
            else:
                self.result_text.moveCursor(QTextCursor.End)
                self.result_text.insertPlainText("Error: " + reply.errorString() + "\n")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    client = ModbusClient()
    client.show()
    sys.exit(app.exec_())

在上面的代码中,我们创建了一个名为ModbusClient的类,该类继承自QWidget,并包含以下主要方法:

  • connect_to_server():此方法用于连接到Modbus服务器。如果连接成功,则启动一个定时器以定期读取线圈。如果已经连接,则断开连接。
  • read_coils():此方法用于读取线圈。如果自动读取线圈,则每次读取完毕后自动增加线圈地址。读取结果将显示在结果文本框中。

__main__函数中,我们创建了一个应用程序实例,并将ModbusClient实例化。最后,我们启动应用程序的事件循环。

使用pyqt的modbus模块实现tcp 读取线圈

原文地址: https://www.cveoy.top/t/topic/bK3b 著作权归作者所有。请勿转载和采集!

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