467 lines
19 KiB
C#
467 lines
19 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 物性计算的服务
|
||
/// </summary>
|
||
public class PPCService : BindableBase
|
||
{
|
||
/// <summary>
|
||
/// 计算扫描 Task
|
||
/// </summary>
|
||
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; }
|
||
/// <summary>
|
||
/// 标签中心
|
||
/// </summary>
|
||
public TagManager TagManager { get; set; }
|
||
|
||
/// <summary>
|
||
/// 实例化
|
||
/// </summary>
|
||
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("膨胀阀前温度[℃]", out ShortValueTag? TxvFrTempShortTag))
|
||
{
|
||
TxvFrTempTag = TxvFrTempShortTag!;
|
||
}
|
||
if (TagManager.TryGetShortTagByName("膨胀阀前压力[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.TryGetShortTagByName("过热度[K]", out ShortValueTag? SuperheatShortTag))
|
||
{
|
||
Superheat = SuperheatShortTag!;
|
||
}
|
||
if (TagManager.TryGetShortTagByName("过冷度[K]", out ShortValueTag? SubcoolShortTag))
|
||
{
|
||
Subcool = SubcoolShortTag!;
|
||
}
|
||
|
||
SuperHeatCoolConfig.FluidsPath = ConfigHelper.GetValue("FluidsPath");
|
||
SuperHeatCoolConfig.Cryogen = ConfigHelper.GetValue("Cryogen");
|
||
|
||
//RtScanDeviceStart();
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 当前的配置
|
||
/// </summary>
|
||
public SuperHeatCoolConfigModel SuperHeatCoolConfig { get; set; } = new SuperHeatCoolConfigModel();
|
||
|
||
/// <summary>
|
||
/// 保存配置信息
|
||
/// </summary>
|
||
public void SaveSuperHeatCoolConfig()
|
||
{
|
||
ConfigHelper.SetValue("FluidsPath", SuperHeatCoolConfig.FluidsPath);
|
||
ConfigHelper.SetValue("Cryogen", SuperHeatCoolConfig.Cryogen);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 吸气压力
|
||
/// </summary>
|
||
public ShortControlTag InhPressTag { get; set; }
|
||
|
||
/// <summary>
|
||
/// 吸气温度
|
||
/// </summary>
|
||
public ShortControlTag InhTempTag { get; set; }
|
||
|
||
/// <summary>
|
||
/// 膨胀阀前温度
|
||
/// </summary>
|
||
public ShortValueTag TxvFrTempTag { get; set; }
|
||
|
||
/// <summary>
|
||
/// 膨胀阀前压力
|
||
/// </summary>
|
||
public ShortValueTag TxvFrPressTag { get; set; }
|
||
|
||
/// <summary>
|
||
/// 过热度
|
||
/// </summary>
|
||
public ShortValueTag Superheat { get; set; }
|
||
|
||
/// <summary>
|
||
/// 过冷度
|
||
/// </summary>
|
||
public ShortValueTag Subcool { get; set; }
|
||
|
||
|
||
///// <summary>
|
||
///// 过热度
|
||
///// </summary>
|
||
//public double Superheat { get; set; }
|
||
|
||
///// <summary>
|
||
///// 过冷度
|
||
///// </summary>
|
||
//public double Subcool { get; set; }
|
||
|
||
///// <summary>
|
||
///// 制冷剂
|
||
///// </summary>
|
||
//public string Cryogen { get; set; } = "R134a";
|
||
|
||
/// <summary>
|
||
/// 风量数据-乘以系数的后的最终结果
|
||
/// </summary>
|
||
private double AirVolumeData { get; set; } = 0.0;
|
||
|
||
/// <summary>
|
||
/// 风量数据-公式计算的原始数据
|
||
/// </summary>
|
||
private double AirVolumeDataSource { get; set; } = 0;
|
||
|
||
|
||
/// <summary>
|
||
/// 风量喷嘴启用信息数据
|
||
/// </summary>
|
||
private string RozzleEnableInfo { get; set; } = "";
|
||
|
||
/// <summary>
|
||
/// 启用计算
|
||
/// </summary>
|
||
private bool RtCalcEnable { get; set; } = true;
|
||
|
||
|
||
/// <summary>
|
||
/// PLC扫描线程
|
||
/// </summary>
|
||
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 = 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)
|
||
Subcool.PVModel.EngValue = TxvFrTempTag.PVModel.EngValue - (te1 - 273.15);//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 过热度和过冷度相关计算
|
||
|
||
/// <summary>
|
||
/// 过热度和过冷度计算函数调用 风量的调用
|
||
/// </summary>
|
||
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()));
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 风量数据的计算
|
||
/// </summary>
|
||
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
|
||
|
||
}
|
||
}
|