// 逐个扫点,速度较慢 public static void ScanPointSingle(BacDevice device, uint count) { if (device == null) { return; } var pid = BacnetPropertyIds.PROP_OBJECT_LIST; var device_id = device.DeviceId; var bobj = new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, device_id); var adr = device.Address; if (adr == null) { return; } device.Properties = new List <BacProperty>(); for (uint index = 1; index <= count; index++) { try { var list = ReadScalarValue(adr, bobj, pid, GetCurrentInvokeId(), index); if (list == null) { continue; } foreach (var bValue in list) { var strBValue = "" + bValue.Value; LogHelper.Log(pid + " , " + strBValue + " , " + bValue.Tag); var strs = strBValue.Split(':'); if (strs.Length < 2) { continue; } var strType = strs[0]; var strObjId = strs[1]; var subNode = new BacProperty(); BacnetObjectTypes otype; Enum.TryParse(strType, out otype); subNode.ObjectId = new BacnetObjectId(otype, Convert.ToUInt32(strObjId)); device.Properties.Add(subNode); } } catch (Exception exp) { LogHelper.Log("Error: " + index + " , " + exp.Message); } } }
// 获取子节点个数 public static uint GetDeviceArrayIndexCount(BacDevice device) { try { var adr = device.Address; if (adr == null) { return(0); } var list = ReadScalarValue(adr, new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, device.DeviceId), BacnetPropertyIds.PROP_OBJECT_LIST, 0, 0); var rst = Convert.ToUInt32(list.FirstOrDefault().Value); return(rst); } catch { } return(0); }
public static void ScanSubProperties(BacDevice device) { var adr = device.Address; if (adr == null) { return; } if (device.Properties == null) { return; } foreach (BacProperty subNode in device.Properties) { try { List <BacnetPropertyReference> rList = new List <BacnetPropertyReference>(); rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_DESCRIPTION, uint.MaxValue)); rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_REQUIRED, uint.MaxValue)); IList <BacnetReadAccessResult> lstAccessRst; var bRst = bacnetClient.ReadPropertyMultipleRequest(adr, subNode.ObjectId, rList, out lstAccessRst, GetCurrentInvokeId()); if (bRst) { foreach (var aRst in lstAccessRst) { if (aRst.values == null) { continue; } foreach (var bPValue in aRst.values) { if (bPValue.value == null || bPValue.value.Count == 0) { continue; } var pid = (BacnetPropertyIds)bPValue.property.propertyIdentifier; var bValue = bPValue.value.First(); var strBValue = "" + bValue.Value; LogHelper.Log(pid + " , " + strBValue + " , " + bValue.Tag); switch (pid) { case BacnetPropertyIds.PROP_DESCRIPTION: // 描述 { subNode.PROP_DESCRIPTION = bValue + ""; } break; case BacnetPropertyIds.PROP_OBJECT_NAME: // 点名 { subNode.PROP_OBJECT_NAME = bValue + ""; } break; case BacnetPropertyIds.PROP_PRESENT_VALUE: // 值 { subNode.PROP_PRESENT_VALUE = bValue.Value; } break; } } } } } catch (Exception exp) { LogHelper.Log("Error: " + exp.Message.ToString(), (int)LogHelper.Level.ERROR); } } }
// 批量扫点,注意不要太多,超过maxAPDU失败 public static void ScanPointsBatch(BacDevice device, uint count) { try { if (device == null) { return; } var pid = BacnetPropertyIds.PROP_OBJECT_LIST; var device_id = device.DeviceId; var bobj = new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, device_id); var adr = device.Address; if (adr == null) { return; } device.Properties = new List <BacProperty>(); List <BacnetPropertyReference> rList = new List <BacnetPropertyReference>(); for (uint i = 1; i < count; i++) { rList.Add(new BacnetPropertyReference((uint)pid, i)); if (i % scanBatchStep == 0 || i == count) // 不要超了 MaxAPDU { IList <BacnetReadAccessResult> lstAccessRst; var bRst = bacnetClient.ReadPropertyMultipleRequest(adr, bobj, rList, out lstAccessRst, GetCurrentInvokeId()); if (bRst) { foreach (var aRst in lstAccessRst) { if (aRst.values == null) { continue; } foreach (var bPValue in aRst.values) { if (bPValue.value == null) { continue; } foreach (var bValue in bPValue.value) { var strBValue = "" + bValue.Value; // mainform.Log(pid + " , " + strBValue + " , " + bValue.Tag); var strs = strBValue.Split(':'); if (strs.Length < 2) { continue; } var strType = strs[0]; var strObjId = strs[1]; var subNode = new BacProperty(); BacnetObjectTypes otype; Enum.TryParse(strType, out otype); if (otype == BacnetObjectTypes.OBJECT_NOTIFICATION_CLASS || otype == BacnetObjectTypes.OBJECT_DEVICE) { continue; } subNode.ObjectId = new BacnetObjectId(otype, Convert.ToUInt32(strObjId)); device.Properties.Add(subNode); } } } } rList.Clear(); } } } catch (Exception) { } }