88 lines
3.4 KiB
C#
88 lines
3.4 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|