如何用opcua-asyncio为OPC UA服务器创建缓存文件(树莓派适用)
为opcua-asyncio服务器创建缓存文件的最简方案
针对你的需求,opcua-asyncio的缓存功能核心是避免每次启动服务器时重复解析XML节点集文件,以此提升树莓派上的启动速度和运行性能。以下是可行的最简实现步骤:
1. 生成缓存文件
在服务器完成初始化并导入所有XML节点集后,调用export_cache方法将节点数据写入缓存文件。修改你的代码如下:
import asyncio import logging import sys from asyncua.common.ua_utils import value_to_datavalue sys.path.insert(0, "..") from asyncua import Server async def main(): logging.basicConfig(level=logging.INFO) server = Server() await server.init() server.set_endpoint("opc.tcp://localhost:4140") # 导入所有XML节点集 await server.import_xml("Opc.Ua.Di.Nodeset2.xml") await server.import_xml("Opc.Ua.Machinery.Nodeset2.xml") await server.import_xml("Opc.Ua.Pumps.Nodeset2.xml") await server.import_xml("custom.Nodeset.xml") # 生成缓存文件(只需运行一次) await server.export_cache("server_cache.pickle") logging.info("缓存文件已生成") # 启动服务器(生成缓存后可注释此段,后续直接加载缓存) async with server: while True: await asyncio.sleep(1) if __name__ == "__main__": asyncio.run(main())
运行这段代码一次,程序会在当前目录下生成server_cache.pickle缓存文件。
2. 加载缓存文件
缓存生成后,后续启动服务器时无需再导入XML节点集,直接加载缓存即可,修改代码如下:
import asyncio import logging import sys from asyncua.common.ua_utils import value_to_datavalue sys.path.insert(0, "..") from asyncua import Server async def main(): logging.basicConfig(level=logging.INFO) server = Server() await server.init() server.set_endpoint("opc.tcp://localhost:4140") # 直接加载缓存文件,替代XML导入步骤 await server.import_cache("server_cache.pickle") logging.info("缓存文件已加载") # 启动服务器 async with server: while True: await asyncio.sleep(1) if __name__ == "__main__": asyncio.run(main())
关键注意事项
- 缓存文件基于pickle序列化,仅适配相同版本的opcua-asyncio和Python环境,若依赖版本变更,需重新生成缓存。
- 树莓派运行时,确保缓存文件所在目录有读写权限,避免因权限问题导致缓存生成或加载失败。
- 若后续修改了XML节点集文件,必须重新生成缓存,否则服务器会使用旧的节点数据。
内容的提问来源于stack exchange,提问作者Ankit Mavani
相关产品推荐
相关产品推荐

