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

如何使用.NET BACnet库批量读取多个设备对象的单一属性

读取多个设备对象的单一属性方案

针对你使用的BACnet .NET Library,要读取同一设备下多个对象的单一属性(例如PROP_PRESENT_VALUE),可以基于你已实现的ReadScalarValue方法封装批量读取逻辑,或者利用库的ReadPropertyMultipleRequest优化请求效率。以下是具体实现:

方案一:基于现有方法循环读取

直接遍历目标对象集合,调用你已验证可用的ReadScalarValue方法,收集每个对象的属性值:

private Dictionary<BacnetObjectId, string> ReadMultipleObjectsSingleProperty(
    BacnetClient sender, 
    BacnetAddress adr, 
    IEnumerable<BacnetObjectId> objectIds, 
    BacnetPropertyIds targetProperty)
{
    var valueMap = new Dictionary<BacnetObjectId, string>();
    foreach (var objId in objectIds)
    {
        valueMap[objId] = ReadScalarValue(sender, adr, objId, targetProperty);
    }
    return valueMap;
}

方案二:用ReadPropertyMultipleRequest批量读取

该方法通过一次网络请求完成多个对象属性的读取,相比循环调用更高效,适合对象数量较多的场景:

private Dictionary<BacnetObjectId, string> ReadMultipleObjectsSinglePropertyWithBatch(
    BacnetClient sender, 
    BacnetAddress adr, 
    IEnumerable<BacnetObjectId> objectIds, 
    BacnetPropertyIds targetProperty)
{
    var valueMap = new Dictionary<BacnetObjectId, string>();
    try
    {
        // 构建批量读取的属性引用列表
        var propertyRefs = new List<BacnetPropertyReference>();
        foreach (var objId in objectIds)
        {
            propertyRefs.Add(new BacnetPropertyReference(objId, targetProperty));
        }

        IList<BacnetReadAccessResult> readResults;
        if (sender.ReadPropertyMultipleRequest(adr, propertyRefs, out readResults))
        {
            foreach (var result in readResults)
            {
                if (result.Error == BacnetErrorCodes.SUCCESS && result.Values?.Count > 0)
                {
                    valueMap[result.ObjectId] = result.Values.First().Value?.ToString() ?? string.Empty;
                }
                else
                {
                    valueMap[result.ObjectId] = string.Empty;
                }
            }
        }
    }
    catch
    {
        // 异常兜底:给未读取到的对象赋值空字符串
        foreach (var objId in objectIds)
        {
            if (!valueMap.ContainsKey(objId))
            {
                valueMap[objId] = string.Empty;
            }
        }
    }
    return valueMap;
}

使用说明

  • 两种方法都需要传入目标设备地址、待读取的对象ID集合、要获取的属性(如PROP_PRESENT_VALUE)
  • 方案一逻辑简单易维护,方案二则能减少网络交互次数,提升读取效率

内容的提问来源于stack exchange,提问作者Zain Ul Abidin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:18:12