00001
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 #include <errno.h>
00024 #include <math.h>
00025
00026 #include "clotheswasher.h"
00027
00029
00031 CLASS* clotheswasher::oclass = NULL;
00032 CLASS* clotheswasher::pclass = NULL;
00033 clotheswasher *clotheswasher::defaults = NULL;
00034
00035 clotheswasher::clotheswasher(MODULE *module) : residential_enduse(module)
00036 {
00037
00038 if (oclass==NULL)
00039 {
00040
00041 oclass = gl_register_class(module,"clotheswasher",sizeof(clotheswasher),PC_PRETOPDOWN|PC_BOTTOMUP|PC_AUTOLOCK);
00042 pclass = residential_enduse::oclass;
00043 if (oclass==NULL)
00044 GL_THROW("unable to register object class implemented by %s",__FILE__);
00045
00046
00047 if (gl_publish_variable(oclass,
00048 PT_INHERIT, "residential_enduse",
00049 PT_double,"motor_power[kW]",PADDR(shape.params.analog.power),
00050 PT_double,"circuit_split",PADDR(circuit_split),
00051 PT_double,"queue[unit]",PADDR(enduse_queue), PT_DESCRIPTION, "the total laundry accumulated",
00052 PT_double,"demand[unit/day]",PADDR(enduse_demand), PT_DESCRIPTION, "the amount of laundry accumulating daily",
00053 PT_complex,"energy_meter[kWh]",PADDR(load.energy),
00054 PT_double,"stall_voltage[V]", PADDR(stall_voltage),
00055 PT_double,"start_voltage[V]", PADDR(start_voltage),
00056 PT_double,"clothesWasherPower",PADDR(clothesWasherPower),
00057 PT_complex,"stall_impedance[Ohm]", PADDR(stall_impedance),
00058 PT_double,"trip_delay[s]", PADDR(trip_delay),
00059 PT_double,"reset_delay[s]", PADDR(reset_delay),
00060 PT_double ,"Is_on",PADDR(Is_on),
00061
00062 PT_double ,"normal_perc",PADDR(normal_perc),
00063 PT_double ,"perm_press_perc",PADDR(perm_press_perc),
00064
00065 PT_double,"NORMAL_PREWASH_POWER",PADDR(NORMAL_PREWASH_POWER),
00066 PT_double,"NORMAL_WASH_POWER",PADDR(NORMAL_WASH_POWER),
00067 PT_double,"NORMAL_SPIN_LOW_POWER",PADDR(NORMAL_SPIN_LOW_POWER),
00068 PT_double,"NORMAL_SPIN_MEDIUM_POWER",PADDR(NORMAL_SPIN_MEDIUM_POWER),
00069 PT_double,"NORMAL_SPIN_HIGH_POWER",PADDR(NORMAL_SPIN_HIGH_POWER),
00070 PT_double,"NORMAL_SMALLWASH_POWER",PADDR(NORMAL_SMALLWASH_POWER),
00071
00072 PT_double,"NORMAL_PREWASH_ENERGY",PADDR(NORMAL_PREWASH_ENERGY),
00073 PT_double,"NORMAL_WASH_ENERGY",PADDR(NORMAL_WASH_ENERGY),
00074 PT_double,"NORMAL_SPIN_LOW_ENERGY",PADDR(NORMAL_SPIN_LOW_ENERGY),
00075 PT_double,"NORMAL_SPIN_MEDIUM_ENERGY",PADDR(NORMAL_SPIN_MEDIUM_ENERGY),
00076 PT_double,"NORMAL_SPIN_HIGH_ENERGY",PADDR(NORMAL_SPIN_HIGH_ENERGY),
00077 PT_double,"NORMAL_SMALLWASH_ENERGY",PADDR(NORMAL_SMALLWASH_ENERGY),
00078
00079 PT_double,"PERMPRESS_PREWASH_POWER",PADDR(PERMPRESS_PREWASH_POWER),
00080 PT_double,"PERMPRESS_WASH_POWER",PADDR(PERMPRESS_WASH_POWER),
00081 PT_double,"PERMPRESS_SPIN_LOW_POWER",PADDR(PERMPRESS_SPIN_LOW_POWER),
00082 PT_double,"PERMPRESS_SPIN_MEDIUM_POWER",PADDR(PERMPRESS_SPIN_MEDIUM_POWER),
00083 PT_double,"PERMPRESS_SPIN_HIGH_POWER",PADDR(PERMPRESS_SPIN_HIGH_POWER),
00084 PT_double,"PERMPRESS_SMALLWASH_POWER",PADDR(PERMPRESS_SMALLWASH_POWER),
00085
00086 PT_double,"PERMPRESS_PREWASH_ENERGY",PADDR(PERMPRESS_PREWASH_ENERGY),
00087 PT_double,"PERMPRESS_WASH_ENERGY",PADDR(PERMPRESS_WASH_ENERGY),
00088 PT_double,"PERMPRESS_SPIN_LOW_ENERGY",PADDR(PERMPRESS_SPIN_LOW_ENERGY),
00089 PT_double,"PERMPRESS_SPIN_MEDIUM_ENERGY",PADDR(PERMPRESS_SPIN_MEDIUM_ENERGY),
00090 PT_double,"PERMPRESS_SPIN_HIGH_ENERGY",PADDR(PERMPRESS_SPIN_HIGH_ENERGY),
00091 PT_double,"PERMPRESS_SMALLWASH_ENERGY",PADDR(PERMPRESS_SMALLWASH_ENERGY),
00092
00093 PT_double,"GENTLE_PREWASH_POWER",PADDR(GENTLE_PREWASH_POWER),
00094 PT_double,"GENTLE_WASH_POWER",PADDR(GENTLE_WASH_POWER),
00095 PT_double,"GENTLE_SPIN_LOW_POWER",PADDR(GENTLE_SPIN_LOW_POWER),
00096 PT_double,"GENTLE_SPIN_MEDIUM_POWER",PADDR(GENTLE_SPIN_MEDIUM_POWER),
00097 PT_double,"GENTLE_SPIN_HIGH_POWER",PADDR(GENTLE_SPIN_HIGH_POWER),
00098 PT_double,"GENTLE_SMALLWASH_POWER",PADDR(GENTLE_SMALLWASH_POWER),
00099
00100 PT_double,"GENTLE_PREWASH_ENERGY",PADDR(GENTLE_PREWASH_ENERGY),
00101 PT_double,"GENTLE_WASH_ENERGY",PADDR(GENTLE_WASH_ENERGY),
00102 PT_double,"GENTLE_SPIN_LOW_ENERGY",PADDR(GENTLE_SPIN_LOW_ENERGY),
00103 PT_double,"GENTLE_SPIN_MEDIUM_ENERGY",PADDR(GENTLE_SPIN_MEDIUM_ENERGY),
00104 PT_double,"GENTLE_SPIN_HIGH_ENERGY",PADDR(GENTLE_SPIN_HIGH_ENERGY),
00105 PT_double,"GENTLE_SMALLWASH_ENERGY",PADDR(GENTLE_SMALLWASH_ENERGY),
00106
00107 PT_double,"queue_min[unit]",PADDR(queue_min),
00108 PT_double,"queue_max[unit]",PADDR(queue_max),
00109
00110 PT_double,"clotheswasher_run_prob",PADDR(clotheswasher_run_prob),
00111
00112
00113 PT_enumeration,"state", PADDR(state),
00114 PT_KEYWORD,"STOPPED",(enumeration)STOPPED,
00115 PT_KEYWORD,"PREWASH",(enumeration)PREWASH,
00116 PT_KEYWORD,"WASH",(enumeration)WASH,
00117 PT_KEYWORD,"SPIN1",(enumeration)SPIN1,
00118 PT_KEYWORD,"SPIN2",(enumeration)SPIN2,
00119 PT_KEYWORD,"SPIN3",(enumeration)SPIN3,
00120 PT_KEYWORD,"SPIN4",(enumeration)SPIN4,
00121
00122 PT_enumeration,"spin_mode", PADDR(spin_mode),
00123 PT_KEYWORD,"SPIN_LOW",(enumeration)SPIN_LOW,
00124 PT_KEYWORD,"SPIN_MEDIUM",(enumeration)SPIN_MEDIUM,
00125 PT_KEYWORD,"SPIN_HIGH",(enumeration)SPIN_HIGH,
00126 PT_KEYWORD,"SPIN_WASH",(enumeration)SPIN_WASH,
00127 PT_KEYWORD,"SMALLWASH",(enumeration)SMALLWASH,
00128
00129 PT_enumeration,"wash_mode", PADDR(wash_mode),
00130 PT_KEYWORD,"NORMAL",(enumeration)NORMAL,
00131 PT_KEYWORD,"PERM_PRESS",(enumeration)PERM_PRESS,
00132 PT_KEYWORD,"GENTLE",(enumeration)GENTLE,
00133
00134 NULL)<1)
00135 GL_THROW("unable to publish properties in %s",__FILE__);
00136 }
00137 }
00138
00139 clotheswasher::~clotheswasher()
00140 {
00141 }
00142
00143 int clotheswasher::create()
00144 {
00145 int res = residential_enduse::create();
00146
00147
00148 load.name = oclass->name;
00149
00150 load.power = load.admittance = load.current = load.total = complex(0,0,J);
00151 load.voltage_factor = 1.0;
00152 load.power_factor = 0.95;
00153 load.power_fraction = 1.0;
00154
00155 gl_warning("explicit %s model is experimental", OBJECTHDR(this)->oclass->name);
00156
00157
00158
00159
00160
00161 return res;
00162 }
00163
00164 int clotheswasher::init(OBJECT *parent)
00165 {
00166 OBJECT *hdr = OBJECTHDR(this);
00167 if(parent != NULL){
00168 if((parent->flags & OF_INIT) != OF_INIT){
00169 char objname[256];
00170 gl_verbose("clotheswasher::init(): deferring initialization on %s", gl_name(parent, objname, 255));
00171 return 2;
00172 }
00173 }
00174 hdr->flags |= OF_SKIPSAFE;
00175
00176
00177 if (shape.params.analog.power==0) shape.params.analog.power = gl_random_uniform(&hdr->rng_state,0.100,0.750);
00178 if (load.heatgain_fraction==0) load.heatgain_fraction = 0.5;
00179 if (load.power_factor==0) load.power_factor = 0.95;
00180
00181 if(shape.params.analog.power < 0.1){
00182 gl_error("clotheswasher motor is undersized, using 500W motor");
00183 shape.params.analog.power = 0.5;
00184 }
00185
00186 int res = residential_enduse::init(parent);
00187
00188 Is_on = 0;
00189
00190 if(NORMAL_PREWASH_ENERGY == 0) NORMAL_PREWASH_ENERGY = 12*20*60;
00191 if(NORMAL_WASH_ENERGY == 0) NORMAL_WASH_ENERGY = 4*40*60;
00192 if(NORMAL_SMALLWASH_ENERGY == 0) NORMAL_SMALLWASH_ENERGY = 2*25*60;
00193 if(NORMAL_SPIN_LOW_ENERGY == 0) NORMAL_SPIN_LOW_ENERGY = 2*60*60;
00194 if(NORMAL_SPIN_MEDIUM_ENERGY == 0) NORMAL_SPIN_MEDIUM_ENERGY = 2*150*60;
00195 if(NORMAL_SPIN_HIGH_ENERGY == 0) NORMAL_SPIN_HIGH_ENERGY = 2*220*60;
00196
00197 if(NORMAL_PREWASH_POWER == 0) NORMAL_PREWASH_POWER = 20;
00198 if(NORMAL_WASH_POWER == 0) NORMAL_WASH_POWER = 40;
00199 if(NORMAL_SMALLWASH_POWER == 0) NORMAL_SMALLWASH_POWER = 25;
00200 if(NORMAL_SPIN_LOW_POWER == 0) NORMAL_SPIN_LOW_POWER = 60;
00201 if(NORMAL_SPIN_MEDIUM_POWER == 0) NORMAL_SPIN_MEDIUM_POWER = 150;
00202 if(NORMAL_SPIN_HIGH_POWER == 0) NORMAL_SPIN_HIGH_POWER = 220;
00203
00204 if(PERMPRESS_PREWASH_ENERGY == 0) PERMPRESS_PREWASH_ENERGY = 12*20*60;
00205 if(PERMPRESS_WASH_ENERGY == 0) PERMPRESS_WASH_ENERGY = 4*40*60;
00206 if(PERMPRESS_SMALLWASH_ENERGY == 0) PERMPRESS_SMALLWASH_ENERGY = 2*25*60;
00207 if(PERMPRESS_SPIN_LOW_ENERGY == 0) PERMPRESS_SPIN_LOW_ENERGY = 2*60*60;
00208 if(PERMPRESS_SPIN_MEDIUM_ENERGY == 0) PERMPRESS_SPIN_MEDIUM_ENERGY = 2*150*60;
00209 if(PERMPRESS_SPIN_HIGH_ENERGY == 0) PERMPRESS_SPIN_HIGH_ENERGY = 2*220*60;
00210
00211 if(PERMPRESS_PREWASH_POWER == 0) PERMPRESS_PREWASH_POWER = 20;
00212 if(PERMPRESS_WASH_POWER == 0) PERMPRESS_WASH_POWER = 40;
00213 if(PERMPRESS_SMALLWASH_POWER == 0) PERMPRESS_SMALLWASH_POWER = 25;
00214 if(PERMPRESS_SPIN_LOW_POWER == 0) PERMPRESS_SPIN_LOW_POWER = 60;
00215 if(PERMPRESS_SPIN_MEDIUM_POWER == 0) PERMPRESS_SPIN_MEDIUM_POWER = 150;
00216 if(PERMPRESS_SPIN_HIGH_POWER == 0) PERMPRESS_SPIN_HIGH_POWER = 220;
00217
00218 if(GENTLE_PREWASH_ENERGY == 0) GENTLE_PREWASH_ENERGY = 12*20*60;
00219 if(GENTLE_WASH_ENERGY == 0) GENTLE_WASH_ENERGY = 4*40*60;
00220 if(GENTLE_SMALLWASH_ENERGY == 0) GENTLE_SMALLWASH_ENERGY = 2*25*60;
00221 if(GENTLE_SPIN_LOW_ENERGY == 0) GENTLE_SPIN_LOW_ENERGY = 2*60*60;
00222 if(GENTLE_SPIN_MEDIUM_ENERGY == 0) GENTLE_SPIN_MEDIUM_ENERGY = 2*150*60;
00223 if(GENTLE_SPIN_HIGH_ENERGY == 0) GENTLE_SPIN_HIGH_ENERGY = 2*220*60;
00224
00225 if(GENTLE_PREWASH_POWER == 0) GENTLE_PREWASH_POWER = 20;
00226 if(GENTLE_WASH_POWER == 0) GENTLE_WASH_POWER = 40;
00227 if(GENTLE_SMALLWASH_POWER == 0) GENTLE_SMALLWASH_POWER = 25;
00228 if(GENTLE_SPIN_LOW_POWER == 0) GENTLE_SPIN_LOW_POWER = 60;
00229 if(GENTLE_SPIN_MEDIUM_POWER == 0) GENTLE_SPIN_MEDIUM_POWER = 150;
00230 if(GENTLE_SPIN_HIGH_POWER == 0) GENTLE_SPIN_HIGH_POWER = 220;
00231
00232 if(normal_perc == 0) normal_perc = 0.5;
00233 if(perm_press_perc == 0) perm_press_perc = 0.8;
00234
00235 return res;
00236 }
00237
00238 int clotheswasher::isa(char *classname)
00239 {
00240 return (strcmp(classname,"clotheswasher")==0 || residential_enduse::isa(classname));
00241 }
00242
00243 TIMESTAMP clotheswasher::presync(TIMESTAMP t0, TIMESTAMP t1){
00244 return TS_NEVER;
00245 }
00246
00247 TIMESTAMP clotheswasher::sync(TIMESTAMP t0, TIMESTAMP t1)
00248 {
00249 complex temp_complex_value;
00250
00251
00252 double dt = 0.0;
00253 TIMESTAMP t2 = residential_enduse::sync(t0, t1);
00254
00255 if (pCircuit!=NULL)
00256 {
00257
00258 temp_complex_value = pCircuit->pV->get_complex();
00259
00260
00261 load.voltage_factor = temp_complex_value.Mag() / default_line_voltage;
00262 }
00263
00264 dt = gl_toseconds(t0>0?t1-t0:0);
00265
00266 if(t0==t1)
00267 {
00268 starttime = true;
00269 }
00270 else{
00271 starttime = false;
00272 }
00273
00274 dt = update_state(dt);
00275
00276 if(dt >= 7200){
00277 return TS_NEVER;
00278 }
00279 else{
00280
00281 if(t2 > (TIMESTAMP)(dt*TS_SECOND+t1))
00282 return dt>0?-(TIMESTAMP)(dt*TS_SECOND+t1):TS_NEVER;
00283 else
00284 return t2;
00285 }
00286
00287 }
00288
00289 double clotheswasher::update_state(double dt)
00290 {
00291
00292 OBJECT *hdr = OBJECTHDR(this);
00293
00294
00295 enduse_queue += enduse_demand * dt/3600/24;
00296
00297 switch(state) {
00298 case STOPPED:
00299
00300 if (enduse_queue>1)
00301
00302 clotheswasher_run_prob = double(gl_random_uniform(&hdr->rng_state,queue_min,queue_max));
00303
00304 if (enduse_queue > 1 && (clotheswasher_run_prob > enduse_queue))
00305 {
00306 int temp_rand = gl_random_uniform(&hdr->rng_state,0,1);
00307
00308 if(temp_rand <= normal_perc){
00309 wash_mode = NORMAL;
00310 }
00311 else if(temp_rand <= perm_press_perc){
00312 wash_mode = PERM_PRESS;
00313 }
00314 else{
00315 wash_mode = GENTLE;
00316 }
00317
00318 switch(wash_mode){
00319 case NORMAL:
00320 cycle_time = ceil(NORMAL_PREWASH_ENERGY/NORMAL_PREWASH_POWER);
00321 clothesWasherPower = NORMAL_PREWASH_POWER;
00322 break;
00323 case PERM_PRESS:
00324 cycle_time = ceil(PERMPRESS_PREWASH_ENERGY/PERMPRESS_PREWASH_POWER);
00325 clothesWasherPower = PERMPRESS_PREWASH_POWER;
00326 break;
00327 case GENTLE:
00328 cycle_time = ceil(GENTLE_PREWASH_ENERGY/GENTLE_PREWASH_POWER);
00329 clothesWasherPower = GENTLE_PREWASH_POWER;
00330 break;
00331 }
00332
00333 state = PREWASH;
00334 enduse_queue--;
00335 Is_on = 1;
00336 new_running_state = true;
00337 }
00338 break;
00339 case PREWASH:
00340 if (cycle_time<=0)
00341 {
00342 state = WASH;
00343
00344 switch(wash_mode){
00345 case NORMAL:
00346 cycle_time = ceil(NORMAL_WASH_ENERGY/NORMAL_WASH_POWER);
00347 clothesWasherPower = NORMAL_WASH_POWER;
00348 break;
00349 case PERM_PRESS:
00350 cycle_time = ceil(PERMPRESS_WASH_ENERGY/PERMPRESS_WASH_POWER);
00351 clothesWasherPower = PERMPRESS_WASH_POWER;
00352 break;
00353 case GENTLE:
00354 cycle_time = ceil(GENTLE_WASH_ENERGY/GENTLE_WASH_POWER);
00355 clothesWasherPower = GENTLE_WASH_POWER;
00356 break;
00357 }
00358
00359 new_running_state = true;
00360 }
00361
00362 break;
00363 case WASH:
00364 if (cycle_time<=0)
00365 {
00366 state = SPIN1;
00367 spin_mode = SPIN_LOW;
00368
00369 switch(wash_mode){
00370 case NORMAL:
00371 cycle_time = ceil(NORMAL_SPIN_LOW_ENERGY/NORMAL_SPIN_LOW_POWER);
00372 clothesWasherPower = NORMAL_SPIN_LOW_POWER;
00373 break;
00374 case PERM_PRESS:
00375 cycle_time = ceil(PERMPRESS_SPIN_LOW_ENERGY/PERMPRESS_SPIN_LOW_POWER);
00376 clothesWasherPower = PERMPRESS_SPIN_LOW_POWER;
00377 break;
00378 case GENTLE:
00379 cycle_time = ceil(GENTLE_SPIN_LOW_ENERGY/GENTLE_SPIN_LOW_POWER);
00380 clothesWasherPower = GENTLE_SPIN_LOW_POWER;
00381 break;
00382 }
00383
00384 new_running_state = true;
00385
00386 }
00387
00388 break;
00389 case SPIN1:
00390 if (cycle_time<=0)
00391 {
00392 switch(spin_mode){
00393 case SPIN_LOW:
00394 spin_mode = SPIN_MEDIUM;
00395
00396 switch(wash_mode){
00397 case NORMAL:
00398 cycle_time = ceil(NORMAL_SPIN_MEDIUM_ENERGY/NORMAL_SPIN_MEDIUM_POWER);
00399 clothesWasherPower = NORMAL_SPIN_MEDIUM_POWER;
00400 break;
00401 case PERM_PRESS:
00402 cycle_time = ceil(PERMPRESS_SPIN_MEDIUM_ENERGY/PERMPRESS_SPIN_MEDIUM_POWER);
00403 clothesWasherPower = PERMPRESS_SPIN_MEDIUM_POWER;
00404 break;
00405 case GENTLE:
00406 cycle_time = ceil(GENTLE_SPIN_MEDIUM_ENERGY/GENTLE_SPIN_MEDIUM_POWER);
00407 clothesWasherPower = GENTLE_SPIN_MEDIUM_POWER;
00408 break;
00409 }
00410
00411 break;
00412 case SPIN_MEDIUM:
00413 spin_mode = SPIN_HIGH;
00414
00415 switch(wash_mode){
00416 case NORMAL:
00417 cycle_time = ceil(NORMAL_SPIN_HIGH_ENERGY/NORMAL_SPIN_HIGH_POWER);
00418 clothesWasherPower = NORMAL_SPIN_HIGH_POWER;
00419 break;
00420 case PERM_PRESS:
00421 cycle_time = ceil(PERMPRESS_SPIN_HIGH_ENERGY/PERMPRESS_SPIN_HIGH_POWER);
00422 clothesWasherPower = PERMPRESS_SPIN_HIGH_POWER;
00423 break;
00424 case GENTLE:
00425 cycle_time = ceil(GENTLE_SPIN_HIGH_ENERGY/GENTLE_SPIN_HIGH_POWER);
00426 clothesWasherPower = GENTLE_SPIN_HIGH_POWER;
00427 break;
00428 }
00429
00430 break;
00431 case SPIN_HIGH:
00432
00433 spin_mode = SPIN_WASH;
00434
00435 switch(wash_mode){
00436 case NORMAL:
00437 cycle_time = ceil(NORMAL_WASH_ENERGY/NORMAL_WASH_POWER);
00438 clothesWasherPower = NORMAL_WASH_POWER;
00439 break;
00440 case PERM_PRESS:
00441 cycle_time = ceil(PERMPRESS_WASH_ENERGY/PERMPRESS_WASH_POWER);
00442 clothesWasherPower = PERMPRESS_WASH_POWER;
00443 break;
00444 case GENTLE:
00445 cycle_time = ceil(GENTLE_WASH_ENERGY/GENTLE_WASH_POWER);
00446 clothesWasherPower = GENTLE_WASH_POWER;
00447 break;
00448 }
00449 case SPIN_WASH:
00450
00451 state = SPIN2;
00452 spin_mode = SPIN_LOW;
00453
00454 switch(wash_mode){
00455 case NORMAL:
00456 cycle_time = ceil(NORMAL_SPIN_LOW_ENERGY/NORMAL_SPIN_LOW_POWER);
00457 clothesWasherPower = NORMAL_SPIN_LOW_POWER;
00458 break;
00459 case PERM_PRESS:
00460 cycle_time = ceil(PERMPRESS_SPIN_LOW_ENERGY/PERMPRESS_SPIN_LOW_POWER);
00461 clothesWasherPower = PERMPRESS_SPIN_LOW_POWER;
00462 break;
00463 case GENTLE:
00464 cycle_time = ceil(GENTLE_SPIN_LOW_ENERGY/GENTLE_SPIN_LOW_POWER);
00465 clothesWasherPower = GENTLE_SPIN_LOW_POWER;
00466 break;
00467 }
00468
00469 break;
00470
00471 }
00472
00473 new_running_state = true;
00474 }
00475 break;
00476 case SPIN2:
00477 if (cycle_time<=0)
00478 {
00479 switch(spin_mode){
00480 case SPIN_LOW:
00481 spin_mode = SPIN_MEDIUM;
00482
00483 switch(wash_mode){
00484 case NORMAL:
00485 cycle_time = ceil(NORMAL_SPIN_MEDIUM_ENERGY/NORMAL_SPIN_MEDIUM_POWER);
00486 clothesWasherPower = NORMAL_SPIN_MEDIUM_POWER;
00487 break;
00488 case PERM_PRESS:
00489 cycle_time = ceil(PERMPRESS_SPIN_MEDIUM_ENERGY/PERMPRESS_SPIN_MEDIUM_POWER);
00490 clothesWasherPower = PERMPRESS_SPIN_MEDIUM_POWER;
00491 break;
00492 case GENTLE:
00493 cycle_time = ceil(GENTLE_SPIN_MEDIUM_ENERGY/GENTLE_SPIN_MEDIUM_POWER);
00494 clothesWasherPower = GENTLE_SPIN_MEDIUM_POWER;
00495 break;
00496 }
00497
00498 break;
00499 case SPIN_MEDIUM:
00500 spin_mode = SPIN_HIGH;
00501
00502 switch(wash_mode){
00503 case NORMAL:
00504 cycle_time = ceil(NORMAL_SPIN_HIGH_ENERGY/NORMAL_SPIN_HIGH_POWER);
00505 clothesWasherPower = NORMAL_SPIN_HIGH_POWER;
00506 break;
00507 case PERM_PRESS:
00508 cycle_time = ceil(PERMPRESS_SPIN_HIGH_ENERGY/PERMPRESS_SPIN_HIGH_POWER);
00509 clothesWasherPower = PERMPRESS_SPIN_HIGH_POWER;
00510 break;
00511 case GENTLE:
00512 cycle_time = ceil(GENTLE_SPIN_HIGH_ENERGY/GENTLE_SPIN_HIGH_POWER);
00513 clothesWasherPower = GENTLE_SPIN_HIGH_POWER;
00514 break;
00515 }
00516
00517 break;
00518 case SPIN_HIGH:
00519
00520 spin_mode = SPIN_WASH;
00521
00522 switch(wash_mode){
00523 case NORMAL:
00524 cycle_time = ceil(NORMAL_WASH_ENERGY/NORMAL_WASH_POWER);
00525 clothesWasherPower = NORMAL_WASH_POWER;
00526 break;
00527 case PERM_PRESS:
00528 cycle_time = ceil(PERMPRESS_WASH_ENERGY/PERMPRESS_WASH_POWER);
00529 clothesWasherPower = PERMPRESS_WASH_POWER;
00530 break;
00531 case GENTLE:
00532 cycle_time = ceil(GENTLE_WASH_ENERGY/GENTLE_WASH_POWER);
00533 clothesWasherPower = GENTLE_WASH_POWER;
00534 break;
00535 }
00536 case SPIN_WASH:
00537
00538 state = SPIN3;
00539 spin_mode = SPIN_LOW;
00540
00541 switch(wash_mode){
00542 case NORMAL:
00543 cycle_time = ceil(NORMAL_SPIN_LOW_ENERGY/NORMAL_SPIN_LOW_POWER);
00544 clothesWasherPower = NORMAL_SPIN_LOW_POWER;
00545 break;
00546 case PERM_PRESS:
00547 cycle_time = ceil(PERMPRESS_SPIN_LOW_ENERGY/PERMPRESS_SPIN_LOW_POWER);
00548 clothesWasherPower = PERMPRESS_SPIN_LOW_POWER;
00549 break;
00550 case GENTLE:
00551 cycle_time = ceil(GENTLE_SPIN_LOW_ENERGY/GENTLE_SPIN_LOW_POWER);
00552 clothesWasherPower = GENTLE_SPIN_LOW_POWER;
00553 break;
00554 }
00555
00556 break;
00557
00558 }
00559
00560 new_running_state = true;
00561 }
00562 break;
00563 case SPIN3:
00564 if (cycle_time<=0)
00565 {
00566 switch(spin_mode){
00567 case SPIN_LOW:
00568 spin_mode = SPIN_MEDIUM;
00569
00570 switch(wash_mode){
00571 case NORMAL:
00572 cycle_time = ceil(NORMAL_SPIN_MEDIUM_ENERGY/NORMAL_SPIN_MEDIUM_POWER);
00573 clothesWasherPower = NORMAL_SPIN_MEDIUM_POWER;
00574 break;
00575 case PERM_PRESS:
00576 cycle_time = ceil(PERMPRESS_SPIN_MEDIUM_ENERGY/PERMPRESS_SPIN_MEDIUM_POWER);
00577 clothesWasherPower = PERMPRESS_SPIN_MEDIUM_POWER;
00578 break;
00579 case GENTLE:
00580 cycle_time = ceil(GENTLE_SPIN_MEDIUM_ENERGY/GENTLE_SPIN_MEDIUM_POWER);
00581 clothesWasherPower = GENTLE_SPIN_MEDIUM_POWER;
00582 break;
00583 }
00584
00585 break;
00586 case SPIN_MEDIUM:
00587 spin_mode = SMALLWASH;
00588
00589 switch(wash_mode){
00590 case NORMAL:
00591 cycle_time = ceil(NORMAL_SMALLWASH_ENERGY/NORMAL_SMALLWASH_POWER);
00592 clothesWasherPower = NORMAL_SMALLWASH_POWER;
00593 break;
00594 case PERM_PRESS:
00595 cycle_time = ceil(PERMPRESS_SMALLWASH_ENERGY/PERMPRESS_SMALLWASH_POWER);
00596 clothesWasherPower = PERMPRESS_SMALLWASH_POWER;
00597 break;
00598 case GENTLE:
00599 cycle_time = ceil(GENTLE_SMALLWASH_ENERGY/GENTLE_SMALLWASH_POWER);
00600 clothesWasherPower = GENTLE_SMALLWASH_POWER;
00601 break;
00602 }
00603
00604 break;
00605 case SMALLWASH:
00606
00607 state = SPIN4;
00608 spin_mode = SPIN_LOW;
00609
00610 switch(wash_mode){
00611 case NORMAL:
00612 cycle_time = ceil(NORMAL_SPIN_LOW_ENERGY/NORMAL_SPIN_LOW_POWER);
00613 clothesWasherPower = NORMAL_SPIN_LOW_POWER;
00614 break;
00615 case PERM_PRESS:
00616 cycle_time = ceil(PERMPRESS_SPIN_LOW_ENERGY/PERMPRESS_SPIN_LOW_POWER);
00617 clothesWasherPower = PERMPRESS_SPIN_LOW_POWER;
00618 break;
00619 case GENTLE:
00620 cycle_time = ceil(GENTLE_SPIN_LOW_ENERGY/GENTLE_SPIN_LOW_POWER);
00621 clothesWasherPower = GENTLE_SPIN_LOW_POWER;
00622 break;
00623 }
00624
00625 break;
00626
00627 }
00628 }
00629 break;
00630 case SPIN4:
00631 if (cycle_time<=0)
00632 {
00633 switch(spin_mode){
00634 case SPIN_LOW:
00635 spin_mode = SPIN_MEDIUM;
00636
00637 switch(wash_mode){
00638 case NORMAL:
00639 cycle_time = ceil(NORMAL_SPIN_MEDIUM_ENERGY/NORMAL_SPIN_MEDIUM_POWER);
00640 clothesWasherPower = NORMAL_SPIN_MEDIUM_POWER;
00641 break;
00642 case PERM_PRESS:
00643 cycle_time = ceil(PERMPRESS_SPIN_MEDIUM_ENERGY/PERMPRESS_SPIN_MEDIUM_POWER);
00644 clothesWasherPower = PERMPRESS_SPIN_MEDIUM_POWER;
00645 break;
00646 case GENTLE:
00647 cycle_time = ceil(GENTLE_SPIN_MEDIUM_ENERGY/GENTLE_SPIN_MEDIUM_POWER);
00648 clothesWasherPower = GENTLE_SPIN_MEDIUM_POWER;
00649 break;
00650 }
00651
00652 break;
00653 case SPIN_MEDIUM:
00654 spin_mode = SPIN_HIGH;
00655
00656
00657 switch(wash_mode){
00658 case NORMAL:
00659
00660 cycle_time = ceil((NORMAL_SPIN_HIGH_ENERGY*3)/NORMAL_SPIN_HIGH_POWER);
00661 clothesWasherPower = NORMAL_SPIN_HIGH_POWER;
00662 break;
00663 case PERM_PRESS:
00664 cycle_time = ceil((PERMPRESS_SPIN_HIGH_ENERGY*3)/PERMPRESS_SPIN_HIGH_POWER);
00665 clothesWasherPower = PERMPRESS_SPIN_HIGH_POWER;
00666 break;
00667 case GENTLE:
00668 cycle_time = ceil((GENTLE_SPIN_HIGH_ENERGY*3)/GENTLE_SPIN_HIGH_POWER);
00669 clothesWasherPower = GENTLE_SPIN_HIGH_POWER;
00670 break;
00671 }
00672
00673 break;
00674 case SPIN_HIGH:
00675
00676 spin_mode = SMALLWASH;
00677
00678 switch(wash_mode){
00679 case NORMAL:
00680 cycle_time = ceil(NORMAL_SMALLWASH_ENERGY/NORMAL_SMALLWASH_POWER);
00681 clothesWasherPower = NORMAL_SMALLWASH_POWER;
00682 break;
00683 case PERM_PRESS:
00684 cycle_time = ceil(PERMPRESS_SMALLWASH_ENERGY/PERMPRESS_SMALLWASH_POWER);
00685 clothesWasherPower = PERMPRESS_SMALLWASH_POWER;
00686 break;
00687 case GENTLE:
00688 cycle_time = ceil(GENTLE_SMALLWASH_ENERGY/GENTLE_SMALLWASH_POWER);
00689 clothesWasherPower = GENTLE_SMALLWASH_POWER;
00690 break;
00691 }
00692 break;
00693 case SMALLWASH:
00694
00695 state = STOPPED;
00696 cycle_time = 0;
00697 clothesWasherPower = 0;
00698
00699 Is_on = 0;
00700
00701 break;
00702
00703 }
00704
00705 new_running_state = true;
00706 }
00707 break;
00708
00709 }
00710
00711 if(state==STOPPED){
00712
00713 load.power = load.current = load.admittance = complex(0,0,J);
00714
00715
00716 if(0==enduse_demand){
00717
00718 if(true==starttime){
00719 dt=0;
00720 }
00721 else{
00722 dt = 3600;
00723 }
00724
00725 }
00726 else{
00727
00728 dt = (enduse_queue>=1) ? 0 : ((1-enduse_queue)*3600)/(enduse_demand*24);
00729
00730 }
00731
00732 }
00733 else{
00734
00735 if(new_running_state == true){
00736 new_running_state = false;
00737 cycle_time = cycle_time-1;
00738 }
00739 else{
00740 cycle_time -=dt;
00741 }
00742
00743 load.power = complex(clothesWasherPower/1000,0,J);
00744 load.current = 0;
00745 load.admittance =0;
00746
00747 dt = cycle_time;
00748
00749
00750 }
00751
00752
00753 load.total = load.power;
00754
00755 if (dt > 0 && dt < 1)
00756 dt = 1;
00757
00758 return dt;
00759 }
00760
00762
00764
00765 EXPORT int create_clotheswasher(OBJECT **obj, OBJECT *parent)
00766 {
00767 *obj = gl_create_object(clotheswasher::oclass);
00768 if (*obj!=NULL)
00769 {
00770 clotheswasher *my = OBJECTDATA(*obj,clotheswasher);
00771 gl_set_parent(*obj,parent);
00772 my->create();
00773 return 1;
00774 }
00775 return 0;
00776 }
00777
00778 EXPORT int init_clotheswasher(OBJECT *obj)
00779 {
00780 clotheswasher *my = OBJECTDATA(obj,clotheswasher);
00781 return my->init(obj->parent);
00782 }
00783
00784 EXPORT int isa_clotheswasher(OBJECT *obj, char *classname)
00785 {
00786 if(obj != 0 && classname != 0){
00787 return OBJECTDATA(obj,clotheswasher)->isa(classname);
00788 } else {
00789 return 0;
00790 }
00791 }
00792
00793 EXPORT TIMESTAMP sync_clotheswasher(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00794 {
00795 clotheswasher *my = OBJECTDATA(obj, clotheswasher);
00796 if (obj->clock <= ROUNDOFF)
00797 obj->clock = t0;
00798 try {
00799 TIMESTAMP t1 = TS_NEVER;
00800 switch (pass) {
00801 case PC_PRETOPDOWN:
00802 return my->presync(obj->clock, t0);
00803 case PC_BOTTOMUP:
00804 t1 = my->sync(obj->clock, t0);
00805 obj->clock = t0;
00806 return t1;
00807 default:
00808 throw "invalid pass request";
00809 }
00810 }
00811 catch (int m)
00812 {
00813 gl_error("%s (clotheswasher:%d) model zone exception (code %d) not caught", obj->name?obj->name:"(anonymous waterheater)", obj->id, m);
00814 }
00815 catch (char *msg)
00816 {
00817 gl_error("%s (clotheswasher:%d) %s", obj->name?obj->name:"(anonymous clotheswasher)", obj->id, msg);
00818 }
00819 return TS_INVALID;}
00820