如何使用.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
相关产品推荐
相关产品推荐

