Пример #1
0
        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}]");
            }
        }
Пример #2
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);
            }
        }
Пример #3
0
        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}]");
            }
        }