Détente et distributeurs directionnels
Cette page documente deux familles de composants backend d”EnergySystemModels :
le détendeur (
ThermodynamicCycles.Expansion_Valve), qui réalise une détente isenthalpique d’un fluide ;les distributeurs directionnels (
ThermodynamicCycles.DirectionalControl), qui routent un fluide entre les ports P, A, B et T selon un état logique (vannes 3/2, 4/2, 4/3).
Tous ces modèles s’appuient sur le connecteur commun FluidPort (fluide,
pression \(P\) en Pa, enthalpie massique \(h\) en J/kg, débit massique
\(F\) en kg/s). La méthode calculate() propage l’état d’un port amont vers
un port aval.
Détendeur / vanne d’expansion (Expansion_Valve)
Rôle
Le détendeur modélise la détente isenthalpique (laminage, sans travail extérieur) d’un fluide entre une haute pression amont et une basse pression aval. C’est l’organe de détente classique d’un cycle frigorifique.
Connecteurs / ports
Port |
Type |
Rôle |
|---|---|---|
|
|
Entrée haute pression (fluide, \(h\), \(P\), \(F\) fixés en amont). |
|
|
Sortie basse pression. La pression |
Équations réelles
La détente est isenthalpique : l’enthalpie est conservée, seule la pression
change (imposée à Outlet.P). Le code exécute exactement :
La puissance d’échange avec l’extérieur est nulle par construction (détente sans
travail extérieur) ; le modèle la calcule néanmoins et la stocke dans Q_exp :
Le fluide de sortie est identique à celui d’entrée
(Outlet.fluid = Inlet.fluid), puis Outlet.calculate_properties() complète
les propriétés (température, entropie, densité…).
Paramètres et attributs
Le constructeur __init__ ne prend aucun argument ; les attributs sont
renseignés directement.
Attribut |
Unité |
Description |
|---|---|---|
|
|
Port d’entrée (fluide, \(h\), \(P\), \(F\)). |
|
|
Port de sortie ; |
|
W |
Puissance de détente (nulle par construction), calculée à l’appel. |
|
|
Synthèse (fluide, |
Exemple
from ThermodynamicCycles.Expansion_Valve import Expansion_Valve
from ThermodynamicCycles.FluidPort.FluidPort import ThermoPropsSI
detendeur = Expansion_Valve.Object()
# Entrée : R134a liquide à la haute pression (ex. 10 bar)
detendeur.Inlet.fluid = "R134a"
detendeur.Inlet.F = 1.0 # kg/s
detendeur.Inlet.P = 10.17e5 # Pa (haute pression)
detendeur.Inlet.h = ThermoPropsSI("H", "P", 10.17e5, "T", 40 + 273.15, "R134a")
# Basse pression cible imposée sur la sortie (ex. 3,5 bar)
detendeur.Outlet.P = 3.5e5 # Pa
detendeur.calculate()
print(detendeur.df)
print("Q_exp =", detendeur.Q_exp, "W") # ~ 0 (isenthalpique)
Note
L’enthalpie Inlet.h (et la pression Outlet.P) doivent être fixées avant
calculate(). Dans un cycle complet (voir Chiller (Groupe froid / PAC)), ces valeurs sont
propagées automatiquement depuis le condenseur en amont.
Distributeurs directionnels (DirectionalControl)
Les distributeurs directionnels sont des vannes de routage (portage
Modelica DirectionalControl). Ils ne modifient ni l’enthalpie ni la pression :
ils recopient l’état d’un port source vers un port destination selon un état
logique u. Chaque modèle nomme ses ports d’après la convention hydraulique
standard :
P : pression / alimentation (supply, en provenance de la pompe) ;
T : retour réservoir (tank) ;
A, B : ports utilisateur (côté actionneur).
Le routage transmet fluid, P, h et F du port source au port
destination ; le port non actif n’est pas alimenté. Le résultat est résumé dans
df (dont la clé route donne le chemin actif).
DCV 3/2 — 3 voies, 2 positions (DCV_3_2)
Rôle : sélectionner l’une de deux sources d’alimentation alternatives (P ou T)
vers un port commun A, piloté par un booléen u.
Ports : Inlet_P et Inlet_T (deux entrées alternatives), Outlet_A
(sortie commune). Type FluidPort.
Routage (état logique u booléen) :
|
Chemin ( |
Description |
|---|---|---|
|
|
|
|
|
|
Le port actif recopie fluid, P, h et F vers Outlet_A (si le
débit source est None, il est ramené à 0.0).
Attribut |
Type / défaut |
Description |
|---|---|---|
|
|
Entrée alimentation P. |
|
|
Entrée alternative T (retour réservoir). |
|
|
Sortie commune (port utilisateur). |
|
|
État logique : |
|
|
Horodatage optionnel (repris dans |
|
|
Synthèse : |
from ThermodynamicCycles.DirectionalControl import DCV_3_2
v = DCV_3_2.Object()
v.Inlet_P.fluid = "water"; v.Inlet_P.P = 3e5; v.Inlet_P.h = 1.0e5; v.Inlet_P.F = 1.2
v.Inlet_T.fluid = "water"; v.Inlet_T.P = 3e5; v.Inlet_T.h = 0.8e5; v.Inlet_T.F = 0.5
v.u = False # False : P -> A
v.calculate()
print(v.df) # route = "P->A"
DCV 4/2 — 4 voies, 2 positions (DCV_4_2)
Rôle : distributeur d’actionneur (vérin double effet). Il route
deux paires de ports simultanément selon u — un chemin alimentation
(P→actionneur) et un chemin retour (actionneur→T). Pas de mélange : chaque chemin
est indépendant.
Ports : Inlet_P (alimentation), Outlet_T (retour réservoir),
port_A et port_B (ports utilisateur côté actionneur, dont le sens dépend
de u). Type FluidPort.
Routage (état logique u booléen) :
|
Chemin ( |
Description |
|---|---|---|
|
|
P alimente |
|
|
P alimente |
Selon u, le port alimenté (A ou B) recopie l’état de Inlet_P ; le port de
retour recopie son état vers Outlet_T (débit None ramené à 0.0).
Attribut |
Type / défaut |
Description |
|---|---|---|
|
|
Alimentation (supply, côté pompe). |
|
|
Retour réservoir. |
|
|
Port utilisateur A (entrée ou sortie selon |
|
|
Port utilisateur B (entrée ou sortie selon |
|
|
|
|
|
Horodatage optionnel. |
|
|
Synthèse : |
from ThermodynamicCycles.DirectionalControl import DCV_4_2
v = DCV_4_2.Object()
v.Inlet_P.fluid = "oil"; v.Inlet_P.P = 150e5; v.Inlet_P.h = 1.0e5; v.Inlet_P.F = 0.3
v.port_B.fluid = "oil"; v.port_B.P = 2e5; v.port_B.h = 0.9e5; v.port_B.F = 0.3
v.u = False # P -> A (alimentation), B -> T (retour)
v.calculate()
print(v.df) # route = "P->A, B->T"
DCV 4/3 centre fermé B — 4 voies, 3 positions (DCV_4_3_B)
Rôle : distributeur d’actionneur à trois positions avec un centre de type B
(centre fermé : tous les ports bloqués en position neutre). Piloté par un
entier u dans \(\{-1, 0, +1\}\).
Ports : Inlet_P (alimentation), Outlet_T (retour), port_A et
port_B (côté actionneur). Type FluidPort.
Routage (état logique u entier) :
|
Chemin ( |
Description |
|---|---|---|
|
|
Mouvement direct : P alimente A, B revient vers T. |
|
|
Centre fermé (type B) : |
|
|
Mouvement inverse : P alimente B, A revient vers T. |
En position neutre (u = 0), seuls les débits sont forcés à 0.0 (tous les
ports bloqués). Dans les positions +1 / -1, le routage recopie fluid,
P, h et F comme pour le DCV 4/2.
Attribut |
Type / défaut |
Description |
|---|---|---|
|
|
Alimentation. |
|
|
Retour réservoir. |
|
|
Port utilisateur A. |
|
|
Port utilisateur B. |
|
|
|
|
|
Horodatage optionnel. |
|
|
Synthèse : |
from ThermodynamicCycles.DirectionalControl import DCV_4_3_B
v = DCV_4_3_B.Object()
v.Inlet_P.fluid = "oil"; v.Inlet_P.P = 150e5; v.Inlet_P.h = 1.0e5; v.Inlet_P.F = 0.3
v.port_B.fluid = "oil"; v.port_B.P = 2e5; v.port_B.h = 0.9e5; v.port_B.F = 0.3
v.u = 1 # P -> A, B -> T (mouvement direct)
v.calculate()
print(v.df) # route = "P->A, B->T"
v.u = 0 # centre fermé : tous débits nuls
v.calculate()
print(v.df) # route = "centre bloque"
Note
Les distributeurs directionnels sont des modèles de routage logique : ils n’appliquent aucune perte de charge ni loi \(K_v\). Pour un réglage hydraulique avec perte de charge et autorité, voir la Vanne 3 voies (mélange / injection / répartition).