Exemple #1
0
        /// <summary>
        /// 控制设备
        /// </summary>
        /// <param name="deviceId">控制设备ID</param>
        /// <param name="status">设备状态</param>
        private void Control(int deviceId, int status)
        {
            const bool result = false;
            List <FacilityControlDeviceUnit> fac = FacilityControlDeviceUnit.FindAllByControlDeviceUnitGroupNum(deviceId);

            if (fac == null || !fac.Any())
            {
                return;
            }
            var device = ControlDeviceUnit.FindByID(deviceId);

            if (device == null)
            {
                return;
            }
            string            reason = null;
            TransportTypeEnum type;

            if (
                !Enum.TryParse(device.ModularDevice.CommunicateDevice.CommunicateDeviceTypeName,
                               true, out type))
            {
                type = TransportTypeEnum.Unknow;
            }
            var host    = device.ModularDevice.CommunicateDevice.Args1;
            var e       = Convert.ToInt32(device.ModularDevice.CommunicateDevice.Args2);
            var timeout = Convert.ToInt32(device.ModularDevice.CommunicateDevice.Args3);
            //获取Transport
            var transport           = TransportFactory.GetTransport(type, host, e, timeout);
            var modbusControlDevice = new ModbusControlDevice(transport,
                                                              Convert.ToByte(device.ModularDevice.Address));

            try
            {
                //待编写控制指令

                //if (device.IsComposite) //三态设备  正转  反转  停止
                //{
                //    if (status == -1)
                //    {
                //        result = modbusControlDevice.Write(device.RegisterAddress1, true);
                //    }
                //    else if (status == 0)
                //    {
                //        result = modbusControlDevice.Write(device.RegisterAddress1, false);
                //        result = modbusControlDevice.Write(device.RegisterAddress2, false);
                //    }
                //    else if (status == 1)
                //    {
                //        result = modbusControlDevice.Write(device.RegisterAddress2, true);
                //    }
                //}
                //else //两态设备 开 关
                //{
                //    result = modbusControlDevice.Write(device.RegisterAddress1, status == 1 ? true : false);
                //}
            }
            catch (Exception ex)
            {
                reason = ex.ToString();
            }
            LogHelper.Debug("指令执行" + (result ? "成功" : "失败"));

            DeviceControlCommand.FindAllByControlDeviceUnitID(deviceId).ToList().ForEach(deviceControlCommand =>
            {
                var controlResult = new ControlResult
                {
                    Serialnum = deviceControlCommand.Code1,
                    //Command = status,
                    //FacilityCode = fac[0].Facility.Code1,
                    //DeviceCode = fac[0].Code1,
                    //ContinueTime = 5,
                    Time       = DateTime.Now,
                    Result     = result,
                    FailReason = reason
                };
                var devControlLog = new DeviceControlLog
                {
                    Code1 = deviceControlCommand.Code1,
                    ControlDeviceUnitID    = deviceControlCommand.ControlDeviceUnitGroupNum,
                    ControlResult          = result,
                    CreateTime             = DateTime.Now,
                    DeviceControlCommand   = deviceControlCommand,
                    DeviceControlCommandID = deviceControlCommand.ID,
                    DeviceValue            = Convert.ToInt32(CalcControlDeviceValue.CalcProcessValue(fac[0])),
                    ShowValue  = CalcControlDeviceValue.CalcOriginal(fac[0]).ToString(),
                    FailReason = reason
                };
                devControlLog.Save();
                UploadControlCommand(controlResult, fac[0].Facility); //上传控制指令
                Thread.Sleep(50);
            });
        }
        /// <summary>
        /// 采集控制设备状态
        /// </summary>
        private static void Collect()
        {
            CommunicateDevice.FindAllWithCache().ForEach(com =>
            {
                var key = "{0}://{1}:{2}".F(com.CommunicateDeviceTypeName, com.Args1, com.Args2);
                TransportTypeEnum type;
                if (!Enum.TryParse(com.CommunicateDeviceTypeName, true, out type))
                {
                    type = TransportTypeEnum.Unknow;
                }
                var host    = com.Args1;
                var e       = Convert.ToInt32(com.Args2);
                var timeout = Convert.ToInt32(com.Args3);
                //获取Transport
                var transport = TransportFactory.GetTransport(type, host, e, timeout);

                if (transport != null)
                {
                    var modulars = com.ModularDevices;
                    if (modulars != null && modulars.Count > 0)
                    {
                        modulars.ForEach(modular =>
                        {
                            var controlDevices = modular.ControlDeviceUnits;
                            if (controlDevices != null && controlDevices.Count > 0)
                            {
                                var dataType = modular.ProtocalTypeName;
                                if (dataType.EqualIgnoreCase(ProtocalTypeEnum.MODBUS.ToString()))
                                {
                                    var modbusControlDevice = new ModbusControlDevice(transport,
                                                                                      Convert.ToByte(modular.Address))
                                    {
                                        Registers = controlDevices.ToList().SelectMany(controlDeviceUnit =>
                                        {
                                            var addrs = new List <int>
                                            {
                                                Convert.ToInt32(controlDeviceUnit.RegisterAddress1)
                                            };
                                            //添加第一个
                                            //如果是组合设备添加第二个
                                            //if (controlDeviceUnit.IsComposite)
                                            //    addrs.Add(Convert.ToInt32(controlDeviceUnit.RegisterAddress2));
                                            return(addrs);
                                        }).ToList()
                                    };

                                    //读数据,重试三次
                                    var result = false;
                                    for (var i = 0; i < 3; i++)
                                    {
                                        try
                                        {
                                            modbusControlDevice.EnsureTransport(transport);
                                            result = modbusControlDevice.Read();
                                            break;
                                        }
                                        catch (ObjectDisposedException odx)
                                        {
                                            LogHelper.Fatal(odx.ToString());

                                            //重新构建transport
                                            transport = TransportFactory.GetTransport(type, host, e, timeout);
                                        }
                                        catch (Exception ex)
                                        {
                                            LogHelper.Fatal(ex.ToString());
                                        }
                                        LogHelper.Debug("第{3}次读取{0}:{1}地址为{2}数据失败", host, e,
                                                        modular.Address, (i + 1));
                                    }

                                    if (result)
                                    {
                                        //处理设备状态
                                        //保存到数据库
                                        var minReg = modbusControlDevice.Registers.Min();
                                        controlDevices.ForEach(controlDevice =>
                                        {
                                            var regAddr = Convert.ToInt32(controlDevice.RegisterAddress1);
                                            var value1  =
                                                modbusControlDevice.Values.Skip(regAddr - minReg).Take(1).ElementAt(0);
                                            var value = 0; //控制设备当前状态

                                            //if (controlDevice.IsComposite)
                                            //{
                                            //    var regAddr2 = Convert.ToInt32(controlDevice.RegisterAddress1);
                                            //    var value2 = modbusControlDevice.Values.Skip(regAddr2 - minReg).Take(1).ElementAt(0);
                                            //    //controlDevice.OriginalValue = (value1 << 8) + value2;
                                            //    if (value1 && !value2)
                                            //    {
                                            //        value = 0xFF00;
                                            //        controlDevice.ProcessedValue = "正转";
                                            //    }
                                            //    else if (!value1 && value2)
                                            //    {
                                            //        value = 0;
                                            //        controlDevice.ProcessedValue = "停止";
                                            //    }
                                            //    else if (!value1 && !value2)
                                            //    {
                                            //        value = 0X00FF;
                                            //        controlDevice.ProcessedValue = "反转";
                                            //    }
                                            //}
                                            //else
                                            //{
                                            value = value1 ? 1 : 0;
                                            //}
                                            controlDevice.OriginalValue  = value;
                                            controlDevice.ProcessedValue =
                                                CalcControlDeviceValue.CalcProcessValue(
                                                    controlDevice.FacilityControlDeviceUnits[0]);
                                            controlDevice.UpdateTime = DateTime.Now;
                                            controlDevice.Save();
                                            //执行控制
                                            //bool success= control(value,controldevice.id);
                                            // if(success)
                                            // {
                                            //     servicelogger.current.writelog("设备控制成功");
                                            // }
                                            // else
                                            // {
                                            //     servicelogger.current.writeerror("设备控制失败");
                                            // }
                                        });
                                    }
                                    else
                                    {
                                        LogHelper.Error("读取设备控制数据失败");
                                    }
                                }
                            }
                        });
                    }
                }
                else
                {
                    //通讯对象创建失败
                    LogHelper.Error("无法创建通讯{0}", key);
                }
            });
        }
Exemple #3
0
        /// <summary>
        /// 同步控制设备
        /// </summary>
        /// <returns></returns>
        private bool SyncControlDevices()
        {
            var syncResult = false;

            //控制设备
            var controlDevices =
                FacilityControlDeviceUnit.FindAllWithCache()
                .ToList()
                .Where(c => c.Code1.Substring(13, 1).EqualIgnoreCase("K"));
            var facilityControlDeviceUnits = controlDevices as FacilityControlDeviceUnit[] ?? controlDevices.ToArray();

            if (facilityControlDeviceUnits.Any())
            {
                //逐个上传
                facilityControlDeviceUnits.ToList().ForEach(cd =>
                {
                    #region 构建DeviceModel

                    var code = cd.Code1;
                    var devs = cd.ControlDeviceUnits; //改设施控制设备所拥有的所有控制设备继电器的集合
                    if (devs != null)
                    {
                        var originalValue  = CalcControlDeviceValue.CalcOriginal(cd);
                        var processedValue = CalcControlDeviceValue.CalcProcessValue(cd);
                        var deviceModel    = new DeviceModel
                        {
                            Serialnum           = code,
                            Name                = cd.Name,
                            DeviceTypeSerialnum = devs[0].DeviceTypeSerialnum,
                            FacilitySerialnum   = cd.Facility.Code1,
                            ProcessedValue      = originalValue,
                            ShowValue           = processedValue,
                            UpdateTime          = DateTime.Now,
                            RelayType           = devs[0].RelayTypeName
                        };

                        #endregion 构建DeviceModel

                        var entity = AwEntityHelper.GetEntity(cd.Facility.Farm.Code1);
#if DEBUG
                        var sw = new Stopwatch();
                        sw.Start();
#endif
                        try
                        {
                            var trans          = ApiTransportHelper.GetTransport();
                            var responseResult = _deviceApi.QueryDevice(entity, trans, deviceModel.Serialnum);
                            if (responseResult.Data != null)
                            {
                                var entity1 = AwEntityHelper.GetEntity(cd.Facility.Farm.Code1);
                                var result  = _deviceApi.UpdateDevice(entity1, trans, deviceModel);
                                trans.Dispose();
                                LogHelper.Debug("更新控制设备{0}:{1}", deviceModel.Serialnum,
                                                result ? "成功" : "失败");
                                syncResult = result;
                            }
                            else
                            {
                                var entity1 = AwEntityHelper.GetEntity(cd.Facility.Farm.Code1);
                                var result  = _deviceApi.AddDevice(entity1, trans, deviceModel);
                                trans.Dispose();
                                LogHelper.Debug("添加控制设备{0}:{1}", deviceModel.Serialnum,
                                                result ? "成功" : "失败");
                                syncResult = result;
                            }
                        }
                        catch (Exception ex)
                        {
                            LogHelper.Fatal(ex.ToString());
                        }
#if DEBUG
                        sw.Stop();
                        var apiAccesslog = new ApiAccessLog
                        {
                            ApiName    = "同步控制设备",
                            Result     = syncResult,
                            CreateTime = DateTime.Now,
                            CostTime   = Convert.ToInt32(sw.ElapsedMilliseconds)
                        };
                        apiAccesslog.Save();
                        LogHelper.Debug("同步控制设备耗时" + sw.ElapsedMilliseconds.ToString() + "ms");
#endif
                    }
                });
            }
            //return syncResult;
            return(true);
        }