6个物性参数和过热度和过冷度的验证OK

This commit is contained in:
2026-05-08 11:02:55 +08:00
parent 47834ea4dc
commit a8c5cda332
6 changed files with 1387 additions and 2381 deletions

View File

@@ -0,0 +1,87 @@
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;
}
}
}