diff --git a/CapMachine.Wpf/CanDrive/ToomossCan.cs b/CapMachine.Wpf/CanDrive/ToomossCan.cs index c908574..de14f9c 100644 --- a/CapMachine.Wpf/CanDrive/ToomossCan.cs +++ b/CapMachine.Wpf/CanDrive/ToomossCan.cs @@ -618,7 +618,7 @@ namespace CapMachine.Wpf.CanDrive // 预先计算固定值 long CycleInTicks = (long)(SendCycle * TicksPerMs); //临时测试用 - long lastTicks = Stopwatcher.ElapsedTicks; + //long lastTicks = Stopwatcher.ElapsedTicks; //IsCycleSend while (IsCycleSend && !token.IsCancellationRequested) { @@ -664,8 +664,9 @@ namespace CapMachine.Wpf.CanDrive } // 使用Stopwatch记录实际的执行间隔,而不是DateTime - Console.WriteLine($"--实际间隔(ms): {(Stopwatcher.ElapsedTicks - lastTicks) / TicksPerMs:F3}, 目标: {SendCycle}"); - lastTicks = Stopwatcher.ElapsedTicks; + //Console.WriteLine($"--实际间隔(ms): {(Stopwatcher.ElapsedTicks - lastTicks) / TicksPerMs:F3}, 目标: {SendCycle}"); + //lastTicks = Stopwatcher.ElapsedTicks; + //Console.WriteLine($"--当前时间(毫秒): {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}"); diff --git a/CapMachine.Wpf/Services/CanDriveService.cs b/CapMachine.Wpf/Services/CanDriveService.cs index 2089729..666ddd2 100644 --- a/CapMachine.Wpf/Services/CanDriveService.cs +++ b/CapMachine.Wpf/Services/CanDriveService.cs @@ -134,12 +134,12 @@ namespace CapMachine.Wpf.Services get { return _AutoSpeedSv; } set { - if (value!= _AutoSpeedSv) + if (value != _AutoSpeedSv) { _AutoSpeedSv = value; RaisePropertyChanged(); } - + } } @@ -225,19 +225,33 @@ namespace CapMachine.Wpf.Services } /// - /// 更新压缩机使能数据 + /// 更新压缩机使能数据 自动时的赋值数据 /// /// public void UpdateCapEnableCmdData(bool IsEnable) { if (!ToomossCanDrive.IsCycleSend) return; - if (!CanAutoHand) return; - if (EnableCanCmdData != null) + if (CanAutoHand) { - EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; + if (EnableCanCmdData != null) + { + EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; + } } } + /// + /// 更新压缩机使能数据 手动时的赋值数据 + /// + /// + public void UpdateCapEnableCmdDataByHand(bool IsEnable) + { + if (EnableCanCmdData != null) + { + EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; + Console.WriteLine("压缩机使能:" + IsEnable); + } + } /// /// 发送消息给CAN 驱动 diff --git a/CapMachine.Wpf/Services/DataRecordService.cs b/CapMachine.Wpf/Services/DataRecordService.cs index 5de2716..9f66915 100644 --- a/CapMachine.Wpf/Services/DataRecordService.cs +++ b/CapMachine.Wpf/Services/DataRecordService.cs @@ -296,75 +296,85 @@ namespace CapMachine.Wpf.Services /// private async void ListenRecoredChannelAction() { + while (await RecoredChannelInfo.Reader.WaitToReadAsync()) { - if (RecoredChannelInfo.Reader.TryRead(out var recordChannelData)) + try { - ////第一次计时 - //stopwatch.Start(); //启动Stopwatch - - //新增数据 - CacheRecordData.Add(recordChannelData); - MaxCacheCellCount++; - - //先判断缓存的单元大小,防止每次都检查删除,数据达到时间范围外的话,则删除,即是600次后进行一次判断删除 - if (MaxCacheCellCount >= 600) + if (RecoredChannelInfo.Reader.TryRead(out var recordChannelData)) { - //不在缓存的时间范围内的话,则删除数据 - if (CacheRecordData.Where(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec)).Any()) + ////第一次计时 + //stopwatch.Start(); //启动Stopwatch + + //新增数据 + CacheRecordData.Add(recordChannelData); + MaxCacheCellCount++; + + //先判断缓存的单元大小,防止每次都检查删除,数据达到时间范围外的话,则删除,即是600次后进行一次判断删除 + if (MaxCacheCellCount >= 600) { - CacheRecordData.RemoveAll(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec)); + //不在缓存的时间范围内的话,则删除数据 + if (CacheRecordData.Where(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec)).Any()) + { + CacheRecordData.RemoveAll(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec)); + } + MaxCacheCellCount = 0; } - MaxCacheCellCount = 0; + + //ConcurrentQueueData. + + //Prism发布数据 + _EventAggregator.GetEvent().Publish(recordChannelData.DeepClone()); + + //判断集合的数据是否达到要求 + //if (CacheRecordData.Count >= MaxCacheCount) + //{ + //CacheRecordData可能存在多个表格数据,依据表名进行分类 + + //考虑多个表结构 + //var GroupTableData = CacheRecordData.GroupBy(a => a.TableName).ToList(); + + //foreach (var ItemData in GroupTableData) + //{ + //表名称 + //var TableName = ItemData.Key; + //当前表格的数据 + //var Datas = ItemData.Select(item => item.Data).ToList(); + + //var Datas = recordChannelData.Select(item => item.Data).ToList(); + + //List models = Datas.Select(dict => ConvertToCsvRecordModel(dict)).ToList(); + + //转换到CSV的数据 + var models = ConvertToCsvRecordModel(recordChannelData.Data); + //填充工况名称 + models.WorkCond = ConfigService.CurExpInfo.Name; + + //数据库保存 + //zeroDbContext.Insert(Datas); + + //CSV文件保存 + SaveToCsv(new List() { models }); + //} + + //CacheRecordData.Clear(); + + //Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!"); + //} + + //stopwatch.Stop(); //停止Stopwatch + //Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString()); + //stopwatch.Reset(); } - - //ConcurrentQueueData. - - //Prism发布数据 - _EventAggregator.GetEvent().Publish(recordChannelData.DeepClone()); - - //判断集合的数据是否达到要求 - //if (CacheRecordData.Count >= MaxCacheCount) - //{ - //CacheRecordData可能存在多个表格数据,依据表名进行分类 - - //考虑多个表结构 - //var GroupTableData = CacheRecordData.GroupBy(a => a.TableName).ToList(); - - //foreach (var ItemData in GroupTableData) - //{ - //表名称 - //var TableName = ItemData.Key; - //当前表格的数据 - //var Datas = ItemData.Select(item => item.Data).ToList(); - - //var Datas = recordChannelData.Select(item => item.Data).ToList(); - - //List models = Datas.Select(dict => ConvertToCsvRecordModel(dict)).ToList(); - - //转换到CSV的数据 - var models = ConvertToCsvRecordModel(recordChannelData.Data); - //填充工况名称 - models.WorkCond = ConfigService.CurExpInfo.Name; - - //数据库保存 - //zeroDbContext.Insert(Datas); - - //CSV文件保存 - SaveToCsv(new List() { models }); - //} - - //CacheRecordData.Clear(); - - //Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!"); - //} - - - //stopwatch.Stop(); //停止Stopwatch - //Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString()); - //stopwatch.Reset(); } + catch (Exception ex) + { + LogService.Error($"时间:{DateTime.Now.ToString()}-【ListenRecoredChannelAction】-{ex.Message}"); + } + } + + } /// @@ -459,7 +469,7 @@ namespace CapMachine.Wpf.Services catch (Exception ex) { //CycleTimer.Start(); //执行完毕后再开启器 - LogService.Info($"时间:{DateTime.Now.ToString()}-【PwAnalyze-CycleAction】-{ex.Message}"); + LogService.Error($"时间:{DateTime.Now.ToString()}-【PwAnalyze-CycleAction】-{ex.Message}"); } } diff --git a/CapMachine.Wpf/Services/HighSpeedDataService.cs b/CapMachine.Wpf/Services/HighSpeedDataService.cs index ec0c10a..9a0ddac 100644 --- a/CapMachine.Wpf/Services/HighSpeedDataService.cs +++ b/CapMachine.Wpf/Services/HighSpeedDataService.cs @@ -175,40 +175,48 @@ namespace CapMachine.Wpf.Services { while (await CycleChannelInfo.Reader.WaitToReadAsync()) { - if (CycleChannelInfo.Reader.TryRead(out var CycleChannelData)) + try { - ////第一次计时 - //stopwatch.Start(); //启动Stopwatch - - //新增数据 - CacheHighFragMsg.AddRange(CycleChannelData); - MaxCacheCellCount++; - - if (MaxCacheCellCount >= 600) + if (CycleChannelInfo.Reader.TryRead(out var CycleChannelData)) { - //CSV文件保存 - SaveToCsv(CacheHighFragMsg); - CacheHighFragMsg.Clear(); - MaxCacheCellCount = 0; + ////第一次计时 + //stopwatch.Start(); //启动Stopwatch + + //新增数据 + CacheHighFragMsg.AddRange(CycleChannelData); + MaxCacheCellCount++; + + if (MaxCacheCellCount >= 600) + { + //CSV文件保存 + SaveToCsv(CacheHighFragMsg); + CacheHighFragMsg.Clear(); + MaxCacheCellCount = 0; + } + + //} + + //CacheRecordData.Clear(); + + //Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!"); + //} + + + //stopwatch.Stop(); //停止Stopwatch + //Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString()); + //stopwatch.Reset(); } - - //} - - //CacheRecordData.Clear(); - - //Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!"); - //} - - - //stopwatch.Stop(); //停止Stopwatch - //Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString()); - //stopwatch.Reset(); + } + catch (Exception ex) + { + LogService.Error($"时间:{DateTime.Now.ToString()}-【ListenCycleChannelAction】-{ex.Message}"); } } + } #endregion - + #region CSV Helper 数据保存CSV diff --git a/CapMachine.Wpf/Services/HightDriveMsgService.cs b/CapMachine.Wpf/Services/HightDriveMsgService.cs index 279f53c..6560b5a 100644 --- a/CapMachine.Wpf/Services/HightDriveMsgService.cs +++ b/CapMachine.Wpf/Services/HightDriveMsgService.cs @@ -62,7 +62,7 @@ namespace CapMachine.Wpf.Services /// /// 是否启用CAN报文显示 /// - private bool _IsDisplayEnabled=true; + private bool _IsDisplayEnabled = true; public bool IsDisplayEnabled { get { return _IsDisplayEnabled; } @@ -241,9 +241,11 @@ namespace CapMachine.Wpf.Services /// private async Task ProcessMessagesAsync() { - try + + while (await ReceiveChannel.Reader.WaitToReadAsync(TaskCancellationTokenSource.Token)) { - while (await ReceiveChannel.Reader.WaitToReadAsync(TaskCancellationTokenSource.Token)) + + try { // 清空列表但保留容量 MessageBatch.Clear(); @@ -280,16 +282,18 @@ namespace CapMachine.Wpf.Services await Task.Delay(20); } } + catch (OperationCanceledException ex) + { + // 服务被取消,正常退出 + LogService.Error($" 服务被取消,正常退出: {ex.Message}"); + } + catch (Exception ex) + { + LogService.Error($"消息处理任务异常: {ex.Message}"); + } + } - catch (OperationCanceledException ex) - { - // 服务被取消,正常退出 - LogService.Error($" 服务被取消,正常退出: {ex.Message}"); - } - catch (Exception ex) - { - LogService.Error($"消息处理任务异常: {ex.Message}"); - } + } /// diff --git a/CapMachine.Wpf/Services/MachineRtDataService.cs b/CapMachine.Wpf/Services/MachineRtDataService.cs index 1c4c978..aced06b 100644 --- a/CapMachine.Wpf/Services/MachineRtDataService.cs +++ b/CapMachine.Wpf/Services/MachineRtDataService.cs @@ -2272,7 +2272,7 @@ namespace CapMachine.Wpf.Services //dynamic dad=10; - + InitialPLCCom(); //拓展的参数信息 @@ -2741,25 +2741,25 @@ namespace CapMachine.Wpf.Services if (item.StateOperateResult.IsSuccess) { item.State = item.StateOperateResult.Content; - //根据PLC得到执行的步骤数据,更新到CAN和LIN的数据 - if (item.Name!.Equals("使能")) - { - switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) - { - case CanLinEnum.Can: - //获取PLC的使能状态,更新到CAN的使能状态 - CanDriveService.UpdateCapEnableCmdData(item.State); - //itemTag.Value.EngPvValue = 0; - break; - case CanLinEnum.Lin: - //获取PLC的使能状态,更新到LIN的使能状态 - LinDriveService.UpdateCapEnableCmdData(item.State); - //itemTag.Value.EngPvValue = 0; - break; - default: - break; - } - } + //根据PLC得到执行的步骤数据,更新到CAN和LIN的数据,压缩的使能时来自于程序的步骤配置,不再接受PLC的指令数据 + //if (item.Name!.Equals("使能")) + //{ + // switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) + // { + // case CanLinEnum.Can: + // //获取PLC的使能状态,更新到CAN的使能状态 + // CanDriveService.UpdateCapEnableCmdData(item.State); + // //itemTag.Value.EngPvValue = 0; + // break; + // case CanLinEnum.Lin: + // //获取PLC的使能状态,更新到LIN的使能状态 + // LinDriveService.UpdateCapEnableCmdData(item.State); + // //itemTag.Value.EngPvValue = 0; + // break; + // default: + // break; + // } + //} } } @@ -3062,6 +3062,13 @@ namespace CapMachine.Wpf.Services { foreach (var itemStepExd in ProRunChannelData.ListStepExd) { + //压缩机使能的参数直接给压缩机触发 + if (itemStepExd.Name.Contains("压缩机使能")) + { + CanDriveService.UpdateCapEnableCmdData((bool)itemStepExd.Value); + continue; + } + var DataAdrees = ListPlcExdConfigCell.FirstOrDefault(a => a.Name == itemStepExd.Name); if (DataAdrees != null) { diff --git a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs index 8dfff35..43e6987 100644 --- a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs @@ -534,6 +534,7 @@ namespace CapMachine.Wpf.ViewModels MsgName = item.MsgFrameName, SignalName = item.SignalName, SignalCmdValue = double.TryParse(item.DefautValue, out double result) == true ? result : 0, + LogicRuleDto = Mapper.Map(item.LogicRule), }); //CanDriveService.CmdData.Add(new CanCmdData() @@ -1075,7 +1076,7 @@ namespace CapMachine.Wpf.ViewModels //ToDo cmd CanDriveService.CanHandEnable = (bool)Data!; //给使能数据 - CanDriveService.UpdateCapEnableCmdData(CanDriveService.CanHandEnable); + CanDriveService.UpdateCapEnableCmdDataByHand((bool)Data!); } } diff --git a/CapMachine.Wpf/Views/CANConfigView.xaml b/CapMachine.Wpf/Views/CANConfigView.xaml index a1aadbe..261c41a 100644 --- a/CapMachine.Wpf/Views/CANConfigView.xaml +++ b/CapMachine.Wpf/Views/CANConfigView.xaml @@ -609,7 +609,7 @@ Margin="10,0,0,0" Command="{Binding CanAutoHandCmd}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}" - FontSize="11" + FontSize="8" ToolTip="自动时:接受程序步骤的转速控制;手动时:手动发送转速数据">