当前位置: 首页 > news >正文

如何使用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

相关文章:

  • Office 2021 mac/win版:智慧升级,办公新风尚
  • 【大数据】计算引擎:Spark核心概念
  • L50--- 104. 二叉树的最大深度(深搜)---Java版
  • windows11 建立批处理bat文件来删除指定目录下的所有隐藏的文件。
  • mysql_ssl_rsa_setup使用详解
  • 【Mysql】 深入理解MySQL的执行计划
  • 【云原生】创建harbor私有仓库及使用aliyun个人仓库
  • 果园预售系统的设计
  • 生命在于学习——Python人工智能原理(3.3)
  • 解决浏览器缩放的时候,重新设置滚动条的位置,使页面滚动条固定悬浮在页面底部
  • 尝试用 GPT-4o 写 2024高考语文作文
  • Unity射击游戏开发教程:(27)创建带有百分比的状态栏
  • 课设--学生成绩管理系统
  • Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】
  • C# —— 字符串拼接
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • CAP 一致性协议及应用解析
  • Date型的使用
  • ECMAScript6(0):ES6简明参考手册
  • Java基本数据类型之Number
  • Java知识点总结(JavaIO-打印流)
  • magento 货币换算
  • Python_OOP
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue数据传递--我有特殊的实现技巧
  • Zepto.js源码学习之二
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 仿天猫超市收藏抛物线动画工具库
  • 关于Java中分层中遇到的一些问题
  • 入口文件开始,分析Vue源码实现
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 试着探索高并发下的系统架构面貌
  • 与 ConTeXt MkIV 官方文档的接驳
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​如何使用QGIS制作三维建筑
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (5)STL算法之复制
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (离散数学)逻辑连接词
  • (十八)三元表达式和列表解析
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)负载均衡,回话保持,cookie
  • (转)用.Net的File控件上传文件的解决方案
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)Linux网络编程入门
  • (自用)仿写程序
  • ****三次握手和四次挥手