步骤下发更改

This commit is contained in:
2025-02-27 15:28:04 +08:00
parent b9bde07d6b
commit 9400b9e891
6 changed files with 319 additions and 33 deletions

View File

@@ -204,6 +204,7 @@ namespace CapMachine.Wpf.Services
//}).AsTable("RecordData").ExecuteAffrows();
//实时数据记录管道数据监听
Task.Run(() => ListenRecoredChannelAction());
@@ -388,9 +389,9 @@ namespace CapMachine.Wpf.Services
//增加日期和时间两个列
model.WorkDay = model.CreateTime.ToString("yyyy-MM-dd");
model.Time = model.CreateTime.ToString("HH:mm:ss");
return model;
}
@@ -440,7 +441,7 @@ namespace CapMachine.Wpf.Services
var DataInfo = MachineRtDataService.TagManger.DicTags
.ToDictionary(kvp => kvp.Key, kvp => (object)kvp.Value.EngPvValue);
DataInfo.Add("创建时间", DateTime.Now);
var RecordData = new RecordChannelData()
{
CreateTime = DateTime.Now,

View File

@@ -1592,23 +1592,23 @@ namespace CapMachine.Wpf.Services
if (ProRunChannelData.RunStepType == RunStepType.SlopCell)
{
SiemensDrive.Write("D1", (short)ProRunChannelData.SV);
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " +
$"【参数名称】:{ProRunChannelData.MeterName} " +
$"【程序Seg】{ProRunChannelData.ProSegName} " +
$"【程序步骤】{ProRunChannelData.MeterStep} " +
$"【斜坡打点步骤】{ProRunChannelData.SlopStepNo} " +
$"【斜坡打点值SV】{ProRunChannelData.SV} " +
$"【Msg】接受到仿真写入PLC OK ");
//Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " +
// $"【参数名称】:{ProRunChannelData.MeterName} " +
// $"【程序Seg】{ProRunChannelData.ProSegName} " +
// $"【程序步骤】{ProRunChannelData.MeterStep} " +
// $"【斜坡打点步骤】{ProRunChannelData.SlopStepNo} " +
// $"【斜坡打点值SV】{ProRunChannelData.SV} " +
// $"【Msg】接受到仿真写入PLC OK ");
}
else
{
SiemensDrive.Write("D1", (short)ProRunChannelData.SV);
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " +
$"【参数名称】:{ProRunChannelData.MeterName} " +
$"【程序Seg】{ProRunChannelData.ProSegName} " +
$"【程序步骤】{ProRunChannelData.MeterStep} " +
$"【步骤SV】{ProRunChannelData.SV} " +
$"【Msg】接受到步骤仿真写入PLC OK ");
//Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " +
// $"【参数名称】:{ProRunChannelData.MeterName} " +
// $"【程序Seg】{ProRunChannelData.ProSegName} " +
// $"【程序步骤】{ProRunChannelData.MeterStep} " +
// $"【步骤SV】{ProRunChannelData.SV} " +
// $"【Msg】接受到步骤仿真写入PLC OK ");
}

View File

@@ -23,6 +23,8 @@ using System.Windows.Forms;
using HslCommunication.Profinet.Siemens;
using Masuit.Tools.Hardware;
using CapMachine.Model.MeterConfig;
using Masuit.Tools;
using System.Timers;
namespace CapMachine.Wpf.Services
{
@@ -164,8 +166,12 @@ namespace CapMachine.Wpf.Services
//程序运行实时管道数据监听
//Task.Run(() => ListenProRunChannelAction());
}
/// <summary>
/// 选中的程序运行集合
/// </summary>
@@ -206,10 +212,14 @@ namespace CapMachine.Wpf.Services
return;
}
//取消之前的程序执行
EndProRun();
//先清空之前的步骤数据
foreach (var itemProExModel in ListProExModel)
{
itemProExModel.ListProStepExe.Clear();
itemProExModel.ListSlopExStep.Clear();
}
//多个选中的程序块循环
@@ -251,6 +261,9 @@ namespace CapMachine.Wpf.Services
{
//单行步骤中包含多个仪表参数的配置,需要逐个仪表参数手动操作解析
//统计当前步骤itemStep的速度所有时间供后面的其他参数使用因为其他的参数也是牟定当前步骤速度是总时间在这个步骤中所有的参数的总时间是一样的
var SpeedStepTotaolTime = 0;
//********* 单个【速度】步骤信息的解析 *********
{
var CurMeterName = "速度";
@@ -259,7 +272,9 @@ namespace CapMachine.Wpf.Services
switch (itemStep.MeterSpeeds.FirstOrDefault()!.ValueType)
{
case ConfigValueType.Constant: //常值
//常值的话就一个数据,循环执行一次
//常值没有斜率和多个步骤,就一个总时间
SpeedStepTotaolTime = itemStep.MeterSpeeds.FirstOrDefault()!.KeepTime;
//常值的话就一个数据,循环执行一次
foreach (var itemMeterValueCell in itemStep.MeterSpeeds)
{
var Pid = new ConfigPID();
@@ -307,10 +322,13 @@ namespace CapMachine.Wpf.Services
ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
});
}
break;
case ConfigValueType.Slope: //斜率
//根据循环次数确定
//斜率有多个步骤和循环次数,统计一个总时间
SpeedStepTotaolTime = itemStep.SpeedCycle * itemStep.MeterSpeeds.Sum(a => a.KeepTime);
//根据循环次数确定
for (int StepIndex = 0; StepIndex < itemStep.SpeedCycle; StepIndex++)
{
//根据循环次数执行
@@ -364,6 +382,7 @@ namespace CapMachine.Wpf.Services
});
}
}
break;
default:
break;
@@ -494,6 +513,28 @@ namespace CapMachine.Wpf.Services
}
else
{
//判断当前的参数是全部都没有设置还是这一步没有设置,如果这个步骤没有设置,则沿用上一个步骤数据
var CurMeterListStepExe = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe;
if (CurMeterListStepExe.Any())
{
//之前有步骤数据的话,则直接使用上一步的数据
//Copy这个步骤的数据
var LastStepData = CurMeterListStepExe.OrderByDescending(a => a.MeterStep).FirstOrDefault().DeepClone();
//处理这个步骤的数据-处理按照常值的恒定的模式运行,就是维持结束的常值数据
LastStepData!.MeterStep = LastStepData.MeterStep + 1;//步骤+1
LastStepData.KeepTime = SpeedStepTotaolTime;//时间是整个时间
LastStepData.ExistSlop = false;
LastStepData.StartSV = LastStepData.EndSV;
LastStepData.ProStepInfo = $"{itemStep.StepNo}-{1}";
//添加
CurMeterListStepExe.Add(LastStepData);
//SpeedStepTotaolTime
}
else
{
//之前步骤没有数据的话,则放弃,不做任何处理
}
LogService.Warn($"【名称】: {CurMeterName} - 未找到步骤信息。步骤为空");
}
@@ -590,12 +631,25 @@ namespace CapMachine.Wpf.Services
//集合没有数据,不进行操作
return 0;
}
}
#region
/// <summary>
/// 暂停的时间
/// </summary>
public int PauseSecTime { get; set; }
/// <summary>
/// 暂停开始时间
/// </summary>
public DateTime PauseStartDt { get; set; }
/// <summary>
/// 暂停结束时间
/// </summary>
public DateTime PauseEndDt { get; set; }
/// <summary>
/// 开始程序调度运行
/// </summary>
@@ -614,20 +668,95 @@ namespace CapMachine.Wpf.Services
itemProExModel.StepEndDt = DateTime.Now;
}
ProRunTaskScanTimeEnable = true;
//运行扫描任务
ProRunTimeScan();
}
private bool ProRunTaskEnable = true;
/// <summary>
/// 结束程序调度执行
/// </summary>
public void EndProRun()
{
ProRunTaskScanTimeEnable = false;
ProRunTimeScanTokenSource.Cancel();
//先清空当前步骤数据
foreach (var itemProExModel in ListProExModel)
{
itemProExModel.ListProStepExe.Clear();
itemProExModel.ListSlopExStep.Clear();
}
}
/// <summary>
/// 暂停程序调度执行 continue
/// </summary>
public void PauseProRun()
{
//开始暂停的计时
PauseStartDt = DateTime.Now;
//取消扫描
ProRunTaskScanTimeEnable = false;
ProRunTimeScanTokenSource.Cancel();
//斜坡打点暂定
foreach (var itemProExModel in ListProExModel)
{
itemProExModel.PauseSlopExCyclePause();
}
}
/// <summary>
/// 继续程序调度执行
/// </summary>
public void ContinueProRun()
{
PauseEndDt = DateTime.Now;
//统计的暂停的时间
var PauseTime = (PauseEndDt - PauseStartDt).TotalSeconds;
//斜坡打点暂定
foreach (var itemProExModel in ListProExModel)
{
itemProExModel.ContinueSlopExCyclePause();
itemProExModel.StepEndDt = itemProExModel.StepEndDt.AddSeconds(PauseTime < 0 ? 0 : PauseTime);
}
//然后继续运行
ProRunTaskScanTimeEnable = true;
//运行扫描任务
ProRunTimeScan();
}
/// <summary>
/// 运行任务的Task扫描时间是否启用这个等级较高为False时不进行扫描整个方法取消执行
/// 扫描时间判定是否切入下一步
/// </summary>
private bool ProRunTaskScanTimeEnable { get; set; } = true;
/// <summary>
/// 任务取消管理
/// 用于管理取消操作
/// </summary>
public CancellationTokenSource ProRunTimeScanTokenSource { get; set; } = new CancellationTokenSource();
/// <summary>
/// 运行时间扫描
/// </summary>
private void ProRunTimeScan()
{
ProRunTimeScanTokenSource = new CancellationTokenSource();
ProRunTimeScanTask = Task.Run(async () =>
{
while (ProRunTaskEnable)
while (ProRunTaskScanTimeEnable)
{
try
{
@@ -648,7 +777,7 @@ namespace CapMachine.Wpf.Services
}
//Console.WriteLine($"扫描时间:{DiagnosticsTime.Elapsed.TotalMilliseconds.ToString()}");
}
});
}, ProRunTimeScanTokenSource.Token);
}