CAN FD修改

This commit is contained in:
2025-07-08 10:37:52 +08:00
parent 4e4a078100
commit 4e215eec8f
5 changed files with 112 additions and 24 deletions

View File

@@ -83,6 +83,16 @@ namespace CapMachine.Wpf.CanDrive
/// </summary>
USB2CANFD.CANFD_INIT_CONFIG CANConfig = new USB2CANFD.CANFD_INIT_CONFIG();
/// <summary>
/// 诊断信息
/// </summary>
public USB2CANFD.CANFD_DIAGNOSTIC CurCANFD_DIAGNOSTIC = new USB2CANFD.CANFD_DIAGNOSTIC();
/// <summary>
/// CANFD总线错误信息
/// </summary>
public USB2CANFD.CANFD_BUS_ERROR CurCANFD_BUS_ERROR = new USB2CANFD.CANFD_BUS_ERROR();
/// <summary>
/// DBC Handle
/// </summary>
@@ -97,6 +107,7 @@ namespace CapMachine.Wpf.CanDrive
/// 扫描设备Handle
/// </summary>
public Int32 DevHandle { get; set; } = 0;
/// <summary>
/// Write CAN Index
/// </summary>
@@ -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;
}
/// <summary>
@@ -424,6 +440,8 @@ namespace CapMachine.Wpf.CanDrive
private static readonly Random _random = new Random();
/// <summary>
/// 精确周期发送CAN数据
/// </summary>
@@ -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);
}
/// <summary>
/// 获取CAN消息数组中指定位置的数据
/// </summary>
/// <param name="sourceCanMsg">源CAN消息数组</param>
/// <param name="index">要获取的数据索引位置</param>
/// <returns>返回指定位置数据的新数组</returns>
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;
}
/// <summary>
/// 修改停止发送的方法
@@ -616,12 +669,12 @@ namespace CapMachine.Wpf.CanDrive
/// <summary>
/// 循环发送数据
/// </summary>
public ushort SendCycle { get; set; } = 100;
public ushort SendCycle { get; set; } = 200;
/// <summary>
/// 循环接受数据
/// </summary>
public ushort ReviceCycle { get; set; } = 500;
public ushort ReviceCycle { get; set; } = 200;
/// <summary>
@@ -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)
{

View File

@@ -123,6 +123,7 @@ namespace CapMachine.Wpf.CanDrive
///BufferSize 存储CAN消息缓冲区大小。
///返回值:
//大于等于0表示从CAN适配器内部成功读取到的CAN消息帧数若返回值小于0则说明调用该函数失败。
/// 目前是WriteCANIndex和ReadCANIndex需要相同
/// </summary>
public Byte WriteCANIndex { get; set; } = 0;

View File

@@ -79,6 +79,11 @@ namespace CapMachine.Wpf.Models
/// Lin
/// </summary>
Lin = 2,
/// <summary>
/// CAN FD
/// </summary>
CANFD = 3,
}
}
}

View File

@@ -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信息

View File

@@ -466,10 +466,10 @@
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.OpenState}" Value="True">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.OpenState}" Value="True">
<Setter Property="Background" Value="LimeGreen" />
</DataTrigger>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.OpenState}" Value="False">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.OpenState}" Value="False">
<Setter Property="Background" Value="Gray" />
</DataTrigger>
</Style.Triggers>
@@ -490,10 +490,10 @@
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.DbcParserState}" Value="True">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.DbcParserState}" Value="True">
<Setter Property="Background" Value="LimeGreen" />
</DataTrigger>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.DbcParserState}" Value="False">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.DbcParserState}" Value="False">
<Setter Property="Background" Value="Gray" />
</DataTrigger>
</Style.Triggers>
@@ -513,11 +513,11 @@
<Button.Style>
<Style BasedOn="{StaticResource MaterialDesignFlatDarkBgButton}" TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.IsCycleSend}" Value="true">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.IsCycleSend}" Value="true">
<Setter Property="Background" Value="LimeGreen" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.IsCycleSend}" Value="false">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.IsCycleSend}" Value="false">
<Setter Property="Background" Value="Gray" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
@@ -545,11 +545,11 @@
<Button.Style>
<Style BasedOn="{StaticResource MaterialDesignFlatDarkBgButton}" TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.IsCycleRevice}" Value="true">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.IsCycleRevice}" Value="true">
<Setter Property="Background" Value="LimeGreen" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
<DataTrigger Binding="{Binding CanDriveService.ToomossCanDrive.IsCycleRevice}" Value="false">
<DataTrigger Binding="{Binding CanFdDriveService.ToomossCanFDDrive.IsCycleRevice}" Value="false">
<Setter Property="Background" Value="Gray" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>