diff --git a/CapMachine.Model/MeterConfig/MeterSpeed.cs b/CapMachine.Model/MeterConfig/MeterSpeed.cs index 535eeda..92d6b74 100644 --- a/CapMachine.Model/MeterConfig/MeterSpeed.cs +++ b/CapMachine.Model/MeterConfig/MeterSpeed.cs @@ -68,41 +68,62 @@ namespace CapMachine.Model [Column(Name = "OutLock")] public bool OutLock { get; set; } - /// - ///参数编号(1~16) - /// 跟随速度步骤的常值数据 - /// - [Column(Name = "ParNo")] - public int ParNo { get; set; } + ///// + /////参数编号(1~16) + ///// 跟随速度步骤的常值数据 + ///// + //[Column(Name = "ParNo")] + //public int ParNo { get; set; } /// ///EV(1~4) + ///对应4个阀门 /// 跟随速度步骤的常值数据 /// [Column(Name = "Ev")] public int Ev { get; set; } - // + /// /// 压缩机使能(0/1) /// 跟随速度步骤的常值数据 /// [Column(Name = "CapEnable")] public bool CapEnable { get; set; } - // + /// /// 吸排气阀(0/1) /// 跟随速度步骤的常值数据 /// [Column(Name = "InhExhValve")] public bool InhExhValve { get; set; } - // + /// /// 加热器使能(0/1)PTC使能 /// 跟随速度步骤的常值数据 /// [Column(Name = "PTCEnable")] public bool PTCEnable { get; set; } + /// + /// PID No + /// 跟随速度步骤的常值数据 + /// + [Column(Name = "PIDNo")] + public int PIDNo { get; set; } + + /// + /// 限幅 No + /// 跟随速度步骤的常值数据 + /// + [Column(Name = "LimitNo")] + public int LimitNo { get; set; } + + /// + /// 报警 No + /// 跟随速度步骤的常值数据 + /// + [Column(Name = "AlarmNo")] + public int AlarmNo { get; set; } [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] public DateTime CreateTime { get; set; } diff --git a/CapMachine.Wpf/MapperProfile/ConfigAlarmProfile.cs b/CapMachine.Wpf/MapperProfile/ConfigAlarmProfile.cs new file mode 100644 index 0000000..004f886 --- /dev/null +++ b/CapMachine.Wpf/MapperProfile/ConfigAlarmProfile.cs @@ -0,0 +1,14 @@ +using AutoMapper; +using CapMachine.Model; +using CapMachine.Wpf.Dtos; + +namespace CapMachine.Wpf.MapperProfile +{ + public class ConfigAlarmProfile : Profile + { + public ConfigAlarmProfile() + { + CreateMap().ReverseMap(); + } + } +} diff --git a/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs b/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs index de0a758..bfdab53 100644 --- a/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs +++ b/CapMachine.Wpf/Models/ProModelPars/ProExModel.cs @@ -202,7 +202,7 @@ namespace CapMachine.Wpf.Models.ProModelPars } else//不存在斜坡数据的话,则直接发送EndSV数据即可 { - ProRunChannel.Writer.TryWrite(new ProRunChannelData() + ProRunChannel.Writer.WriteAsync(new ProRunChannelData() { MeterName = MeterName, SV = NextProStepExe.EndSV, @@ -237,7 +237,6 @@ namespace CapMachine.Wpf.Models.ProModelPars ListProStepExe.FindFirst(a => a.MeterStep == LastProStepExe.MeterStep).MeterStepIsOK = true; } - //设置下一步步骤数据 if (ListProStepExe.Where(x => x.MeterStep == CurProStepExe.MeterStep + 1).Any()) { @@ -258,7 +257,7 @@ namespace CapMachine.Wpf.Models.ProModelPars //设置下一步步骤运行时间 RunEnable = true; - + } else { @@ -314,6 +313,7 @@ namespace CapMachine.Wpf.Models.ProModelPars /// private void StartSlopExStep() { + //用SlopExEnable控制,存在一个可能,就是设置后,立刻执行,那么第一个步骤(第一秒)时间会被压缩,后面就正常了。最大是快一秒了,第一秒提前打点,这是可以接受的。 SlopExEnable = true; } diff --git a/CapMachine.Wpf/Models/ProModelPars/ProStepExe.cs b/CapMachine.Wpf/Models/ProModelPars/ProStepExe.cs index 46330b5..556f0ac 100644 --- a/CapMachine.Wpf/Models/ProModelPars/ProStepExe.cs +++ b/CapMachine.Wpf/Models/ProModelPars/ProStepExe.cs @@ -131,5 +131,9 @@ namespace CapMachine.Wpf.Models.ProModelPars /// public int AlarmNo { get; set; } + /// + /// AlarmNo的配置信息 + /// + public ConfigAlarmDto? CurConfigAlarmDto { get; set; } } } diff --git a/CapMachine.Wpf/ProPars/ProParsHelper.cs b/CapMachine.Wpf/ProPars/ProParsHelper.cs index d936d20..8ab1204 100644 --- a/CapMachine.Wpf/ProPars/ProParsHelper.cs +++ b/CapMachine.Wpf/ProPars/ProParsHelper.cs @@ -58,7 +58,10 @@ namespace CapMachine.Wpf.ProPars new PlcParsData(){ Name="压缩机环境温度",EnName="EnvTemp",Step=100,SetAddressInfo=AddressInfo.NoCycle,Steps=new List(),Ratio=10,Unit="" ,ValueStartAddress=1026,MinStartAddress=1084,SecStartAddress=1086,CycleStartAddress=0 }, new PlcParsData(){ Name="输出锁定",EnName="OutLock",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1038,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, - new PlcParsData(){ Name="参数编号",EnName="ParNo",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1040,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, + //new PlcParsData(){ Name="参数编号",EnName="ParNo",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1040,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, + new PlcParsData(){ Name="PID编号",EnName="PIDNo",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1040,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, + new PlcParsData(){ Name="限幅编号",EnName="LimitNo",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1040,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, + new PlcParsData(){ Name="报警编号",EnName="AlarmNo",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1040,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, new PlcParsData(){ Name="EV",EnName="EV",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1042,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, new PlcParsData(){ Name="压缩机使能",EnName="CapEnable",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1044,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, new PlcParsData(){ Name="吸排气阀",EnName="InhExhValve",Step=100,SetAddressInfo=AddressInfo.NoTimeAndCycle,Steps=new List(),Ratio=1,Unit="" ,ValueStartAddress=1046,MinStartAddress=0,SecStartAddress=0,CycleStartAddress=0 }, @@ -311,10 +314,25 @@ namespace CapMachine.Wpf.ProPars OutLockData.Value = Convert.ToDouble(item.OutLock); FindOutLock.Steps.Add(OutLockData); - var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); - var ParNoData = plcMeterStepCell.DeepClone(); - ParNoData.Value = Convert.ToDouble(item.ParNo); - FindParNo.Steps.Add(ParNoData); + //var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); + //var ParNoData = plcMeterStepCell.DeepClone(); + //ParNoData.Value = Convert.ToDouble(item.ParNo); + //FindParNo.Steps.Add(ParNoData); + + var FindPidNo = ListPlcParsData.Find(a => a.Name.Equals("PID编号")); + var PidNoData = plcMeterStepCell.DeepClone(); + PidNoData.Value = Convert.ToDouble(item.PIDNo); + FindPidNo.Steps.Add(PidNoData); + + var FindLimitNo = ListPlcParsData.Find(a => a.Name.Equals("限幅编号")); + var LimitNoData = plcMeterStepCell.DeepClone(); + LimitNoData.Value = Convert.ToDouble(item.LimitNo); + FindLimitNo.Steps.Add(LimitNoData); + + var FindAlarmNo = ListPlcParsData.Find(a => a.Name.Equals("报警编号")); + var AlarmNoData = plcMeterStepCell.DeepClone(); + AlarmNoData.Value = Convert.ToDouble(item.AlarmNo); + FindAlarmNo.Steps.Add(AlarmNoData); var FindEV = ListPlcParsData.Find(a => a.Name.Equals("EV")); var EVData = plcMeterStepCell.DeepClone(); @@ -364,10 +382,25 @@ namespace CapMachine.Wpf.ProPars OutLockData.Value = Convert.ToDouble(Data.OutLock); FindOutLock.Steps.Add(OutLockData); - var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); - var ParNoData = plcMeterStepCell.DeepClone(); - ParNoData.Value = Convert.ToDouble(Data.ParNo); - FindParNo.Steps.Add(ParNoData); + //var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); + //var ParNoData = plcMeterStepCell.DeepClone(); + //ParNoData.Value = Convert.ToDouble(Data.ParNo); + //FindParNo.Steps.Add(ParNoData); + + var FindPidNo = ListPlcParsData.Find(a => a.Name.Equals("PID编号")); + var PidNoData = plcMeterStepCell.DeepClone(); + PidNoData.Value = Convert.ToDouble(Data.PIDNo); + FindPidNo.Steps.Add(PidNoData); + + var FindLimitNo = ListPlcParsData.Find(a => a.Name.Equals("限幅编号")); + var LimitNoData = plcMeterStepCell.DeepClone(); + LimitNoData.Value = Convert.ToDouble(Data.LimitNo); + FindLimitNo.Steps.Add(LimitNoData); + + var FindAlarmNo = ListPlcParsData.Find(a => a.Name.Equals("报警编号")); + var AlarmNoData = plcMeterStepCell.DeepClone(); + AlarmNoData.Value = Convert.ToDouble(Data.AlarmNo); + FindAlarmNo.Steps.Add(AlarmNoData); var FindEV = ListPlcParsData.Find(a => a.Name.Equals("EV")); var EVData = plcMeterStepCell.DeepClone(); diff --git a/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs b/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs index 3db1da9..158b7bc 100644 --- a/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs +++ b/CapMachine.Wpf/ProPars/ProParsSongZhiHelper.cs @@ -365,10 +365,25 @@ namespace CapMachine.Wpf.ProPars OutLockData.Value = Convert.ToDouble(item.OutLock); FindOutLock.Steps.Add(OutLockData); - var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); - var ParNoData = plcMeterStepCell.DeepClone(); - ParNoData.Value = Convert.ToDouble(item.ParNo); - FindParNo.Steps.Add(ParNoData); + //var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); + //var ParNoData = plcMeterStepCell.DeepClone(); + //ParNoData.Value = Convert.ToDouble(item.ParNo); + //FindParNo.Steps.Add(ParNoData); + + var FindPidNo = ListPlcParsData.Find(a => a.Name.Equals("PID编号")); + var PidNoData = plcMeterStepCell.DeepClone(); + PidNoData.Value = Convert.ToDouble(item.PIDNo); + FindPidNo.Steps.Add(PidNoData); + + var FindLimitNo = ListPlcParsData.Find(a => a.Name.Equals("限幅编号")); + var LimitNoData = plcMeterStepCell.DeepClone(); + LimitNoData.Value = Convert.ToDouble(item.LimitNo); + FindLimitNo.Steps.Add(LimitNoData); + + var FindAlarmNo = ListPlcParsData.Find(a => a.Name.Equals("报警编号")); + var AlarmNoData = plcMeterStepCell.DeepClone(); + AlarmNoData.Value = Convert.ToDouble(item.AlarmNo); + FindAlarmNo.Steps.Add(AlarmNoData); var FindEV = ListPlcParsData.Find(a => a.Name.Equals("EV")); var EVData = plcMeterStepCell.DeepClone(); @@ -418,10 +433,25 @@ namespace CapMachine.Wpf.ProPars OutLockData.Value = Convert.ToDouble(Data.OutLock); FindOutLock.Steps.Add(OutLockData); - var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); - var ParNoData = plcMeterStepCell.DeepClone(); - ParNoData.Value = Convert.ToDouble(Data.ParNo); - FindParNo.Steps.Add(ParNoData); + //var FindParNo = ListPlcParsData.Find(a => a.Name.Equals("参数编号")); + //var ParNoData = plcMeterStepCell.DeepClone(); + //ParNoData.Value = Convert.ToDouble(Data.ParNo); + //FindParNo.Steps.Add(ParNoData); + + var FindPidNo = ListPlcParsData.Find(a => a.Name.Equals("PID编号")); + var PidNoData = plcMeterStepCell.DeepClone(); + PidNoData.Value = Convert.ToDouble(Data.PIDNo); + FindPidNo.Steps.Add(PidNoData); + + var FindLimitNo = ListPlcParsData.Find(a => a.Name.Equals("限幅编号")); + var LimitNoData = plcMeterStepCell.DeepClone(); + LimitNoData.Value = Convert.ToDouble(Data.LimitNo); + FindLimitNo.Steps.Add(LimitNoData); + + var FindAlarmNo = ListPlcParsData.Find(a => a.Name.Equals("报警编号")); + var AlarmNoData = plcMeterStepCell.DeepClone(); + AlarmNoData.Value = Convert.ToDouble(Data.AlarmNo); + FindAlarmNo.Steps.Add(AlarmNoData); var FindEV = ListPlcParsData.Find(a => a.Name.Equals("EV")); var EVData = plcMeterStepCell.DeepClone(); diff --git a/CapMachine.Wpf/Services/MachineRtDataService.cs b/CapMachine.Wpf/Services/MachineRtDataService.cs index b8347c3..cdb18f9 100644 --- a/CapMachine.Wpf/Services/MachineRtDataService.cs +++ b/CapMachine.Wpf/Services/MachineRtDataService.cs @@ -1,7 +1,9 @@ using AutoMapper.Internal; using CapMachine.Core; +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 HslCommunication; @@ -16,6 +18,7 @@ using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Text; +using System.Threading.Channels; using System.Threading.Tasks; using System.Timers; using System.Windows; @@ -148,51 +151,51 @@ namespace CapMachine.Wpf.Services #region 标签管理 ////三电 Sample - TagManger.AddTag(new Tag("转速", "转速[rpm]", "Speed", "程序", "VW15000", 100, 0, 1, "rpm", new ShortTagValue(), true) { DecimalPoint = 0 }); - TagManger.AddTag(new Tag("排气压力", "排气压力[BarA]", "ExPress", "程序", "VW15002", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("吸气压力", "吸气压力[BarA]", "InhPress", "程序", "VW15004", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("吸气温度", "吸气温度[℃]", "InhTemp", "程序", "VW15006", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("COND1温度", "COND1温度[℃]", "Cond1Temp", "程序", "VW15008", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("润滑油压力", "润滑油压力[BarA]", "LubePress", "程序", "VW15010", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("COND2压力", "COND2压力[BarA]", "Cond2Press", "程序", "VW15012", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("OCR", "OCR[%]", "OCR", "程序", "VW15014", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("HV[V]", "HV[V]", "HV", "程序", "VW15016", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("HV[A]", "HV[A]", "HVCur", "程序", "VW15018", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("HV[W]", "HV[W]", "HVPw", "程序", "VW15020", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("LV[V]", "LV[V]", "LV", "程序", "VW15022", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1 }); + TagManger.AddTag(new Tag("转速", "转速[rpm]", "Speed", "程序", "VW15000", 100, 0, 1, "rpm", new ShortTagValue(), true) { DecimalPoint = 0, IsMeter = true, }); + TagManger.AddTag(new Tag("排气压力", "排气压力[BarA]", "ExPress", "程序", "VW15002", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("吸气压力", "吸气压力[BarA]", "InhPress", "程序", "VW15004", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("吸气温度", "吸气温度[℃]", "InhTemp", "程序", "VW15006", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("COND1温度", "COND1温度[℃]", "Cond1Temp", "程序", "VW15008", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("润滑油压力", "润滑油压力[BarA]", "LubePress", "程序", "VW15010", 100, 0, 100, "BarA", new ShortTagValue(), true) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("COND2压力", "COND2压力[BarA]", "Cond2Press", "程序", "VW15012", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("OCR", "OCR[%]", "OCR", "程序", "VW15014", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("HV[V]", "HV[V]", "HV", "程序", "VW15016", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("HV[A]", "HV[A]", "HVCur", "程序", "VW15018", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("HV[W]", "HV[W]", "HVPw", "程序", "VW15020", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("LV[V]", "LV[V]", "LV", "程序", "VW15022", 100, 0, 10, "V", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); //TagManger.AddTag(new Tag("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("环境温度", "环境温度[℃]", "EnvTemp", "程序", "VW15026", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1 }); + TagManger.AddTag(new Tag("LV[A]", "LV[A]", "LVCur", "程序", "VW15024", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("环境温度", "环境温度[℃]", "EnvTemp", "程序", "VW15026", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); //TagManger.AddTag(new Tag("环境湿度", "环境湿度[%]", "EnvRH", "程序", "VW15028", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("环境湿度", "环境湿度[%]", "EnvRH", "程序", "VW15028", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("OS1温度", "OS1温度[℃]", "OS1Temp", "程序", "VW15030", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("OS2温度", "OS2温度[℃]", "OS2Temp", "程序", "VW15032", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("COND2温度", "COND2温度[℃]", "Cond2Temp", "程序", "VW15034", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("EVAP出口温度", "EVAP出口温度[℃]", "EVAPExpTemp", "程序", "VW15036", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); + TagManger.AddTag(new Tag("环境湿度", "环境湿度[%]", "EnvRH", "程序", "VW15028", 100, 0, 10, "%", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("OS1温度", "OS1温度[℃]", "OS1Temp", "程序", "VW15030", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("OS2温度", "OS2温度[℃]", "OS2Temp", "程序", "VW15032", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("COND2温度", "COND2温度[℃]", "Cond2Temp", "程序", "VW15034", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("EVAP出口温度", "EVAP出口温度[℃]", "EVAPExpTemp", "程序", "VW15036", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); //TagManger.AddTag(new Tag("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("润滑油流量", "润滑油流量[L/min]", "LubeFlow", "程序", "VW15040", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("排气温度", "排气温度[℃]", "ExTemp", "程序", "VW15042", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("膨胀阀前压力", "膨胀阀前压力[BarA]", "TxvFrPress", "程序", "VW15044", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("膨胀阀前温度", "膨胀阀前温度[℃]", "TxvFrTemp", "程序", "VW15046", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("EVAP出口压力", "EVAP出口压力[BarA]", "EVAPExpPress", "程序", "VW15048", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("腔内压力", "腔内压力[BarA]", "IntrplPress", "程序", "VW15050", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("压缩机表面温度", "压缩机表面温度[℃]", "CapSurfTemp", "程序", "VW15052", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("PTC流量", "PTC流量[L/min]", "PTCFlow", "程序", "VW15054", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("PTC入水温度", "PTC入水温度[℃]", "PTCEntTemp", "程序", "VW15056", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("PTC出水温度", "PTC出水温度[℃]", "PTCExpTemp", "程序", "VW15058", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯Cmp母线电流", "通讯Cmp母线电流[A]", "ComCapBusCur", "程序", "VW15060", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2 }); - TagManger.AddTag(new Tag("通讯Cmp母线电压", "通讯Cmp母线电压[V]", "ComCapBusVol", "程序", "VW15062", 100, 0, 10, "V", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯Cmp逆变器温度", "通讯Cmp逆变器温度[℃]", "ComCapInvTemp", "程序", "VW15064", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 }); - TagManger.AddTag(new Tag("通讯Cmp相电流", "通讯Cmp相电流[A]", "ComCapPhCur", "程序", "VW15066", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯Cmp功率", "通讯Cmp功率[W]", "ComCapPw", "程序", "VW15068", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯Cmp芯片温度", "通讯Cmp芯片温度[℃]", "ComCapChipTemp", "程序", "VW15070", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 }); - TagManger.AddTag(new Tag("通讯PTC入水温度", "通讯PTC入水温度[℃]", "ComPTCEntTemp", "程序", "VW15072", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯PTC出水温度", "通讯PTC出水温度[℃]", "ComPTCExpTemp", "程序", "VW15074", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯PTC峰值电流", "通讯PTC峰值电流[A]", "ComPTCPeakCur", "程序", "VW15076", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯PTC母线电流", "通讯PTC母线电流[A]", "ComPTCBusCur", "程序", "VW15078", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1 }); - TagManger.AddTag(new Tag("通讯PTC膜温", "通讯PTC膜温[℃]", "ComPTCFlmTemp", "程序", "VW15080", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 }); - TagManger.AddTag(new Tag("通讯PTC模块温度", "通讯PTC模块温度[℃]", "ComPTCMdTemp", "程序", "VW15082", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0 }); + TagManger.AddTag(new Tag("冷媒流量", "冷媒流量[L/min]", "VRV", "程序", "VW15038", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("润滑油流量", "润滑油流量[L/min]", "LubeFlow", "程序", "VW15040", 100, 0, 10, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("排气温度", "排气温度[℃]", "ExTemp", "程序", "VW15042", 100, 0, 10, "℃", new ShortTagValue(), true) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("膨胀阀前压力", "膨胀阀前压力[BarA]", "TxvFrPress", "程序", "VW15044", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("膨胀阀前温度", "膨胀阀前温度[℃]", "TxvFrTemp", "程序", "VW15046", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("EVAP出口压力", "EVAP出口压力[BarA]", "EVAPExpPress", "程序", "VW15048", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("腔内压力", "腔内压力[BarA]", "IntrplPress", "程序", "VW15050", 100, 0, 100, "BarA", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = true }); + TagManger.AddTag(new Tag("压缩机表面温度", "压缩机表面温度[℃]", "CapSurfTemp", "程序", "VW15052", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("PTC流量", "PTC流量[L/min]", "PTCFlow", "程序", "VW15054", 100, 0, 1, "L/min", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("PTC入水温度", "PTC入水温度[℃]", "PTCEntTemp", "程序", "VW15056", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("PTC出水温度", "PTC出水温度[℃]", "PTCExpTemp", "程序", "VW15058", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = true }); + TagManger.AddTag(new Tag("通讯Cmp母线电流", "通讯Cmp母线电流[A]", "ComCapBusCur", "程序", "VW15060", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 2, IsMeter = false }); + TagManger.AddTag(new Tag("通讯Cmp母线电压", "通讯Cmp母线电压[V]", "ComCapBusVol", "程序", "VW15062", 100, 0, 10, "V", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false }); + TagManger.AddTag(new Tag("通讯Cmp逆变器温度", "通讯Cmp逆变器温度[℃]", "ComCapInvTemp", "程序", "VW15064", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0, IsMeter = false }); + TagManger.AddTag(new Tag("通讯Cmp相电流", "通讯Cmp相电流[A]", "ComCapPhCur", "程序", "VW15066", 100, 0, 100, "A", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false }); + TagManger.AddTag(new Tag("通讯Cmp功率", "通讯Cmp功率[W]", "ComCapPw", "程序", "VW15068", 100, 0, 1, "W", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false }); + TagManger.AddTag(new Tag("通讯Cmp芯片温度", "通讯Cmp芯片温度[℃]", "ComCapChipTemp", "程序", "VW15070", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0, IsMeter = false }); + TagManger.AddTag(new Tag("通讯PTC入水温度", "通讯PTC入水温度[℃]", "ComPTCEntTemp", "程序", "VW15072", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false }); + TagManger.AddTag(new Tag("通讯PTC出水温度", "通讯PTC出水温度[℃]", "ComPTCExpTemp", "程序", "VW15074", 100, 0, 10, "℃", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false }); + TagManger.AddTag(new Tag("通讯PTC峰值电流", "通讯PTC峰值电流[A]", "ComPTCPeakCur", "程序", "VW15076", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false }); + TagManger.AddTag(new Tag("通讯PTC母线电流", "通讯PTC母线电流[A]", "ComPTCBusCur", "程序", "VW15078", 100, 0, 1, "A", new ShortTagValue(), false) { DecimalPoint = 1, IsMeter = false }); + TagManger.AddTag(new Tag("通讯PTC膜温", "通讯PTC膜温[℃]", "ComPTCFlmTemp", "程序", "VW15080", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0, IsMeter = false }); + TagManger.AddTag(new Tag("通讯PTC模块温度", "通讯PTC模块温度[℃]", "ComPTCMdTemp", "程序", "VW15082", 100, 0, 1, "℃", new ShortTagValue(), false) { DecimalPoint = 0, IsMeter = false }); #endregion @@ -1050,7 +1053,7 @@ namespace CapMachine.Wpf.Services private void InitialPLCCom() { var IPInfo = ConfigHelper.GetValue("PLCIP"); - + SiemensDrive = new SiemensS7Net(SiemensPLCS.S200Smart, IPInfo); // 连接对象 @@ -1137,11 +1140,14 @@ namespace CapMachine.Wpf.Services while (ThreadEnable) { - //await Task.Delay(5); - await Task.CompletedTask; + + //await Task.CompletedTask; DiagnosticsTime.Reset(); DiagnosticsTime.Start(); + + await Task.Delay(200); + try { //TagInfo.RtValue.Value++; @@ -1403,6 +1409,10 @@ namespace CapMachine.Wpf.Services } } + //程序步骤的写入 + ProRunStepWrite(); + + //stopwatch.Stop(); //停止Stopwatch //Console.WriteLine("Add Elapsed output runTime:{0}", stopwatch.Elapsed.TotalSeconds.ToString()); //stopwatch.Reset(); @@ -1470,7 +1480,7 @@ namespace CapMachine.Wpf.Services } DiagnosticsTime.Stop(); - ConfigService.PlcCycleTime = (int)DiagnosticsTime.Elapsed.TotalMilliseconds - 300; + ConfigService.PlcCycleTime = (int)DiagnosticsTime.Elapsed.TotalMilliseconds; //Console.WriteLine($"扫描时间:{DiagnosticsTime.Elapsed.TotalMilliseconds.ToString()}"); } }); @@ -1511,5 +1521,105 @@ namespace CapMachine.Wpf.Services }); } + + + + #region 队列数据 + + + /// + /// 队列通道 + /// 当前队列消费触发的数据记录 + /// + public Channel ProRunChannel = Channel.CreateUnbounded(new UnboundedChannelOptions() + { + SingleWriter = false,//允许一次写入多条数据 + SingleReader = true //一次只能读取一条消息 + }); + + ///// + ///// 程序执行管道监听方法 + ///// + ///// + //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(); + // } + // } + //} + + + /// + /// 运行步骤写入 + /// + private void ProRunStepWrite() + { + while (ProRunChannel.Reader.TryRead(out var ProRunChannelData)) + { + ////第一次计时 + //stopwatch.Start(); //启动Stopwatch + if (ProRunChannelData.RunStepType == RunStepType.SlopCell) + { + SiemensDrive.Write("D1", (short)ProRunChannelData.SV); + Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " + + $"【参数名称】:{ProRunChannelData.MeterName} " + + $"【程序Seg】{ProRunChannelData.ProSegName} " + + $"【程序步骤】{ProRunChannelData.MeterStep} " + + $"【斜坡打点步骤】{ProRunChannelData.SlopStepNo} " + + $"【斜坡打点值SV】{ProRunChannelData.SV} " + + $"【Msg】:接受到仿真写入PLC OK "); + } + else + { + SiemensDrive.Write("D1", (short)ProRunChannelData.SV); + Console.WriteLine($"【时间】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} " + + $"【参数名称】:{ProRunChannelData.MeterName} " + + $"【程序Seg】{ProRunChannelData.ProSegName} " + + $"【程序步骤】{ProRunChannelData.MeterStep} " + + $"【步骤SV】{ProRunChannelData.SV} " + + $"【Msg】:接受到步骤仿真写入PLC OK "); + } + + + Thread.Sleep(50); + //DownLoadPID(); + //stopwatch.Stop(); //停止Stopwatch + //Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString()); + //stopwatch.Reset(); + } + } + + #endregion } } diff --git a/CapMachine.Wpf/Services/ProRuntimeService.cs b/CapMachine.Wpf/Services/ProRuntimeService.cs index 68da2de..3803eee 100644 --- a/CapMachine.Wpf/Services/ProRuntimeService.cs +++ b/CapMachine.Wpf/Services/ProRuntimeService.cs @@ -22,6 +22,7 @@ using static CapMachine.Wpf.Models.ComEnum; using System.Windows.Forms; using HslCommunication.Profinet.Siemens; using Masuit.Tools.Hardware; +using CapMachine.Model.MeterConfig; namespace CapMachine.Wpf.Services { @@ -39,6 +40,7 @@ namespace CapMachine.Wpf.Services FreeSql = freeSql; Mapper = mapper; MachineRtDataService = machineRtDataService; + ProRunChannel = MachineRtDataService.ProRunChannel; LogService = logService; //实例化函数 @@ -141,11 +143,27 @@ namespace CapMachine.Wpf.Services } }; + //从变量集合中加载PLC转制的配置数据 + ListPlcLoadConfigCell = new List(); + foreach (var itemKeyValue in MachineRtDataService.TagManger.DicTags) + { + //是否未仪表的参数 + if (itemKeyValue.Value.IsMeter) + { + ListPlcLoadConfigCell.Add(new PlcLoadConfigCell() + { + Name = itemKeyValue.Key, + Address = itemKeyValue.Value.SVAddress, + Precision = itemKeyValue.Value.Precision, + }); + } + } + //驱动实例 SiemensDrive = MachineRtDataService.SiemensDrive; //程序运行实时管道数据监听 - Task.Run(() => ListenProRunChannelAction()); + //Task.Run(() => ListenProRunChannelAction()); } /// @@ -179,6 +197,7 @@ namespace CapMachine.Wpf.Services /// /// 加载选中的程序运行集合 + /// 目前步骤设置常值,是OK的,但是在斜坡多步骤里面也可以设置 50-50 10秒的常值设置,那么在打点时,上面的两个常值都能识别 /// public void LoadProSegRun(List SelectedListProSegRun) { @@ -232,83 +251,31 @@ namespace CapMachine.Wpf.Services { //单行步骤中包含多个仪表参数的配置,需要逐个仪表参数手动操作解析 - //********* 单个速度步骤信息的解析 ********* - var CurMeterName = "速度"; - if (itemStep.MeterSpeeds != null && itemStep.MeterSpeeds.Any()) + //********* 单个【速度】步骤信息的解析 ********* { - switch (itemStep.MeterSpeeds.FirstOrDefault()!.ValueType) + var CurMeterName = "速度"; + if (itemStep.MeterSpeeds != null && itemStep.MeterSpeeds.Any()) { - case ConfigValueType.Constant: //常值 - //常值的话就一个数据,循环执行一次 - foreach (var itemMeterValueCell in itemStep.MeterSpeeds) - { - var Pid = new ConfigPID(); - if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).Any()) - { - Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).First(); - } - var Limit = new ConfigLimit(); - if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any()) - { - Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).First(); - } - var Alarm = new ConfigAlarm(); - if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any()) - { - Alarm = FreeSql.Select().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(Pid), - CurConfigLimitDto = Mapper.Map(Limit), - - ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}", - }); - } - break; - case ConfigValueType.Slope: //斜率 - //根据循环次数确定 - for (int StepIndex = 0; StepIndex < itemStep.SpeedCycle; StepIndex++) - { - //根据循环次数执行 + switch (itemStep.MeterSpeeds.FirstOrDefault()!.ValueType) + { + case ConfigValueType.Constant: //常值 + //常值的话就一个数据,循环执行一次 foreach (var itemMeterValueCell in itemStep.MeterSpeeds) { var Pid = new ConfigPID(); - if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).Any()) + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any()) { - Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.ParNo).First(); + Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First(); } var Limit = new ConfigLimit(); - if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any()) + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any()) { - Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).First(); + Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First(); } var Alarm = new ConfigAlarm(); - if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).Any()) + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any()) { - Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.Ev).First(); + Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First(); } ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe() @@ -320,33 +287,220 @@ namespace CapMachine.Wpf.Services ProSegIsExeing = false,//配置阶段默认不执行 false //程序步骤数据 - //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1), - StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName), - EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName), + StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName), + EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName), KeepTime = itemMeterValueCell.KeepTime, MeterStepIsExeing = false,//配置阶段默认不执行 false MeterStepIsOK = false,//配置阶段默认不完成 false - ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率 + ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率 MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1, + MeterName = CurMeterName, - LimitNo = itemMeterValueCell.ParNo, - AlarmNo = itemMeterValueCell.ParNo, - PIDNo = itemMeterValueCell.Ev, + LimitNo = itemMeterValueCell.LimitNo, + AlarmNo = itemMeterValueCell.AlarmNo, + PIDNo = itemMeterValueCell.PIDNo, CurConfigPIDDto = Mapper.Map(Pid), CurConfigLimitDto = Mapper.Map(Limit), + CurConfigAlarmDto = Mapper.Map(Alarm), ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}", - MeterName = CurMeterName, }); } - } - break; - default: - break; + 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().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any()) + { + Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First(); + } + var Limit = new ConfigLimit(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any()) + { + Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First(); + } + var Alarm = new ConfigAlarm(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any()) + { + Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First(); + } + + ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe() + { + //程序块 + ProSegName = CurProgramSeg.Name, + ProSegStep = SegIndex, + ProSegRepeat = CurProgramSeg.ProRepeat, + ProSegIsExeing = false,//配置阶段默认不执行 false + + //程序步骤数据 + //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1), + StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName), + EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName), + KeepTime = itemMeterValueCell.KeepTime, + MeterStepIsExeing = false,//配置阶段默认不执行 false + MeterStepIsOK = false,//配置阶段默认不完成 false + ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率 + + MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1, + + LimitNo = itemMeterValueCell.LimitNo, + AlarmNo = itemMeterValueCell.AlarmNo, + PIDNo = itemMeterValueCell.PIDNo, + + CurConfigPIDDto = Mapper.Map(Pid), + CurConfigLimitDto = Mapper.Map(Limit), + CurConfigAlarmDto = Mapper.Map(Alarm), + + ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}", + MeterName = CurMeterName, + }); + } + } + break; + default: + break; + } } } + + + //********* 单个【排气压力】步骤信息的解析 ********* + { + var CurMeterName = "排气压力"; + if (itemStep.MeterExPresss != null && itemStep.MeterExPresss.Any()) + { + switch (itemStep.MeterExPresss.FirstOrDefault()!.ValueType) + { + case ConfigValueType.Constant: //常值 + //常值的话就一个数据,循环执行一次 + foreach (var itemMeterValueCell in itemStep.MeterExPresss) + { + var Pid = new ConfigPID(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any()) + { + Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First(); + } + var Limit = new ConfigLimit(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any()) + { + Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First(); + } + var Alarm = new ConfigAlarm(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any()) + { + Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First(); + } + + ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe() + { + //程序块 + ProSegName = CurProgramSeg.Name, + ProSegStep = SegIndex, + ProSegRepeat = CurProgramSeg.ProRepeat, + ProSegIsExeing = false,//配置阶段默认不执行 false + + //程序步骤数据 + StartSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName), + EndSV = GetSVByProcess(itemMeterValueCell.Constant, CurMeterName), + KeepTime = itemMeterValueCell.KeepTime, + MeterStepIsExeing = false,//配置阶段默认不执行 false + MeterStepIsOK = false,//配置阶段默认不完成 false + ExistSlop = false,//常值没有斜率 //开始和结束不一样则存在斜率 + + MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1, + MeterName = CurMeterName, + + LimitNo = itemMeterValueCell.LimitNo, + AlarmNo = itemMeterValueCell.AlarmNo, + PIDNo = itemMeterValueCell.PIDNo, + + CurConfigPIDDto = Mapper.Map(Pid), + CurConfigLimitDto = Mapper.Map(Limit), + CurConfigAlarmDto = Mapper.Map(Alarm), + + ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}", + }); + } + break; + case ConfigValueType.Slope: + //带斜率 + //根据循环次数确定 + var Cycle = GetCycleBySpeed(itemStep.MeterSpeeds, itemStep.SpeedCycle, itemStep.MeterExPresss.Select(p => new MeterCom { Constant = p.Constant, KeepTime = p.KeepTime, StepNo = p.StepNo, ValueType = p.ValueType }).ToList()); + for (int StepCycleIndex = 1; StepCycleIndex <= Cycle; StepCycleIndex++) + { + //根据循环次数执行 + foreach (var itemMeterValueCell in itemStep.MeterExPresss) + { + var Pid = new ConfigPID(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).Any()) + { + Pid = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.PIDNo).First(); + } + var Limit = new ConfigLimit(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).Any()) + { + Limit = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.LimitNo).First(); + } + var Alarm = new ConfigAlarm(); + if (FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).Any()) + { + Alarm = FreeSql.Select().Where(a => a.MeterName == CurMeterName && a.IndexNo == itemMeterValueCell.AlarmNo).First(); + } + + ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Add(new ProStepExe() + { + //程序块 + ProSegName = CurProgramSeg.Name, + ProSegStep = SegIndex, + ProSegRepeat = CurProgramSeg.ProRepeat, + ProSegIsExeing = false,//配置阶段默认不执行 false + + //程序步骤数据 + //SV = CALCHelper.GetQuickSV(itemMeterValueCell.Constant, 1), + StartSV = GetSVByProcess(itemMeterValueCell.StartValue, CurMeterName), + EndSV = GetSVByProcess(itemMeterValueCell.EndValue, CurMeterName), + KeepTime = itemMeterValueCell.KeepTime, + MeterStepIsExeing = false,//配置阶段默认不执行 false + MeterStepIsOK = false,//配置阶段默认不完成 false + ExistSlop = itemMeterValueCell.StartValue == itemMeterValueCell.EndValue ? false : true,//开始和结束不一样则存在斜率 + + MeterStep = ListProExModel.FindFirst(a => a.MeterName == CurMeterName).ListProStepExe.Count + 1, + + LimitNo = itemMeterValueCell.LimitNo, + AlarmNo = itemMeterValueCell.AlarmNo, + PIDNo = itemMeterValueCell.PIDNo, + + CurConfigPIDDto = Mapper.Map(Pid), + CurConfigLimitDto = Mapper.Map(Limit), + CurConfigAlarmDto = Mapper.Map(Alarm), + + ProStepInfo = $"{itemStep.StepNo}-{itemMeterValueCell.StepNo}", + MeterName = CurMeterName, + }); + } + } + break; + default: + break; + } + } + else + { + LogService.Warn($"【名称】: {CurMeterName} - 未找到步骤信息。步骤为空"); + } + + } + + + } } @@ -364,10 +518,10 @@ namespace CapMachine.Wpf.Services /// private int GetSVByProcess(double SV, string Name) { - var Data = ListPlcLoadConfigCell.Where(a => a.Name == Name); + var Data = ListPlcLoadConfigCell.Where(a => a.Name.Contains(Name)); if (Data.Any()) { - return (int)(SV / (Data.FirstOrDefault()!.Precision)); + return (int)(SV * (Data.FirstOrDefault()!.Precision)); } else { @@ -377,6 +531,69 @@ namespace CapMachine.Wpf.Services } } + + /// + /// 根据速度表时间获取当前参数的循环的次数 + /// 只考虑斜率下的循环次数 + /// 常值不考虑,调用方已经考虑了常值 + /// + /// + /// + private int GetCycleBySpeed(List MeterSpeeds, int SpeedCycle, List MeterComs) + { + if (MeterComs != null && MeterComs.Count > 0 && MeterSpeeds != null && MeterSpeeds.Count > 0) + { + //目标参数常值和斜坡的判断 + if (MeterComs.Where(a => a.ValueType == ConfigValueType.Slope).Count() > 0) + { + //速度是常值还是斜率判断 + if (MeterSpeeds != null && MeterSpeeds.Where(a => a.ValueType == ConfigValueType.Slope).Count() > 0) + { + //速度全部时间 + var TotalTime = MeterSpeeds.Sum(a => a.KeepTime) * SpeedCycle; + //目标参数的全部时间 + var MeterSlopTime = MeterComs.Sum(a => a.KeepTime); + if (MeterSlopTime != 0) + { + return TotalTime / MeterSlopTime; + } + else + { + //目标参数全部时间为0,认为不执行,不进行操作 + return 0; + } + } + else + { + //速度是常值 + var TotalTime = MeterSpeeds!.FirstOrDefault()!.KeepTime; + var MeterConstTime = MeterComs.Sum(a => a.KeepTime); + if (MeterConstTime != 0) + { + return TotalTime / MeterConstTime; + } + else + { + //目标参数全部时间为0,认为不执行,不进行操作 + return 0; + } + } + } + else + { + // meterComs 常值 就一步了,执行一次,没有循环 + return 1; + } + } + else + { + //集合没有数据,不进行操作 + return 0; + } + + } + + #region 程序调度执行 /// @@ -439,53 +656,57 @@ namespace CapMachine.Wpf.Services /// 队列通道 /// 当前队列消费触发的数据记录 /// - public Channel ProRunChannel = Channel.CreateUnbounded(new UnboundedChannelOptions() - { - SingleWriter = false,//允许一次写入多条数据 - SingleReader = true //一次只能读取一条消息 - }); + public Channel ProRunChannel { get; set; } - /// - /// 程序执行管道监听方法 - /// - /// - 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 "); - } + // = Channel.CreateUnbounded(new UnboundedChannelOptions() + //{ + // SingleWriter = false,//允许一次写入多条数据 + // SingleReader = true //一次只能读取一条消息 + //}); + + ///// + ///// 程序执行管道监听方法 + ///// + ///// + //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(); + // } + // } + //} - Thread.Sleep(50); - //DownLoadPID(); - //stopwatch.Stop(); //停止Stopwatch - //Console.WriteLine("保存数据耗时::{0}", stopwatch.Elapsed.TotalSeconds.ToString()); - //stopwatch.Reset(); - } - } - } ///// ///// 下载PID 信息 diff --git a/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs b/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs index 07c63f4..e3d91da 100644 --- a/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs +++ b/CapMachine.Wpf/ViewModels/ProConfigViewModel.cs @@ -2764,7 +2764,11 @@ namespace CapMachine.Wpf.ViewModels PTCEnable = SelectedSlopMeterSpeed.PTCEnable, CapEnable = SelectedSlopMeterSpeed.CapEnable, OutLock = SelectedSlopMeterSpeed.OutLock, - ParNo = SelectedSlopMeterSpeed.ParNo, + //ParNo = SelectedSlopMeterSpeed.ParNo, + PIDNo = SelectedSlopMeterSpeed.PIDNo, + AlarmNo = SelectedSlopMeterSpeed.AlarmNo, + LimitNo = SelectedSlopMeterSpeed.LimitNo, + //StepNo = AutoGetMeterSpeedStepNo(), }; @@ -2790,7 +2794,10 @@ namespace CapMachine.Wpf.ViewModels FreeSql.Update() .Set(a => a.Constant, SelectedConstSpeedValue) .Set(a => a.KeepTime, SelectedConstSpeedTimeValue) - .Set(a => a.ParNo, SelectedSlopMeterSpeed.ParNo) + //.Set(a => a.ParNo, SelectedSlopMeterSpeed.ParNo) + .Set(a => a.PIDNo, SelectedSlopMeterSpeed.PIDNo) + .Set(a => a.LimitNo, SelectedSlopMeterSpeed.LimitNo) + .Set(a => a.AlarmNo, SelectedSlopMeterSpeed.AlarmNo) .Set(a => a.OutLock, SelectedSlopMeterSpeed.OutLock) .Set(a => a.CapEnable, SelectedSlopMeterSpeed.CapEnable) .Set(a => a.Ev, SelectedSlopMeterSpeed.Ev) @@ -2859,7 +2866,10 @@ namespace CapMachine.Wpf.ViewModels Id = SelectedData.Id, InhExhValve = SelectedData.InhExhValve, OutLock = SelectedData.OutLock, - ParNo = SelectedData.ParNo, + //ParNo = SelectedData.ParNo, + AlarmNo = SelectedData.AlarmNo, + LimitNo = SelectedData.LimitNo, + PIDNo = SelectedData.PIDNo, ProStep = SelectedData.ProStep, ProStepId = SelectedData.ProStepId, StartValue = SelectedData.StartValue, @@ -2944,7 +2954,10 @@ namespace CapMachine.Wpf.ViewModels PTCEnable = SelectedSlopMeterSpeed.PTCEnable, CapEnable = SelectedSlopMeterSpeed.CapEnable, OutLock = SelectedSlopMeterSpeed.OutLock, - ParNo = SelectedSlopMeterSpeed.ParNo, + //ParNo = SelectedSlopMeterSpeed.ParNo, + AlarmNo = SelectedSlopMeterSpeed.AlarmNo, + LimitNo = SelectedSlopMeterSpeed.LimitNo, + PIDNo = SelectedSlopMeterSpeed.PIDNo, ValueType = ConfigValueType.Slope, StepNo = AutoGetMeterSpeedStepNo(), }; @@ -3024,7 +3037,10 @@ namespace CapMachine.Wpf.ViewModels .Set(a => a.KeepTime, SelectedSlopMeterSpeed.KeepTime) .Set(a => a.StepNo, SelectedSlopMeterSpeed.StepNo) - .Set(a => a.ParNo, SelectedSlopMeterSpeed.ParNo) + //.Set(a => a.ParNo, SelectedSlopMeterSpeed.ParNo) + .Set(a => a.PIDNo, SelectedSlopMeterSpeed.PIDNo) + .Set(a => a.LimitNo, SelectedSlopMeterSpeed.LimitNo) + .Set(a => a.AlarmNo, SelectedSlopMeterSpeed.AlarmNo) .Set(a => a.OutLock, SelectedSlopMeterSpeed.OutLock) .Set(a => a.CapEnable, SelectedSlopMeterSpeed.CapEnable) .Set(a => a.Ev, SelectedSlopMeterSpeed.Ev) diff --git a/CapMachine.Wpf/Views/ProConfigView.xaml b/CapMachine.Wpf/Views/ProConfigView.xaml index 2e138b6..7024f36 100644 --- a/CapMachine.Wpf/Views/ProConfigView.xaml +++ b/CapMachine.Wpf/Views/ProConfigView.xaml @@ -1268,10 +1268,19 @@ Style="{StaticResource MaterialDesignSwitchToggleButton}" ToolTip="输出锁定" /> - - - + + + + @@ -1285,18 +1294,30 @@ Style="{StaticResource MaterialDesignSwitchToggleButton}" ToolTip="压缩机使能" /> + - - + + + + + + + + +