配置参数下载和解析的开发-未完成
This commit is contained in:
@@ -8,4 +8,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FreeSql" Version="3.5.102" />
|
<PackageReference Include="FreeSql" Version="3.5.102" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="ProExecuteModel\" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
38
CapMachine.Model/ConfigAlarm.cs
Normal file
38
CapMachine.Model/ConfigAlarm.cs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
using FreeSql.DataAnnotations;
|
||||||
|
|
||||||
|
namespace CapMachine.Model
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 报警配置
|
||||||
|
/// </summary>
|
||||||
|
[Table(Name = "ConfigAlarm")]
|
||||||
|
public class ConfigAlarm
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 主键
|
||||||
|
/// </summary>
|
||||||
|
[Column(IsPrimary = true, IsIdentity = true)]
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 序号
|
||||||
|
/// </summary>
|
||||||
|
[Column(Name = "IndexNo", IsNullable = false)]
|
||||||
|
public int IndexNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 快速设置仪表名称
|
||||||
|
/// </summary>
|
||||||
|
[Column(Name = "MeterName", IsNullable = true, StringLength = 30)]
|
||||||
|
public string MeterName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Alarm
|
||||||
|
/// </summary>
|
||||||
|
[Column(Name = "Alarm", IsNullable = true)]
|
||||||
|
public double Alarm { get; set; }
|
||||||
|
|
||||||
|
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false)]
|
||||||
|
public DateTime CreateTime { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,159 +7,159 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace CapMachine.Model
|
namespace CapMachine.Model
|
||||||
{
|
{
|
||||||
/// <summary>
|
///// <summary>
|
||||||
/// 程序段具体步骤执行信息
|
///// 程序段具体步骤执行信息
|
||||||
/// </summary>
|
///// </summary>
|
||||||
[Table(Name = "ProStepExecute")]
|
//[Table(Name = "ProStepExecute")]
|
||||||
public class ProStepExecute
|
//public class ProStepExecute
|
||||||
{
|
//{
|
||||||
/// <summary>
|
// /// <summary>
|
||||||
/// 主键
|
// /// 主键
|
||||||
/// </summary>
|
// /// </summary>
|
||||||
[Column(IsPrimary = true)]
|
// [Column(IsPrimary = true)]
|
||||||
public Guid Id { get; set; }
|
// public Guid Id { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 程序段名称
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "ProName", IsNullable = false, StringLength = 20)]
|
|
||||||
public string ProName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 程序段步骤
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "ProStep", IsNullable = false)]
|
|
||||||
public int ProStep { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 程序段反复
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "ProRepeat")]
|
|
||||||
public int ProRepeat { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否正在执行当前程序段
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "IsCurrentProStep")]
|
|
||||||
public bool IsCurrentProStep { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////程序步骤///////////////////////////////
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否正在执行当前程序段
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "IsCurrentMeterStep")]
|
|
||||||
public bool IsCurrentMeterStep { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 仪表功能名称
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "MeterName", IsNullable = false, StringLength = 20)]
|
|
||||||
public string MeterName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 步骤
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "MeterStep", IsNullable = false)]
|
|
||||||
public int MeterStep { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 速度 DegC
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "SV", IsNullable = true)]
|
|
||||||
public int SV { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 时间-分钟
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "TimeMin", IsNullable = true)]
|
|
||||||
public int TimeMin { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 时间-秒
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "TimeSec", IsNullable = true)]
|
|
||||||
public int TimeSec { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// PID NO
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "PIDNo", IsNullable = true)]
|
|
||||||
public int PIDNo { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Limit NO
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "LitmitNo", IsNullable = true)]
|
|
||||||
public int LitmitNo { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Alarm NO
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "AlarmNo", IsNullable = true)]
|
|
||||||
public int AlarmNo { get; set; }
|
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 时间信号
|
// /// 程序段名称
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "TimeSign1", IsNullable = true)]
|
// [Column(Name = "ProName", IsNullable = false, StringLength = 20)]
|
||||||
//public int TimeSign1 { get; set; }
|
// public string ProName { get; set; }
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 时间信号
|
// /// 程序段步骤
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "TimeSign2", IsNullable = true)]
|
// [Column(Name = "ProStep", IsNullable = false)]
|
||||||
//public int TimeSign2 { get; set; }
|
// public int ProStep { get; set; }
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 时间信号
|
// /// 程序段反复
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "TimeSign3", IsNullable = true)]
|
// [Column(Name = "ProRepeat")]
|
||||||
//public int TimeSign3 { get; set; }
|
// public int ProRepeat { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 步进重复
|
|
||||||
/// </summary>
|
|
||||||
[Column(Name = "Repeat", IsNullable = true)]
|
|
||||||
public int StepRepeat { get; set; }
|
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 拓展字段1
|
// /// 是否正在执行当前程序段
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "FeildExte1", IsNullable = true)]
|
// [Column(Name = "IsCurrentProStep")]
|
||||||
//public string FeildExte1 { get; set; }
|
// public bool IsCurrentProStep { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
// /////////////////////////////////////////////////////////////////
|
||||||
|
// ////////////////////////程序步骤///////////////////////////////
|
||||||
|
// ////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 拓展字段1
|
// /// 是否正在执行当前程序段
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "FeildExte2", IsNullable = true)]
|
// [Column(Name = "IsCurrentMeterStep")]
|
||||||
//public string FeildExte2 { get; set; }
|
// public bool IsCurrentMeterStep { get; set; }
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 拓展字段1
|
// /// 仪表功能名称
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "FeildExte3", IsNullable = true)]
|
// [Column(Name = "MeterName", IsNullable = false, StringLength = 20)]
|
||||||
//public string FeildExte3 { get; set; }
|
// public string MeterName { get; set; }
|
||||||
|
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 拓展字段1
|
// /// 步骤
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "FeildExte4", IsNullable = true)]
|
// [Column(Name = "MeterStep", IsNullable = false)]
|
||||||
//public string FeildExte4 { get; set; }
|
// public int MeterStep { get; set; }
|
||||||
|
|
||||||
// /// <summary>
|
// /// <summary>
|
||||||
///// 拓展字段1
|
// /// 速度 DegC
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
//[Column(Name = "FeildExte5", IsNullable = true)]
|
// [Column(Name = "SV", IsNullable = true)]
|
||||||
//public string FeildExte5 { get; set; }
|
// public int SV { get; set; }
|
||||||
|
|
||||||
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false)]
|
// /// <summary>
|
||||||
public DateTime CreateTime { get; set; }
|
// /// 时间-分钟
|
||||||
|
// /// </summary>
|
||||||
|
// [Column(Name = "TimeMin", IsNullable = true)]
|
||||||
|
// public int TimeMin { get; set; }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// /// 时间-秒
|
||||||
|
// /// </summary>
|
||||||
|
// [Column(Name = "TimeSec", IsNullable = true)]
|
||||||
|
// public int TimeSec { get; set; }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// /// PID NO
|
||||||
|
// /// </summary>
|
||||||
|
// [Column(Name = "PIDNo", IsNullable = true)]
|
||||||
|
// public int PIDNo { get; set; }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// /// Limit NO
|
||||||
|
// /// </summary>
|
||||||
|
// [Column(Name = "LitmitNo", IsNullable = true)]
|
||||||
|
// public int LitmitNo { get; set; }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// /// Alarm NO
|
||||||
|
// /// </summary>
|
||||||
|
// [Column(Name = "AlarmNo", IsNullable = true)]
|
||||||
|
// public int AlarmNo { get; set; }
|
||||||
|
|
||||||
|
// ///// <summary>
|
||||||
|
// ///// 时间信号
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "TimeSign1", IsNullable = true)]
|
||||||
|
// //public int TimeSign1 { get; set; }
|
||||||
|
|
||||||
|
// ///// <summary>
|
||||||
|
// ///// 时间信号
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "TimeSign2", IsNullable = true)]
|
||||||
|
// //public int TimeSign2 { get; set; }
|
||||||
|
|
||||||
|
// ///// <summary>
|
||||||
|
// ///// 时间信号
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "TimeSign3", IsNullable = true)]
|
||||||
|
// //public int TimeSign3 { get; set; }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// /// 步进重复
|
||||||
|
// /// </summary>
|
||||||
|
// [Column(Name = "Repeat", IsNullable = true)]
|
||||||
|
// public int StepRepeat { get; set; }
|
||||||
|
|
||||||
|
// ///// <summary>
|
||||||
|
// ///// 拓展字段1
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "FeildExte1", IsNullable = true)]
|
||||||
|
// //public string FeildExte1 { get; set; }
|
||||||
|
|
||||||
|
// ///// <summary>
|
||||||
|
// ///// 拓展字段1
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "FeildExte2", IsNullable = true)]
|
||||||
|
// //public string FeildExte2 { get; set; }
|
||||||
|
|
||||||
|
// ///// <summary>
|
||||||
|
// ///// 拓展字段1
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "FeildExte3", IsNullable = true)]
|
||||||
|
// //public string FeildExte3 { get; set; }
|
||||||
|
|
||||||
|
|
||||||
}
|
// ///// <summary>
|
||||||
|
// ///// 拓展字段1
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "FeildExte4", IsNullable = true)]
|
||||||
|
// //public string FeildExte4 { get; set; }
|
||||||
|
|
||||||
|
// ///// <summary>
|
||||||
|
// ///// 拓展字段1
|
||||||
|
// ///// </summary>
|
||||||
|
// //[Column(Name = "FeildExte5", IsNullable = true)]
|
||||||
|
// //public string FeildExte5 { get; set; }
|
||||||
|
|
||||||
|
// [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)]
|
||||||
|
// public DateTime CreateTime { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,9 @@ namespace CapMachine.Wpf
|
|||||||
{
|
{
|
||||||
////注册日志服务
|
////注册日志服务
|
||||||
containerRegistry.RegisterSingleton<ILogService, LogService>();
|
containerRegistry.RegisterSingleton<ILogService, LogService>();
|
||||||
|
//注册AutoMapper 将IAutoMapperProvider注入IOC容器,并对外提供IMapper注入类型。
|
||||||
|
containerRegistry.RegisterSingleton<IMapperProvider, MapperConfig>();
|
||||||
|
containerRegistry.Register(typeof(IMapper), GetMapper);
|
||||||
|
|
||||||
//注册基础的服务
|
//注册基础的服务
|
||||||
//containerRegistry.RegisterSingleton<IHostDialogService, DialogHostService>();
|
//containerRegistry.RegisterSingleton<IHostDialogService, DialogHostService>();
|
||||||
@@ -113,9 +116,7 @@ namespace CapMachine.Wpf
|
|||||||
|
|
||||||
containerRegistry.RegisterSingleton<ComActionService>();
|
containerRegistry.RegisterSingleton<ComActionService>();
|
||||||
|
|
||||||
//注册AutoMapper 将IAutoMapperProvider注入IOC容器,并对外提供IMapper注入类型。
|
containerRegistry.RegisterSingleton<ProRuntimeService>();
|
||||||
containerRegistry.RegisterSingleton<IMapperProvider, MapperConfig>();
|
|
||||||
containerRegistry.Register(typeof(IMapper), GetMapper);
|
|
||||||
|
|
||||||
string strsqllite = System.AppDomain.CurrentDomain.BaseDirectory + @"Db\CapMachine.db";
|
string strsqllite = System.AppDomain.CurrentDomain.BaseDirectory + @"Db\CapMachine.db";
|
||||||
string strslocaldb = System.AppDomain.CurrentDomain.BaseDirectory + @"Db\CapMachineDb";
|
string strslocaldb = System.AppDomain.CurrentDomain.BaseDirectory + @"Db\CapMachineDb";
|
||||||
@@ -256,6 +257,7 @@ namespace CapMachine.Wpf
|
|||||||
var appVersionService10 = ContainerLocator.Container.Resolve<HighSpeedDataService>();
|
var appVersionService10 = ContainerLocator.Container.Resolve<HighSpeedDataService>();
|
||||||
//var appVersionService11 = ContainerLocator.Container.Resolve<PPCService>();
|
//var appVersionService11 = ContainerLocator.Container.Resolve<PPCService>();
|
||||||
var appVersionService15 = ContainerLocator.Container.Resolve<ComActionService>();
|
var appVersionService15 = ContainerLocator.Container.Resolve<ComActionService>();
|
||||||
|
var appVersionService16 = ContainerLocator.Container.Resolve<ProRuntimeService>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -715,8 +715,6 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Models\ProModelPars\" />
|
|
||||||
<Folder Include="Tool\" />
|
|
||||||
<Folder Include="LocalDll\" />
|
<Folder Include="LocalDll\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
57
CapMachine.Wpf/ChannelModel/ProRunChannelData.cs
Normal file
57
CapMachine.Wpf/ChannelModel/ProRunChannelData.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using CapMachine.Wpf.Dtos;
|
||||||
|
using CapMachine.Wpf.Models.ProModelPars;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.ChannelModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 程序运行管道数据
|
||||||
|
/// </summary>
|
||||||
|
public class ProRunChannelData
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 参数名称
|
||||||
|
/// </summary>
|
||||||
|
public string? MeterName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序Seg
|
||||||
|
/// </summary>
|
||||||
|
public string? ProSegName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序步骤
|
||||||
|
/// </summary>
|
||||||
|
public int MeterStep { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 斜坡打点步骤
|
||||||
|
/// </summary>
|
||||||
|
public int SlopStepNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 值类型
|
||||||
|
/// </summary>
|
||||||
|
public RunStepType RunStepType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 值
|
||||||
|
/// </summary>
|
||||||
|
public int? SV { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PID的配置信息
|
||||||
|
/// </summary>
|
||||||
|
public PID? CurLoadPID { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Alarm的配置信息
|
||||||
|
/// </summary>
|
||||||
|
public Limit? CurLoadLimit { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
43
CapMachine.Wpf/Dtos/ConfigAlarmDto.cs
Normal file
43
CapMachine.Wpf/Dtos/ConfigAlarmDto.cs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
using Prism.Mvvm;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Dtos
|
||||||
|
{
|
||||||
|
public class ConfigAlarmDto : BindableBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 主键
|
||||||
|
/// </summary>
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
private string? _MeterName;
|
||||||
|
/// <summary>
|
||||||
|
/// 仪表名称
|
||||||
|
/// </summary>
|
||||||
|
public string? MeterName
|
||||||
|
{
|
||||||
|
get { return _MeterName; }
|
||||||
|
set { _MeterName = value; RaisePropertyChanged(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
private int _IndexNo;
|
||||||
|
/// <summary>
|
||||||
|
/// 序号
|
||||||
|
/// </summary>
|
||||||
|
public int IndexNo
|
||||||
|
{
|
||||||
|
get { return _IndexNo; }
|
||||||
|
set { _IndexNo = value; RaisePropertyChanged(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
private double _Alarm;
|
||||||
|
/// <summary>
|
||||||
|
/// Alarm
|
||||||
|
/// </summary>
|
||||||
|
public double Alarm
|
||||||
|
{
|
||||||
|
get { return _Alarm; }
|
||||||
|
set { _Alarm = value; RaisePropertyChanged(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using CapMachine.Model;
|
using CapMachine.Model;
|
||||||
|
using CapMachine.Wpf.Models.ProModelPars;
|
||||||
using HslCommunication;
|
using HslCommunication;
|
||||||
using Prism.Mvvm;
|
using Prism.Mvvm;
|
||||||
|
|
||||||
@@ -17,12 +18,12 @@ namespace CapMachine.Wpf.Models
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public MeterRtDataModel()
|
public MeterRtDataModel()
|
||||||
{
|
{
|
||||||
ListProStepExecuteInfo = new List<ProStepExecute>();
|
ListProStepExecuteInfo = new List<ProStepExe>();
|
||||||
ListQuickProStepExecuteInfo = new List<QuickProStepExecute>();
|
ListQuickProStepExecuteInfo = new List<QuickProStepExecute>();
|
||||||
QuickRunTimeInfo = new QuickRunTime();
|
QuickRunTimeInfo = new QuickRunTime();
|
||||||
QuickNextMeterStep = new QuickProStepExecute();
|
QuickNextMeterStep = new QuickProStepExecute();
|
||||||
RunTimeInfo = new MeterRunTime();
|
RunTimeInfo = new MeterRunTime();
|
||||||
NextMeterStep = new ProStepExecute();
|
NextMeterStep = new ProStepExe();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +253,7 @@ namespace CapMachine.Wpf.Models
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 程序段和程序步骤执行具体方法
|
/// 程序段和程序步骤执行具体方法
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<ProStepExecute> ListProStepExecuteInfo { get; set; }
|
public List<ProStepExe> ListProStepExecuteInfo { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 快速设置程序段和程序步骤执行具体方法
|
/// 快速设置程序段和程序步骤执行具体方法
|
||||||
@@ -277,7 +278,7 @@ namespace CapMachine.Wpf.Models
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 仪表下一步具体程序步骤
|
/// 仪表下一步具体程序步骤
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ProStepExecute NextMeterStep { get; set; }
|
public ProStepExe NextMeterStep { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Quick仪表下一步具体程序步骤
|
/// Quick仪表下一步具体程序步骤
|
||||||
|
|||||||
30
CapMachine.Wpf/Models/PlcLoadConfigCell.cs
Normal file
30
CapMachine.Wpf/Models/PlcLoadConfigCell.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// PLC加载配置单元
|
||||||
|
/// 下载PLC数据,用整型的数据下载,但是我们这边可能是浮点数,需要格式的转换,精度的转换
|
||||||
|
/// </summary>
|
||||||
|
public class PlcLoadConfigCell
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 配置字段 名称
|
||||||
|
/// </summary>
|
||||||
|
public string? Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 地址
|
||||||
|
/// </summary>
|
||||||
|
public string? Address { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 精度 1,10,100,1000
|
||||||
|
/// </summary>
|
||||||
|
public int Precision { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
13
CapMachine.Wpf/Models/ProModelPars/Alarm.cs
Normal file
13
CapMachine.Wpf/Models/ProModelPars/Alarm.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
public class Alarm
|
||||||
|
{
|
||||||
|
public double AlarmValue { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
26
CapMachine.Wpf/Models/ProModelPars/Limit.cs
Normal file
26
CapMachine.Wpf/Models/ProModelPars/Limit.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 下载时用的Limit
|
||||||
|
/// 进制和精度也需要处理好
|
||||||
|
/// </summary>
|
||||||
|
public class Limit
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Limit-Up
|
||||||
|
/// </summary>
|
||||||
|
public short Up { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Limit-Down
|
||||||
|
/// </summary>
|
||||||
|
public short Down { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
32
CapMachine.Wpf/Models/ProModelPars/PID.cs
Normal file
32
CapMachine.Wpf/Models/ProModelPars/PID.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 下载时用的PID
|
||||||
|
/// 进制也需要处理好
|
||||||
|
/// </summary>
|
||||||
|
public class PID
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// PID-P
|
||||||
|
/// </summary>
|
||||||
|
public short P { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PID-I
|
||||||
|
/// </summary>
|
||||||
|
public short I { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PID-D
|
||||||
|
/// </summary>
|
||||||
|
public short D { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
39
CapMachine.Wpf/Models/ProModelPars/ParsConfigLimitDto.cs
Normal file
39
CapMachine.Wpf/Models/ProModelPars/ParsConfigLimitDto.cs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 配置限制Dto
|
||||||
|
/// </summary>
|
||||||
|
public class ParsConfigLimitDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 主键
|
||||||
|
/// </summary>
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置仪表名称
|
||||||
|
/// </summary>
|
||||||
|
public string? MeterName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 序号
|
||||||
|
/// </summary>
|
||||||
|
public int IndexNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上限
|
||||||
|
/// </summary>
|
||||||
|
public decimal Up { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下限
|
||||||
|
/// </summary>
|
||||||
|
public decimal Down { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
44
CapMachine.Wpf/Models/ProModelPars/ParsConfigPIDDto.cs
Normal file
44
CapMachine.Wpf/Models/ProModelPars/ParsConfigPIDDto.cs
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// PID 配置模型Dto
|
||||||
|
/// </summary>
|
||||||
|
public class ParsConfigPIDDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 主键
|
||||||
|
/// </summary>
|
||||||
|
public long Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置仪表名称
|
||||||
|
/// </summary>
|
||||||
|
public string? MeterName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 序号
|
||||||
|
/// </summary>
|
||||||
|
public int IndexNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// P
|
||||||
|
/// </summary>
|
||||||
|
public decimal P { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// I
|
||||||
|
/// </summary>
|
||||||
|
public int I { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// D
|
||||||
|
/// </summary>
|
||||||
|
public int D { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
401
CapMachine.Wpf/Models/ProModelPars/ProExModel.cs
Normal file
401
CapMachine.Wpf/Models/ProModelPars/ProExModel.cs
Normal file
@@ -0,0 +1,401 @@
|
|||||||
|
using CapMachine.Wpf.ChannelModel;
|
||||||
|
using CapMachine.Wpf.Services;
|
||||||
|
using ImTools;
|
||||||
|
using Masuit.Tools;
|
||||||
|
using Masuit.Tools.Hardware;
|
||||||
|
using Prism.Mvvm;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Channels;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Timers;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 程序执行模型
|
||||||
|
/// 包括程序名称和程序步骤集合、程序执行信息
|
||||||
|
/// 一个参数(速度、排气压力)对应一个程序执行模型
|
||||||
|
/// </summary>
|
||||||
|
public class ProExModel : BindableBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 实例化函数
|
||||||
|
/// </summary>
|
||||||
|
public ProExModel(Channel<ProRunChannelData> channel)
|
||||||
|
{
|
||||||
|
ProRunChannel = channel;
|
||||||
|
|
||||||
|
//秒触发一次
|
||||||
|
CycleTimer = new System.Timers.Timer(1000);
|
||||||
|
CycleTimer.Elapsed += SlopExCycleAction;
|
||||||
|
CycleTimer.AutoReset = true;
|
||||||
|
CycleTimer.Enabled = true;
|
||||||
|
CycleTimer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序执行管道
|
||||||
|
/// </summary>
|
||||||
|
public Channel<ProRunChannelData> ProRunChannel { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 名称
|
||||||
|
/// </summary>
|
||||||
|
public string MeterName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前模型是否启用
|
||||||
|
/// 当前有很多参数都是预设,但是有些参数是为其他的项目准备的,可能在当前的项目上都不会配置和使用。
|
||||||
|
/// 故设置Enable属性
|
||||||
|
/// </summary>
|
||||||
|
public bool Enable { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序步骤集合
|
||||||
|
/// </summary>
|
||||||
|
public List<ProStepExe> ListProStepExe { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 仪表步骤执行时间信息
|
||||||
|
/// </summary>
|
||||||
|
public ProRunTime ProRunTimeModel { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下一步步骤数据执行
|
||||||
|
/// </summary>
|
||||||
|
public ProStepExe NextProStepExe { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前步骤数据执行
|
||||||
|
/// 给看步骤是否变化使用
|
||||||
|
/// </summary>
|
||||||
|
public ProStepExe CurProStepExe { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上一步步骤数据执行
|
||||||
|
/// 给看步骤是否变化使用
|
||||||
|
/// </summary>
|
||||||
|
public ProStepExe LastProStepExe { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前程序段时间长
|
||||||
|
/// </summary>
|
||||||
|
public int CurProTimeSum { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前程序段开始时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CurProStartTime { set; get; }
|
||||||
|
|
||||||
|
|
||||||
|
#region 仪表步骤执行时间信息
|
||||||
|
|
||||||
|
public EventHandler<string> RunTimeCallSglEvent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用
|
||||||
|
/// </summary>
|
||||||
|
public bool RunEnable { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// RunTimeCallSglEvent 是否注册关联方法
|
||||||
|
/// </summary>
|
||||||
|
public bool EventRegister { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前步骤开始运行时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StepStartDt { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前步骤结束运行时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StepEndDt { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
private DateTime _CurrentDateTime;
|
||||||
|
/// <summary>
|
||||||
|
/// 当前时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CurrentDateTime
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _CurrentDateTime;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
//value.ToString("yyyy-MM-dd HH:mm:ss") == EndDateTime.ToString("yyyy-MM-dd HH:mm:ss")
|
||||||
|
if (RunEnable == true && value >= StepEndDt)
|
||||||
|
{
|
||||||
|
_CurrentDateTime = value;
|
||||||
|
//达到后不再触发
|
||||||
|
//RunEnable = false;
|
||||||
|
//时间到了触发下载下一步步骤
|
||||||
|
|
||||||
|
//不为空的数据
|
||||||
|
if (NextProStepExe == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{MeterName} " +
|
||||||
|
$"【Msg】:没有下一步,当前仪表参数全部执行完毕 ");
|
||||||
|
|
||||||
|
//为空时不执行后续的数据
|
||||||
|
RunEnable = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{MeterName} " +
|
||||||
|
$"【程序Seg】{CurProStepExe.ProSegName} " +
|
||||||
|
$"【程序步骤】{CurProStepExe.MeterStep} " +
|
||||||
|
$"【Msg】:时间到,开始执行下一步步骤 ");
|
||||||
|
|
||||||
|
////////首先判断参数是否相同///////////
|
||||||
|
|
||||||
|
var SvResult = false;//True代表不同,false代表相同
|
||||||
|
//判断PID是否跟上一次一样
|
||||||
|
if (CurProStepExe.EndSV != NextProStepExe.EndSV)
|
||||||
|
{
|
||||||
|
SvResult = true;
|
||||||
|
}
|
||||||
|
var PidResult = false;//True代表不同,false代表相同
|
||||||
|
//判断PID是否跟上一次一样
|
||||||
|
if (CurProStepExe.PIDNo != NextProStepExe.PIDNo)
|
||||||
|
{
|
||||||
|
PidResult = true;
|
||||||
|
}
|
||||||
|
var LimitResult = false;//True代表不同,false代表相同
|
||||||
|
//判断Limit是否跟上一次一样
|
||||||
|
if (CurProStepExe.LimitNo != NextProStepExe.LimitNo)
|
||||||
|
{
|
||||||
|
LimitResult = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////发送步骤信息///////////
|
||||||
|
if (NextProStepExe.ExistSlop)
|
||||||
|
{
|
||||||
|
//存在坡度数据
|
||||||
|
var SecStepDur = NextProStepExe.EndSV - NextProStepExe.StartSV;
|
||||||
|
var SecStepValue = SecStepDur * 1.0 / NextProStepExe.KeepTime;
|
||||||
|
//先清除数据
|
||||||
|
ListSlopExStep.Clear();
|
||||||
|
//组装斜坡数据,按照秒为间隔发送
|
||||||
|
for (var i = 1; i <= NextProStepExe.KeepTime; i++)
|
||||||
|
{
|
||||||
|
var SlopExStep = new SlopExStep()
|
||||||
|
{
|
||||||
|
StepNo = i,
|
||||||
|
SV = NextProStepExe.StartSV + (int)(SecStepValue * i),
|
||||||
|
IsHasEx = false,
|
||||||
|
};
|
||||||
|
ListSlopExStep.Add(SlopExStep);
|
||||||
|
}
|
||||||
|
//需要发送一次StartSV数据吗?
|
||||||
|
|
||||||
|
//组装完成开始循环打点
|
||||||
|
StartSlopExStep();
|
||||||
|
|
||||||
|
}
|
||||||
|
else//不存在斜坡数据的话,则直接发送EndSV数据即可
|
||||||
|
{
|
||||||
|
ProRunChannel.Writer.TryWrite(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, true),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////准备新的数据///////////
|
||||||
|
|
||||||
|
LastProStepExe = CurProStepExe.DeepClone();
|
||||||
|
//准备下一步步骤数据
|
||||||
|
CurProStepExe = NextProStepExe.DeepClone();
|
||||||
|
|
||||||
|
//标记状态-当前执行中
|
||||||
|
if (ListProStepExe.Where(a => a.MeterStep == CurProStepExe.MeterStep).Any())
|
||||||
|
{
|
||||||
|
ListProStepExe.FindFirst(a => a.MeterStep == CurProStepExe.MeterStep).MeterStepIsExeing = true;
|
||||||
|
}
|
||||||
|
//标记状态-上一个执行完毕标记
|
||||||
|
if (ListProStepExe.Where(a => a.MeterStep == LastProStepExe.MeterStep).Any())
|
||||||
|
{
|
||||||
|
ListProStepExe.FindFirst(a => a.MeterStep == LastProStepExe.MeterStep).MeterStepIsExeing = false;
|
||||||
|
}
|
||||||
|
//标记状态-上一个执行完成
|
||||||
|
if (ListProStepExe.Where(a => a.MeterStep == LastProStepExe.MeterStep).Any())
|
||||||
|
{
|
||||||
|
ListProStepExe.FindFirst(a => a.MeterStep == LastProStepExe.MeterStep).MeterStepIsOK = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//设置下一步步骤数据
|
||||||
|
if (ListProStepExe.Where(x => x.MeterStep == CurProStepExe.MeterStep + 1).Any())
|
||||||
|
{
|
||||||
|
//存在下一步数据
|
||||||
|
NextProStepExe = ListProStepExe.FirstOrDefault(x => x.MeterStep == CurProStepExe.MeterStep + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//没有下一步数据则判定为最后一步
|
||||||
|
NextProStepExe = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//设置步骤开始时间
|
||||||
|
StepStartDt = DateTime.Now;
|
||||||
|
|
||||||
|
//设置步骤结束时间
|
||||||
|
StepEndDt = StepStartDt.AddSeconds(CurProStepExe.KeepTime);
|
||||||
|
|
||||||
|
//设置下一步步骤运行时间
|
||||||
|
RunEnable = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_CurrentDateTime = value;
|
||||||
|
RunTime = (int)(_CurrentDateTime - StepEndDt).TotalSeconds;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前步骤已经运行时长-秒
|
||||||
|
/// </summary>
|
||||||
|
public int RunTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 通过组合Pid和Limit组合出运行步骤类型
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="pid">PID是否不同</param>
|
||||||
|
/// <param name="limit">Limit是否不同</param>
|
||||||
|
/// <param name="sv">SV是否不同</param>
|
||||||
|
/// <returns>运行步骤类型</returns>
|
||||||
|
private RunStepType GetRunStepType(bool pid, bool limit, bool sv)
|
||||||
|
{
|
||||||
|
if (pid && limit && sv)
|
||||||
|
{
|
||||||
|
return RunStepType.Step;
|
||||||
|
}
|
||||||
|
else if (pid && sv)
|
||||||
|
{
|
||||||
|
return RunStepType.StepPID;
|
||||||
|
}
|
||||||
|
else if (limit && sv)
|
||||||
|
{
|
||||||
|
return RunStepType.StepLimit;
|
||||||
|
}
|
||||||
|
else if (sv)
|
||||||
|
{
|
||||||
|
return RunStepType.StepSV;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return RunStepType.Step;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region 步骤斜率执行 打点执行
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始打点执行
|
||||||
|
/// </summary>
|
||||||
|
private void StartSlopExStep()
|
||||||
|
{
|
||||||
|
SlopExEnable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 斜率执行步骤集合
|
||||||
|
/// 打点集合
|
||||||
|
/// </summary>
|
||||||
|
public List<SlopExStep> ListSlopExStep { get; set; } = new List<SlopExStep>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 斜率执行循环周期
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
private void SlopExCycleAction(object? sender, ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//如果Execute执行的是一个很耗时的方法,会导致方法未执行完毕,定时器又启动了一个线程来执行Execute方法
|
||||||
|
//CycleTimer.Stop(); //先关闭定时器
|
||||||
|
if (SlopExEnable)
|
||||||
|
{
|
||||||
|
var NoExData = ListSlopExStep.Where(a => a.IsHasEx == false).OrderBy(a => a.StepNo).ToList();
|
||||||
|
if (NoExData.Any())
|
||||||
|
{
|
||||||
|
//发送步骤信息
|
||||||
|
ProRunChannel.Writer.TryWrite(new ProRunChannelData()
|
||||||
|
{
|
||||||
|
MeterName = MeterName,
|
||||||
|
SV = NoExData.First().SV,
|
||||||
|
|
||||||
|
ProSegName = CurProStepExe.ProSegName,
|
||||||
|
MeterStep = CurProStepExe.MeterStep,
|
||||||
|
SlopStepNo = NoExData.First().StepNo,
|
||||||
|
CurLoadLimit = null,
|
||||||
|
CurLoadPID = null,
|
||||||
|
RunStepType = RunStepType.SlopCell,
|
||||||
|
});
|
||||||
|
//发送完毕后进行标记数据
|
||||||
|
NoExData.First().IsHasEx = true;
|
||||||
|
|
||||||
|
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{MeterName} " +
|
||||||
|
$"【程序Seg】{CurProStepExe.ProSegName} " +
|
||||||
|
$"【程序步骤】{CurProStepExe.MeterStep} " +
|
||||||
|
$"【斜坡打点步骤】{NoExData.First().StepNo} " +
|
||||||
|
$"【斜坡打点值SV】{NoExData.First().SV} " +
|
||||||
|
$"【Msg】:发送斜坡打点 ");
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//执行完毕了,没有要执行的数据效率
|
||||||
|
SlopExEnable = false;
|
||||||
|
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{MeterName} " +
|
||||||
|
$"【程序Seg】{CurProStepExe.ProSegName} " +
|
||||||
|
$"【程序步骤】{CurProStepExe.MeterStep} " +
|
||||||
|
$"【Msg】:斜坡打点执行完毕 ");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//CycleTimer.Start(); //执行完毕后再开启器
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
//CycleTimer.Start(); //执行完毕后再开启器
|
||||||
|
//LogService.Info($"时间:{DateTime.Now.ToString()}-【PwAnalyze-CycleAction】-{ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 周期定时器
|
||||||
|
/// </summary>
|
||||||
|
private System.Timers.Timer CycleTimer { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 步骤斜率执行使能状态
|
||||||
|
/// </summary>
|
||||||
|
public bool SlopExEnable { get; set; } = false;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
88
CapMachine.Wpf/Models/ProModelPars/ProRunTime.cs
Normal file
88
CapMachine.Wpf/Models/ProModelPars/ProRunTime.cs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 程序运行时间
|
||||||
|
/// </summary>
|
||||||
|
public class ProRunTime
|
||||||
|
{
|
||||||
|
|
||||||
|
public EventHandler<string> RunTimeCallSglEvent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用
|
||||||
|
/// </summary>
|
||||||
|
public bool RunEnable { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// RunTimeCallSglEvent 是否注册关联方法
|
||||||
|
/// </summary>
|
||||||
|
public bool EventRegister { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前仪表名称
|
||||||
|
/// </summary>
|
||||||
|
public string MeterName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前程序段名称
|
||||||
|
/// </summary>
|
||||||
|
public string ProName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前仪表程序步骤
|
||||||
|
/// </summary>
|
||||||
|
public int MeterStep { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前步骤开始运行时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime StartDateTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前步骤结束运行时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime EndDateTime { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
private DateTime currentDateTime;
|
||||||
|
/// <summary>
|
||||||
|
/// 当前时间
|
||||||
|
/// </summary>
|
||||||
|
public DateTime CurrentDateTime
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return currentDateTime;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
//value.ToString("yyyy-MM-dd HH:mm:ss") == EndDateTime.ToString("yyyy-MM-dd HH:mm:ss")
|
||||||
|
if (RunEnable == true && value >= EndDateTime)
|
||||||
|
{
|
||||||
|
currentDateTime = value;
|
||||||
|
RunEnable = false;
|
||||||
|
//时间到了触发下载新的步骤
|
||||||
|
//RunTimeCallSglEvent(ProName, MeterName, MeterStep);
|
||||||
|
//RunTimeCallSglEvent.BeginInvoke(ProName, MeterName, MeterStep, null, null);
|
||||||
|
//RunEnable = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentDateTime = value;
|
||||||
|
RunTime = (int)(currentDateTime - StartDateTime).TotalSeconds;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前步骤已经运行时长-秒
|
||||||
|
/// </summary>
|
||||||
|
public int RunTime { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
135
CapMachine.Wpf/Models/ProModelPars/ProStepExe.cs
Normal file
135
CapMachine.Wpf/Models/ProModelPars/ProStepExe.cs
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
using CapMachine.Model;
|
||||||
|
using CapMachine.Wpf.Dtos;
|
||||||
|
using Prism.Mvvm;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 程序分解后的执行步骤
|
||||||
|
/// </summary>
|
||||||
|
public class ProStepExe : BindableBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 程序段名称
|
||||||
|
/// </summary>
|
||||||
|
public string? ProSegName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序段步骤
|
||||||
|
/// </summary>
|
||||||
|
public int ProSegStep { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序段重复执行次数
|
||||||
|
/// </summary>
|
||||||
|
public int ProSegRepeat { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序段当前是否执行中
|
||||||
|
/// </summary>
|
||||||
|
public bool ProSegIsExeing { get; set; }
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////////程序步骤///////////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 程序步骤标记
|
||||||
|
///// </summary>
|
||||||
|
//public StepPosMark StepPosMark { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 仪表参数当前是否执行中
|
||||||
|
/// </summary>
|
||||||
|
public bool MeterStepIsExeing { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 仪表参数是否执行完成
|
||||||
|
/// </summary>
|
||||||
|
public bool MeterStepIsOK { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 仪表参数名称
|
||||||
|
/// </summary>
|
||||||
|
public string? MeterName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 仪表参数步骤
|
||||||
|
/// </summary>
|
||||||
|
public int MeterStep { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 这个步骤是打开具体设置步骤界面的那个层面的信息,例如:2-3,代表是程序2里面的仪表步骤3,方便调试和给液击使用
|
||||||
|
/// </summary>
|
||||||
|
public string? ProStepInfo { get; set; }
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 启用状态-没有启用就是什么数据都没有
|
||||||
|
///// Const-常值-常值,StepValue有值,只有一个步骤,CycleTime为0
|
||||||
|
///// MultisStep-有步骤细节-此时在一个仪表下就会有很多步骤的细节数据
|
||||||
|
///// </summary>
|
||||||
|
//public ConfigValueType ConfigState { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// StartSV- 步骤的开始SV
|
||||||
|
/// 最终的写到PLC结果值,经过进制转换
|
||||||
|
/// </summary>
|
||||||
|
public int StartSV { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// EndSV- 步骤的目标SV
|
||||||
|
/// 最终的写到PLC结果值,经过进制转换
|
||||||
|
/// </summary>
|
||||||
|
public int EndSV { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// KeepTime Sec
|
||||||
|
/// </summary>
|
||||||
|
public int KeepTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否启用坡度
|
||||||
|
/// 存在斜坡容易判断,非斜坡是常值
|
||||||
|
/// 常值有两种情况:
|
||||||
|
/// 一个是设置时就直接设定为常值,
|
||||||
|
/// 另一个是斜率步骤里面比如:起始:8000,结束:9000,那么也是常值,因为当前模型是拆分详细之后的,他可以判断详细步骤的斜坡信息
|
||||||
|
/// </summary>
|
||||||
|
public bool ExistSlop { get; set; }
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 时间-秒-斜坡时间
|
||||||
|
///// </summary>
|
||||||
|
//public int SlopTimeSec { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PIDNo
|
||||||
|
/// </summary>
|
||||||
|
public int PIDNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PID的配置信息
|
||||||
|
/// </summary>
|
||||||
|
public ConfigPIDDto? CurConfigPIDDto { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// LimitNo
|
||||||
|
/// </summary>
|
||||||
|
public int LimitNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// AlarmNo的配置信息
|
||||||
|
/// </summary>
|
||||||
|
public ConfigLimitDto? CurConfigLimitDto { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// AlarmNo
|
||||||
|
/// </summary>
|
||||||
|
public int AlarmNo { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
45
CapMachine.Wpf/Models/ProModelPars/RunStepType.cs
Normal file
45
CapMachine.Wpf/Models/ProModelPars/RunStepType.cs
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 运行和下载的数据类型
|
||||||
|
/// </summary>
|
||||||
|
public enum RunStepType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 正常的步骤信息 SV-PID-Limit 下载数据
|
||||||
|
/// 就是:包括:SV PID和SLIMIT的数据,当然SV PID和SLIMIT跟上次是一样的话,则不需要下载
|
||||||
|
/// </summary>
|
||||||
|
Step = 1,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 正常的步骤信息-SV-PID 下载数据
|
||||||
|
/// 就是:包括:SV PID和SLIMIT的数据,当然SV PID和SLIMIT跟上次是一样的话,则不需要下载
|
||||||
|
/// </summary>
|
||||||
|
StepPID = 2,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 正常的步骤信息-SV-Limit 下载数据
|
||||||
|
/// 就是:包括:SV PID和SLIMIT的数据,当然SV PID和SLIMIT跟上次是一样的话,则不需要下载
|
||||||
|
/// </summary>
|
||||||
|
StepLimit = 3,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 正常的步骤信息-SV 下载数据
|
||||||
|
/// 就是:包括:SV PID和SLIMIT的数据,当然SV PID和SLIMIT跟上次是一样的话,则不需要下载
|
||||||
|
/// </summary>
|
||||||
|
StepSV = 4,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 斜率单元
|
||||||
|
/// 带斜率的数据打点执行,只传送SV值
|
||||||
|
/// 比如速度:0-5000 5秒,此时执行:第一秒:1000,第二秒:2000,第三秒:3000,第四秒:4000,第五秒:5000
|
||||||
|
/// </summary>
|
||||||
|
SlopCell = 10
|
||||||
|
}
|
||||||
|
}
|
||||||
29
CapMachine.Wpf/Models/ProModelPars/SlopExStep.cs
Normal file
29
CapMachine.Wpf/Models/ProModelPars/SlopExStep.cs
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 斜率执行步骤
|
||||||
|
/// </summary>
|
||||||
|
public class SlopExStep
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 步骤号
|
||||||
|
/// </summary>
|
||||||
|
public int StepNo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SV值
|
||||||
|
/// </summary>
|
||||||
|
public int SV { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否已经执行
|
||||||
|
/// </summary>
|
||||||
|
public bool IsHasEx { get; set; }=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
71
CapMachine.Wpf/Models/ProModelPars/StepPlcCell.cs
Normal file
71
CapMachine.Wpf/Models/ProModelPars/StepPlcCell.cs
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// PLC下载单元
|
||||||
|
/// </summary>
|
||||||
|
public class StepPlcCell : HslCommunication.IDataTransfer
|
||||||
|
{
|
||||||
|
public ushort ReadCount { get; set; } = 10;
|
||||||
|
|
||||||
|
public void ParseSource(byte[] Content)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] ToSource()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region 步骤数据
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 时间-分钟
|
||||||
|
/// </summary>
|
||||||
|
public short TimeMin { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 时间-秒
|
||||||
|
/// </summary>
|
||||||
|
public short TimeSec { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SV值
|
||||||
|
/// </summary>
|
||||||
|
public short SV { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PID-P
|
||||||
|
/// </summary>
|
||||||
|
public short PID_P { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PID-I
|
||||||
|
/// </summary>
|
||||||
|
public short PID_I { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PID-D
|
||||||
|
/// </summary>
|
||||||
|
public short PID_D { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Limit-Up
|
||||||
|
/// </summary>
|
||||||
|
public short Limit_Up { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Limit-Down
|
||||||
|
/// </summary>
|
||||||
|
public short Limit_Down { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
16
CapMachine.Wpf/Models/ProModelPars/StepPosMark.cs
Normal file
16
CapMachine.Wpf/Models/ProModelPars/StepPosMark.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Models.ProModelPars
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 程序步骤标记
|
||||||
|
/// </summary>
|
||||||
|
public enum StepPosMark
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ using CapMachine.Wpf.Models;
|
|||||||
using CapMachine.Wpf.Models.Tag;
|
using CapMachine.Wpf.Models.Tag;
|
||||||
using CapMachine.Wpf.PrismEvent;
|
using CapMachine.Wpf.PrismEvent;
|
||||||
using HslCommunication;
|
using HslCommunication;
|
||||||
|
using HslCommunication.Profinet.Melsec;
|
||||||
using HslCommunication.Profinet.Siemens;
|
using HslCommunication.Profinet.Siemens;
|
||||||
using Prism.Events;
|
using Prism.Events;
|
||||||
using Prism.Mvvm;
|
using Prism.Mvvm;
|
||||||
@@ -52,6 +53,11 @@ namespace CapMachine.Wpf.Services
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SiemensS7Net SiemensDrive { get; set; }
|
public SiemensS7Net SiemensDrive { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 三菱连接驱动程序
|
||||||
|
/// </summary>
|
||||||
|
public MelsecMcNet MelsecMcNetDrive { get; set; }
|
||||||
|
|
||||||
private bool _LinkState;
|
private bool _LinkState;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// PLC连接状态
|
/// PLC连接状态
|
||||||
@@ -123,6 +129,8 @@ namespace CapMachine.Wpf.Services
|
|||||||
//stopwatch.Stop(); //停止Stopwatch
|
//stopwatch.Stop(); //停止Stopwatch
|
||||||
//Console.WriteLine("Add Elapsed output runTime:{0}", stopwatch.Elapsed.ToString());
|
//Console.WriteLine("Add Elapsed output runTime:{0}", stopwatch.Elapsed.ToString());
|
||||||
|
|
||||||
|
//MelsecMcNetDrive.
|
||||||
|
|
||||||
//事件服务
|
//事件服务
|
||||||
_EventAggregator = eventAggregator;
|
_EventAggregator = eventAggregator;
|
||||||
AlarmService = alarmService;
|
AlarmService = alarmService;
|
||||||
@@ -149,7 +157,7 @@ namespace CapMachine.Wpf.Services
|
|||||||
TagManger.AddTag(new Tag<short>("COND2压力", "COND2压力[BarA]", "Cond2Press", "程序", "VW15012", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 });
|
TagManger.AddTag(new Tag<short>("COND2压力", "COND2压力[BarA]", "Cond2Press", "程序", "VW15012", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 });
|
||||||
TagManger.AddTag(new Tag<short>("OCR", "OCR[%]", "OCR", "程序", "VW15014", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("OCR", "OCR[%]", "OCR", "程序", "VW15014", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("HV[V]", "HV[V]", "HV", "程序", "VW15016", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("HV[V]", "HV[V]", "HV", "程序", "VW15016", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("HV[A]", "HV[A]", "HVCur", "程序", "VW15018", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("HV[A]", "HV[A]", "HVCur", "程序", "VW15018", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2 });
|
||||||
TagManger.AddTag(new Tag<short>("HV[W]", "HV[W]", "HVPw", "程序", "VW15020", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("HV[W]", "HV[W]", "HVPw", "程序", "VW15020", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("LV[V]", "LV[V]", "LV", "程序", "VW15022", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("LV[V]", "LV[V]", "LV", "程序", "VW15022", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1 });
|
||||||
//TagManger.AddTag(new Tag<short>("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
//TagManger.AddTag(new Tag<short>("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
@@ -163,7 +171,7 @@ namespace CapMachine.Wpf.Services
|
|||||||
TagManger.AddTag(new Tag<short>("EVAP出口温度", "EVAP出口温度[℃]", "EVAPExpTemp", "程序", "VW15036", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("EVAP出口温度", "EVAP出口温度[℃]", "EVAPExpTemp", "程序", "VW15036", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
//TagManger.AddTag(new Tag<short>("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
//TagManger.AddTag(new Tag<short>("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("润滑油流量", "润滑油流量[L/min]", "LubeFlow", "程序", "VW15040", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("润滑油流量", "润滑油流量[L/min]", "LubeFlow", "程序", "VW15040", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("排气温度", "排气温度[℃]", "ExTemp", "程序", "VW15042", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("排气温度", "排气温度[℃]", "ExTemp", "程序", "VW15042", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("膨胀阀前压力", "膨胀阀前压力[BarA]", "TxvFrPress", "程序", "VW15044", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 });
|
TagManger.AddTag(new Tag<short>("膨胀阀前压力", "膨胀阀前压力[BarA]", "TxvFrPress", "程序", "VW15044", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 });
|
||||||
TagManger.AddTag(new Tag<short>("膨胀阀前温度", "膨胀阀前温度[℃]", "TxvFrTemp", "程序", "VW15046", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("膨胀阀前温度", "膨胀阀前温度[℃]", "TxvFrTemp", "程序", "VW15046", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
@@ -173,18 +181,18 @@ namespace CapMachine.Wpf.Services
|
|||||||
TagManger.AddTag(new Tag<short>("PTC流量", "PTC流量[L/min]", "PTCFlow", "程序", "VW15054", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("PTC流量", "PTC流量[L/min]", "PTCFlow", "程序", "VW15054", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("PTC入水温度", "PTC入水温度[℃]", "PTCEntTemp", "程序", "VW15056", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("PTC入水温度", "PTC入水温度[℃]", "PTCEntTemp", "程序", "VW15056", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("PTC出水温度", "PTC出水温度[℃]", "PTCExpTemp", "程序", "VW15058", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("PTC出水温度", "PTC出水温度[℃]", "PTCExpTemp", "程序", "VW15058", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯Cmp母线电流", "通讯Cmp母线电流[A]", "ComCapBusCur", "程序", "VW15060", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯Cmp母线电流", "通讯Cmp母线电流[A]", "ComCapBusCur", "程序", "VW15060", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯Cmp母线电压", "通讯Cmp母线电压[V]", "ComCapBusVol", "程序", "VW15062", 100, 0, 10, "V", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯Cmp母线电压", "通讯Cmp母线电压[V]", "ComCapBusVol", "程序", "VW15062", 100, 0, 10, "V", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯Cmp逆变器温度", "通讯Cmp逆变器温度[℃]", "ComCapInvTemp", "程序", "VW15064", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯Cmp逆变器温度", "通讯Cmp逆变器温度[℃]", "ComCapInvTemp", "程序", "VW15064", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯Cmp相电流", "通讯Cmp相电流[A]", "ComCapPhCur", "程序", "VW15066", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯Cmp相电流", "通讯Cmp相电流[A]", "ComCapPhCur", "程序", "VW15066", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯Cmp功率", "通讯Cmp功率[W]", "ComCapPw", "程序", "VW15068", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯Cmp功率", "通讯Cmp功率[W]", "ComCapPw", "程序", "VW15068", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯Cmp芯片温度", "通讯Cmp芯片温度[℃]", "ComCapChipTemp", "程序", "VW15070", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯Cmp芯片温度", "通讯Cmp芯片温度[℃]", "ComCapChipTemp", "程序", "VW15070", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯PTC入水温度", "通讯PTC入水温度[℃]", "ComPTCEntTemp", "程序", "VW15072", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯PTC入水温度", "通讯PTC入水温度[℃]", "ComPTCEntTemp", "程序", "VW15072", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯PTC出水温度", "通讯PTC出水温度[℃]", "ComPTCExpTemp", "程序", "VW15074", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯PTC出水温度", "通讯PTC出水温度[℃]", "ComPTCExpTemp", "程序", "VW15074", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯PTC峰值电流", "通讯PTC峰值电流[A]", "ComPTCPeakCur", "程序", "VW15076", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯PTC峰值电流", "通讯PTC峰值电流[A]", "ComPTCPeakCur", "程序", "VW15076", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯PTC母线电流", "通讯PTC母线电流[A]", "ComPTCBusCur", "程序", "VW15078", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯PTC母线电流", "通讯PTC母线电流[A]", "ComPTCBusCur", "程序", "VW15078", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯PTC膜温", "通讯PTC膜温[℃]", "ComPTCFlmTemp", "程序", "VW15080", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯PTC膜温", "通讯PTC膜温[℃]", "ComPTCFlmTemp", "程序", "VW15080", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 });
|
||||||
TagManger.AddTag(new Tag<short>("通讯PTC模块温度", "通讯PTC模块温度[℃]", "ComPTCMdTemp", "程序", "VW15082", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 });
|
TagManger.AddTag(new Tag<short>("通讯PTC模块温度", "通讯PTC模块温度[℃]", "ComPTCMdTemp", "程序", "VW15082", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 });
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -1043,6 +1051,7 @@ namespace CapMachine.Wpf.Services
|
|||||||
{
|
{
|
||||||
var IPInfo = ConfigHelper.GetValue("PLCIP");
|
var IPInfo = ConfigHelper.GetValue("PLCIP");
|
||||||
|
|
||||||
|
|
||||||
SiemensDrive = new SiemensS7Net(SiemensPLCS.S200Smart, IPInfo);
|
SiemensDrive = new SiemensS7Net(SiemensPLCS.S200Smart, IPInfo);
|
||||||
// 连接对象
|
// 连接对象
|
||||||
OperateResult connect = SiemensDrive.ConnectServer();
|
OperateResult connect = SiemensDrive.ConnectServer();
|
||||||
|
|||||||
@@ -1,8 +1,27 @@
|
|||||||
using System;
|
using AutoMapper;
|
||||||
|
using CapMachine.Model;
|
||||||
|
using CapMachine.Shared.Controls;
|
||||||
|
using CapMachine.Wpf.ChannelModel;
|
||||||
|
using CapMachine.Wpf.Dtos;
|
||||||
|
using CapMachine.Wpf.Models;
|
||||||
|
using CapMachine.Wpf.Models.ProModelPars;
|
||||||
|
using CapMachine.Wpf.Models.Tag;
|
||||||
|
using CapMachine.Wpf.PrismEvent;
|
||||||
|
using CapMachine.Wpf.ProPars;
|
||||||
|
using CapMachine.Wpf.Tool;
|
||||||
|
using ImTools;
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading.Channels;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using static CapMachine.Wpf.Models.ComEnum;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using HslCommunication.Profinet.Siemens;
|
||||||
|
using Masuit.Tools.Hardware;
|
||||||
|
|
||||||
namespace CapMachine.Wpf.Services
|
namespace CapMachine.Wpf.Services
|
||||||
{
|
{
|
||||||
@@ -15,11 +34,665 @@ namespace CapMachine.Wpf.Services
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 实例化函数
|
/// 实例化函数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ProRuntimeService()
|
public ProRuntimeService(IFreeSql freeSql, IMapper mapper, MachineRtDataService machineRtDataService, ILogService logService)
|
||||||
{
|
{
|
||||||
|
FreeSql = freeSql;
|
||||||
|
Mapper = mapper;
|
||||||
|
MachineRtDataService = machineRtDataService;
|
||||||
|
LogService = logService;
|
||||||
|
|
||||||
|
//实例化函数
|
||||||
|
ListProExModel = new List<ProExModel>()
|
||||||
|
{
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="速度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="COND1温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="COND2温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="COND2压力",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="EVAP出口温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="排气压力",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="HV电压",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="吸气压力",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="吸气温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="润滑油压力",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="LV电压",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="OCR",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="OS1温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="OS2温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="PTC入口温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="PTC流量",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="PTC功率",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="压缩机环境湿度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
},
|
||||||
|
new ProExModel(ProRunChannel){
|
||||||
|
MeterName="压缩机环境温度",
|
||||||
|
ListProStepExe=new List<ProStepExe>(),
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//驱动实例
|
||||||
|
SiemensDrive = MachineRtDataService.SiemensDrive;
|
||||||
|
|
||||||
|
//程序运行实时管道数据监听
|
||||||
|
Task.Run(() => ListenProRunChannelAction());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 选中的程序运行集合
|
||||||
|
/// </summary>
|
||||||
|
public List<ProSegRun> SelectedListProSegRun { get; set; }
|
||||||
|
public IFreeSql FreeSql { get; }
|
||||||
|
public IMapper Mapper { get; }
|
||||||
|
public MachineRtDataService MachineRtDataService { get; }
|
||||||
|
public ILogService LogService { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 西门子连接驱动程序
|
||||||
|
/// </summary>
|
||||||
|
public SiemensS7Net SiemensDrive { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Task扫描 程序运行时间扫描任务
|
||||||
|
/// </summary>
|
||||||
|
private static Task ProRunTimeScanTask { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序运行集合
|
||||||
|
/// </summary>
|
||||||
|
public List<ProExModel> ListProExModel { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PLC加载配置数据集合
|
||||||
|
/// </summary>
|
||||||
|
public List<PlcLoadConfigCell> ListPlcLoadConfigCell { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载选中的程序运行集合
|
||||||
|
/// </summary>
|
||||||
|
public void LoadProSegRun(List<ProSegRun> SelectedListProSegRun)
|
||||||
|
{
|
||||||
|
if (SelectedListProSegRun == null || SelectedListProSegRun.Count() == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//先清空之前的步骤数据
|
||||||
|
foreach (var itemProExModel in ListProExModel)
|
||||||
|
{
|
||||||
|
itemProExModel.ListProStepExe.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
//多个选中的程序块循环
|
||||||
|
foreach (var itemProSegRun in SelectedListProSegRun)
|
||||||
|
{
|
||||||
|
//获取当前程序块
|
||||||
|
//逐个对应的程序
|
||||||
|
var CurProgramSeg = FreeSql.Select<ProgramSeg>(itemProSegRun.ProgramSegId)
|
||||||
|
.IncludeMany(a => a.ProSteps,
|
||||||
|
then => then.IncludeMany(b => b.MeterSpeeds)
|
||||||
|
.IncludeMany(b => b.MeterCond1Temps)
|
||||||
|
.IncludeMany(b => b.MeterCond2Temps)
|
||||||
|
.IncludeMany(b => b.MeterCond2Presss)
|
||||||
|
.IncludeMany(b => b.MeterEVAPExpTemps)
|
||||||
|
.IncludeMany(b => b.MeterExPresss)
|
||||||
|
.IncludeMany(b => b.MeterHVVols)
|
||||||
|
.IncludeMany(b => b.MeterInhPresss)
|
||||||
|
.IncludeMany(b => b.MeterInhTemps)
|
||||||
|
.IncludeMany(b => b.MeterLubePresss)
|
||||||
|
.IncludeMany(b => b.MeterLVVols)
|
||||||
|
.IncludeMany(b => b.MeterOCRs)
|
||||||
|
.IncludeMany(b => b.MeterOS1Temps)
|
||||||
|
.IncludeMany(b => b.MeterOS2Temps)
|
||||||
|
.IncludeMany(b => b.MeterPTCEntTemps)
|
||||||
|
.IncludeMany(b => b.MeterPTCFlows)
|
||||||
|
.IncludeMany(b => b.MeterPTCPws)
|
||||||
|
.IncludeMany(b => b.MeterEnvRHs)
|
||||||
|
.IncludeMany(b => b.MeterEnvTemps)
|
||||||
|
).ToList().FirstOrDefault();
|
||||||
|
|
||||||
|
//获取当前的程序
|
||||||
|
if (CurProgramSeg != null && CurProgramSeg.ProSteps != null && CurProgramSeg.ProSteps.Any())
|
||||||
|
{
|
||||||
|
//CurProgramSeg有重复运行的次数
|
||||||
|
for (int SegIndex = 0; SegIndex < CurProgramSeg.ProRepeat; SegIndex++)
|
||||||
|
{
|
||||||
|
//解析程序的多行步骤,表格中的行步骤数据,牟定速度
|
||||||
|
foreach (var itemStep in CurProgramSeg.ProSteps.OrderBy(a => a.StepNo))
|
||||||
|
{
|
||||||
|
//单行步骤中包含多个仪表参数的配置,需要逐个仪表参数手动操作解析
|
||||||
|
|
||||||
|
//********* 单个速度步骤信息的解析 *********
|
||||||
|
var CurMeterName = "速度";
|
||||||
|
if (itemStep.MeterSpeeds != null && itemStep.MeterSpeeds.Any())
|
||||||
|
{
|
||||||
|
switch (itemStep.MeterSpeeds.FirstOrDefault()!.ValueType)
|
||||||
|
{
|
||||||
|
case ConfigValueType.Constant: //常值
|
||||||
|
//常值的话就一个数据,循环执行一次
|
||||||
|
foreach (var itemMeterValueCell in itemStep.MeterSpeeds)
|
||||||
|
{
|
||||||
|
var Pid = new ConfigPID();
|
||||||
|
if (FreeSql.Select<ConfigPID>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).Any())
|
||||||
|
{
|
||||||
|
Pid = FreeSql.Select<ConfigPID>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).First();
|
||||||
|
}
|
||||||
|
var Limit = new ConfigLimit();
|
||||||
|
if (FreeSql.Select<ConfigLimit>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any())
|
||||||
|
{
|
||||||
|
Limit = FreeSql.Select<ConfigLimit>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).First();
|
||||||
|
}
|
||||||
|
var Alarm = new ConfigAlarm();
|
||||||
|
if (FreeSql.Select<ConfigAlarm>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any())
|
||||||
|
{
|
||||||
|
Alarm = FreeSql.Select<ConfigAlarm>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).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.ParNo,
|
||||||
|
AlarmNo = itemMeterValueCell.Ev,
|
||||||
|
PIDNo = itemMeterValueCell.Ev,
|
||||||
|
|
||||||
|
CurConfigPIDDto = Mapper.Map<ConfigPIDDto>(Pid),
|
||||||
|
CurConfigLimitDto = Mapper.Map<ConfigLimitDto>(Limit),
|
||||||
|
|
||||||
|
ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ConfigValueType.Slope: //斜率
|
||||||
|
//根据循环次数确定
|
||||||
|
for (int StepIndex = 0; StepIndex < itemStep.SpeedCycle; StepIndex++)
|
||||||
|
{
|
||||||
|
//根据循环次数执行
|
||||||
|
foreach (var itemMeterValueCell in itemStep.MeterSpeeds)
|
||||||
|
{
|
||||||
|
var Pid = new ConfigPID();
|
||||||
|
if (FreeSql.Select<ConfigPID>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).Any())
|
||||||
|
{
|
||||||
|
Pid = FreeSql.Select<ConfigPID>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).First();
|
||||||
|
}
|
||||||
|
var Limit = new ConfigLimit();
|
||||||
|
if (FreeSql.Select<ConfigLimit>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any())
|
||||||
|
{
|
||||||
|
Limit = FreeSql.Select<ConfigLimit>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).First();
|
||||||
|
}
|
||||||
|
var Alarm = new ConfigAlarm();
|
||||||
|
if (FreeSql.Select<ConfigAlarm>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any())
|
||||||
|
{
|
||||||
|
Alarm = FreeSql.Select<ConfigAlarm>().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).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.ParNo,
|
||||||
|
AlarmNo = itemMeterValueCell.ParNo,
|
||||||
|
PIDNo = itemMeterValueCell.Ev,
|
||||||
|
|
||||||
|
CurConfigPIDDto = Mapper.Map<ConfigPIDDto>(Pid),
|
||||||
|
CurConfigLimitDto = Mapper.Map<ConfigLimitDto>(Limit),
|
||||||
|
|
||||||
|
ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}",
|
||||||
|
MeterName = CurMeterName,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StartProRun();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理后获取SV的数据
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
private int GetSVByProcess(double SV, string Name)
|
||||||
|
{
|
||||||
|
var Data = ListPlcLoadConfigCell.Where(a => a.Name == Name);
|
||||||
|
if (Data.Any())
|
||||||
|
{
|
||||||
|
return (int)(SV / (Data.FirstOrDefault()!.Precision));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogService.Warn($"【名称】: {Name} - 未找到对应的参数配置,数据转换格式失败");
|
||||||
|
//未找到的话,则直接返回
|
||||||
|
return (int)SV;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region 程序调度执行
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始程序调度运行
|
||||||
|
/// </summary>
|
||||||
|
public void StartProRun()
|
||||||
|
{
|
||||||
|
//开始运行前的需要进行一些设置和数据初始化
|
||||||
|
foreach (var itemProExModel in ListProExModel)
|
||||||
|
{
|
||||||
|
//被启用和有步骤时才进行运行设置
|
||||||
|
if (itemProExModel == null && itemProExModel.Enable && itemProExModel!.ListProStepExe.Count() > 0) continue;
|
||||||
|
itemProExModel.RunEnable = true;
|
||||||
|
|
||||||
|
//设置下一步数据是第一步数据,然后设置时间
|
||||||
|
itemProExModel.NextProStepExe = itemProExModel!.ListProStepExe.OrderBy(a => a.MeterStep).FirstOrDefault()!;
|
||||||
|
itemProExModel.CurProStepExe = new ProStepExe();
|
||||||
|
itemProExModel.StepEndDt = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
//运行扫描任务
|
||||||
|
ProRunTimeScan();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool ProRunTaskEnable = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 运行时间扫描
|
||||||
|
/// </summary>
|
||||||
|
private void ProRunTimeScan()
|
||||||
|
{
|
||||||
|
ProRunTimeScanTask = Task.Run(async () =>
|
||||||
|
{
|
||||||
|
while (ProRunTaskEnable)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//循环给模型的当前时间赋值,驱动步骤执行
|
||||||
|
foreach (var itemProExModel in ListProExModel)
|
||||||
|
{
|
||||||
|
if (itemProExModel.RunEnable)
|
||||||
|
{
|
||||||
|
itemProExModel.CurrentDateTime = DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
//LogService.Info($"时间:{DateTime.Now.ToString()}-【Meter】-{ex.Message}");
|
||||||
|
}
|
||||||
|
//Console.WriteLine($"扫描时间:{DiagnosticsTime.Elapsed.TotalMilliseconds.ToString()}");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 队列通道
|
||||||
|
/// 当前队列消费触发的数据记录
|
||||||
|
/// </summary>
|
||||||
|
public Channel<ProRunChannelData> ProRunChannel = Channel.CreateUnbounded<ProRunChannelData>(new UnboundedChannelOptions()
|
||||||
|
{
|
||||||
|
SingleWriter = false,//允许一次写入多条数据
|
||||||
|
SingleReader = true //一次只能读取一条消息
|
||||||
|
});
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 程序执行管道监听方法
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="NotImplementedException"></exception>
|
||||||
|
private async void ListenProRunChannelAction()
|
||||||
|
{
|
||||||
|
while (await ProRunChannel.Reader.WaitToReadAsync())
|
||||||
|
{
|
||||||
|
if (ProRunChannel.Reader.TryRead(out var ProRunChannelData))
|
||||||
|
{
|
||||||
|
////第一次计时
|
||||||
|
//stopwatch.Start(); //启动Stopwatch
|
||||||
|
if (ProRunChannelData.RunStepType == RunStepType.SlopCell)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " +
|
||||||
|
$"【参数名称】:{ProRunChannelData.MeterName} " +
|
||||||
|
$"【程序Seg】{ProRunChannelData.ProSegName} " +
|
||||||
|
$"【程序步骤】{ProRunChannelData.MeterStep} " +
|
||||||
|
$"【斜坡打点步骤】{ProRunChannelData.SlopStepNo} " +
|
||||||
|
$"【斜坡打点值SV】{ProRunChannelData.SV} " +
|
||||||
|
$"【Msg】:接受到仿真写入PLC OK ");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " +
|
||||||
|
$"【参数名称】:{ProRunChannelData.MeterName} " +
|
||||||
|
$"【程序Seg】{ProRunChannelData.ProSegName} " +
|
||||||
|
$"【程序步骤】{ProRunChannelData.MeterStep} " +
|
||||||
|
$"【步骤SV】{ProRunChannelData.SV} " +
|
||||||
|
$"【Msg】:接受到步骤仿真写入PLC OK ");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Thread.Sleep(50);
|
||||||
|
//DownLoadPID();
|
||||||
|
//stopwatch.Stop(); //停止Stopwatch
|
||||||
|
//Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString());
|
||||||
|
//stopwatch.Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 下载PID 信息
|
||||||
|
///// </summary>
|
||||||
|
//private void DownLoadPID(ProExModel ProExecuteModel)
|
||||||
|
//{
|
||||||
|
// //上一次PID信息不为空的话则进行比较后再下载
|
||||||
|
// if (ProExecuteModel != null && ProExecuteModel.CurProStepExe != null && ProExecuteModel.LastProStepExe != null)
|
||||||
|
// {
|
||||||
|
// //判断是否比较PID信息
|
||||||
|
// if (ProExecuteModel.CurProStepExe.PIDNo != ProExecuteModel.LastProStepExe.PIDNo)
|
||||||
|
// {
|
||||||
|
// //进行比较跟上一个是否相同
|
||||||
|
// if (ProExecuteModel.CurProStepExe != ProExecuteModel.LastProStepExe)
|
||||||
|
// {
|
||||||
|
// var PlcLoadConfigCell_P = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "P")!;
|
||||||
|
// var PlcLoadConfigCell_I = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "I")!;
|
||||||
|
// var PlcLoadConfigCell_D = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "D")!;
|
||||||
|
// //下载PID信息的P
|
||||||
|
// var ResultP = SiemensDrive.Write(PlcLoadConfigCell_P!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigPIDDto!.P * 1.0 / PlcLoadConfigCell_P.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:PID-P " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigPIDDto!.P}" +
|
||||||
|
// $"【Msg】:{ResultP.Message} ");
|
||||||
|
|
||||||
|
// //下载PID信息的I
|
||||||
|
// var ResultI = SiemensDrive.Write(PlcLoadConfigCell_I!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigPIDDto!.I * 1.0 / PlcLoadConfigCell_I.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:PID-I " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigPIDDto!.I}" +
|
||||||
|
// $"【Msg】:{ResultI.Message} ");
|
||||||
|
|
||||||
|
// //下载PID信息的D
|
||||||
|
// var ResultD = SiemensDrive.Write(PlcLoadConfigCell_D!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigPIDDto!.D * 1.0 / PlcLoadConfigCell_D.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:PID-D " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigPIDDto!.D}" +
|
||||||
|
// $"【Msg】:{ResultD.Message} ");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// //相同的则不需要下载,直接使用上一个的配置
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else//Pid为空的话直接下载,可能是第一个步骤
|
||||||
|
// {
|
||||||
|
// var PlcLoadConfigCell_P = ProExecuteModel!.ListPlcLoadConfigCell.First(a => a.Name == "P")!;
|
||||||
|
// var PlcLoadConfigCell_I = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "I")!;
|
||||||
|
// var PlcLoadConfigCell_D = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "D")!;
|
||||||
|
// //下载PID信息的P
|
||||||
|
// var ResultP = SiemensDrive.Write(PlcLoadConfigCell_P!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigPIDDto!.P * 1.0 / PlcLoadConfigCell_P.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:PID-P " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigPIDDto!.P}" +
|
||||||
|
// $"【Msg】:{ResultP.Message} ");
|
||||||
|
|
||||||
|
// //下载PID信息的I
|
||||||
|
// var ResultI = SiemensDrive.Write(PlcLoadConfigCell_I!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigPIDDto!.I * 1.0 / PlcLoadConfigCell_I.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:PID-I " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigPIDDto!.I}" +
|
||||||
|
// $"【Msg】:{ResultI.Message} ");
|
||||||
|
|
||||||
|
// //下载PID信息的D
|
||||||
|
// var ResultD = SiemensDrive.Write(PlcLoadConfigCell_D!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigPIDDto!.D * 1.0 / PlcLoadConfigCell_D.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:PID-D " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigPIDDto!.D}" +
|
||||||
|
// $"【Msg】:{ResultD.Message} ");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 下载Limit 信息
|
||||||
|
///// </summary>
|
||||||
|
//private void DownLoadLimit(ProExModel ProExecuteModel)
|
||||||
|
//{
|
||||||
|
// //上一次Limit信息不为空的话则进行比较后再下载
|
||||||
|
// if (ProExecuteModel != null && ProExecuteModel.CurProStepExe != null && ProExecuteModel.LastProStepExe != null)
|
||||||
|
// {
|
||||||
|
// //判断是否比较Limit信息
|
||||||
|
// if (ProExecuteModel.CurProStepExe.LimitNo != ProExecuteModel.LastProStepExe.LimitNo)
|
||||||
|
// {
|
||||||
|
// //进行比较跟上一个是否相同
|
||||||
|
// if (ProExecuteModel.CurProStepExe != ProExecuteModel.LastProStepExe)
|
||||||
|
// {
|
||||||
|
// var PlcLoadConfigCell_Up = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "Up")!;
|
||||||
|
// var PlcLoadConfigCell_Down = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "Down")!;
|
||||||
|
// //下载Limit信息的Up
|
||||||
|
// var ResultUp = SiemensDrive.Write(PlcLoadConfigCell_Up!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Up * 1.0 / PlcLoadConfigCell_Up.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:Limit-Up " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Up}" +
|
||||||
|
// $"【Msg】:{ResultUp.Message} ");
|
||||||
|
|
||||||
|
// //下载Limit信息的Down
|
||||||
|
// var ResultDown = SiemensDrive.Write(PlcLoadConfigCell_Down!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Down * 1.0 / PlcLoadConfigCell_Down.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:Limit-Down " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Down}" +
|
||||||
|
// $"【Msg】:{ResultUp.Message} ");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// //相同的则不需要下载,直接使用上一个的配置
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else//Pid为空的话直接下载,可能是第一个步骤
|
||||||
|
// {
|
||||||
|
// var PlcLoadConfigCell_Up = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "Up")!;
|
||||||
|
// var PlcLoadConfigCell_Down = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "Down")!;
|
||||||
|
// //下载Limit信息的Up
|
||||||
|
// var ResultUp = SiemensDrive.Write(PlcLoadConfigCell_Up!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Up * 1.0 / PlcLoadConfigCell_Up.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:Limit-Up " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Up}" +
|
||||||
|
// $"【Msg】:{ResultUp.Message} ");
|
||||||
|
|
||||||
|
// //下载Limit信息的Down
|
||||||
|
// var ResultDown = SiemensDrive.Write(PlcLoadConfigCell_Down!.Address, (double)ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Down * 1.0 / PlcLoadConfigCell_Down.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:Limit-Down " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Down}" +
|
||||||
|
// $"【Msg】:{ResultUp.Message} ");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 下载SV 信息
|
||||||
|
///// </summary>
|
||||||
|
///// <param name="ProExecuteModel"></param>
|
||||||
|
//private void DownLoadSV(ProExModel ProExecuteModel)
|
||||||
|
//{
|
||||||
|
// //上一次SV信息不为空的话则进行比较后再下载
|
||||||
|
// if (ProExecuteModel != null && ProExecuteModel.CurProStepExe != null && ProExecuteModel.LastProStepExe != null)
|
||||||
|
// {
|
||||||
|
// //判断比较SV信息
|
||||||
|
// if (ProExecuteModel.CurProStepExe.EndSV != ProExecuteModel.LastProStepExe.EndSV)
|
||||||
|
// {
|
||||||
|
// //SV配置
|
||||||
|
// var PlcLoadConfigCell_SV = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "SV")!;
|
||||||
|
// //下载SV信息的
|
||||||
|
// var ResultSV = SiemensDrive.Write(PlcLoadConfigCell_SV!.Address, (double)ProExecuteModel.CurProStepExe.EndSV * 1.0 / PlcLoadConfigCell_SV.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:SV " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Up}" +
|
||||||
|
// $"【Msg】:{ResultSV.Message} ");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// //跟上一次的一样,不需要下载了
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else//Pid为空的话直接下载,可能是第一个步骤
|
||||||
|
// {
|
||||||
|
// //SV配置
|
||||||
|
// var PlcLoadConfigCell_SV = ProExecuteModel.ListPlcLoadConfigCell.First(a => a.Name == "SV")!;
|
||||||
|
// //下载SV信息的
|
||||||
|
// var ResultSV = SiemensDrive.Write(PlcLoadConfigCell_SV!.Address, (double)ProExecuteModel.CurProStepExe.EndSV * 1.0 / PlcLoadConfigCell_SV.Precision);
|
||||||
|
// Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 【参数名称】:{ProExecuteModel.MeterName} " +
|
||||||
|
// $"【程序Seg】{ProExecuteModel.CurProStepExe.ProSegName} " +
|
||||||
|
// $"【程序步骤】{ProExecuteModel.CurProStepExe.MeterStep} " +
|
||||||
|
// $"【类型】:{ProExecuteModel.CurProStepExe.ExistSlop.ToString()} " +
|
||||||
|
// $"【参数】:SV " +
|
||||||
|
// $"【值】:{ProExecuteModel.CurProStepExe.CurConfigLimitDto!.Up}" +
|
||||||
|
// $"【Msg】:{ResultSV.Message} ");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
287
CapMachine.Wpf/Tool/CALCHelper.cs
Normal file
287
CapMachine.Wpf/Tool/CALCHelper.cs
Normal file
@@ -0,0 +1,287 @@
|
|||||||
|
using CapMachine.Model;
|
||||||
|
using CapMachine.Wpf.Models.ProModelPars;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CapMachine.Wpf.Tool
|
||||||
|
{
|
||||||
|
public class CALCHelper
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 计算斜率-分
|
||||||
|
/// </summary>
|
||||||
|
public static int GetSlop(double Value1, double Value2, int TimeSed)
|
||||||
|
{
|
||||||
|
var diff = Value2 - Value1;
|
||||||
|
var TimeMin = TimeSed * 1.0 / 60;
|
||||||
|
if (TimeSed == 0) return 0;
|
||||||
|
var Result = (int)Math.Ceiling(diff / TimeMin);
|
||||||
|
if (Result > 9999)
|
||||||
|
{
|
||||||
|
return 9999;
|
||||||
|
}
|
||||||
|
if (Result < -1999)
|
||||||
|
{
|
||||||
|
return -1999;
|
||||||
|
}
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算斜率-秒-DB表
|
||||||
|
/// </summary>
|
||||||
|
public static int GetSlopSed(double Value1, double Value2, int TimeSed)
|
||||||
|
{
|
||||||
|
var diff = Value2 - Value1;
|
||||||
|
//var TimeMin = TimeSed * 1.0 / 60;
|
||||||
|
if (TimeSed == 0) return 0;//0应该是OFF功能
|
||||||
|
var Result = diff / TimeSed;
|
||||||
|
if (Result > 2000)
|
||||||
|
{
|
||||||
|
return 2000;
|
||||||
|
}
|
||||||
|
if (Result < -1999.9)
|
||||||
|
{
|
||||||
|
return -1999;
|
||||||
|
}
|
||||||
|
if (Result >= 0)
|
||||||
|
{
|
||||||
|
return (int)Math.Ceiling(Result);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (int)Math.Floor(Result);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
|
||||||
|
//return (int)Math.Ceiling(Result);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算斜率-分鐘-DB表
|
||||||
|
/// </summary>
|
||||||
|
public static int GetSlopMinute(double Value1, double Value2, int TimeSed)
|
||||||
|
{
|
||||||
|
var diff = Value2 - Value1;
|
||||||
|
var TimeMin = TimeSed * 1.0 / 60;
|
||||||
|
if (TimeSed == 0) return 0;//0应该是OFF功能
|
||||||
|
var Result = diff / TimeMin;
|
||||||
|
if (Result > 2000)
|
||||||
|
{
|
||||||
|
return 2000;
|
||||||
|
}
|
||||||
|
if (Result < -1999.9)
|
||||||
|
{
|
||||||
|
return -1999;
|
||||||
|
}
|
||||||
|
if (Result >= 0)
|
||||||
|
{
|
||||||
|
return (int)Math.Ceiling(Result * 10);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (int)Math.Floor(Result * 10);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算斜率-小时-DB表
|
||||||
|
/// </summary>
|
||||||
|
public static int GetSlopHour(double Value1, double Value2, int TimeSed)
|
||||||
|
{
|
||||||
|
var diff = Value2 - Value1;
|
||||||
|
var TimeHour = TimeSed * 1.0 / 3600;
|
||||||
|
if (TimeSed == 0) return 0;//0应该是OFF功能
|
||||||
|
var Result = diff / TimeHour;
|
||||||
|
if (Result > 2000)
|
||||||
|
{
|
||||||
|
return 2000;
|
||||||
|
}
|
||||||
|
if (Result < -1999.9)
|
||||||
|
{
|
||||||
|
return -1999;
|
||||||
|
}
|
||||||
|
if (Result >= 0)
|
||||||
|
{
|
||||||
|
return (int)Math.Ceiling(Result);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (int)Math.Floor(Result);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计算斜率-秒-DB表 CV
|
||||||
|
/// </summary>
|
||||||
|
public static int GetSlopCVMinute(double Value1, double Value2, int TimeSed)
|
||||||
|
{
|
||||||
|
var diff = Value2 - Value1;
|
||||||
|
//var TimeMin = TimeSed * 1.0 / 60;
|
||||||
|
if (TimeSed == 0) return 0;//0应该是OFF功能
|
||||||
|
var Result = diff / TimeSed;
|
||||||
|
if (Result > 2000)
|
||||||
|
{
|
||||||
|
return 2000;
|
||||||
|
}
|
||||||
|
if (Result < -1999.9)
|
||||||
|
{
|
||||||
|
return -1999;
|
||||||
|
}
|
||||||
|
if (Result >= 0)
|
||||||
|
{
|
||||||
|
return (int)Math.Ceiling(Result);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (int)Math.Floor(Result);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// 计算斜率-秒-DB表
|
||||||
|
///// </summary>
|
||||||
|
//public static int GetSlopSed(double Value1, double Value2, int TimeSed)
|
||||||
|
//{
|
||||||
|
// var diff = Value2 - Value1;
|
||||||
|
// //var TimeMin = TimeSed * 1.0 / 60;
|
||||||
|
// if (TimeSed == 0) return 0;//0应该是OFF功能
|
||||||
|
// var Result = diff / TimeSed;
|
||||||
|
// if (Result > 2000)
|
||||||
|
// {
|
||||||
|
// return 2000 * 10;
|
||||||
|
// }
|
||||||
|
// if (Result < -1999.9)
|
||||||
|
// {
|
||||||
|
// return -1999 * 10;
|
||||||
|
// }
|
||||||
|
// return (int)Math.Ceiling(Result * 10);//乘以10是DB表的通信上的范围数据要求的,实际显示x.x
|
||||||
|
//}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SV值的数据获取
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sourceData"></param>
|
||||||
|
/// <param name="accuracy"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static int GetQuickSV(double sourceData, short accuracy)
|
||||||
|
{
|
||||||
|
return (int)(sourceData * (int)Math.Pow(10, accuracy));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 比较是否有改变的数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="NextData"></param>
|
||||||
|
/// <param name="CurrentData"></param>
|
||||||
|
/// <param name="Field"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool CpStepExecuteCompareInfo(ProStepExe NextData, ProStepExe CurrentData, string Field)
|
||||||
|
{
|
||||||
|
switch (Field)
|
||||||
|
{
|
||||||
|
case "PID":
|
||||||
|
if (NextData.PIDNo == CurrentData.PIDNo) return true;
|
||||||
|
return false;
|
||||||
|
case "SV":
|
||||||
|
if (NextData.EndSV == CurrentData.EndSV) return true;
|
||||||
|
return false;
|
||||||
|
case "Limit":
|
||||||
|
if (NextData.LimitNo == CurrentData.LimitNo) return true;
|
||||||
|
return false;
|
||||||
|
case "Alarm":
|
||||||
|
if (NextData.AlarmNo == CurrentData.AlarmNo) return true;
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 比较是否有改变的数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="NextData"></param>
|
||||||
|
/// <param name="CurrentData"></param>
|
||||||
|
/// <param name="Field"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool KpStepExecuteCompareInfo(ProStepExe NextData, ProStepExe CurrentData, string Field)
|
||||||
|
{
|
||||||
|
switch (Field)
|
||||||
|
{
|
||||||
|
case "PID":
|
||||||
|
if (NextData.PIDNo == CurrentData.PIDNo) return true;
|
||||||
|
return false;
|
||||||
|
case "SV":
|
||||||
|
if (NextData.EndSV == CurrentData.EndSV) return true;
|
||||||
|
return false;
|
||||||
|
case "Limit":
|
||||||
|
if (NextData.LimitNo == CurrentData.LimitNo) return true;
|
||||||
|
return false;
|
||||||
|
case "Alarm":
|
||||||
|
if (NextData.AlarmNo == CurrentData.AlarmNo) return true;
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断Limit下载的次序
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="NextData"></param>
|
||||||
|
/// <param name="CurrentData"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static int CpStepExecuteLimitCompareInfo(ProStepExe NextData, ProStepExe CurrentData)
|
||||||
|
{
|
||||||
|
if (NextData.CurConfigLimitDto.Down >= CurrentData.CurConfigLimitDto.Up)
|
||||||
|
{
|
||||||
|
//先下载Up,后下载Down
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (NextData.CurConfigLimitDto.Up <= CurrentData.CurConfigLimitDto.Down)
|
||||||
|
{
|
||||||
|
//先下载Down,后下载Up
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
//正常下载 Down和Up顺序都可以
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断Limit下载的次序
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="NextData"></param>
|
||||||
|
/// <param name="CurrentData"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static int KpStepExecuteLimitCompareInfo(ProStepExe NextData, ProStepExe CurrentData)
|
||||||
|
{
|
||||||
|
if (NextData.CurConfigLimitDto.Down >= CurrentData.CurConfigLimitDto.Up)
|
||||||
|
{
|
||||||
|
//先下载Up,后下载Down
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (NextData.CurConfigLimitDto.Up <= CurrentData.CurConfigLimitDto.Down)
|
||||||
|
{
|
||||||
|
//先下载Down,后下载Up
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
//正常下载 Down和Up顺序都可以
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//private long GetProDur(QuickStep quickStep)
|
||||||
|
//{
|
||||||
|
// return 0;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,7 +23,7 @@ namespace CapMachine.Wpf.ViewModels
|
|||||||
public class ProConfigViewModel : NavigationViewModel
|
public class ProConfigViewModel : NavigationViewModel
|
||||||
{
|
{
|
||||||
public ProConfigViewModel(IDialogService dialogService, IFreeSql freeSql,
|
public ProConfigViewModel(IDialogService dialogService, IFreeSql freeSql,
|
||||||
IEventAggregator eventAggregator, IRegionManager regionManager, SysRunService sysRunService, ConfigService configService,
|
IEventAggregator eventAggregator, IRegionManager regionManager, SysRunService sysRunService, ConfigService configService, ProRuntimeService proRuntimeService,
|
||||||
MachineRtDataService machineRtDataService)
|
MachineRtDataService machineRtDataService)
|
||||||
{
|
{
|
||||||
//LogService = logService;
|
//LogService = logService;
|
||||||
@@ -32,6 +32,7 @@ namespace CapMachine.Wpf.ViewModels
|
|||||||
RegionManager = regionManager;
|
RegionManager = regionManager;
|
||||||
SysRunService = sysRunService;
|
SysRunService = sysRunService;
|
||||||
ConfigService = configService;
|
ConfigService = configService;
|
||||||
|
ProRuntimeService = proRuntimeService;
|
||||||
this.MachineRtDataService = machineRtDataService;
|
this.MachineRtDataService = machineRtDataService;
|
||||||
|
|
||||||
//MachineDataService = machineDataService;
|
//MachineDataService = machineDataService;
|
||||||
@@ -83,6 +84,7 @@ namespace CapMachine.Wpf.ViewModels
|
|||||||
public IRegionManager RegionManager { get; }
|
public IRegionManager RegionManager { get; }
|
||||||
public SysRunService SysRunService { get; }
|
public SysRunService SysRunService { get; }
|
||||||
public ConfigService ConfigService { get; }
|
public ConfigService ConfigService { get; }
|
||||||
|
public ProRuntimeService ProRuntimeService { get; }
|
||||||
private MachineRtDataService MachineRtDataService { get; }
|
private MachineRtDataService MachineRtDataService { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -2327,48 +2329,50 @@ namespace CapMachine.Wpf.ViewModels
|
|||||||
//返回的数据
|
//返回的数据
|
||||||
List<PlcParsData> ReturnPlcParsData = new List<PlcParsData>();
|
List<PlcParsData> ReturnPlcParsData = new List<PlcParsData>();
|
||||||
|
|
||||||
//var Data=FreeSql.Select<ProSegRun>(
|
ProRuntimeService.LoadProSegRun(ProSegRunListViewItems.ToList());
|
||||||
//以每个程序为单元循环执行
|
|
||||||
foreach (var item in ProSegRunListViewItems)
|
|
||||||
{
|
|
||||||
var FindData = FreeSql.Select<ProgramSeg>(item.ProgramSegId)
|
|
||||||
.IncludeMany(a => a.ProSteps,
|
|
||||||
then => then.IncludeMany(b => b.MeterSpeeds)
|
|
||||||
.IncludeMany(b => b.MeterCond1Temps)
|
|
||||||
.IncludeMany(b => b.MeterCond2Temps)
|
|
||||||
.IncludeMany(b => b.MeterCond2Presss)
|
|
||||||
.IncludeMany(b => b.MeterEVAPExpTemps)
|
|
||||||
.IncludeMany(b => b.MeterExPresss)
|
|
||||||
.IncludeMany(b => b.MeterHVVols)
|
|
||||||
.IncludeMany(b => b.MeterInhPresss)
|
|
||||||
.IncludeMany(b => b.MeterInhTemps)
|
|
||||||
.IncludeMany(b => b.MeterLubePresss)
|
|
||||||
.IncludeMany(b => b.MeterLVVols)
|
|
||||||
.IncludeMany(b => b.MeterOCRs)
|
|
||||||
.IncludeMany(b => b.MeterOS1Temps)
|
|
||||||
.IncludeMany(b => b.MeterOS2Temps)
|
|
||||||
.IncludeMany(b => b.MeterPTCEntTemps)
|
|
||||||
.IncludeMany(b => b.MeterPTCFlows)
|
|
||||||
.IncludeMany(b => b.MeterPTCPws)
|
|
||||||
.IncludeMany(b => b.MeterEnvRHs)
|
|
||||||
.IncludeMany(b => b.MeterEnvTemps)
|
|
||||||
).ToList().FirstOrDefault();
|
|
||||||
|
|
||||||
if (FindData != null && FindData.ProSteps != null && FindData.ProSteps.Any())
|
////var Data=FreeSql.Select<ProSegRun>(
|
||||||
{
|
////以每个程序为单元循环执行
|
||||||
//执行程序的步骤集合数据
|
//foreach (var item in ProSegRunListViewItems)
|
||||||
ReturnPlcParsData = ProParsSongZhiHelper.GetPlcParsData(FindData.ProSteps, FindData.ProRepeat);
|
//{
|
||||||
//把次数给PLC,那么此时应该是最后一个程序给PLC了
|
// var FindData = FreeSql.Select<ProgramSeg>(item.ProgramSegId)
|
||||||
ProParsSongZhiHelper.LoadProCycleToPlc(MachineRtDataService.SiemensDrive, FindData.ProRepeat);
|
// .IncludeMany(a => a.ProSteps,
|
||||||
}
|
// then => then.IncludeMany(b => b.MeterSpeeds)
|
||||||
}
|
// .IncludeMany(b => b.MeterCond1Temps)
|
||||||
|
// .IncludeMany(b => b.MeterCond2Temps)
|
||||||
|
// .IncludeMany(b => b.MeterCond2Presss)
|
||||||
|
// .IncludeMany(b => b.MeterEVAPExpTemps)
|
||||||
|
// .IncludeMany(b => b.MeterExPresss)
|
||||||
|
// .IncludeMany(b => b.MeterHVVols)
|
||||||
|
// .IncludeMany(b => b.MeterInhPresss)
|
||||||
|
// .IncludeMany(b => b.MeterInhTemps)
|
||||||
|
// .IncludeMany(b => b.MeterLubePresss)
|
||||||
|
// .IncludeMany(b => b.MeterLVVols)
|
||||||
|
// .IncludeMany(b => b.MeterOCRs)
|
||||||
|
// .IncludeMany(b => b.MeterOS1Temps)
|
||||||
|
// .IncludeMany(b => b.MeterOS2Temps)
|
||||||
|
// .IncludeMany(b => b.MeterPTCEntTemps)
|
||||||
|
// .IncludeMany(b => b.MeterPTCFlows)
|
||||||
|
// .IncludeMany(b => b.MeterPTCPws)
|
||||||
|
// .IncludeMany(b => b.MeterEnvRHs)
|
||||||
|
// .IncludeMany(b => b.MeterEnvTemps)
|
||||||
|
// ).ToList().FirstOrDefault();
|
||||||
|
|
||||||
//防止上一次下载的程序多余当前的步骤,为了清空多余的步骤数据,增加一行的数据
|
// if (FindData != null && FindData.ProSteps != null && FindData.ProSteps.Any())
|
||||||
ReturnPlcParsData = ProParsSongZhiHelper.AddNullData(ReturnPlcParsData);
|
// {
|
||||||
//装载PLC地址
|
// //执行程序的步骤集合数据
|
||||||
ReturnPlcParsData = ProParsSongZhiHelper.LoadPlcCellAddress(ReturnPlcParsData);
|
// ReturnPlcParsData = ProParsSongZhiHelper.GetPlcParsData(FindData.ProSteps, FindData.ProRepeat);
|
||||||
|
// //把次数给PLC,那么此时应该是最后一个程序给PLC了
|
||||||
|
// ProParsSongZhiHelper.LoadProCycleToPlc(MachineRtDataService.SiemensDrive, FindData.ProRepeat);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
ProParsSongZhiHelper.LoadDataToPLC(MachineRtDataService.SiemensDrive, ReturnPlcParsData);
|
////防止上一次下载的程序多余当前的步骤,为了清空多余的步骤数据,增加一行的数据
|
||||||
|
//ReturnPlcParsData = ProParsSongZhiHelper.AddNullData(ReturnPlcParsData);
|
||||||
|
////装载PLC地址
|
||||||
|
//ReturnPlcParsData = ProParsSongZhiHelper.LoadPlcCellAddress(ReturnPlcParsData);
|
||||||
|
|
||||||
|
//ProParsSongZhiHelper.LoadDataToPLC(MachineRtDataService.SiemensDrive, ReturnPlcParsData);
|
||||||
|
|
||||||
//下载完成的话,则标记状态
|
//下载完成的话,则标记状态
|
||||||
SysRunService.MachineRunState1.IsProLoad = true;
|
SysRunService.MachineRunState1.IsProLoad = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user