Ajout d'une batterie adiabatique en extraction devant récupérateur
Procédure
Le script C# effectue un prétraitement du modèle avant envoie de la simulation à EnergyPlus. Il recherche une boucle d'air et ajoute dans sa CTA une batterie adiabatique (nommée évaporative dans DesignBuilder). Cette batterie se situe entre le ventilateur d'extraction et le récupérateur afin de rafraichir l'air avant passage dans le récupérateur pour améliorer le rafraichissement en période chaude.
Un script EMS optionel d'arrêt/démarrage de la batterie adiabatique est aussi proposé.
Version : 6.1 Prérequis : Module Script et utilisation du CVC Détaillé
Installation dans DesignBuilder
Copier les scripts des onglets ci-dessous et coller les dans la catégorie CS-Script (ajout dans une CTA) et EMS (script de foncitonnement).
Remarque : le code est prévu pour l'utilisation de DesignBuilder en français.
Script C# d'ajout dans une CTA pour v6
Le code suivant cherche le nom d'une boucle d'air de votre schéma CVC, le nom est donc à remplacer ci-dessous. La batterie évaporative contient un planning de fonctionnement, vous pouvez mettre le nom d'un de vos plannings (exemple, le planning de fonctionnement de la CTA) ou en créer dans le code directement.
Un seul type de batterie évaporative est proposé mais vous pouvez remplacer celle de base proposée plus bas à l'aide de la documentation EnergyPlus.
Enfin, une sortie des m3 d'eau consommée est ajoutée pour information en pas horaire. Vous pouvez la commenter (ajout de // devant les lignes) si besoin. La consultation de cette donnée doit être faite avec Results Viewer.
using System.Collections.Generic;
using DB.Extensibility.Contracts;
using EpNet;
using System.Linq;
// Prérequis :
// La CTA doit posséder un ventilateur d'extraction
namespace DB.Extensibility.Scripts
{
public class IdfFindAndReplace : ScriptBase, IScript
{
public override void BeforeEnergySimulation()
{
IdfReader idfReader = new IdfReader(ApiEnvironment.EnergyPlusInputIdfPath, ApiEnvironment.EnergyPlusInputIddPath);
// Remplacer le nom de la boucle d'air par celle dans laquelle insérer la batterie évaporative
string nomBoucleRecherchee = "Distribution Air à remplacer";
nomBoucleRecherchee = nomBoucleRecherchee + " CTA";
// Si vous utilisez DB en anglais :
//nomBoucleRecherchee = nomBoucleRecherchee + " AHU";
IEnumerable<IdfObject> AirLoopMainBranches = idfReader["Branch"];
foreach (IdfObject branch in AirLoopMainBranches)
{
string nomBoucleAir = branch["Name"].Value;
if (nomBoucleAir == nomBoucleRecherchee + " Main Branch")
{
string ExtractFanOutletNode = branch["Component 1 Outlet Node Name"].Value;
int indexInsertion = 6;
string nomNoeudSortie = nomBoucleRecherchee + " Batterie Evaporative Outlet";
branch.InsertField(indexInsertion, "EvaporativeCooler:Direct:CelDekPad", "!Insérer par API Ajout Batterie adiabatique");
branch.InsertField(indexInsertion+1, nomBoucleRecherchee + " Batterie Evaporative", "!API Name");
branch.InsertField(indexInsertion+2, ExtractFanOutletNode, "!API Inlet");
branch.InsertField(indexInsertion+3, nomNoeudSortie, "!API Outlet");
branch[indexInsertion+6].Value = nomNoeudSortie;
var OutdoorAirControler = idfReader["Controller:OutdoorAir"].First(c => c["Name"] == nomBoucleRecherchee + " Contrôleur Air Extérieur");
// Si vous utilisez DB en anglais :
//
var OutdoorAirControler = idfReader["Controller:OutdoorAir"].First(c => c["Name"] == nomBoucleRecherchee + " Outdoor Air Controller");
OutdoorAirControler["Return Air Node Name"].Value = nomNoeudSortie;
var OutdoorAirMixer = idfReader["OutdoorAir:Mixer"].First(c => c["Name"] == nomBoucleRecherchee + " Mélangeur Air Extérieur");
// Si vous utilisez DB en anglais :
//
var OutdoorAirMixer = idfReader["OutdoorAir:Mixer"].First(c => c["Name"] == nomBoucleRecherchee + " Outdoor Air Mixer");
OutdoorAirMixer["Return air stream node name"].Value = nomNoeudSortie;
//Création d'un planning de fonctionnement de la batterie évaporative. Exemple à décommenter et nom à remplacer ci-dessous.
//idfReader.Load("Schedule:Compact,PlanningBattEvap,Fraction,Through: 31 Dec, For: AllDays,Until: 08:00,0,Until: 19:00,1,Until: 24:00,0;");
// Ou bien utilisation d'un nom de planning déjà existant dans DB. Attention, il doit être utilisé quelque part pour être envoyé à EnergyPlus et donc connu pour la batterie évaporative.
//Déclaration des caractéristiques de la batterie évaporative.
// 1) Type d'objet (ne pas modifier sauf si vous voulez un autre modèle, cf doc E+)
// 2) Nom de la batterie (ne pas modifier)
// 3) Nom du planning, à remplacer par celui de votre CTA ou, option, par le planning créé ci-dessus
// 4) m2 de la batterie par lesquels passe l'air
// 5) épaisseur en m du média humide
// 6) Consommation électrique de la pompe de reciculation de l'eau en Watts
// 7 et 8) ne pas modifier
idfReader.Load("EvaporativeCooler:Direct:CelDekPad," + nomBoucleRecherchee + " Batterie Evaporative,Planning fct CTA,0.6,0.2,100," + ExtractFanOutletNode + "," + nomNoeudSortie+";");
//Ajout de sorties spécifiques à lire dans Results Viewer.
//A mettre en commantaire si plus besoin. Donne les m3 d'eau évaporé en pas horaire. Au lieu de Hourly, il est possible de mettre Daily, Monthly, RunPeriod
idfReader.Load("Output:Variable, *, Evaporative Cooler Water Volume, hourly;");
}
}
idfReader.Save();
}
}
}
Script C# d'ajout dans une CTA pour v7
using System.Collections.Generic;
using DB.Extensibility.Contracts;
using EpNet;
using System.Linq;
// Prérequis :
// La CTA doit posséder un ventilateur d'extraction
namespace DB.Extensibility.Scripts
{
public class IdfFindAndReplace : ScriptBase, IScript
{
public override void BeforeEnergySimulation()
{
IdfReader idfReader = new IdfReader(ApiEnvironment.EnergyPlusInputIdfPath, ApiEnvironment.EnergyPlusInputIddPath);
// Remplacer le nom de la boucle d'air par celle dans laquelle insérer la batterie évaporative
string nomBoucleRecherchee = "Distribution Air à remplacer";
nomBoucleRecherchee = nomBoucleRecherchee + " CTA";
// Si vous utilisez DB en anglais :
//nomBoucleRecherchee = nomBoucleRecherchee + " AHU";
IEnumerable<IdfObject> AirLoopMainBranches = idfReader["Branch"];
foreach (IdfObject branch in AirLoopMainBranches)
{
string nomBoucleAir = branch["Name"].Value;
if (nomBoucleAir == nomBoucleRecherchee + " Main Branch")
{
string ExtractFanOutletNode = branch["Component 1 Outlet Node Name"].Value;
int indexInsertion = 6;
string nomNoeudSortie = nomBoucleRecherchee + " Batterie Evaporative Outlet";
branch.InsertField(indexInsertion, "EvaporativeCooler:Direct:CelDekPad", "!Insérer par API Ajout Batterie adiabatique");
branch.InsertField(indexInsertion+1, nomBoucleRecherchee + " Batterie Evaporative", "!API Name");
branch.InsertField(indexInsertion+2, ExtractFanOutletNode, "!API Inlet");
branch.InsertField(indexInsertion+3, nomNoeudSortie, "!API Outlet");
branch[indexInsertion+6].Value = nomNoeudSortie;
var OutdoorAirControler = idfReader["Controller:OutdoorAir"].First(c => c["Name"] == nomBoucleRecherchee + " Contrôleur Air Extérieur");
// Si vous utilisez DB en anglais :
//
var OutdoorAirControler = idfReader["Controller:OutdoorAir"].First(c => c["Name"] == nomBoucleRecherchee + " Outdoor Air Controller");
OutdoorAirControler["Return Air Node Name"].Value = nomNoeudSortie;
var OutdoorAirMixer = idfReader["OutdoorAir:Mixer"].First(c => c["Name"] == nomBoucleRecherchee + " Mélangeur Air Extérieur");
// Si vous utilisez DB en anglais :
//
var OutdoorAirMixer = idfReader["OutdoorAir:Mixer"].First(c => c["Name"] == nomBoucleRecherchee + " Outdoor Air Mixer");
OutdoorAirControler["Return Air Node Name"].Value = nomNoeudSortie;
var OutdoorAirMixer = idfReader["OutdoorAir:Mixer"].First(c => c["Name"] == nomBoucleRecherchee + " Mélangeur Air Extérieur");
OutdoorAirMixer["Return air stream node name"].Value = nomNoeudSortie;
//Création d'un planning de fonctionnement de la batterie évaporative. Exemple à décommenter et nom à remplacer ci-dessous.
//idfReader.Load("Schedule:Compact,PlanningBattEvap,Fraction,Through: 31 Dec, For: AllDays,Until: 08:00,0,Until: 19:00,1,Until: 24:00,0;");
// Ou bien utilisation d'un nom de planning déjà existant dans DB. Attention, il doit être utilisé quelque part pour être envoyé à EnergyPlus et donc connu pour la batterie évaporative.
//Déclaration des caractéristiques de la batterie évaporative.
// 1) Type d'objet (ne pas modifier sauf si vous voulez un autre modèle, cf doc E+)
// 2) Nom de la batterie (ne pas modifier)
// 3) Nom du planning, à remplacer par celui de votre CTA ou, option, par le planning créé ci-dessus
// 4) m2 de la batterie par lesquels passe l'air
// 5) épaisseur en m du média humide
// 6) Consommation électrique de la pompe de reciculation de l'eau en Watts
// 7 et 8) ne pas modifier
idfReader.Load("EvaporativeCooler:Direct:CelDekPad," + nomBoucleRecherchee + " Batterie Evaporative,Planning fct CTA,0.6,0.2,100," + ExtractFanOutletNode + "," + nomNoeudSortie+";");
//Ajout de sorties spécifiques à lire dans Results Viewer.
//A mettre en commantaire si plus besoin. Donne les m3 d'eau évaporé en pas horaire. Au lieu de Hourly, il est possible de mettre Daily, Monthly, RunPeriod
idfReader.Load("Output:Variable, *, Evaporative Cooler Water Volume, hourly;");
}
}
idfReader.Save();
}
}
}
Script EMS de fonctionnement
Ce script démarre ou arrête la batterie adiabatique selon des conditions de températures d'air extérieur et de reprise.
Les noms à remplacer sont indiqués entre crochets pour un meilleur repérage. Les caractères en dehors des corchets ne doivent pas être retirer ni modifier.
EnergyManagementSystem:Sensor,
TemperatureRepriseCTA,
[Nom CTA à remplacer] Supply Side Inlet,
System Node Temperature;
EnergyManagementSystem:Sensor,
TemperatureSecheExterieur,
Environment,
Site Outdoor Air Drybulb Temperature;
! Attention, le planning suivant doit être saisi en Type Compact
EnergyManagementSystem:Actuator,
ControleurPlanningEvap,
[Nom planning fonctionnement batterie adiabatique],
Schedule:Compact,
Schedule Value;
EnergyManagementSystem:Actuator,
ControleurPlanningRecuperateur,
[Nom planning de bypass de l'échangeur],
Schedule:Compact,
Schedule Value;
! Optionel : forcer l'arrêt d'une batterie chaude si l'adiabatique est en marche
!EnergyManagementSystem:Actuator,
!ControleurPlanningBattChCTA,
![Nom planning fonctionnement batterie chaude],
!Schedule:Compact,
!Schedule Value;
EnergyManagementSystem:ProgramCallingManager,
AppelRegulationBatterieEvaporative,
InsideHVACSystemIterationLoop,
RegulationBatterieEvaporative;
EnergyManagementSystem:Program,
RegulationBatterieEvaporative,
SET StatutRecuperateur = 1,
!Exemple de limitation du fonctionnement de la batterie adiabatique entre Mai et Septembre
IF Month >= 5 && Month <= 9,
SET StatutRecuperateur = 0,
ENDIF,
SET ControleurPlanningBattChCTA = NULL,
! Exemple de mise en marche si la température de reprise arrivant à la CTA est au dessus de 23°C et si la température extérieure est au dessus de 22°C
IF TemperatureRepriseCTA > 23 && TemperatureSecheExterieur > 22,
SET ControleurPlanningEvap = 1,
SET ControleurPlanningRecuperateur = 1,
! Option batterie chaude
! SET ControleurPlanningBattChCTA = 0,
ELSE,
SET ControleurPlanningEvap = 0,
IF StatutRecuperateur == 1,
SET ControleurPlanningRecuperateur = 1,
ELSE,
SET ControleurPlanningRecuperateur = 0,
ENDIF,
ENDIF,
;