@@ -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+ // -----------------------------------------------------------------------------
35853643RC 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