- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想停止 pymodbus
async ModbusTcpServer
然后启动一个新服务器。因此,我尝试使用以下简化的代码片段,但出现错误:
from pymodbus.server.async import StartTcpServer, StopServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from time import sleep
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def main(name='Pymodbus'):
store = ModbusSlaveContext(hr=ModbusSequentialDataBlock(0, [17]*100))
context = ModbusServerContext(slaves=store, single=True)
identity = ModbusDeviceIdentification()
identity.VendorName = name
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/bashwork/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName = 'Pymodbus Server'
identity.MajorMinorRevision = '1.0'
StartTcpServer(
context,
identity=identity,
address=("localhost", 5020),
defer_reactor_run=True
)
sleep(3)
name += 'stuff'
StopServer()
sleep(3)
main(name) # Recursive
main()
输出:
INFO:pymodbus.server.async:Starting Modbus TCP Server on localhost:5020
DEBUG:pymodbus.server.async:Running in Main thread
Traceback (most recent call last):
File "stack.py", line 42, in <module>
main()
File "stack.py", line 38, in main
StopServer()
File "/usr/local/lib/python3.6/dist-packages/pymodbus/server/async.py", line 328, in StopServer
reactor.stop()
File "/usr/local/lib/python3.6/dist-packages/twisted/internet/base.py", line 630, in stop
"Can't stop reactor that isn't running.")
twisted.internet.error.ReactorNotRunning: Can't stop reactor that isn't running.
[更新]
另外,我尝试用另一个线程停止 ModbusTcpServer
,在 ModbusTcpServer
中使用 defer_reactor_run=False
参数(默认),但尽管如此,行为仍然相同:
import threading
import logging
from pymodbus.server.async import StartTcpServer, StopServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def stop():
StopServer()
def main(name='Pymodbus'):
store = ModbusSlaveContext(hr=ModbusSequentialDataBlock(0, [17]*100))
context = ModbusServerContext(slaves=store, single=True)
identity = ModbusDeviceIdentification()
identity.VendorName = name
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/bashwork/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName = 'Pymodbus Server'
identity.MajorMinorRevision = '1.0'
t = threading.Timer(5, stop)
t.daemon = True
t.start()
StartTcpServer(
context,
identity=identity,
address=("localhost", 5020),
defer_reactor_run=False
)
name += 'stuff'
main(name) # Recursive
main()
输出:
INFO:pymodbus.server.async:Starting Modbus TCP Server on localhost:5020
DEBUG:pymodbus.server.async:Running in Main thread
DEBUG:pymodbus.server.async:Running in spawned thread
DEBUG:pymodbus.server.async:Stopping Server from another thread
INFO:pymodbus.server.async:Starting Modbus TCP Server on localhost:5020
DEBUG:pymodbus.server.async:Running in Main thread
Traceback (most recent call last):
File "stack.py", line 41, in <module>
main()
File "stack.py", line 39, in main
main() # Recursive
File "stack.py", line 35, in main
defer_reactor_run=False
File "/usr/local/lib/python3.6/dist-packages/pymodbus/server/async.py", line 257, in StartTcpServer
reactor.run(installSignalHandlers=_is_main_thread())
File "/usr/local/lib/python3.6/dist-packages/twisted/internet/base.py", line 1260, in run
self.startRunning(installSignalHandlers=installSignalHandlers)
File "/usr/local/lib/python3.6/dist-packages/twisted/internet/base.py", line 1240, in startRunning
ReactorBase.startRunning(self)
File "/usr/local/lib/python3.6/dist-packages/twisted/internet/base.py", line 748, in startRunning
raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
最佳答案
我找到了另一种解决方案,可以通过另一个 Python 代码停止和启动 Async ModbusTcpServer,因为显然,我们无法重新启动 reactor
事件循环。
这是 runner.py
代码:
import subprocess
python_version = '3'
path_to_run = './'
py_name = 'async_server.py'
def run():
args = [f"python{python_version}", f"{path_to_run}{py_name}"]
sub_process = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = sub_process.communicate()
if not error_:
print(output)
else:
print(error_)
run() # Recursively.
if __name__ == '__main__':
run()
这是 async_server.py
代码片段:
from pymodbus.server.async import StartTcpServer, StopServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
import threading
import sys
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s'
' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def stop():
print('Process will be down.')
StopServer() # Stop server.
sys.exit(0) # Kill the server code.
def run_async_server():
store = ModbusSlaveContext(hr=ModbusSequentialDataBlock(0, [17] * 100))
slaves = {
0x01: store,
0x02: store,
0x03: store,
}
context = ModbusServerContext(slaves=slaves, single=False)
identity = ModbusDeviceIdentification()
identity.VendorName = 'Pymodbus'
identity.ProductCode = 'PM'
identity.VendorUrl = 'http://github.com/bashwork/pymodbus/'
identity.ProductName = 'Pymodbus Server'
identity.ModelName = 'Pymodbus Server'
identity.MajorMinorRevision = '1.5'
from twisted.internet import reactor
StartTcpServer(context, identity=identity, address=("localhost", 5020),
defer_reactor_run=True)
print('Start an async server.')
t = threading.Timer(5, stop)
t.daemon = True
t.start()
reactor.run()
print('Server was stopped.')
if __name__ == "__main__":
run_async_server()
输出:
$ python3 runner.py
2019-01-24 12:45:05,126 MainThread INFO async :254 Starting Modbus TCP Server on localhost:5020
2019-01-24 12:45:10,129 Thread-1 DEBUG async :222 Running in spawned thread
2019-01-24 12:45:10,129 Thread-1 DEBUG async :332 Stopping Server from another thread
b'Start an async server.\nProcess will be down.\nServer was stopped.\n'
2019-01-24 12:45:13,389 MainThread INFO async :254 Starting Modbus TCP Server on localhost:5020
2019-01-24 12:45:18,392 Thread-1 DEBUG async :222 Running in spawned thread
2019-01-24 12:45:18,392 Thread-1 DEBUG async :332 Stopping Server from another thread
b'Start an async server.\nProcess will be down.\nServer was stopped.\n'
2019-01-24 12:45:21,653 MainThread INFO async :254 Starting Modbus TCP Server on localhost:5020
2019-01-24 12:45:26,656 Thread-1 DEBUG async :222 Running in spawned thread
2019-01-24 12:45:26,657 Thread-1 DEBUG async :332 Stopping Server from another thread
b'Start an async server.\nProcess will be down.\nServer was stopped.\n'
.
.
.
关于python - 如何停止 pymodbus 异步 ModbusTcpServer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54308367/
我是 python 和 modbus 的初学者,现在我正在尝试使用 pymodbus 控制连接到串行端口的风扇几个小时。使用制造商的专有软件,我能够控制风扇,因此连接本身有效。然而,我自己的代码没有。
谁能解释如何通过 Modbus TCP/IP 使用 pymodbus 以正确的方式创建请求并获得响应? 我有 PLC,我想将其用作从站,PC 用作主站。 我尝试这样做: from pymodbus.c
我被指派在没有任何文档的情况下执行该任务。我在从 MODBUS 读取数据时遇到问题。这是我能够创建的脚本: from pymodbus.constants import Endian from pym
我对 pymodbus 相当陌生,我正在尝试使用 pymodbus 读取协作机器人的保存寄存器以获取当前 z 坐标的值。此类信息位于 7053 地址。我查看了较旧的问题,但无法让我的代码工作: fro
我有 pymodbus TcpClient 超时问题: import logging from pymodbus.client.sync import ModbusTcpClient logging.
我是 docker 和 Modbus 的新手,我正在尝试使用 Modbus(准确地说是 pymodbus 工具包)编写自定义客户端/服务器应用程序,我可能遇到了 docker 的一些问题。 我试过示例
我有一个 python 脚本,可以使用 pymodbus 库处理 Modbus 事务。为了进行故障排除,我想打印发送和接收到设备的原始字节,最好以十六进制格式。 这是简化的代码,请参阅底部的注释以获取
我有一些在 pymodbus 1.2 下编写的 modbus TCP 代码相关代码是 result = modbus_client.read_holding_registers(40093, 3) 在
如何从 Register with pymodbus 中读取数据? 我正在尝试这段代码: import pymodbus from pymodbus.pdu import ModbusRequest
我写了一个测试代码,它从 PLC 的 modbus 服务器读取一些线圈/寄存器。当我调用一个请求时,代码有效。我拔下电缆,然后 Twisted 调用 clientConnectionLost 函数,这
我对 Modbus 和 PyModBus 很陌生,但是我花了很多时间尝试阅读和试验它。如果有人能指出我正确的方向,我将不胜感激…… 我在寄存器 40001、40003、40005 和 40007(分别
我正在对 PLC 设备(Moxa ioLogik E1214)进行编程,并将 DI 端口连接到按钮,并将线圈连接到 LED 灯。这个想法是,当您按下按钮时,LED 应该亮起。 如果您按住按钮直到执行读
我正在尝试从Modbus TCP读取字符串(Usecase-1)和一个请求中的多种类型的数据(Usecase-2)数据 em> 设备,但是无法正确解码。 系统配置: Python 3.6.5 Pymo
希望你做得很好!我最近开始使用 python 进行 modbus 通信。我想澄清我的一些疑虑。 哪个模块更适合使用 Python 实现 modbus - minimalmodbus、pymodbus、
我想停止 pymodbus async ModbusTcpServer 然后启动一个新服务器。因此,我尝试使用以下简化的代码片段,但出现错误: from pymodbus.server.async i
一般来说,我是 pymodbus 和 modbus 的新手,我已经尝试了一段时间直接添加一个 float 到服务器上下文没有任何成功,我想知道你是否有任何关于如何去做的线索。我已经尝试通过执行以下操作
我使用 pymodbus 读取并解码 float_32 值。 之前,我使用以下代码简单地对其进行解码: from pymodbus.client.sync import ModbusTcpClient
当我尝试使用 pymodbus 和 raspberry pi 读取保持寄存器时遇到问题。我似乎无法同时连接两个服务器/从属设备(一个或另一个都可以工作,但在一起,我无法从两个设备读取寄存器)。这些连接
我已经开始使用 pymodbus 从 modbus 读取值以存储在异地数据库中。我一直在努力解决响应中收到的值与我在 Jace 上看到的值不同的问题。 我也尝试过 modbus-tk 并且我得到了同样
我正在做一个项目,我有两个都安装了 Pymodbus 的 Debian 虚拟机。我正在尝试设置一个虚拟测试环境,在其中我可以在它们通信时从第三个 Kali VM 对两者执行各种网络攻击。不幸的是,我对
我是一名优秀的程序员,十分优秀!