Example #1
0
        public override async Task <bool> Excute(Action <string> writeLogMsgAction)
        {
            var tasks = new List <bool>();

            foreach (var boardItemInfo in BoardItemInfos)
            {
                var serviceAddress = ProjectHelper.GetBoardServiceAddress(boardItemInfo.DeviceNumber, BoardType);
                var portName       = ProjectHelper.GetBoardPortName(boardItemInfo.DeviceNumber, BoardType);
                var wcfCommand     = new SendWcfCommand <ITLAutoDevice>(serviceAddress, writeLogMsgAction);
                var task           = await wcfCommand.SendAsync(async proxy =>
                {
                    try
                    {
                        var controlInfo = new ControlInfo {
                            ServiceKey = ConfigHelper.PLCServiceKey
                        };
                        var serviceData = new PLCControlServiceData
                        {
                            ControlPLCType = ControlPLCType.ControlRelay,
                            DeviceNumber   = boardItemInfo.DeviceNumber,
                            Number         = new[] { boardItemInfo.Number },
                            PortSignName   = portName,
                            RelayStatus    = boardItemInfo.IsNo
                        };
                        controlInfo.Data = serviceData.ToBytes();
                        var result       = await proxy.ControlDevice(controlInfo);
                        if (!result.IsError && (result.Data != null))
                        {
                            return(true);
                        }
                    }
                    catch (Exception ex)
                    {
                        writeLogMsgAction("执行任务时出错,原因为:" + ex.Message);
                    }
                    return(false);
                });

                tasks.Add(task);
            }
            return(tasks.All(s => s));
        }
Example #2
0
        public override async Task <bool> Excute(Action <string> writeLogMsgAction)
        {
            _isStop  = false;
            _isBreak = false;
            var newTasks = new List <Tuple <Task <bool>, BoardItemInfo> >();

            bool[] result;
            do
            {
                newTasks.Clear();
                Parallel.ForEach(BoardItemInfos,
                                 boardItemInfo =>
                {
                    var serviceAddress = ProjectHelper.GetBoardServiceAddress(boardItemInfo.DeviceNumber, BoardType);
                    var portName       = ProjectHelper.GetBoardPortName(boardItemInfo.DeviceNumber, BoardType);
                    var wcfCommand     = new SendWcfCommand <ITLAutoDevice>(serviceAddress, writeLogMsgAction);
                    _commands.Add(wcfCommand);
                    var task = wcfCommand.SendAsync(async proxy =>
                    {
                        try
                        {
                            var controlInfo = new ControlInfo {
                                ServiceKey = ConfigHelper.PLCServiceKey
                            };
                            var serviceData = new PLCControlServiceData
                            {
                                ControlPLCType = ControlPLCType.QueryDigitalSwitch,
                                DeviceNumber   = boardItemInfo.DeviceNumber,
                                Number         = new[] { boardItemInfo.Number },
                                PortSignName   = portName
                            };
                            controlInfo.Data = serviceData.ToBytes();
                            var result1      = await proxy.ControlDevice(controlInfo);
                            if (!result1.IsError && (result1.Data != null))
                            {
                                var switchItems = result1.Data.ToObject <IEnumerable <SwitchItem> >().ToList();
                                var switchItem  = switchItems.Find(s => (s != null) && (s.SwitchNumber == boardItemInfo.Number) && (s.SwitchStatus.ToInt32().ToBoolean() == !boardItemInfo.IsNo));
                                if (switchItem != null)
                                {
                                    return(true);
                                }
                            }
                            serviceData.ControlPLCType         = ControlPLCType.QueryDiaitalSwitchWithAutoUpload;
                            serviceData.QueryTimeForAutoUpload = ConfigHelper.QuerySwitchTime;
                            controlInfo.Data = serviceData.ToBytes();
                            var result2      = await proxy.ControlDevice(controlInfo);
                            if (!result2.IsError && (result2.Data != null))
                            {
                                var switchItems = result2.Data.ToObject <IEnumerable <SwitchItem> >().ToList();
                                var switchItem  = switchItems.Find(s => (s != null) && (s.SwitchNumber == boardItemInfo.Number) && (s.SwitchStatus.ToInt32().ToBoolean() == !boardItemInfo.IsNo));
                                if (switchItem != null)
                                {
                                    return(true);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            writeLogMsgAction("执行任务时出错,原因为:" + ex.Message);
                        }
                        if (_isBreak)
                        {
                            return(true);
                        }
                        return(false);
                    });
                    newTasks.Add(new Tuple <Task <bool>, BoardItemInfo>(task, boardItemInfo));
                });
                result = await Task.WhenAll(newTasks.Select(s => s.Item1).ToArray());

                _commands.Clear();
            }while (!result.All(s => s) && !_isStop && !_isBreak);
            if (_isStop)
            {
                return(false);
            }
            return(true);
        }