174 lines
6.2 KiB
Markdown
174 lines
6.2 KiB
Markdown
# PPCalculation 物性计算说明
|
||
|
||
本文档用于说明当前工程中 **PPC 物性计算** 的整体数据流、输入输出、单位约定、关键规则,以及 REFPROP 调用链路,便于后续维护与复用。
|
||
|
||
## 1. 代码入口与职责边界
|
||
|
||
- **入口服务**:`CapMachine.Wpf.Services.PPCService`
|
||
- 负责:
|
||
- 从 `TagManager` 读取实时数据(压力、温度、功率、流量、转速等)。
|
||
- 调用物性计算器(Calculator)完成计算。
|
||
- 将结果写回 Tag(干度、过热/过冷、Qh/Qc、COP、效率等)。
|
||
- 负责 REFPROP 初始化(SETPATH/SETUP)与全局串行化锁。
|
||
- 不负责:
|
||
- 具体的热力性质求解细节(已下沉到 Calculator)。
|
||
|
||
- **干度计算器**:`CapMachine.Wpf.PPCalculation.EnthalpyDrynessCalculator`
|
||
- 职责:基于“加权混合焓 + 吸气压力下饱和焓差”的方法,计算干度。
|
||
|
||
- **六参数计算器**:`CapMachine.Wpf.PPCalculation.ThermodynamicSixResultsCalculator`
|
||
- 职责:计算六个核心性能/效率结果:
|
||
- `Qc`、`Qh`、`COPc`、`COPh`、`ηs`、`ηv`
|
||
- 内部封装 REFPROP 计算链路、单位换算、以及关键规则(如 h3 的 Tsat-10°C)。
|
||
|
||
## 2. 单位约定(非常重要)
|
||
|
||
### 2.1 Tag 输入单位(来自 PLC/界面)
|
||
|
||
- 压力:`BarA`
|
||
- 温度:`℃`
|
||
- 功率:`W`(HV[W])
|
||
- 冷媒总流量:`kg/h`
|
||
- 转速:`rpm`
|
||
- 排量:`cc`(cm³/rev)
|
||
|
||
### 2.2 REFPROP 常用单位(在 Calculator 内部处理)
|
||
|
||
REFPROP 不同接口参数单位不完全一致,工程中统一由 Calculator 进行换算。
|
||
|
||
- 温度:`K`
|
||
- 压力:常见为 `kPa`(例如 SATP/TPRHO 采用 kPa)
|
||
- 摩尔密度:`mol/L`
|
||
- 焓:`J/mol`(THERM 输出),最终换算为 `kJ/kg`
|
||
- 熵:`J/(mol·K)`(THERM 输出),最终换算为 `kJ/(kg·K)`
|
||
|
||
典型换算:
|
||
- `BarA -> MPa`:乘 `0.1`
|
||
- `MPa -> kPa`:乘 `1000`
|
||
- `℃ -> K`:加 `273.15`
|
||
- `J/mol -> kJ/kg`:`(J/mol) / (kg/mol) * 0.001`
|
||
|
||
## 3. 运行周期与整体数据流
|
||
|
||
`PPCService.RtScanDeviceStart()` 周期性执行(约 100ms 一次),主要步骤:
|
||
|
||
1. **REFPROP 幂等初始化**(第一次进入或未初始化时)
|
||
- 调用 `EnsureRefpropInitialized()`
|
||
- 内部在 `_refpropLock` 下执行:
|
||
- `SETPATHdll` 设置流体库路径
|
||
- `SETUPdll` 载入工质(当前默认 `R134A.FLD`)
|
||
|
||
2. **过热度/过冷度计算(当前仍在服务内直接调用 SATP)**
|
||
- 吸气侧:由吸气压力求 `Tsat`,与吸气温度做差得到过热度
|
||
- 膨胀阀前侧:由膨胀阀前压力求 `Tsat`,与膨胀阀前温度做差得到过冷度
|
||
|
||
3. **干度计算**(调用 `EnthalpyDrynessCalculator`)
|
||
- 读取:
|
||
- 气路阀前压力/温度(GasPreValve P/T)
|
||
- 膨胀阀前压力/温度(TxvFr P/T)
|
||
- 吸气压力(InhP)
|
||
- 冷媒总流量(VRV)
|
||
- 液体流量(LiqRefFlow)
|
||
- 当前实现中:润滑油流量 `lubeFlowKgPerH` 固定为 `0.0`(不参与干度计算)。
|
||
- 输出:
|
||
- `Dryness1` 写入 `干度[%]` Tag(*100)
|
||
- `Dryness2` 写入 `PPCService.DrynessTag2Value`(*100,用于界面绑定)
|
||
|
||
4. **六参数计算**(调用 `ThermodynamicSixResultsCalculator.TryCalculate`)
|
||
- 读取输入:
|
||
- 吸气 P/T(BarA/℃)
|
||
- 排气 P/T(BarA/℃)
|
||
- 膨胀阀前 P/T(BarA/℃)
|
||
- 冷媒总流量(kg/h)
|
||
- HV 功率(W)
|
||
- 转速(rpm)
|
||
- 排量(cc)
|
||
- 输出写回:
|
||
- `制热量Qh[W]`(kW * 1000)
|
||
- `制冷量Qc[W]`(kW * 1000)
|
||
- `压缩机性能系数(制热)`(COPh)
|
||
- `压缩机性能系数(制冷)`(COPc)
|
||
- `等熵效率ns[%]`
|
||
- `容积效率nv[%]`
|
||
|
||
## 4. 干度计算(EnthalpyDrynessCalculator)概要
|
||
|
||
### 4.1 输入
|
||
|
||
- `GasPreValvePressBarA`
|
||
- `GasPreValveTempC`
|
||
- `TxvFrPressBarA`
|
||
- `TxvFrTempC`
|
||
- `InhPressBarA`
|
||
- `VrvFlowKgPerH`
|
||
- `LiqRefFlowKgPerH`
|
||
- `LubeFlowKgPerH`(当前传 0)
|
||
|
||
### 4.2 核心思路
|
||
|
||
1. 分别求取:
|
||
- 气路阀前气相焓 `h_vap`
|
||
- 膨胀阀前液相焓 `h_liq`
|
||
2. 由总流量与液体流量推算气体流量,按质量流量计算混合焓 `h_mix`。
|
||
3. 由吸气压力求饱和液/饱和气焓:`h_satL`、`h_satV`。
|
||
4. 干度:
|
||
|
||
`x = (h_mix - h_satL) / (h_satV - h_satL)`
|
||
|
||
并进行必要的边界处理(除零、NaN、限幅等由 Calculator 内实现)。
|
||
|
||
## 5. 六参数计算(ThermodynamicSixResultsCalculator)概要
|
||
|
||
### 5.1 输出结果
|
||
|
||
- `Qc`:制冷量(kW)
|
||
- `Qh`:制热量(kW)
|
||
- `COPc`:制冷 COP
|
||
- `COPh`:制热 COP
|
||
- `ηs`:等熵效率(%)
|
||
- `ηv`:容积效率(%)
|
||
|
||
### 5.2 h3(液路阀前/冷凝出口)关键规则:Tsat-10°C
|
||
|
||
该规则已封装在 `ThermodynamicSixResultsCalculator` 内部:
|
||
|
||
- 由**排气压力**计算饱和温度 `Tsat_discharge`
|
||
- 取 `T_for_h3 = Tsat_discharge - 10°C`
|
||
- 用 `TxvFrPress` 与 `T_for_h3` 求液体点焓 `h3`
|
||
|
||
注意:这是为了对齐现场 LabVIEW 流程/截图对比,属于业务约束。
|
||
|
||
### 5.3 典型计算链路(概念级)
|
||
|
||
- h1/s1:吸气点(由吸气 P/T 求物性)
|
||
- h2:排气点(由排气 P/T 求物性)
|
||
- h2s:等熵压缩出口点(由排气压力 + s1 求物性)
|
||
- h3:液体点(由 TxvFrPress + (Tsat(DischargePress)-10°C) 求物性)
|
||
|
||
由焓差与质量流量计算 Qc/Qh,并结合功率得到 COP。
|
||
|
||
## 6. REFPROP 初始化与线程安全
|
||
|
||
- `PPCService` 内使用静态锁:`_refpropLock`
|
||
- 原因:REFPROP Fortran DLL 内部通常存在全局状态/非线程安全调用。
|
||
- 约束:
|
||
- `EnsureRefpropInitialized()` 必须在锁内进行。
|
||
- 所有直接 REFPROP 原生调用也必须串行化。
|
||
|
||
Calculator 内部同样通过外部传入的锁对象串行化 REFPROP 调用。
|
||
|
||
## 7. 结果写回约定
|
||
|
||
- `DrynessTag`:按百分比写回(`x * 100`)。
|
||
- `DrynessTag2Value`:按百分比用于界面绑定(`x * 100`)。
|
||
- `Qh/Qc`:Tag 单位为 `W`,Calculator 输出为 `kW`,写回时乘 `1000`。
|
||
|
||
## 8. 扩展/维护建议
|
||
|
||
- 如后续希望让 `PPCService` 更纯粹:
|
||
- 可将过热度/过冷度计算也下沉到独立 Calculator(避免在 Service 里直接调用 SATP)。
|
||
- 工质切换:
|
||
- 当前 `EnsureRefpropInitialized()` 默认只加载 `R134A.FLD`。
|
||
- 若要支持 `R1234yf` 等,需要根据配置选择对应 `.FLD` 文件。
|
||
|