现场更改3
This commit is contained in:
@@ -25,6 +25,7 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
public class ToomossCan : BindableBase
|
public class ToomossCan : BindableBase
|
||||||
{
|
{
|
||||||
private readonly IContainerProvider ContainerProvider;
|
private readonly IContainerProvider ContainerProvider;
|
||||||
|
private readonly object _dbcParserLock = new object();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 实例化函数
|
/// 实例化函数
|
||||||
@@ -332,58 +333,61 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void DBC_Parser(string Path)
|
public void DBC_Parser(string Path)
|
||||||
{
|
{
|
||||||
//解析DBC文件
|
lock (_dbcParserLock)
|
||||||
DBCHandle = CAN_DBCParser.DBC_ParserFile(DevHandle, new StringBuilder(Path));
|
|
||||||
if (DBCHandle == 0)
|
|
||||||
{
|
{
|
||||||
Console.WriteLine("Parser DBC File error!");
|
//解析DBC文件
|
||||||
DbcParserState = false;
|
DBCHandle = CAN_DBCParser.DBC_ParserFile(DevHandle, new StringBuilder(Path));
|
||||||
return;
|
if (DBCHandle == 0)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine("Parser DBC File success!");
|
|
||||||
}
|
|
||||||
|
|
||||||
ListCanDbcModel.Clear();
|
|
||||||
|
|
||||||
//打印DBC里面报文和信号相关信息
|
|
||||||
int DBCMsgNum = CAN_DBCParser.DBC_GetMsgQuantity(DBCHandle);
|
|
||||||
for (int i = 0; i < DBCMsgNum; i++)
|
|
||||||
{
|
|
||||||
StringBuilder MsgName = new StringBuilder(32);
|
|
||||||
CAN_DBCParser.DBC_GetMsgName(DBCHandle, i, MsgName);
|
|
||||||
//Console.WriteLine("Msg.Name = {0}", MsgName);
|
|
||||||
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++)
|
|
||||||
{
|
{
|
||||||
StringBuilder SigName = new StringBuilder(32);
|
Console.WriteLine("Parser DBC File error!");
|
||||||
CAN_DBCParser.DBC_GetMsgSignalName(DBCHandle, MsgName, j, SigName);
|
DbcParserState = false;
|
||||||
//Console.Write("{0} ", SigName);
|
return;
|
||||||
|
}
|
||||||
//增加信息数据
|
else
|
||||||
ListCanDbcModel.Add(new CanDbcModel()
|
{
|
||||||
{
|
Console.WriteLine("Parser DBC File success!");
|
||||||
MsgName = MsgName.ToString(),
|
|
||||||
MsgId = "0x" + MsgId.ToString("X8"),
|
|
||||||
SignalName = SigName.ToString(),
|
|
||||||
SignalDesc = "",
|
|
||||||
SignalUnit = "",
|
|
||||||
SignalRtValue = "",
|
|
||||||
Publisher = Publisher.ToString()
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
//Console.WriteLine("");
|
|
||||||
}
|
|
||||||
|
|
||||||
//Dbc解析成功
|
ListCanDbcModel.Clear();
|
||||||
DbcParserState = true;
|
|
||||||
|
//打印DBC里面报文和信号相关信息
|
||||||
|
int DBCMsgNum = CAN_DBCParser.DBC_GetMsgQuantity(DBCHandle);
|
||||||
|
for (int i = 0; i < DBCMsgNum; i++)
|
||||||
|
{
|
||||||
|
StringBuilder MsgName = new StringBuilder(32);
|
||||||
|
CAN_DBCParser.DBC_GetMsgName(DBCHandle, i, MsgName);
|
||||||
|
//Console.WriteLine("Msg.Name = {0}", MsgName);
|
||||||
|
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++)
|
||||||
|
{
|
||||||
|
StringBuilder SigName = new StringBuilder(32);
|
||||||
|
CAN_DBCParser.DBC_GetMsgSignalName(DBCHandle, MsgName, j, SigName);
|
||||||
|
//Console.Write("{0} ", SigName);
|
||||||
|
|
||||||
|
//增加信息数据
|
||||||
|
ListCanDbcModel.Add(new CanDbcModel()
|
||||||
|
{
|
||||||
|
MsgName = MsgName.ToString(),
|
||||||
|
MsgId = "0x" + MsgId.ToString("X8"),
|
||||||
|
SignalName = SigName.ToString(),
|
||||||
|
SignalDesc = "",
|
||||||
|
SignalUnit = "",
|
||||||
|
SignalRtValue = "",
|
||||||
|
Publisher = Publisher.ToString()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//Console.WriteLine("");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Dbc解析成功
|
||||||
|
DbcParserState = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -397,33 +401,36 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
for (int i = 0; i < GroupMsg.Count(); i++)
|
for (int i = 0; i < GroupMsg.Count(); i++)
|
||||||
{
|
{
|
||||||
CanMsg[i] = new USB2CAN.CAN_MSG();
|
CanMsg[i] = new USB2CAN.CAN_MSG();
|
||||||
CanMsg[i].Data = new Byte[64];
|
CanMsg[i].Data = new Byte[8];
|
||||||
}
|
}
|
||||||
|
|
||||||
IntPtr msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
IntPtr msgPt = IntPtr.Zero;
|
||||||
int Index = 0;
|
try
|
||||||
//循环给MSG赋值数据
|
|
||||||
foreach (var itemMsg in GroupMsg)
|
|
||||||
{
|
{
|
||||||
foreach (var itemSignal in itemMsg)
|
msgPt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
||||||
|
int Index = 0;
|
||||||
|
lock (_dbcParserLock)
|
||||||
{
|
{
|
||||||
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
|
//循环给MSG赋值数据
|
||||||
|
foreach (var itemMsg in GroupMsg)
|
||||||
|
{
|
||||||
|
foreach (var itemSignal in itemMsg)
|
||||||
|
{
|
||||||
|
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
|
||||||
|
}
|
||||||
|
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPt);
|
||||||
|
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPt, typeof(USB2CAN.CAN_MSG));
|
||||||
|
Index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (msgPt != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
Marshal.FreeHGlobal(msgPt);
|
||||||
}
|
}
|
||||||
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPt);
|
|
||||||
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPt, typeof(USB2CAN.CAN_MSG));
|
|
||||||
Index++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//设置信号值
|
|
||||||
//DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder("msg_moto_speed"), new StringBuilder("moto_speed"), 2412);
|
|
||||||
//DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder("msg_oil_pressure"), new StringBuilder("oil_pressure"), 980);
|
|
||||||
//DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder("msg_speed_can"), new StringBuilder("speed_can"), 120);
|
|
||||||
|
|
||||||
//通过DBC写入数据后生成CanMsg
|
|
||||||
//将信号值填入CAN消息里面
|
|
||||||
|
|
||||||
//释放申请的临时缓冲区
|
|
||||||
Marshal.FreeHGlobal(msgPt);
|
|
||||||
Console.WriteLine("");
|
Console.WriteLine("");
|
||||||
//发送CAN数据
|
//发送CAN数据
|
||||||
int SendedNum = USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, CanMsg, (uint)CanMsg.Length);
|
int SendedNum = USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, CanMsg, (uint)CanMsg.Length);
|
||||||
@@ -492,6 +499,11 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void StartCycleSendMsg()
|
public void StartCycleSendMsg()
|
||||||
{
|
{
|
||||||
|
if (CycleSendTask != null && !CycleSendTask.IsCompleted)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CycleSendTask = Task.Run(async () =>
|
CycleSendTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
while (IsCycleSend)
|
while (IsCycleSend)
|
||||||
@@ -504,27 +516,36 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
for (int i = 0; i < GroupMsg.Count(); i++)
|
for (int i = 0; i < GroupMsg.Count(); i++)
|
||||||
{
|
{
|
||||||
CanMsg[i] = new USB2CAN.CAN_MSG();
|
CanMsg[i] = new USB2CAN.CAN_MSG();
|
||||||
CanMsg[i].Data = new Byte[64];
|
CanMsg[i].Data = new Byte[8];
|
||||||
}
|
}
|
||||||
|
|
||||||
IntPtr msgPtSend = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
IntPtr msgPtSend = IntPtr.Zero;
|
||||||
int Index = 0;
|
try
|
||||||
//循环给MSG赋值数据
|
|
||||||
foreach (var itemMsg in GroupMsg)
|
|
||||||
{
|
{
|
||||||
foreach (var itemSignal in itemMsg)
|
msgPtSend = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
||||||
|
int Index = 0;
|
||||||
|
lock (_dbcParserLock)
|
||||||
{
|
{
|
||||||
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
|
//循环给MSG赋值数据
|
||||||
|
foreach (var itemMsg in GroupMsg)
|
||||||
|
{
|
||||||
|
foreach (var itemSignal in itemMsg)
|
||||||
|
{
|
||||||
|
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
|
||||||
|
}
|
||||||
|
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend);
|
||||||
|
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPtSend, typeof(USB2CAN.CAN_MSG));
|
||||||
|
Index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (msgPtSend != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
Marshal.FreeHGlobal(msgPtSend);
|
||||||
}
|
}
|
||||||
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend);
|
|
||||||
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPtSend, typeof(USB2CAN.CAN_MSG));
|
|
||||||
Index++;
|
|
||||||
}
|
}
|
||||||
//通过DBC写入数据后生成CanMsg
|
|
||||||
//将信号值填入CAN消息里面
|
|
||||||
|
|
||||||
//释放申请的临时缓冲区
|
|
||||||
Marshal.FreeHGlobal(msgPtSend);
|
|
||||||
Console.WriteLine("");
|
Console.WriteLine("");
|
||||||
//发送CAN数据
|
//发送CAN数据
|
||||||
int SendedNum = USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, CanMsg, (uint)CanMsg.Length);
|
int SendedNum = USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, CanMsg, (uint)CanMsg.Length);
|
||||||
@@ -551,6 +572,11 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void StartCycleReviceCanMsg()
|
public void StartCycleReviceCanMsg()
|
||||||
{
|
{
|
||||||
|
if (CycleReviceTask != null && !CycleReviceTask.IsCompleted)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CycleReviceTask = Task.Run(async () =>
|
CycleReviceTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
while (IsCycleRevice)
|
while (IsCycleRevice)
|
||||||
@@ -558,65 +584,81 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
await Task.Delay(ReviceCycle);
|
await Task.Delay(ReviceCycle);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//另外一个CAN通道读取数据
|
IntPtr msgPtRead = IntPtr.Zero;
|
||||||
USB2CAN.CAN_MSG[] CanMsgBuffer = new USB2CAN.CAN_MSG[128];
|
try
|
||||||
//申请数据缓冲区
|
|
||||||
IntPtr msgPtRead = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)) * CanMsgBuffer.Length);
|
|
||||||
int CanNum = USB2CAN.CAN_GetMsgWithSize(DevHandle, ReadCANIndex, msgPtRead, CanMsgBuffer.Length);
|
|
||||||
if (CanNum > 0)
|
|
||||||
{
|
{
|
||||||
Console.WriteLine("Read CanMsgNum = {0}", CanNum);
|
//另外一个CAN通道读取数据
|
||||||
for (int i = 0; i < CanNum; i++)
|
USB2CAN.CAN_MSG[] CanMsgBuffer = new USB2CAN.CAN_MSG[128];
|
||||||
|
//申请数据缓冲区
|
||||||
|
msgPtRead = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)) * CanMsgBuffer.Length);
|
||||||
|
int CanNum = USB2CAN.CAN_GetMsgWithSize(DevHandle, ReadCANIndex, msgPtRead, CanMsgBuffer.Length);
|
||||||
|
if (CanNum > 0)
|
||||||
{
|
{
|
||||||
//CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)msgPtRead + i * Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))), typeof(USB2CAN.CAN_MSG)); //有溢出报错
|
Console.WriteLine("Read CanMsgNum = {0}", CanNum);
|
||||||
CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)(msgPtRead + i * Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))), typeof(USB2CAN.CAN_MSG));
|
for (int i = 0; i < CanNum; i++)
|
||||||
|
|
||||||
//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);
|
|
||||||
for (int j = 0; j < CanMsgBuffer[i].DataLen; j++)
|
|
||||||
{
|
{
|
||||||
Console.Write("{0} ", CanMsgBuffer[i].Data[j].ToString("X2"));
|
//CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)((UInt32)msgPtRead + i * Marshal.SizeOf(typeof(USB2CAN.CAN_MSG))), typeof(USB2CAN.CAN_MSG)); //有溢出报错
|
||||||
|
CanMsgBuffer[i] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure((IntPtr)(msgPtRead + 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);
|
||||||
|
for (int j = 0; j < CanMsgBuffer[i].DataLen; j++)
|
||||||
|
{
|
||||||
|
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 = BitConverter.ToString(CanMsgBuffer[i].Data),
|
||||||
|
Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
|
||||||
|
});
|
||||||
}
|
}
|
||||||
//Console.WriteLine("");
|
}
|
||||||
|
else if (CanNum == 0)
|
||||||
|
{
|
||||||
|
//Console.WriteLine("No CAN data!");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Console.WriteLine("Get CAN data error!");
|
||||||
|
}
|
||||||
|
Console.WriteLine("");
|
||||||
|
|
||||||
//报文给高速记录的服务
|
if (CanNum > 0)
|
||||||
HighSpeedDataService.AppendOrUpdateMsg(new Models.HighSpeed.CommMsg()
|
{
|
||||||
|
lock (_dbcParserLock)
|
||||||
{
|
{
|
||||||
Category = "CAN",
|
//将CAN消息数据填充到信号里面,用DBC解析数据
|
||||||
MsgInfo = "0x" + CanMsgBuffer[i].ID.ToString("X8"),
|
CAN_DBCParser.DBC_SyncCANMsgToValue(DBCHandle, msgPtRead, CanNum);
|
||||||
MsgData = BitConverter.ToString(CanMsgBuffer[i].Data),
|
|
||||||
Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
|
//循环获取消息的数据
|
||||||
});
|
foreach (var item in ListCanDbcModel)
|
||||||
|
{
|
||||||
|
//有配置的名称的,认为是有用的,则需要读取数据
|
||||||
|
//if (!string.IsNullOrEmpty(item.Name))
|
||||||
|
//{
|
||||||
|
var valueSb = new StringBuilder(64);
|
||||||
|
CAN_DBCParser.DBC_GetSignalValueStr(DBCHandle, new StringBuilder(item.MsgName), new StringBuilder(item.SignalName), valueSb);
|
||||||
|
item.SignalRtValueSb = valueSb;
|
||||||
|
Console.Write(valueSb.ToString());
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (CanNum == 0)
|
finally
|
||||||
{
|
{
|
||||||
//Console.WriteLine("No CAN data!");
|
if (msgPtRead != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
//释放数据缓冲区,必须释放,否则程序运行一段时间后会报内存不足
|
||||||
|
Marshal.FreeHGlobal(msgPtRead);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
//Console.WriteLine("Get CAN data error!");
|
|
||||||
}
|
|
||||||
Console.WriteLine("");
|
|
||||||
|
|
||||||
//将CAN消息数据填充到信号里面,用DBC解析数据
|
|
||||||
CAN_DBCParser.DBC_SyncCANMsgToValue(DBCHandle, msgPtRead, CanNum);
|
|
||||||
|
|
||||||
//循环获取消息的数据
|
|
||||||
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;
|
|
||||||
Console.Write(ValueSb.ToString());
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
//释放数据缓冲区,必须释放,否则程序运行一段时间后会报内存不足
|
|
||||||
Marshal.FreeHGlobal(msgPtRead);
|
|
||||||
Thread.Sleep(10);
|
Thread.Sleep(10);
|
||||||
|
|
||||||
////获取信号值并打印出来
|
////获取信号值并打印出来
|
||||||
@@ -662,6 +704,11 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void StartPrecisionCycleSendMsg()
|
public void StartPrecisionCycleSendMsg()
|
||||||
{
|
{
|
||||||
|
if (CycleSendTask != null && !CycleSendTask.IsCompleted)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 创建取消标记源 用于控制任务的取消 允许在需要时通过取消令牌来优雅停止任务
|
// 创建取消标记源 用于控制任务的取消 允许在需要时通过取消令牌来优雅停止任务
|
||||||
var cancellationTokenSource = new CancellationTokenSource();
|
var cancellationTokenSource = new CancellationTokenSource();
|
||||||
var token = cancellationTokenSource.Token;
|
var token = cancellationTokenSource.Token;
|
||||||
@@ -742,28 +789,36 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
for (int i = 0; i < GroupMsg.Count(); i++)
|
for (int i = 0; i < GroupMsg.Count(); i++)
|
||||||
{
|
{
|
||||||
CanMsg[i] = new USB2CAN.CAN_MSG();
|
CanMsg[i] = new USB2CAN.CAN_MSG();
|
||||||
CanMsg[i].Data = new Byte[64];
|
CanMsg[i].Data = new Byte[8];
|
||||||
}
|
}
|
||||||
|
|
||||||
IntPtr msgPtSend = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
IntPtr msgPtSend = IntPtr.Zero;
|
||||||
int Index = 0;
|
try
|
||||||
//循环给MSG赋值数据
|
|
||||||
foreach (var itemMsg in GroupMsg)
|
|
||||||
{
|
{
|
||||||
foreach (var itemSignal in itemMsg)
|
msgPtSend = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
||||||
|
int Index = 0;
|
||||||
|
lock (_dbcParserLock)
|
||||||
{
|
{
|
||||||
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
|
//循环给MSG赋值数据
|
||||||
|
foreach (var itemMsg in GroupMsg)
|
||||||
|
{
|
||||||
|
foreach (var itemSignal in itemMsg)
|
||||||
|
{
|
||||||
|
CAN_DBCParser.DBC_SetSignalValue(DBCHandle, new StringBuilder(itemMsg.Key), new StringBuilder(itemSignal.SignalName), itemSignal.SignalCmdValue);
|
||||||
|
}
|
||||||
|
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend);
|
||||||
|
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPtSend, typeof(USB2CAN.CAN_MSG));
|
||||||
|
Index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (msgPtSend != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
Marshal.FreeHGlobal(msgPtSend);
|
||||||
}
|
}
|
||||||
CAN_DBCParser.DBC_SyncValueToCANMsg(DBCHandle, new StringBuilder(itemMsg.Key), msgPtSend);
|
|
||||||
CanMsg[Index] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPtSend, typeof(USB2CAN.CAN_MSG));
|
|
||||||
Index++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//通过DBC写入数据后生成CanMsg
|
|
||||||
//将信号值填入CAN消息里面
|
|
||||||
|
|
||||||
//释放申请的临时缓冲区
|
|
||||||
Marshal.FreeHGlobal(msgPtSend);
|
|
||||||
|
|
||||||
//发送CAN数据
|
//发送CAN数据
|
||||||
int SendedNum = USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, CanMsg, (uint)CanMsg.Length);
|
int SendedNum = USB2CAN.CAN_SendMsg(DevHandle, WriteCANIndex, CanMsg, (uint)CanMsg.Length);
|
||||||
@@ -878,12 +933,32 @@ namespace CapMachine.Wpf.CanDrive
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void CloseDevice()
|
public void CloseDevice()
|
||||||
{
|
{
|
||||||
|
IsCycleRevice = false;
|
||||||
|
IsCycleSend = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
StopCycleSendMsg();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var task = CycleReviceTask;
|
||||||
|
if (task != null && !task.IsCompleted)
|
||||||
|
{
|
||||||
|
task.Wait(TimeSpan.FromMilliseconds(ReviceCycle + 500));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
//关闭设备
|
//关闭设备
|
||||||
USB_DEVICE.USB_CloseDevice(DevHandle);
|
USB_DEVICE.USB_CloseDevice(DevHandle);
|
||||||
OpenState = false;
|
OpenState = false;
|
||||||
DbcParserState = false;
|
DbcParserState = false;
|
||||||
IsCycleRevice = false;
|
|
||||||
IsCycleSend = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ namespace CapMachine.Wpf.Services
|
|||||||
if (ListCanDbcModel.Count > 0)
|
if (ListCanDbcModel.Count > 0)
|
||||||
{
|
{
|
||||||
ToomossCanDrive.IsCycleRevice = true;
|
ToomossCanDrive.IsCycleRevice = true;
|
||||||
ToomossCanDrive.StartPrecisionCycleSendMsg();
|
ToomossCanDrive.StartCycleReviceCanMsg();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1119,18 +1119,16 @@ namespace CapMachine.Wpf.Services
|
|||||||
while (ThreadEnable)
|
while (ThreadEnable)
|
||||||
{
|
{
|
||||||
cycleCount++;
|
cycleCount++;
|
||||||
if (cycleCount % 20 == 0) // 每10秒记录一次
|
if (cycleCount % 100 == 0)
|
||||||
{
|
{
|
||||||
LogService.Info($"RtScanDeviceStart 循环计数: {cycleCount}");
|
LogService.Info($"RtScanDeviceStart 循环计数: {cycleCount}");
|
||||||
}
|
}
|
||||||
//await Task.Delay(5);
|
await Task.Delay(50);
|
||||||
await Task.CompletedTask;
|
|
||||||
|
|
||||||
DiagnosticsTime.Reset();
|
DiagnosticsTime.Reset();
|
||||||
DiagnosticsTime.Start();
|
DiagnosticsTime.Start();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
LogService.Debug($"RtScanDeviceStart 开始扫描周期 {cycleCount}");
|
|
||||||
//TagInfo.RtValue.Value++;
|
//TagInfo.RtValue.Value++;
|
||||||
|
|
||||||
//var data = TagManger.DicTags["转速"].ValueType.Name;
|
//var data = TagManger.DicTags["转速"].ValueType.Name;
|
||||||
@@ -1186,7 +1184,6 @@ namespace CapMachine.Wpf.Services
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var speedValue = CanDriveService.GetDbcSpeedValueBySpeedName("通讯转速");
|
var speedValue = CanDriveService.GetDbcSpeedValueBySpeedName("通讯转速");
|
||||||
LogService.Debug($"RtScanDeviceStart 读取CAN通讯转速: {speedValue}");
|
|
||||||
SiemensDrive.Write(itemTag.Value.PVAddress, (short)speedValue);
|
SiemensDrive.Write(itemTag.Value.PVAddress, (short)speedValue);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1213,7 +1210,6 @@ namespace CapMachine.Wpf.Services
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var voltageValue = CanDriveService.GetDbcValueByName("通讯母线电压");
|
var voltageValue = CanDriveService.GetDbcValueByName("通讯母线电压");
|
||||||
LogService.Debug($"RtScanDeviceStart 读取CAN通讯母线电压: {voltageValue}");
|
|
||||||
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(voltageValue * itemTag.Value.Precision));
|
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(voltageValue * itemTag.Value.Precision));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1240,7 +1236,6 @@ namespace CapMachine.Wpf.Services
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var currentValue = CanDriveService.GetDbcValueByName("通讯母线电流");
|
var currentValue = CanDriveService.GetDbcValueByName("通讯母线电流");
|
||||||
LogService.Debug($"RtScanDeviceStart 读取CAN通讯母线电流: {currentValue}");
|
|
||||||
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(currentValue * itemTag.Value.Precision));
|
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(currentValue * itemTag.Value.Precision));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1267,7 +1262,6 @@ namespace CapMachine.Wpf.Services
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var phaseCurrentValue = CanDriveService.GetDbcValueByName("通讯相电流");
|
var phaseCurrentValue = CanDriveService.GetDbcValueByName("通讯相电流");
|
||||||
LogService.Debug($"RtScanDeviceStart 读取CAN通讯相电流: {phaseCurrentValue}");
|
|
||||||
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(phaseCurrentValue * itemTag.Value.Precision));
|
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(phaseCurrentValue * itemTag.Value.Precision));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1294,7 +1288,6 @@ namespace CapMachine.Wpf.Services
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var powerValue = CanDriveService.GetDbcValueByName("通讯功率");
|
var powerValue = CanDriveService.GetDbcValueByName("通讯功率");
|
||||||
LogService.Debug($"RtScanDeviceStart 读取CAN通讯功率: {powerValue}");
|
|
||||||
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(powerValue * itemTag.Value.Precision));
|
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(powerValue * itemTag.Value.Precision));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1321,7 +1314,6 @@ namespace CapMachine.Wpf.Services
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var tempValue = CanDriveService.GetDbcValueByName("通讯芯片温度");
|
var tempValue = CanDriveService.GetDbcValueByName("通讯芯片温度");
|
||||||
LogService.Debug($"RtScanDeviceStart 读取CAN通讯芯片温度: {tempValue}");
|
|
||||||
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(tempValue * itemTag.Value.Precision));
|
SiemensDrive.Write(itemTag.Value.PVAddress, (short)(tempValue * itemTag.Value.Precision));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -1365,7 +1357,6 @@ namespace CapMachine.Wpf.Services
|
|||||||
{
|
{
|
||||||
var dbcValue = CanDriveService.GetDbcValueByName(itemTag.Value.NameNoUnit);
|
var dbcValue = CanDriveService.GetDbcValueByName(itemTag.Value.NameNoUnit);
|
||||||
itemTag.Value.EngPvValue = dbcValue;
|
itemTag.Value.EngPvValue = dbcValue;
|
||||||
LogService.Debug($"RtScanDeviceStart 回读CAN数据 {itemTag.Value.NameNoUnit}: {dbcValue}");
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user