Python pymodbus:正在运行的服务器的更新上下文

Python pymodbus:正在运行的服务器的更新上下文,python,modbus,pymodbus,Python,Modbus,Pymodbus,我有一个运行的ModbusRTU服务器,如下示例。 我知道如何更新上下文,但无法更新正在运行的服务器的上下文 当我在run_updatening_server()函数中更新上下文时(在StartSerialServer()之前),它就可以正常工作了。 但是,当我试图通过调用update_writer(context)来更新正在运行的上下文时,它不会更新 同时,使用更新_writer()调用我自己的函数“getUpdatedContext()”也不起作用: def更新_写入程序(a): a=(ge

我有一个运行的ModbusRTU服务器,如下示例。 我知道如何更新上下文,但无法更新正在运行的服务器的上下文

当我在run_updatening_server()函数中更新上下文时(在StartSerialServer()之前),它就可以正常工作了。 但是,当我试图通过调用update_writer(context)来更新正在运行的上下文时,它不会更新

同时,使用更新_writer()调用我自己的函数“getUpdatedContext()”也不起作用:

def更新_写入程序(a):
a=(getContext(),)
“”“每隔一段时间运行一次的辅助进程,并且
更新上下文的实时值。应注意
更新存在竞争条件。
:param arguments:调用的输入参数
"""
调试(“更新上下文”)
上下文=a[0]
寄存器=3
从机id=0x41
地址=0x10
values=context[slave\u id].getValues(寄存器、地址、计数=5)
值=[v+1表示值中的v]
log.debug(“新值:”+str(值))
上下文[slave_id]。设置值(寄存器、地址、值)
getContext():

def getContext():
store=ModbusSlaveContext(
di=ModbusSequentialDataBlock(0,[17]*100),
co=ModbusSequentialDataBlock(0,[17]*100),
hr=ModbusSequentialDataBlock(0,[17]*100),
ir=ModbusSequentialDataBlock(0[17]*100))
store.setValues(5,1[0])
上下文=ModbusServerContext(从服务器=存储,单服务器=真)
返回上下文
我的完整代码:

#/usr/bin/env python
导入操作系统
导入系统
"""
具有更新线程的Pymodbus服务器
--------------------------------------------------------------------------
这是一个后台线程更新
服务器运行时的上下文。这也可以通过
python线程::
从线程导入线程
线程=线程(目标=更新写入程序,参数=(上下文,))
thread.start()
"""
# --------------------------------------------------------------------------- #
#导入我们需要的modbus库
# --------------------------------------------------------------------------- #
从pymodbus.server.asynchronous导入StartSerialServer
从pymodbus.device导入Modbus设备标识
从pymodbus.datastore导入ModbusSequentialDataBlock
从pymodbus.datastore导入ModbusSlaveContext、ModbusServerContext
从pymodbus.transaction导入modbusrutframer、modbusasiframer
# --------------------------------------------------------------------------- #
#导入我们需要的扭曲库
# --------------------------------------------------------------------------- #
从twisted.internet.task导入循环调用
# --------------------------------------------------------------------------- #
#配置服务日志记录
# --------------------------------------------------------------------------- #
导入日志记录
logging.basicConfig()文件
log=logging.getLogger()
log.setLevel(logging.DEBUG)
# --------------------------------------------------------------------------- #
#定义回调过程
# --------------------------------------------------------------------------- #
def更新_写入程序(a):
“”“每隔一段时间运行一次的辅助进程,并且
更新上下文的实时值。应注意
更新存在竞争条件。
:param arguments:调用的输入参数
"""
调试(“更新上下文”)
上下文=a[0]
寄存器=3
从机id=0x41
地址=0x10
values=context[slave\u id].getValues(寄存器、地址、计数=5)
值=[v+1表示值中的v]
log.debug(“新值:”+str(值))
上下文[slave_id]。设置值(寄存器、地址、值)
def运行_更新_服务器():
# ----------------------------------------------------------------------- # 
#初始化数据存储
# ----------------------------------------------------------------------- # 
store=ModbusSlaveContext(
di=ModbusSequentialDataBlock(0,[17]*100),
co=ModbusSequentialDataBlock(0,[17]*100),
hr=ModbusSequentialDataBlock(0,[17]*100),
ir=ModbusSequentialDataBlock(0[17]*100))
上下文=ModbusServerContext(从服务器=存储,单服务器=真)
# ----------------------------------------------------------------------- # 
#初始化服务器信息
# ----------------------------------------------------------------------- # 
标识=ModbusDeviceIdentification()
identity.VendorName='pymodbus'
identity.ProductCode='PM'
identity.VendorUrl=http://github.com/bashwork/pymodbus/'
identity.ProductName='pymodbus服务器'
identity.ModelName='pymodbus服务器'
identity.MajorMinorRevision='2.2.0'
# ----------------------------------------------------------------------- # 
#运行所需的服务器
# ----------------------------------------------------------------------- # 
时间=5
loop=LoopingCall(f=updateing\u writer,a=(context,))
loop.start(time,now=False)#最初按时间延迟
log.debug(“::启动Modbus RTU服务器::”)
#RTU:
StartSerialServer(上下文,framer=ModBusRTFramer,identity=identity,
端口='/dev/ttyUSB0',
超时=2,
波特率=115200,
奇偶性='E',
bytesize=8,
停止位=1)
def main():
pid=str(os.getpid())
文件名='ModBusUpdatengServer.pid'
pidfile=str(os.getcwd())+'/'+文件名
如果os.path.isfile(pidfile):
打印(文件名+“已存在\n正在退出”)
sys.exit()
打开(pid文件,'w')。写入(pid)
尝试:
#运行服务器
运行\u更新\u服务器()
最后:
取消链接(pidfile)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
我想从另一个python脚本更新上下文,我尝试了:

  • 正在调用更新写入程序