using CapMachine.Core; using CapMachine.Shared.Controls; using CapMachine.Wpf.Models.PPCalc; using CapMachine.Wpf.Models.Tag; using CapMachine.Wpf.PPCalculation; using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CapMachine.Wpf.Services { /// /// 物性计算的服务 /// public class PPCService : BindableBase { /// /// 计算扫描 Task /// private static Task CalcTask { get; set; } public ConfigService ConfigService { get; } private IEventAggregator _EventAggregator { get; set; } public DataRecordService DataRecordService { get; } public SysRunService SysRunServer { get; } public MachineRtDataService MachineRtDataService { get; } public IDialogService DialogService { get; } /// /// 标签中心 /// public TagManager TagManager { get; set; } /// /// 实例化 /// public PPCService(ConfigService configService, IEventAggregator eventAggregator, DataRecordService dataRecordService, SysRunService sysRunService, MachineRtDataService machineRtDataService, IDialogService dialogService) { ConfigService = configService; //事件服务 _EventAggregator = eventAggregator; DataRecordService = dataRecordService; SysRunServer = sysRunService; MachineRtDataService = machineRtDataService; DialogService = dialogService; TagManager = MachineRtDataService.TagManger; //SpeedTag = TagManager.DicTags.GetValueOrDefault("转速[rpm]"); //ExPressTag = TagManager.DicTags.GetValueOrDefault("排气压力[BarA]"); //ExTempTag = TagManager.DicTags.GetValueOrDefault("排气温度[℃]"); if (TagManager.TryGetShortControlTagByName("吸气压力[BarA]",out ShortControlTag? InhPressShortControlTag)) { InhPressTag = InhPressShortControlTag!; } if (TagManager.TryGetShortControlTagByName("吸气温度[℃]", out ShortControlTag? InhTempShortControlTag)) { InhTempTag = InhTempShortControlTag!; } //InhTempTag = TagManager.DicTags.GetValueOrDefault("吸气温度[℃]")!; //ComCapBusVolTag = TagManager.DicTags.GetValueOrDefault("通讯母线电压[V]"); //ComCapBusCurTag = TagManager.DicTags.GetValueOrDefault("通讯母线电流[A]"); //ComCapPwTag = TagManager.DicTags.GetValueOrDefault("通讯功率[W]"); //OS2TempTag = TagManager.DicTags.GetValueOrDefault("吸气混合器温度[℃]"); //TxvFrTempTag = TagManager.DicTags.GetValueOrDefault("膨胀阀前温度[℃]")!; //TxvFrPressTag = TagManager.DicTags.GetValueOrDefault("膨胀阀前压力[BarA]")!; if (TagManager.TryGetShortTagByName("阀前温度T3[℃]", out ShortValueTag? TxvFrTempShortTag)) { TxvFrTempTag = TxvFrTempShortTag!; } if (TagManager.TryGetShortTagByName("阀前压力P3[BarA]", out ShortValueTag? TxvFrPressShortTag)) { TxvFrPressTag = TxvFrPressShortTag!; } //Cond1TempTag = TagManager.DicTags.GetValueOrDefault("冷凝器出口水温[℃]"); //CondInTempTag = TagManager.DicTags.GetValueOrDefault("冷凝器进口温度[℃]"); //Superheat = TagManager.DicTags.GetValueOrDefault("过热度[K]"); //Subcool = TagManager.DicTags.GetValueOrDefault("过冷度[K]"); if (TagManager.TryGetCalcTagByName("过热度[K]", out CalcTag? SuperheatShortTag)) { Superheat = SuperheatShortTag!; } if (TagManager.TryGetCalcTagByName("过冷度[K]", out CalcTag? SubcoolShortTag)) { Subcool = SubcoolShortTag!; } SuperHeatCoolConfig.FluidsPath = ConfigHelper.GetValue("FluidsPath"); SuperHeatCoolConfig.Cryogen = ConfigHelper.GetValue("Cryogen"); RtScanDeviceStart(); } /// /// 当前的配置 /// public SuperHeatCoolConfigModel SuperHeatCoolConfig { get; set; } = new SuperHeatCoolConfigModel(); /// /// 保存配置信息 /// public void SaveSuperHeatCoolConfig() { ConfigHelper.SetValue("FluidsPath", SuperHeatCoolConfig.FluidsPath); ConfigHelper.SetValue("Cryogen", SuperHeatCoolConfig.Cryogen); } /// /// 吸气压力 /// public ShortControlTag InhPressTag { get; set; } /// /// 吸气温度 /// public ShortControlTag InhTempTag { get; set; } /// /// 膨胀阀前温度 /// public ShortValueTag TxvFrTempTag { get; set; } /// /// 膨胀阀前压力 /// public ShortValueTag TxvFrPressTag { get; set; } /// /// 过热度 /// public CalcTag Superheat { get; set; } /// /// 过冷度 /// public CalcTag Subcool { get; set; } ///// ///// 过热度 ///// //public double Superheat { get; set; } ///// ///// 过冷度 ///// //public double Subcool { get; set; } ///// ///// 制冷剂 ///// //public string Cryogen { get; set; } = "R134a"; /// /// 风量数据-乘以系数的后的最终结果 /// private double AirVolumeData { get; set; } = 0.0; /// /// 风量数据-公式计算的原始数据 /// private double AirVolumeDataSource { get; set; } = 0; /// /// 风量喷嘴启用信息数据 /// private string RozzleEnableInfo { get; set; } = ""; /// /// 启用计算 /// private bool RtCalcEnable { get; set; } = true; /// /// PLC扫描线程 /// private void RtScanDeviceStart() { CalcTask = Task.Run(async () => { //Stopwatch stopwatch = new Stopwatch(); //物性的过热度和过冷度的相关物性计算 while (RtCalcEnable) { await Task.Delay(1000); try { long iErr, kph = 1; double te = 0.0, te1 = 0.0, p = 0.0, p1 = 0.0, d = 0.0, Dl = 0.0, Dv = 0.0, q = 0.0, h = 0.0, ee = 0.0, hh = 0.0, ss = 0.0, cp = 0.0, cv = 0.0, w = 0.0; double[] x = new double[20], xliq = new double[20], xvap = new double[20]; double[] xlkg = new double[20], xvkg = new double[20]; double tk = 0.0, wm = 0.0, prevDeltaH = 0.0;//prevDeltaH 未使用 //textBox5.Text = ""; string hpath = SuperHeatCoolConfig.FluidsPath; long size = hpath.Length; hpath += new String(' ', 255 - (int)size); IRefProp64.SETPATHdll(hpath, ref size); long numComps = 1;//冷媒个数 //string hfld = "R1234YF.FLD"; R1234YF string hfld = ""; if (SuperHeatCoolConfig.Cryogen == "R134a") { hfld = "R134A.FLD"; } else { hfld = "R134A.FLD"; } //string hfld = "R134A.FLD"; //string hfld = Convert.ToString(comboBox1.Text);//从控件获取数据 size = hfld.Length; hfld += new String(' ', 10000 - (int)size); //string hfmix = "hmx.bnc" + new String(' ', 255);//原来的 string hfmix = "hmx.bnc" + new String(' ', 255);//248 string hrf = "DEF"; string herr = new String(' ', 255); iErr = 0; long hfldLen = hfld.Length, hfmixLen = hfmix.Length, hrfLen = hrf.Length, herrLen = herr.Length; //numComps = -1; IRefProp64.SETUPdll(ref numComps, ref hfld, ref hfmix, ref hrf, ref iErr, ref herr, ref hfldLen, ref hfmixLen, ref hrfLen, ref herrLen); double version = iErr / 10000.0;//错误信息 if (iErr != 0) { //MessageBox.Show(herr, "RefProp SETUPdll() Error ", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } IRefProp64.WMOLdll(x, ref wm); //p = Convert.ToDouble(textBox2.Text) * 1000.0;//textBox2 Comp.吸气压力(Mpa) p = (InhPressTag.PVModel.EngValue) * 1000.0;//textBox2 Comp.吸气压力(Mpa) kph = 1; p1 = (TxvFrPressTag.PVModel.EngValue) * 1000.0;//textBox3 Evap.膨胀阀前压力(Mpa) //p1 = Convert.ToDouble(textBox3.Text) * 1000.0;//textBox3 Evap.膨胀阀前压力(Mpa) IRefProp64.SATPdll(ref p, x, ref kph, ref te, ref Dl, ref Dv, xliq, xvap, ref iErr, ref herr, ref herrLen); if (iErr == 0) Superheat.PVModel.EngValue = Math.Round(InhTempTag.PVModel.EngValue - (te - 273.15), 3) ; //textBox5.Text = String.Format("{0:n4}", Convert.ToDouble(textBox1.Text) - (te - 273.15));//textBox1 Comp.吸气温度(℃) else Superheat.PVModel.EngValue = 0; IRefProp64.SATPdll(ref p1, x, ref kph, ref te1, ref Dl, ref Dv, xliq, xvap, ref iErr, ref herr, ref herrLen); if (iErr == 0) Subcool.PVModel.EngValue = Math.Round(TxvFrTempTag.PVModel.EngValue - (te1 - 273.15), 3);//textBox4 Evap.膨胀阀前温度(℃) //GuoLengDu = (te1 - 273.15) - ListKRLogCellValue.Find(a => a.Name == "膨胀阀前温度").Value;//textBox4 Evap.膨胀阀前温度(℃) //textBox6.Text = String.Format("{0:n4}", Convert.ToDouble(textBox4.Text) - (te1 - 273.15));//textBox4 Evap.膨胀阀前温度(℃) else Subcool.PVModel.EngValue = 0; } catch (Exception ex) { //logger.Error(String.Format("ErrSource : {0} ErrMsg : {1}", ex.StackTrace.ToString(), ex.Message.ToString())); } } }); } #region 过热度和过冷度相关计算 /// /// 过热度和过冷度计算函数调用 风量的调用 /// private void REFPROPSum() { try { long iErr, kph = 1; double te = 0.0, te1 = 0.0, p = 0.0, p1 = 0.0, d = 0.0, Dl = 0.0, Dv = 0.0, q = 0.0, h = 0.0, ee = 0.0, hh = 0.0, ss = 0.0, cp = 0.0, cv = 0.0, w = 0.0; double[] x = new double[20], xliq = new double[20], xvap = new double[20]; double[] xlkg = new double[20], xvkg = new double[20]; double tk = 0.0, wm = 0.0, prevDeltaH = 0.0;//prevDeltaH 未使用 //textBox5.Text = ""; string hpath = @".\PPCalculation\REFPROP\FLUIDS"; long size = hpath.Length; hpath += new String(' ', 255 - (int)size); IRefProp64.SETPATHdll(hpath, ref size); long numComps = 1;//冷媒个数 //string hfld = "R1234YF.FLD"; //string hfld = "R134A.FLD"; string hfld = ""; if (SuperHeatCoolConfig.Cryogen == "R134a") { hfld = "R134A.FLD"; } else { hfld = "R1234YF.FLD"; } //string hfld = Convert.ToString(comboBox1.Text);//从控件获取数据 size = hfld.Length; hfld += new String(' ', 10000 - (int)size); //string hfmix = "hmx.bnc" + new String(' ', 255);//原来的 string hfmix = "hmx.bnc" + new String(' ', 248); string hrf = "DEF"; string herr = new String(' ', 255); iErr = 0; long hfldLen = hfld.Length, hfmixLen = hfmix.Length, hrfLen = hrf.Length, herrLen = herr.Length; //numComps = -1; IRefProp64.SETUPdll(ref numComps, ref hfld, ref hfmix, ref hrf, ref iErr, ref herr, ref hfldLen, ref hfmixLen, ref hrfLen, ref herrLen); double version = iErr / 10000.0;//错误信息 if (iErr != 0) { //MessageBox.Show(herr, "RefProp SETUPdll() Error ", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } IRefProp64.WMOLdll(x, ref wm); //p = Convert.ToDouble(textBox2.Text) * 1000.0;//textBox2 Comp.吸气压力(Mpa) //p = (ListRtKPMeter.Find(a => a.MeterName == "吸入压力").RtPV) * 1000.0;//textBox2 Comp.吸气压力(Mpa) p = (InhPressTag.PVModel.EngValue) * 1000.0;//textBox2 Comp.吸气压力(Mpa) kph = 1; //p1 = (ListKRLogCellValue.Find(a => a.Name == "膨胀阀前压力").Value) * 1000.0;//textBox3 Evap.膨胀阀前压力(Mpa) p1 = (TxvFrPressTag.PVModel.EngValue) * 1000.0;//textBox3 Evap.膨胀阀前压力(Mpa) //p1 = Convert.ToDouble(textBox3.Text) * 1000.0;//textBox3 Evap.膨胀阀前压力(Mpa) IRefProp64.SATPdll(ref p, x, ref kph, ref te, ref Dl, ref Dv, xliq, xvap, ref iErr, ref herr, ref herrLen); if (iErr == 0) //GuoReDu = ListRtKPMeter.Find(a => a.MeterName == "吸入温度").RtPV - (te - 273.15); Superheat.PVModel.EngValue = InhTempTag.PVModel.EngValue - (te - 273.15); //textBox5.Text = String.Format("{0:n4}", Convert.ToDouble(textBox1.Text) - (te - 273.15));//textBox1 Comp.吸气温度(℃) else Superheat.PVModel.EngValue = 0; IRefProp64.SATPdll(ref p1, x, ref kph, ref te1, ref Dl, ref Dv, xliq, xvap, ref iErr, ref herr, ref herrLen); if (iErr == 0) //GuoLengDu = ListKRLogCellValue.Find(a => a.Name == "膨胀阀前温度").Value - (te1 - 273.15);//textBox4 Evap.膨胀阀前温度(℃) Subcool.PVModel.EngValue = TxvFrTempTag.PVModel.EngValue - (te1 - 273.15);//textBox4 Evap.膨胀阀前温度(℃) //textBox6.Text = String.Format("{0:n4}", Convert.ToDouble(textBox4.Text) - (te1 - 273.15));//textBox4 Evap.膨胀阀前温度(℃) else Subcool.PVModel.EngValue = 0; } catch (Exception ex) { //logger.Error(String.Format("ErrSource : {0} ErrMsg : {1}", ex.StackTrace.ToString(), ex.Message.ToString())); } } /// /// 风量数据的计算 /// private void AirVolumeDataSum() { //摄氏干球温度 Cd = 12号通道 蒸发器出口风洞温度 单位℃ //var Cd = ListKRLogCellValue.Find(a => a.Name == "蒸发器出口风洞温度").Value; var Cd = 40; //相对湿度% CRh = 11号通道 蒸发器出口湿度 单位% //var CRh = ListKRLogCellValue.Find(a => a.Name == "蒸发器出口湿度").Value; var CRh = 13.3; //PKK-零调差压 31号通道(大气压减去测量点的气压)== 静压 单位pa //var PKK = ListKRLogCellValue.Find(a => a.Name == "静压").Value; var PKK = 0.9; //BPRES - 测量的大气压 kPa:常数 kPa BPRES= 101.325Kpa var BPRES = 101.325; //CDP - 测量到的喷嘴差压(Pa) 记录仪3号通道 蒸発风道差圧 单位pa //var CDP = ListKRLogCellValue.Find(a => a.Name == "蒸発风道差圧").Value; var CDP = 44; //prmAirFlowFactor_i--喷嘴修正系数:设置为默认1.01 var prmAirFlowFactor_i = 1.01; AirVolumeData = AirCALCHepler.CVFCALC(Cd, CRh, PKK, BPRES, CDP, prmAirFlowFactor_i) * 60; AirVolumeDataSource = AirVolumeData; //系数的转换 //AirCALCHepler.ListRozzle //RozzleEnableInfo if (AirVolumeData >= 200 && AirVolumeData < 250) { if (RozzleEnableInfo.Contains("[40]") && RozzleEnableInfo.Contains("[50]") && !RozzleEnableInfo.Contains("[80]")) { AirVolumeData = AirVolumeData * 0.95; } } if (AirVolumeData >= 250 && AirVolumeData < 300) { if (RozzleEnableInfo.Contains("[40]") && RozzleEnableInfo.Contains("[50]") && !RozzleEnableInfo.Contains("[80]")) { AirVolumeData = AirVolumeData * 1.05; } } if (AirVolumeData >= 300 && AirVolumeData < 400) { if (!RozzleEnableInfo.Contains("[40]") && !RozzleEnableInfo.Contains("[50]") && RozzleEnableInfo.Contains("[80]")) { AirVolumeData = AirVolumeData * 1.125; } } if (AirVolumeData >= 400 && AirVolumeData < 600) { if (RozzleEnableInfo.Contains("[40]") && !RozzleEnableInfo.Contains("[50]") && RozzleEnableInfo.Contains("[80]")) { AirVolumeData = AirVolumeData * 1.114; } } //Console.WriteLine($"时间:{DateTime.Now.ToString()}摄氏干球温度 单位℃:{Cd} 相对湿度 单位%:{CRh}-零调差压 单位pa:{PKK}-大气压 单位Kpa:{BPRES}-喷嘴差压 单位Pa:{CDP}-喷嘴修正系数:{prmAirFlowFactor_i} 80通道风量结果:{Result}"); } #endregion } }