You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务器设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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:55:20