diff --git a/CapMachine.Wpf/Models/PlcLoadConfigCell.cs b/CapMachine.Wpf/Models/PlcLoadConfigCell.cs
index 8903d3a..063badb 100644
--- a/CapMachine.Wpf/Models/PlcLoadConfigCell.cs
+++ b/CapMachine.Wpf/Models/PlcLoadConfigCell.cs
@@ -20,7 +20,32 @@ namespace CapMachine.Wpf.Models
///
/// 地址
///
- public string? Address { get; set; }
+ public string? SvAddress { get; set; }
+
+ ///
+ /// 地址信息 Pid_P
+ ///
+ public string? Pid_PAddress { get; set; }
+
+ ///
+ /// 地址信息 Pid_I
+ ///
+ public string? Pid_IAddress { get; set; }
+
+ ///
+ /// 地址信息 Pid_D
+ ///
+ public string? Pid_DAddress { get; set; }
+
+ ///
+ /// 地址信息 Limit_Up
+ ///
+ public string? Limit_UpAddress { get; set; }
+
+ ///
+ /// 地址信息 Limit_Down
+ ///
+ public string? Limit_DownAddress { get; set; }
///
/// 精度 1,10,100,1000
diff --git a/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs b/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs
index 1f6e0e7..155cca9 100644
--- a/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs
+++ b/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs
@@ -1,4 +1,5 @@
-using CapMachine.Wpf.ChannelModel;
+using AngleSharp.Dom.Events;
+using CapMachine.Wpf.ChannelModel;
using CapMachine.Wpf.Services;
using ImTools;
using Masuit.Tools;
@@ -34,8 +35,13 @@ namespace CapMachine.Wpf.Models.ProModelPars
CycleTimer.AutoReset = true;
CycleTimer.Enabled = true;
CycleTimer.Start();
+
}
+ ///
+ /// 是否是速度仪表参数
+ ///
+ public bool IsSpeed { get; set; }=false;
///
/// 程序执行管道
@@ -96,7 +102,11 @@ namespace CapMachine.Wpf.Models.ProModelPars
#region 仪表步骤执行时间信息
- public EventHandler RunTimeCallSglEvent;
+ ///
+ /// 速度运行结束事件
+ ///
+ public event EventHandler SpeedRunEndEvent;
+
///
/// 是否启用
@@ -145,12 +155,17 @@ namespace CapMachine.Wpf.Models.ProModelPars
//RunEnable = false;
//时间到了触发下载下一步步骤
+
+
//不为空的数据
if (NextProStepExe == null)
{
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{MeterName} " +
$"【Msg】:当前仪表参数全部执行完毕 ");
+ //速度执行结束发布事件
+ if (IsSpeed) SpeedRunEndEvent.Invoke(this, "OK");
+
//为空时不执行后续的数据
RunEnable = false;
return;
@@ -185,6 +200,18 @@ namespace CapMachine.Wpf.Models.ProModelPars
////////发送步骤信息///////////
if (NextProStepExe.ExistSlop)
{
+ //存在斜坡数据,SV是通过集合陆续打点写入,但是PID和Limit需要判断是否要写入,只要写一次即可
+ ProRunChannel.Writer.WriteAsync(new ProRunChannelData()
+ {
+ MeterName = MeterName,
+ SV = NextProStepExe.EndSV,
+ ProSegName = NextProStepExe.ProSegName,
+ MeterStep = NextProStepExe.MeterStep,
+ CurLoadLimit = LimitResult == true ? new Limit() { Up = (short)NextProStepExe.CurConfigLimitDto.Up, Down = (short)NextProStepExe.CurConfigLimitDto.Down } : new Limit(),
+ CurLoadPID = PidResult == true ? new PID() { P = (short)NextProStepExe.CurConfigPIDDto.P, I = (short)NextProStepExe.CurConfigPIDDto.I, D = (short)NextProStepExe.CurConfigPIDDto.D } : new PID(),
+ RunStepType = GetRunStepType(PidResult, LimitResult, false),
+ });
+
//存在坡度数据
var SecStepDur = NextProStepExe.EndSV - NextProStepExe.StartSV;
var SecStepValue = SecStepDur * 1.0 / NextProStepExe.KeepTime;
@@ -256,7 +283,7 @@ namespace CapMachine.Wpf.Models.ProModelPars
if (ListProStepExe.Where(x => x.MeterStep == CurProStepExe.MeterStep + 1).Any())
{
//存在下一步数据
- NextProStepExe = ListProStepExe.FirstOrDefault(x => x.MeterStep == CurProStepExe.MeterStep + 1);
+ NextProStepExe = ListProStepExe.FirstOrDefault(x => x.MeterStep == CurProStepExe.MeterStep + 1)!;
}
else
{
@@ -312,6 +339,18 @@ namespace CapMachine.Wpf.Models.ProModelPars
{
return RunStepType.StepSV;
}
+ else if (pid && limit)
+ {
+ return RunStepType.LimitPid;
+ }
+ else if (limit)
+ {
+ return RunStepType.Limit;
+ }
+ else if (pid)
+ {
+ return RunStepType.Pid;
+ }
else
{
return RunStepType.Step;
diff --git a/CapMachine.Wpf/Models/ProModelPars/RunStepType.cs b/CapMachine.Wpf/Models/ProModelPars/RunStepType.cs
index 9089fa4..0db343a 100644
--- a/CapMachine.Wpf/Models/ProModelPars/RunStepType.cs
+++ b/CapMachine.Wpf/Models/ProModelPars/RunStepType.cs
@@ -35,6 +35,24 @@ namespace CapMachine.Wpf.Models.ProModelPars
///
StepSV = 4,
+ ///
+ /// 正常的步骤信息-Limit 下载数据
+ /// 就是:包括:SV PID和SLIMIT的数据,当然SV PID和SLIMIT跟上次是一样的话,则不需要下载
+ ///
+ LimitPid = 5,
+
+ ///
+ /// 正常的步骤信息-Limit 下载数据
+ /// 就是:包括:SV PID和SLIMIT的数据,当然SV PID和SLIMIT跟上次是一样的话,则不需要下载
+ ///
+ Limit = 6,
+
+ ///
+ /// 正常的步骤信息-PID 下载数据
+ /// 就是:包括:SV PID和SLIMIT的数据,当然SV PID和SLIMIT跟上次是一样的话,则不需要下载
+ ///
+ Pid = 7,
+
///
/// 斜率单元
/// 带斜率的数据打点执行,只传送SV值
diff --git a/CapMachine.Wpf/Models/ProRunTimeCalc.cs b/CapMachine.Wpf/Models/ProRunTimeCalc.cs
new file mode 100644
index 0000000..36b0a71
--- /dev/null
+++ b/CapMachine.Wpf/Models/ProRunTimeCalc.cs
@@ -0,0 +1,144 @@
+using Prism.Mvvm;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Timers;
+using System.Windows;
+using System.Windows.Threading;
+
+namespace CapMachine.Wpf.Models
+{
+ ///
+ /// 程序运行时间统计
+ ///
+ public class ProRunTimeCalc : BindableBase
+ {
+ public ProRunTimeCalc()
+ {
+ //秒触发一次
+ CycleTimer = new System.Timers.Timer(1000);
+ CycleTimer.Elapsed += ProRunCycleAction;
+ CycleTimer.AutoReset = true;
+ CycleTimer.Enabled = true;
+
+ }
+
+ ///
+ /// 程序运行时间周期统计
+ ///
+ ///
+ ///
+ ///
+ private void ProRunCycleAction(object? sender, ElapsedEventArgs e)
+ {
+ Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+ {
+ CalcTime();
+ }));
+
+ //CycleTimer.Stop();
+
+ //CycleTimer.Start();
+ }
+
+ ///
+ /// 统计时间
+ ///
+ private void CalcTime()
+ {
+ ProEndDt = DateTime.Now;
+
+ ProRunTimeStr = ConvertSecToDHMS((int)((ProEndDt - ProStartDt).TotalSeconds - PauseTotalSecTime));
+ }
+
+ private string ConvertSecToDHMS(int totalSeconds)
+ {
+ // 驗證非負(可根據需求調整)
+ if (totalSeconds < 0)
+ return "00:00:00:00";
+
+ int days = totalSeconds / 86400; // 1天 = 86400秒
+ int remainingSeconds = totalSeconds % 86400;
+
+ int hours = remainingSeconds / 3600; // 1小時 = 3600秒
+ remainingSeconds %= 3600;
+
+ int minutes = remainingSeconds / 60; // 1分鐘 = 60秒
+ int seconds = remainingSeconds % 60;
+
+ // 格式化輸出,確保時、分、秒為兩位數
+ return $"{days}天:{hours:D2}时:{minutes:D2}分:{seconds:D2}秒";
+ }
+
+ ///
+ /// 开始计时
+ ///
+ public void StartProRunTime()
+ {
+ ProStartDt = DateTime.Now;
+ CycleTimer.Start();
+ }
+
+ ///
+ /// 暂停计时
+ ///
+ public void PauseProRunTime()
+ {
+ CycleTimer.Stop();
+ }
+
+ ///
+ /// 继续计时
+ ///
+ public void ContinueProRunTime()
+ {
+ CycleTimer.Start();
+ }
+
+ ///
+ /// 结束计时
+ ///
+ public void EndProRunTime()
+ {
+ CycleTimer.Stop();
+ CalcTime();
+ }
+
+ ///
+ /// 周期定时器
+ ///
+ private System.Timers.Timer CycleTimer { get; set; }
+
+
+ ///
+ /// 程序开始的时间
+ ///
+ public DateTime ProStartDt { get; set; }
+
+ ///
+ /// 程序结束的时间
+ ///
+ public DateTime ProEndDt { get; set; }
+
+
+ private string? _ProRunTimeStr;
+ ///
+ /// 程序运行时间字符串
+ ///
+ public string? ProRunTimeStr
+ {
+ get { return _ProRunTimeStr; }
+ set { _ProRunTimeStr = value; RaisePropertyChanged(); }
+ }
+
+ ///
+ /// 全部的暂停的时间
+ /// 可能暂停多次
+ ///
+ public int PauseTotalSecTime { get; set; }
+
+
+ }
+}
diff --git a/CapMachine.Wpf/Models/State/MachineRunState.cs b/CapMachine.Wpf/Models/State/MachineRunState.cs
index 21fa9ea..e4a5307 100644
--- a/CapMachine.Wpf/Models/State/MachineRunState.cs
+++ b/CapMachine.Wpf/Models/State/MachineRunState.cs
@@ -71,6 +71,7 @@ namespace CapMachine.Wpf.Models
///
private void InitConfig()
{
+ //未配置触发器 CanFire 返回值 false
//状态机初始化
StateMachine = new StateMachine(RunState.Wait);
@@ -80,54 +81,82 @@ namespace CapMachine.Wpf.Models
.PermitIf(RunStateTrig.AlarmTrig, RunState.Alarm, () => AlarmPreValid())
.PermitIf(RunStateTrig.StartTrig, RunState.Run, () => RunPreValid())
//.Permit(RunStateTrig.StartTrig, RunState.Run)
- //.Permit(RunStateTrig.ResetTrig, RunState.Wait)
- .PermitIf(RunStateTrig.EndTrig, RunState.Stop, () => StopPreValid())
- .PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid())
- .Ignore(RunStateTrig.ResetTrig)
- .Ignore(RunStateTrig.WaitTrig);
+ .PermitIf(RunStateTrig.ResetTrig, RunState.Stop, () => StopPreValid());
+ //.PermitIf(RunStateTrig.EndTrig, RunState.Stop, () => StopPreValid())
+ //.PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid())
+ //.Ignore(RunStateTrig.ResetTrig);
+ //.Ignore(RunStateTrig.ContinueTrig)
+ //.Ignore(RunStateTrig.WaitTrig);
StateMachine.Configure(RunState.Alarm)
.OnEntry(t => AlarmEntryCall())
.OnExit(t => AlarmExitCall())
.PermitIf(RunStateTrig.WaitTrig, RunState.Wait, () => WaitPreValid())
- .PermitIf(RunStateTrig.ResetTrig, RunState.Wait, () => WaitPreValid())
- .PermitIf(RunStateTrig.StartTrig, RunState.Run, () => RunPreValid())
- .PermitIf(RunStateTrig.EndTrig, RunState.Stop, () => StopPreValid())
- .PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid())
- .Ignore(RunStateTrig.AlarmTrig);
+ .PermitIf(RunStateTrig.ResetTrig, RunState.Stop, () => StopPreValid());
+ //.PermitIf(RunStateTrig.StartTrig, RunState.Run, () => RunPreValid())
+ //.PermitIf(RunStateTrig.EndTrig, RunState.Stop, () => StopPreValid())
+ //.PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid())
+ //.Ignore(RunStateTrig.ContinueTrig)
+ //.Ignore(RunStateTrig.AlarmTrig);
StateMachine.Configure(RunState.Run)
.OnEntry(t => RunEntryCall())
.OnExit(t => RunExitCall())
- .PermitIf(RunStateTrig.WaitTrig, RunState.Wait, () => WaitPreValid())
- .PermitIf(RunStateTrig.ResetTrig, RunState.Wait, () => WaitPreValid())
+ //.PermitIf(RunStateTrig.WaitTrig, RunState.Wait, () => WaitPreValid())
+ .PermitIf(RunStateTrig.ResetTrig, RunState.Stop, () => StopPreValid())
.PermitIf(RunStateTrig.AlarmTrig, RunState.Alarm, () => AlarmPreValid())
.PermitIf(RunStateTrig.EndTrig, RunState.Stop, () => StopPreValid())
- .PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid())
- .Ignore(RunStateTrig.StartTrig);
+ .PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid());
+ //.PermitIf(RunStateTrig.ContinueTrig, RunState.Stop, () => false)
+ //.Ignore(RunStateTrig.ContinueTrig)
+ //.Ignore(RunStateTrig.StartTrig);
StateMachine.Configure(RunState.Stop)
.OnEntry(t => StopEntryCall())
.OnExit(t => StopExitCall())
.PermitIf(RunStateTrig.WaitTrig, RunState.Wait, () => WaitPreValid())
- .PermitIf(RunStateTrig.ResetTrig, RunState.Wait, () => WaitPreValid())
.PermitIf(RunStateTrig.AlarmTrig, RunState.Alarm, () => AlarmPreValid())
- .PermitIf(RunStateTrig.StartTrig, RunState.Run, () => RunPreValid())
- .PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid())
- .Ignore(RunStateTrig.EndTrig);
+ .PermitIf(RunStateTrig.StartTrig, RunState.Run, () => RunPreValid());
+ //.PermitIf(RunStateTrig.PauseTrig, RunState.Pause, () => PausePreValid())
+ //.Ignore(RunStateTrig.ContinueTrig)
+ //.Ignore(RunStateTrig.PauseTrig)
+ //.Ignore(RunStateTrig.EndTrig);
StateMachine.Configure(RunState.Pause)
.OnEntry(t => PauseEntryCall())
.OnExit(t => PauseExitCall())
- .PermitIf(RunStateTrig.WaitTrig, RunState.Wait, () => WaitPreValid())
- .PermitIf(RunStateTrig.ResetTrig, RunState.Wait, () => WaitPreValid())
+ .Permit(RunStateTrig.ContinueTrig, RunState.Run)
+ //.PermitIf(RunStateTrig.WaitTrig, RunState.Wait, () => WaitPreValid())
+ .PermitIf(RunStateTrig.ResetTrig, RunState.Stop, () => StopPreValid())
.PermitIf(RunStateTrig.AlarmTrig, RunState.Alarm, () => AlarmPreValid())
- .PermitIf(RunStateTrig.StartTrig, RunState.Run, () => RunPreValid())
- .PermitIf(RunStateTrig.EndTrig, RunState.Stop, () => StopPreValid())
- .Ignore(RunStateTrig.PauseTrig);
+ //.PermitIf(RunStateTrig.StartTrig, RunState.Run, () => RunPreValid())
+ .Permit(RunStateTrig.EndTrig, RunState.Stop);
+ //.Ignore(RunStateTrig.PauseTrig);
}
+ private bool _BtnStartState;
+ ///
+ /// 界面的开始按钮状态
+ ///
+ public bool BtnStartState
+ {
+ get { return _BtnStartState; }
+ set { _BtnStartState = value; RaisePropertyChanged(); }
+ }
+
+ private bool _BtnEndState;
+ ///
+ /// 界面的结束按钮状态
+ ///
+ public bool BtnEndState
+ {
+ get { return _BtnEndState; }
+ set { _BtnEndState = value; RaisePropertyChanged(); }
+ }
+
+
+
#region 验证状态
///
@@ -144,7 +173,7 @@ namespace CapMachine.Wpf.Models
}
else
{
- MessageBox.Show($"WaitTrig-没有满足条件");
+ MessageBox.Show($"WaitTrig-没有满足Wait条件");
return false;
}
}
@@ -155,17 +184,19 @@ namespace CapMachine.Wpf.Models
///
public bool FireAlarm()
{
- var Result = StateMachine.CanFire(RunStateTrig.AlarmTrig);
- if (Result)
- {
- StateMachine.Fire(RunStateTrig.AlarmTrig);
- return true;
- }
- else
- {
- MessageBox.Show($"AlarmTrig-没有满足条件");
- return false;
- }
+ StateMachine.Fire(RunStateTrig.AlarmTrig);
+ return true;
+ //var Result = StateMachine.CanFire(RunStateTrig.AlarmTrig);
+ //if (Result)
+ //{
+ // StateMachine.Fire(RunStateTrig.AlarmTrig);
+ // return true;
+ //}
+ //else
+ //{
+ // MessageBox.Show($"AlarmTrig-没有满足条件");
+ // return false;
+ //}
}
///
@@ -182,7 +213,7 @@ namespace CapMachine.Wpf.Models
}
else
{
- MessageBox.Show($"ResetTrig-没有满足条件");
+ MessageBox.Show($"ResetTrig-没有满足Reset条件");
return false;
}
}
@@ -201,7 +232,7 @@ namespace CapMachine.Wpf.Models
}
else
{
- MessageBox.Show($"StartTrig-没有满足条件");
+ MessageBox.Show($"StartTrig-没有满足Start条件");
return false;
}
}
@@ -220,7 +251,7 @@ namespace CapMachine.Wpf.Models
}
else
{
- MessageBox.Show($"EndTrig-没有满足条件");
+ MessageBox.Show($"EndTrig-没有满足End条件");
return false;
}
}
@@ -239,12 +270,29 @@ namespace CapMachine.Wpf.Models
}
else
{
- MessageBox.Show($"PauseTrig-没有满足条件");
+ MessageBox.Show($"PauseTrig-没有满足Pause条件");
return false;
}
}
-
+ ///
+ /// 进入 Continue 状态
+ ///
+ ///
+ public bool FireContinue()
+ {
+ var Result = StateMachine.CanFire(RunStateTrig.ContinueTrig);
+ if (Result)
+ {
+ StateMachine.Fire(RunStateTrig.ContinueTrig);
+ return true;
+ }
+ else
+ {
+ MessageBox.Show($"ContinueTrig-没有满足Continue条件");
+ return false;
+ }
+ }
@@ -293,12 +341,13 @@ namespace CapMachine.Wpf.Models
///
private bool StopPreValid()
{
- //运行切换到停止
- if (StateMachine.State == RunState.Run)
- {
- return true;
- }
- return false;
+ return true;
+ ////运行切换到停止
+ //if (StateMachine.State == RunState.Run)
+ //{
+ // return true;
+ //}
+ //return false;
}
///
@@ -334,6 +383,7 @@ namespace CapMachine.Wpf.Models
private void StopExitCall()
{
+ BtnEndState = false;
Console.WriteLine($"{Name}-StopExitCall");
}
@@ -342,6 +392,7 @@ namespace CapMachine.Wpf.Models
///
private void StopEntryCall()
{
+ BtnEndState = true;
RunStateMsg = "停止";
Console.WriteLine($"{Name}-StopEntryCall");
@@ -350,6 +401,7 @@ namespace CapMachine.Wpf.Models
private void RunExitCall()
{
+ BtnStartState = false;
//退出运行状态
IsRunState = false;
Console.WriteLine($"{Name}-RunExitCall");
@@ -360,6 +412,7 @@ namespace CapMachine.Wpf.Models
///
private void RunEntryCall()
{
+ BtnStartState = true;
RunStateMsg = "运行";
Console.WriteLine($"{Name}-RunEntryCall");
//进入运行状态
diff --git a/CapMachine.Wpf/Models/State/RunState.cs b/CapMachine.Wpf/Models/State/RunState.cs
index 22c60b9..d50b8cd 100644
--- a/CapMachine.Wpf/Models/State/RunState.cs
+++ b/CapMachine.Wpf/Models/State/RunState.cs
@@ -40,6 +40,12 @@ namespace CapMachine.Wpf.Models
/// 复位 触发
///
ResetTrig = 6,
+
+ ///
+ /// 继续 触发
+ ///
+ ContinueTrig = 7,
+
}
///
diff --git a/CapMachine.Wpf/Models/Tag/ITag.cs b/CapMachine.Wpf/Models/Tag/ITag.cs
index a7d5cbe..1e4d8e6 100644
--- a/CapMachine.Wpf/Models/Tag/ITag.cs
+++ b/CapMachine.Wpf/Models/Tag/ITag.cs
@@ -117,5 +117,10 @@ namespace CapMachine.Wpf.Models.Tag
///
bool IsMeter { get; set; }
string AutoHandSwitchAddress { get; set; }
+ string Pid_PAddress { get; set; }
+ string Pid_IAddress { get; set; }
+ string Pid_DAddress { get; set; }
+ string Limit_UpAddress { get; set; }
+ string Limit_DownAddress { get; set; }
}
}
diff --git a/CapMachine.Wpf/Models/Tag/Tag.cs b/CapMachine.Wpf/Models/Tag/Tag.cs
index 719dc74..c5490ba 100644
--- a/CapMachine.Wpf/Models/Tag/Tag.cs
+++ b/CapMachine.Wpf/Models/Tag/Tag.cs
@@ -122,6 +122,31 @@ namespace CapMachine.Wpf.Models.Tag
///
public string MVAddress { get; set; }
+ ///
+ /// 地址信息 Pid_P
+ ///
+ public string Pid_PAddress { get; set; }
+
+ ///
+ /// 地址信息 Pid_I
+ ///
+ public string Pid_IAddress { get; set; }
+
+ ///
+ /// 地址信息 Pid_D
+ ///
+ public string Pid_DAddress { get; set; }
+
+ ///
+ /// 地址信息 Limit_Up
+ ///
+ public string Limit_UpAddress { get; set; }
+
+ ///
+ /// 地址信息 Limit_Down
+ ///
+ public string Limit_DownAddress { get; set; }
+
///
/// 地址信息 Index
///
diff --git a/CapMachine.Wpf/PrismEvent/ProRunEvent.cs b/CapMachine.Wpf/PrismEvent/ProRunEvent.cs
new file mode 100644
index 0000000..b332355
--- /dev/null
+++ b/CapMachine.Wpf/PrismEvent/ProRunEvent.cs
@@ -0,0 +1,14 @@
+using Prism.Events;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CapMachine.Wpf.PrismEvent
+{
+ public class ProRunEvent : PubSubEvent
+ {
+
+ }
+}
diff --git a/CapMachine.Wpf/PrismEvent/ProRunEventMsg.cs b/CapMachine.Wpf/PrismEvent/ProRunEventMsg.cs
new file mode 100644
index 0000000..ddea579
--- /dev/null
+++ b/CapMachine.Wpf/PrismEvent/ProRunEventMsg.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CapMachine.Wpf.PrismEvent
+{
+ ///
+ /// 程序运行事件消息
+ ///
+ public class ProRunEventMsg
+ {
+ ///
+ /// 机器
+ ///
+ public string? Machine { get; set; }
+
+ ///
+ /// 消息
+ ///
+ public string? Msg { get; set; }
+ }
+}
diff --git a/CapMachine.Wpf/Services/MachineRtDataService.cs b/CapMachine.Wpf/Services/MachineRtDataService.cs
index b281064..fbeec9a 100644
--- a/CapMachine.Wpf/Services/MachineRtDataService.cs
+++ b/CapMachine.Wpf/Services/MachineRtDataService.cs
@@ -96,6 +96,11 @@ namespace CapMachine.Wpf.Services
/////
//public List ListRtDataModel { get; set; }
+ ///
+ /// PLC加载配置数据集合
+ ///
+ public List ListPlcLoadConfigCell { get; set; }
+
///
/// 标签管理中心
///
@@ -151,39 +156,39 @@ namespace CapMachine.Wpf.Services
#region 标签管理
////三电 Sample
- TagManger.AddTag(new Tag("转速", "转速[rpm]", "Speed", "程序", "VW15000", 100, 0, 1, "rpm", new ShortTagValue(), true) { DecimalPoint = 0, IsMeter = true, });
- TagManger.AddTag(new Tag("排气压力", "排气压力[BarA]", "ExPress", "程序", "VW15002", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("吸气压力", "吸气压力[BarA]", "InhPress", "程序", "VW15004", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("吸气温度", "吸气温度[℃]", "InhTemp", "程序", "VW15006", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("COND1温度", "COND1温度[℃]", "Cond1Temp", "程序", "VW15008", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("润滑油压力", "润滑油压力[BarA]", "LubePress", "程序", "VW15010", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("COND2压力", "COND2压力[BarA]", "Cond2Press", "程序", "VW15012", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("OCR", "OCR[%]", "OCR", "程序", "VW15014", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("HV[V]", "HV[V]", "HV", "程序", "VW15016", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("HV[A]", "HV[A]", "HVCur", "程序", "VW15018", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("HV[W]", "HV[W]", "HVPw", "程序", "VW15020", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("LV[V]", "LV[V]", "LV", "程序", "VW15022", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
+ TagManger.AddTag(new Tag("转速", "转速[rpm]", "Speed", "程序", "VW15000", 100, 0, 1, "rpm", new ShortTagValue(), true) { DecimalPoint = 0, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("排气压力", "排气压力[BarA]", "ExPress", "程序", "VW15002", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("吸气压力", "吸气压力[BarA]", "InhPress", "程序", "VW15004", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("吸气温度", "吸气温度[℃]", "InhTemp", "程序", "VW15006", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("COND1温度", "COND1温度[℃]", "Cond1Temp", "程序", "VW15008", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("润滑油压力", "润滑油压力[BarA]", "LubePress", "程序", "VW15010", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("COND2压力", "COND2压力[BarA]", "Cond2Press", "程序", "VW15012", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("OCR", "OCR[%]", "OCR", "程序", "VW15014", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("HV[V]", "HV[V]", "HV", "程序", "VW15016", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("HV[A]", "HV[A]", "HVCur", "程序", "VW15018", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("HV[W]", "HV[W]", "HVPw", "程序", "VW15020", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("LV[V]", "LV[V]", "LV", "程序", "VW15022", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
//TagManger.AddTag(new Tag("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
- TagManger.AddTag(new Tag("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("环境温度", "环境温度[℃]", "EnvTemp", "程序", "VW15026", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
+ TagManger.AddTag(new Tag("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("环境温度", "环境温度[℃]", "EnvTemp", "程序", "VW15026", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
//TagManger.AddTag(new Tag("环境湿度", "环境湿度[%]", "EnvRH", "程序", "VW15028", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1 });
- TagManger.AddTag(new Tag("环境湿度", "环境湿度[%]", "EnvRH", "程序", "VW15028", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("OS1温度", "OS1温度[℃]", "OS1Temp", "程序", "VW15030", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("OS2温度", "OS2温度[℃]", "OS2Temp", "程序", "VW15032", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("COND2温度", "COND2温度[℃]", "Cond2Temp", "程序", "VW15034", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("EVAP出口温度", "EVAP出口温度[℃]", "EVAPExpTemp", "程序", "VW15036", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
+ TagManger.AddTag(new Tag("环境湿度", "环境湿度[%]", "EnvRH", "程序", "VW15028", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("OS1温度", "OS1温度[℃]", "OS1Temp", "程序", "VW15030", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("OS2温度", "OS2温度[℃]", "OS2Temp", "程序", "VW15032", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("COND2温度", "COND2温度[℃]", "Cond2Temp", "程序", "VW15034", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("EVAP出口温度", "EVAP出口温度[℃]", "EVAPExpTemp", "程序", "VW15036", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
//TagManger.AddTag(new Tag("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
- TagManger.AddTag(new Tag("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("润滑油流量", "润滑油流量[L/min]", "LubeFlow", "程序", "VW15040", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("排气温度", "排气温度[℃]", "ExTemp", "程序", "VW15042", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("膨胀阀前压力", "膨胀阀前压力[BarA]", "TxvFrPress", "程序", "VW15044", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("膨胀阀前温度", "膨胀阀前温度[℃]", "TxvFrTemp", "程序", "VW15046", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("EVAP出口压力", "EVAP出口压力[BarA]", "EVAPExpPress", "程序", "VW15048", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("腔内压力", "腔内压力[BarA]", "IntrplPress", "程序", "VW15050", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true });
- TagManger.AddTag(new Tag("压缩机表面温度", "压缩机表面温度[℃]", "CapSurfTemp", "程序", "VW15052", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("PTC流量", "PTC流量[L/min]", "PTCFlow", "程序", "VW15054", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("PTC入水温度", "PTC入水温度[℃]", "PTCEntTemp", "程序", "VW15056", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
- TagManger.AddTag(new Tag("PTC出水温度", "PTC出水温度[℃]", "PTCExpTemp", "程序", "VW15058", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true });
+ TagManger.AddTag(new Tag("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("润滑油流量", "润滑油流量[L/min]", "LubeFlow", "程序", "VW15040", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("排气温度", "排气温度[℃]", "ExTemp", "程序", "VW15042", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("膨胀阀前压力", "膨胀阀前压力[BarA]", "TxvFrPress", "程序", "VW15044", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("膨胀阀前温度", "膨胀阀前温度[℃]", "TxvFrTemp", "程序", "VW15046", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("EVAP出口压力", "EVAP出口压力[BarA]", "EVAPExpPress", "程序", "VW15048", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("腔内压力", "腔内压力[BarA]", "IntrplPress", "程序", "VW15050", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("压缩机表面温度", "压缩机表面温度[℃]", "CapSurfTemp", "程序", "VW15052", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("PTC流量", "PTC流量[L/min]", "PTCFlow", "程序", "VW15054", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("PTC入水温度", "PTC入水温度[℃]", "PTCEntTemp", "程序", "VW15056", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
+ TagManger.AddTag(new Tag("PTC出水温度", "PTC出水温度[℃]", "PTCExpTemp", "程序", "VW15058", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true, SVAddress = "VW5", Pid_PAddress = "VW0", Pid_IAddress = "VW1", Pid_DAddress = "VW2", Limit_UpAddress = "VW3", Limit_DownAddress = "VW4" });
TagManger.AddTag(new Tag("通讯Cmp母线电流", "通讯Cmp母线电流[A]", "ComCapBusCur", "程序", "VW15060", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = false });
TagManger.AddTag(new Tag("通讯Cmp母线电压", "通讯Cmp母线电压[V]", "ComCapBusVol", "程序", "VW15062", 100, 0, 10, "V", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false });
TagManger.AddTag(new Tag("通讯Cmp逆变器温度", "通讯Cmp逆变器温度[℃]", "ComCapInvTemp", "程序", "VW15064", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0, IsMeter = false });
@@ -1024,6 +1029,18 @@ namespace CapMachine.Wpf.Services
return false;
}
+ ///
+ /// 程序继续
+ /// 取反
+ ///
+ ///
+ public bool SysContinue()
+ {
+ return true;
+
+ }
+
+
#endregion
@@ -1140,7 +1157,7 @@ namespace CapMachine.Wpf.Services
while (ThreadEnable)
{
-
+
//await Task.CompletedTask;
DiagnosticsTime.Reset();
@@ -1589,6 +1606,115 @@ namespace CapMachine.Wpf.Services
{
////第一次计时
//stopwatch.Start(); //启动Stopwatch
+ switch (ProRunChannelData.RunStepType)
+ {
+ case RunStepType.Step:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Sv
+ var SvResult = SiemensDrive.Write(CurMeterInfo!.SvAddress, (short)ProRunChannelData.SV!);
+ if (!SvResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:SV写入失败");
+ //Pid
+ var Pid_PResult = SiemensDrive.Write(CurMeterInfo.Pid_PAddress, (short)ProRunChannelData.CurLoadPID!.P);
+ if (!Pid_PResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-P写入失败");
+ var Pid_IResult = SiemensDrive.Write(CurMeterInfo.Pid_IAddress, (short)ProRunChannelData.CurLoadPID!.I);
+ if (!Pid_IResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-I写入失败");
+ var Pid_DResult = SiemensDrive.Write(CurMeterInfo.Pid_DAddress, (short)ProRunChannelData.CurLoadPID!.D);
+ if (!Pid_DResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-D写入失败");
+ //Limit
+ var Limit_UpResult = SiemensDrive.Write(CurMeterInfo.Limit_UpAddress, (short)ProRunChannelData.CurLoadLimit!.Up);
+ if (!Limit_UpResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Up写入失败");
+ var Limit_DownResult = SiemensDrive.Write(CurMeterInfo.Limit_DownAddress, (short)ProRunChannelData.CurLoadLimit!.Down);
+ if (!Limit_DownResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Down写入失败");
+ }
+ break;
+ case RunStepType.StepPID:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Sv
+ var SvResult = SiemensDrive.Write(CurMeterInfo!.SvAddress, (short)ProRunChannelData.SV!);
+ if (!SvResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:SV写入失败");
+ //Pid
+ var Pid_PResult = SiemensDrive.Write(CurMeterInfo.Pid_PAddress, (short)ProRunChannelData.CurLoadPID!.P);
+ if (!Pid_PResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-P写入失败");
+ var Pid_IResult = SiemensDrive.Write(CurMeterInfo.Pid_IAddress, (short)ProRunChannelData.CurLoadPID!.I);
+ if (!Pid_IResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-I写入失败");
+ var Pid_DResult = SiemensDrive.Write(CurMeterInfo.Pid_DAddress, (short)ProRunChannelData.CurLoadPID!.D);
+ if (!Pid_DResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-D写入失败");
+ }
+ break;
+ case RunStepType.StepLimit:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Sv
+ var SvResult = SiemensDrive.Write(CurMeterInfo!.SvAddress, (short)ProRunChannelData.SV!);
+ if (!SvResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:SV写入失败");
+ //Limit
+ var Limit_UpResult = SiemensDrive.Write(CurMeterInfo.Limit_UpAddress, (short)ProRunChannelData.CurLoadLimit!.Up);
+ if (!Limit_UpResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Up写入失败");
+ var Limit_DownResult = SiemensDrive.Write(CurMeterInfo.Limit_DownAddress, (short)ProRunChannelData.CurLoadLimit!.Down);
+ if (!Limit_DownResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Down写入失败");
+ }
+ break;
+ case RunStepType.StepSV:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Sv
+ var SvResult = SiemensDrive.Write(CurMeterInfo!.SvAddress, (short)ProRunChannelData.SV!);
+ if (!SvResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:SV写入失败");
+ }
+ break;
+ case RunStepType.LimitPid:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Pid
+ var Pid_PResult = SiemensDrive.Write(CurMeterInfo.Pid_PAddress, (short)ProRunChannelData.CurLoadPID!.P);
+ if (!Pid_PResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-P写入失败");
+ var Pid_IResult = SiemensDrive.Write(CurMeterInfo.Pid_IAddress, (short)ProRunChannelData.CurLoadPID!.I);
+ if (!Pid_IResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-I写入失败");
+ var Pid_DResult = SiemensDrive.Write(CurMeterInfo.Pid_DAddress, (short)ProRunChannelData.CurLoadPID!.D);
+ if (!Pid_DResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-D写入失败");
+ //Limit
+ var Limit_UpResult = SiemensDrive.Write(CurMeterInfo.Limit_UpAddress, (short)ProRunChannelData.CurLoadLimit!.Up);
+ if (!Limit_UpResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Up写入失败");
+ var Limit_DownResult = SiemensDrive.Write(CurMeterInfo.Limit_DownAddress, (short)ProRunChannelData.CurLoadLimit!.Down);
+ if (!Limit_DownResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Down写入失败");
+ }
+ break;
+ case RunStepType.Pid:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Pid
+ var Pid_PResult = SiemensDrive.Write(CurMeterInfo.Pid_PAddress, (short)ProRunChannelData.CurLoadPID!.P);
+ if (!Pid_PResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-P写入失败");
+ var Pid_IResult = SiemensDrive.Write(CurMeterInfo.Pid_IAddress, (short)ProRunChannelData.CurLoadPID!.I);
+ if (!Pid_IResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-I写入失败");
+ var Pid_DResult = SiemensDrive.Write(CurMeterInfo.Pid_DAddress, (short)ProRunChannelData.CurLoadPID!.D);
+ if (!Pid_DResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:PID-D写入失败");
+ }
+ break;
+ case RunStepType.Limit:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Limit
+ var Limit_UpResult = SiemensDrive.Write(CurMeterInfo.Limit_UpAddress, (short)ProRunChannelData.CurLoadLimit!.Up);
+ if (!Limit_UpResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Up写入失败");
+ var Limit_DownResult = SiemensDrive.Write(CurMeterInfo.Limit_DownAddress, (short)ProRunChannelData.CurLoadLimit!.Down);
+ if (!Limit_DownResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:Limit_Down写入失败");
+ }
+ break;
+ case RunStepType.SlopCell:
+ {
+ var CurMeterInfo = ListPlcLoadConfigCell.FirstOrDefault(a => a.Name!.Contains(ProRunChannelData.MeterName!));
+ //Sv
+ var SvResult = SiemensDrive.Write(CurMeterInfo!.SvAddress, (short)ProRunChannelData.SV!);
+ if (!SvResult.IsSuccess) Console.WriteLine($"{ProRunChannelData.MeterName}:SV写入失败");
+ }
+ break;
+ default:
+ break;
+ }
+
if (ProRunChannelData.RunStepType == RunStepType.SlopCell)
{
SiemensDrive.Write("D1", (short)ProRunChannelData.SV);
@@ -1612,7 +1738,7 @@ namespace CapMachine.Wpf.Services
}
- Thread.Sleep(50);
+ //Thread.Sleep(50);
//DownLoadPID();
//stopwatch.Stop(); //停止Stopwatch
//Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString());
diff --git a/CapMachine.Wpf/Services/ProRuntimeService.cs b/CapMachine.Wpf/Services/ProRuntimeService.cs
index a32334e..6e799be 100644
--- a/CapMachine.Wpf/Services/ProRuntimeService.cs
+++ b/CapMachine.Wpf/Services/ProRuntimeService.cs
@@ -25,6 +25,7 @@ using Masuit.Tools.Hardware;
using CapMachine.Model.MeterConfig;
using Masuit.Tools;
using System.Timers;
+using Prism.Events;
namespace CapMachine.Wpf.Services
{
@@ -37,11 +38,13 @@ namespace CapMachine.Wpf.Services
///
/// 实例化函数
///
- public ProRuntimeService(IFreeSql freeSql, IMapper mapper, MachineRtDataService machineRtDataService, ILogService logService)
+ public ProRuntimeService(IFreeSql freeSql, IMapper mapper, IEventAggregator eventAggregator, MachineRtDataService machineRtDataService, ILogService logService)
{
FreeSql = freeSql;
Mapper = mapper;
+ EventAggregator = eventAggregator;
MachineRtDataService = machineRtDataService;
+
ProRunChannel = MachineRtDataService.ProRunChannel;
LogService = logService;
@@ -49,9 +52,9 @@ namespace CapMachine.Wpf.Services
ListProExModel = new List()
{
new ProExModel(ProRunChannel){
- MeterName="速度",
+ MeterName="转速",
ListProStepExe=new List(),
-
+ IsSpeed=true,
},
new ProExModel(ProRunChannel){
MeterName="COND1温度",
@@ -145,6 +148,9 @@ namespace CapMachine.Wpf.Services
}
};
+ //SpeedRunEndEvent
+ ListProExModel.FindFirst(a => a.MeterName.Contains("转速")).SpeedRunEndEvent += ProRuntimeService_SpeedRunEndEvent;
+
//从变量集合中加载PLC转制的配置数据
ListPlcLoadConfigCell = new List();
foreach (var itemKeyValue in MachineRtDataService.TagManger.DicTags)
@@ -155,11 +161,19 @@ namespace CapMachine.Wpf.Services
ListPlcLoadConfigCell.Add(new PlcLoadConfigCell()
{
Name = itemKeyValue.Key,
- Address = itemKeyValue.Value.SVAddress,
+ SvAddress = itemKeyValue.Value.SVAddress,
+ Limit_UpAddress = itemKeyValue.Value.Limit_UpAddress,
+ Limit_DownAddress = itemKeyValue.Value.Limit_DownAddress,
+ Pid_PAddress = itemKeyValue.Value.Pid_PAddress,
+ Pid_IAddress = itemKeyValue.Value.Pid_IAddress,
+ Pid_DAddress = itemKeyValue.Value.Pid_DAddress,
Precision = itemKeyValue.Value.Precision,
});
}
}
+ //反写给MachineRtDataService,MachineRtDataService也要写到PLC中
+ MachineRtDataService.ListPlcLoadConfigCell = ListPlcLoadConfigCell;
+
//驱动实例
SiemensDrive = MachineRtDataService.SiemensDrive;
@@ -170,15 +184,15 @@ namespace CapMachine.Wpf.Services
}
-
-
///
/// 选中的程序运行集合
///
public List SelectedListProSegRun { get; set; }
public IFreeSql FreeSql { get; }
public IMapper Mapper { get; }
+ public IEventAggregator EventAggregator { get; }
public MachineRtDataService MachineRtDataService { get; }
+
public ILogService LogService { get; }
///
@@ -264,9 +278,9 @@ namespace CapMachine.Wpf.Services
//统计当前步骤itemStep的速度所有时间,供后面的其他参数使用,因为其他的参数也是牟定当前步骤速度是总时间,在这个步骤中,所有的参数的总时间是一样的
var SpeedStepTotaolTime = 0;
- //********* 单个【速度】步骤信息的解析 *********
+ //********* 单个【转速】步骤信息的解析 *********
{
- var CurMeterName = "速度";
+ var CurMeterName = "转速";
if (itemStep.MeterSpeeds != null && itemStep.MeterSpeeds.Any())
{
switch (itemStep.MeterSpeeds.FirstOrDefault()!.ValueType)
@@ -540,6 +554,2539 @@ namespace CapMachine.Wpf.Services
}
+ //********* 单个【COND1温度】步骤信息的解析 *********
+ {
+ var CurMeterName = "COND1温度";
+ if (itemStep.MeterCond1Temps != null && itemStep.MeterCond1Temps.Any())
+ {
+ switch (itemStep.MeterCond1Temps.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterCond1Temps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterCond1Temps.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterCond1Temps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【COND2温度】步骤信息的解析 *********
+ {
+ var CurMeterName = "COND2温度";
+ if (itemStep.MeterCond2Temps != null && itemStep.MeterCond2Temps.Any())
+ {
+ switch (itemStep.MeterCond2Temps.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterCond2Temps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterCond2Temps.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterCond2Temps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【COND2压力】步骤信息的解析 *********
+ {
+ var CurMeterName = "COND2压力";
+ if (itemStep.MeterCond2Presss != null && itemStep.MeterCond2Presss.Any())
+ {
+ switch (itemStep.MeterCond2Presss.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterCond2Presss)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterCond2Presss.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterCond2Presss)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【EVAP出口温度】步骤信息的解析 *********
+ {
+ var CurMeterName = "EVAP出口温度";
+ if (itemStep.MeterEVAPExpTemps != null && itemStep.MeterEVAPExpTemps.Any())
+ {
+ switch (itemStep.MeterEVAPExpTemps.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterEVAPExpTemps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterEVAPExpTemps.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterEVAPExpTemps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【HV电压】步骤信息的解析 *********
+ {
+ var CurMeterName = "HV电压";
+ if (itemStep.MeterHVVols != null && itemStep.MeterHVVols.Any())
+ {
+ switch (itemStep.MeterHVVols.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterHVVols)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterHVVols.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterHVVols)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【吸气压力】步骤信息的解析 *********
+ {
+ var CurMeterName = "吸气压力";
+ if (itemStep.MeterInhPresss != null && itemStep.MeterInhPresss.Any())
+ {
+ switch (itemStep.MeterInhPresss.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterInhPresss)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterInhPresss.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterInhPresss)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【吸气温度】步骤信息的解析 *********
+ {
+ var CurMeterName = "吸气温度";
+ if (itemStep.MeterInhTemps != null && itemStep.MeterInhTemps.Any())
+ {
+ switch (itemStep.MeterInhTemps.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterInhTemps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterInhTemps.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterInhTemps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【润滑油压力】步骤信息的解析 *********
+ {
+ var CurMeterName = "润滑油压力";
+ if (itemStep.MeterLubePresss != null && itemStep.MeterLubePresss.Any())
+ {
+ switch (itemStep.MeterLubePresss.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterLubePresss)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterLubePresss.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterLubePresss)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【LV电压】步骤信息的解析 *********
+ {
+ var CurMeterName = "LV电压";
+ if (itemStep.MeterLVVols != null && itemStep.MeterLVVols.Any())
+ {
+ switch (itemStep.MeterLVVols.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterLVVols)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterLVVols.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterLVVols)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+ //********* 单个【OCR】步骤信息的解析 *********
+ {
+ var CurMeterName = "OCR";
+ if (itemStep.MeterOCRs != null && itemStep.MeterOCRs.Any())
+ {
+ switch (itemStep.MeterOCRs.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterOCRs)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+ MeterName = CurMeterName,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ });
+ }
+ break;
+ case ConfigValueType.Slope:
+ //带斜率
+ //根据循环次数确定
+ var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterOCRs.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList());
+ for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++)
+ {
+ //根据循环次数执行
+ foreach (var itemMeterValueCell in itemStep.MeterOCRs)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First();
+ }
+ var Limit = new ConfigLimit();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any())
+ {
+ Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First();
+ }
+ var Alarm = new ConfigAlarm();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any())
+ {
+ Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First();
+ }
+
+ ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe()
+ {
+ //程序块
+ ProSegName = CurProgramSeg.Name,
+ ProSegStep = SegIndex,
+ ProSegRepeat = CurProgramSeg.ProRepeat,
+ ProSegIsExeing = false,//配置阶段默认不执行 false
+
+ //程序步骤数据
+ //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1),
+ StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName),
+ EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName),
+ KeepTime = itemMeterValueCell.KeepTime,
+ MeterStepIsExeing = false,//配置阶段默认不执行 false
+ MeterStepIsOK = false,//配置阶段默认不完成 false
+ ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率
+
+ MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1,
+
+ LimitNo = itemMeterValueCell.LimitNo,
+ AlarmNo = itemMeterValueCell.AlarmNo,
+ PIDNo = itemMeterValueCell.PIDNo,
+
+ CurConfigPIDDto = Mapper.Map(Pid),
+ CurConfigLimitDto = Mapper.Map(Limit),
+ CurConfigAlarmDto = Mapper.Map(Alarm),
+
+ ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
+ MeterName = CurMeterName,
+ });
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ 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} - 未找到步骤信息。步骤为空");
+ }
+
+ }
+
+
+ //********* 单个【OS1温度】步骤信息的解析 *********
+ {
+ var CurMeterName = "OS1温度";
+ if (itemStep.MeterOS1Temps != null && itemStep.MeterOS1Temps.Any())
+ {
+ switch (itemStep.MeterOS1Temps.FirstOrDefault()!.ValueType)
+ {
+ case ConfigValueType.Constant: //常值
+ //常值的话就一个数据,循环执行一次
+ foreach (var itemMeterValueCell in itemStep.MeterOS1Temps)
+ {
+ var Pid = new ConfigPID();
+ if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any())
+ {
+ Pid = FreeSql.Select