6个物性参数和过热度和过冷度的验证OK
This commit is contained in:
87
CapMachine.Wpf/PPCalculation/SuperheatSubcoolCalculator.cs
Normal file
87
CapMachine.Wpf/PPCalculation/SuperheatSubcoolCalculator.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user