如何使用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
相关推荐
唐叔在学习4 分钟前
才知道python还可以这样发消息提醒的
后端·python·程序员
天天睡大觉5 分钟前
Python学习1
开发语言·python·学习
Johny_Zhao6 分钟前
黑客msfconsole渗透工具超详细使用说明
linux·python·网络安全·信息安全·渗透测试·云计算·系统运维·攻防演练
luoluoal9 分钟前
基于python的旅游景点方面级别情感分析语料库与模型(源码+文档)
python·mysql·django·毕业设计·源码
directx3d_beginner12 分钟前
ifcconvert转换ifc为Obj
开发语言·python
滴啦嘟啦哒15 分钟前
【机械臂】【视觉】一、加入摄像机并实现世界坐标与像素坐标的互相转换
python·深度学习·vla
YJlio16 分钟前
Sysinternals 学习笔记(15.0):系统信息工具总览——RAMMap、RU、CoreInfo 等一网打尽
开发语言·笔记·python·学习·django·pdf·硬件架构
Root_Smile18 分钟前
【Python】pip freeze用法
开发语言·python·pip
qq_124987075319 分钟前
基于Hadoop的黑龙江旅游景点推荐系统的设计与实现(源码+论文+部署+安装)
大数据·hadoop·分布式·python·信息可视化
不过如此195126 分钟前
Jira系统中JQL语句的介绍
python·sql·jira