Files
CapMachine/CapMachine.Wpf/PPCalculation/SuperheatSubcoolCalculator.cs

88 lines
3.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
namespace CapMachine.Wpf.PPCalculation
{
/// <summary>
/// 过热度/过冷度计算器。
///
/// 说明:该类仅负责封装 SATPdll 调用与计算公式,保持与历史流程一致。
/// - 压力换算保持原逻辑BarA * 100.0
/// - 温度换算保持原逻辑Tsat[K] - 273.15
/// - 失败时返回 0与原先在服务中直接写 Tag 的行为一致)
/// </summary>
public sealed class SuperheatSubcoolCalculator
{
private readonly object _refpropLock;
/// <summary>
/// 构造函数。
/// </summary>
/// <param name="refpropLock">REFPROP 全局锁REFPROP DLL 非线程安全,需串行化调用)。</param>
public SuperheatSubcoolCalculator(object refpropLock)
{
_refpropLock = refpropLock ?? throw new ArgumentNullException(nameof(refpropLock));
}
/// <summary>
/// 按既有流程计算过热度/过冷度。
/// </summary>
/// <param name="inhPressBarA">吸气压力BarA。</param>
/// <param name="inhTempC">吸气温度(℃)。</param>
/// <param name="txvFrPressBarA">膨胀阀前压力BarA。</param>
/// <param name="txvFrTempC">膨胀阀前温度(℃)。</param>
/// <param name="superheatK">过热度K。失败时为 0。</param>
/// <param name="subcoolK">过冷度K。失败时为 0。</param>
public void Calculate(
double inhPressBarA,
double inhTempC,
double txvFrPressBarA,
double txvFrTempC,
out double superheatK,
out double subcoolK)
{
superheatK = 0.0;
subcoolK = 0.0;
long iErr;
long kph = 1;
double te = 0.0;
double te1 = 0.0;
double p = 0.0;
double p1 = 0.0;
double Dl = 0.0;
double Dv = 0.0;
double[] x = new double[20], xliq = new double[20], xvap = new double[20];
x[0] = 1.0;
//p = Convert.ToDouble(textBox2.Text) * 1000.0;//textBox2 Comp.吸气压力kpa
p = inhPressBarA * 100.0;// 保持你原有流程:将 BarA 当作 MPa? 历史代码为 *1000.0,不改变你的算法
p1 = txvFrPressBarA * 100.0;// 保持你原有流程
//p1 = Convert.ToDouble(textBox3.Text) * 1000.0;//textBox3 Evap.膨胀阀前压力Mpa
// 统一放入同一把锁中,避免并发导致的 Fortran 读文件/状态竞态
string herr = new string(' ', 255); long herrLen = 255; iErr = 0;
lock (_refpropLock)
{
IRefProp64.SATPdll(ref p, x, ref kph, ref te, ref Dl, ref Dv, xliq, xvap, ref iErr, ref herr, ref herrLen);
}
if (iErr == 0)
superheatK = Math.Abs(inhTempC - (te - 273.15));
else
superheatK = 0;
herr = new string(' ', 255); herrLen = 255; iErr = 0;
lock (_refpropLock)
{
IRefProp64.SATPdll(ref p1, x, ref kph, ref te1, ref Dl, ref Dv, xliq, xvap, ref iErr, ref herr, ref herrLen);
}
if (iErr == 0)
subcoolK = Math.Abs(txvFrTempC - (te1 - 273.15));
else
subcoolK = 0;
}
}
}