Name | Description |
---|---|
ClosedLoop | Variable air volume flow system with terminal reheat and five thermal zones |
Controls | Package with controller models |
ThermalZones | Package with models for the thermal zones |
This model consist of an HVAC system, a building envelope model and a model for air flow through building leakage and through open doors based on wind pressure and flow imbalance of the HVAC system.
The HVAC system is a variable air volume (VAV) flow system with economizer and a heating and cooling coil in the air handler unit. There is also a reheat coil and an air damper in each of the five zone inlet branches. The figure below shows the schematic diagram of the HVAC system
The control is an implementation of the control sequence VAV 2A2-21232 of the Sequences of Operation for Common HVAC Systems (ASHRAE, 2006). In this control sequence, the supply fan speed is regulated based on the duct static pressure. The return fan controller tracks the supply fan air flow rate reduced by a fixed offset. The duct static pressure is adjusted so that at least one VAV damper is 90% open. The economizer dampers are modulated to track the setpoint for the mixed air dry bulb temperature. Priority is given to maintain a minimum outside air volume flow rate. In each zone, the VAV damper is adjusted to meet the room temperature setpoint for cooling, or fully opened during heating. The room temperature setpoint for heating is tracked by varying the water flow rate through the reheat coil. There is also a finite state machine that transitions the mode of operation of the HVAC system between the modes occupied, unoccupied off, unoccupied night set back, unoccupied warm-up and unoccupied pre-cool. In the VAV model, all air flows are computed based on the duct static pressure distribution and the performance curves of the fans. Local loop control is implemented using proportional and proportional-integral controllers, while the supervisory control is implemented using a finite state machine.
To model the heat transfer through the building envelope, a model of five interconnected rooms is used. The five room model is representative of one floor of the new construction medium office building for Chicago, IL, as described in the set of DOE Commercial Building Benchmarks (Deru et al, 2009). There are four perimeter zones and one core zone. The envelope thermal properties meet ASHRAE Standard 90.1-2004. The thermal room model computes transient heat conduction through walls, floors and ceilings and long-wave radiative heat exchange between surfaces. The convective heat transfer coefficient is computed based on the temperature difference between the surface and the room air. There is also a layer-by-layer short-wave radiation, long-wave radiation, convection and conduction heat transfer model for the windows. The model is similar to the Window 5 model and described in TARCOG 2006.
Each thermal zone can have air flow from the HVAC system, through leakages of the building envelope (except for the core zone) and through bi-directional air exchange through open doors that connect adjacent zones. The bi-directional air exchange is modeled based on the differences in static pressure between adjacent rooms at a reference height plus the difference in static pressure across the door height as a function of the difference in air density. There is also wind pressure acting on each facade. The wind pressure is a function of the wind speed and wind direction. Therefore, infiltration is a function of the flow imbalance of the HVAC system and of the wind conditions.
ASHRAE. Sequences of Operation for Common HVAC Systems. ASHRAE, Atlanta, GA, 2006.
Deru M., K. Field, D. Studer, K. Benne, B. Griffith, P. Torcellini, M. Halverson, D. Winiarski, B. Liu, M. Rosenberg, J. Huang, M. Yazdanian, and D. Crawley. DOE commercial building research benchmarks for commercial buildings. Technical report, U.S. Department of Energy, Energy Efficiency and Renewable Energy, Office of Building Technologies, Washington, DC, 2009.
TARCOG 2006: Carli, Inc., TARCOG: Mathematical models for calculation of thermal performance of glazing systems with our without shading devices, Technical Report, Oct. 17, 2006.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Type | Name | Default | Description |
---|---|---|---|
replaceable package MediumA | Buildings.Media.GasesPTDecou... | ||
Volume | VRooCor | 2698 | Room volume corridor [m3] |
Volume | VRooSou | 568.77 | Room volume south [m3] |
Volume | VRooNor | 568.77 | Room volume north [m3] |
Volume | VRooEas | 360.08 | Room volume east [m3] |
Volume | VRooWes | 360.08 | Room volume west [m3] |
MassFlowRate | m0_flow_cor | 5*VRooCor*conv | Design mass flow rate core [kg/s] |
MassFlowRate | m0_flow_sou | 5.5*VRooSou*conv | Design mass flow rate perimeter 1 [kg/s] |
MassFlowRate | m0_flow_eas | 8*VRooEas*conv | Design mass flow rate perimeter 2 [kg/s] |
MassFlowRate | m0_flow_nor | 5.5*VRooNor*conv | Design mass flow rate perimeter 3 [kg/s] |
MassFlowRate | m0_flow_wes | 8*VRooWes*conv | Design mass flow rate perimeter 4 [kg/s] |
MassFlowRate | m_flow_nominal | m0_flow_cor + m0_flow_sou + ... | Nominal mass flow rate [kg/s] |
Angle | lat | 41.98*3.14159/180 | Latitude [rad] |
Type | Name | Description |
---|---|---|
replaceable package MediumA | ||
ControlBus | controlBus | |
Bus | weaBus | Weather Data Bus |
model ClosedLoop "Variable air volume flow system with terminal reheat and five thermal zones" extends Modelica.Icons.Example; replaceable package MediumA = Buildings.Media.GasesPTDecoupled.MoistAirUnsaturated; package MediumW = Buildings.Media.ConstantPropertyLiquidWater "Medium model for water"; parameter Modelica.SIunits.Volume VRooCor=2698 "Room volume corridor"; parameter Modelica.SIunits.Volume VRooSou=568.77 "Room volume south"; parameter Modelica.SIunits.Volume VRooNor=568.77 "Room volume north"; parameter Modelica.SIunits.Volume VRooEas=360.08 "Room volume east"; parameter Modelica.SIunits.Volume VRooWes=360.08 "Room volume west"; constant Real conv=1.2/3600 "Conversion factor for nominal mass flow rate"; parameter Modelica.SIunits.MassFlowRate m0_flow_cor=5*VRooCor*conv "Design mass flow rate core"; parameter Modelica.SIunits.MassFlowRate m0_flow_sou=5.5*VRooSou*conv "Design mass flow rate perimeter 1"; parameter Modelica.SIunits.MassFlowRate m0_flow_eas=8*VRooEas*conv "Design mass flow rate perimeter 2"; parameter Modelica.SIunits.MassFlowRate m0_flow_nor=5.5*VRooNor*conv "Design mass flow rate perimeter 3"; parameter Modelica.SIunits.MassFlowRate m0_flow_wes=8*VRooWes*conv "Design mass flow rate perimeter 4"; parameter Modelica.SIunits.MassFlowRate m_flow_nominal=m0_flow_cor + m0_flow_sou + m0_flow_eas + m0_flow_nor + m0_flow_wes "Nominal mass flow rate"; parameter Modelica.SIunits.Angle lat=41.98*3.14159/180 "Latitude";Fluid.Sources.Outside amb(redeclare package Medium = MediumA, nPorts=2) "Ambient conditions"; Buildings.Fluid.FixedResistances.FixedResistanceDpM fil( m_flow_nominal=m_flow_nominal, redeclare package Medium = MediumA, dp_nominal=200 + 200 + 100, from_dp=false, linearized=false) "Filter"; Buildings.Fluid.HeatExchangers.DryEffectivenessNTU heaCoi( redeclare package Medium1 = MediumA, redeclare package Medium2 = MediumW, m1_flow_nominal=m_flow_nominal, allowFlowReversal2=false, dp2_nominal=6000, m2_flow_nominal=m_flow_nominal*1000*(10 - (-20))/4200/10, configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow, Q_flow_nominal=m_flow_nominal*1006*(16.7 - 8.5), dp1_nominal=0, T_a1_nominal=281.65, T_a2_nominal=323.15) "Heating coil"; Buildings.Fluid.HeatExchangers.WetCoilCounterFlow cooCoi( UA_nominal=m_flow_nominal*1000*15/ Buildings.Fluid.HeatExchangers.BaseClasses.lmtd( T_a1=26.2, T_b1=12.8, T_a2=6, T_b2=16), redeclare package Medium1 = MediumW, redeclare package Medium2 = MediumA, m1_flow_nominal=m_flow_nominal*1000*15/4200/10, m2_flow_nominal=m_flow_nominal, dp1_nominal=6000, dp2_nominal=0) "Cooling coil"; Buildings.Fluid.FixedResistances.FixedResistanceDpM dpSupDuc( m_flow_nominal=m_flow_nominal, dh=1, redeclare package Medium = MediumA, dp_nominal=20) "Pressure drop for supply duct"; Buildings.Fluid.FixedResistances.FixedResistanceDpM dpRetDuc( m_flow_nominal=m_flow_nominal, use_dh=false, dh=1, redeclare package Medium = MediumA, dp_nominal=20) "Pressure drop for return duct"; Buildings.Fluid.Movers.FlowMachine_y fanSup( redeclare package Medium = MediumA, tau=60, dynamicBalance=true, pressure(V_flow={0, m_flow_nominal/1.2*2}, dp={850,0})) "Supply air fan"; Buildings.Fluid.Movers.FlowMachine_y fanRet( redeclare package Medium = MediumA, tau=60, dynamicBalance=true, pressure(V_flow=m_flow_nominal/1.2*{0, 2}, dp=1.5*110*{2,0})) "Return air fan"; Buildings.Fluid.Sources.FixedBoundary sinHea( redeclare package Medium = MediumW, p=300000, T=318.15, nPorts=1) "Sink for heating coil"; Buildings.Fluid.Sources.FixedBoundary sinCoo( redeclare package Medium = MediumW, p=300000, T=285.15, nPorts=1) "Sink for cooling coil"; Modelica.Blocks.Routing.RealPassThrough TOut(y( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC", min=0)); inner Modelica.Fluid.System system( p_ambient(displayUnit="Pa"), energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_small=1E-4*m_flow_nominal); Buildings.Fluid.Sensors.TemperatureTwoPort TSup(redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal); Modelica.Blocks.Sources.Constant TSupSetHea(y( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC", min=0), k=273.15 + 10) "Supply air temperature setpoint for heating"; Buildings.Controls.Continuous.LimPID heaCoiCon( yMax=1, yMin=0, Ti=60, Td=60, initType=Modelica.Blocks.Types.InitPID.InitialState, controllerType=Modelica.Blocks.Types.SimpleController.P) "Controller for heating coil"; Buildings.Controls.Continuous.LimPID cooCoiCon( Ti=60, reverseAction=true, Td=60, initType=Modelica.Blocks.Types.InitPID.InitialState, yMax=1, yMin=0, controllerType=Modelica.Blocks.Types.SimpleController.P) "Controller for cooling coil"; Buildings.Fluid.Sensors.RelativePressure dpRetFan(redeclare package Medium = MediumA) "Pressure difference over return fan"; Controls.FanVFD conFanSup(xSet_nominal(displayUnit="Pa") = 410, r_N_min=0.0) "Controller for fan"; Buildings.Fluid.Sensors.VolumeFlowRate senSupFlo(redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal) "Sensor for supply fan flow rate"; Buildings.Controls.SetPoints.OccupancySchedule occSch(occupancy=3600*{6,19}) "Occupancy schedule"; Controls.ModeSelector modeSelector; Controls.ControlBus controlBus; Buildings.Fluid.Sensors.TemperatureTwoPort TCoiHeaOut(redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal) "Heating coil outlet temperature"; Buildings.Utilities.Math.Min min(nin=5) "Computes lowest room temperature"; Buildings.Utilities.Math.Average ave(nin=5) "Compute average of room temperatures"; Buildings.Fluid.Actuators.Valves.TwoWayLinear valCoo( redeclare package Medium = MediumW, CvData=Buildings.Fluid.Types.CvTypes.OpPoint, m_flow_nominal=m_flow_nominal*1000*15/4200/10, dp_nominal=6000, from_dp=true) "Cooling coil valve"; Buildings.Fluid.Sources.FixedBoundary souCoo( nPorts=1, redeclare package Medium = MediumW, p=3E5 + 12000, T=285.15) "Source for cooling coil"; Controls.Economizer conEco( dT=1, k=1, Ti=60, VOut_flow_min=0.3*m_flow_nominal/1.2) "Controller for economizer"; Buildings.Fluid.Sensors.TemperatureTwoPort TRet(redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal) "Return air temperature sensor"; Buildings.Fluid.Sensors.TemperatureTwoPort TMix(redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal) "Mixed air temperature sensor"; Controls.RoomTemperatureSetpoint TSetRoo; Buildings.Fluid.Actuators.Valves.TwoWayLinear valHea( redeclare package Medium = MediumW, CvData=Buildings.Fluid.Types.CvTypes.OpPoint, dp_nominal=6000, m_flow_nominal=m_flow_nominal*1000*40/4200/10, from_dp=true) "Heating coil valve"; Buildings.Fluid.Sources.FixedBoundary souHea( nPorts=1, redeclare package Medium = MediumW, p(displayUnit="Pa") = 300000 + 12000, T=318.15) "Source for heating coil"; Buildings.Fluid.Actuators.Dampers.MixingBox eco( redeclare package Medium = MediumA, mOut_flow_nominal=m_flow_nominal, mRec_flow_nominal=m_flow_nominal, mExh_flow_nominal=m_flow_nominal, dpOut_nominal=10, dpRec_nominal=10, dpExh_nominal=10) "Economizer"; Buildings.Fluid.Sensors.VolumeFlowRate VOut1(redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal) "Outside air volume flow rate"; Controls.DuctStaticPressureSetpoint pSetDuc( nin=5, controllerType=Modelica.Blocks.Types.SimpleController.PI, pMin=50) "Duct static pressure setpoint"; Buildings.Examples.VAVReheat.ThermalZones.VAVBranch cor( redeclare package MediumA = MediumA, redeclare package MediumW = MediumW, m_flow_nominal=m0_flow_cor, VRoo=VRooCor) "Zone for core of buildings (azimuth will be neglected)"; Buildings.Examples.VAVReheat.ThermalZones.VAVBranch sou( redeclare package MediumA = MediumA, redeclare package MediumW = MediumW, m_flow_nominal=m0_flow_sou, VRoo=VRooSou) "South-facing thermal zone"; Buildings.Examples.VAVReheat.ThermalZones.VAVBranch eas( redeclare package MediumA = MediumA, redeclare package MediumW = MediumW, m_flow_nominal=m0_flow_eas, VRoo=VRooEas) "East-facing thermal zone"; Buildings.Examples.VAVReheat.ThermalZones.VAVBranch nor( redeclare package MediumA = MediumA, redeclare package MediumW = MediumW, m_flow_nominal=m0_flow_nor, VRoo=VRooNor) "North-facing thermal zone"; Buildings.Examples.VAVReheat.ThermalZones.VAVBranch wes( redeclare package MediumA = MediumA, redeclare package MediumW = MediumW, m_flow_nominal=m0_flow_wes, VRoo=VRooWes) "West-facing thermal zone"; Controls.FanVFD conFanRet(xSet_nominal(displayUnit="m3/s") = m_flow_nominal/ 1.2, r_N_min=0.0) "Controller for fan"; Buildings.Fluid.Sensors.VolumeFlowRate senRetFlo(redeclare package Medium = MediumA, m_flow_nominal=m_flow_nominal) "Sensor for return fan flow rate"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetRoo1( redeclare package Medium = MediumA, m_flow_nominal={m_flow_nominal,m_flow_nominal - m0_flow_cor,m0_flow_cor}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=false, dynamicBalance=true, linearized=true) "Splitter for room return"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetSou( redeclare package Medium = MediumA, m_flow_nominal={m0_flow_sou + m0_flow_eas + m0_flow_nor + m0_flow_wes, m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_sou}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=false, dynamicBalance=true, linearized=true) "Splitter for room return"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetEas( redeclare package Medium = MediumA, m_flow_nominal={m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_nor + m0_flow_wes,m0_flow_eas}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=false, dynamicBalance=true, linearized=true) "Splitter for room return"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetNor( redeclare package Medium = MediumA, m_flow_nominal={m0_flow_nor + m0_flow_wes,m0_flow_wes,m0_flow_nor}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=false, dynamicBalance=true, linearized=true) "Splitter for room return"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupRoo1( redeclare package Medium = MediumA, m_flow_nominal={m_flow_nominal,m_flow_nominal - m0_flow_cor,m0_flow_cor}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=true, linearized=true) "Splitter for room supply"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupSou( redeclare package Medium = MediumA, m_flow_nominal={m0_flow_sou + m0_flow_eas + m0_flow_nor + m0_flow_wes, m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_sou}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=true, linearized=true) "Splitter for room supply"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupEas( redeclare package Medium = MediumA, m_flow_nominal={m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_nor + m0_flow_wes,m0_flow_eas}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=true, linearized=true) "Splitter for room supply"; Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupNor( redeclare package Medium = MediumA, m_flow_nominal={m0_flow_nor + m0_flow_wes,m0_flow_wes,m0_flow_nor}, dp_nominal(displayUnit="Pa") = {10,10,10}, from_dp=true, linearized=true) "Splitter for room supply"; Controls.CoolingCoilTemperatureSetpoint TSetCoo "Setpoint for cooling coil"; BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= "Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos"); BoundaryConditions.WeatherData.Bus weaBus "Weather Data Bus"; ThermalZones.Floor flo( redeclare package Medium = MediumA, lat=lat) "Model of a floor of the building that is served by this VAV system"; Modelica.Blocks.Routing.DeMultiplex5 TRooAir "Demultiplex for room air temperature"; equationconnect(fil.port_b, heaCoi.port_a1); connect(TSupSetHea.y, heaCoiCon.u_s); connect(fanRet.port_a, dpRetFan.port_b); connect(fanSup.port_b, dpRetFan.port_a); connect(senSupFlo.port_b, dpSupDuc.port_a); connect(controlBus, modeSelector.cb); connect(occSch.tNexOcc, controlBus.dTNexOcc); connect(TOut.y, controlBus.TOut); connect(occSch.occupied, controlBus.occupied); connect(min.y, controlBus.TRooMin); connect(ave.y, controlBus.TRooAve); connect(controlBus, conFanSup.controlBus); connect(valCoo.port_a, souCoo.ports[1]); connect(TRet.T, conEco.TRet); connect(TMix.T, conEco.TMix); connect(conEco.TSupHeaSet, TSupSetHea.y); connect(controlBus, conEco.controlBus); connect(TSetRoo.controlBus, controlBus); connect(TSup.port_a, fanSup.port_b); connect(TSup.port_b, senSupFlo.port_a); connect(fil.port_a, TMix.port_b); connect(conFanSup.y, fanSup.y); connect(cor.controlBus, controlBus); connect(sou.controlBus, controlBus); connect(eas.controlBus, controlBus); connect(nor.controlBus, controlBus); connect(wes.controlBus, controlBus); connect(TCoiHeaOut.T, heaCoiCon.u_m); connect(souHea.ports[1], valHea.port_a); connect(heaCoiCon.y, valHea.y); connect(valHea.port_b, heaCoi.port_a2); connect(heaCoi.port_b2, sinHea.ports[1]); connect(cooCoiCon.y, valCoo.y); connect(conEco.yOA, eco.y); connect(eco.port_Exh, amb.ports[1]); connect(amb.ports[2], VOut1.port_a); connect(VOut1.port_b, eco.port_Out); connect(dpRetFan.p_rel, conFanSup.u_m); connect(eco.port_Sup, TMix.port_a); connect(pSetDuc.y, conFanSup.u); connect(cor.yDam, pSetDuc.u[1]); connect(sou.yDam, pSetDuc.u[2]); connect(eas.yDam, pSetDuc.u[3]); connect(nor.yDam, pSetDuc.u[4]); connect(wes.yDam, pSetDuc.u[5]); connect(heaCoi.port_b1, TCoiHeaOut.port_a); connect(controlBus, conFanRet.controlBus); connect(senSupFlo.V_flow, conFanRet.u); connect(senRetFlo.port_b, fanRet.port_a); connect(senRetFlo.V_flow, conFanRet.u_m); connect(conFanRet.y, fanRet.y); connect(dpRetDuc.port_b, senRetFlo.port_a); connect(TRet.port_b, eco.port_Ret); connect(TRet.port_a, fanRet.port_b); connect(splRetRoo1.port_1, dpRetDuc.port_a); connect(splRetNor.port_1, splRetEas.port_2); connect(splRetEas.port_1, splRetSou.port_2); connect(splRetSou.port_1, splRetRoo1.port_2); connect(dpSupDuc.port_b, splSupRoo1.port_1); connect(splSupRoo1.port_3, cor.port_a); connect(splSupRoo1.port_2, splSupSou.port_1); connect(splSupSou.port_3, sou.port_a); connect(splSupSou.port_2, splSupEas.port_1); connect(splSupEas.port_3, eas.port_a); connect(splSupEas.port_2, splSupNor.port_1); connect(splSupNor.port_3, nor.port_a); connect(splSupNor.port_2, wes.port_a); connect(TCoiHeaOut.port_b, cooCoi.port_a2); connect(valCoo.port_b, cooCoi.port_a1); connect(cooCoi.port_b1, sinCoo.ports[1]); connect(TSetCoo.TSet, cooCoiCon.u_s); connect(TSetCoo.TSet, conEco.TSupCooSet); connect(TSupSetHea.y, TSetCoo.TSetHea); connect(modeSelector.cb, TSetCoo.controlBus); connect(conEco.VOut_flow, VOut1.V_flow); connect(weaDat.weaBus, weaBus); connect(weaBus.TDryBul, TOut.u); connect(amb.weaBus, weaBus); connect(weaBus.TDryBul, pSetDuc.TOut); connect(cor.port_b, flo.portsCor[1]); connect(splRetRoo1.port_3, flo.portsCor[2]); connect(sou.port_b, flo.portsSou[1]); connect(splRetSou.port_3, flo.portsSou[2]); connect(eas.port_b, flo.portsEas[1]); connect(splRetEas.port_3, flo.portsEas[2]); connect(nor.port_b, flo.portsNor[1]); connect(splRetNor.port_3, flo.portsNor[2]); connect(wes.port_b, flo.portsWes[1]); connect(splRetNor.port_2, flo.portsWes[2]); connect(weaBus, flo.weaBus); connect(flo.TRooAir, min.u); connect(flo.TRooAir, ave.u); connect(TRooAir.y1[1], sou.TRoo); connect(TRooAir.y2[1], eas.TRoo); connect(TRooAir.y3[1], nor.TRoo); connect(TRooAir.y4[1], wes.TRoo); connect(TRooAir.y5[1], cor.TRoo); connect(TRooAir.u, flo.TRooAir); connect(TSup.T, cooCoiCon.u_m); connect(cooCoi.port_b2, fanSup.port_a); end ClosedLoop;