物性更改
This commit is contained in:
@@ -1,9 +1,4 @@
|
||||
using CapMachine.Wpf.Dtos;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CapMachine.Wpf.CanDrive
|
||||
{
|
||||
@@ -12,6 +7,12 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// </summary>
|
||||
public class CanCmdData
|
||||
{
|
||||
/// <summary>
|
||||
/// 指令数据改变Handler
|
||||
/// 改变发送消息名称
|
||||
/// </summary>
|
||||
public event EventHandler<string>? CanCmdDataChangedHandler;
|
||||
|
||||
/// <summary>
|
||||
/// 配置项名称-比如转速、功率限制等
|
||||
/// </summary>
|
||||
@@ -27,11 +28,30 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// </summary>
|
||||
public string? SignalName { get; set; }
|
||||
|
||||
private double _SignalCmdValue;
|
||||
/// <summary>
|
||||
/// 指令值
|
||||
/// 没有的话,则给默认值
|
||||
/// </summary>
|
||||
public double SignalCmdValue { get; set; }
|
||||
public double SignalCmdValue
|
||||
{
|
||||
get { return _SignalCmdValue; }
|
||||
set
|
||||
{
|
||||
if (_SignalCmdValue != value)
|
||||
{
|
||||
_SignalCmdValue = value;
|
||||
CanCmdDataChangedHandler!.BeginInvoke(this, MsgName!, null, null);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// 指令值
|
||||
///// 没有的话,则给默认值
|
||||
///// </summary>
|
||||
//public double SignalCmdValue { get; set; }
|
||||
|
||||
///// <summary>
|
||||
///// 逻辑规则Id
|
||||
|
||||
@@ -540,6 +540,117 @@ namespace CapMachine.Wpf.CanDrive
|
||||
/// </summary>
|
||||
public List<CanCmdData> CmdData { get; set; } = new List<CanCmdData>();
|
||||
|
||||
/// <summary>
|
||||
/// 加载要发送的数据
|
||||
/// </summary>
|
||||
/// <param name="cmdData"></param>
|
||||
public void LoadCmdDataToDrive(List<CanCmdData> cmdData)
|
||||
{
|
||||
// Unsubscribe from events on the old CmdData items
|
||||
if (CmdData != null && CmdData.Count > 0)
|
||||
{
|
||||
foreach (var cmd in CmdData)
|
||||
{
|
||||
cmd.CanCmdDataChangedHandler -= CmdData_CanCmdDataChangedHandler;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the new data and subscribe to events
|
||||
CmdData = cmdData;
|
||||
foreach (var cmd in CmdData)
|
||||
{
|
||||
cmd.CanCmdDataChangedHandler += CmdData_CanCmdDataChangedHandler;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指令数据发生变化执行方法
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void CmdData_CanCmdDataChangedHandler(object? sender, string e)
|
||||
{
|
||||
UpdateSchDataByCmdDataChanged();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指令数据发生变化执行更新调度表锁
|
||||
/// </summary>
|
||||
private readonly object SchUpdateLock = new object();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 指令数据发生变化执行方法
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void UpdateSchDataByCmdDataChanged()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!IsCycleSend) return;
|
||||
|
||||
// 基础防御:确保 DBC/ 调度表 / 分组已经初始化
|
||||
if (DBCHandle == 0 || SchCanMsg == null || GroupMsg == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
lock (SchUpdateLock)
|
||||
{
|
||||
//通过DBC进行对消息赋值
|
||||
IntPtr msgPtSend = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
||||
int CycleUpdateIndex = 0;
|
||||
//循环给MSG赋值数据,顺序是固定的,跟初始时设置是一样的
|
||||
foreach (var itemMsg in GroupMsg)
|
||||
{
|
||||
foreach (var itemSignal in itemMsg)
|
||||
{
|
||||
//itemSignal.SignalCmdValue = random.Next(0, 100); //仿真测试数据使用
|
||||
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);
|
||||
SchCanMsg[CycleUpdateIndex] = (USB2CAN.CAN_MSG)Marshal.PtrToStructure(msgPtSend, typeof(USB2CAN.CAN_MSG));
|
||||
CycleUpdateIndex++;
|
||||
}
|
||||
|
||||
//通过DBC写入数据后生成CanMsg
|
||||
//将信号值填入CAN消息里面
|
||||
|
||||
//释放申请的临时缓冲区
|
||||
Marshal.FreeHGlobal(msgPtSend);
|
||||
|
||||
//CAN_UpdateSchedule 官网解释
|
||||
// ---MsgTabIndex CAN调度表索引号
|
||||
// ---MsgIndex 开始更新帧起始索引,若起始索引大于调度表帧数,则将帧添加到调度表后面
|
||||
// ---pCanMsg 需要更新的CAN帧指针
|
||||
// ---MsgNum pCanMsgTab里面包含的有效帧数
|
||||
|
||||
//CAN_UpdateSchedule中的MsgIndex表示当前的调度器中的帧Index序号
|
||||
//因为调度表中的帧集合和控制帧的集合和要更新的帧集合都是同一个集合SchCanMsg
|
||||
//默认1号调度表,一个更新所有的帧数据
|
||||
var ret = USB2CAN.CAN_UpdateSchedule(DevHandle, WriteCANIndex, (byte)0, (byte)(0), SchCanMsg, (byte)SchCanMsg.Count());//配置调度表,该函数耗时可能会比较长,但是只需要执行一次即可
|
||||
if (ret == USB2CAN.CAN_SUCCESS)
|
||||
{
|
||||
IsSendOk = true;
|
||||
Console.WriteLine($"Update CAN Schedule Success -- SchTabIndex:{(byte)0} -- MsgIndex:{(byte)(0)} ");
|
||||
}
|
||||
else
|
||||
{
|
||||
IsSendOk = false;
|
||||
Console.WriteLine($"Update CAN Schedule Error ret = {ret} -- SchTabIndex:{(byte)0} -- MsgIndex:{(byte)(0)}");
|
||||
//return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
IsSendOk = false;
|
||||
LoggerService.Info($"时间:{DateTime.Now.ToString()}-【MSG】-{ex.Message}");
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 循环发送数据
|
||||
/// </summary>
|
||||
@@ -1057,7 +1168,7 @@ namespace CapMachine.Wpf.CanDrive
|
||||
await Task.Delay(UpdateCycle);
|
||||
try
|
||||
{
|
||||
|
||||
|
||||
//通过DBC进行对消息赋值
|
||||
IntPtr msgPtSend = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(USB2CAN.CAN_MSG)));
|
||||
CycleUpdateIndex = 0;
|
||||
|
||||
Reference in New Issue
Block a user