PH線図: pressure-enthalpy chart

熱力学
Author

Ryo Nakagami

Published

2025-06-14

Modified

2025-06-25

PH線図

PH線図(圧力-比エンタルピー線図)は,縦軸に圧力p,横軸に比エンタルピーhをとり, 実用上の便利さから縦軸は圧力の対数で目盛られています. 比エンタルピーは直接測定することは困難ですが,圧力と温度は測定することができるので,それらの値からPH線図をベースに比エンタルピーを計算し,冷媒の状態を把握します.

用語 意味 図での位置
飽和液線 液体が蒸発を始める境界.この線の左側は「液体(サブクール液)」領域 湿り蒸気領域の左端(青線)
飽和蒸気線 蒸気が凝縮を始める境界.この線の右側は「過熱蒸気(superheated vapor)」領域 湿り蒸気領域の右端(オレンジ線)
二相領域 液体と蒸気が共存(沸騰 or 凝縮中) 飽和液線と蒸気線の間
Code
import numpy as np
import matplotlib.pyplot as plt
from CoolProp.CoolProp import PropsSI  # ← インストール後に import

fluid = "R410A"  # 任意の冷媒に変更可
pa_converter = 10**6


# Saturation curve
T_min = PropsSI("Ttriple", fluid) + 1.0  # [K]
T_crit = PropsSI("Tcrit", fluid)  # [K]
T_sat = np.linspace(T_min, T_crit - 1e-5, 200)

p_sat = PropsSI("P", "T", T_sat, "Q", 0, fluid)
h_liq = PropsSI("H", "T", T_sat, "Q", 0, fluid) / 1000  # [kJ/kg]
h_vap = PropsSI("H", "T", T_sat, "Q", 1, fluid) / 1000  # [kJ/kg]

plt.figure(figsize=(8, 6))
plt.plot(h_liq, p_sat / pa_converter, label="Saturated Liquid")
plt.plot(h_vap, p_sat / pa_converter, label="Saturated Vapor")

# 適当な等温線(任意で)
for T_iso in np.linspace(T_crit - 123.5, T_crit + 60, 4):
    p_iso = np.logspace(np.log10(p_sat.min()), np.log10(p_sat.max()), 150)
    h_iso = PropsSI("H", "T", T_iso, "P", p_iso, fluid) / 1000
    plt.plot(
        h_iso,
        p_iso / pa_converter,
        linestyle="--",
        label=f"{T_iso - 273.15:.0f} °C Isotherm",
    )

plt.yscale("log")
plt.xlabel("Enthalpy [kJ/kg]")
plt.ylabel("Pressure [MPa]")
plt.title(f"Pressure–Enthalpy (p-h) Diagram for {fluid}")
plt.legend()
plt.grid(True, which="both", ls=":")
plt.tight_layout()
plt.show()
Figure 1

乾き度と湿り度

飽和蒸気と飽和液が共存している湿り蒸気状態は,温度と圧力の他に,湿り蒸気中の飽和蒸気の質量分率を指定しないと比エンタルピーの位置は定まりません.

Definition 1 乾き度

  • 湿り蒸気 1kg 中に飽和蒸気が x(kg) 含まれているとき,この湿り蒸気の乾き度は x であるという
  • 湿り度は,飽和液の質量分率 (1 - x) のことをいう
状態 説明 乾き度 \(x\)
過冷却液 飽和液体よりも温度が低い状態(液体のみ) \(x = 0\)
飽和液体 蒸発開始直前の状態 \(x = 0\)
混合(液 + 蒸気) 液体と蒸気が共存する状態(蒸発中),湿り蒸気 \(0 < x < 1\)
飽和蒸気 蒸発終了直後の状態 \(x = 1\)
加熱蒸気 飽和蒸気よりも高温の蒸気(完全に蒸気) \(x = 1\)
Code
# Define data arrays
x_values = np.array([0.0, 1.0])
kawaki_values = [0, 0.2, 1.0]
h_vap_line = np.zeros_like(x_values)
TC = -15
T = TC + 273.15

for i, x in enumerate(x_values):
    h_vap_line[i] = PropsSI("H", "T", T, "Q", x, fluid) / 1000
p_sat_line = PropsSI("P", "T", T, "Q", 0, fluid)

plt.figure(figsize=(8, 6))

for i, kawaki in enumerate(kawaki_values):
    plt.scatter(
        (1 - kawaki) * h_vap_line[0] + kawaki * h_vap_line[1],
        p_sat_line / pa_converter,
        label=f"h{i}",
    )

# 飽和液~飽和蒸気を結ぶ -15 °C 等温線(破線)
plt.plot([h_vap_line[0], h_vap_line[1]], [p_sat_line / pa_converter, p_sat_line / pa_converter],
         linestyle='--', color='gray', label=f'{TC} °C Isotherm')

plt.plot(h_liq, p_sat / pa_converter, label="Saturated Liquid")
plt.plot(h_vap, p_sat / pa_converter, label="Saturated Vapor")
plt.yscale("log")
plt.xlabel("Enthalpy [kJ/kg]")
plt.ylabel("Pressure [MPa]")
plt.legend()
plt.grid(True, which="both", ls=":")
plt.tight_layout()
plt.show()

\(h_1\) における乾き度の計算は以下

\[ x = \frac{h_1 - h_0}{h_2 - h_0} \]

熱伝達と粘性係数
  • 冷媒側熱伝達率はプラントル数に依存
  • プラントル数は熱伝導に関する無次元の物性値であり,流体の動粘度と熱拡散係数の比です.

\[ Pr = \frac{\mu \cdot C_p}{\lambda} \]

  • \(Pr\): プラントル数
  • \(\mu\): 粘性係数 [kg/m・s]
  • \(C_p\): 定圧比熱 [J/kg・K]
  • \(\lambda\): 熱伝導率 [W/m・K]

そして粘性係数 \(\mu\) はMcAdamsモデルを用いると

\[ \frac{1}{\mu} = \frac{x}{\mu_v} + \frac{1-x}{\mu_l} \]

  • \(x\): 乾き度
  • \(v\): ガス相
  • \(l\): 液相

加熱蒸気の比体積

加熱蒸気の比体積 \(v_h\) [m³/kg] は,加熱蒸気を理想気体と近似できる場合には理想気体の状態方程式より以下のように表すことができます

\[ \begin{align} v_h &= \frac{v_eT_h}{T_e}\\ &= v_e\left(1 + \frac{\Delta_h}{T_e}\right) \end{align} \]

  • \(v_e\): 飽和蒸気線での比体積
  • \(T_h\): 加熱蒸気の温度
  • \(\Delta_h\): 加熱度
比体積と圧縮機と冷媒循環量

系の冷媒循環量 \(q_m\) [kg/h] は熱交換量を決定する重要な要素です.そして,\(q_m\) は圧縮機の性能と運転条件に依存します. 容積型蒸気圧縮機は,単位時間あたり一定容積のガスを吸い込んで吐き出すものです.理論押しのけ量 \(V_p\) [m³/h] は

\[ V_p = V_{st} \times N_{comp} \times 3600 \times 10^{-6} \]

  • \(V_{st}\): ストロークボリューム [cm³]
  • \(N_{comp}\): 回転 / 秒 = Hz
  • \(V_p\): 理論ピストン押しのけ量 [m³/h]

これを質量に変換すると循環流量 \(q_m\) になります

\[ q_m = V_p \times \frac{1}{v_g}\times \eta_v \]

  • \(v_g\): 吸入冷媒ガスの比容積
  • \(1/v_g\): 密度
  • \(\eta_v\): 体積効率 (0.8~0.9程度)

冷媒の臨界温度と臨界圧力

Definition 2 臨界点(Critical Point)

  • PH線図の,飽和液体線と飽和蒸気線の高圧・高温側の終点(接合点)を臨界点と呼ぶ
  • この点における圧力を臨界圧力,温度を臨界温度と言う
  • 臨界点以上では蒸発現象も液化現象もなく,液相と気相の区別はつかなくなって,相変化は存在しない

冷凍サイクルでは冷媒ガスの液化(凝縮)の過程を必要とするので,冷媒としては臨界点(臨界温度)は 液化させるための冷却水または冷却空気の温度より著しく高いことが必要となります. Figure 1 の紫色線は臨界温度と同じ等温線を表しています.この温度よりも高い温度では冷媒を液化することはできません.

Code
import pandas as pd
ref_list = ['R134a', 'R22', 'R410A', 'R717', 'R744']

ref_list = ['R134a', 'R22', 'R410A', 'R717', 'R744']

records = []
for ref in ref_list:
    T_c = PropsSI('Tcrit', ref)          # [K]
    P_c = PropsSI('Pcrit', ref) / 1e6    # [MPa]
    records.append({'Fluid': ref,
                    'T_crit [K]': T_c,
                    'T_crit [°C]': T_c - 273.15,
                    'P_crit [MPa]': P_c})

df = pd.DataFrame(records)
df
Fluid T_crit [K] T_crit [°C] P_crit [MPa]
0 R134a 374.2100 101.0600 4.059280
1 R22 369.2950 96.1450 4.990000
2 R410A 344.4940 71.3440 4.901200
3 R717 405.5600 132.4100 11.363391
4 R744 304.1282 30.9782 7.377300
Figure 2: 冷媒の臨界温度と臨界圧力

R410A冷媒を使った理想冷凍サイクルのPH線図の作図

Exercise 1 R410AのPH線図作図

入力条件

パラメータ
蒸発温度 \(T_{\text{evap}}\) -15 ℃
凝縮温度 \(T_{\text{cond}}\) 30 ℃
過冷却度 5 ℃
過熱度 5 ℃
冷媒 R410A
Solution
Code
import CoolProp.CoolProp as CP

fluid = "R22"

# 温度設定(すべて [K] に変換)
T_evap = -15 + 273.15  # 蒸発温度
T_cond = 30 + 273.15  # 凝縮温度
dT_subcool = 5  # 過冷却
dT_superheat = 5  # 過熱

# 飽和圧力(蒸発器側と凝縮器側)
P_evap = CP.PropsSI(
    "P", "T", T_evap, "Q", 1, fluid
)  # 温度 T_evap で品質(乾き度)Q = 1 のとき(=飽和蒸気)の圧力 P
P_cond = CP.PropsSI(
    "P", "T", T_cond, "Q", 0, fluid
)  # 温度 T_cond で品質(乾き度)Q = 0 のときの圧力 P

# 状態1: 蒸発器出口(過熱蒸気)
T1 = T_evap + dT_superheat
h1 = CP.PropsSI("H", "T", T1, "P", P_evap, fluid)
s1 = CP.PropsSI("S", "T", T1, "P", P_evap, fluid)

# 状態2: 圧縮機出口(断熱圧縮)
h2 = CP.PropsSI("H", "P", P_cond, "S", s1, fluid)
T2 = CP.PropsSI("T", "P", P_cond, "H", h2, fluid)

# ========= 等エントロピー線を生成 =========
# 入口圧~出口圧まで対数刻みでサンプリング
P_line = np.logspace(np.log10(P_evap), np.log10(P_cond), 200)  # [Pa]
h_line = CP.PropsSI("H", "P", P_line, "S", s1, fluid)  # [J/kg]

# 状態3: 凝縮器出口(過冷却液)
T3 = T_cond - dT_subcool
h3 = CP.PropsSI("H", "T", T3, "P", P_cond, fluid)

# 状態4: 膨張弁出口(等エンタルピー膨張)
h4 = h3
T4 = CP.PropsSI("T", "P", P_evap, "H", h4, fluid)

# 冷凍能力(1 kgあたり)
q_in = h1 - h4  # 蒸発器での吸熱
w_in = h2 - h1  # 圧縮機の仕事
q_out = h2 - h3  # 凝縮器での放熱
COP = q_in / w_in  # 成績係数

# 結果表示
print("=== 冷凍サイクル各点の状態(単位: SI) ===")
print(f"状態1(過熱蒸気): T={T1 - 273.15:.2f}°C, h={h1 / 1000:.2f} kJ/kg")
print(f"状態2(圧縮後)  : T={T2 - 273.15:.2f}°C, h={h2 / 1000:.2f} kJ/kg")
print(f"状態3(過冷却液): T={T3 - 273.15:.2f}°C, h={h3 / 1000:.2f} kJ/kg")
print(f"状態4(膨張後)  : T={T4 - 273.15:.2f}°C, h={h4 / 1000:.2f} kJ/kg")

print("\n=== 性能指標 ===")
print(f"冷凍能力 q_in   : {q_in / 1000:.2f} kJ/kg")
print(f"圧縮機仕事 w_in : {w_in / 1000:.2f} kJ/kg")
print(f"COP (成績係数)  : {COP:.2f}")

# plot
h_points = [h2 / 1e3, h3 / 1e3, h4 / 1e3, h1 / 1e3]
P_points = [P_cond / 1e6, P_cond / 1e6, P_evap / 1e6, P_evap / 1e6]

plt.figure(figsize=(8, 6))
plt.plot(
    h_points,
    P_points,
    marker="o",
    linestyle="-",
    color="blue",
    label="refrigeration cycle",
)

# Add labels at each point
for i, (h, P) in enumerate(zip(h_points, P_points), start=1):
    plt.text(
        h + 1, P + 0.02, f"{(i % 4) + 1}", fontsize=12, color="black"
    )  # adjust offsets as needed

plt.plot(h_line / 1000, P_line / 1e6, linestyle="-", color="blue")
plt.xlabel("h [kJ/kg]")
plt.ylabel("P [MPa]")
plt.grid(True)

# Saturation curve
T_min = -20 + 273.15
T_crit = 49 + 273.15  # [K]
T_sat = np.linspace(T_min, T_crit - 1e-5, 200)

p_sat = PropsSI("P", "T", T_sat, "Q", 0, fluid)
h_liq = PropsSI("H", "T", T_sat, "Q", 0, fluid) / 1000  # [kJ/kg]
h_vap = PropsSI("H", "T", T_sat, "Q", 1, fluid) / 1000  # [kJ/kg]

plt.plot(h_liq, p_sat / pa_converter, label="Saturated Liquid")
plt.plot(h_vap, p_sat / pa_converter, label="Saturated Vapor")

plt.yscale("log")
plt.xlabel("Enthalpy [kJ/kg]")
plt.ylabel("Pressure [MPa]")
plt.title(f"Pressure–Enthalpy (p-h) Diagram for {fluid}")
plt.legend()
plt.grid(True, which="both", ls=":")
plt.tight_layout()
plt.show()
=== 冷凍サイクル各点の状態(単位: SI) ===
状態1(過熱蒸気): T=-10.00°C, h=402.57 kJ/kg
状態2(圧縮後)  : T=58.13°C, h=438.30 kJ/kg
状態3(過冷却液): T=25.00°C, h=230.29 kJ/kg
状態4(膨張後)  : T=-15.00°C, h=230.29 kJ/kg

=== 性能指標 ===
冷凍能力 q_in   : 172.28 kJ/kg
圧縮機仕事 w_in : 35.74 kJ/kg
COP (成績係数)  : 4.82

1→2: 断熱変化

  • 蒸発器を出た加熱状態の冷媒蒸気は,圧縮機に吸い込まれて等比エントロピーで可逆断熱圧縮され,高圧で加熱度の大きな加熱蒸気になって吐き出される

2→3: 等圧変化

  • 圧縮機から吐き出された加熱ガスは,凝縮器での冷却作用により,等圧のもとで顕熱を放出して飽和蒸気になる
  • 凝縮行程が進むに連れ,凝縮の潜熱を放出して湿り蒸気になり,更に冷却されると乾き度がゼロの飽和液になる
  • その後,顕熱を放出して過冷却液になる

3→4: 等比エンタルピー変化

  • 膨張弁で絞り膨張される
    • 絞り膨張: 流体が弁部などの狭い通路を通過する際,流れの抵抗により圧力硬化する現象
  • 熱と仕事の出入りがないので比エンタルピーは変化せずに圧力が下がる
  • 飽和液線を超えると自身の熱エネルギーを蒸発の潜熱として消費し,湿り蒸気となって蒸発器に流入
    • 発生した蒸気をフラッシュ蒸気と呼ぶ
  • 膨張によって冷媒の比エンタルピーは変化しないが,比エントロピーは増大する

4→1: 等圧変化

  • 冷媒は蒸発気に入り,等圧のもとで外部から熱を受け入れる
  • 冷媒液に潜熱が加えられ,乾き度が大きくなり,飽和蒸気となる
  • 更に顕熱が加えられ,加熱蒸気になり,圧縮機に吸い込まれる

非共沸混合冷媒のPH線図

湿り蒸気領域における等温線は,単一成分冷媒では等圧線と並行ですが,非共沸混合冷媒では右下がりの勾配を持った線になります. 湿り蒸気が加熱(蒸発器内)または冷却(凝縮器内)に伴う相変化によって乾き度が変化すると,湿り蒸気中の飽和蒸気と飽和液のいずれも混合組成割合が 変わるため,等温のもとでは,飽和圧力が変化することによる.

Code
fluid = "R407C"  # 任意の冷媒に変更可
pa_converter = 10**6


def linear_interp_inf(x):
    x = np.array(x)
    mask = np.isfinite(x)  # finiteなインデックス
    return np.interp(np.arange(len(x)), np.where(mask)[0], x[mask])


# Saturation curve
T_min = PropsSI("Ttriple", fluid) + 1.0  # [K]
T_crit = PropsSI("Tcrit", fluid)  # [K]
T_sat = np.linspace(T_min, T_crit - 1e-5, 200)

p_sat = PropsSI("P", "T", T_sat, "Q", 0, fluid)
h_liq = PropsSI("H", "T", T_sat, "Q", 0, fluid) / 1000  # [kJ/kg]
h_vap = PropsSI("H", "T", T_sat, "Q", 1, fluid) / 1000  # [kJ/kg]

plt.figure(figsize=(8, 6))
plt.plot(h_liq, p_sat / pa_converter, label="Saturated Liquid")
plt.plot(h_vap, p_sat / pa_converter, label="Saturated Vapor")

# 適当な等温線(任意で)
for T_iso in np.linspace(T_crit - 123.5, T_crit + 60, 4):
    p_iso = np.logspace(np.log10(p_sat.min()), np.log10(p_sat.max()), 150)
    h_iso = PropsSI("H", "T", T_iso, "P", p_iso, fluid) / 1000
    h_iso = linear_interp_inf(h_iso)
    plt.plot(
        h_iso,
        p_iso / pa_converter,
        linestyle="-",
        label=f"{T_iso - 273.15:.0f} °C Isotherm",
    )

plt.yscale("log")
plt.xlabel("Enthalpy [kJ/kg]")
plt.ylabel("Pressure [MPa]")
plt.title(f"Pressure–Enthalpy (p-h) Diagram for {fluid}")
plt.legend()
plt.grid(True, which="both", ls=":")
plt.tight_layout()
plt.show()
Figure 3

Definition 3 温度勾配

ある一定の等圧線上の沸点と露点の温度が異なり,露点における温度のほうが沸点における温度よりも高くなっているとき,この等圧線上の沸点と露点との温度差を温度勾配と呼ぶ

  • R404AやR410Aは0.2~0.4Kのオーダー
  • R407Cは温度勾配が大きく4.5Kほど

📘 理解度チェック

Exercise 2 臨界温度

次の記述のうち正しいものはどれか?

  1. 臨界点は,気体と液体の区別がなくなる状態点である.この臨界点は飽和圧力曲線の終点として表される.臨界点における温度および圧力を臨界温度および臨界圧力という.
  2. 冷凍装置は,通常,凝縮温度を冷媒の臨界温度よりも高い温度で使用している

a

Exercise 3 圧縮機

次の記述のうち正しいものはどれか?

  1. 圧縮機の吸い込み蒸気の比体積を直接測定するのは困難である.そのため,吸い込み蒸気の圧力と温度を図って,それらの値からPH線図や熱力学性質表を用いて冷媒の比体積を求める
  2. 比体積の単位は m³/kg であり,比体積が大きくなると冷媒蒸気の密度は小さくなる
  3. 圧縮機吸込み圧力が低下すると,吸込み蒸気の比体積が大きくなるので,圧縮機駆動の軸動力は小さくなる

a, b, c

Exercise 4 膨張弁

次の記述のうち正しいものはどれか?

  1. 膨張弁は過冷却となった冷媒液を絞り膨張させることで,蒸発圧力まで冷媒の圧力を下げる
  2. 膨張弁で蒸発圧力まで冷媒の圧力を下げる際,例b内は周囲との間で,熱と仕事の授受を行うことで冷媒自身の温度を下げている

a,