CAN FD修改
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -123,6 +123,7 @@ namespace CapMachine.Wpf.CanDrive
|
||||
///BufferSize 存储CAN消息缓冲区大小。
|
||||
///返回值:
|
||||
//大于等于0表示从CAN适配器内部成功读取到的CAN消息帧数,若返回值小于0则说明调用该函数失败。
|
||||
/// 目前是WriteCANIndex和ReadCANIndex需要相同
|
||||
/// </summary>
|
||||
public Byte WriteCANIndex { get; set; } = 0;
|
||||
|
||||
|
||||
@@ -79,6 +79,11 @@ namespace CapMachine.Wpf.Models
|
||||
/// Lin
|
||||
/// </summary>
|
||||
Lin = 2,
|
||||
|
||||
/// <summary>
|
||||
/// CAN FD
|
||||
/// </summary>
|
||||
CANFD = 3,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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信息
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user