//获取子节点个数 public uint GetDeviceArrayIndexCount(BacNode 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); }
/// <summary> /// 扫描设备 /// </summary> public void ScanPointsBatch(BacNode device, uint deviceCount, 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.Clear(); List <BacnetPropertyReference> rList = new List <BacnetPropertyReference>(); for (uint i = 0; i < count; i++) { rList.Add(new BacnetPropertyReference((uint)pid, i)); if ((i != 0 && i % deviceCount == 0) || i == count - 1)//不要超了 MaxAPDU { IList <BacnetReadAccessResult> lstAccessRst; var bRst = Bacnet_client.ReadPropertyMultipleRequest(adr, bobj, rList, out lstAccessRst, this.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; //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 exp) { Log("Err:" + exp.Message); } }
/// <summary> /// 扫描属性 /// </summary> /// <param name="device"></param> private void ScanSubProperties(BacNode 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)); rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_OBJECT_NAME, uint.MaxValue)); rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_PRESENT_VALUE, uint.MaxValue)); IList <BacnetReadAccessResult> lstAccessRst; var bRst = Bacnet_client.ReadPropertyMultipleRequest(adr, subNode.ObjectId, rList, out lstAccessRst, this.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; //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; subNode.DataType = bValue.Value.GetType(); } break; } } } ShwoText(string.Format("点名:{0,-20} 值:{1,-10} 类型:{3,-15} 描述:{2} ", subNode.PROP_OBJECT_NAME, subNode.PROP_PRESENT_VALUE, subNode.PROP_DESCRIPTION, subNode.PROP_PRESENT_VALUE.GetType())); } } catch (Exception exp) { Log("Error: " + exp.Message); } } }