00001
00010 #include <stdlib.h>
00011 #include <stdio.h>
00012 #include <errno.h>
00013 #include <math.h>
00014
00015 #include "generators.h"
00016 #include "power_electronics.h"
00017
00018 #define DEFAULT 1.0;
00019 #define S_DEFAULT 1.0;
00020 #define G_DEFAULT 1000.0;
00021
00022 CLASS *power_electronics::oclass = NULL;
00023 power_electronics *power_electronics::defaults = NULL;
00024
00025 static PASSCONFIG passconfig = PC_BOTTOMUP|PC_POSTTOPDOWN;
00026 static PASSCONFIG clockpass = PC_BOTTOMUP;
00027
00028
00029
00030
00031
00032 power_electronics::power_electronics(){}
00033
00034
00035 power_electronics::power_electronics(MODULE *module)
00036 {
00037 if (oclass==NULL)
00038 {
00039 oclass = gl_register_class(module,"power_electronics",sizeof(power_electronics),PC_PRETOPDOWN|PC_BOTTOMUP|PC_POSTTOPDOWN);
00040 if (oclass==NULL)
00041 GL_THROW("unable to register object class implemented by %s", __FILE__);
00042
00043 if (gl_publish_variable(oclass,
00044
00045 PT_enumeration,"generator_mode",PADDR(gen_mode_v),
00046 PT_KEYWORD,"UNKNOWN",UNKNOWN,
00047 PT_KEYWORD,"CONSTANT_V",CONSTANT_V,
00048 PT_KEYWORD,"CONSTANT_PQ",CONSTANT_PQ,
00049 PT_KEYWORD,"CONSTANT_PF",CONSTANT_PF,
00050 PT_KEYWORD,"SUPPLY_DRIVEN",SUPPLY_DRIVEN,
00051
00052 PT_enumeration,"generator_status",PADDR(gen_status_v),
00053 PT_KEYWORD,"OFFLINE",OFFLINE,
00054 PT_KEYWORD,"ONLINE",ONLINE,
00055
00056 PT_enumeration,"converter_type",PADDR(converter_type_v),
00057 PT_KEYWORD,"VOLTAGE_SOURCED",VOLTAGE_SOURCED,
00058 PT_KEYWORD,"CURRENT_SOURCED",CURRENT_SOURCED,
00059
00060 PT_enumeration,"switch_type",PADDR(switch_type_v),
00061 PT_KEYWORD,"IDEAL_SWITCH",IDEAL_SWITCH,
00062 PT_KEYWORD,"BJT",BJT,
00063 PT_KEYWORD,"MOSFET",MOSFET,
00064 PT_KEYWORD,"SCR",SCR,
00065 PT_KEYWORD,"JFET",JFET,
00066 PT_KEYWORD,"IBJT",IBJT,
00067 PT_KEYWORD,"DARLINGTON",DARLINGTON,
00068
00069 PT_enumeration,"filter_type",PADDR(filter_type_v),
00070 PT_KEYWORD,"LOW_PASS",LOW_PASS,
00071 PT_KEYWORD,"HIGH_PASS",HIGH_PASS,
00072 PT_KEYWORD,"BAND_STOP",BAND_STOP,
00073 PT_KEYWORD,"BAND_PASS",BAND_PASS,
00074
00075 PT_enumeration,"filter_implementation",PADDR(filter_imp_v),
00076 PT_KEYWORD,"IDEAL_FILTER",IDEAL_FILTER,
00077 PT_KEYWORD,"CAPACITVE",CAPACITIVE,
00078 PT_KEYWORD,"INDUCTIVE",INDUCTIVE,
00079 PT_KEYWORD,"SERIES_RESONANT",SERIES_RESONANT,
00080 PT_KEYWORD,"PARALLEL_RESONANT",PARALLEL_RESONANT,
00081
00082 PT_enumeration,"filter_frequency",PADDR(filter_freq_v),
00083 PT_KEYWORD,"F120HZ",F120HZ,
00084 PT_KEYWORD,"F180HZ",F180HZ,
00085 PT_KEYWORD,"F240HZ",F240HZ,
00086
00087
00088 PT_enumeration,"power_type",PADDR(power_type_v),
00089 PT_KEYWORD,"AC",AC,
00090 PT_KEYWORD,"DC",DC,
00091
00092 PT_double, "Rated_kW[kW]", PADDR(Rated_kW),
00093 PT_double, "Max_P[kW]", PADDR(Max_P),
00094 PT_double, "Min_P[kW]", PADDR(Min_P),
00095
00096
00097
00098 PT_double, "Rated_kVA[kVA]", PADDR(Rated_kVA),
00099 PT_double, "Rated_kV[kV]", PADDR(Rated_kV),
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 PT_set, "phases", PADDR(phases),
00162 PT_KEYWORD, "A",(set)PHASE_A,
00163 PT_KEYWORD, "B",(set)PHASE_B,
00164 PT_KEYWORD, "C",(set)PHASE_C,
00165 PT_KEYWORD, "N",(set)PHASE_N,
00166 PT_KEYWORD, "S",(set)PHASE_S,
00167 NULL)<1) GL_THROW("unable to publish properties in %s",__FILE__);
00168 defaults = this;
00169 memset(this,0,sizeof(power_electronics));
00170
00171 }
00172 }
00173
00174
00175
00176 int power_electronics::filter_circuit_impact(power_electronics::FILTER_TYPE filter_type_choice, power_electronics::FILTER_IMPLEMENTATION filter_implementation_choice){
00177 switch(filter_type_choice){
00178 case BAND_PASS:
00179 switch(filter_implementation_choice){
00180 case IDEAL_FILTER:
00181 if(filter_120HZ){
00182 Rsfilter[0] = S_DEFAULT;
00183 Rgfilter[0] = G_DEFAULT;
00184 Xsfilter[0] = S_DEFAULT;
00185 Xgfilter[0] = G_DEFAULT;
00186 }
00187 if(filter_180HZ){
00188 Rsfilter[1] = S_DEFAULT;
00189 Rgfilter[1] = G_DEFAULT;
00190 Xsfilter[1] = S_DEFAULT;
00191 Xgfilter[1] = G_DEFAULT;
00192 }
00193 if(filter_240HZ){
00194 Rsfilter[2] = S_DEFAULT;
00195 Rgfilter[2] = G_DEFAULT;
00196 Xsfilter[2] = S_DEFAULT;
00197 Xgfilter[2] = G_DEFAULT;
00198 }
00199 break;
00200 case CAPACITIVE:
00201 if(filter_120HZ){
00202 Rsfilter[0] = S_DEFAULT;
00203 Rgfilter[0] = G_DEFAULT;
00204 Xsfilter[0] = S_DEFAULT;
00205 Xgfilter[0] = G_DEFAULT;
00206 }
00207 if(filter_180HZ){
00208 Rsfilter[1] = S_DEFAULT;
00209 Rgfilter[1] = G_DEFAULT;
00210 Xsfilter[1] = S_DEFAULT;
00211 Xgfilter[1] = G_DEFAULT;
00212 }
00213 if(filter_240HZ){
00214 Rsfilter[2] = S_DEFAULT;
00215 Rgfilter[2] = G_DEFAULT;
00216 Xsfilter[2] = S_DEFAULT;
00217 Xgfilter[2] = G_DEFAULT;
00218 }
00219 break;
00220 case INDUCTIVE:
00221 if(filter_120HZ){
00222 Rsfilter[0] = S_DEFAULT;
00223 Rgfilter[0] = G_DEFAULT;
00224 Xsfilter[0] = S_DEFAULT;
00225 Xgfilter[0] = G_DEFAULT;
00226 }
00227 if(filter_180HZ){
00228 Rsfilter[1] = S_DEFAULT;
00229 Rgfilter[1] = G_DEFAULT;
00230 Xsfilter[1] = S_DEFAULT;
00231 Xgfilter[1] = G_DEFAULT;
00232 }
00233 if(filter_240HZ){
00234 Rsfilter[2] = S_DEFAULT;
00235 Rgfilter[2] = G_DEFAULT;
00236 Xsfilter[2] = S_DEFAULT;
00237 Xgfilter[2] = G_DEFAULT;
00238 }
00239 break;
00240 case SERIES_RESONANT:
00241 if(filter_120HZ){
00242 Rsfilter[0] = S_DEFAULT;
00243 Rgfilter[0] = G_DEFAULT;
00244 Xsfilter[0] = S_DEFAULT;
00245 Xgfilter[0] = G_DEFAULT;
00246 }
00247 if(filter_180HZ){
00248 Rsfilter[1] = S_DEFAULT;
00249 Rgfilter[1] = G_DEFAULT;
00250 Xsfilter[1] = S_DEFAULT;
00251 Xgfilter[1] = G_DEFAULT;
00252 }
00253 if(filter_240HZ){
00254 Rsfilter[2] = S_DEFAULT;
00255 Rgfilter[2] = G_DEFAULT;
00256 Xsfilter[2] = S_DEFAULT;
00257 Xgfilter[2] = G_DEFAULT;
00258 }
00259 break;
00260 case PARALLEL_RESONANT:
00261 if(filter_120HZ){
00262 Rsfilter[0] = S_DEFAULT;
00263 Rgfilter[0] = G_DEFAULT;
00264 Xsfilter[0] = S_DEFAULT;
00265 Xgfilter[0] = G_DEFAULT;
00266 }
00267 if(filter_180HZ){
00268 Rsfilter[1] = S_DEFAULT;
00269 Rgfilter[1] = G_DEFAULT;
00270 Xsfilter[1] = S_DEFAULT;
00271 Xgfilter[1] = G_DEFAULT;
00272 }
00273 if(filter_240HZ){
00274 Rsfilter[2] = S_DEFAULT;
00275 Rgfilter[2] = G_DEFAULT;
00276 Xsfilter[2] = S_DEFAULT;
00277 Xgfilter[2] = G_DEFAULT;
00278 }
00279 break;
00280 default:
00281 break;
00282 }
00283 break;
00284
00285 default:
00286 break;
00287
00288 }
00289 Rsfilter_total = Rsfilter[0] + Rsfilter[1] + Rsfilter[2];
00290 Rgfilter_total = Rgfilter[0] + Rgfilter[1] + Rgfilter[2];
00291 Xsfilter_total = Xsfilter[0] + Xsfilter[1] + Xsfilter[2];
00292 Xgfilter_total = Xgfilter[0] + Xgfilter[1] + Xgfilter[2];
00293 return 1;
00294 }
00295
00296
00297
00298 complex power_electronics::filter_voltage_impact_source(complex desired_I_out, complex desired_V_out){
00299 if(desired_V_out == 0){
00300 return complex(0,0);
00301 }else{
00302 complex Is = filter_current_impact_source(desired_I_out, desired_V_out);
00303 complex Vs = desired_V_out + (Is * complex(Rsfilter_total,Xsfilter_total));
00304 return Vs;
00305 }
00306 }
00307
00308
00309
00310 complex power_electronics::filter_current_impact_source(complex desired_I_out, complex desired_V_out){
00311 if(desired_I_out == 0){
00312 return complex(0,0);
00313 }else{
00314 complex Ig = desired_V_out / complex(Rgfilter_total,Xgfilter_total);
00315 complex Is = desired_I_out + Ig;
00316 return Is;
00317 }
00318 }
00319
00320
00321
00322 complex power_electronics::filter_voltage_impact_out(complex source_I_in, complex source_V_in){
00323 if(source_V_in == 0){
00324 return complex(0,0);
00325 }else{
00326 complex Vo = source_V_in - (source_I_in * complex(Rsfilter_total,Xsfilter_total));
00327 return Vo;
00328 }
00329 }
00330
00331
00332 complex power_electronics::filter_current_impact_out(complex source_I_in, complex source_V_in){
00333 if(source_I_in == 0){
00334 return complex(0,0);
00335 }else{
00336 complex Vo = filter_voltage_impact_out(source_I_in, source_V_in);
00337 complex Ig = Vo / complex(Rgfilter_total,Xgfilter_total);
00338 complex Io = source_I_in - Ig;
00339 return Io;
00340 }
00341 }
00342
00343
00344
00345 double power_electronics::internal_switch_resistance(power_electronics::SWITCH_TYPE switch_type_choice){
00346 switch(switch_type_choice){
00347 case IDEAL_SWITCH:
00348 Rinternal += 0;
00349 break;
00350 case BJT:
00351 Rinternal += DEFAULT;
00352 break;
00353 case MOSFET:
00354 Rinternal += DEFAULT;
00355 break;
00356 case SCR:
00357 Rinternal += DEFAULT;
00358 break;
00359 case JFET:
00360 Rinternal += DEFAULT;
00361 break;
00362 case IBJT:
00363 Rinternal += DEFAULT;
00364 break;
00365 case DARLINGTON:
00366 Rinternal += DEFAULT;
00367 break;
00368 default:
00369 break;
00370 }
00371 return 1;
00372 }
00373
00374 double power_electronics::calculate_loss(double Rtotal, double LTotal, double Ctotal, POWER_TYPE power_in, POWER_TYPE power_out){
00375
00376 return 0;
00377 }
00378
00379 double power_electronics::calculate_frequency_loss(double frequency, double Rtotal, double Ltotal, double Ctotal){
00380
00381 return 0;
00382 }
00383
00384
00385
00386
00387
00388 int power_electronics::create(void)
00389 {
00390 memcpy(this,defaults,sizeof(*this));
00391
00392 return 1;
00393 }
00394
00395
00396 int power_electronics::init(OBJECT *parent)
00397 {
00398
00399
00449 return 1;
00450 }
00451
00452
00453 TIMESTAMP power_electronics::presync(TIMESTAMP t0, TIMESTAMP t1)
00454 {
00455
00456
00457 TIMESTAMP t2 = TS_NEVER;
00458
00459 return t2;
00460 }
00461
00462
00463 TIMESTAMP power_electronics::sync(TIMESTAMP t0, TIMESTAMP t1)
00464 {
00465
00466
00467
00468
00469
00470
00471
00472
00473
00475
00476
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487 TIMESTAMP t2 = TS_NEVER;
00488
00489 return t2;
00490 }
00491
00492
00493 TIMESTAMP power_electronics::postsync(TIMESTAMP t0, TIMESTAMP t1)
00494 {
00495 TIMESTAMP t2 = TS_NEVER;
00497 return t2;
00498 }
00499
00501
00503
00504 EXPORT int create_power_electronics(OBJECT **obj, OBJECT *parent)
00505 {
00506 try
00507 {
00508 *obj = gl_create_object(power_electronics::oclass);
00509 if (*obj!=NULL)
00510 {
00511 power_electronics *my = OBJECTDATA(*obj,power_electronics);
00512 gl_set_parent(*obj,parent);
00513 return my->create();
00514 }
00515 }
00516 catch (char *msg)
00517 {
00518 gl_error("create_power_electronics: %s", msg);
00519 }
00520
00521 return 0;
00522 }
00523
00524 EXPORT int init_power_electronics(OBJECT *obj, OBJECT *parent)
00525 {
00526 try
00527 {
00528 if (obj!=NULL)
00529 return OBJECTDATA(obj,power_electronics)->init(parent);
00530 }
00531 catch (char *msg)
00532 {
00533 gl_error("init_power_electronics(obj=%d;%s): %s", obj->id, obj->name?obj->name:"unnamed", msg);
00534 }
00535
00536 return 0;
00537 }
00538
00539 EXPORT TIMESTAMP sync_power_electronics(OBJECT *obj, TIMESTAMP t1, PASSCONFIG pass)
00540 {
00541 TIMESTAMP t2 = TS_NEVER;
00542 power_electronics *my = OBJECTDATA(obj,power_electronics);
00543 try
00544 {
00545 switch (pass) {
00546 case PC_PRETOPDOWN:
00547 t2 = my->presync(obj->clock,t1);
00548 break;
00549 case PC_BOTTOMUP:
00550 t2 = my->sync(obj->clock,t1);
00551 break;
00552 case PC_POSTTOPDOWN:
00553 t2 = my->postsync(obj->clock,t1);
00554 break;
00555 default:
00556 GL_THROW("invalid pass request (%d)", pass);
00557 break;
00558 }
00559 if (pass==clockpass)
00560 obj->clock = t1;
00561 }
00562 catch (char *msg)
00563 {
00564 gl_error("sync_power_electronics(obj=%d;%s): %s", obj->id, obj->name?obj->name:"unnamed", msg);
00565 }
00566 return t2;
00567 }