diff --git a/CapMachine.Core/HighSpeedFileHelper.cs b/CapMachine.Core/HighSpeedFileHelper.cs
new file mode 100644
index 0000000..b141e8e
--- /dev/null
+++ b/CapMachine.Core/HighSpeedFileHelper.cs
@@ -0,0 +1,145 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CapMachine.Core
+{
+ ///
+ /// 高速规则帮助方法
+ ///
+ public class HighSpeedFileHelper
+ {
+ ///
+ /// 获取文件路径
+ ///
+ ///
+ ///
+ public static string GetFullFilePath(string FileRootPath, string DcInfo, string ExtInfo)
+ {
+ return $@"{FileRootPath}\{DateTime.Now.ToString("yyyy")}\{DcInfo}\{GetFileName(DcInfo)}{ExtInfo}.csv";
+ }
+
+ ///
+ /// 获取本地文件路径
+ ///
+ ///
+ ///
+ public static string GetLocalFullFilePath(string FileRootPath, string DcInfo, string ExtInfo)
+ {
+ return $@"{FileRootPath}\{DateTime.Now.ToString("yyyy")}\{DcInfo}\{GetFileName(DcInfo)}{ExtInfo}.csv";
+ }
+
+ ///
+ /// 获取文件路径
+ ///
+ ///
+ ///
+ public static string GetFilePath(string FileRootPath)
+ {
+ return $@"{FileRootPath}\{DateTime.Now.ToString("yyyy")}\";
+ }
+
+ ///
+ /// 获取试验工况文件路径
+ ///
+ ///
+ ///
+ public static string GetExpFilePath(string FileRootPath, string ExpName)
+ {
+ return $@"{FileRootPath}\{ExpName}";
+ }
+
+ ///
+ /// 获取CSV文件路径
+ /// 对于一个试验来说,如果时间很长的话,则一天一个CSV文件
+ ///
+ ///
+ ///
+ public static string GetCSVPath(string FileExpRootPath)
+ {
+ //return $@"{FileRootPath}\{DateTime.Now.ToString("yyyy")}\{DateTime.Now.ToString("MM-dd HHmm")}{workCond}.csv";
+ return $@"{FileExpRootPath}\{DateTime.Now.ToString("yyyy-MM-dd")}.csv";
+ }
+
+ ///
+ /// 获取CSV文件路径
+ /// 对于一个试验来说,按照小时存储数据
+ ///
+ ///
+ ///
+ public static string GetHourCSVPath(string FileExpRootPath, string HourFileName)
+ {
+ //return $@"{FileRootPath}\{DateTime.Now.ToString("yyyy")}\{DateTime.Now.ToString("MM-dd HHmm")}{workCond}.csv";
+ return $@"{FileExpRootPath}\{HourFileName}.csv";
+ }
+
+ ///
+ /// 获取CSV文件名称
+ ///
+ ///
+ ///
+ public static string GetFileName(string DcInfo)
+ {
+ return $"{DateTime.Now.ToString("yy")}{DcInfo}";
+ }
+
+ ///
+ /// 获取CSV文件名称
+ ///
+ ///
+ ///
+ public static string GetFileName(string DcInfo, string ExtInfo)
+ {
+ return $"{DateTime.Now.ToString("yy")}{DcInfo}{ExtInfo}.csv";
+ }
+
+ ///
+ /// 获取Title文件-在本地盘 F盘中
+ ///
+ ///
+ ///
+ public static string GetTitlePath(string Dcinfo, string fileRootPath)
+ {
+ //return fileRootPath + @"\Title\Title" + Dcinfo + ".csv";
+ //return "F:" + @"\Title\Title" + Dcinfo + ".csv";
+ //return "D:" + @"\DCM\Title\Title" + Dcinfo + ".csv";
+ return "F:" + @"\Title\Title" + Dcinfo + ".csv";
+ }
+
+ /////
+ ///// 获取UI显示名称信息
+ /////
+ /////
+ /////
+ //public static string GetUIShowInfo(int DataInof)
+ //{
+ // return $"{GetMonthInfo()} {GetDayInfo()}{GetClassInfo()}-{DataInof}";
+ //}
+
+ //public static int StartHour = 6;
+ //public static int EndHour = 18;
+
+ /////
+ ///// 获取白班和夜班的信息
+ /////
+ /////
+ //public static string GetClassInfo()
+ //{
+ // var NowTimeHour = DateTime.Now.Hour;
+ // if (NowTimeHour >= StartHour && NowTimeHour <= EndHour)
+ // {
+ // return "-";
+ // }
+ // else
+ // {
+ // return ":";
+ // }
+
+ //}
+
+
+
+ }
+}
diff --git a/CapMachine.Model/CANLIN/CanLinRWConfig.cs b/CapMachine.Model/CANLIN/CanLinRWConfig.cs
index 052b07d..80569bf 100644
--- a/CapMachine.Model/CANLIN/CanLinRWConfig.cs
+++ b/CapMachine.Model/CANLIN/CanLinRWConfig.cs
@@ -32,7 +32,7 @@ namespace CapMachine.Model.CANLIN
public string? Name { get; set; }
///
- /// 配置项值
+ /// 配置项值 DBC里面的信号名称
///
[Column(Name = "Content", IsNullable = false, StringLength = 100)]
public string? Content { get; set; }
diff --git a/CapMachine.Model/HighMsgFileInfo.cs b/CapMachine.Model/HighMsgFileInfo.cs
new file mode 100644
index 0000000..78b2f16
--- /dev/null
+++ b/CapMachine.Model/HighMsgFileInfo.cs
@@ -0,0 +1,40 @@
+using FreeSql.DataAnnotations;
+
+namespace CapMachine.Model
+{
+ ///
+ /// 高速的消息文件信息
+ ///
+ [Table(Name = "HighMsgFileInfo")]
+ public class HighMsgFileInfo
+ {
+ ///
+ /// 主键
+ ///
+ [Column(IsPrimary = true, IsIdentity = true)]
+ public long Id { get; set; }
+
+ ///
+ /// 试验名称
+ ///
+ [Column(Name = "Name", IsNullable = false, StringLength = 200)]
+ public string? ExpName { get; set; }
+
+ ///
+ /// Path
+ /// CSV文件路径
+ ///
+ [Column(Name = "FilePath", IsNullable = false, StringLength = 400)]
+ public string? FilePath { get; set; }
+
+ ///
+ /// FileInfo
+ /// 2024-12-23 17
+ ///
+ [Column(Name = "FileInfo", IsNullable = false, StringLength = 30)]
+ public string? FileInfo { get; set; }
+
+ [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)]
+ public DateTime CreateTime { get; set; }
+ }
+}
diff --git a/CapMachine.Wpf/App.config b/CapMachine.Wpf/App.config
index bdac2a5..c98640a 100644
--- a/CapMachine.Wpf/App.config
+++ b/CapMachine.Wpf/App.config
@@ -3,6 +3,7 @@
+
diff --git a/CapMachine.Wpf/App.xaml.cs b/CapMachine.Wpf/App.xaml.cs
index 2ef8fff..1eff1a7 100644
--- a/CapMachine.Wpf/App.xaml.cs
+++ b/CapMachine.Wpf/App.xaml.cs
@@ -97,7 +97,8 @@ namespace CapMachine.Wpf
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
containerRegistry.RegisterSingleton();
-
+ containerRegistry.RegisterSingleton();
+
//注册AutoMapper 将IAutoMapperProvider注入IOC容器,并对外提供IMapper注入类型。
containerRegistry.RegisterSingleton();
containerRegistry.Register(typeof(IMapper), GetMapper);
@@ -225,8 +226,9 @@ namespace CapMachine.Wpf
var appVersionService7 = ContainerLocator.Container.Resolve();
var appVersionService8 = ContainerLocator.Container.Resolve();
var appVersionService9 = ContainerLocator.Container.Resolve();
+ var appVersionService10 = ContainerLocator.Container.Resolve();
-
+
//给当前的全局异常捕捉服务使用
LogService = ContainerLocator.Container.Resolve();
LogService.Error("ex.ToString()");
diff --git a/CapMachine.Wpf/Assets/Images/CapMachineOutput1.png b/CapMachine.Wpf/Assets/Images/CapMachineOutput1.png
new file mode 100644
index 0000000..b2e7daa
Binary files /dev/null and b/CapMachine.Wpf/Assets/Images/CapMachineOutput1.png differ
diff --git a/CapMachine.Wpf/CanDrive/CAN_DBCParser.cs b/CapMachine.Wpf/CanDrive/CAN_DBCParser.cs
index 06111af..b5b8c31 100644
--- a/CapMachine.Wpf/CanDrive/CAN_DBCParser.cs
+++ b/CapMachine.Wpf/CanDrive/CAN_DBCParser.cs
@@ -12,46 +12,63 @@ namespace CapMachine.Wpf.CanDrive
///
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);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("USB2XXX.dll")]
+ public static extern Int32 DBC_GetMsgNameByID(UInt64 DBCHandle, int ID, StringBuilder pMsgName);
+ ///
+ /// 获取ID根据名称
+ ///
+ ///
+ ///
+ ///
+ [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);
-
}
}
diff --git a/CapMachine.Wpf/CanDrive/CanDbcModel.cs b/CapMachine.Wpf/CanDrive/CanDbcModel.cs
index 3ab6eb9..8f24363 100644
--- a/CapMachine.Wpf/CanDrive/CanDbcModel.cs
+++ b/CapMachine.Wpf/CanDrive/CanDbcModel.cs
@@ -10,13 +10,20 @@ namespace CapMachine.Wpf.CanDrive
///
/// Dbc 信息
///
- public class CanDbcModel:BindableBase
+ public class CanDbcModel : BindableBase
{
///
/// 消息Id
///
public string? MsgId { get; set; }
+ ///
+ /// 配置的中文名称:速度,转速限制,使能等常用的信息数据
+ /// 但不是所有的SignalName都会配置一个Name,只是需要时才会配置名称
+ /// 但是CanDbcModel集合会包括所有的SignalName名称的
+ ///
+ public string? Name { get; set; }
+
///
/// 消息名称
///
@@ -38,20 +45,39 @@ namespace CapMachine.Wpf.CanDrive
public string? SignalUnit { get; set; }
- private string? _SignalRtValue;
+ private string? _SignalRtValue = "--";
///
/// 信号实时值
///
public string? SignalRtValue
{
get { return _SignalRtValue; }
- set { _SignalRtValue = value;RaisePropertyChanged(); }
+ set { _SignalRtValue = value; RaisePropertyChanged(); }
}
+ private StringBuilder _SignalRtValueSb = new StringBuilder(10);
+ ///
+ /// 信号实时值 StringBuilder
+ ///
+ public StringBuilder SignalRtValueSb
+ {
+ get { return _SignalRtValueSb; }
+ set
+ {
+ if (_SignalRtValueSb != value)
+ {
+ SignalRtValue = value.ToString();
+ _SignalRtValueSb = value;
+ }
+
+ }
+ }
+
+
///
/// 发布者
///
public string? Publisher { get; set; }
-
+
}
}
diff --git a/CapMachine.Wpf/CanDrive/ToomossCan.cs b/CapMachine.Wpf/CanDrive/ToomossCan.cs
index debcea2..f41bf9a 100644
--- a/CapMachine.Wpf/CanDrive/ToomossCan.cs
+++ b/CapMachine.Wpf/CanDrive/ToomossCan.cs
@@ -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
///
public class ToomossCan : BindableBase
{
+ private readonly IContainerProvider ContainerProvider;
+
///
/// 实例化函数
///
- public ToomossCan()
+ public ToomossCan(IContainerProvider containerProvider)
{
-
+ ContainerProvider = containerProvider;
+ HighSpeedDataService = ContainerProvider.Resolve();
}
///
@@ -42,16 +49,31 @@ namespace CapMachine.Wpf.CanDrive
}
+ ///
+ /// HighSpeedDataService 实例
+ ///
+ public HighSpeedDataService HighSpeedDataService { get; set; }
+
///
/// 开始Dbc文件写入
///
- public void StartDbc(string DbcPath)
+ public ObservableCollection StartDbc(string DbcPath)
{
DBC_Parser(DbcPath);
+ return ListCanDbcModel;
}
+ /////
+ ///// 获取Can DBC数据集合
+ /////
+ //public void LoadCanDbcData(ObservableCollection canDbcModels)
+ //{
+ // ListCanDbcModel = canDbcModels;
+ //}
+
///
/// Dbc消息集合
+ /// 包括读取的实时值和数据
///
public ObservableCollection ListCanDbcModel { get; set; } = new ObservableCollection();
@@ -69,6 +91,7 @@ namespace CapMachine.Wpf.CanDrive
USB2CAN.CAN_INIT_CONFIG CANConfig = new USB2CAN.CAN_INIT_CONFIG();
///
+ /// DBC加载后获取的Handle
/// DBC Handle
///
public UInt64 DBCHandle { get; set; }
@@ -82,15 +105,40 @@ namespace CapMachine.Wpf.CanDrive
/// 扫描设备Handle
///
public Int32 DevHandle { get; set; } = 0;
+
///
/// 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则说明调用该函数失败。
///
public Byte WriteCANIndex { get; set; } = 0;
///
/// 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则说明调用该函数失败。
///
- public Byte ReadCANIndex { get; set; } = 1;
+ public Byte ReadCANIndex { get; set; } = 0;
private bool _OpenState;
@@ -219,6 +267,7 @@ namespace CapMachine.Wpf.CanDrive
///
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
///
private static Task CycleReviceTask { get; set; }
+ StringBuilder ValueSb = new StringBuilder(16);
+
///
/// 循环获取CAN消息
///
@@ -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)
{
diff --git a/CapMachine.Wpf/CapMachine.Wpf.csproj b/CapMachine.Wpf/CapMachine.Wpf.csproj
index c969a14..545f52e 100644
--- a/CapMachine.Wpf/CapMachine.Wpf.csproj
+++ b/CapMachine.Wpf/CapMachine.Wpf.csproj
@@ -1,7 +1,7 @@
- Exe
+ WinExe
net6.0-windows
enable
enable
@@ -84,6 +84,9 @@
+
+ PreserveNewest
+
Always
diff --git a/CapMachine.Wpf/Models/HighSpeed/CommMsg.cs b/CapMachine.Wpf/Models/HighSpeed/CommMsg.cs
new file mode 100644
index 0000000..11779ad
--- /dev/null
+++ b/CapMachine.Wpf/Models/HighSpeed/CommMsg.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CapMachine.Wpf.Models.HighSpeed
+{
+ ///
+ /// 通信数据的消息
+ ///
+ public class CommMsg
+ {
+ ///
+ /// 时间
+ ///
+ public string? Time { get; set; }
+
+ ///
+ /// 分类
+ /// CAN/LIN
+ ///
+ public string? Category { get; set; }
+
+ ///
+ /// Msg名称或者Id
+ /// 等其他信息
+ ///
+ public string? MsgInfo { get; set; }
+
+ ///
+ /// 消息数据
+ ///
+ public string? MsgData { get; set; }
+ }
+}
diff --git a/CapMachine.Wpf/Models/HighSpeed/HighFragMsg.cs b/CapMachine.Wpf/Models/HighSpeed/HighFragMsg.cs
new file mode 100644
index 0000000..5de8c35
--- /dev/null
+++ b/CapMachine.Wpf/Models/HighSpeed/HighFragMsg.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CapMachine.Wpf.Models.HighSpeed
+{
+ ///
+ /// 高速片段数据
+ ///
+ public class HighFragMsg
+ {
+ public HighFragMsg()
+ {
+ ListCommMsg = new List();
+ }
+ ///
+ /// 状态
+ ///
+ public bool State { get; set; }
+
+ ///
+ /// Index
+ ///
+ public int Index { get; set; }
+
+ ///
+ /// 小时数据
+ ///
+ public List ListCommMsg { get; set; }
+ }
+}
diff --git a/CapMachine.Wpf/Models/HighSpeed/HighRecordMsgMap.cs b/CapMachine.Wpf/Models/HighSpeed/HighRecordMsgMap.cs
new file mode 100644
index 0000000..c748f31
--- /dev/null
+++ b/CapMachine.Wpf/Models/HighSpeed/HighRecordMsgMap.cs
@@ -0,0 +1,27 @@
+using CsvHelper.Configuration;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CapMachine.Wpf.Models.HighSpeed
+{
+ ///
+ /// 高速记录的模型Map
+ ///
+ public class HighRecordMsgMap : ClassMap
+ {
+ ///
+ /// 实例化函数
+ ///
+ public HighRecordMsgMap()
+ {
+ Map(m => m.Time).Name("时间");
+ Map(m => m.Category).Name("分类");
+ Map(m => m.MsgInfo).Name("消息信息");
+ Map(m => m.MsgData).Name("消息");
+ }
+
+ }
+}
diff --git a/CapMachine.Wpf/Services/CanDriveService.cs b/CapMachine.Wpf/Services/CanDriveService.cs
index cf83ff2..1c39cb6 100644
--- a/CapMachine.Wpf/Services/CanDriveService.cs
+++ b/CapMachine.Wpf/Services/CanDriveService.cs
@@ -1,7 +1,11 @@
-using CapMachine.Wpf.CanDrive;
+using CapMachine.Model.CANLIN;
+using CapMachine.Wpf.CanDrive;
+using ImTools;
+using Prism.Ioc;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -11,17 +15,64 @@ namespace CapMachine.Wpf.Services
///
/// Can驱动服务
///
- public class CanDriveService:BindableBase
+ public class CanDriveService : BindableBase
{
- public CanDriveService()
+ ///
+ /// 实例化函数
+ ///
+ public CanDriveService(HighSpeedDataService highSpeedDataService,IContainerProvider containerProvider)
{
- ToomossCanDrive=new ToomossCan();
+ ToomossCanDrive = new ToomossCan(containerProvider);
+ //高速数据服务
+ HighSpeedDataService = highSpeedDataService;
+
//ToomossCanDrive.StartCanDrive();
}
///
+ /// 图莫斯 CAN Drive
/// ToomossCanDrive
///
public ToomossCan ToomossCanDrive { get; set; }
+
+ ///
+ /// Dbc消息集合
+ /// 包括读取的实时值和数据
+ ///
+ public ObservableCollection ListCanDbcModel { get; set; } = new ObservableCollection();
+
+ ///
+ /// 初始化CAN的配置信息
+ ///
+ public void InitCanConfig(CanLinConfigPro selectedCanLinConfigPro)
+ {
+ //赋值配置数据
+ SelectedCanLinConfigPro = selectedCanLinConfigPro;
+ //为DBC实时数据关联配置的名称
+ foreach (var item in SelectedCanLinConfigPro.CanLinConfigContents)
+ {
+ var FindData = ListCanDbcModel.FindFirst(a => a.SignalName == item.Content);
+ if (FindData != null)
+ {
+ FindData.Name = item.Name;
+ }
+ }
+ }
+
+ ///
+ /// 开始DBC 配置文件 加载
+ ///
+ ///
+ public ObservableCollection StartDbc(string Path)
+ {
+ ListCanDbcModel = ToomossCanDrive.StartDbc(Path);
+ return ListCanDbcModel;
+ }
+
+ ///
+ /// 当前选中的CanLinConfigPro 程序
+ ///
+ public CanLinConfigPro SelectedCanLinConfigPro { get; set; }
+ public HighSpeedDataService HighSpeedDataService { get; }
}
}
diff --git a/CapMachine.Wpf/Services/ConfigService.cs b/CapMachine.Wpf/Services/ConfigService.cs
index 879556b..e4b549e 100644
--- a/CapMachine.Wpf/Services/ConfigService.cs
+++ b/CapMachine.Wpf/Services/ConfigService.cs
@@ -21,6 +21,17 @@ namespace CapMachine.Wpf.Services
///
public static readonly object CsvFileLock = new object();
+ ///
+ /// 高速 消息数据的 Csv文件锁
+ /// 防止同时读取数据
+ ///
+ public static readonly object HighSpeedMsgCsvFileLock = new object();
+
+ ///
+ /// 高速数据文件缓存小时数
+ ///
+ public short HighSpeedMsgCsvFileCacheHour { get; set; } = 5;
+
///
/// 记录周期
///
@@ -36,6 +47,11 @@ namespace CapMachine.Wpf.Services
///
public string SaveCsvRootPath { get; set; } = "D:\\TestData";
+ ///
+ /// 高速 消息数据的 SCV保存的根路径
+ ///
+ public string HighSpeedMsgSaveCsvRootPath { get; set; } = "D:\\TestData";
+
///
/// 实时曲线数据缓存的时间(秒)
///
diff --git a/CapMachine.Wpf/Services/HighSpeedDataService.cs b/CapMachine.Wpf/Services/HighSpeedDataService.cs
new file mode 100644
index 0000000..2b99899
--- /dev/null
+++ b/CapMachine.Wpf/Services/HighSpeedDataService.cs
@@ -0,0 +1,339 @@
+using CapMachine.Wpf.ChannelModel;
+using CapMachine.Wpf.Models;
+using CapMachine.Wpf.Models.HighSpeed;
+using CapMachine.Wpf.PrismEvent;
+using CsvHelper.Configuration;
+using CsvHelper;
+using Prism.Mvvm;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Channels;
+using System.Threading.Tasks;
+using System.Timers;
+using CapMachine.Core;
+using CapMachine.Model;
+using System.Security.Cryptography.Xml;
+using Prism.Ioc;
+
+namespace CapMachine.Wpf.Services
+{
+ ///
+ /// 高速数据
+ /// 通信的数据缓存
+ ///
+ public class HighSpeedDataService : BindableBase
+ {
+ public HighSpeedDataService(ConfigService configService, ILogService logService, IFreeSql FreeSql,IContainerProvider containerProvider)
+ {
+ ConfigService = configService;
+ LogService = logService;
+ this.FreeSql = FreeSql;
+ ContainerProvider = containerProvider;
+ CacheHighFragMsg = new List();
+
+ //100ms 触发一次
+ CycleTimer = new System.Timers.Timer(100);
+ CycleTimer.Elapsed += CycleAction;
+ CycleTimer.AutoReset = true;
+ CycleTimer.Enabled = true;
+
+ //实时数据记录管道数据监听
+ Task.Run(() => ListenCycleChannelAction());
+
+ }
+ public ConfigService ConfigService { get; }
+ public ILogService LogService { get; }
+ public IFreeSql FreeSql { get; }
+ public IContainerProvider ContainerProvider { get; }
+
+
+ ///
+ /// 时间到
+ ///
+ ///
+ ///
+ ///
+ private void CycleAction(object? sender, ElapsedEventArgs e)
+ {
+ if (IsEnable)
+ {
+ //本体数据记录
+ CycleChannelInfo.Writer.WriteAsync(CurListMsg);
+ }
+ }
+
+ ///
+ /// 添加或者更新消息数据
+ ///
+ public void AppendOrUpdateMsg(CommMsg commMsg)
+ {
+ if (!CurListMsg.Exists(a => a.MsgInfo == commMsg.MsgInfo))
+ {
+ //不存在则新增
+ CurListMsg.Add(commMsg);
+ }
+ else
+ {
+ //存在则更新数据
+ var Data = CurListMsg.Find(a => a.MsgInfo == commMsg.MsgInfo);
+ //Data!.MsgInfo = commMsg.MsgInfo;
+ //Data!.Category = commMsg.Category;
+ Data!.MsgData = commMsg.MsgData;
+ Data!.Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
+ }
+ }
+
+
+ ///
+ /// 初始化高速数据
+ ///
+ public void InitHighData()
+ {
+ //报文重新清零
+ CurListMsg = new List();
+ }
+
+ ///
+ /// 当前的报文消息集合
+ ///
+ private List CurListMsg { get; set; } = new List()
+ {
+ new CommMsg() { Category = "CAN2",MsgInfo = "0x000003E3",Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),MsgData = "33 00 00 00 37 00 04 00"},
+ new CommMsg() { Category = "CAN1",MsgInfo = "0x000003E3",Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),MsgData = "33 00 00 00 37 00 04 00"},
+ new CommMsg() { Category = "CAN2",MsgInfo = "0x000003E3",Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),MsgData = "33 00 00 00 37 00 04 00"},
+ new CommMsg() { Category = "CAN3",MsgInfo = "0x000003E3",Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),MsgData = "33 00 00 00 37 00 04 00"},
+ new CommMsg() { Category = "CAN4",MsgInfo = "0x000003E3",Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),MsgData = "33 00 00 00 37 00 04 00"},
+ new CommMsg() { Category = "CAN5",MsgInfo = "0x000003E3",Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"),MsgData = "33 00 00 00 37 00 04 00"},
+ };
+
+ ///
+ /// 周期定时器
+ ///
+ private System.Timers.Timer CycleTimer { get; set; }
+
+
+ private bool _IsEnable=true;
+ ///
+ /// 是否启用
+ ///
+ public bool IsEnable
+ {
+ get { return _IsEnable; }
+ set { _IsEnable = value; RaisePropertyChanged(); }
+ }
+
+
+ #region 队列的操作
+
+ ///
+ /// 缓存数据
+ ///
+ public List CacheHighFragMsg { get; set; }
+
+
+ ///
+ /// 队列通道
+ /// 当前队列消费周期触发的数据记录
+ ///
+ public Channel> CycleChannelInfo = Channel.CreateBounded>(new BoundedChannelOptions(100000)
+ {
+ FullMode = BoundedChannelFullMode.DropOldest, //消息满了 等待消费 新的消息不插入
+ SingleWriter = false,//允许一次写入多条数据
+ SingleReader = true, //一次只能读取一条消息
+
+ });
+
+ ///
+ /// 缓存的集合数据
+ ///
+ public List CacheRecordData { get; set; } = new List();
+
+ ///
+ /// 当前缓存的队列信息
+ /// 高效的队列数据
+ ///
+ public ConcurrentQueue ConcurrentQueueData { get; set; } = new ConcurrentQueue();
+
+
+ ///
+ /// 最大的缓存单元数据
+ /// 存储超过规定600个缓存数据后进行判断后删除
+ ///
+ private int MaxCacheCellCount { get; set; } = 0;
+
+ ///
+ /// 数据记录管道监听方法
+ ///
+ ///
+ private async void ListenCycleChannelAction()
+ {
+ while (await CycleChannelInfo.Reader.WaitToReadAsync())
+ {
+ if (CycleChannelInfo.Reader.TryRead(out var CycleChannelData))
+ {
+ ////第一次计时
+ //stopwatch.Start(); //启动Stopwatch
+
+ //新增数据
+ CacheHighFragMsg.AddRange(CycleChannelData);
+ MaxCacheCellCount++;
+
+ if (MaxCacheCellCount >= 600)
+ {
+ //CSV文件保存
+ SaveToCsv(CacheHighFragMsg);
+ CacheHighFragMsg.Clear();
+ MaxCacheCellCount = 0;
+ }
+
+ //}
+
+ //CacheRecordData.Clear();
+
+ //Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!");
+ //}
+
+
+ //stopwatch.Stop(); //停止Stopwatch
+ //Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString());
+ //stopwatch.Reset();
+ }
+ }
+ }
+
+ #endregion
+
+
+ #region CSV Helper 数据保存CSV
+
+ ///
+ /// 当前的小时文件信息
+ ///
+ private string CurHourFileName { get; set; }
+
+ ///
+ /// CSV文件保存根路径
+ ///
+ private string SaveCsvRootPath { get; set; }
+
+ ///
+ /// Append to the file.
+ ///
+ CsvConfiguration CSVconfig { get; set; } = new CsvConfiguration(CultureInfo.CurrentCulture)
+ {
+ // Don't write the header again.
+ HasHeaderRecord = false,
+ };
+
+
+ ///
+ /// 保存到CSV文件
+ ///
+ private void SaveToCsv(List CacheData)
+ {
+ CurHourFileName = DateTime.Now.ToString("yyyy-MM-dd HH");
+
+ //年份的文件是否存在
+ var FilePath = HighSpeedFileHelper.GetExpFilePath(ConfigService.HighSpeedMsgSaveCsvRootPath, "ConfigService.CurExpInfo.Name");
+ if (!Directory.Exists(FilePath))
+ {
+ Directory.CreateDirectory(FilePath);
+ }
+
+ //文件全部路径信息
+ var FileFullInfo = HighSpeedFileHelper.GetHourCSVPath(FilePath, CurHourFileName);
+ if (!File.Exists(FileFullInfo))//是否存在文件
+ {
+ //新增文件
+ lock (ConfigService.HighSpeedMsgCsvFileLock)
+ {
+ //新增的文件
+ using (var writer = new StreamWriter(FileFullInfo, false, Encoding.UTF8))
+ using (var csv = new CsvWriter(writer, CultureInfo.CurrentCulture))
+ {
+ var Result = csv.Context.RegisterClassMap();
+
+ csv.WriteRecords(CacheData);
+ }
+ }
+
+
+ //先保存当前的文件信息
+ FreeSql.Insert(new HighMsgFileInfo()
+ {
+ ExpName = "ConfigService.CurExpInfo.Name",
+ FileInfo = CurHourFileName,
+ FilePath = FileFullInfo
+ }).ExecuteInserted();
+
+ //删除时间范围之外的文件
+ var DeleteInfo = FreeSql.Delete().Where(a => a.CreateTime < DateTime.Now.AddHours(-ConfigService.HighSpeedMsgCsvFileCacheHour)).ExecuteDeleted();
+ if (DeleteInfo.Count > 0)
+ {
+ //DB删除成功的话,开始删除实体文件
+ foreach (var item in DeleteInfo)
+ {
+ DeleteFile(item.FilePath);
+ }
+ }
+ }
+ else//存在文件的话则新增数据
+ {
+ lock (ConfigService.HighSpeedMsgCsvFileLock)
+ {
+ //往已有的文件增加数据
+ using (var stream = File.Open(FileFullInfo, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
+ //using (var stream = new FileStream(FileFullInfo, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
+ using (var writer = new StreamWriter(stream))
+ using (var csv = new CsvWriter(writer, CSVconfig))
+ {
+ csv.Context.RegisterClassMap();
+ csv.WriteRecords(CacheData);
+ }
+ }
+
+ }
+ }
+
+
+ ///
+ /// 删除文件
+ ///
+ ///
+ private bool DeleteFile(string FilePath)
+ {
+ try
+ {
+ if (File.Exists(FilePath))
+ {
+ File.Delete(FilePath);
+ Console.WriteLine("文件已成功删除");
+ return true;
+ }
+ else
+ {
+ Console.WriteLine("文件不存在");
+ return true;
+ }
+ }
+ catch (Exception ex)
+ {
+ Console.WriteLine("删除文件时发生错误: " + ex.Message);
+ return false;
+ }
+
+
+ }
+ }
+
+ #endregion
+
+
+}
+
diff --git a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs
index 867d6dd..6687ee5 100644
--- a/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs
+++ b/CapMachine.Wpf/ViewModels/CANConfigViewModel.cs
@@ -22,7 +22,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
-using System.Windows.Input;
+using System.Windows.Documents;
namespace CapMachine.Wpf.ViewModels
{
@@ -135,8 +135,6 @@ namespace CapMachine.Wpf.ViewModels
}
- //CanLinConfigPromdCmd
-
private DelegateCommand _CanLinConfigPromdCmd;
///
/// CanConfigPro操作的指令
@@ -254,7 +252,7 @@ namespace CapMachine.Wpf.ViewModels
}
else
{
- MessageBox.Show("选中后再操作", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
+ System.Windows.MessageBox.Show("选中后再操作", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand);
}
break;
@@ -281,7 +279,7 @@ namespace CapMachine.Wpf.ViewModels
}
else
{
- MessageBox.Show("选中后再操作", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
+ System.Windows.MessageBox.Show("选中后再操作", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand);
}
@@ -289,11 +287,16 @@ namespace CapMachine.Wpf.ViewModels
case "Active":
if (SelectCanLinConfigPro != null)
{
+ //控件的激活
IsCanConfigProActive = !IsCanConfigProActive;
+
+ //当前使用的CAN 配置信息
+ CanDriveService.InitCanConfig(SelectCanLinConfigPro);
+
}
else
{
- MessageBox.Show("选中后再操作", "提示", MessageBoxButton.OK, MessageBoxImage.Hand);
+ System.Windows.MessageBox.Show("选中后再操作", "提示", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Hand);
}
break;
@@ -385,6 +388,55 @@ namespace CapMachine.Wpf.ViewModels
}
+ private DelegateCommand