如何使用asyncua模块在opcua的Server端添加值为列表的变量?

1. Server添加变量,如何实现变量数据值为列表

搜索文心一言,得到的解决办法如下:

给出的示例代码如下:

复制代码
from asyncua import ua, Server  

# 假设server实例已经创建并初始化  
# ...  

# 定义数组变量的数据类型(这里以Int32数组为例)  
# OPC UA中的数组类型是通过指定基本数据类型和数组维度来定义的  
# 在这个例子中,我们创建一个一维的Int32数组  
array_type = ua.VariantType.Int32 | ua.VariantType.Array  # OPC UA中的数组类型是通过组合基本类型和Array标志来指定的  

# 添加变量,指定变量名、数据类型和其他属性  
myArrayVariable = await server.nodes.objects.add_variable(  
    0, "myArrayVariable", ua.Variant([], array_type),  # 初始值设置为空数组,数据类型为Int32数组  
    # 其他属性,如access_level、user_access_level等可以根据需要设置  
)  

# 注意:ua.Variant([], array_type)中的空列表是初始值,你可以替换为实际的数组值  

# ...  
# 服务器启动和运行代码  
# ...

注意事项:

数组的大小和维度在OPC UA中通常不是固定的,除非你在类型定义中指定了它们。因此,上述示例中的数组是一个动态数组,其大小可以在运行时更改。

在添加变量时,你提供的初始值(在本例中是空数组[])将作为变量的初始状态。你可以根据需要将其替换为实际的数组值。

客户端在读取或写入该变量时,将使用OPC UA的数据编码和解码机制来处理数组数据。因此,确保客户端也支持相同的数据类型和处理机制。

上述代码实测发现,并不支持ua.VariantType.Array数组这种数据类型,关键代码为ua.Variant([], ua.VariantType.Int32),可以实现add_variable方法支持变量取值为列表。

复制代码
myArrayVariable = await server.nodes.objects.add_variable(  
    0, "myArrayVariable", ua.Variant([], ua.VariantType.Int32),  # 初始值设置为空数组,数据类型为Int32数组  

2. 解决Server添加方法,数据类型为不支持list问题

同理,考虑将OPCUA不支持的数据类型转成支持的数据类型,Server添加方法,输入数据类型为列表时,可以使用ua.VariantType.Variant数据类型,在Client加载该方法时,使用ua.Variant([1, 2, 16, 19, 216])将列表转换成ua.VariantType.Variant数据类型,实测发现该种方式得到的输入参数数据类型为list,不影响方法的执行。

示例代码如下:

复制代码
await method.add_method(ua.NodeId('MyMethod', idx), ua.QualifiedName('MyMethod', idx), func, [ua.VariantType.Variant], [ua.VariantType.Boolean])

await method_obj.call_method(ua.NodeId('MyMethod', idx), ua.Variant([1, 2, 16, 19, 216]))

3. opcua数据类型枚举

Python的OPCUA库

复制代码
opcua数据类型枚举

1. Null = 0
2. Boolean = 1
3. SByte = 2
4. Byte = 3
5. Int16 = 4
6. UInt16 = 5
7. Int32 = 6
8. UInt32 = 7
9. Int64 = 8
10. UInt64 = 9
11. Float = 10
12. Double = 11
13. String = 12
14. DateTime = 13
15. Guid = 14
16. ByteString = 15
17. XmlElement = 16
18. NodeId = 17
19. ExpandedNodeId = 18
20. StatusCode = 19
21. QualifiedName = 20
22. LocalizedText = 21
23. ExtensionObject = 222
24. DataValue = 23
25. Variant = 24
26. DiagnosticInfo = 25

#实例
28. ua.VariantType.Boolean
29. ua.VariantType.String
30. ua.VariantType.Int16
31. ua.VariantType.Int32
32. ua.VariantType.UInt32
33. ua.VariantType.Float
34. ua.VariantType.Byte
相关推荐
百锦再1 天前
第11章 泛型、trait与生命周期
android·网络·人工智能·python·golang·rust·go
zbhbbedp282793cl1 天前
如何在VSCode中安装Python扩展?
ide·vscode·python
Python私教1 天前
Python 开发环境安装与配置全指南(2025版)
开发语言·python
百锦再1 天前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
熠熠仔1 天前
QGIS 3.34+ 网络分析基础数据自动化生成:从脚本到应用
python·数据分析
测试19981 天前
Appium使用指南与自动化测试案例详解
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
神仙别闹1 天前
基于 C++和 Python 实现计算机视觉
c++·python·计算机视觉
hongjianMa1 天前
【论文阅读】Hypercomplex Prompt-aware Multimodal Recommendation
论文阅读·python·深度学习·机器学习·prompt·推荐系统
饼干,1 天前
第23天python内容
开发语言·python
酷柚易汛智推官1 天前
基于librespot的定制化Spotify客户端开发:开源替代方案的技术实践与优化
python·开源·酷柚易汛