Generate alarms of dual-duct terminal unit using mixing control with inlet sensor. This block outputs alarms of dual-duct terminal unit using mixing control with inlet sensor. The
implementation is according to the Section 5.12.6 of ASHRAE Guideline 36, May 2020.
Note that the sequence uses two airflow sensors, one at each inlet.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences;
block Alarms "Generate alarms of dual-duct terminal unit using mixing control with inlet sensor"

  parameter Real staPreMul
    "Importance multiplier for the zone static pressure reset control loop";
  parameter Real VCooMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone cooling maximum airflow rate";
  parameter Real VHeaMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone heating maximum airflow rate";
  parameter Real lowFloTim(
    final unit="s",
    final quantity="Time")=300
    "Threshold time to check low flow rate"
  parameter Real fanOffTim(
    final unit="s",
    final quantity="Time")=600
    "Threshold time to check fan off"
  parameter Real leaFloTim(
    final unit="s",
    final quantity="Time")=600
    "Threshold time to check damper leaking airflow"
  parameter Real floHys(
    final quantity="VolumeFlowRate",
    final unit="m3/s")=0.05
    "Near zero flow rate, below which the flow rate or difference will be seen as zero"
  parameter Real damPosHys(
    final unit="1")=0.05
    "Near zero damper position, below which the damper will be seen as closed"
  parameter Real staTim(
    final unit="s",
    final quantity="Time")=1800
    "Delay triggering alarms after enabling AHU supply fan"

  Buildings.Controls.OBC.CDL.Interfaces.RealInput VActSet_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate") "Active airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Measured cold-duct discharge airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooFan
    "Cooling air handler supply fan status"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
    "Zone operation mode"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam(
    final min=0,
    final unit="1")
    "Cooling damper position setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Measured hot-duct discharge airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaFan
    "Heating air handler supply fan status"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam(
    final min=0,
    final unit="1")
    "Heating damper position setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowFloAla
    "Low airflow alarms"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColFloSenAla
     "Cold-duct airflow sensor calibration alarm"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColLeaDamAla
     "Leaking cold-duct damper alarm"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotFloSenAla
     "Hot-duct airflow sensor calibration alarm"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotLeaDamAla
     "Leaking hot-duct damper alarm"

  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai(
    final k=0.5)
    "Percentage of the setpoint"
  Buildings.Controls.OBC.CDL.Reals.Less les(
    final h=floHys)
    "Check if measured airflow is less than threshold"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel(
    final delayTime=lowFloTim)
    "Check if the measured airflow has been less than threshold value for threshold time"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr(
    final t=floHys,
    final h=0.5*floHys)
    "Check if setpoint airflow is greater than zero"
  Buildings.Controls.OBC.CDL.Reals.Greater gre(
    final h=floHys)
    "Check if measured airflow is less than threshold"
  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(
    final k=0.7)
    "Percentage of the setpoint"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel1(
    final delayTime=lowFloTim)
    "Check if the measured airflow has been less than threshold value for threshold time"
  Buildings.Controls.OBC.CDL.Logical.And and2
    "Measured airflow has been less than threshold value for sufficient time"
  Buildings.Controls.OBC.CDL.Logical.And and1
    "Measured airflow has been less than threshold value for sufficient time"
  Buildings.Controls.OBC.CDL.Integers.Switch lowFloAla
    "Low airflow alarm"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(
    final k=2)
    "Level 2 alarm"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt(
    final integerTrue=3)
    "Convert boolean true to level 3 alarm"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant conInt1(
    final k=staPreMul)
    "Importance multiplier for zone static pressure reset"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1
    "Check if the multiplier is greater than zero"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt1
    "Suppress the alarm when multiplier is zero"
  Buildings.Controls.OBC.CDL.Integers.Multiply proInt
    "Low flow alarms"
  Buildings.Controls.OBC.CDL.Logical.And and7
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.Not not1
    "Logical not"
  Buildings.Controls.OBC.CDL.Utilities.Assert assMes(
    final message="Warning: airflow is less than 50% of the setpoint.")
    "Level 2 low airflow alarm"
  Buildings.Controls.OBC.CDL.Logical.And and4
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.Not not2
    "Logical not"
  Buildings.Controls.OBC.CDL.Utilities.Assert assMes1(
    final message="Warning: airflow is less than 70% of the setpoint.")
    "Level 3 low airflow alarm"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMaxFlo(
    final k=VCooMax_flow)  "Cooling maximum airflow setpoint"
  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2(
    final k=0.1)
    "Percentage of the setpoint"
  Buildings.Controls.OBC.CDL.Logical.Not not3
    "Logical not"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2(
    final delayTime=fanOffTim)
    "Check if the input has been true for more than threshold time"
  Buildings.Controls.OBC.CDL.Reals.Greater gre1(
    final h=floHys)
    "Check if measured airflow is greater than threshold"
  Buildings.Controls.OBC.CDL.Logical.And and5
    "Check if the measured airflow is greater than the threshold and the supply fan is OFF"
  Buildings.Controls.OBC.CDL.Logical.Not not4
    "Logical not"
  Buildings.Controls.OBC.CDL.Utilities.Assert assMes2(
    final message="Warning: cold-duct airflow sensor should be calibrated.")
    "Level 3 airflow sensor alarm"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2(
    final integerTrue=3)
    "Convert boolean true to level 3 alarm"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel3(
    final delayTime=leaFloTim)
    "Check if the input has been true for more than threshold time"
  Buildings.Controls.OBC.CDL.Reals.LessThreshold cloDam(
    final t=damPosHys,
    final h=0.5*damPosHys) "Check if damper position is near zero"
  Buildings.Controls.OBC.CDL.Logical.And leaDamAla
    "Check if generating leak damper alarms"
  Buildings.Controls.OBC.CDL.Logical.Not not5
    "Logical not"
  Buildings.Controls.OBC.CDL.Utilities.Assert assMes3(
    final message="Warning: the cold-duct damper is leaking.")
    "Level 4 leaking damper alarm"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3(
    final integerTrue=4)
    "Convert boolean true to level 4 alarm"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMaxFlo(
    final k=VHeaMax_flow)
     "Heating maximum airflow setpoint"
  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai3(final k=0.1)
    "Percentage of the setpoint"
  Buildings.Controls.OBC.CDL.Logical.Not not6
    "Logical not"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel4(
    final delayTime=fanOffTim)
    "Check if the input has been true for more than threshold time"
  Buildings.Controls.OBC.CDL.Reals.Greater gre2(
    final h=floHys)
    "Check if measured airflow is greater than threshold"
  Buildings.Controls.OBC.CDL.Logical.And and6
    "Check if the measured airflow is greater than the threshold and the supply fan is OFF"
  Buildings.Controls.OBC.CDL.Logical.Not not7
    "Logical not"
  Buildings.Controls.OBC.CDL.Utilities.Assert assMes4(
    final message="Warning: hot-duct airflow sensor should be calibrated.")
    "Level 3 airflow sensor alarm"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt4(
    final integerTrue=3)
    "Convert boolean true to level 3 alarm"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel5(
    final delayTime=leaFloTim)
    "Check if the input has been true for more than threshold time"
  Buildings.Controls.OBC.CDL.Reals.LessThreshold cloDam1(
    final t=damPosHys,
    final h=0.5*damPosHys)
    "Check if damper position is near zero"
  Buildings.Controls.OBC.CDL.Logical.And leaDamAla1
    "Check if generating leak damper alarms"
  Buildings.Controls.OBC.CDL.Logical.Not not8
    "Logical not"
  Buildings.Controls.OBC.CDL.Utilities.Assert assMes5(
    final message="Warning: the hot-duct damper is leaking.")
    "Level 4 leaking damper alarm"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt5(
    final integerTrue=4)
    "Convert boolean true to level 4 alarm"
  Buildings.Controls.OBC.CDL.Reals.Add add2
    "Total discharge airflow"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel6(
    final delayTime=lowFloTim)
    "Check if the active flow setpoint has been greater than zero for the threshold time"
  Buildings.Controls.OBC.CDL.Logical.Or fanOn
    "Check if any AHU supply fan is enabled"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay fanIni(
    final delayTime=staTim)
    "Check if the AHU supply fan has been enabled for threshold time"
  Buildings.Controls.OBC.CDL.Logical.And and11
    "True: AHU fan is enabled and the discharge flow is lower than the threshold"
  Buildings.Controls.OBC.CDL.Logical.And and10
    "True: AHU fan is enabled and the discharge flow is lower than the threshold"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod(
    final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied)
    "Occupied mode"
  Buildings.Controls.OBC.CDL.Integers.Equal isOcc
    "Check if current operation mode is occupied mode"
  Buildings.Controls.OBC.CDL.Logical.And and3
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And and8
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And leaDamAla2
    "Check if generating leak damper alarms"
  Buildings.Controls.OBC.CDL.Logical.And leaDamAla3
    "Check if generating leak damper alarms"
equation
  connect(VActSet_flow, gai.u)
  connect(VActSet_flow, greThr.u)
  connect(VActSet_flow, gai1.u)
  connect(gai1.y, gre.u1)
  connect(truDel.y, and2.u1)
  connect(truDel1.y, and1.u2)
  connect(conInt.y, lowFloAla.u1)
  connect(booToInt.y, lowFloAla.u3)
  connect(conInt1.y, greThr1.u)
  connect(greThr1.y, booToInt1.u)
  connect(lowFloAla.y, proInt.u1)
  connect(booToInt1.y, proInt.u2)
  connect(not1.y, assMes.u)
  connect(and2.y,and7. u1)
  connect(greThr1.y,and7. u2)
  connect(and1.y, and4.u1)
  connect(greThr1.y, and4.u2)
  connect(not2.y, assMes1.u)
  connect(cooMaxFlo.y, gai2.u)
  connect(u1CooFan, not3.u)
  connect(gai2.y, gre1.u2)
  connect(gre1.y, and5.u1)
  connect(not4.y, assMes2.u)
  connect(booToInt2.y, yColFloSenAla)
  connect(proInt.y, yLowFloAla)
  connect(uCooDam, cloDam.u)
  connect(u1CooFan, leaDamAla.u2)
  connect(not5.y, assMes3.u)
  connect(booToInt3.y, yColLeaDamAla)
  connect(VColDucDis_flow, gre1.u1)
  connect(heaMaxFlo.y, gai3.u)
  connect(u1HeaFan, not6.u)
  connect(gai3.y,gre2. u2)
  connect(gre2.y,and6. u1)
  connect(not7.y,assMes4. u)
  connect(booToInt4.y, yHotFloSenAla)
  connect(uHeaDam, cloDam1.u)
  connect(u1HeaFan, leaDamAla1.u2)
  connect(not8.y,assMes5. u)
  connect(booToInt5.y, yHotLeaDamAla)
  connect(VHotDucDis_flow, gre2.u1)
  connect(VColDucDis_flow, add2.u1)
  connect(VHotDucDis_flow, add2.u2)
  connect(add2.y, les.u1)
  connect(add2.y, gre.u2)
  connect(greThr.y, truDel6.u)
  connect(truDel6.y, and1.u1)
  connect(truDel6.y, and2.u2)
  connect(truDel3.y, booToInt3.u)
  connect(truDel3.y, not5.u)
  connect(and5.y, truDel2.u)
  connect(truDel2.y, booToInt2.u)
  connect(truDel2.y, not4.u)
  connect(not3.y, and5.u2)
  connect(gre1.y, leaDamAla.u1)
  connect(truDel5.y, booToInt5.u)
  connect(truDel5.y, not8.u)
  connect(and6.y, truDel4.u)
  connect(truDel4.y, booToInt4.u)
  connect(truDel4.y, not7.u)
  connect(not6.y, and6.u2)
  connect(gre2.y, leaDamAla1.u1)
  connect(les.y, and10.u1)
  connect(and10.y, truDel.u)
  connect(gre.y, and11.u1)
  connect(and11.y, truDel1.u)
  connect(fanOn.y, fanIni.u)
  connect(fanIni.y, and10.u2)
  connect(fanIni.y, and11.u2)
  connect(u1CooFan, fanOn.u2)
  connect(u1HeaFan, fanOn.u1)
  connect(occMod.y, isOcc.u2)
  connect(uOpeMod, isOcc.u1)
  connect(gai.y, les.u2)
  connect(and3.y, lowFloAla.u2)
  connect(and3.y, not1.u)
  connect(and8.y, booToInt.u)
  connect(and8.y, not2.u)
  connect(and7.y, and3.u1)
  connect(and4.y, and8.u1)
  connect(isOcc.y, and3.u2)
  connect(isOcc.y, and8.u2)
  connect(leaDamAla.y, leaDamAla2.u1)
  connect(leaDamAla2.y, truDel3.u)
  connect(cloDam.y, leaDamAla2.u2)
  connect(leaDamAla1.y, leaDamAla3.u1)
  connect(leaDamAla3.y, truDel5.u)
  connect(cloDam1.y, leaDamAla3.u2)
end Alarms;


Output signals for controlling dampers of dual-duct terminal unit using mixing control with inlet flow sensor. This sequence sets the dampers for dual-duct terminal unit using mixing control with
inlet flow sensor.
The implementation is according to Section 5.12.5 of ASHRAE Guideline 36, May 2020. The
calculation is done following the steps below.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences;
block Dampers
  "Output signals for controlling dampers of dual-duct terminal unit using mixing control with inlet flow sensor"

  parameter Real VCooMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone cooling maximum airflow rate";
  parameter Real VHeaMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone heating maximum airflow rate";
  parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerTypeDam=
    Buildings.Controls.OBC.CDL.Types.SimpleController.PI
    "Type of controller"
  parameter Real kDam(final unit="1")=0.5
    "Gain of controller for damper control"
  parameter Real TiDam(
    final unit="s",
    final quantity="Time")=300
    "Time constant of integrator block for damper control"
  parameter Real TdDam(
    final unit="s",
    final quantity="Time")=0.1
    "Time constant of derivative block for damper control"
  parameter Real dTHys(
    final unit="K",
    final quantity="TemperatureDifference")=0.25
    "Temperature difference hysteresis below which the temperature difference will be seen as zero"
  parameter Real looHys(
    final unit="1") = 0.05
    "Loop output hysteresis below which the output will be seen as zero"
  parameter Real iniDam(unit="1")=0.01
    "Initial damper position when the damper control is enabled"

  Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo(
    final min=0,
    final max=1,
    final unit="1")
    "Cooling control signal"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VActCooMax_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Active cooling maximum airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput TColSup(
    final unit="K",
    final displayUnit="degC",
    final quantity="ThermodynamicTemperature")
    "Cold duct supply air temperature from central air handler"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Measured cold-duct discharge airflow rate airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooAHU
    "Cooling air handler status"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VActMin_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Active minimum airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon(
    final unit="K",
    final displayUnit="degC",
    final quantity="ThermodynamicTemperature")
    "Measured zone temperature"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput THotSup(
    final unit="K",
    final displayUnit="degC",
    final quantity="ThermodynamicTemperature")
    "Hot duct supply air temperature from central air handler"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea(
    final min=0,
    final max=1,
    final unit="1")
    "Heating control signal"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VActHeaMax_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Active heating maximum airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Measured hot-duct discharge airflow rate airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaAHU
    "Heating air handler status"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VDis_flow_Set(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Discharge airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VColDucDis_flow_Set(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Cold duct discharge airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam(
    final min=0,
    final max=1,
    final unit="1") "Cold duct damper commanded position"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VHotDucDis_flow_Set(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate") "Hot duct discharge airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam(
    final min=0,
    final max=1,
    final unit="1") "Hot duct damper commanded position"

  Buildings.Controls.OBC.CDL.Logical.And and4 "Logical and"
  Buildings.Controls.OBC.CDL.Reals.Line lin
    "Active airflow setpoint for cooling"
  Buildings.Controls.OBC.CDL.Reals.Switch swi
    "Output active cold duct airflow setpoint"
  Buildings.Controls.OBC.CDL.Reals.Switch swi5
    "Airflow setpoint when it is in cooling state"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer(
    final k=0) "Constant zero"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne(
    final k=1) "Constant one"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1(
    final t=looHys,
    final h=0.5*looHys)
    "Check if it is cooling state"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr(
    final t=dTHys,
    final h=0.5*dTHys)
    "Check if supply air temperature is greater than room temperature"
  Buildings.Controls.OBC.CDL.Reals.Subtract sub2
    "Calculate temperature difference between AHU supply air and room "
  Buildings.Controls.OBC.CDL.Reals.Add add2
    "Total discharge airflow setpoint"
  Buildings.Controls.OBC.CDL.Logical.Or or2
    "Cooing or heating state"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2(
    final t=looHys,
    final h=0.5*looHys)
    "Check if it is cooling state"
  Buildings.Controls.OBC.CDL.Logical.Not not1
    "In deadband state"
  Buildings.Controls.OBC.CDL.Reals.Switch swi1
    "Active cold duct airflow setpoint when it is in deadband state"
  Buildings.Controls.OBC.CDL.Reals.Line lin1
    "Active airflow setpoint for heating"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer1(
    final k=0)
    "Constant zero"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne1(
    final k=1)
    "Constant one"
  Buildings.Controls.OBC.CDL.Reals.Subtract sub1
    "Calculate temperature difference between AHU supply air and room "
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3(
    final t=dTHys,
    final h=0.5*dTHys)
    "Check if supply air temperature is less than room temperature"
  Buildings.Controls.OBC.CDL.Logical.And and1
    "Logical and"
  Buildings.Controls.OBC.CDL.Reals.Switch swi2
    "Airflow setpoint when it is in heating state"
  Buildings.Controls.OBC.CDL.Reals.Switch swi3
    "Airflow setpoint when it is in heating state"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer3(
    final k=0)
    "Constant zero"
  Buildings.Controls.OBC.CDL.Reals.Subtract sub3
    "Calculate flow rate difference between minimum flow setpoint and the heating setpoint"
  Buildings.Controls.OBC.CDL.Reals.Max max1
    "Ensure positive flow"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea2(
    final realTrue=1,
    final realFalse=0)
    "Convert boolean to real"
  Buildings.Controls.OBC.CDL.Reals.Multiply mul3
    "Cold duct flow setpoint when in heating state"
  Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor
    "Normalized setpoint for discharge volume flow rate"
  Buildings.Controls.OBC.CDL.Reals.PIDWithReset conCooDam(
    final controllerType=controllerTypeDam,
    final k=kDam,
    final Ti=TiDam,
    final Td=TdDam,
    final yMax=1,
    final yMin=0,
    final y_reset=iniDam)
    "Cooling damper position controller"
  Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor
    "Normalized discharge volume flow rate"
  Buildings.Controls.OBC.CDL.Reals.Switch cooDamPos
    "Output cooling damper position"
  Buildings.Controls.OBC.CDL.Logical.Not not3
    "Not proven on"
  Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor1
    "Normalized setpoint for discharge volume flow rate"
  Buildings.Controls.OBC.CDL.Reals.PIDWithReset conHeaDam(
    final controllerType=controllerTypeDam,
    final k=kDam,
    final Ti=TiDam,
    final Td=TdDam,
    final yMax=1,
    final yMin=0,
    final y_reset=iniDam)
    "Heating damper position controller"
  Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor1
    "Normalized discharge volume flow rate"
  Buildings.Controls.OBC.CDL.Reals.Switch heaDamPos
    "Output heating damper position"
  Buildings.Controls.OBC.CDL.Logical.Or or1
    "Cooing or deadband state"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1(
    final realTrue=0,
    final realFalse=1)
    "Ensure heating damper is closed when it is in cooling or deadband state"
  Buildings.Controls.OBC.CDL.Reals.Multiply mul1
    "Ensure heating damper is closed when it is in cooling or deadband state"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMax1(
    final k=VCooMax_flow)
    "Cooling maximum flow"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMax1(
    final k=VHeaMax_flow)
    "Heating maximum flow"
  Buildings.Controls.OBC.CDL.Reals.Max max2
    "Nominal flow"
equation
  connect(uCoo, lin.u)
  connect(conZer.y, lin.x1)
  connect(conOne.y, lin.x2)
  connect(VActCooMax_flow, lin.f2)
  connect(uCoo, greThr1.u)
  connect(and4.y, swi5.u2)
  connect(lin.y, swi5.u3)
  connect(swi5.y, swi.u1)
  connect(TColSup, sub2.u1)
  connect(sub2.y, greThr.u)
  connect(greThr.y, and4.u2)
  connect(greThr1.y, and4.u1)
  connect(greThr1.y, swi.u2)
  connect(add2.y, VDis_flow_Set)
  connect(TZon, sub2.u2)
  connect(VActMin_flow, swi5.u1)
  connect(greThr1.y, or2.u1)
  connect(uHea, greThr2.u)
  connect(greThr2.y, or2.u2)
  connect(or2.y, not1.u)
  connect(not1.y, swi1.u2)
  connect(VActMin_flow, swi1.u1)
  connect(swi1.y, swi.u3)
  connect(uHea, lin1.u)
  connect(conZer1.y, lin1.x1)
  connect(conZer1.y, lin1.f1)
  connect(conOne1.y, lin1.x2)
  connect(VActHeaMax_flow, lin1.f2)
  connect(TZon, sub1.u1)
  connect(THotSup, sub1.u2)
  connect(sub1.y, greThr3.u)
  connect(greThr3.y, and1.u1)
  connect(greThr2.y, and1.u2)
  connect(VActMin_flow, swi2.u1)
  connect(and1.y, swi2.u2)
  connect(lin1.y, swi2.u3)
  connect(greThr2.y, swi3.u2)
  connect(swi2.y, swi3.u1)
  connect(conZer3.y, swi3.u3)
  connect(VActMin_flow, sub3.u1)
  connect(swi3.y, sub3.u2)
  connect(sub3.y, max1.u2)
  connect(conZer3.y, max1.u1)
  connect(greThr2.y, booToRea2.u)
  connect(booToRea2.y, mul3.u1)
  connect(max1.y, mul3.u2)
  connect(mul3.y, swi1.u3)
  connect(swi3.y, VHotDucDis_flow_Set)
  connect(swi.y, VColDucDis_flow_Set)
  connect(swi.y, add2.u1)
  connect(swi.y, VDisSet_flowNor.u1)
  connect(VDisSet_flowNor.y, conCooDam.u_s)
  connect(VColDucDis_flow, VDis_flowNor.u1)
  connect(VDis_flowNor.y, conCooDam.u_m)
  connect(u1CooAHU, conCooDam.trigger)
  connect(u1CooAHU, not3.u)
  connect(not3.y, cooDamPos.u2)
  connect(conCooDam.y, cooDamPos.u3)
  connect(conZer3.y, cooDamPos.u1)
  connect(cooDamPos.y, yCooDam)
  connect(heaDamPos.y, yHeaDam)
  connect(u1HeaAHU, heaDamPos.u2)
  connect(conZer3.y, heaDamPos.u3)
  connect(swi3.y, VDisSet_flowNor1.u1)
  connect(VDisSet_flowNor1.y, conHeaDam.u_s)
  connect(VHotDucDis_flow, VDis_flowNor1.u1)
  connect(VDis_flowNor1.y, conHeaDam.u_m)
  connect(u1HeaAHU, conHeaDam.trigger)
  connect(greThr1.y, or1.u1)
  connect(or2.y, or1.u2)
  connect(or1.y, booToRea1.u)
  connect(booToRea1.y, mul1.u2)
  connect(conHeaDam.y, mul1.u1)
  connect(mul1.y, heaDamPos.u1)
  connect(swi3.y, add2.u2)
  connect(VActMin_flow, lin.f1)
  connect(heaMax1.y,max2. u2)
  connect(cooMax1.y,max2. u1)
  connect(max2.y, VDisSet_flowNor.u2)
  connect(max2.y, VDis_flowNor.u2)
  connect(max2.y, VDisSet_flowNor1.u2)
  connect(max2.y, VDis_flowNor1.u2)
end Dampers;


Software switches to override setpoints. This block considers the overrides to the setpoints for dual-duct terminal unit using
mixing control with inlet flow sensor.
The implementation is according to the Section 5.12.7 of ASHRAE Guideline 36,
May 2020.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences;
block Overrides "Software switches to override setpoints"

  parameter Real VMin_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone minimum airflow setpoint";
  parameter Real VCooMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone cooling maximum airflow rate";
  parameter Real VHeaMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone heating maximum airflow rate";

  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveFloSet
    "Index of overriding flow setpoint, 1: set to zero; 2: set to cooling maximum; 3: set to minimum flow; 4: set to heating maximum"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VActSet_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Active airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveCooDamPos
    "Index of overriding cooling damper position, 1: set to close; 2: set to open"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam(
    final min=0,
    final unit="1")
    "Cooling damper commanded position"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveHeaDamPos
    "Index of overriding heating damper position, 1: set to close; 2: set to open"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam(
    final min=0,
    final unit="1")
    "Heating damper commanded position"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VSet_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Airflow setpoint after considering override"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam(
    final min=0,
    final unit="1")
    "Cooling damper position setpoint after considering override"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam(
    final min=0,
    final unit="1")
    "Heating damper position setpoint after considering override"

protected
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(
    final k=1)
    "Constant 1"
  Buildings.Controls.OBC.CDL.Integers.Equal forZerFlo "Check if forcing zone airflow setpoint to zero"
  Buildings.Controls.OBC.CDL.Integers.Equal forCooMax
    "Check if forcing zone airflow setpoint to cooling maximum"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt1(
    final k=2)
    "Constant 2"
  Buildings.Controls.OBC.CDL.Integers.Equal forMinFlo
    "Check if forcing zone airflow setpoint to minimum flow"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt2(
    final k=3)
    "Constant 3"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal zerFlo(
    final realTrue=0)
    "Force zone airflow setpoint to zero"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cooMax(
    final realTrue=VCooMax_flow)
    "Force zone airflow setpoint to cooling maximum"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal minFlo(
    final realTrue=VMin_flow)
    "Force zone airflow setpoint to zone minimum flow"
  Buildings.Controls.OBC.CDL.Reals.Add add2 "Add up two inputs"
  Buildings.Controls.OBC.CDL.Reals.Add add1 "Add up inputs"
  Buildings.Controls.OBC.CDL.Reals.Switch swi
    "Airflow setpoint after considering override"
  Buildings.Controls.OBC.CDL.Logical.Or or3
    "Check if the airflow setpoint should be overrided"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt3(
    final k=1)
    "Constant 1"
  Buildings.Controls.OBC.CDL.Integers.Equal intEqu3
    "Check if forcing damper to full close"
  Buildings.Controls.OBC.CDL.Integers.Equal intEqu4
    "Check if forcing damper to full open"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt4(
    final k=2)
    "Constant 2"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cloDam(
    final realTrue=0)
    "Full closed damper position"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal opeDam(
    final realTrue=1)
    "Full open damper position"
  Buildings.Controls.OBC.CDL.Reals.Add add3 "Add up inputs"
  Buildings.Controls.OBC.CDL.Logical.Or or2
    "Check if the damper setpoint position should be overrided"
  Buildings.Controls.OBC.CDL.Reals.Switch swi1
    "Damper setpoint position after considering override"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt5(
    final k=4)
    "Constant 4"
  Buildings.Controls.OBC.CDL.Integers.Equal forMinFlo1
    "Check if forcing zone airflow setpoint to minimum flow"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal heaMax(
    final realTrue=VHeaMax_flow)
    "Force zone airflow setpoint to zone heating maximum flow"
  Buildings.Controls.OBC.CDL.Reals.Add add4
    "Add up two inputs"
  Buildings.Controls.OBC.CDL.Logical.Or or1
    "Check if the airflow setpoint should be overrided"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt6(
    final k=1)
    "Constant 1"
  Buildings.Controls.OBC.CDL.Integers.Equal intEqu1
    "Check if forcing damper to full close"
  Buildings.Controls.OBC.CDL.Integers.Equal intEqu2
    "Check if forcing damper to full open"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt7(
    final k=2)
    "Constant 2"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cloDam1(
    final realTrue=0)
    "Full closed damper position"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal opeDam1(
    final realTrue=1)
    "Full open damper position"
  Buildings.Controls.OBC.CDL.Reals.Add add5
    "Add up inputs"
  Buildings.Controls.OBC.CDL.Logical.Or or4
    "Check if the damper setpoint position should be overrided"
  Buildings.Controls.OBC.CDL.Reals.Switch swi2
    "Damper setpoint position after considering override"
  Buildings.Controls.OBC.CDL.Logical.Or or5
    "Check if the airflow setpoint should be overrided"

equation
  connect(oveFloSet, forZerFlo.u1)
  connect(conInt.y, forZerFlo.u2)
  connect(oveFloSet, forCooMax.u1)
  connect(conInt1.y, forCooMax.u2)
  connect(oveFloSet, forMinFlo.u1)
  connect(conInt2.y, forMinFlo.u2)
  connect(forZerFlo.y, zerFlo.u)
  connect(forCooMax.y, cooMax.u)
  connect(forMinFlo.y, minFlo.u)
  connect(cooMax.y, add2.u1)
  connect(zerFlo.y, add1.u1)
  connect(forZerFlo.y, or3.u1)
  connect(forCooMax.y, or3.u2)
  connect(add1.y, swi.u1)
  connect(VActSet_flow, swi.u3)
  connect(swi.y, VSet_flow)
  connect(conInt3.y, intEqu3.u2)
  connect(conInt4.y,intEqu4. u2)
  connect(oveCooDamPos, intEqu3.u1)
  connect(oveCooDamPos, intEqu4.u1)
  connect(intEqu3.y, cloDam.u)
  connect(intEqu4.y, opeDam.u)
  connect(cloDam.y, add3.u1)
  connect(opeDam.y, add3.u2)
  connect(intEqu3.y, or2.u1)
  connect(intEqu4.y, or2.u2)
  connect(add3.y, swi1.u1)
  connect(or2.y, swi1.u2)
  connect(uCooDam, swi1.u3)
  connect(swi1.y, yCooDam)
  connect(oveFloSet, forMinFlo1.u1)
  connect(conInt5.y, forMinFlo1.u2)
  connect(forMinFlo1.y, heaMax.u)
  connect(add2.y, add1.u2)
  connect(minFlo.y, add4.u1)
  connect(heaMax.y, add4.u2)
  connect(add4.y, add2.u2)
  connect(forMinFlo1.y, or1.u2)
  connect(or1.y, swi.u2)
  connect(conInt6.y,intEqu1. u2)
  connect(conInt7.y,intEqu2. u2)
  connect(oveHeaDamPos, intEqu1.u1)
  connect(oveHeaDamPos, intEqu2.u1)
  connect(intEqu1.y, cloDam1.u)
  connect(intEqu2.y, opeDam1.u)
  connect(cloDam1.y, add5.u1)
  connect(opeDam1.y, add5.u2)
  connect(intEqu1.y,or4. u1)
  connect(intEqu2.y,or4. u2)
  connect(add5.y,swi2. u1)
  connect(or4.y,swi2. u2)
  connect(uHeaDam, swi2.u3)
  connect(swi2.y, yHeaDam)
  connect(or5.y, or1.u1)
  connect(or3.y, or5.u1)
  connect(forMinFlo.y, or5.u2)
end Overrides;


within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor;
package Subsequences "Package of subsequences for dual-duct terminal unit using mixing control with inlet sensor"
end Subsequences;


Output system requests for dual-duct unit using mixing control with inlet flow sensor. This sequence outputs the system reset requests for dual-duct terminal unit using
mixing control with inlet flow sensor. The implementation is according to the Section 5.12.8 of ASHRAE
Guideline 36, May 2020.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences;
block SystemRequests "Output system requests for dual-duct unit using mixing control with inlet flow sensor"

  parameter Real thrTemDif(
    final unit="K",
    final quantity="TemperatureDifference")=3
    "Threshold difference between zone temperature and cooling setpoint for generating 3 cooling SAT reset requests"
  parameter Real twoTemDif(
    final unit="K",
    final quantity="TemperatureDifference")=2
    "Threshold difference between zone temperature and cooling setpoint for generating 2 cooling SAT reset requests"
  parameter Real durTimTem(
    final unit="s",
    final quantity="Time")=120
    "Duration time of zone temperature exceeds setpoint"
  parameter Real durTimFlo(
    final unit="s",
    final quantity="Time")=60
    "Duration time of airflow rate less than setpoint"
  parameter Real dTHys(
    final unit="K",
    final quantity="TemperatureDifference")=0.25
    "Near zero temperature difference, below which the difference will be seen as zero"
  parameter Real floHys(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Near zero flow rate, below which the flow rate or difference will be seen as zero"
  parameter Real looHys(unit="1")
    "Loop output hysteresis below which the output will be seen as zero"
  parameter Real damPosHys(
    final unit="1")
    "Near zero damper position, below which the damper will be seen as closed"

  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSupCoo
    "After suppression period due to the cooling setpoint change"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput TCooSet(
    final unit="K",
    final displayUnit="degC",
    final quantity="ThermodynamicTemperature")
    "Zone cooling setpoint temperature"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon(
    final unit="K",
    final displayUnit="degC",
    final quantity="ThermodynamicTemperature")
    "Zone temperature"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo(
    final min=0,
    final max=1,
    final unit="1") "Cooling loop signal"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDuc_flow_Set(
    final min=0,
    final unit="m3/s",
    quantity="VolumeFlowRate") "Cold duct discharge airflow rate setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Measured cold duct discharge airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam(
    final min=0,
    final max=1,
    final unit="1")
    "Cooling damper position setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSupHea
    "After suppression period due to the heating setpoint change"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput THeaSet(
    final unit="K",
    final displayUnit="degC",
    final quantity="ThermodynamicTemperature")
    "Zone heating setpoint temperature"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea(
    final min=0,
    final max=1,
    final unit="1")
    "Heating loop signal"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDuc_flow_Set(
    final min=0,
    final unit="m3/s",
    quantity="VolumeFlowRate")
    "Hot duct discharge airflow rate setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Measured hot duct discharge airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam(
    final min=0,
    final max=1,
    final unit="1")
    "Heating damper position setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonCooTemResReq
    "Zone cooling supply air temperature reset request"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColDucPreResReq
    "Cold duct static pressure reset requests"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonHeaTemResReq
    "Zone heating supply air temperature reset request"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotDucPreResReq
    "Hot duct static pressure reset requests"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHeaFanReq
    "Heating fan request"

protected
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1(
    final t=thrTemDif,
    final h=dTHys)
    "Check if zone temperature is greater than cooling setpoint by threshold"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2(
    final t=twoTemDif,
    final h=dTHys)
    "Check if zone temperature is greater than cooling setpoint by threshold"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3(
    final t=0.95,
    final h=damPosHys)
    "Check if damper position is greater than 0.95"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr(
    final t=0.95,
    final h=looHys)
    "Check if cooling loop signal is greater than 0.95"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4(
    final t=floHys,
    final h=0.5*floHys)
    "Check if discharge airflow setpoint is greater than 0"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt
    "Convert boolean to integer"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt1
    "Convert boolean to integer"
  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(
    final k=0.5)
    "50% of setpoint"
  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2(
    final k=0.7)
    "70% of setpoint"
  Buildings.Controls.OBC.CDL.Reals.Subtract sub2
    "Calculate difference between zone temperature and cooling setpoint"
  Buildings.Controls.OBC.CDL.Reals.Subtract sub3
    "Calculate difference between zone temperature and cooling setpoint"
  Buildings.Controls.OBC.CDL.Logical.And and1
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And and2
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And and3
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And and4
    "Logical and"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrCooResReq(
    final k=3)
    "Constant 3"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoCooResReq(
    final k=2) "Constant 2"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrPreResReq(
    final k=3) "Constant 3"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoPreResReq(
    final k=2)
    "Constant 2"
  Buildings.Controls.OBC.CDL.Integers.Switch intSwi
    "Output 3 or other request "
  Buildings.Controls.OBC.CDL.Integers.Switch intSwi1
    "Output 2 or other request "
  Buildings.Controls.OBC.CDL.Integers.Switch swi4
    "Output 3 or other request "
  Buildings.Controls.OBC.CDL.Integers.Switch swi5
    "Output 2 or other request "
  Buildings.Controls.OBC.CDL.Logical.TrueDelay tim1(
    final delayTime=durTimTem) "Check if it is more than threshold time"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay tim2(
    final delayTime=durTimTem) "Check if it is more than threshold time"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay tim3(
    final delayTime=durTimFlo) "Check if it is more than threshold time"
  Buildings.Controls.OBC.CDL.Reals.Greater greEqu(final h=floHys)
    "Check if discharge airflow is less than 50% of setpoint"
  Buildings.Controls.OBC.CDL.Reals.Greater greEqu1(final h=floHys)
    "Check if discharge airflow is less than 70% of setpoint"
  Buildings.Controls.OBC.CDL.Logical.And and5
    "Logical and"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr7(
    final t=thrTemDif,
    final h=dTHys)
    "Check if zone temperature is less than heating setpoint by threshold"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr8(
    final t=twoTemDif,
    final h=dTHys)
    "Check if zone temperature is less than heating setpoint by threshold"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr9(
    final t=0.95,
    final h=damPosHys)
    "Check if damper position is greater than 0.95"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr10(
    final t=0.95,
    final h=looHys) "Check if heating loop signal is greater than 0.95"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr11(
    final t=floHys,
    final h=0.5*floHys)
    "Check if discharge airflow setpoint is greater than 0"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt4
    "Convert boolean to integer"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt5
    "Convert boolean to integer"
  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai3(
    final k=0.5)
    "50% of setpoint"
  Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai4(
    final k=0.7)
    "70% of setpoint"
  Buildings.Controls.OBC.CDL.Reals.Subtract sub1
    "Calculate difference between zone temperature and heating setpoint"
  Buildings.Controls.OBC.CDL.Reals.Subtract sub4
    "Calculate difference between zone temperature and heating setpoint"
  Buildings.Controls.OBC.CDL.Logical.And and6
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And and7
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And and8
    "Logical and"
  Buildings.Controls.OBC.CDL.Logical.And and9
    "Logical and"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrCooResReq1(
    final k=3)
    "Constant 3"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoCooResReq1(
    final k=2)
    "Constant 2"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrPreResReq1(
    final k=3)
    "Constant 3"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoPreResReq1(
    final k=2)
    "Constant 2"
  Buildings.Controls.OBC.CDL.Integers.Switch intSwi4
    "Output 3 or other request "
  Buildings.Controls.OBC.CDL.Integers.Switch intSwi5
    "Output 2 or other request "
  Buildings.Controls.OBC.CDL.Integers.Switch swi1
    "Output 3 or other request "
  Buildings.Controls.OBC.CDL.Integers.Switch swi2
    "Output 2 or other request "
  Buildings.Controls.OBC.CDL.Logical.TrueDelay tim6(
    final delayTime=durTimTem)
    "Check if it is more than threshold time"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay tim7(
    final delayTime=durTimTem)
    "Check if it is more than threshold time"
  Buildings.Controls.OBC.CDL.Logical.TrueDelay tim8(
    final delayTime=durTimFlo)
    "Check if it is more than threshold time"
  Buildings.Controls.OBC.CDL.Reals.Greater greEqu2(final h=floHys)
    "Check if discharge airflow is less than 50% of setpoint"
  Buildings.Controls.OBC.CDL.Reals.Greater greEqu3(final h=floHys)
    "Check if discharge airflow is less than 70% of setpoint"
  Buildings.Controls.OBC.CDL.Logical.And and10
    "Logical and"
  Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr12(
    final t=0.15,
    final h=looHys)
    "Check if heating loop signal is greater than 0.15"
  Buildings.Controls.OBC.CDL.Logical.Latch lat "Hold the true input"
  Buildings.Controls.OBC.CDL.Reals.LessThreshold lesThr(
    final t=0.01,
    final h=looHys)
    "Check if the heating loop output is less than threshold"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt6
    "Heating fan request"

equation
  connect(sub2.y, greThr1.u)
  connect(and2.y, intSwi.u2)
  connect(sub3.y, greThr2.u)
  connect(and1.y, intSwi1.u2)
  connect(and3.y, swi4.u2)
  connect(and4.y, swi5.u2)
  connect(greThr2.y, tim2.u)
  connect(tim2.y, and1.u2)
  connect(greThr1.y, tim1.u)
  connect(tim1.y, and2.u2)
  connect(greThr4.u, VColDuc_flow_Set)
  connect(greEqu.u1, gai1.y)
  connect(greEqu.y, and3.u2)
  connect(gai2.y, greEqu1.u1)
  connect(greEqu1.y, and4.u2)
  connect(uCoo, greThr.u)
  connect(uAftSupCoo, and2.u1)
  connect(uAftSupCoo, and1.u1)
  connect(thrCooResReq.y, intSwi.u1)
  connect(twoCooResReq.y, intSwi1.u1)
  connect(intSwi1.y, intSwi.u3)
  connect(intSwi.y, yZonCooTemResReq)
  connect(greThr.y, booToInt.u)
  connect(booToInt.y, intSwi1.u3)
  connect(uCooDam, greThr3.u)
  connect(VColDuc_flow_Set, gai1.u)
  connect(VColDuc_flow_Set, gai2.u)
  connect(VColDucDis_flow, greEqu.u2)
  connect(VColDucDis_flow, greEqu1.u2)
  connect(greThr3.y, tim3.u)
  connect(greThr4.y, and5.u1)
  connect(tim3.y, and5.u2)
  connect(and5.y, and3.u1)
  connect(and5.y, and4.u1)
  connect(greThr3.y, booToInt1.u)
  connect(booToInt1.y, swi5.u3)
  connect(twoPreResReq.y, swi5.u1)
  connect(thrPreResReq.y, swi4.u1)
  connect(swi5.y, swi4.u3)
  connect(TCooSet, sub3.u2)
  connect(TCooSet, sub2.u2)
  connect(TZon, sub2.u1)
  connect(TZon, sub3.u1)
  connect(sub1.y,greThr7. u)
  connect(and7.y, intSwi4.u2)
  connect(sub4.y,greThr8. u)
  connect(and6.y,intSwi5. u2)
  connect(and8.y,swi1. u2)
  connect(and9.y,swi2. u2)
  connect(greThr8.y,tim7. u)
  connect(tim7.y,and6. u2)
  connect(greThr7.y,tim6. u)
  connect(tim6.y,and7. u2)
  connect(greThr11.u, VHotDuc_flow_Set)
  connect(greEqu2.u1, gai3.y)
  connect(greEqu2.y, and8.u2)
  connect(gai4.y,greEqu3. u1)
  connect(greEqu3.y,and9. u2)
  connect(uHea, greThr10.u)
  connect(uAftSupHea, and7.u1)
  connect(uAftSupHea, and6.u1)
  connect(thrCooResReq1.y, intSwi4.u1)
  connect(twoCooResReq1.y, intSwi5.u1)
  connect(intSwi5.y, intSwi4.u3)
  connect(intSwi4.y, yZonHeaTemResReq)
  connect(greThr10.y, booToInt4.u)
  connect(booToInt4.y, intSwi5.u3)
  connect(uHeaDam, greThr9.u)
  connect(VHotDuc_flow_Set, gai3.u)
  connect(VHotDuc_flow_Set, gai4.u)
  connect(VHotDucDis_flow, greEqu2.u2)
  connect(VHotDucDis_flow, greEqu3.u2)
  connect(greThr9.y,tim8. u)
  connect(greThr11.y, and10.u1)
  connect(tim8.y, and10.u2)
  connect(and10.y, and8.u1)
  connect(and10.y, and9.u1)
  connect(greThr9.y,booToInt5. u)
  connect(booToInt5.y,swi2. u3)
  connect(twoPreResReq1.y, swi2.u1)
  connect(thrPreResReq1.y, swi1.u1)
  connect(swi2.y,swi1. u3)
  connect(THeaSet, sub1.u1)
  connect(THeaSet, sub4.u1)
  connect(TZon, sub1.u2)
  connect(TZon, sub4.u2)
  connect(uHea, greThr12.u)
  connect(greThr12.y, lat.u)
  connect(uHea, lesThr.u)
  connect(lesThr.y, lat.clr)
  connect(lat.y, booToInt6.u)
  connect(booToInt6.y, yHeaFanReq)
  connect(swi1.y, yHotDucPreResReq)
  connect(swi4.y, yColDucPreResReq)
end SystemRequests;


Validate the model for calculating active airflow setpoint for dual-duct terminal unit using mixing control with inlet flow sensor. This example validates

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.ActiveAirFlow
for calculating active minimum and maximum airflow setpoint used in dual-duct terminal unit
using mixing control with inlet flow sensor.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Validation;
model ActiveAirFlow
  "Validate the model for calculating active airflow setpoint for dual-duct terminal unit using mixing control with inlet flow sensor"
  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.ActiveAirFlow actAirSet(
    final VCooMax_flow=0.5,
    final VHeaMax_flow=0.4)
    "Output the active airflow setpoint for terminal unit"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin minFlo(
    final amplitude=0.3,
    final freqHz=1/3600,
    final offset=0.2) "Occupied zone minimum flow"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp opeMod(
    final offset=1,
    final height=5,
    final duration=3600)
    "Operation mode"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt2
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round2(final n=0)
    "Round real number to given digits"

equation
  connect(opeMod.y,round2. u)
  connect(round2.y,reaToInt2. u)
  connect(reaToInt2.y, actAirSet.uOpeMod)
  connect(minFlo.y, actAirSet.VOccMin_flow)
end ActiveAirFlow;


Validation of model that generates alarms. This example validates

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Alarms
for generating system alarms.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Validation;
model Alarms "Validation of model that generates alarms"

  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Alarms ala(
    final staPreMul=1,
    final VCooMax_flow=1,
    final VHeaMax_flow=0.9,
    final floHys=0.01,
    final damPosHys=0.01) "Block outputs system alarms"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp disAirSet(
    final height=0.9,
    final duration=7200,
    final offset=0.1) "Discharge airflow rate setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp cooDisAir(
    final duration=7200,
    final offset=0.1,
    final height=0.3) "Cooling duct discharge airflow rate"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp damPos(
    final duration=7200,
    final height=0.7,
    final offset=0.3) "Damper position"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse supCooFan(
    final width=0.75,
    final period=7500) "Cooling supply fan status"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea
    "Convert boolean input to real output"
  Buildings.Controls.OBC.CDL.Reals.Multiply mul
    "Damper position"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse colDammSta(
    final width=0.5,
    final period=7500) "Cooling duct damper open and close status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp damPos1(
    final duration=7200,
    final height=0.7,
    final offset=0.3) "Damper position"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse supHeaFan(
    final width=0.75,
    final period=7500)
    "Heating supply fan status"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1
    "Convert boolean input to real output"
  Buildings.Controls.OBC.CDL.Reals.Multiply  mul1
    "Damper position"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse heaDammSta(
    final width=0.5,
    final period=7500)
    "Heating duct damper open and close status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp heaDisAir(
    final duration=7200,
    final offset=0.1,
    final height=0.3) "Heating duct discharge airflow rate"
  Buildings.Controls.OBC.CDL.Integers.Sources.Pulse intPul(
    amplitude=6,
    width=0.1,
    period=8500,
    offset=1)
    "Operation mode"
equation
  connect(disAirSet.y, ala.VActSet_flow)
  connect(booToRea.y, mul.u1)
  connect(damPos.y, mul.u2)
  connect(colDammSta.y, booToRea.u)
  connect(booToRea1.y, mul1.u1)
  connect(damPos1.y, mul1.u2)
  connect(heaDammSta.y, booToRea1.u)
  connect(supCooFan.y, ala.u1CooFan)
  connect(mul.y, ala.uCooDam)
  connect(supHeaFan.y, ala.u1HeaFan)
  connect(mul1.y, ala.uHeaDam)
  connect(cooDisAir.y, ala.VColDucDis_flow)
  connect(heaDisAir.y, ala.VHotDucDis_flow)
  connect(intPul.y, ala.uOpeMod)
end Alarms;


Validate model for controlling damper position of dual-duct unit using mixing control with inlet flow sensor. This example validates

BBuildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Dampers
for damper control of dual-duct unit.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Validation;
model Dampers
  "Validate model for controlling damper position of dual-duct unit using mixing control with inlet flow sensor"

  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Dampers dam1(
    final VCooMax_flow=0.08,
    final VHeaMax_flow=0.06,
    final kDam=1) "Output signal for controlling damper position"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp uCoo(
    final height=-1,
    final duration=3600,
    final offset=1,
    final startTime=900) "Cooling control signal"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant TZon(
    final k=273.15 + 22)
    "Zone temperature"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant TCooSup(
    final k=273.15 + 13)
    "AHU supply air temperature"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant VActMin_flow(
    final k=0.01)
    "Active minimum airflow setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant VActCooMax_flow(
    final k=0.075)
    "Active cooling maximum airflow setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin VColDuc(
    final offset=0.015,
    final amplitude=0.002,
    final freqHz=1/3600)
    "Cold-duct airflow rate"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse cooAhu(
    final width=0.75,
    final period=7200)
    "Cold air handling unit status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant THeaSup(
    final k=273.15 + 25)
    "AHU supply air temperature"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp uHea(
    final height=1,
    final duration=3600,
    final offset=0,
    final startTime=5500)
    "Heating control signal"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant VActHeaMax_flow(
    final k=0.07)
    "Active heating maximum airflow setpoint"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse heaAhu(
    final width=0.75,
    final period=7200,
    final shift=5000)
    "Hot air handling unit status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin VHotDuc(
    final offset=0.015,
    final amplitude=0.002,
    final freqHz=1/3600)
    "Hot-duct airflow rate"

equation
  connect(VActMin_flow.y, dam1.VActMin_flow)
  connect(TZon.y, dam1.TZon)
  connect(VActCooMax_flow.y, dam1.VActCooMax_flow)
  connect(uCoo.y, dam1.uCoo)
  connect(TCooSup.y, dam1.TColSup)
  connect(cooAhu.y, dam1.u1CooAHU)
  connect(THeaSup.y, dam1.THotSup)
  connect(uHea.y, dam1.uHea)
  connect(VActHeaMax_flow.y, dam1.VActHeaMax_flow)
  connect(heaAhu.y, dam1.u1HeaAHU)
  connect(VColDuc.y, dam1.VColDucDis_flow)
  connect(VHotDuc.y, dam1.VHotDucDis_flow)
end Dampers;


Validation of model that overrides control. This example validates

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Overrides
for overrideing controls.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Validation;
model Overrides "Validation of model that overrides control"

  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Overrides ove(
    final VMin_flow=0.1,
    final VCooMax_flow=0.9,
    final VHeaMax_flow=0.8) "Block outputs system requests"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp disAirSet(
    final height=0.9,
    final duration=7200,
    final offset=0.1) "Discharge airflow rate setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp cooDamPos(
    final duration=3600,
    final height=0.5,
    final offset=0.5) "Cooling damper position setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp oveFlo(
    final height=3,
    final duration=2000,
    startTime=1000) "Override flow setpoint"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt2
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round2(
    final n=0)
    "Round real number to given digits"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp oveDam(
    final height=2,
    final duration=2000,
    startTime=1000) "Override damper position"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt1
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round1(
    final n=0)
    "Round real number to given digits"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp heaDamPos(
    final duration=3600,
    final height=0.5,
    final offset=0.5) "Heating damper position setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp oveDam1(
    final height=2,
    final duration=2000,
    startTime=1000) "Override damper position"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt3
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round3(final n=0)
    "Round real number to given digits"

equation
  connect(oveDam.y, round1.u)
  connect(round1.y, reaToInt1.u)
  connect(oveFlo.y, round2.u)
  connect(round2.y, reaToInt2.u)
  connect(reaToInt2.y, ove.oveFloSet)
  connect(disAirSet.y, ove.VActSet_flow)
  connect(reaToInt1.y, ove.oveCooDamPos)
  connect(cooDamPos.y, ove.uCooDam)
  connect(oveDam1.y, round3.u)
  connect(round3.y,reaToInt3. u)
  connect(reaToInt3.y, ove.oveHeaDamPos)
  connect(heaDamPos.y, ove.uHeaDam)
end Overrides;


Collection of validation models

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences;
package Validation "Collection of validation models"
end Validation;


Validation of model that generates system requests. This example validates

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.SystemRequests
for generating system requests.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.Validation;
model SystemRequests
  "Validation of model that generates system requests"

  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Subsequences.SystemRequests sysReq(
    final floHys=0.01,
    final looHys=0.01,
    final damPosHys=0.01) "Block outputs system requests"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin sine(
    final freqHz=1/7200,
    final offset=296.15)
    "Generate data for setpoint"
  Buildings.Controls.OBC.CDL.Discrete.UnitDelay TZonCooSet(
    final samplePeriod=1800) "Cooling setpoint temperature"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin TZon(
    final freqHz=1/7200,
    final amplitude=2,
    final offset=299.15)
    "Zone temperature"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp uCoo(
    final height=-1,
    final duration=2000,
    final offset=1,
    final startTime=1000)
    "Cooling loop signal"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp colDucAirSet(
    final height=0.9,
    final duration=7200,
    final offset=0.1) "Cold-duct airflow rate setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp colDucAirRate(
    final duration=7200,
    final offset=0.1,
    final height=0.3) "Cold duct airflow rate"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp colDamPos(
    final duration=3000,
    final height=-0.7,
    final offset=0.7) "Cold-duct damper position"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul(
    final width=0.1,
    final period=7200)
    "After suppression"
  Buildings.Controls.OBC.CDL.Logical.Not not1 "Logical not"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin sine1(
    final freqHz=1/7200,
    final offset=293.15)
    "Generate data for setpoint"
  Buildings.Controls.OBC.CDL.Discrete.UnitDelay TZonHeaSet(
    final samplePeriod=1800)
    "Heating setpoint temperature"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul1(
    final width=0.1,
    final period=7200)
    "After suppression"
  Buildings.Controls.OBC.CDL.Logical.Not not2 "Logical not"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp uHea(
    final height=0.9,
    final duration=3600,
    final startTime=3600)
    "Heating loop signal"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp hotDucAirSet(
    final height=0.9,
    final duration=7200,
    final offset=0.1)
    "Hot-duct airflow rate setpoint"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp hotDucAirRate(
    final duration=7200,
    final offset=0.1,
    final height=0.3)
    "Hot duct airflow rate"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp hotDamPos(
    final duration=3600,
    final height=0.7,
    startTime=3600)
    "Hot-duct damper position"

equation
  connect(sine.y, TZonCooSet.u)
  connect(TZonCooSet.y, sysReq.TCooSet)
  connect(TZon.y, sysReq.TZon)
  connect(uCoo.y, sysReq.uCoo)
  connect(booPul.y, not1.u)
  connect(not1.y, sysReq.uAftSupCoo)
  connect(colDucAirSet.y, sysReq.VColDuc_flow_Set)
  connect(colDucAirRate.y, sysReq.VColDucDis_flow)
  connect(colDamPos.y, sysReq.uCooDam)
  connect(sine1.y, TZonHeaSet.u)
  connect(booPul1.y, not2.u)
  connect(not2.y, sysReq.uAftSupHea)
  connect(TZonHeaSet.y, sysReq.THeaSet)
  connect(uHea.y, sysReq.uHea)
  connect(hotDucAirSet.y, sysReq.VHotDuc_flow_Set)
  connect(hotDucAirRate.y, sysReq.VHotDucDis_flow)
  connect(hotDamPos.y, sysReq.uHeaDam)
end SystemRequests;


Validation of model that controls dual-duct unit using mixing control with inlet flow sensor. This example validates

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Controller.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Validation;
model Controller
  "Validation of model that controls dual-duct unit using mixing control with inlet flow sensor"

  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor.Controller duaDucCon(
    final venStd=Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.ASHRAE62_1,
    final VAreBreZon_flow=0.006,
    final VPopBreZon_flow=0.005,
    final VMin_flow=0.5,
    final VCooMax_flow=1.5,
    final VHeaMax_flow=1.2,
    final staPreMul=1,
    final floHys=0.01,
    final looHys=0.01,
    final damPosHys=0.01,
    final VOccMin_flow=0,
    final VAreMin_flow=0)
    "Dual duct unit controller"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin TZon(
    final freqHz=1/86400,
    final amplitude=4,
    final offset=299.15)
    "Zone temperature"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp disAirTem(
    final height=2,
    final duration=43200,
    final offset=273.15 + 15,
    final startTime=28800)
    "Discharge airflow temperture"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse winSta(
    final width=0.05,
    final period=43200,
    final shift=43200)
    "Window opening status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooSet(
    final k=273.15 + 24)
    "Zone cooling setpoint temperature"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaSet(
    final k=273.15 + 20)
    "Zone heating setpoint temperature"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse occ(
    final width=0.75,
    final period=43200,
    final shift=28800) "Occupancy status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp opeMod(
    final offset=1,
    final height=2,
    final duration=28800,
    final startTime=28800)
    "Operation mode"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt2
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round2(
    final n=0)
    "Round real number to given digits"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin CO2(
    final amplitude=400,
    final freqHz=1/28800,
    final offset=600) "CO2 concentration"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp colSupAirTem(
    final height=2,
    final duration=43200,
    final offset=273.15 + 14)
    "Cold-duct supply air temperature from air handling unit"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin VColDis_flow(
    final offset=1.2,
    final amplitude=0.6,
    final freqHz=1/28800) "Cold duct airflow rate"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp oveFlo(
    final height=2,
    final duration=10000,
    final startTime=35000)
    "Override flow setpoint"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt1
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round1(
    final n=0)
    "Round real number to given digits"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp oveColDam(
    final height=2,
    final duration=5000,
    startTime=60000) "Override cold-duct damper position"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt3
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round3(
    final n=0)
    "Round real number to given digits"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse cooSupFanSta(
    final width=0.9,
    final period=73200,
    final shift=18800) "Cooling supply fan status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp oveHotDam(
    final height=2,
    final duration=5000,
    final startTime=60000) "Override hot-duct damper position"
  Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt4
    "Convert real to integer"
  Buildings.Controls.OBC.CDL.Reals.Round round4(
    final n=0)
    "Round real number to given digits"
  Buildings.Controls.OBC.CDL.Logical.Sources.Pulse heaSupFanSta(
    final width=0.9,
    final period=73200,
    final shift=18800) "Heating supply fan status"
  Buildings.Controls.OBC.CDL.Reals.Sources.Sin VHotDis_flow(
    final offset=1.2,
    final amplitude=0.6,
    final freqHz=1/28800) "Hot duct airflow rate"
  Buildings.Controls.OBC.CDL.Reals.Sources.Ramp hotSupAirTem(
    final height=2,
    final duration=43200,
    final offset=273.15 + 24)
    "Hot-duct supply air temperature from air handling unit"
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant CO2Set(final k=894)
    "CO2 concentration setpoint"
  Buildings.Controls.OBC.CDL.Logical.Not not2 "Logical not"
equation
  connect(TZon.y,duaDucCon. TZon)
  connect(cooSet.y, duaDucCon.TCooSet)
  connect(heaSet.y, duaDucCon.THeaSet)
  connect(occ.y, duaDucCon.u1Occ)
  connect(opeMod.y,round2. u)
  connect(round2.y,reaToInt2. u)
  connect(reaToInt2.y,duaDucCon. uOpeMod)
  connect(CO2.y,duaDucCon. ppmCO2)
  connect(oveFlo.y,round1. u)
  connect(round1.y,reaToInt1. u)
  connect(oveColDam.y, round3.u)
  connect(round3.y,reaToInt3. u)
  connect(reaToInt1.y,duaDucCon. oveFloSet)
  connect(reaToInt3.y, duaDucCon.oveCooDamPos)
  connect(oveHotDam.y, round4.u)
  connect(round4.y,reaToInt4. u)
  connect(reaToInt4.y, duaDucCon.oveHeaDamPos)
  connect(disAirTem.y, duaDucCon.TDis)
  connect(colSupAirTem.y, duaDucCon.TColSup)
  connect(VColDis_flow.y, duaDucCon.VColDucDis_flow)
  connect(cooSupFanSta.y, duaDucCon.u1CooAHU)
  connect(hotSupAirTem.y, duaDucCon.THotSup)
  connect(VHotDis_flow.y, duaDucCon.VHotDucDis_flow)
  connect(heaSupFanSta.y, duaDucCon.u1HeaAHU)
  connect(CO2Set.y, duaDucCon.ppmCO2Set)
  connect(winSta.y, not2.u)
  connect(not2.y, duaDucCon.u1Win)
end Controller;


Collection of validation models

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctMixConInletSensor;
package Validation "Collection of validation models"
end Validation;


Controller for snap-acting controlled dual-duct terminal unit. Controller for snap-acting controlled dual-duct terminal unit according to Section 5.11 of ASHRAE
Guideline 36, May 2020. It outputs discharge airflow setpoint VSet_flow,
cold and hot duct dampers position setpoint (yCooDam, yHeaDam),
cooling supply temperature setpoint reset request yZonCooTemResReq,
heating supply temperature setpoint reset request yZonHeaTemResReq,
cold-duct static pressure setpoint reset request yColDucPreResReq,
hot-duct static pressure setpoint reset request yHotDucPreResReq,
heating fan request yHeaFanReq.
It also outputs the alarms about the low airflow yLowFloAla,
leaking dampers, and airflow sensor(s) calibration alarm.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing;
block Controller "Controller for snap-acting controlled dual-duct terminal unit"

  parameter Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard venStd
    "Ventilation standard, ASHRAE 62.1 or Title 24";
  parameter Boolean have_winSen=true
    "True: the zone has window sensor"
  parameter Boolean have_occSen=true
    "True: the zone has occupancy sensor"
  parameter Boolean have_CO2Sen=true
    "True: the zone has CO2 sensor"
  parameter Boolean have_duaSen
    "True: the unit has dual inlet flow sensor";
  parameter Boolean permit_occStandby=true
    "True: occupied-standby mode is permitted"
  parameter Real VOccMin_flow(unit="m3/s")
    "Zone minimum outdoor airflow for occupants"
  parameter Real VAreMin_flow(unit="m3/s")
    "Zone minimum outdoor airflow for building area"
  // ---------------- Design parameters ----------------
  parameter Real VAreBreZon_flow(unit="m3/s")
    "Design area component of the breathing zone outdoor airflow"
  parameter Real VPopBreZon_flow(unit="m3/s")
    "Design population component of the breathing zone outdoor airflow"
  parameter Real VMin_flow(unit="m3/s")
    "Design zone minimum airflow setpoint"
  parameter Real VCooMax_flow(unit="m3/s")
    "Design zone cooling maximum airflow rate"
  parameter Real VHeaMax_flow(unit="m3/s")
    "Design zone heating maximum airflow rate"
  // ---------------- Control loop parameters ----------------
  parameter Real kCooCon=0.1
    "Gain of controller for cooling control loop"
  parameter Real TiCooCon(unit="s")=900
    "Time constant of integrator block for cooling control loop"
  parameter Real kHeaCon=0.1
    "Gain of controller for heating control loop"
  parameter Real TiHeaCon(unit="s")=900
    "Time constant of integrator block for heating control loop"
  // ---------------- Dampers control parameters ----------------
  parameter CDL.Types.SimpleController controllerTypeDam=
    Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"
  parameter Real kDam=0.5
    "Gain of controller for damper control"
  parameter Real TiDam(unit="s")=300
    "Time constant of integrator block for damper control"
  parameter Real TdDam(unit="s")=0.1
    "Time constant of derivative block for damper control"
  // ---------------- System request parameters ----------------
  parameter Real thrTemDif(unit="K")=3
    "Threshold difference between zone temperature and cooling setpoint for generating 3 cooling SAT reset requests"
  parameter Real twoTemDif(unit="K")=2
    "Threshold difference between zone temperature and cooling setpoint for generating 2 cooling SAT reset requests"
  parameter Real durTimTem(unit="s")=120
    "Duration time of zone temperature exceeds setpoint"
  parameter Real durTimFlo(unit="s")=60
    "Duration time of airflow rate less than setpoint"
  // ---------------- Parameters for alarms ----------------
  parameter Real staPreMul=1
    "Importance multiplier for the zone static pressure reset control loop"
  parameter Real lowFloTim(unit="s")=300
    "Threshold time to check low flow rate"
  parameter Real lowTemTim(unit="s")=600
    "Threshold time to check low discharge temperature"
  parameter Real fanOffTim(unit="s")=600
    "Threshold time to check fan off"
  parameter Real leaFloTim(unit="s")=600
    "Threshold time to check damper leaking airflow"
  parameter Real valCloTim(unit="s")=900
    "Threshold time to check valve leaking water flow"
  // ---------------- Parameters for time-based suppression ----------------
  parameter Real chaRat(final unit="s/K")=540
    "Gain factor to calculate suppression time based on the change of the setpoint, seconds per Kelvin"
  parameter Real maxSupTim(unit="s")=1800
    "Maximum suppression time"
  // ---------------- Advanced parameters ----------------
  parameter Real dTHys(unit="K")=0.25
    "Near zero temperature difference, below which the difference will be seen as zero"
  parameter Real looHys(unit="1")=0.01
    "Loop output hysteresis below which the output will be seen as zero"
  parameter Real floHys(unit="m3/s")=0.01*VMin_flow
    "Near zero flow rate, below which the flow rate or difference will be seen as zero"
  parameter Real damPosHys(unit="1")=0.005
    "Near zero damper position, below which the damper will be seen as closed"
  parameter Real staTim(
    final unit="s",
    final quantity="Time")=1800
    "Delay triggering alarms after enabling AHU supply fan"
  parameter Real iniDam(unit="1")=0.01
    "Initial damper position when the damper control is enabled"
  parameter Real iniCooDam(unit="1")=0.01
    "Initial cooling damper position when the damper control is enabled"
  parameter Real iniHeaDam(unit="1")=0.01
    "Initial heating damper position when the damper control is enabled"
  parameter Real timChe(unit="s")=30
    "Threshold time to check the zone temperature status"
  parameter Real zonDisEff_cool(unit="1")=1.0
    "Zone cooling air distribution effectiveness"
  parameter Real zonDisEff_heat(unit="1")=0.8
    "Zone heating air distribution effectiveness"
  parameter Real samplePeriod(unit="s")=120
    "Sample period of component, set to the same value as the trim and respond that process static pressure reset"

  Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon(
    final quantity="ThermodynamicTemperature",
    final unit="K",
    final displayUnit="degC")
    "Measured room temperature"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput TCooSet(
    final quantity="ThermodynamicTemperature",
    final unit="K",
    final displayUnit="degC") "Setpoint temperature for room for cooling"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput THeaSet(
    final quantity="ThermodynamicTemperature",
    final unit="K",
    final displayUnit="degC") "Setpoint temperature for room for heating"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Win if have_winSen
    "Window status, normally closed (true), when windows open, it becomes false"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Occ if have_occSen
    "True: the zone is populated"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
    "Zone operation mode"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput ppmCO2Set if have_CO2Sen
    "CO2 concentration setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput ppmCO2 if have_CO2Sen
    "Detected CO2 concentration"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput TDis(
    final quantity="ThermodynamicTemperature",
    final unit="K",
    final displayUnit="degC")
    "Measured discharge air temperature"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput TColSup(
    final quantity="ThermodynamicTemperature",
    final unit="K",
    final displayUnit="degC") if have_duaSen
    "Cold duct supply air temperature from central air handler"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate") if have_duaSen
    "Measured cold-duct discharge airflow rate airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooAHU
    "Cooling air handler status"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput THotSup(
    final quantity="ThermodynamicTemperature",
    final unit="K",
    final displayUnit="degC") if have_duaSen
    "Hot duct supply air temperature from central air handler"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate") if have_duaSen
    "Measured hot-duct discharge airflow rate airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaAHU
    "Heating air handler status"
  Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate") if not have_duaSen
    "Measured discharge airflow rate airflow rate"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveFloSet
    "Index of overriding flow setpoint, 1: set to zero; 2: set to cooling maximum; 3: set to minimum flow; 4: set to heating maximum"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveCooDamPos
    "Index of overriding cooling damper position, 1: set to close; 2: set to open"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveHeaDamPos
    "Index of overriding heating damper position, 1: set to close; 2: set to open"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VSet_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Airflow setpoint after considering override"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam(
    final min=0,
    final max=1,
    final unit="1")
    "Cooling damper commanded position, or commanded flow rate ratio"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam(
    final min=0,
    final max=1,
    final unit="1")
    "Heating damper commanded position, or commanded flow rate ratio"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VAdjPopBreZon_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s") if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.ASHRAE62_1
    "Adjusted population component breathing zone flow rate"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VAdjAreBreZon_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s") if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.ASHRAE62_1
    "Adjusted area component breathing zone flow rate"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VMinOA_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s") if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.ASHRAE62_1
    "Minimum outdoor airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VZonAbsMin_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s") if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.California_Title_24
    "Zone absolute minimum outdoor airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VZonDesMin_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s") if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.California_Title_24
    "Zone design minimum outdoor airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCO2(
    final unit="1") if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.California_Title_24
    "CO2 control loop signal"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonCooTemResReq
    "Zone cooling supply air temperature reset request"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColDucPreResReq
    "Cold duct pressure reset requests"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonHeaTemResReq
    "Zone heating supply air temperature reset request"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotDucPreResReq
    "Hot duct pressure reset requests"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHeaFanReq
    "Heating fan request"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowFloAla
    "Low airflow alarms"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yFloSenAla
    if not have_duaSen
    "Airflow sensor calibration alarm"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLeaDamAla
    if not have_duaSen
    "Leaking dampers alarm, could be heating or cooling damper"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColFloSenAla if have_duaSen
    "Cold-duct airflow sensor calibration alarm"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColLeaDamAla if have_duaSen
    "Leaking cold-duct damper alarm"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotFloSenAla if have_duaSen
    "Hot-duct airflow sensor calibration alarm"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotLeaDamAla if have_duaSen
    "Leaking hot-duct damper alarm"

  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.ActiveAirFlow
    actAirSet(
    final VCooMax_flow=VCooMax_flow,
    final VHeaMax_flow=VHeaMax_flow) "Active airflow setpoint"
  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.SystemRequests
    sysReq(
    final have_duaSen=have_duaSen,
    final thrTemDif=thrTemDif,
    final twoTemDif=twoTemDif,
    final durTimTem=durTimTem,
    final durTimFlo=durTimFlo,
    final dTHys=dTHys,
    final floHys=floHys,
    final looHys=looHys,
    final damPosHys=damPosHys) "Specify system requests "
  Buildings.Controls.OBC.ASHRAE.G36.ThermalZones.ControlLoops conLoo(
    final kCooCon=kCooCon,
    final TiCooCon=TiCooCon,
    final kHeaCon=kHeaCon,
    final TiHeaCon=TiHeaCon,
    final timChe=timChe,
    final dTHys=dTHys,
    final looHys=looHys) "Heating and cooling control loop"
  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Alarms
    ala(
    final have_duaSen=have_duaSen,
    final staPreMul=staPreMul,
    final VCooMax_flow=VCooMax_flow,
    final VHeaMax_flow=VHeaMax_flow,
    final lowFloTim=lowFloTim,
    final fanOffTim=fanOffTim,
    final leaFloTim=leaFloTim,
    final floHys=floHys,
    final damPosHys=damPosHys,
    final staTim=staTim)       "Generate alarms"
  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Overrides
    setOve(
    final VMin_flow=VMin_flow,
    final VCooMax_flow=VCooMax_flow,
    final VHeaMax_flow=VHeaMax_flow) "Override setpoints"
  Buildings.Controls.OBC.ASHRAE.G36.Generic.TimeSuppression timSupCoo(
    final samplePeriod=samplePeriod,
    final chaRat=chaRat,
    final maxTim=maxSupTim,
    final dTHys=dTHys)
    "Specify suppresion time due to the zone cooling setpoint change and check if it has passed the suppresion period"
  Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.ASHRAE62_1.Setpoints setPoi(
    final have_winSen=have_winSen,
    final have_occSen=have_occSen,
    final have_CO2Sen=have_CO2Sen,
    final have_typTerUni=true,
    final have_parFanPowUni=false,
    final have_SZVAV=false,
    final permit_occStandby=permit_occStandby,
    final VAreBreZon_flow=VAreBreZon_flow,
    final VPopBreZon_flow=VPopBreZon_flow,
    final VMin_flow=VMin_flow,
    final VCooMax_flow=VCooMax_flow,
    final zonDisEff_cool=zonDisEff_cool,
    final zonDisEff_heat=zonDisEff_heat,
    final dTHys=dTHys) if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.ASHRAE62_1
    "Output the minimum outdoor airflow rate setpoint, when using ASHRAE 62.1"
  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersDualSensors damDuaSen(
    final VCooMax_flow=VCooMax_flow,
    final VHeaMax_flow=VHeaMax_flow,
    final controllerTypeDam=controllerTypeDam,
    final kDam=kDam,
    final TiDam=TiDam,
    final TdDam=TdDam,
    final samplePeriod=samplePeriod,
    final dTHys=dTHys,
    final looHys=looHys,
    final iniDam=iniDam) if have_duaSen
    "Dampers control when the unit has single dual airflow sensor"
  Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersSingleSensors damSinSen(
    final VCooMax_flow=VCooMax_flow,
    final VHeaMax_flow=VHeaMax_flow,
    final controllerTypeDam=controllerTypeDam,
    final kDam=kDam,
    final TiDam=TiDam,
    final TdDam=TdDam,
    final samplePeriod=samplePeriod,
    final looHys=looHys,
    final iniDam=iniDam) if not have_duaSen
    "Dampers control when the unit has single discharge airflow sensor"
  Buildings.Controls.OBC.ASHRAE.G36.Generic.TimeSuppression timSupHea(
    final samplePeriod=samplePeriod,
    final chaRat=chaRat,
    final maxTim=maxSupTim,
    final dTHys=dTHys)
    "Specify suppresion time due to the zone heating setpoint change and check if it has passed the suppresion period"
  Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.Title24.Setpoints minFlo(
    final have_winSen=have_winSen,
    final have_occSen=have_occSen,
    final have_CO2Sen=have_CO2Sen,
    final have_typTerUni=true,
    final VOccMin_flow=VOccMin_flow,
    final VAreMin_flow=VAreMin_flow,
    final VMin_flow=VMin_flow,
    final VCooMax_flow=VCooMax_flow) if venStd == Buildings.Controls.OBC.ASHRAE.G36.Types.VentilationStandard.California_Title_24
    "Output the minimum outdoor airflow rate setpoint, when using Title 24"
equation
  connect(TZon, timSupCoo.TZon)
  connect(TZon, timSupHea.TZon)
  connect(TCooSet, timSupCoo.TSet)
  connect(THeaSet, timSupHea.TSet)
  connect(TCooSet, conLoo.TCooSet)
  connect(TZon, conLoo.TZon)
  connect(THeaSet, conLoo.THeaSet)
  connect(u1Win, setPoi.u1Win)
  connect(u1Occ, setPoi.u1Occ)
  connect(uOpeMod, setPoi.uOpeMod)
  connect(ppmCO2, setPoi.ppmCO2)
  connect(TZon, setPoi.TZon)
  connect(TDis, setPoi.TDis)
  connect(uOpeMod, actAirSet.uOpeMod)
  connect(setPoi.VOccZonMin_flow, actAirSet.VOccMin_flow)
  connect(conLoo.yCoo, damDuaSen.uCoo)
  connect(actAirSet.VActCooMax_flow, damDuaSen.VActCooMax_flow)
  connect(VColDucDis_flow, damDuaSen.VColDucDis_flow)
  connect(u1CooAHU, damDuaSen.u1CooAHU)
  connect(actAirSet.VActMin_flow, damDuaSen.VActMin_flow)
  connect(TZon, damDuaSen.TZon)
  connect(conLoo.yHea, damDuaSen.uHea)
  connect(actAirSet.VActHeaMax_flow, damDuaSen.VActHeaMax_flow)
  connect(VHotDucDis_flow, damDuaSen.VHotDucDis_flow)
  connect(u1HeaAHU, damDuaSen.u1HeaAHU)
  connect(conLoo.yCoo, damSinSen.uCoo)
  connect(actAirSet.VActCooMax_flow, damSinSen.VActCooMax_flow)
  connect(actAirSet.VActMin_flow, damSinSen.VActMin_flow)
  connect(conLoo.yHea, damSinSen.uHea)
  connect(actAirSet.VActHeaMax_flow, damSinSen.VActHeaMax_flow)
  connect(u1CooAHU, damSinSen.u1CooAHU)
  connect(u1HeaAHU, damSinSen.u1HeaAHU)
  connect(oveFloSet, setOve.oveFloSet)
  connect(oveCooDamPos, setOve.oveCooDamPos)
  connect(oveHeaDamPos, setOve.oveHeaDamPos)
  connect(damDuaSen.yCooDam, setOve.uCooDam)
  connect(damDuaSen.yHeaDam, setOve.uHeaDam)
  connect(damSinSen.VDis_flow_Set, setOve.VActSet_flow)
  connect(damDuaSen.VDis_flow_Set, setOve.VActSet_flow)
  connect(timSupCoo.yAftSup, sysReq.uAftSupCoo)
  connect(TCooSet, sysReq.TCooSet)
  connect(TZon, sysReq.TZon)
  connect(conLoo.yCoo, sysReq.uCoo)
  connect(damDuaSen.VDis_flow_Set, sysReq.VColDuc_flow_Set)
  connect(timSupHea.yAftSup, sysReq.uAftSupHea)
  connect(THeaSet, sysReq.THeaSet)
  connect(conLoo.yHea, sysReq.uHea)
  connect(damDuaSen.VDis_flow_Set, sysReq.VHotDuc_flow_Set)
  connect(VColDucDis_flow, sysReq.VColDucDis_flow)
  connect(VHotDucDis_flow, sysReq.VHotDucDis_flow)
  connect(VDis_flow, damSinSen.VDis_flow)
  connect(VDis_flow, sysReq.VColDucDis_flow)
  connect(VDis_flow, sysReq.VHotDucDis_flow)
  connect(damSinSen.y1CooDam, sysReq.u1CooDam)
  connect(damSinSen.y1HeaDam, sysReq.u1HeaDam)
  connect(VColDucDis_flow, ala.VColDucDis_flow)
  connect(u1CooAHU, ala.u1CooFan)
  connect(VHotDucDis_flow, ala.VHotDucDis_flow)
  connect(u1HeaAHU, ala.u1HeaFan)
  connect(VDis_flow, ala.VDis_flow)
  connect(setOve.VSet_flow, VSet_flow)
  connect(setOve.yCooDam, yCooDam)
  connect(setOve.yHeaDam, yHeaDam)
  connect(sysReq.yZonCooTemResReq, yZonCooTemResReq)
  connect(sysReq.yColDucPreResReq, yColDucPreResReq)
  connect(sysReq.yZonHeaTemResReq, yZonHeaTemResReq)
  connect(sysReq.yHotDucPreResReq, yHotDucPreResReq)
  connect(sysReq.yHeaFanReq, yHeaFanReq)
  connect(ala.yLowFloAla, yLowFloAla)
  connect(ala.yFloSenAla, yFloSenAla)
  connect(ala.yLeaDamAla, yLeaDamAla)
  connect(ala.yColFloSenAla, yColFloSenAla)
  connect(ala.yColLeaDamAla, yColLeaDamAla)
  connect(ala.yHotFloSenAla, yHotFloSenAla)
  connect(ala.yHotLeaDamAla, yHotLeaDamAla)
  connect(damSinSen.VDis_flow_Set, sysReq.VColDuc_flow_Set)
  connect(damSinSen.VDis_flow_Set, sysReq.VHotDuc_flow_Set)
  connect(setOve.VSet_flow, ala.VActSet_flow)
  connect(damDuaSen.TColSup, TColSup)
  connect(damDuaSen.THotSup, THotSup)
  connect(ppmCO2Set, setPoi.ppmCO2Set)
  connect(minFlo.VOccZonMin_flow, actAirSet.VOccMin_flow)
  connect(u1Win, minFlo.u1Win)
  connect(u1Occ, minFlo.u1Occ)
  connect(uOpeMod, minFlo.uOpeMod)
  connect(ppmCO2Set, minFlo.ppmCO2Set)
  connect(ppmCO2, minFlo.ppmCO2)
  connect(damSinSen.yHeaDam, setOve.uHeaDam)
  connect(damSinSen.yCooDam, setOve.uCooDam)
  connect(setPoi.VAdjPopBreZon_flow, VAdjPopBreZon_flow)
  connect(setPoi.VMinOA_flow, VMinOA_flow)
  connect(setPoi.VAdjAreBreZon_flow, VAdjAreBreZon_flow)
  connect(minFlo.VZonAbsMin_flow, VZonAbsMin_flow)
  connect(minFlo.VZonDesMin_flow, VZonDesMin_flow)
  connect(minFlo.yCO2, yCO2)
  connect(setOve.yCooDam, sysReq.uCooDam)
  connect(setOve.yCooDam, ala.uCooDam)
  connect(setOve.yHeaDam, sysReq.uHeaDam)
  connect(setOve.yHeaDam, ala.uHeaDam)
  connect(uOpeMod, ala.uOpeMod)
end Controller;


within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits;
package DualDuctSnapActing "Sequences for dual duct terminal unit with snap acting control"
end DualDuctSnapActing;


Output the active airflow setpoint for snap-acting controlled dual-duct terminal unit. This sequence sets the active cooling and heating maximum and the active minimum setpoints
for snap-acting controlled dual-duct terminal unit.
The implementation is according to the Section 5.11.4 of ASHRAE Guideline 36, May 2020.

within Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences;
block ActiveAirFlow
  "Output the active airflow setpoint for snap-acting controlled dual-duct terminal unit"

  parameter Real VCooMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone cooling maximum airflow rate";
  parameter Real VHeaMax_flow(
    final quantity="VolumeFlowRate",
    final unit="m3/s")
    "Design zone heating maximum airflow rate";

  Buildings.Controls.OBC.CDL.Interfaces.RealInput VOccMin_flow(
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Occupied minimum airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
    "Zone operation mode"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActCooMax_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Active cooling maximum airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActMin_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Active minimum airflow setpoint"
  Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMax_flow(
    final min=0,
    final unit="m3/s",
    final quantity="VolumeFlowRate")
    "Active heating maximum airflow setpoint"

protected
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod(
    final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied)
    "Occupied mode"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant cooDowMod(
    final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.coolDown)
    "Cool down mode"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant setUpMod(
    final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.setUp)
    "Setup mode"
  Buildings.Controls.OBC.CDL.Logical.Or or3
    "Check if it is in occupied, cooldown, or setup mode"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal actCooMax(
    final realTrue=VCooMax_flow)
    "Active cooling maximum flow"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal occModInd(
    final realTrue=1)
    "If in occupied mode, output 1"
  Buildings.Controls.OBC.CDL.Reals.Multiply pro
    "Active cooling minimum, minimum airflow setpoint"
  Buildings.Controls.OBC.CDL.Conversions.BooleanToReal heaMaxFlo(
    final realTrue=VHeaMax_flow)
    "Heating maximum flow when input is true"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant setBacMod(
    final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.setBack)
    "Setback mode"
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant warUpMod(
    final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.warmUp)
    "Warm up mode"
  Buildings.Controls.OBC.CDL.Integers.Equal ifOcc
    "Check if current operation mode is occupied mode"
  Buildings.Controls.OBC.CDL.Integers.Equal ifCooDow
    "Check if current operation mode is cooldown mode"
  Buildings.Controls.OBC.CDL.Integers.Equal ifSetUp
    "Check if current operation mode is setup mode"
  Buildings.Controls.OBC.CDL.Integers.Equal ifWarUp
    "Check if current operation mode is warm-up mode"
  Buildings.Controls.OBC.CDL.Integers.Equal ifSetBac
    "Check if current operation mode is setback mode"
  Buildings.Controls.OBC.CDL.Logical.Or or1
    "Check if it is in occupied, warm-up, or setback mode"
  Buildings.Controls.OBC.CDL.Logical.Or or2
    "Check if it is in occupied, cooldown, or setup mode"
  Buildings.Controls.OBC.CDL.Logical.Or or4
    "Check if it is in occupied, warm-up, or setback mode"

equation
  connect(occMod.y, ifOcc.u1)
  connect(cooDowMod.y, ifCooDow.u1)
  connect(setUpMod.y, ifSetUp.u1)
  connect(warUpMod.y, ifWarUp.u1)
  connect(uOpeMod, ifOcc.u2)
  connect(uOpeMod, ifCooDow.u2)
  connect(uOpeMod, ifSetUp.u2)
  connect(uOpeMod, ifWarUp.u2)
  connect(uOpeMod, ifSetBac.u2)
  connect(setBacMod.y, ifSetBac.u1)
  connect(ifOcc.y, or3.u1)
  connect(ifCooDow.y, or3.u2)
  connect(ifOcc.y, occModInd.u)
  connect(VOccMin_flow, pro.u2)
  connect(occModInd.y, pro.u1)
  connect(actCooMax.y, VActCooMax_flow)
  connect(pro.y, VActMin_flow)
  connect(ifOcc.y, or1.u1)
  connect(ifWarUp.y, or1.u2)
  connect(heaMaxFlo.y, VActHeaMax_flow)
  connect(or3.y, or2.u1)
  connect(or2.y, actCooMax.u)
  connect(or1.y, or4.u1)
  connect(or4.y, heaMaxFlo.u)
  connect(ifSetUp.y, or2.u2)
  connect(ifSetBac.y, or4.u2)
end ActiveAirFlow;