CAN的更改

This commit is contained in:
2025-05-09 16:13:11 +08:00
parent df4b481bbb
commit 03fd92ac86
8 changed files with 176 additions and 131 deletions

View File

@@ -618,7 +618,7 @@ namespace CapMachine.Wpf.CanDrive
// 预先计算固定值 // 预先计算固定值
long CycleInTicks = (long)(SendCycle * TicksPerMs); long CycleInTicks = (long)(SendCycle * TicksPerMs);
//临时测试用 //临时测试用
long lastTicks = Stopwatcher.ElapsedTicks; //long lastTicks = Stopwatcher.ElapsedTicks;
//IsCycleSend //IsCycleSend
while (IsCycleSend && !token.IsCancellationRequested) while (IsCycleSend && !token.IsCancellationRequested)
{ {
@@ -664,8 +664,9 @@ namespace CapMachine.Wpf.CanDrive
} }
// 使用Stopwatch记录实际的执行间隔而不是DateTime // 使用Stopwatch记录实际的执行间隔而不是DateTime
Console.WriteLine($"--实际间隔(ms): {(Stopwatcher.ElapsedTicks - lastTicks) / TicksPerMs:F3}, 目标: {SendCycle}"); //Console.WriteLine($"--实际间隔(ms): {(Stopwatcher.ElapsedTicks - lastTicks) / TicksPerMs:F3}, 目标: {SendCycle}");
lastTicks = Stopwatcher.ElapsedTicks; //lastTicks = Stopwatcher.ElapsedTicks;
//Console.WriteLine($"--当前时间(毫秒): {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}"); //Console.WriteLine($"--当前时间(毫秒): {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}");

View File

@@ -134,12 +134,12 @@ namespace CapMachine.Wpf.Services
get { return _AutoSpeedSv; } get { return _AutoSpeedSv; }
set set
{ {
if (value!= _AutoSpeedSv) if (value != _AutoSpeedSv)
{ {
_AutoSpeedSv = value; _AutoSpeedSv = value;
RaisePropertyChanged(); RaisePropertyChanged();
} }
} }
} }
@@ -225,19 +225,33 @@ namespace CapMachine.Wpf.Services
} }
/// <summary> /// <summary>
/// 更新压缩机使能数据 /// 更新压缩机使能数据 自动时的赋值数据
/// </summary> /// </summary>
/// <param name="IsEnable"></param> /// <param name="IsEnable"></param>
public void UpdateCapEnableCmdData(bool IsEnable) public void UpdateCapEnableCmdData(bool IsEnable)
{ {
if (!ToomossCanDrive.IsCycleSend) return; if (!ToomossCanDrive.IsCycleSend) return;
if (!CanAutoHand) return; if (CanAutoHand)
if (EnableCanCmdData != null)
{ {
EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0; if (EnableCanCmdData != null)
{
EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0;
}
} }
} }
/// <summary>
/// 更新压缩机使能数据 手动时的赋值数据
/// </summary>
/// <param name="IsEnable"></param>
public void UpdateCapEnableCmdDataByHand(bool IsEnable)
{
if (EnableCanCmdData != null)
{
EnableCanCmdData.SignalCmdValue = IsEnable ? 1 : 0;
Console.WriteLine("压缩机使能:" + IsEnable);
}
}
/// <summary> /// <summary>
/// 发送消息给CAN 驱动 /// 发送消息给CAN 驱动

View File

@@ -296,75 +296,85 @@ namespace CapMachine.Wpf.Services
/// <exception cref="NotImplementedException"></exception> /// <exception cref="NotImplementedException"></exception>
private async void ListenRecoredChannelAction() private async void ListenRecoredChannelAction()
{ {
while (await RecoredChannelInfo.Reader.WaitToReadAsync()) while (await RecoredChannelInfo.Reader.WaitToReadAsync())
{ {
if (RecoredChannelInfo.Reader.TryRead(out var recordChannelData)) try
{ {
////第一次计时 if (RecoredChannelInfo.Reader.TryRead(out var recordChannelData))
//stopwatch.Start(); //启动Stopwatch
//新增数据
CacheRecordData.Add(recordChannelData);
MaxCacheCellCount++;
//先判断缓存的单元大小,防止每次都检查删除,数据达到时间范围外的话,则删除,即是600次后进行一次判断删除
if (MaxCacheCellCount >= 600)
{ {
//不在缓存的时间范围内的话,则删除数据 ////第一次计时
if (CacheRecordData.Where(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec)).Any()) //stopwatch.Start(); //启动Stopwatch
//新增数据
CacheRecordData.Add(recordChannelData);
MaxCacheCellCount++;
//先判断缓存的单元大小,防止每次都检查删除,数据达到时间范围外的话,则删除,即是600次后进行一次判断删除
if (MaxCacheCellCount >= 600)
{ {
CacheRecordData.RemoveAll(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec)); //不在缓存的时间范围内的话,则删除数据
if (CacheRecordData.Where(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec)).Any())
{
CacheRecordData.RemoveAll(a => a.CreateTime <= DateTime.Now.AddSeconds(-ConfigService.ChartRtDataCacheTimeSec));
}
MaxCacheCellCount = 0;
} }
MaxCacheCellCount = 0;
//ConcurrentQueueData.
//Prism发布数据
_EventAggregator.GetEvent<RecordDataEvent>().Publish(recordChannelData.DeepClone());
//判断集合的数据是否达到要求
//if (CacheRecordData.Count >= MaxCacheCount)
//{
//CacheRecordData可能存在多个表格数据依据表名进行分类
//考虑多个表结构
//var GroupTableData = CacheRecordData.GroupBy(a => a.TableName).ToList();
//foreach (var ItemData in GroupTableData)
//{
//表名称
//var TableName = ItemData.Key;
//当前表格的数据
//var Datas = ItemData.Select(item => item.Data).ToList();
//var Datas = recordChannelData.Select(item => item.Data).ToList();
//List<CsvRecordModel> models = Datas.Select(dict => ConvertToCsvRecordModel(dict)).ToList();
//转换到CSV的数据
var models = ConvertToCsvRecordModel(recordChannelData.Data);
//填充工况名称
models.WorkCond = ConfigService.CurExpInfo.Name;
//数据库保存
//zeroDbContext.Insert(Datas);
//CSV文件保存
SaveToCsv(new List<CsvRecordModel>() { models });
//}
//CacheRecordData.Clear();
//Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!");
//}
//stopwatch.Stop(); //停止Stopwatch
//Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString());
//stopwatch.Reset();
} }
//ConcurrentQueueData.
//Prism发布数据
_EventAggregator.GetEvent<RecordDataEvent>().Publish(recordChannelData.DeepClone());
//判断集合的数据是否达到要求
//if (CacheRecordData.Count >= MaxCacheCount)
//{
//CacheRecordData可能存在多个表格数据依据表名进行分类
//考虑多个表结构
//var GroupTableData = CacheRecordData.GroupBy(a => a.TableName).ToList();
//foreach (var ItemData in GroupTableData)
//{
//表名称
//var TableName = ItemData.Key;
//当前表格的数据
//var Datas = ItemData.Select(item => item.Data).ToList();
//var Datas = recordChannelData.Select(item => item.Data).ToList();
//List<CsvRecordModel> models = Datas.Select(dict => ConvertToCsvRecordModel(dict)).ToList();
//转换到CSV的数据
var models = ConvertToCsvRecordModel(recordChannelData.Data);
//填充工况名称
models.WorkCond = ConfigService.CurExpInfo.Name;
//数据库保存
//zeroDbContext.Insert(Datas);
//CSV文件保存
SaveToCsv(new List<CsvRecordModel>() { models });
//}
//CacheRecordData.Clear();
//Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!");
//}
//stopwatch.Stop(); //停止Stopwatch
//Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString());
//stopwatch.Reset();
} }
catch (Exception ex)
{
LogService.Error($"时间:{DateTime.Now.ToString()}-【ListenRecoredChannelAction】-{ex.Message}");
}
} }
} }
/// <summary> /// <summary>
@@ -459,7 +469,7 @@ namespace CapMachine.Wpf.Services
catch (Exception ex) catch (Exception ex)
{ {
//CycleTimer.Start(); //执行完毕后再开启器 //CycleTimer.Start(); //执行完毕后再开启器
LogService.Info($"时间:{DateTime.Now.ToString()}-【PwAnalyze-CycleAction】-{ex.Message}"); LogService.Error($"时间:{DateTime.Now.ToString()}-【PwAnalyze-CycleAction】-{ex.Message}");
} }
} }

View File

@@ -175,40 +175,48 @@ namespace CapMachine.Wpf.Services
{ {
while (await CycleChannelInfo.Reader.WaitToReadAsync()) while (await CycleChannelInfo.Reader.WaitToReadAsync())
{ {
if (CycleChannelInfo.Reader.TryRead(out var CycleChannelData)) try
{ {
////第一次计时 if (CycleChannelInfo.Reader.TryRead(out var CycleChannelData))
//stopwatch.Start(); //启动Stopwatch
//新增数据
CacheHighFragMsg.AddRange(CycleChannelData);
MaxCacheCellCount++;
if (MaxCacheCellCount >= 600)
{ {
//CSV文件保存 ////第一次计时
SaveToCsv(CacheHighFragMsg); //stopwatch.Start(); //启动Stopwatch
CacheHighFragMsg.Clear();
MaxCacheCellCount = 0; //新增数据
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();
} }
}
//} catch (Exception ex)
{
//CacheRecordData.Clear(); LogService.Error($"时间:{DateTime.Now.ToString()}-【ListenCycleChannelAction】-{ex.Message}");
//Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss:fff")}-{LineName}-保存成功!");
//}
//stopwatch.Stop(); //停止Stopwatch
//Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString());
//stopwatch.Reset();
} }
} }
} }
#endregion #endregion
#region CSV Helper CSV #region CSV Helper CSV

View File

@@ -62,7 +62,7 @@ namespace CapMachine.Wpf.Services
/// <summary> /// <summary>
/// 是否启用CAN报文显示 /// 是否启用CAN报文显示
/// </summary> /// </summary>
private bool _IsDisplayEnabled=true; private bool _IsDisplayEnabled = true;
public bool IsDisplayEnabled public bool IsDisplayEnabled
{ {
get { return _IsDisplayEnabled; } get { return _IsDisplayEnabled; }
@@ -241,9 +241,11 @@ namespace CapMachine.Wpf.Services
/// </summary> /// </summary>
private async Task ProcessMessagesAsync() private async Task ProcessMessagesAsync()
{ {
try
while (await ReceiveChannel.Reader.WaitToReadAsync(TaskCancellationTokenSource.Token))
{ {
while (await ReceiveChannel.Reader.WaitToReadAsync(TaskCancellationTokenSource.Token))
try
{ {
// 清空列表但保留容量 // 清空列表但保留容量
MessageBatch.Clear(); MessageBatch.Clear();
@@ -280,16 +282,18 @@ namespace CapMachine.Wpf.Services
await Task.Delay(20); await Task.Delay(20);
} }
} }
catch (OperationCanceledException ex)
{
// 服务被取消,正常退出
LogService.Error($" 服务被取消,正常退出: {ex.Message}");
}
catch (Exception ex)
{
LogService.Error($"消息处理任务异常: {ex.Message}");
}
} }
catch (OperationCanceledException ex)
{
// 服务被取消,正常退出
LogService.Error($" 服务被取消,正常退出: {ex.Message}");
}
catch (Exception ex)
{
LogService.Error($"消息处理任务异常: {ex.Message}");
}
} }
/// <summary> /// <summary>

View File

@@ -2272,7 +2272,7 @@ namespace CapMachine.Wpf.Services
//dynamic dad=10; //dynamic dad=10;
InitialPLCCom(); InitialPLCCom();
//拓展的参数信息 //拓展的参数信息
@@ -2741,25 +2741,25 @@ namespace CapMachine.Wpf.Services
if (item.StateOperateResult.IsSuccess) if (item.StateOperateResult.IsSuccess)
{ {
item.State = item.StateOperateResult.Content; item.State = item.StateOperateResult.Content;
//根据PLC得到执行的步骤数据更新到CAN和LIN的数据 //根据PLC得到执行的步骤数据更新到CAN和LIN的数据压缩的使能时来自于程序的步骤配置不再接受PLC的指令数据
if (item.Name!.Equals("使能")) //if (item.Name!.Equals("使能"))
{ //{
switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin) // switch (ConfigService.CanLinRunStateModel.CurSysSelectedCanLin)
{ // {
case CanLinEnum.Can: // case CanLinEnum.Can:
//获取PLC的使能状态更新到CAN的使能状态 // //获取PLC的使能状态更新到CAN的使能状态
CanDriveService.UpdateCapEnableCmdData(item.State); // CanDriveService.UpdateCapEnableCmdData(item.State);
//itemTag.Value.EngPvValue = 0; // //itemTag.Value.EngPvValue = 0;
break; // break;
case CanLinEnum.Lin: // case CanLinEnum.Lin:
//获取PLC的使能状态更新到LIN的使能状态 // //获取PLC的使能状态更新到LIN的使能状态
LinDriveService.UpdateCapEnableCmdData(item.State); // LinDriveService.UpdateCapEnableCmdData(item.State);
//itemTag.Value.EngPvValue = 0; // //itemTag.Value.EngPvValue = 0;
break; // break;
default: // default:
break; // break;
} // }
} //}
} }
} }
@@ -3062,6 +3062,13 @@ namespace CapMachine.Wpf.Services
{ {
foreach (var itemStepExd in ProRunChannelData.ListStepExd) foreach (var itemStepExd in ProRunChannelData.ListStepExd)
{ {
//压缩机使能的参数直接给压缩机触发
if (itemStepExd.Name.Contains("压缩机使能"))
{
CanDriveService.UpdateCapEnableCmdData((bool)itemStepExd.Value);
continue;
}
var DataAdrees = ListPlcExdConfigCell.FirstOrDefault(a => a.Name == itemStepExd.Name); var DataAdrees = ListPlcExdConfigCell.FirstOrDefault(a => a.Name == itemStepExd.Name);
if (DataAdrees != null) if (DataAdrees != null)
{ {

View File

@@ -534,6 +534,7 @@ namespace CapMachine.Wpf.ViewModels
MsgName = item.MsgFrameName, MsgName = item.MsgFrameName,
SignalName = item.SignalName, SignalName = item.SignalName,
SignalCmdValue = double.TryParse(item.DefautValue, out double result) == true ? result : 0, SignalCmdValue = double.TryParse(item.DefautValue, out double result) == true ? result : 0,
LogicRuleDto = Mapper.Map<LogicRuleDto>(item.LogicRule),
}); });
//CanDriveService.CmdData.Add(new CanCmdData() //CanDriveService.CmdData.Add(new CanCmdData()
@@ -1075,7 +1076,7 @@ namespace CapMachine.Wpf.ViewModels
//ToDo cmd //ToDo cmd
CanDriveService.CanHandEnable = (bool)Data!; CanDriveService.CanHandEnable = (bool)Data!;
//给使能数据 //给使能数据
CanDriveService.UpdateCapEnableCmdData(CanDriveService.CanHandEnable); CanDriveService.UpdateCapEnableCmdDataByHand((bool)Data!);
} }
} }

View File

@@ -609,7 +609,7 @@
Margin="10,0,0,0" Margin="10,0,0,0"
Command="{Binding CanAutoHandCmd}" Command="{Binding CanAutoHandCmd}"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
FontSize="11" FontSize="8"
ToolTip="自动时:接受程序步骤的转速控制;手动时:手动发送转速数据"> ToolTip="自动时:接受程序步骤的转速控制;手动时:手动发送转速数据">
<ToggleButton.Style> <ToggleButton.Style>
<Style BasedOn="{StaticResource MaterialDesignSwitchToggleButton}" TargetType="ToggleButton"> <Style BasedOn="{StaticResource MaterialDesignSwitchToggleButton}" TargetType="ToggleButton">
@@ -647,7 +647,7 @@
Margin="10,0,0,0" Margin="10,0,0,0"
Command="{Binding CanHandEnableCmd}" Command="{Binding CanHandEnableCmd}"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}" CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
FontSize="11" FontSize="8"
ToolTip="使能时:触发报文中使能;禁用时:触发报文中使能=False"> ToolTip="使能时:触发报文中使能;禁用时:触发报文中使能=False">
<ToggleButton.Style> <ToggleButton.Style>
<Style BasedOn="{StaticResource MaterialDesignSwitchToggleButton}" TargetType="ToggleButton"> <Style BasedOn="{StaticResource MaterialDesignSwitchToggleButton}" TargetType="ToggleButton">