diff --git a/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs b/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs index edb98b5..2e4fbc6 100644 --- a/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs +++ b/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs @@ -611,6 +611,7 @@ namespace CapMachine.Wpf.CanDrive catch (TaskCanceledException) { // 任务被取消,正常退出 + IsSendOk = false; break; } catch (Exception ex) @@ -618,6 +619,7 @@ namespace CapMachine.Wpf.CanDrive LogService.Error(ex.Message); Console.WriteLine($"CAN周期发送异常: {ex.Message}"); // 短暂暂停避免异常情况下CPU占用过高 + IsSendOk = false; await Task.Delay(10, token); } } @@ -629,11 +631,13 @@ namespace CapMachine.Wpf.CanDrive LogService.Error(ex.Message); // 清理其他可能的资源 Console.WriteLine("CAN周期发送任务已结束,资源已清理"); + IsSendOk = false; } finally { // 确保在任何情况下(正常退出、异常、取消)都会停止计时器 Stopwatcher.Stop(); + IsSendOk = false; } }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default); @@ -739,6 +743,25 @@ namespace CapMachine.Wpf.CanDrive } } + + private bool _IsReviceOk; + /// + /// 接收报文是否OK + /// + public bool IsReviceOk + { + get { return _IsReviceOk; } + set + { + if (_IsReviceOk != value) + { + RaisePropertyChanged(); + _IsReviceOk = value; + } + } + } + + /// /// 要发送的数据 /// @@ -763,6 +786,7 @@ namespace CapMachine.Wpf.CanDrive int CanNum = USB2CANFD.CANFD_GetMsg(DevHandle, ReadCANIndex, msgPtRead, CanMsgBuffer.Length); if (CanNum > 0) { + IsReviceOk = true; Console.WriteLine("Read CanMsgNum = {0}", CanNum); for (int i = 0; i < CanNum; i++) { @@ -787,10 +811,12 @@ namespace CapMachine.Wpf.CanDrive } else if (CanNum == 0) { + IsReviceOk = false; Console.WriteLine("No CAN data!"); } else { + IsReviceOk = false; Console.WriteLine("Get CAN data error!"); } Console.WriteLine(""); @@ -826,6 +852,7 @@ namespace CapMachine.Wpf.CanDrive } catch (Exception ex) { + IsReviceOk = false; LogService.Error(ex.Message); //LogService.Info($"时间:{DateTime.Now.ToString()}-【Meter】-{ex.Message}"); } diff --git a/CapMachine.Wpf/CanDrive/ToomossCan.cs b/CapMachine.Wpf/CanDrive/ToomossCan.cs index 153e1f2..6b9082f 100644 --- a/CapMachine.Wpf/CanDrive/ToomossCan.cs +++ b/CapMachine.Wpf/CanDrive/ToomossCan.cs @@ -1,6 +1,7 @@ using CapMachine.Wpf.Models.Tag; using CapMachine.Wpf.Services; using HslCommunication; +using NLog; using NPOI.OpenXmlFormats.Wordprocessing; using Prism.Ioc; using Prism.Mvvm; @@ -33,7 +34,8 @@ namespace CapMachine.Wpf.CanDrive { ContainerProvider = containerProvider; HighSpeedDataService = ContainerProvider.Resolve(); - + LoggerService = ContainerProvider.Resolve(); + //Stopwatch.Frequency表示高精度计时器每秒的计数次数(ticks/秒)每毫秒的ticks数 = 每秒的ticks数 ÷ 1000 TicksPerMs = Stopwatch.Frequency / 1000.0; } @@ -57,6 +59,11 @@ namespace CapMachine.Wpf.CanDrive /// public HighSpeedDataService HighSpeedDataService { get; set; } + /// + /// Logger 实例 + /// + public ILogService LoggerService { get; set; } + /// /// 开始Dbc文件写入 /// @@ -501,6 +508,23 @@ namespace CapMachine.Wpf.CanDrive } } + private bool _IsReviceOk; + /// + /// 接收报文是否OK + /// + public bool IsReviceOk + { + get { return _IsReviceOk; } + set + { + if (_IsReviceOk != value) + { + RaisePropertyChanged(); + _IsReviceOk = value; + } + } + } + /// /// 要发送的数据 /// @@ -653,6 +677,7 @@ namespace CapMachine.Wpf.CanDrive // 严重延迟,重新校准 NextExecutionTime = Stopwatcher.ElapsedTicks; Console.WriteLine("定时发送延迟过大,重新校准时间"); + LoggerService.Info($"定时发送延迟过大,重新校准时间"); } // 使用Stopwatch记录实际的执行间隔,而不是DateTime @@ -711,14 +736,19 @@ namespace CapMachine.Wpf.CanDrive } catch (TaskCanceledException) { + LoggerService.Info($"精确周期发送CAN数据-任务被取消,正常退出"); // 任务被取消,正常退出 + IsSendOk = false; break; } catch (Exception ex) { Console.WriteLine($"CAN周期发送异常: {ex.Message}"); // 短暂暂停避免异常情况下CPU占用过高 + IsSendOk = false; await Task.Delay(10, token); + + LoggerService.Info($"精确周期发送CAN数据-{ex.Message}"); } } } @@ -726,17 +756,21 @@ namespace CapMachine.Wpf.CanDrive { // 确保在任何情况下(正常退出、异常、取消)都会停止计时器 Stopwatcher.Stop(); - + LoggerService.Info($"精确周期发送CAN数据-{ex.Message}"); // 清理其他可能的资源 Console.WriteLine("CAN周期发送任务已结束,资源已清理"); + IsSendOk = false; } finally { // 确保在任何情况下(正常退出、异常、取消)都会停止计时器 Stopwatcher.Stop(); + LoggerService.Info("精确周期发送CAN数据-正常退出、异常、取消)都会停止计时器"); + IsSendOk = false; } }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default); + } @@ -771,6 +805,7 @@ namespace CapMachine.Wpf.CanDrive int CanNum = USB2CAN.CAN_GetMsgWithSize(DevHandle, ReadCANIndex, msgPtRead, CanMsgBuffer.Length); if (CanNum > 0) { + IsReviceOk = true; Console.WriteLine("Read CanMsgNum = {0}", CanNum); for (int i = 0; i < CanNum; i++) { @@ -798,10 +833,12 @@ namespace CapMachine.Wpf.CanDrive } else if (CanNum == 0) { + IsReviceOk=false; Console.WriteLine("No CAN data!"); } else { + IsReviceOk = false; Console.WriteLine("Get CAN data error!"); } Console.WriteLine(""); @@ -839,7 +876,8 @@ namespace CapMachine.Wpf.CanDrive } catch (Exception ex) { - //LogService.Info($"时间:{DateTime.Now.ToString()}-【Meter】-{ex.Message}"); + IsReviceOk = false; + LoggerService.Info("接收出现异常"); } } }); diff --git a/CapMachine.Wpf/LinDrive/ToomossLin.cs b/CapMachine.Wpf/LinDrive/ToomossLin.cs index c5c1368..ca34c80 100644 --- a/CapMachine.Wpf/LinDrive/ToomossLin.cs +++ b/CapMachine.Wpf/LinDrive/ToomossLin.cs @@ -55,11 +55,18 @@ namespace CapMachine.Wpf.LinDrive { ContainerProvider = containerProvider; HighSpeedDataService = ContainerProvider.Resolve(); + LoggerService = ContainerProvider.Resolve(); + //Stopwatch.Frequency表示高精度计时器每秒的计数次数(ticks/秒)每毫秒的ticks数 = 每秒的ticks数 ÷ 1000 TicksPerMs = Stopwatch.Frequency / 1000.0; } + /// + /// Logger 实例 + /// + public ILogService LoggerService { get; set; } + /// /// HighSpeedDataService 实例 /// @@ -359,10 +366,19 @@ namespace CapMachine.Wpf.LinDrive LDFParser.LDF_GetSignalValueStr(LDFHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), ReadValueStr); itemSignal.SignalRtValueSb = ReadValueStr; } + //报文给高速记录的服务 + //HighSpeedDataService.AppendOrUpdateMsg(new Models.HighSpeed.CommMsg() + //{ + // Category = "LIN", + // MsgInfo = "0x" + CanMsgBuffer[i].ID.ToString("X8"), + // MsgData = BitConverter.ToString(CanMsgBuffer[i].Data), + // Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + //}); } } + IsReviceOk= true; //StringBuilder ValueStr = new StringBuilder(64); //LDFParser.LDF_ExeFrameToBus(LDFHandle, new StringBuilder("ID_DATA"), 1); @@ -376,7 +392,8 @@ namespace CapMachine.Wpf.LinDrive } catch (Exception ex) { - //LogService.Info($"时间:{DateTime.Now.ToString()}-【Meter】-{ex.Message}"); + IsReviceOk = false; + LoggerService.Info($"{ex.Message}"); } } }); @@ -454,6 +471,23 @@ namespace CapMachine.Wpf.LinDrive } + private bool _IsReviceOk; + /// + /// 接收报文是否OK + /// + public bool IsReviceOk + { + get { return _IsReviceOk; } + set + { + if (_IsReviceOk != value) + { + RaisePropertyChanged(); + _IsReviceOk = value; + } + } + } + #region 精确发送报文数据 @@ -578,17 +612,19 @@ namespace CapMachine.Wpf.LinDrive } } - + IsSendOk=true; } } catch (TaskCanceledException) { + IsSendOk = false; // 任务被取消,正常退出 break; } catch (Exception ex) { + IsSendOk = false; Console.WriteLine($"LIN周期发送异常: {ex.Message}"); // 短暂暂停避免异常情况下CPU占用过高 await Task.Delay(10, token); @@ -597,14 +633,16 @@ namespace CapMachine.Wpf.LinDrive } catch (Exception ex) { + IsSendOk = false; // 确保在任何情况下(正常退出、异常、取消)都会停止计时器 Stopwatcher.Stop(); - + LoggerService.Info("接收出现异常"); // 清理其他可能的资源 Console.WriteLine("LIN周期发送任务已结束,资源已清理"); } finally { + IsSendOk = false; // 确保在任何情况下(正常退出、异常、取消)都会停止计时器 Stopwatcher.Stop(); } diff --git a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs index 33a2c24..c5c2516 100644 --- a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs @@ -58,6 +58,29 @@ namespace CapMachine.Wpf.ViewModels EventAggregator.GetEvent().Subscribe(LogicRuleChangeEventCall); + //数据波特率 + DataBaudRateCbxItems = new ObservableCollection() + { + new CbxItems(){ Key="100000",Text="100 Kbps"}, + new CbxItems(){ Key="125000",Text="125 Kbps"}, + new CbxItems(){ Key="200000",Text="200 Kbps"}, + new CbxItems(){ Key="250000",Text="250 Kbps"}, + new CbxItems(){ Key="400000",Text="400 Kbps"}, + new CbxItems(){ Key="500000",Text="500 Kbps"}, + new CbxItems(){ Key="666000",Text="666 Kbps"}, + new CbxItems(){ Key="800000",Text="800 Kbps"}, + new CbxItems(){ Key="1000000",Text="1.0 Mbps"}, + + new CbxItems(){ Key="1500000",Text="1.5 Mbps"}, + new CbxItems(){ Key="2000000",Text="2.0 Mbps"}, + new CbxItems(){ Key="3000000",Text="3.0 Mbps"}, + new CbxItems(){ Key="4000000",Text="4.0 Mbps"}, + new CbxItems(){ Key="5000000",Text="5.0 Mbps"}, + new CbxItems(){ Key="6700000",Text="6.7 Mbps"}, + new CbxItems(){ Key="8000000",Text="8.0 Mbps"}, + new CbxItems(){ Key="10000000",Text="10.0 Mbps"}, + }; + WriteNameCbxItems = new ObservableCollection() { new CbxItems(){ Key="转速",Text="转速"}, @@ -843,6 +866,16 @@ namespace CapMachine.Wpf.ViewModels set { _SelectedCANConfigExdDto = value; RaisePropertyChanged(); } } + private ObservableCollection _DataBaudRateCbxItems; + /// + /// CAN FD 数据波特率 + /// + public ObservableCollection DataBaudRateCbxItems + { + get { return _DataBaudRateCbxItems; } + set { _DataBaudRateCbxItems = value; RaisePropertyChanged(); } + } + private DelegateCommand _CanOpCmd; /// /// CAN操作的指令 diff --git a/CapMachine.Wpf/Views/CANConfigView.xaml b/CapMachine.Wpf/Views/CANConfigView.xaml index 704c8d8..cbec289 100644 --- a/CapMachine.Wpf/Views/CANConfigView.xaml +++ b/CapMachine.Wpf/Views/CANConfigView.xaml @@ -406,7 +406,14 @@ FontSize="18" Text="" /> - + + @@ -574,6 +581,68 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/CapMachine.Wpf/Views/CANFDConfigView.xaml b/CapMachine.Wpf/Views/CANFDConfigView.xaml index 28032a4..d16fd1f 100644 --- a/CapMachine.Wpf/Views/CANFDConfigView.xaml +++ b/CapMachine.Wpf/Views/CANFDConfigView.xaml @@ -636,6 +636,68 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/CapMachine.Wpf/Views/LINConfigView.xaml b/CapMachine.Wpf/Views/LINConfigView.xaml index bec5411..778c8d1 100644 --- a/CapMachine.Wpf/Views/LINConfigView.xaml +++ b/CapMachine.Wpf/Views/LINConfigView.xaml @@ -573,6 +573,68 @@ + + + + + + + + + + + + + + + + + + + +