CAN 配置和报文记录的功能
This commit is contained in:
@@ -12,46 +12,63 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// </summary>
|
||||
public class CAN_DBCParser
|
||||
{
|
||||
public const Int32 DBC_PARSER_OK = 0;//没有错误
|
||||
public const Int32 DBC_PARSER_FILE_OPEN = (-1);//打开文件出错
|
||||
public const Int32 DBC_PARSER_FILE_FORMAT = (-2);//文件格式错误
|
||||
public const Int32 DBC_PARSER_DEV_DISCONNECT = (-3);//设备未连接
|
||||
public const Int32 DBC_PARSER_HANDLE_ERROR = (-4);//LDF Handle错误
|
||||
public const Int32 DBC_PARSER_GET_INFO_ERROR = (-5);//获取解析后的数据出错
|
||||
public const Int32 DBC_PARSER_DATA_ERROR = (-6);//数据处理错误
|
||||
public const Int32 DBC_PARSER_SLAVE_NACK = (-7);//从机未响应数据
|
||||
public const Int32 DBC_PARSER_OK = 0;//没有错误
|
||||
public const Int32 DBC_PARSER_FILE_OPEN = (-1);//打开文件出错
|
||||
public const Int32 DBC_PARSER_FILE_FORMAT = (-2);//文件格式错误
|
||||
public const Int32 DBC_PARSER_DEV_DISCONNECT = (-3);//设备未连接
|
||||
public const Int32 DBC_PARSER_HANDLE_ERROR = (-4);//LDF Handle错误
|
||||
public const Int32 DBC_PARSER_GET_INFO_ERROR = (-5);//获取解析后的数据出错
|
||||
public const Int32 DBC_PARSER_DATA_ERROR = (-6);//数据处理错误
|
||||
public const Int32 DBC_PARSER_SLAVE_NACK = (-7);//从机未响应数据
|
||||
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern UInt64 DBC_ParserFile(int DevHandle, StringBuilder pDBCFileName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgQuantity(UInt64 DBCHandle);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgName(UInt64 DBCHandle, int index, StringBuilder pMsgName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgSignalQuantity(UInt64 DBCHandle, StringBuilder pMsgName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgSignalName(UInt64 DBCHandle, StringBuilder pMsgName, int index, StringBuilder pSignalName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgPublisher(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pPublisher);
|
||||
//设置信号值
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SetSignalValue(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pSignalName, double Value);
|
||||
//获取信号值
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetSignalValue(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pSignalName, double[] pValue);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetSignalValueStr(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pSignalName, StringBuilder pValueStr);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern UInt64 DBC_ParserFile(int DevHandle, StringBuilder pDBCFileName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgQuantity(UInt64 DBCHandle);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgName(UInt64 DBCHandle, int index, StringBuilder pMsgName);
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="DBCHandle"></param>
|
||||
/// <param name="ID"></param>
|
||||
/// <param name="pMsgName"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgNameByID(UInt64 DBCHandle, int ID, StringBuilder pMsgName);
|
||||
/// <summary>
|
||||
/// 获取ID根据名称
|
||||
/// </summary>
|
||||
/// <param name="DBCHandle"></param>
|
||||
/// <param name="pMsgName"></param>
|
||||
/// <returns></returns>
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgIDByName(UInt64 DBCHandle, StringBuilder pMsgName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgSignalQuantity(UInt64 DBCHandle, StringBuilder pMsgName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgSignalName(UInt64 DBCHandle, StringBuilder pMsgName, int index, StringBuilder pSignalName);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetMsgPublisher(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pPublisher);
|
||||
//设置信号值
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SetSignalValue(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pSignalName, double Value);
|
||||
//获取信号值
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetSignalValue(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pSignalName, double[] pValue);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_GetSignalValueStr(UInt64 DBCHandle, StringBuilder pMsgName, StringBuilder pSignalName, StringBuilder pValueStr);
|
||||
|
||||
//将CAN消息数据填充到信号里面
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncCANMsgToValue(UInt64 DBCHandle, IntPtr pCANMsg, int MsgLen);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncCANFDMsgToValue(UInt64 DBCHandle, IntPtr pCANFDMsg, int MsgLen);
|
||||
//将信号数据填充到CAN消息里面
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncValueToCANMsg(UInt64 DBCHandle, StringBuilder pMsgName, IntPtr pCANMsg);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncValueToCANFDMsg(UInt64 DBCHandle, StringBuilder pMsgName, IntPtr pCANFDMsg);
|
||||
|
||||
//将CAN消息数据填充到信号里面
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncCANMsgToValue(UInt64 DBCHandle, IntPtr pCANMsg, int MsgLen);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncCANFDMsgToValue(UInt64 DBCHandle, IntPtr pCANFDMsg, int MsgLen);
|
||||
//将信号数据填充到CAN消息里面
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncValueToCANMsg(UInt64 DBCHandle, StringBuilder pMsgName, IntPtr pCANMsg);
|
||||
[DllImport("USB2XXX.dll")]
|
||||
public static extern Int32 DBC_SyncValueToCANFDMsg(UInt64 DBCHandle, StringBuilder pMsgName, IntPtr pCANFDMsg);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,13 +10,20 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// <summary>
|
||||
/// Dbc 信息
|
||||
/// </summary>
|
||||
public class CanDbcModel:BindableBase
|
||||
public class CanDbcModel : BindableBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 消息Id
|
||||
/// </summary>
|
||||
public string? MsgId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 配置的中文名称:速度,转速限制,使能等常用的信息数据
|
||||
/// 但不是所有的SignalName都会配置一个Name,只是需要时才会配置名称
|
||||
/// 但是CanDbcModel集合会包括所有的SignalName名称的
|
||||
/// </summary>
|
||||
public string? Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 消息名称
|
||||
/// </summary>
|
||||
@@ -38,20 +45,39 @@ namespace CapMachine.Wpf.CanDrive
|
||||
public string? SignalUnit { get; set; }
|
||||
|
||||
|
||||
private string? _SignalRtValue;
|
||||
private string? _SignalRtValue = "--";
|
||||
/// <summary>
|
||||
/// 信号实时值
|
||||
/// </summary>
|
||||
public string? SignalRtValue
|
||||
{
|
||||
get { return _SignalRtValue; }
|
||||
set { _SignalRtValue = value;RaisePropertyChanged(); }
|
||||
set { _SignalRtValue = value; RaisePropertyChanged(); }
|
||||
}
|
||||
|
||||
private StringBuilder _SignalRtValueSb = new StringBuilder(10);
|
||||
/// <summary>
|
||||
/// 信号实时值 StringBuilder
|
||||
/// </summary>
|
||||
public StringBuilder SignalRtValueSb
|
||||
{
|
||||
get { return _SignalRtValueSb; }
|
||||
set
|
||||
{
|
||||
if (_SignalRtValueSb != value)
|
||||
{
|
||||
SignalRtValue = value.ToString();
|
||||
_SignalRtValueSb = value;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 发布者
|
||||
/// </summary>
|
||||
public string? Publisher { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
using CapMachine.Wpf.Models.Tag;
|
||||
using CapMachine.Wpf.Services;
|
||||
using HslCommunication;
|
||||
using NPOI.OpenXmlFormats.Wordprocessing;
|
||||
using Prism.Ioc;
|
||||
using Prism.Mvvm;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -12,6 +15,7 @@ using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Windows.Interop;
|
||||
using static CapMachine.Wpf.CanDrive.USB2CAN;
|
||||
|
||||
namespace CapMachine.Wpf.CanDrive
|
||||
{
|
||||
@@ -20,12 +24,15 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// </summary>
|
||||
public class ToomossCan : BindableBase
|
||||
{
|
||||
private readonly IContainerProvider ContainerProvider;
|
||||
|
||||
/// <summary>
|
||||
/// 实例化函数
|
||||
/// </summary>
|
||||
public ToomossCan()
|
||||
public ToomossCan(IContainerProvider containerProvider)
|
||||
{
|
||||
|
||||
ContainerProvider = containerProvider;
|
||||
HighSpeedDataService = ContainerProvider.Resolve<HighSpeedDataService>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -42,16 +49,31 @@ namespace CapMachine.Wpf.CanDrive
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// HighSpeedDataService 实例
|
||||
/// </summary>
|
||||
public HighSpeedDataService HighSpeedDataService { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 开始Dbc文件写入
|
||||
/// </summary>
|
||||
public void StartDbc(string DbcPath)
|
||||
public ObservableCollection<CanDbcModel> StartDbc(string DbcPath)
|
||||
{
|
||||
DBC_Parser(DbcPath);
|
||||
return ListCanDbcModel;
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// 获取Can DBC数据集合
|
||||
///// </summary>
|
||||
//public void LoadCanDbcData(ObservableCollection<CanDbcModel> canDbcModels)
|
||||
//{
|
||||
// ListCanDbcModel = canDbcModels;
|
||||
//}
|
||||
|
||||
/// <summary>
|
||||
/// Dbc消息集合
|
||||
/// 包括读取的实时值和数据
|
||||
/// </summary>
|
||||
public ObservableCollection<CanDbcModel> ListCanDbcModel { get; set; } = new ObservableCollection<CanDbcModel>();
|
||||
|
||||
@@ -69,6 +91,7 @@ namespace CapMachine.Wpf.CanDrive
|
||||
USB2CAN.CAN_INIT_CONFIG CANConfig = new USB2CAN.CAN_INIT_CONFIG();
|
||||
|
||||
/// <summary>
|
||||
/// DBC加载后获取的Handle
|
||||
/// DBC Handle
|
||||
/// </summary>
|
||||
public UInt64 DBCHandle { get; set; }
|
||||
@@ -82,15 +105,40 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// 扫描设备Handle
|
||||
/// </summary>
|
||||
public Int32 DevHandle { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Write CAN Index
|
||||
/// 通道的含义
|
||||
/// 描述:
|
||||
/// 读取接收到的CAN消息,推荐使用该函数。
|
||||
///原型:
|
||||
///int WINAPI CAN_GetMsgWithSize(int DevHandle, unsigned char CANIndex, CAN_MSG* pCanGetMsg, int BufferSize);
|
||||
///参数:
|
||||
///DevHandle 设备句柄,本质为设备序号的低4字节,可以通过调用USB_ScanDevice函数获得。
|
||||
///CANIndex CAN通道索引号,0-对应CAN1,1-对应CAN2。
|
||||
///pCanGetMsg 存储CAN消息缓冲区首地址。
|
||||
///BufferSize 存储CAN消息缓冲区大小。
|
||||
///返回值:
|
||||
//大于等于0表示从CAN适配器内部成功读取到的CAN消息帧数,若返回值小于0则说明调用该函数失败。
|
||||
/// </summary>
|
||||
public Byte WriteCANIndex { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Read CAN Index
|
||||
/// 通道的含义
|
||||
/// 描述:
|
||||
///读取接收到的CAN消息,推荐使用该函数。
|
||||
///原型:
|
||||
///int WINAPI CAN_GetMsgWithSize(int DevHandle, unsigned char CANIndex, CAN_MSG* pCanGetMsg, int BufferSize);
|
||||
///参数:
|
||||
///DevHandle 设备句柄,本质为设备序号的低4字节,可以通过调用USB_ScanDevice函数获得。
|
||||
///CANIndex CAN通道索引号,0-对应CAN1,1-对应CAN2。
|
||||
///pCanGetMsg 存储CAN消息缓冲区首地址。
|
||||
///BufferSize 存储CAN消息缓冲区大小。
|
||||
///返回值:
|
||||
///大于等于0表示从CAN适配器内部成功读取到的CAN消息帧数,若返回值小于0则说明调用该函数失败。
|
||||
/// </summary>
|
||||
public Byte ReadCANIndex { get; set; } = 1;
|
||||
public Byte ReadCANIndex { get; set; } = 0;
|
||||
|
||||
|
||||
private bool _OpenState;
|
||||
@@ -219,6 +267,7 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// </summary>
|
||||
public void GetCANConfig()
|
||||
{
|
||||
CANConfig.CAN_Mode = 0x80;//正常模式并接入终端电阻
|
||||
//获取CAN波特率参数
|
||||
ret = USB2CAN.CAN_GetCANSpeedArg(DevHandle, ref CANConfig, 500000);
|
||||
if (ret != USB2CAN.CAN_SUCCESS)
|
||||
@@ -295,6 +344,9 @@ namespace CapMachine.Wpf.CanDrive
|
||||
int DBCSigNum = CAN_DBCParser.DBC_GetMsgSignalQuantity(DBCHandle, MsgName);
|
||||
StringBuilder Publisher = new StringBuilder(32);
|
||||
CAN_DBCParser.DBC_GetMsgPublisher(DBCHandle, MsgName, Publisher);
|
||||
long MsgId;
|
||||
MsgId = CAN_DBCParser.DBC_GetMsgIDByName(DBCHandle, MsgName);
|
||||
|
||||
Console.Write("Signals:");
|
||||
for (int j = 0; j < DBCSigNum; j++)
|
||||
{
|
||||
@@ -306,7 +358,7 @@ namespace CapMachine.Wpf.CanDrive
|
||||
ListCanDbcModel.Add(new CanDbcModel()
|
||||
{
|
||||
MsgName = MsgName.ToString(),
|
||||
MsgId = "",
|
||||
MsgId = "0x" + MsgId.ToString("X8"),
|
||||
SignalName = SigName.ToString(),
|
||||
SignalDesc = "",
|
||||
SignalUnit = "",
|
||||
@@ -352,7 +404,7 @@ namespace CapMachine.Wpf.CanDrive
|
||||
|
||||
//通过DBC写入数据后生成CanMsg
|
||||
//将信号值填入CAN消息里面
|
||||
|
||||
|
||||
|
||||
//释放申请的临时缓冲区
|
||||
Marshal.FreeHGlobal(msgPt);
|
||||
@@ -379,6 +431,8 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// </summary>
|
||||
private static Task CycleReviceTask { get; set; }
|
||||
|
||||
StringBuilder ValueSb = new StringBuilder(16);
|
||||
|
||||
/// <summary>
|
||||
/// 循环获取CAN消息
|
||||
/// </summary>
|
||||
@@ -388,7 +442,7 @@ namespace CapMachine.Wpf.CanDrive
|
||||
{
|
||||
while (IsCycleRevice)
|
||||
{
|
||||
await Task.Delay(1000);
|
||||
await Task.Delay(500);
|
||||
try
|
||||
{
|
||||
//另外一个CAN通道读取数据
|
||||
@@ -400,7 +454,9 @@ namespace CapMachine.Wpf.CanDrive
|
||||
Console.WriteLine("Read CanMsgNum = {0}", CanNum);
|
||||
for (int i = 0; i < CanNum; i++)
|
||||
{
|
||||
CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)msgPt + i * Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))), typeof(USB2CAN.CAN_MSG));
|
||||
//CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)msgPt + i * Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))), typeof(USB2CAN.CAN_MSG)); //有溢出报错
|
||||
CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)(msgPt + i * Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))), typeof(USB2CAN.CAN_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);
|
||||
@@ -409,6 +465,14 @@ namespace CapMachine.Wpf.CanDrive
|
||||
Console.Write("{0} ", CanMsgBuffer[i].Data[j].ToString("X2"));
|
||||
}
|
||||
Console.WriteLine("");
|
||||
|
||||
HighSpeedDataService.AppendOrUpdateMsg(new Models.HighSpeed.CommMsg()
|
||||
{
|
||||
Category="CAN",
|
||||
MsgInfo="0x"+CanMsgBuffer[i].ID.ToString("X8"),
|
||||
MsgData= CanMsgBuffer[i].Data.ToArrayString(),
|
||||
Time=DateTime.Now.ToString()
|
||||
});
|
||||
}
|
||||
}
|
||||
else if (CanNum == 0)
|
||||
@@ -421,16 +485,29 @@ namespace CapMachine.Wpf.CanDrive
|
||||
}
|
||||
Console.WriteLine("");
|
||||
|
||||
//将CAN消息数据填充到信号里面
|
||||
//将CAN消息数据填充到信号里面,用DBC解析数据
|
||||
CAN_DBCParser.DBC_SyncCANMsgToValue(DBCHandle, msgPt, CanNum);
|
||||
//获取信号值并打印出来
|
||||
StringBuilder ValueStr = new StringBuilder(32);
|
||||
CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("msg_moto_speed"), new StringBuilder("moto_speed"), ValueStr);
|
||||
Console.WriteLine("moto_speed = {0}", ValueStr);
|
||||
CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("msg_oil_pressure"), new StringBuilder("oil_pressure"), ValueStr);
|
||||
Console.WriteLine("oil_pressure = {0}", ValueStr);
|
||||
CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("msg_speed_can"), new StringBuilder("speed_can"), ValueStr);
|
||||
Console.WriteLine("speed_can = {0}", ValueStr);
|
||||
|
||||
//循环获取消息的数据
|
||||
foreach (var item in ListCanDbcModel)
|
||||
{
|
||||
//有配置的名称的,认为是有用的,则需要读取数据
|
||||
//if (!string.IsNullOrEmpty(item.Name))
|
||||
//{
|
||||
CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder(item.MsgName), new StringBuilder(item.SignalName), ValueSb);
|
||||
item.SignalRtValueSb = ValueSb;
|
||||
|
||||
//}
|
||||
}
|
||||
|
||||
////获取信号值并打印出来
|
||||
//StringBuilder ValueStr = new StringBuilder(32);
|
||||
//CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("msg_moto_speed"), new StringBuilder("moto_speed"), ValueStr);
|
||||
//Console.WriteLine("moto_speed = {0}", ValueStr);
|
||||
//CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("msg_oil_pressure"), new StringBuilder("oil_pressure"), ValueStr);
|
||||
//Console.WriteLine("oil_pressure = {0}", ValueStr);
|
||||
//CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder("msg_speed_can"), new StringBuilder("speed_can"), ValueStr);
|
||||
//Console.WriteLine("speed_can = {0}", ValueStr);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user