使用pyqt的modbus模块实现tcp 读取线圈
以下是使用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实例化。最后,我们启动应用程序的事件循环。
原文地址: https://www.cveoy.top/t/topic/bK3b 著作权归作者所有。请勿转载和采集!