Skip to content

Commit d834614

Browse files
committed
Demand response initial test version
1 parent e084f2a commit d834614

File tree

7 files changed

+274
-195
lines changed

7 files changed

+274
-195
lines changed

src/CGCOMP.CPP

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,10 +1053,6 @@ void IZXRAT::iz_SetupAfMtrs()
10531053

10541054
// AFMTR ptrs: NULL if no meter specified -> no air flow accounting
10551055
// one pointer for positive flows, one for negative
1056-
#if defined( _DEBUG)
1057-
if (iz_pAfMtr1 != NULL)
1058-
printf("\nTrouble");
1059-
#endif
10601056
iz_pAfMtr1 = iz_pAfMtr2 = NULL; // insurance
10611057
if (iz_afMtrCat1 != C_AFCAT_NONE)
10621058
{ // set up ptrs to AFMTR(s)

src/CNCULT.CPP

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2072,7 +2072,7 @@ CULT( "wsTUse", DAT, DHWSYS_TUSE, 0, 0, VHRLY, TYFL, 0, 120.f, N
20722072
CULT( "wsTSetpoint", DAT, DHWSYS_TSETPOINT,0, 0, VHRLY, TYFL, 0, 120.f, N, N),
20732073
CULT( "wsTSetpointLH",DAT, DHWSYS_TSETPOINTLH,0, 0, VHRLY, TYFL, 0, 120.f, N, N),
20742074
CULT( "wsDRMethod", DAT, DHWSYS_DRMETHOD, 0, 0, VEOI, TYCH, 0, C_DHWDRMETH_NONE, N, N),
2075-
CULT( "wsDRSignal", DAT, DHWSYS_DRSIGNAL, 0, 0, VHRLY, TYLLI, 0, 0, N, N),
2075+
CULT( "wsDRSignal", DAT, DHWSYS_DRSIGNAL, 0, 0, VHRLY, TYCH, 0, nc( C_DHWDRSIG_ON), 0.f, N, N),
20762076
CULT( "wsDayUse", DAT, DHWSYS_DAYUSENAME,0, 0, VDAILY, TYSTR, 0, N, N, N),
20772077
CULT( "wsWHhwMtr", DAT, DHWSYS_WHHWMTRI, 0, 0, VEOI, TYREF, &WMtriB,N, N, N),
20782078
CULT( "wsFXhwMtr", DAT, DHWSYS_FXHWMTRI, 0, 0, VEOI, TYREF, &WMtriB,N, N, N),

src/CNDTYPES.DEF

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ PIPESEGP -- "class PIPESEG*" 4 none
356356
}
357357

358358
// DHW choices
359+
359360
*choicb WSCALCMODECH {
360361
PRERUN "PreRun"
361362
SIM "Simulate"
@@ -739,6 +740,17 @@ PIPESEGP -- "class PIPESEG*" 4 none
739740
TDVPEAKSAVE "TDVPeakSave"
740741
}
741742

743+
*choicn DHWDRSIG {
744+
ON "On"
745+
TOO "TOO"
746+
TXO "TXO"
747+
TOT "TOT"
748+
TXT "TXT"
749+
LOC "LOC"
750+
LOR "LOR"
751+
LOX "LOX"
752+
COUNT "*Count" // hidden
753+
}
742754

743755
/**********************************************************************************************************************
744756
** === CHOICN types: can hold these choices (as NAN), or float number

src/CNFIELDS.DEF

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,9 @@ RSYSMODECTRLCH RSYSMODECTRLCH LMNONE UNNONE
169169
RSYSTYCH RSYSTYCH LMNONE UNNONE
170170
RSYSOAVTYCH RSYSOAVTYCH LMNONE UNNONE
171171
RSYSDEFROSTMODELCH RSYSDEFROSTMODELCH LMNONE UNNONE
172+
WHTYPECH WHTYPECH LMNONE UNNONE
172173
WHHEATSRCCH WHHEATSRCCH LMNONE UNNONE
173174
WSCALCMODECH WSCALCMODECH LMNONE UNNONE
174-
WHTYPECH WHTYPECH LMNONE UNNONE
175175
WHASHPTYCH WHASHPTYCH LMNONE UNNONE
176176
DHWEUCH DHWEUCH LMNONE UNNONE
177177
DHWEUXCH DHWEUXCH LMNONE UNNONE
@@ -222,6 +222,7 @@ NOYESVC NOYESVC LMNONE UNNONE
222222
OFFAVAILONVC OFFAVAILONVC LMNONE UNNONE
223223
VENTAVAILVC VENTAVAILVC LMNONE UNNONE
224224
BATCTRLALGVC BATCTRLALGVC LMNONE UNNONE
225+
DHWDRSIG DHWDRSIG LMNONE UNNONE
225226

226227
// number/choice (NC choicn) types
227228
TEMP_TSCM TSCMNC LMNONE UNTEMP

src/CNRECS.DEF

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3663,7 +3663,10 @@ RECORD DHWSYS "DHWSys" *RAT // input / runtime DHW system
36633663
// default = ws_tUse
36643664
*r DHWDRMETH ws_drMethod // DHW demand response control method
36653665
// C_DHWDRMETH_NONE, C_DHWDRMETH_SCHED,
3666-
*h LI ws_drSignal; // DHW demand response control signal
3666+
*h DHWDRSIG ws_drSignal; // DHW demand response control signal
3667+
*h *e INT ws_drModeHPWH; // DHW demand response HPWHsim base mode for hour
3668+
// may be modified at subhour or tick ivl
3669+
36673670
*s *hide DBL ws_tOutPrimSum; // working var re ws_tOutPrimLT
36683671
*s *e FLOAT ws_tOutPrimLT; // primary water heater outlet temp, F
36693672
// for HPWH only, re DHWLOOPHEATER entering temp
@@ -3918,6 +3921,7 @@ RECORD DHWHEATER "DHWHeater" *RAT // input / runtime DHW heater
39183921
*declare "int wh_ReportBalErrorsIf() const;"
39193922
*declare "virtual void ReceiveRuntimeMessage( const char* msg);"
39203923
*declare "RC wh_HPWHInit();"
3924+
*declare "static int wh_MapDRSigToDRModeHPWH( DHWDRSIG drSig);"
39213925

39223926
*r FLOAT_GEZ wh_mult; // count of identical water heaters (default 1)
39233927
// models as if repeated identical input

src/DHWCalc.cpp

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,17 @@ RC DHWSYS::ws_DoHour( // hourly calcs
12021202
}
12031203
#endif
12041204

1205+
// Demand response (DR) hourly setup
1206+
ws_drModeHPWH = HPWH::DR_ALLOW;
1207+
if (!ws_HasCentralDHWSYS())
1208+
{ int drSig = CHN(ws_drSignal); // decode variable choice
1209+
ws_drModeHPWH = ws_drMethod == C_DHWDRMETH_SCHED
1210+
? DHWHEATER::wh_MapDRSigToDRModeHPWH( drSig)
1211+
: HPWH::DR_ALLOW;
1212+
}
1213+
else
1214+
ws_drModeHPWH = HPWH::DR_ALLOW; // no DR for child DHWSYSs (no DHWHEATERs)
1215+
12051216
if (ws_wpCount > 0) // if any child pumps
12061217
{ DHWPUMP* pWP;
12071218
RLUPC(WpR, pWP, pWP->ownTi == ss)
@@ -1216,6 +1227,7 @@ RC DHWSYS::ws_DoHour( // hourly calcs
12161227
if (ws_wlhCount > 0) RLUPC(WlhR, pWH, pWH->ownTi == ss)
12171228
rc |= pWH->wh_DoHour();
12181229
}
1230+
12191231
// DHWSYS energy use
12201232
ws_inElec += ws_parElec * BtuperWh; // parasitics for e.g. circulation pumping
12211233
// associated heat gain is ignored
@@ -2921,6 +2933,7 @@ RC HPWHLINK::hw_DoSubhrTick( // calcs for 1 tick
29212933
"vLoss", drawLoss, UNLVOLUME2, 5,
29222934
"vRL", drawRL, UNLVOLUME2, 5,
29232935
"vTot", drawForTick, UNLVOLUME2, 5,
2936+
"DR", double(drMode), UNNONE, 1,
29242937
"tMains", tMains > 0. ? tMains : CSVItem::ci_UNSET,
29252938
UNTEMP, 5,
29262939
"tDWHR", tk.wtk_tInletX, UNTEMP, 5,
@@ -3578,10 +3591,55 @@ RC DHWHEATER::wh_HPWHInit() // initialize HPWH model
35783591
pWS->ignore(fn,
35793592
strtprintf("-- HPWH '%s' has a fixed setpoint.", name));
35803593
}
3594+
wh_MapDRSigToDRModeHPWH(-1); // validate DRMODE mapping
35813595
}
35823596
return rc;
35833597
} // DHWHEATER::wh_HPWHInit
35843598
//-----------------------------------------------------------------------------
3599+
/* static*/ int DHWHEATER::wh_MapDRSigToDRModeHPWH(
3600+
DHWDRSIG drSig) // CSE DR choice value
3601+
// -1: validate table
3602+
// returns HPWH-compatible DRMODES value corresponding to CSE choice
3603+
{
3604+
struct DRMAP
3605+
{ int drSig;
3606+
int drModeHPWH;
3607+
};
3608+
static const DRMAP drMap[] =
3609+
{ C_DHWDRSIG_ON, HPWH::DR_ALLOW,
3610+
C_DHWDRSIG_TOO, HPWH::DR_TOO,
3611+
C_DHWDRSIG_TXO, HPWH::DR_TOO | HPWH::DR_LOR,
3612+
C_DHWDRSIG_TOT, HPWH::DR_TOT,
3613+
C_DHWDRSIG_TXT, HPWH::DR_TOT | HPWH::DR_LOR,
3614+
C_DHWDRSIG_LOC, HPWH::DR_LOC,
3615+
C_DHWDRSIG_LOR, HPWH::DR_LOR,
3616+
C_DHWDRSIG_LOX, HPWH::DR_LOR | HPWH::DR_LOC,
3617+
-1, -1
3618+
};
3619+
3620+
if (drSig < 0)
3621+
{ // validate table
3622+
// correct table allows access by idx, avoids search
3623+
bool bMunge = false;
3624+
int ix;
3625+
for (ix = 0; !bMunge && drMap[ix].drSig >= 0; ix++)
3626+
{ if (drMap[ix].drSig != ix + C_DHWDRSIG_ON)
3627+
bMunge = true;
3628+
}
3629+
if (bMunge || ix != C_DHWDRSIG_COUNT - C_DHWDRSIG_ON)
3630+
// table out of order or wrong # of entries
3631+
errCrit(PABT, "DHWHEATER::wh_MapDRSigToDRModeHPWH() validation failure.");
3632+
return 0;
3633+
}
3634+
3635+
int ixDrSig = drSig - C_DHWDRSIG_ON; // choice values assigned sequencially
3636+
3637+
int drMode = drMap[ixDrSig].drModeHPWH;
3638+
3639+
return drMode;
3640+
3641+
} // DHWHEATER::wh_MapDRSigToDRModeHPWH
3642+
//-----------------------------------------------------------------------------
35853643
RC DHWHEATER::wh_DoSubhrStart()
35863644
{
35873645
RC rc = RCOK;
@@ -3648,10 +3706,7 @@ RC DHWHEATER::wh_DoSubhrTick( // DHWHEATER energy use for 1 tick
36483706
: pWS->ws_pDHWSOLARSYS ? pWS->ws_pDHWSOLARSYS->sw_GetAvailableTemp()
36493707
: tk.wtk_tInletX;
36503708

3651-
int drMode = 0;
3652-
if (pWS->ws_drMethod == C_DHWDRMETH_SCHED)
3653-
{ drMode = pWS->ws_drSignal;
3654-
}
3709+
36553710

36563711
#if 0 && defined( _DEBUG)
36573712
if (tInletWH > pWS->ws_tUse)
@@ -3665,7 +3720,18 @@ RC DHWHEATER::wh_DoSubhrTick( // DHWHEATER energy use for 1 tick
36653720
double drawForTick = 0.;
36663721

36673722
if (wh_IsHPWHModel())
3668-
{
3723+
{ // demand response (DR)
3724+
// use DHWSYS hourly base value
3725+
// turn off hour-start one-shot signals if not hour start
3726+
int drMode;
3727+
if (whfcn == whfcnPRIMARY)
3728+
{ drMode = pWS->ws_drModeHPWH;
3729+
if (tk.wtk_startMin > 0.f)
3730+
drMode &= ~(HPWH::DR_TOO | HPWH::DR_TOT);
3731+
}
3732+
else
3733+
drMode = HPWH::DR_ALLOW;
3734+
36693735
rc |= wh_HPWH.hw_DoSubhrTick(tk, tInletWH, scaleWH, tMix, pWS->ws_tInlet,
36703736
&tOutNoMix, drMode);
36713737

0 commit comments

Comments
 (0)