python - Pymodbus:在 StopServer -> StartSerialServer 之后不起作用(无法打开端口:PermissionError)
问题描述
版本: Python:3.9 | Pymodbus:2.5.1
Pymodbus 特定:服务器:rtu - 同步/异步 | 客户端:rtu - 同步/异步
描述:
在我的应用程序中,我想启动一个 SerialServer,它可以被通过 RTU 连接的客户端读取。在客户端读取我想要停止服务器的值之后。此时用户应该能够自己更改一些值并再次启动 SerialServer。正好第二次启动 SerialServer 是不行的,因为服务器打不开端口。
from pymodbus.version import version
from pymodbus.server.asynchronous import StartSerialServer, StopServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSparseDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer
import time
import sys
import threading
from qtpy import QtWidgets
app = QtWidgets.QApplication(sys.argv)
def modbus_server_start():
print("Modbus-Server start:")
class CustomDataBlock(ModbusSparseDataBlock):
def setValues(self, address, value):
super(CustomDataBlock, self).setValues(0, value_1)
super(CustomDataBlock, self).setValues(1, 11)
super(CustomDataBlock, self).setValues(2, 12)
block = CustomDataBlock({0: [0] * 100})
store = ModbusSlaveContext(hr=block)
context = ModbusServerContext(slaves=store)
identity = ModbusDeviceIdentification()
identity.VendorName = 'pymodbus'
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/riptideio/pymodbus/'
identity.ProductName = 'pymodbus Server'
identity.ModelName = 'pymodbus Server'
identity.MajorMinorRevision = version.short()
StartSerialServer(context, framer=ModbusRtuFramer, identity=identity, port='COM6', timeout=0.05, baudrate=19200)
def server_start():
print("Start an async server.")
t = threading.Thread(target=modbus_server_start)
t.daemon = True
t.start()
def modbus_server_stop():
stopthread = threading.Thread(target=stop)
stopthread.daemon = True
stopthread.start()
print("Server was stopped.")
def stop():
print("Process will be down.")
StopServer() # Stop server.
sys.exit(0) # Kill the server code.
window = QtWidgets.QMainWindow()
window.setWindowTitle("StartSerialServer")
window.setGeometry(500, 500, 400, 125)
button = QtWidgets.QPushButton(window)
button.setText("Start")
button.setGeometry(0, 0, 60, 30)
button.show()
button.clicked.connect(server_start)
button2 = QtWidgets.QPushButton(window)
button2.setText("Stop")
button2.setGeometry(100, 0, 60, 30)
button2.show()
button2.clicked.connect(modbus_server_stop)
combobox = QtWidgets.QComboBox(window)
combobox.setGeometry(50, 40, 60, 30)
combobox.addItem("")
combobox.addItem("")
combobox.addItem("")
combobox.addItem("")
combobox.addItem("")
combobox.setItemText(0, "0")
combobox.setItemText(1, "10")
combobox.setItemText(2, "20")
combobox.setItemText(3, "30")
combobox.setItemText(4, "40")
combobox.show()
global value_1
value_1 = combobox.currentText()
window.show()
sys.exit(app.exec_())
错误代码:
Start an async server.
Modbus-Server start:
Process will be down.
Server was stopped.
Exception in thread Thread-4:
Traceback (most recent call last):
File "C:\Python32\lib\threading.py", line 954, in _bootstrap_inner
Start an async server.
Modbus-Server start:
self.run()
File "C:\Python32\lib\threading.py", line 892, in run
self._target(*self._args, **self._kwargs)
File "C:\Python32\Projekte\Pymodbus-Test\github_issue.py", line 36, in modbus_server_start
StartSerialServer(context, framer=ModbusRtuFramer, identity=identity, port='COM6', timeout=0.05, baudrate=19200)
File "C:\Python32\Projekte\Pymodbus-Test\venv\lib\site-packages\pymodbus\server\asynchronous.py", line 340, in StartSerialServer
SerialPort(protocol, port, reactor, baudrate=baudrate, parity=parity,
File "C:\Python32\Projekte\Pymodbus-Test\venv\lib\site-packages\twisted\internet\_win32serialport.py", line 44, in __init__
self._serial = self._serialFactory(
File "C:\Python32\Projekte\Pymodbus-Test\venv\lib\site-packages\serial\serialwin32.py", line 33, in __init__
super(Serial, self).__init__(*args, **kwargs)
File "C:\Python32\Projekte\Pymodbus-Test\venv\lib\site-packages\serial\serialutil.py", line 244, in __init__
self.open()
File "C:\Python32\Projekte\Pymodbus-Test\venv\lib\site-packages\serial\serialwin32.py", line 64, in open
raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port 'COM6': PermissionError(13, 'Zugriff verweigert', None, 5)
我想过关闭并重新打开服务器,但这也不起作用。
也许有人可以帮我解决这个问题。:)
解决方案
推荐阅读
- javascript - 我的图像在旋转时没有占据画布的整个宽度
- javascript - HTTP拦截器使用离子/角度导致CORS问题
- r - 将字符串拆分为单个字符,计算每个字符出现的次数,然后组合成单个 df/matrix
- php - WooCommerce 产品自定义循环由一系列 SKU 过滤
- amazon-s3 - 使用 Helm 在 Spinnaker 上配置 S3
- angular - 无法在 Angular 10 中处理 HttpClient
- postgresql - Citus PostgresQL 需要注意哪些设置
- citus - 将数据同步到插入时离线的节点(Citus)
- ssl - FreeRTOS+TCP 和 mbedTLS+TCP
- python - Python Netmiko,我可以将我的脚本指向一个包含 IP 列表的文本文件吗?