private async void Write_ClickAsync(object sender, EventArgs e) { var address = txt_address.Text?.Trim(); var value = txt_value.Text?.Trim(); var addressPart = address.Split('_'); BacProperty rpop = null; BacNode bacnet = null; if (addressPart.Length == 1) { rpop = devicesList.SelectMany(t => t.Properties).Where(t => t.PROP_OBJECT_NAME == address).FirstOrDefault(); bacnet = devicesList.Where(t => t.Properties.Any(p => p.PROP_OBJECT_NAME == address)).FirstOrDefault(); } else if (addressPart.Length == 2) { rpop = devicesList.SelectMany(t => t.Properties) .Where(t => t.ObjectId.Instance == uint.Parse(addressPart[0]) && t.ObjectId.Type == (BacnetObjectTypes)int.Parse(addressPart[1])) .FirstOrDefault(); bacnet = devicesList .Where(t => t.Properties.Any(p => p.ObjectId.Instance == uint.Parse(addressPart[0]) && p.ObjectId.Type == (BacnetObjectTypes)int.Parse(addressPart[1]))) .FirstOrDefault(); } else { Log("请输入正确的地址"); return; } if (rpop == null) { Log("没有找到对应的点"); return; } BacnetValue[] NoScalarValue = { new BacnetValue(value.ToDataFormType(rpop.DataType)) }; int retry = 0;//重试 tag_retry: try { await Task.Delay(retry * 200); Bacnet_client.WritePropertyRequest(bacnet.Address, rpop.ObjectId, BacnetPropertyIds.PROP_PRESENT_VALUE, NoScalarValue); ShwoText(string.Format("[写入成功][{2}] 点:{0,-15} 值:{1}", address, value, retry)); } catch (Exception ex) { retry++; if (retry < 4) { goto tag_retry; //强行重试 } Log($"写入失败:{ex.Message} [{retry - 1}]"); } }
/// <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); } }
private async void Read_ClickAsync(object sender, EventArgs e) { var address = txt_address.Text?.Trim(); var addressPart = address.Split('_'); BacProperty rpop = null; BacNode bacnet = null; if (addressPart.Length == 1) { rpop = devicesList.SelectMany(t => t.Properties).Where(t => t.PROP_OBJECT_NAME == address).FirstOrDefault(); bacnet = devicesList.Where(t => t.Properties.Any(p => p.PROP_OBJECT_NAME == address)).FirstOrDefault(); } else if (addressPart.Length == 2) { rpop = devicesList.SelectMany(t => t.Properties) .Where(t => t.ObjectId.Instance == uint.Parse(addressPart[0]) && t.ObjectId.Type == (BacnetObjectTypes)int.Parse(addressPart[1])) .FirstOrDefault(); bacnet = devicesList .Where(t => t.Properties.Any(p => p.ObjectId.Instance == uint.Parse(addressPart[0]) && p.ObjectId.Type == (BacnetObjectTypes)int.Parse(addressPart[1]))) .FirstOrDefault(); } else { Log("请输入正确的地址"); return; } if (rpop == null) { Log("没有找到对应的点"); return; } int retry = 0;//重试 tag_retry: IList <BacnetValue> NoScalarValue = Bacnet_client.ReadPropertyRequest(bacnet.Address, rpop.ObjectId, BacnetPropertyIds.PROP_PRESENT_VALUE); if (NoScalarValue?.Any() ?? false) { await Task.Delay(retry * 200); try { var value = NoScalarValue[0].Value; ShwoText(string.Format("[读取成功][{3}] 点:{0,-15} 值:{1,-10} 类型:{2}", address, value?.ToString(), value?.GetType().ToString(), retry)); } catch { Log("Err:读取失败."); } } else { retry++; if (retry < 4) { goto tag_retry; } Log($"Err:读取失败[{retry - 1}]"); } }