Skip to content

Commit 669e124

Browse files
authored
Merge pull request #3627 from lbl-srg/issue2885_FanCoilUnitControls
Add fan coil unit and G36 control with example model.
2 parents 8b3ba75 + 56468b4 commit 669e124

48 files changed

Lines changed: 7429 additions & 63 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Buildings/Controls/OBC/ASHRAE/G36/FanCoilUnits/Controller.mo

Lines changed: 1164 additions & 0 deletions
Large diffs are not rendered by default.

Buildings/Controls/OBC/ASHRAE/G36/FanCoilUnits/Subsequences/FanSpeed.mo

Lines changed: 405 additions & 0 deletions
Large diffs are not rendered by default.

Buildings/Controls/OBC/ASHRAE/G36/FanCoilUnits/Subsequences/PlantRequests.mo

Lines changed: 612 additions & 0 deletions
Large diffs are not rendered by default.

Buildings/Controls/OBC/ASHRAE/G36/FanCoilUnits/Subsequences/SupplyAirTemperature.mo

Lines changed: 500 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
within Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.Validation;
2+
block FanSpeed
3+
"Validation model for fan speed subsequence"
4+
5+
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed fanSpe(
6+
have_cooCoi=true,
7+
have_heaCoi=true)
8+
"Instance demonstrating variation of heating loop signal"
9+
annotation (Placement(transformation(extent={{-40,120},{-20,140}})));
10+
11+
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed fanSpe2(
12+
have_cooCoi=true,
13+
have_heaCoi=true)
14+
"Instance demonstrating variation of operating mode"
15+
annotation (Placement(transformation(extent={{80,120},{100,140}})));
16+
17+
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed fanSpe1(
18+
have_cooCoi=true,
19+
have_heaCoi=true)
20+
"Instance demonstrating variation of cooling loop signal"
21+
annotation (Placement(transformation(extent={{-40,-10},{-20,10}})));
22+
23+
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed fanSpe3(
24+
have_cooCoi=true,
25+
have_heaCoi=false)
26+
"Instance demonstrating variation of cooling loop signal with no heating coil"
27+
annotation (Placement(transformation(extent={{80,-10},{100,10}})));
28+
29+
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed fanSpe4(
30+
have_cooCoi=false,
31+
have_heaCoi=true)
32+
"Instance demonstrating variation of heating loop signal with no cooling coil"
33+
annotation (Placement(transformation(extent={{-40,-140},{-20,-120}})));
34+
35+
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed fanSpe5(
36+
have_cooCoi=false,
37+
have_heaCoi=false)
38+
"Instance demonstrating variation of operating mode with no heating and cooling coils"
39+
annotation (Placement(transformation(extent={{80,-140},{100,-120}})));
40+
41+
Buildings.Controls.OBC.CDL.Reals.Sources.Ramp ram(
42+
height=6,
43+
duration=70,
44+
offset=1)
45+
"Operating mode signal"
46+
annotation (Placement(transformation(extent={{20,160},{40,180}})));
47+
48+
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt
49+
"Real to Integer conversion"
50+
annotation (Placement(transformation(extent={{-70,160},{-50,180}})));
51+
52+
Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul(
53+
period=100)
54+
"Fan proven on signal"
55+
annotation (Placement(transformation(extent={{-100,130},{-80,150}})));
56+
57+
Buildings.Controls.OBC.CDL.Reals.Sources.Sin sin(
58+
freqHz=1/50)
59+
"Heating loop signal"
60+
annotation (Placement(transformation(extent={{-100,100},{-80,120}})));
61+
62+
Buildings.Controls.OBC.CDL.Reals.Abs abs
63+
"Convert negative loop signal to positive"
64+
annotation (Placement(transformation(extent={{-70,100},{-50,120}})));
65+
66+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con(
67+
k=0)
68+
"Cooling loop signal"
69+
annotation (Placement(transformation(extent={{-100,70},{-80,90}})));
70+
71+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con1(
72+
k=1)
73+
"Operating mode signal"
74+
annotation (Placement(transformation(extent={{-100,160},{-80,180}})));
75+
76+
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt1
77+
"Real to Integer conversion"
78+
annotation (Placement(transformation(extent={{50,160},{70,180}})));
79+
80+
Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul1(
81+
period=100)
82+
"Fan proven on signal"
83+
annotation (Placement(transformation(extent={{20,130},{40,150}})));
84+
85+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con2(
86+
k=0)
87+
"Cooling loop signal"
88+
annotation (Placement(transformation(extent={{20,70},{40,90}})));
89+
90+
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt2
91+
"Real to Integer conversion"
92+
annotation (Placement(transformation(extent={{-70,30},{-50,50}})));
93+
94+
Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul2(
95+
period=100)
96+
"Fan proven on signal"
97+
annotation (Placement(transformation(extent={{-100,0},{-80,20}})));
98+
99+
Buildings.Controls.OBC.CDL.Reals.Sources.Sin sin2(
100+
freqHz=1/50)
101+
"Cooling loop signal"
102+
annotation (Placement(transformation(extent={{-100,-60},{-80,-40}})));
103+
104+
Buildings.Controls.OBC.CDL.Reals.Abs abs2
105+
"Convert negative loop signal to positive"
106+
annotation (Placement(transformation(extent={{-70,-60},{-50,-40}})));
107+
108+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con3(
109+
k=0)
110+
"Heating loop signal"
111+
annotation (Placement(transformation(extent={{-100,-30},{-80,-10}})));
112+
113+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con4(
114+
k=1)
115+
"Operating mode signal"
116+
annotation (Placement(transformation(extent={{-100,30},{-80,50}})));
117+
118+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con5(
119+
k=0.75)
120+
"Heating loop signal"
121+
annotation (Placement(transformation(extent={{20,100},{40,120}})));
122+
123+
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt3
124+
"Real to Integer conversion"
125+
annotation (Placement(transformation(extent={{50,30},{70,50}})));
126+
127+
Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul3(
128+
period=100)
129+
"Fan proven on signal"
130+
annotation (Placement(transformation(extent={{20,0},{40,20}})));
131+
132+
Buildings.Controls.OBC.CDL.Reals.Sources.Sin sin1(
133+
freqHz=1/50)
134+
"Cooling loop signal"
135+
annotation (Placement(transformation(extent={{20,-30},{40,-10}})));
136+
137+
Buildings.Controls.OBC.CDL.Reals.Abs abs1
138+
"Convert negative loop signal to positive"
139+
annotation (Placement(transformation(extent={{50,-30},{70,-10}})));
140+
141+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con7(
142+
k=1)
143+
"Operating mode signal"
144+
annotation (Placement(transformation(extent={{20,30},{40,50}})));
145+
146+
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt4
147+
"Real to Integer conversion"
148+
annotation (Placement(transformation(extent={{-70,-100},{-50,-80}})));
149+
150+
Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul4(
151+
period=100)
152+
"Fan proven on signal"
153+
annotation (Placement(transformation(extent={{-100,-130},{-80,-110}})));
154+
155+
Buildings.Controls.OBC.CDL.Reals.Sources.Sin sin3(
156+
freqHz=1/50)
157+
"Heating loop signal"
158+
annotation (Placement(transformation(extent={{-100,-160},{-80,-140}})));
159+
160+
Buildings.Controls.OBC.CDL.Reals.Abs abs3
161+
"Convert negative loop signal to positive"
162+
annotation (Placement(transformation(extent={{-70,-160},{-50,-140}})));
163+
164+
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con8(
165+
k=1)
166+
"Operating mode signal"
167+
annotation (Placement(transformation(extent={{-100,-100},{-80,-80}})));
168+
169+
Buildings.Controls.OBC.CDL.Reals.Sources.Ramp ram1(
170+
height=6,
171+
duration=70,
172+
offset=1)
173+
"Operating mode signal"
174+
annotation (Placement(transformation(extent={{20,-100},{40,-80}})));
175+
176+
Buildings.Controls.OBC.CDL.Conversions.RealToInteger reaToInt5
177+
"Real to Integer conversion"
178+
annotation (Placement(transformation(extent={{50,-100},{70,-80}})));
179+
180+
Buildings.Controls.OBC.CDL.Logical.Sources.Pulse booPul5(
181+
period=100)
182+
"Fan proven on signal"
183+
annotation (Placement(transformation(extent={{20,-130},{40,-110}})));
184+
185+
equation
186+
connect(reaToInt.y, fanSpe.opeMod) annotation (Line(points={{-48,170},{-46,170},
187+
{-46,136},{-42,136}}, color={255,127,0}));
188+
connect(booPul.y, fanSpe.u1FanPro) annotation (Line(points={{-78,140},{-50,140},
189+
{-50,132},{-42,132}}, color={255,0,255}));
190+
connect(sin.y, abs.u)
191+
annotation (Line(points={{-78,110},{-72,110}}, color={0,0,127}));
192+
connect(abs.y, fanSpe.uHea) annotation (Line(points={{-48,110},{-46,110},{-46,
193+
128},{-42,128}}, color={0,0,127}));
194+
connect(con.y, fanSpe.uCoo) annotation (Line(points={{-78,80},{-44,80},{-44,124},
195+
{-42,124}},color={0,0,127}));
196+
connect(con1.y, reaToInt.u)
197+
annotation (Line(points={{-78,170},{-72,170}}, color={0,0,127}));
198+
connect(reaToInt1.y, fanSpe2.opeMod) annotation (Line(points={{72,170},{74,170},
199+
{74,136},{78,136}}, color={255,127,0}));
200+
connect(booPul1.y, fanSpe2.u1FanPro) annotation (Line(points={{42,140},{70,140},
201+
{70,132},{78,132}}, color={255,0,255}));
202+
connect(con2.y, fanSpe2.uCoo) annotation (Line(points={{42,80},{76,80},{76,
203+
124},{78,124}}, color={0,0,127}));
204+
connect(ram.y, reaToInt1.u)
205+
annotation (Line(points={{42,170},{48,170}}, color={0,0,127}));
206+
connect(reaToInt2.y,fanSpe1. opeMod) annotation (Line(points={{-48,40},{-46,40},
207+
{-46,6},{-42,6}}, color={255,127,0}));
208+
connect(booPul2.y,fanSpe1. u1FanPro) annotation (Line(points={{-78,10},{-50,10},
209+
{-50,2},{-42,2}}, color={255,0,255}));
210+
connect(sin2.y, abs2.u)
211+
annotation (Line(points={{-78,-50},{-72,-50}}, color={0,0,127}));
212+
connect(con4.y, reaToInt2.u)
213+
annotation (Line(points={{-78,40},{-72,40}}, color={0,0,127}));
214+
connect(con3.y,fanSpe1. uHea) annotation (Line(points={{-78,-20},{-56,-20},{-56,
215+
-2},{-42,-2}}, color={0,0,127}));
216+
connect(abs2.y,fanSpe1. uCoo) annotation (Line(points={{-48,-50},{-46,-50},{-46,
217+
-6},{-42,-6}}, color={0,0,127}));
218+
connect(con5.y, fanSpe2.uHea) annotation (Line(points={{42,110},{60,110},{60,
219+
128},{78,128}}, color={0,0,127}));
220+
connect(reaToInt3.y,fanSpe3. opeMod) annotation (Line(points={{72,40},{74,40},
221+
{74,6},{78,6}}, color={255,127,0}));
222+
connect(booPul3.y,fanSpe3. u1FanPro) annotation (Line(points={{42,10},{70,10},{
223+
70,2},{78,2}}, color={255,0,255}));
224+
connect(sin1.y,abs1. u)
225+
annotation (Line(points={{42,-20},{48,-20}}, color={0,0,127}));
226+
connect(con7.y,reaToInt3. u)
227+
annotation (Line(points={{42,40},{48,40}}, color={0,0,127}));
228+
connect(abs1.y,fanSpe3. uCoo) annotation (Line(points={{72,-20},{74,-20},{74,-6},
229+
{78,-6}}, color={0,0,127}));
230+
connect(reaToInt4.y, fanSpe4.opeMod) annotation (Line(points={{-48,-90},{-46,-90},
231+
{-46,-124},{-42,-124}}, color={255,127,0}));
232+
connect(booPul4.y, fanSpe4.u1FanPro) annotation (Line(points={{-78,-120},{-50,-120},
233+
{-50,-128},{-42,-128}}, color={255,0,255}));
234+
connect(sin3.y, abs3.u)
235+
annotation (Line(points={{-78,-150},{-72,-150}}, color={0,0,127}));
236+
connect(abs3.y, fanSpe4.uHea) annotation (Line(points={{-48,-150},{-46,-150},
237+
{-46,-132},{-42,-132}}, color={0,0,127}));
238+
connect(con8.y, reaToInt4.u)
239+
annotation (Line(points={{-78,-90},{-72,-90}}, color={0,0,127}));
240+
connect(reaToInt5.y, fanSpe5.opeMod) annotation (Line(points={{72,-90},{74,-90},
241+
{74,-124},{78,-124}}, color={255,127,0}));
242+
connect(booPul5.y, fanSpe5.u1FanPro) annotation (Line(points={{42,-120},{70,-120},
243+
{70,-128},{78,-128}}, color={255,0,255}));
244+
connect(ram1.y, reaToInt5.u)
245+
annotation (Line(points={{42,-90},{48,-90}}, color={0,0,127}));
246+
247+
annotation (Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},
248+
{100,100}}), graphics={
249+
Ellipse(lineColor = {75,138,73},
250+
fillColor={255,255,255},
251+
fillPattern = FillPattern.Solid,
252+
extent={{-100,-100},{100,100}}),
253+
Polygon(lineColor = {0,0,255},
254+
fillColor = {75,138,73},
255+
pattern = LinePattern.None,
256+
fillPattern = FillPattern.Solid,
257+
points={{-36,60},{64,0},{-36,-60},{-36,60}})}), Diagram(
258+
coordinateSystem(preserveAspectRatio=false, extent={{-120,-200},{120,200}})),
259+
experiment(StopTime=100, Tolerance=1e-06),
260+
__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Controls/OBC/ASHRAE/G36/FanCoilUnits/Subsequences/Validation/FanSpeed.mos"
261+
"Simulate and plot"),
262+
Documentation(info="<html>
263+
<p>
264+
This example validates
265+
<a href=\"modelica://Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed\">
266+
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed</a>.
267+
Each of the six instances of the controller represents operation with different
268+
inputs for heating and cooling loop signals, as well as the operating mode
269+
and fan proven on signal, and different configuration
270+
parameters of fan coil unit with presence or absence of heating and cooling
271+
coils, as described by the comment for each instance.
272+
</p>
273+
</html>", revisions="<html>
274+
<ul>
275+
<li>
276+
March 18, 2022, by Karthik Devaprasad:<br/>
277+
First implementation.
278+
</li>
279+
</ul>
280+
</html>"));
281+
end FanSpeed;

0 commit comments

Comments
 (0)