using CapMachine.Core;
using CapMachine.Shared.Controls;
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("排气压力[MpaA]");
//ExTempTag = TagManager.DicTags.GetValueOrDefault("排气温度[℃]");
InhPressTag = TagManager.DicTags.GetValueOrDefault("吸气压力[MpaA]");
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("膨胀阀前压力[MpaA]");
//Cond1TempTag = TagManager.DicTags.GetValueOrDefault("冷凝器出口水温[℃]");
//CondInTempTag = TagManager.DicTags.GetValueOrDefault("冷凝器进口温度[℃]");
FluidsPath = ConfigHelper.GetValue("FluidsPath");
RtScanDeviceStart();
}
///
/// 过热度和过冷度计算FLUID路径
/// REFPROP
/// REFPRP64.DLL
///
/// ****FluidsPath 路径不能太长,否则会导致错误***********
///
public string FluidsPath { get; set; } = "C:\\Program Files (x86)\\REFPROP\\fluids";
///
/// 吸气压力
///
public ITag InhPressTag { get; set; }
///
/// 吸气温度
///
public ITag InhTempTag { get; set; }
///
/// 膨胀阀前温度
///
public ITag TxvFrTempTag { get; set; }
///
/// 膨胀阀前压力
///
public ITag TxvFrPressTag { 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 = 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 (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.EngPvValue) * 1000.0;//textBox2 Comp.吸气压力(Mpa)
kph = 1;
p1 = (TxvFrPressTag.EngPvValue) * 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 = InhTempTag.EngPvValue - (te - 273.15);
//textBox5.Text = String.Format("{0:n4}", Convert.ToDouble(textBox1.Text) - (te - 273.15));//textBox1 Comp.吸气温度(℃)
else
Superheat = 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 = TxvFrTempTag.EngPvValue - (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 = 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 (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.EngPvValue) * 1000.0;//textBox2 Comp.吸气压力(Mpa)
kph = 1;
//p1 = (ListKRLogCellValue.Find(a => a.Name == "膨胀阀前压力").Value) * 1000.0;//textBox3 Evap.膨胀阀前压力(Mpa)
p1 = (TxvFrPressTag.EngPvValue) * 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 = InhTempTag.EngPvValue - (te - 273.15);
//textBox5.Text = String.Format("{0:n4}", Convert.ToDouble(textBox1.Text) - (te - 273.15));//textBox1 Comp.吸气温度(℃)
else
Superheat = 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 = TxvFrTempTag.EngPvValue - (te1 - 273.15);//textBox4 Evap.膨胀阀前温度(℃)
//textBox6.Text = String.Format("{0:n4}", Convert.ToDouble(textBox4.Text) - (te1 - 273.15));//textBox4 Evap.膨胀阀前温度(℃)
else
Subcool = 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
}
}