00001
00052 #include <stdlib.h>
00053 #include <stdio.h>
00054 #include <errno.h>
00055 #include <math.h>
00056
00057 #include "refrigerator.h"
00058
00060
00062 CLASS* refrigerator::oclass = NULL;
00063 CLASS *refrigerator::pclass = NULL;
00064
00065 refrigerator::refrigerator(MODULE *module) : residential_enduse(module)
00066 {
00067
00068 if (oclass == NULL)
00069 {
00070 pclass = residential_enduse::oclass;
00071
00072
00073 oclass = gl_register_class(module,"refrigerator",sizeof(refrigerator),PC_PRETOPDOWN | PC_BOTTOMUP|PC_AUTOLOCK);
00074 if (oclass==NULL)
00075 GL_THROW("unable to register object class implemented by %s",__FILE__);
00076
00077
00078
00079
00080
00081
00082 if (gl_publish_variable(oclass,
00083 PT_INHERIT, "residential_enduse",
00084 PT_double, "size[cf]", PADDR(size),PT_DESCRIPTION,"volume of the refrigerator",
00085 PT_double, "rated_capacity[Btu/h]", PADDR(rated_capacity),
00086 PT_double,"temperature[degF]",PADDR(Tair),
00087 PT_double,"setpoint[degF]",PADDR(Tset),
00088 PT_double,"deadband[degF]",PADDR(thermostat_deadband),
00089 PT_double,"cycle_time[s]",PADDR(cycle_time),
00090 PT_double,"output",PADDR(Qr),
00091 PT_double,"event_temp",PADDR(Tevent),
00092 PT_double,"UA[Btu/degF*h]",PADDR(UA),
00093 PT_double,"compressor_off_normal_energy",PADDR(compressor_off_normal_energy),
00094 PT_double,"compressor_off_normal_power[W]",PADDR(compressor_off_normal_power),
00095 PT_double,"compressor_on_normal_energy",PADDR(compressor_on_normal_energy),
00096 PT_double,"compressor_on_normal_power[W]",PADDR(compressor_on_normal_power),
00097 PT_double,"defrost_energy",PADDR(defrost_energy),
00098 PT_double,"defrost_power[W]",PADDR(defrost_power),
00099 PT_double,"icemaking_energy",PADDR(icemaking_energy),
00100 PT_double,"icemaking_power[W]",PADDR(icemaking_power),
00101 PT_double,"ice_making_probability",PADDR(ice_making_probability),
00102 PT_int32,"FF_Door_Openings",PADDR(FF_Door_Openings),
00103 PT_int32,"door_opening_energy",PADDR(door_opening_energy),
00104 PT_int32,"door_opening_power",PADDR(door_opening_power),
00105 PT_double,"DO_Thershold",PADDR(DO_Thershold),
00106 PT_double,"dr_mode_double",PADDR(dr_mode_double),
00107 PT_double,"energy_needed",PADDR(energy_needed),
00108 PT_double,"energy_used",PADDR(energy_used),
00109 PT_double,"refrigerator_power",PADDR(refrigerator_power),
00110 PT_bool,"icemaker_running",PADDR(icemaker_running),
00111 PT_int32,"check_DO",PADDR(check_DO),
00112 PT_bool,"is_240",PADDR(is_240),
00113 PT_double,"defrostDelayed",PADDR(defrostDelayed),
00114 PT_bool,"long_compressor_cycle_due",PADDR(long_compressor_cycle_due),
00115 PT_double,"long_compressor_cycle_time",PADDR(long_compressor_cycle_time),
00116 PT_double,"long_compressor_cycle_power",PADDR(long_compressor_cycle_power),
00117 PT_double,"long_compressor_cycle_energy",PADDR(long_compressor_cycle_energy),
00118 PT_double,"long_compressor_cycle_threshold",PADDR(long_compressor_cycle_threshold),
00119 PT_enumeration,"defrost_criterion",PADDR(defrost_criterion),
00120 PT_KEYWORD,"TIMED",(enumeration)DC_TIMED,
00121 PT_KEYWORD,"DOOR_OPENINGS",(enumeration)DC_DOOR_OPENINGS,
00122 PT_KEYWORD,"COMPRESSOR_TIME",(enumeration)DC_COMPRESSOR_TIME,
00123 PT_bool,"run_defrost",PADDR(run_defrost),
00124 PT_double,"door_opening_criterion",PADDR(door_opening_criterion),
00125 PT_double,"compressor_defrost_time",PADDR(compressor_defrost_time),
00126 PT_double,"delay_defrost_time",PADDR(delay_defrost_time),
00127 PT_int32,"daily_door_opening",PADDR(daily_door_opening),
00128 PT_enumeration,"state",PADDR(state),
00129 PT_KEYWORD,"DEFROST",(enumeration)RS_DEFROST,
00130 PT_KEYWORD,"COMPRESSSOR_OFF_NORMAL",(enumeration)RS_COMPRESSSOR_OFF_NORMAL,
00131 PT_KEYWORD,"COMPRESSSOR_ON_LONG",(enumeration)RS_COMPRESSSOR_ON_LONG,
00132 PT_KEYWORD,"COMPRESSSOR_ON_NORMAL",(enumeration)RS_COMPRESSSOR_ON_NORMAL,
00133 NULL) < 1)
00134 GL_THROW("unable to publish properties in %s", __FILE__);
00135 }
00136 }
00137
00138 int refrigerator::create()
00139 {
00140 int res = residential_enduse::create();
00141
00142
00143 load.name = oclass->name;
00144
00145 load.power = load.admittance = load.current = load.total = complex(0,0,J);
00146 load.voltage_factor = 1.0;
00147 load.power_factor = 0.95;
00148 load.power_fraction = 1;
00149 is_240 = true;
00150
00151 gl_warning("explicit %s model is experimental", OBJECTHDR(this)->oclass->name);
00152
00153
00154
00155
00156
00157 return res;
00158 }
00159
00160 int refrigerator::init(OBJECT *parent)
00161 {
00162
00163 if(parent != NULL){
00164 if((parent->flags & OF_INIT) != OF_INIT){
00165 char objname[256];
00166 gl_verbose("refrigerator::init(): deferring initialization on %s", gl_name(parent, objname, 255));
00167 return 2;
00168 }
00169 }
00170 OBJECT *hdr = OBJECTHDR(this);
00171 hdr->flags |= OF_SKIPSAFE;
00172
00173
00174 if (size==0) size = gl_random_uniform(&hdr->rng_state,20,40);
00175 if (thermostat_deadband==0) thermostat_deadband = gl_random_uniform(&hdr->rng_state,2,3);
00176 if (Tset==0) Tset = gl_random_uniform(&hdr->rng_state,35,39);
00177 if (UA == 0) UA = 0.6;
00178 if (UAr==0) UAr = UA+size/40*gl_random_uniform(&hdr->rng_state,0.9,1.1);
00179 if (UAf==0) UAf = gl_random_uniform(&hdr->rng_state,0.9,1.1);
00180 if (COPcoef==0) COPcoef = gl_random_uniform(&hdr->rng_state,0.9,1.1);
00181 if (Tout==0) Tout = 59.0;
00182 if (load.power_factor==0) load.power_factor = 0.95;
00183
00184 pTout = (double*)gl_get_addr(parent, "air_temperature");
00185 if (pTout==NULL)
00186 {
00187 static double default_air_temperature = 72;
00188 gl_warning("%s (%s:%d) parent object lacks air temperature, using %0f degF instead", hdr->name, hdr->oclass->name, hdr->id, default_air_temperature);
00189 pTout = &default_air_temperature;
00190 }
00191
00192
00193 Tair = gl_random_uniform(&hdr->rng_state,Tset-thermostat_deadband/2, Tset+thermostat_deadband/2);
00194
00195
00196 Cf = size/10.0 * RHOWATER * CWATER;
00197
00198 rated_capacity = BTUPHPW * size*10;
00199
00200 start_time = 0;
00201
00202 if(compressor_off_normal_energy==0) compressor_off_normal_energy=15*45*60;
00203 if(compressor_off_normal_power==0) compressor_off_normal_power=15;
00204
00205 if(long_compressor_cycle_energy==0) long_compressor_cycle_energy=120*100*60;
00206 if(long_compressor_cycle_power==0) long_compressor_cycle_power=120;
00207
00208 if(compressor_on_normal_energy==0) compressor_on_normal_energy=120*35*60;
00209 if(compressor_on_normal_power==0) compressor_on_normal_power=120;
00210
00211 if(defrost_energy==0) defrost_energy=40*550*60;
00212 if(defrost_power==0) defrost_power=550;
00213
00214 if(icemaking_energy==0) icemaking_energy=300*60;
00215 if(icemaking_power==0) icemaking_power=300;
00216
00217 if(ice_making_probability==0) ice_making_probability=0.02;
00218
00219 if(DO_Thershold==0) DO_Thershold=24;
00220 if(long_compressor_cycle_threshold==0) long_compressor_cycle_threshold=0.05;
00221
00222 if(FF_Door_Openings==0) FF_Door_Openings=0;
00223
00224 if(door_opening_power==0) door_opening_power=16;
00225
00226 if(delay_defrost_time==0) delay_defrost_time=28800;
00227
00228 if(defrost_criterion==0) defrost_criterion=DC_TIMED;
00229
00230 refrigerator_power = 0;
00231
00232 return_time = 0;
00233
00234 no_of_defrost = 0;
00235
00236 total_compressor_time = 0;
00237
00238 if(door_open_time==0) door_open_time=7;
00239
00240 long_compressor_cycle_due=false;
00241 door_energy_calc = false;
00242
00243 ice_making_time = new double[1,2,3];
00244
00245 icemaker_running = false;
00246 check_defrost = false;
00247
00248 switch(state){
00249 case RS_DEFROST:
00250 if(energy_needed==0) energy_needed = defrost_energy;
00251 cycle_time = ceil((energy_needed - energy_used)/defrost_power);
00252 break;
00253 case RS_COMPRESSSOR_OFF_NORMAL:
00254 if(energy_needed==0) energy_needed = compressor_off_normal_energy;
00255 cycle_time = ceil((energy_needed - energy_used)/compressor_off_normal_power);
00256 break;
00257 case RS_COMPRESSSOR_ON_NORMAL:
00258 if(energy_needed==0) energy_needed = compressor_on_normal_energy;
00259 cycle_time = ceil((energy_needed - energy_used)/compressor_on_normal_power);
00260 break;
00261 }
00262
00263 run_defrost = false;
00264
00265 if (is_240)
00266 {
00267 load.config = EUC_IS220;
00268 }
00269
00270 load.total = Qr * KWPBTUPH;
00271
00272 return residential_enduse::init(parent);
00273 }
00274
00275 int refrigerator::isa(char *classname)
00276 {
00277 return (strcmp(classname,"refrigerator")==0 || residential_enduse::isa(classname));
00278 }
00279
00280 TIMESTAMP refrigerator::presync(TIMESTAMP t0, TIMESTAMP t1){
00281
00282 OBJECT *hdr = OBJECTHDR(this);
00283
00284 if(start_time==0)
00285 {
00286 start_time = int32(t0);
00287 DO_random_opening = int32(gl_random_uniform(&hdr->rng_state,0,1800));
00288 }
00289
00290 return TS_NEVER;
00291 }
00292
00293
00294
00295
00296 void refrigerator::thermostat(TIMESTAMP t0, TIMESTAMP t1){
00297
00298 }
00299
00300 TIMESTAMP refrigerator::sync(TIMESTAMP t0, TIMESTAMP t1)
00301 {
00302 double dt0 = gl_toseconds(t0>0?t1-t0:0);
00303
00304
00305 if (t0>TS_ZERO && t1>t0)
00306 {
00307
00308 load.energy += load.total * dt0/3600.0;
00309
00310 }
00311
00312 double dt1 = update_refrigerator_state(dt0, t1);
00313
00314 return dt1>0?-(TIMESTAMP)(dt1*TS_SECOND+t1):TS_NEVER;
00315
00316 }
00317
00318 TIMESTAMP refrigerator::postsync(TIMESTAMP t0, TIMESTAMP t1){
00319
00320 return TS_NEVER;
00321
00322 }
00323
00324 double refrigerator::update_refrigerator_state(double dt0,TIMESTAMP t1)
00325 {
00326 OBJECT *hdr = OBJECTHDR(this);
00327
00328
00329 energy_used += refrigerator_power*dt0;
00330
00331 if(cycle_time>0)
00332 {
00333 cycle_time -= dt0;
00334 }
00335
00336 if(defrostDelayed>0)
00337 {
00338 defrostDelayed -= dt0;
00339 }
00340
00341 if(defrostDelayed<=0){
00342 if(DC_TIMED==defrost_criterion){
00343 run_defrost = true;
00344 }
00345 else if(DC_COMPRESSOR_TIME==defrost_criterion && total_compressor_time>=compressor_defrost_time){
00346
00347 run_defrost = true;
00348 total_compressor_time = 0;
00349 check_defrost = false;
00350
00351 }
00352 else if(no_of_defrost>0 && DC_DOOR_OPENINGS==defrost_criterion){
00353
00354 run_defrost = true;
00355 FF_Door_Openings = 0;
00356 check_defrost = false;
00357 }
00358 }
00359 else{
00360 if(DC_TIMED==defrost_criterion){
00361 check_defrost = true;
00362 }
00363 else if(DC_COMPRESSOR_TIME==defrost_criterion && total_compressor_time>=compressor_defrost_time){
00364 check_defrost = true;
00365
00366 }
00367 else if(no_of_defrost>0 && DC_DOOR_OPENINGS==defrost_criterion){
00368 check_defrost = true;
00369 }
00370 }
00371
00372
00373 if(long_compressor_cycle_time>0)
00374 {
00375 long_compressor_cycle_time -= dt0;
00376 }
00377
00378 if (dr_mode_double == 0)
00379 dr_mode = DM_UNKNOWN;
00380 else if (dr_mode_double == 1)
00381 dr_mode = DM_LOW;
00382 else if (dr_mode_double == 2)
00383 dr_mode = DM_NORMAL;
00384 else if (dr_mode_double == 3)
00385 dr_mode = DM_HIGH;
00386 else if (dr_mode_double == 4)
00387 dr_mode = DM_CRITICAL;
00388 else
00389 dr_mode = DM_UNKNOWN;
00390
00391 if(door_return_time > 0){
00392 door_return_time = door_return_time - dt0;
00393 }
00394
00395 if(door_next_open_time > 0){
00396 door_next_open_time = door_next_open_time - dt0;
00397 }
00398
00399 if(door_return_time<=0 && true==door_open){
00400 door_return_time = 0;
00401 door_open = false;
00402 }
00403
00404 if(door_next_open_time<=0 && hourly_door_opening>0){
00405 door_next_open_time = 0;
00406 door_open = true;
00407 FF_Door_Openings++;
00408 door_return_time += ceil(gl_random_uniform(&hdr->rng_state,0, door_open_time));
00409 door_energy_calc = true;
00410 hourly_door_opening--;
00411
00412 if(hourly_door_opening > 0){
00413 door_next_open_time = int(gl_random_uniform(&hdr->rng_state,0,(3600-(t1-start_time)%3600)));
00414 door_to_open = true;
00415 }
00416 else{
00417 door_to_open = false;
00418 }
00419
00420 check_DO = FF_Door_Openings%DO_Thershold;
00421
00422 if(check_DO==0){
00423 no_of_defrost++;
00424
00425 }
00426 }
00427
00428
00429 if(((t1-start_time)%3600)==0 && start_time>0)
00430 {
00431 double temp_hourly_door_opening = (door_opening_criterion*daily_door_opening) - floor(door_opening_criterion*daily_door_opening);
00432 if(temp_hourly_door_opening >= 0.5){
00433 hourly_door_opening = ceil(door_opening_criterion*daily_door_opening);
00434 }
00435 else{
00436 hourly_door_opening = floor(door_opening_criterion*daily_door_opening);
00437 }
00438
00439 hourly_door_opening = floor(gl_random_normal(&hdr->rng_state,hourly_door_opening, ((hourly_door_opening)/3)));
00440
00441
00442 if(hourly_door_opening<0){
00443 hourly_door_opening = 0;
00444 }
00445 else if(hourly_door_opening>2*hourly_door_opening){
00446 hourly_door_opening = 2*hourly_door_opening;
00447 }
00448
00449 if(hourly_door_opening > long_compressor_cycle_threshold*daily_door_opening)
00450 {
00451 long_compressor_cycle_due = true;
00452 long_compressor_cycle_time = int(gl_random_uniform(&hdr->rng_state,0,(3600)));
00453 }
00454
00455 if(hourly_door_opening>0){
00456 door_to_open = true;
00457 door_next_open_time = int(gl_random_uniform(&hdr->rng_state,0,(3600)));
00458 }
00459 else{
00460 door_to_open = false;
00461 }
00462 }
00463
00464 double dt1 = 0;
00465
00466 switch(state){
00467
00468 case RS_DEFROST:
00469
00470 if ((energy_used >= energy_needed || cycle_time <= 0))
00471 {
00472 state = RS_COMPRESSSOR_ON_LONG;
00473 refrigerator_power = long_compressor_cycle_power;
00474 energy_needed = long_compressor_cycle_energy;
00475 energy_used = 0;
00476
00477 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00478 }
00479 else
00480 {
00481 refrigerator_power = defrost_power;
00482 }
00483
00484 break;
00485
00486 case RS_COMPRESSSOR_ON_NORMAL:
00487
00488 if(run_defrost==true)
00489 {
00490 state = RS_DEFROST;
00491 refrigerator_power = defrost_power;
00492 energy_needed = defrost_energy;
00493 energy_used = 0;
00494
00495 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00496
00497 run_defrost=false;
00498 no_of_defrost--;
00499
00500 defrostDelayed = delay_defrost_time;
00501
00502 }
00503 else if ((energy_used >= energy_needed || cycle_time <= 0))
00504 {
00505 state = RS_COMPRESSSOR_OFF_NORMAL;
00506 refrigerator_power = compressor_off_normal_power;
00507 energy_needed = compressor_off_normal_energy;
00508
00509 energy_used = 0;
00510 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00511
00512 }
00513 else
00514 {
00515 refrigerator_power = compressor_on_normal_power;
00516 total_compressor_time += dt0;
00517 if(door_energy_calc==true){
00518 door_energy_calc = false;
00519
00520 energy_needed += door_return_time*refrigerator_power;
00521 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00522
00523 }
00524 }
00525
00526 break;
00527
00528 case RS_COMPRESSSOR_ON_LONG:
00529
00530 if(run_defrost==true)
00531 {
00532 state = RS_DEFROST;
00533 refrigerator_power = defrost_power;
00534 energy_needed = defrost_energy;
00535 energy_used = 0;
00536
00537 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00538
00539 run_defrost=false;
00540 no_of_defrost--;
00541
00542 defrostDelayed = delay_defrost_time;
00543
00544 }
00545 else if ((energy_used >= energy_needed || cycle_time <= 0))
00546 {
00547 state = RS_COMPRESSSOR_OFF_NORMAL;
00548 refrigerator_power = compressor_off_normal_power;
00549 energy_needed = compressor_off_normal_energy;
00550
00551 energy_used = 0;
00552 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00553
00554 }
00555 else
00556 {
00557 refrigerator_power = long_compressor_cycle_power;
00558 if(door_energy_calc==true){
00559 door_energy_calc = false;
00560
00561 energy_needed += door_return_time*refrigerator_power;
00562 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00563
00564 }
00565 }
00566
00567 break;
00568
00569 case RS_COMPRESSSOR_OFF_NORMAL:
00570
00571 if(run_defrost==true)
00572 {
00573 state = RS_DEFROST;
00574 refrigerator_power = defrost_power;
00575 energy_needed = defrost_energy;
00576 energy_used = 0;
00577
00578 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00579
00580 run_defrost=false;
00581 no_of_defrost--;
00582
00583 defrostDelayed = delay_defrost_time;
00584
00585 }
00586 else if ((energy_used >= energy_needed || cycle_time <= 0))
00587 {
00588 if(long_compressor_cycle_due==true && long_compressor_cycle_time<=0)
00589 {
00590 state = RS_COMPRESSSOR_ON_LONG;
00591 refrigerator_power = long_compressor_cycle_power;
00592 energy_needed = long_compressor_cycle_energy;
00593
00594 long_compressor_cycle_due=false;
00595
00596 energy_used = 0;
00597 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00598 }
00599 else{
00600
00601 state = RS_COMPRESSSOR_ON_NORMAL;
00602 refrigerator_power = compressor_on_normal_power;
00603 energy_needed = compressor_on_normal_energy;
00604
00605 energy_used = 0;
00606 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00607 }
00608 }
00609 else
00610 {
00611 refrigerator_power = compressor_off_normal_power;
00612
00613 if(door_energy_calc==true){
00614 door_energy_calc = false;
00615
00616 energy_needed -= door_return_time*compressor_off_normal_power;
00617 cycle_time = ceil((energy_needed - energy_used)/refrigerator_power);
00618
00619 if(cycle_time<0)
00620 cycle_time = 0;
00621 }
00622 }
00623
00624 break;
00625
00626 }
00627
00628 double posted_power = refrigerator_power;
00629
00630
00631 if(door_open==true)
00632 {
00633 posted_power += door_opening_power;
00634 }
00635
00636
00637 if(check_icemaking == true)
00638 {
00639 posted_power += icemaking_power;
00640 icemaker_running = true;
00641
00642 return_time = 60-dt0;
00643
00644 if(0==((t1-start_time)%60) || return_time<=0){
00645
00646 ice_making_no--;
00647
00648 if(ice_making_no == 0)
00649 {
00650 check_icemaking = false;
00651 }
00652
00653 return_time = 60;
00654 }
00655
00656 }
00657 else
00658 {
00659 if(((t1-start_time)%60)==0)
00660 {
00661 ice_making = double(gl_random_uniform(&hdr->rng_state,0,1));
00662
00663 if(ice_making <=ice_making_probability)
00664 {
00665 check_icemaking = true;
00666
00667 icemaker_running = true;
00668
00669
00670
00671 ice_making_no = 1;
00672
00673 posted_power += icemaking_power;
00674 return_time = 60;
00675 ice_making_no--;
00676
00677 if(ice_making_no == 0)
00678 {
00679 check_icemaking = false;
00680 }
00681 }
00682 else
00683 {
00684 icemaker_running = false;
00685 return_time = 60;
00686 }
00687 }
00688 else
00689 {
00690 icemaker_running = false;
00691
00692 }
00693 }
00694
00695 load.power.SetPowerFactor(posted_power/1000, load.power_factor);
00696 load.admittance = complex(0,0,J);
00697 load.current = complex(0,0,J);
00698
00699 if(true==door_open && true==door_to_open)
00700 {
00701 door_time = door_return_time<door_next_open_time?door_return_time:door_next_open_time;
00702 }
00703 else if(true==door_to_open)
00704 {
00705 door_time = door_next_open_time;
00706 }
00707 else if(true==door_open){
00708
00709 door_time = door_return_time;
00710
00711 }
00712 else if(start_time>0)
00713 {
00714 door_time = (3600 - ((t1-start_time)%3600));
00715 }
00716
00717 if(0.0==return_time)
00718 {
00719 dt1 = cycle_time>door_time?door_time:cycle_time;
00720 }
00721 else
00722 {
00723 if(cycle_time>return_time)
00724 if(return_time>door_time)
00725 if(door_time>long_compressor_cycle_time)
00726 dt1 = long_compressor_cycle_time;
00727 else
00728 dt1 = door_time;
00729 else
00730 if(return_time>long_compressor_cycle_time)
00731 dt1 = long_compressor_cycle_time;
00732 else
00733 dt1 = return_time;
00734 else
00735 if(cycle_time>door_time)
00736 if(door_time>long_compressor_cycle_time)
00737 dt1 = long_compressor_cycle_time;
00738 else
00739 dt1 = door_time;
00740 else
00741 if(cycle_time>long_compressor_cycle_time)
00742 dt1 = long_compressor_cycle_time;
00743 else
00744 dt1 = cycle_time;
00745 }
00746 if(check_defrost == true){
00747 if(dt1 > defrostDelayed){
00748 dt1 = defrostDelayed;
00749 }
00750 }
00751
00752
00753 load.total = load.power + load.current + load.admittance;
00754 total_power = (load.power.Re() + (load.current.Re() + load.admittance.Re()*load.voltage_factor)*load.voltage_factor);
00755
00756 last_dr_mode = dr_mode;
00757
00758 if ((dt1 > 0) && (dt1 < 1)){
00759 dt1 = 1;
00760 }
00761
00762 return dt1;
00763
00764 }
00765
00766
00768
00770 EXPORT int create_refrigerator(OBJECT **obj, OBJECT *parent)
00771 {
00772
00773 *obj = gl_create_object(refrigerator::oclass);
00774 if (*obj!=NULL)
00775 {
00776 refrigerator *my = OBJECTDATA(*obj,refrigerator);;
00777 gl_set_parent(*obj,parent);
00778 my->create();
00779 return 1;
00780 }
00781 return 0;
00782 }
00783
00784 EXPORT TIMESTAMP sync_refrigerator(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass, TIMESTAMP t1)
00785 {
00786 refrigerator *my = OBJECTDATA(obj,refrigerator);
00787 TIMESTAMP next_time = TS_NEVER;
00788
00789
00790
00791 try {
00792 switch (pass)
00793 {
00794 case PC_PRETOPDOWN:
00795 t1 = my->presync(obj->clock, t0);
00796 break;
00797
00798 case PC_BOTTOMUP:
00799 t1 = my->sync(obj->clock, t0);
00800 obj->clock = t0;
00801 break;
00802
00803 case PC_POSTTOPDOWN:
00804 t1 = my->postsync(obj->clock, t0);
00805 break;
00806
00807 default:
00808 gl_error("refrigerator::sync- invalid pass configuration");
00809 t1 = TS_INVALID;
00810 }
00811 }
00812 catch (char *msg)
00813 {
00814 gl_error("refrigerator::sync exception caught: %s", msg);
00815 t1 = TS_INVALID;
00816 }
00817 catch (...)
00818 {
00819 gl_error("refrigerator::sync exception caught: no info");
00820 t1 = TS_INVALID;
00821 }
00822
00823 return t1;
00824
00825
00826 }
00827
00828 EXPORT int init_refrigerator(OBJECT *obj)
00829 {
00830 refrigerator *my = OBJECTDATA(obj,refrigerator);
00831 return my->init(obj->parent);
00832 }
00833
00834 EXPORT int isa_refrigerator(OBJECT *obj, char *classname)
00835 {
00836 if(obj != 0 && classname != 0){
00837 return OBJECTDATA(obj,refrigerator)->isa(classname);
00838 } else {
00839 return 0;
00840 }
00841 }
00842
00843
00844 EXPORT TIMESTAMP plc_refrigerator(OBJECT *obj, TIMESTAMP t0)
00845 {
00846
00847
00848 refrigerator *my = OBJECTDATA(obj,refrigerator);
00849 my->thermostat(obj->clock, t0);
00850
00851 return TS_NEVER;
00852 }
00853
00854