服务器设ValueRank为Any(-2)且无ArrayDimensions,opcua-asyncio如何运行时获取
获取OPC UA节点的ValueRank和ArrayDimensions(opcua-asyncio)
在opcua-asyncio中,你可以通过两种方式获取目标节点的ValueRank和ArrayDimensions参数:
1. 直接读取节点的属性
ValueRank和ArrayDimensions是OPC UA Variable节点的标准属性,你可以通过read_attribute方法直接读取这两个属性的值:
from asyncua import Client, ua async def get_node_metadata(node): # 读取ValueRank属性 val_rank_attr = await node.read_attribute(ua.AttributeIds.ValueRank) value_rank = val_rank_attr.Value.Value # 读取ArrayDimensions属性 arr_dim_attr = await node.read_attribute(ua.AttributeIds.ArrayDimensions) array_dimensions = arr_dim_attr.Value.Value if arr_dim_attr.Value.Value else None return value_rank, array_dimensions
调用示例:
async def main(): async with Client(url="opc.tcp://your-server-url") as client: node = client.get_node("ns=2;s=YourVariableNode") value_rank, array_dimensions = await get_node_metadata(node) print(f"ValueRank: {value_rank}, ArrayDimensions: {array_dimensions}") if __name__ == "__main__": import asyncio asyncio.run(main())
当服务器设置ValueRank为Any(-2)且未配置ArrayDimensions时,array_dimensions会返回空列表或None,你可以根据实际返回值做判断。
2. 从read_value()返回的DataValue中提取元数据
根据罗克韦尔文档的描述,read_value()返回的DataValue对象包含自描述信息,你可以从其内部的Variant对象中获取相关参数:
async def get_metadata_from_read_value(node): data_value = await node.read_value() variant = data_value.Value # 获取ValueRank value_rank = variant.ValueRank # 获取ArrayDimensions array_dimensions = variant.ArrayDimensions if variant.ArrayDimensions else None return value_rank, array_dimensions
这种方式无需额外发起属性读取请求,直接复用read_value()的返回结果,适合需要同时获取变量值和元数据的场景。
注意事项
- 当
ValueRank为-2(Any)时,变量值可能是单个值或任意维度的数组,ArrayDimensions未设置时通常返回空列表,代表数组维度由实际值的结构决定。 - 确保你有权限读取目标节点的属性,部分服务器可能会限制属性读取的访问权限。
内容的提问来源于stack exchange,提问作者Daniel Mierswa
相关产品推荐
相关产品推荐

