diff --git a/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs b/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs index fce2a20..184bd44 100644 --- a/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs +++ b/CapMachine.Wpf/CanDrive/CanFD/ToomossCanFD.cs @@ -83,6 +83,16 @@ namespace CapMachine.Wpf.CanDrive /// USB2CANFD.CANFD_INIT_CONFIG CANConfig = new USB2CANFD.CANFD_INIT_CONFIG(); + /// + /// 诊断信息 + /// + public USB2CANFD.CANFD_DIAGNOSTIC CurCANFD_DIAGNOSTIC = new USB2CANFD.CANFD_DIAGNOSTIC(); + + /// + /// CANFD总线错误信息 + /// + public USB2CANFD.CANFD_BUS_ERROR CurCANFD_BUS_ERROR = new USB2CANFD.CANFD_BUS_ERROR(); + /// /// DBC Handle /// @@ -97,6 +107,7 @@ namespace CapMachine.Wpf.CanDrive /// 扫描设备Handle /// public Int32 DevHandle { get; set; } = 0; + /// /// Write CAN Index /// @@ -228,6 +239,7 @@ namespace CapMachine.Wpf.CanDrive Console.WriteLine(" Firmware Version:v{0}.{1}.{2}", (DevInfo.FirmwareVersion >> 24) & 0xFF, (DevInfo.FirmwareVersion >> 16) & 0xFF, DevInfo.FirmwareVersion & 0xFFFF); Console.WriteLine(" Hardware Version:v{0}.{1}.{2}", (DevInfo.HardwareVersion >> 24) & 0xFF, (DevInfo.HardwareVersion >> 16) & 0xFF, DevInfo.HardwareVersion & 0xFFFF); Console.WriteLine(" Functions:" + DevInfo.Functions.ToString("X8")); + Console.WriteLine(" SerialNumber:" + DevInfo.SerialNumber[0] + DevInfo.SerialNumber[1] + DevInfo.SerialNumber[2]); Console.WriteLine(" Functions String:" + FuncStr); StringBuilder DLLBuildDate = new StringBuilder(256); USB_DEVICEByFD.DEV_GetDllBuildTime(DLLBuildDate); @@ -264,7 +276,7 @@ namespace CapMachine.Wpf.CanDrive public void InitCAN() { //初始化CAN - + CANConfig.ISOCRCEnable = 1;//使能ISOCRC ret = USB2CANFD.CANFD_Init(DevHandle, WriteCANIndex, ref CANConfig); if (ret != USB2CANFD.CANFD_SUCCESS) { @@ -300,6 +312,7 @@ namespace CapMachine.Wpf.CanDrive if (DBCHandle == 0) { Console.WriteLine("Parser DBC File error!"); + DbcParserState = false; return; } else @@ -340,6 +353,9 @@ namespace CapMachine.Wpf.CanDrive } Console.WriteLine(""); } + + //Dbc解析成功 + DbcParserState = true; } /// @@ -424,6 +440,8 @@ namespace CapMachine.Wpf.CanDrive private static readonly Random _random = new Random(); + + /// /// 精确周期发送CAN数据 /// @@ -533,11 +551,21 @@ namespace CapMachine.Wpf.CanDrive //释放申请的临时缓冲区 Marshal.FreeHGlobal(msgPtSend); + //var CanMsg1 = GetCanMsg(CanMsg,0); + //var CanMsg2 = GetCanMsg(CanMsg,1); + CanMsg[0].Flags = 5; + + //CanMsg1[0].Flags = 5; + //CanMsg2[0].Flags = 5; //发送CAN数据 int SendedNum = USB2CANFD.CANFD_SendMsg(DevHandle, WriteCANIndex, CanMsg, (Int32)CanMsg.Length); + //Thread.Sleep(20); + //int SendedNum2 = USB2CANFD.CANFD_SendMsg(DevHandle, WriteCANIndex, CanMsg2, (Int32)CanMsg2.Length); if (SendedNum >= 0) { //Console.WriteLine("Success send frames:{0}", SendedNum); + + IsSendOk = true; } else @@ -579,6 +607,31 @@ namespace CapMachine.Wpf.CanDrive }, token, TaskCreationOptions.LongRunning, TaskScheduler.Default); } + /// + /// 获取CAN消息数组中指定位置的数据 + /// + /// 源CAN消息数组 + /// 要获取的数据索引位置 + /// 返回指定位置数据的新数组 + private USB2CANFD.CANFD_MSG[] GetCanMsg(USB2CANFD.CANFD_MSG[] sourceCanMsg, int index) + { + // 参数检查 + if (sourceCanMsg == null || sourceCanMsg.Length == 0 || index < 0 || index >= sourceCanMsg.Length) + { + return new USB2CANFD.CANFD_MSG[0]; + } + + // 创建单个元素的新数组 + USB2CANFD.CANFD_MSG[] targetMsg = new USB2CANFD.CANFD_MSG[1]; + targetMsg[0] = sourceCanMsg[index]; + + // 由于CANFD_MSG包含数组字段,需要手动初始化数据数组 + targetMsg[0].Data = new byte[64]; + // 复制数据 + Array.Copy(sourceCanMsg[index].Data, targetMsg[0].Data, sourceCanMsg[index].Data.Length); + + return targetMsg; + } /// /// 修改停止发送的方法 @@ -616,12 +669,12 @@ namespace CapMachine.Wpf.CanDrive /// /// 循环发送数据 /// - public ushort SendCycle { get; set; } = 100; + public ushort SendCycle { get; set; } = 200; /// /// 循环接受数据 /// - public ushort ReviceCycle { get; set; } = 500; + public ushort ReviceCycle { get; set; } = 200; /// @@ -666,21 +719,22 @@ namespace CapMachine.Wpf.CanDrive { CycleReviceTask = Task.Run(async () => { + //var ret = USB2CANFD.CANFD_StartGetMsg(DevHandle, ReadCANIndex); while (IsCycleRevice) { - await Task.Delay(1000); + await Task.Delay(ReviceCycle); try { //另外一个CAN通道读取数据 - USB2CANFD.CANFD_MSG[] CanMsgBuffer = new USB2CANFD.CANFD_MSG[10]; - msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG)) * CanMsgBuffer.Length); - int CanNum = USB2CANFD.CANFD_GetMsg(DevHandle, ReadCANIndex, msgPt, CanMsgBuffer.Length); + USB2CANFD.CANFD_MSG[] CanMsgBuffer = new USB2CANFD.CANFD_MSG[128]; + IntPtr msgPtRead = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG)) * CanMsgBuffer.Length); + int CanNum = USB2CANFD.CANFD_GetMsg(DevHandle, ReadCANIndex, msgPtRead, CanMsgBuffer.Length); if (CanNum > 0) { Console.WriteLine("Read CanMsgNum = {0}", CanNum); for (int i = 0; i < CanNum; i++) { - CanMsgBuffer[i] = (USB2CANFD.CANFD_MSG)Marshal.PtrToStructure((IntPtr)(msgPt + i * Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG))), typeof(USB2CANFD.CANFD_MSG)); + CanMsgBuffer[i] = (USB2CANFD.CANFD_MSG)Marshal.PtrToStructure((IntPtr)(msgPtRead + i * Marshal.SizeOf(typeof(USB2CANFD.CANFD_MSG))), typeof(USB2CANFD.CANFD_MSG)); Console.WriteLine("CanMsg[{0}].ID = 0x{1}", i, CanMsgBuffer[i].ID.ToString("X8")); //Console.WriteLine("CanMsg[{0}].TimeStamp = {1}",i,CanMsgBuffer[i].TimeStamp); Console.Write("CanMsg[{0}].Data = ", i); @@ -689,6 +743,14 @@ namespace CapMachine.Wpf.CanDrive Console.Write("{0} ", CanMsgBuffer[i].Data[j].ToString("X2")); } Console.WriteLine(""); + //报文给高速记录的服务 + HighSpeedDataService.AppendOrUpdateMsg(new Models.HighSpeed.CommMsg() + { + Category = "CANFD", + MsgInfo = "0x" + CanMsgBuffer[i].ID.ToString("X8"), + MsgData = BitConverter.ToString(CanMsgBuffer[i].Data), + Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + }); } } else if (CanNum == 0) @@ -702,13 +764,33 @@ namespace CapMachine.Wpf.CanDrive Console.WriteLine(""); //将CAN消息数据填充到信号里面 - DBCParserByFD.DBC_SyncCANFDMsgToValue(DBCHandle, msgPt, CanNum); - //获取信号值并打印出来 - StringBuilder ValueStr = new StringBuilder(32); - DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_current_Power"), ValueStr); - Console.WriteLine("COM_current_Power = {0}", ValueStr); - DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_Curr_dc"), ValueStr); - Console.WriteLine("COM_Curr_dc = {0}", ValueStr); + DBCParserByFD.DBC_SyncCANFDMsgToValue(DBCHandle, msgPtRead, CanNum); + + //循环获取消息的数据 + foreach (var item in ListCanFdDbcModel) + { + //有配置的名称的,认为是有用的,则需要读取数据 + //if (!string.IsNullOrEmpty(item.Name)) + //{ + //CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder(item.MsgName), new StringBuilder(item.SignalName), ValueSb); + //double[] ValueDouble; + DBCParserByFD.DBC_GetSignalValue(DBCHandle, new StringBuilder(item.MsgName), new StringBuilder(item.SignalName), ValueDouble); + //item.SignalRtValueSb = ValueSb; + item.SignalRtValue = ValueDouble[0].ToString(); + //Console.Write(ValueSb.ToString()); + //} + } + + //释放数据缓冲区,必须释放,否则程序运行一段时间后会报内存不足 + Marshal.FreeHGlobal(msgPtRead); + Thread.Sleep(10); + + ////获取信号值并打印出来 + //StringBuilder ValueStr = new StringBuilder(32); + //DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_current_Power"), ValueStr); + //Console.WriteLine("COM_current_Power = {0}", ValueStr); + //DBCParserByFD.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("TX1"), new StringBuilder("COM_Curr_dc"), ValueStr); + //Console.WriteLine("COM_Curr_dc = {0}", ValueStr); } catch (Exception ex) { diff --git a/CapMachine.Wpf/CanDrive/ToomossCan.cs b/CapMachine.Wpf/CanDrive/ToomossCan.cs index e4c8dbe..153e1f2 100644 --- a/CapMachine.Wpf/CanDrive/ToomossCan.cs +++ b/CapMachine.Wpf/CanDrive/ToomossCan.cs @@ -123,6 +123,7 @@ namespace CapMachine.Wpf.CanDrive ///BufferSize 存储CAN消息缓冲区大小。 ///返回值: //大于等于0表示从CAN适配器内部成功读取到的CAN消息帧数,若返回值小于0则说明调用该函数失败。 + /// 目前是WriteCANIndex和ReadCANIndex需要相同 /// public Byte WriteCANIndex { get; set; } = 0; diff --git a/CapMachine.Wpf/Models/ComEnum.cs b/CapMachine.Wpf/Models/ComEnum.cs index 8f7b3e9..b02b82e 100644 --- a/CapMachine.Wpf/Models/ComEnum.cs +++ b/CapMachine.Wpf/Models/ComEnum.cs @@ -79,6 +79,11 @@ namespace CapMachine.Wpf.Models /// Lin /// Lin = 2, + + /// + /// CAN FD + /// + CANFD = 3, } } } diff --git a/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs b/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs index 7294059..cba1a0c 100644 --- a/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/CANFDConfigViewModel.cs @@ -840,7 +840,7 @@ namespace CapMachine.Wpf.ViewModels if (CanFdDriveService.ToomossCanFDDrive.OpenState) { //系统使用了CAN - ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.Can; + ConfigService.CanLinRunStateModel.CurSysSelectedCanLin = CanLinEnum.CANFD; } //CAN DBC配置 有DBC配置的话,则直接加载DBC信息 diff --git a/CapMachine.Wpf/Views/CANFDConfigView.xaml b/CapMachine.Wpf/Views/CANFDConfigView.xaml index f9f7e02..cc7168d 100644 --- a/CapMachine.Wpf/Views/CANFDConfigView.xaml +++ b/CapMachine.Wpf/Views/CANFDConfigView.xaml @@ -466,10 +466,10 @@