00001
00010 #include <stdlib.h>
00011 #include <stdio.h>
00012 #include <errno.h>
00013 #include <math.h>
00014
00015 #include "rectifier.h"
00016
00017 #define DEFAULT 1.0;
00018
00019
00020 CLASS *rectifier::oclass = NULL;
00021 rectifier *rectifier::defaults = NULL;
00022
00023 static PASSCONFIG passconfig = PC_BOTTOMUP;
00024 static PASSCONFIG clockpass = PC_BOTTOMUP;
00025
00026
00027 rectifier::rectifier(MODULE *module)
00028 {
00029 if (oclass==NULL)
00030 {
00031 oclass = gl_register_class(module,"rectifier",sizeof(rectifier),PC_BOTTOMUP|PC_AUTOLOCK);
00032 if (oclass==NULL)
00033 throw "unable to register class rectifier";
00034 else
00035 oclass->trl = TRL_PROOF;
00036
00037 if (gl_publish_variable(oclass,
00038
00039 PT_enumeration,"rectifier_type",PADDR(rectifier_type_v),
00040 PT_KEYWORD,"ONE_PULSE",(enumeration)ONE_PULSE,
00041 PT_KEYWORD,"TWO_PULSE",(enumeration)TWO_PULSE,
00042 PT_KEYWORD,"THREE_PULSE",(enumeration)THREE_PULSE,
00043 PT_KEYWORD,"SIX_PULSE",(enumeration)SIX_PULSE,
00044 PT_KEYWORD,"TWELVE_PULSE",(enumeration)TWELVE_PULSE,
00045
00046 PT_enumeration,"generator_mode",PADDR(gen_mode_v),
00047 PT_KEYWORD,"UNKNOWN",(enumeration)UNKNOWN,
00048 PT_KEYWORD,"CONSTANT_V",(enumeration)CONSTANT_V,
00049 PT_KEYWORD,"CONSTANT_PQ",(enumeration)CONSTANT_PQ,
00050 PT_KEYWORD,"CONSTANT_PF",(enumeration)CONSTANT_PF,
00051 PT_KEYWORD,"SUPPLY_DRIVEN",(enumeration)SUPPLY_DRIVEN,
00052
00053 PT_complex, "V_Out[V]",PADDR(V_Out),
00054 PT_double, "V_Rated[V]",PADDR(V_Rated),
00055 PT_complex, "I_Out[A]",PADDR(I_Out),
00056 PT_complex, "VA_Out[VA]", PADDR(VA_Out),
00057 PT_complex, "voltage_A[V]", PADDR(voltage_out[0]),
00058 PT_complex, "voltage_B[V]", PADDR(voltage_out[1]),
00059 PT_complex, "voltage_C[V]", PADDR(voltage_out[2]),
00060 PT_complex, "current_A[V]", PADDR(current_out[0]),
00061 PT_complex, "current_B[V]", PADDR(current_out[1]),
00062 PT_complex, "current_C[V]", PADDR(current_out[2]),
00063 PT_complex, "power_out_A[VA]", PADDR(power_out[0]),
00064 PT_complex, "power_out_B[VA]", PADDR(power_out[1]),
00065 PT_complex, "power_out_C[VA]", PADDR(power_out[2]),
00066
00067
00068
00069 PT_set, "phases", PADDR(phases),
00070 PT_KEYWORD, "A",(set)PHASE_A,
00071 PT_KEYWORD, "B",(set)PHASE_B,
00072 PT_KEYWORD, "C",(set)PHASE_C,
00073 PT_KEYWORD, "N",(set)PHASE_N,
00074 PT_KEYWORD, "S",(set)PHASE_S,
00075 NULL)<1) GL_THROW("unable to publish properties in %s",__FILE__);
00076 defaults = this;
00077
00078 memset(this,0,sizeof(rectifier));
00079
00080 }
00081 }
00082
00083
00084 int rectifier::create(void)
00085 {
00086 memcpy(this,defaults,sizeof(*this));
00087
00088 return 1;
00089 }
00090
00091
00092 int rectifier::init(OBJECT *parent)
00093 {
00094 OBJECT *obj = OBJECTHDR(this);
00095
00096 rectifier_type_v = SIX_PULSE;
00097
00098 V_Rated = 360;
00099
00100 if (parent!=NULL && gl_object_isa(parent,"inverter"))
00101 {
00102
00103 pCircuit_V = new gld_property(parent,"V_In");
00104
00105
00106 if ((pCircuit_V->is_valid() != true) || (pCircuit_V->is_complex() != true))
00107 {
00108 GL_THROW("rectifier:%d - %s - Unable to map parent inverter property",obj->id,(obj->name ? obj->name : "Unnamed"));
00109
00110
00111
00112
00113 }
00114
00115
00116 pLine_I = new gld_property(parent,"I_In");
00117
00118
00119 if ((pLine_I->is_valid() != true) || (pLine_I->is_complex() != true))
00120 {
00121 GL_THROW("rectifier:%d - %s - Unable to map parent inverter property",obj->id,(obj->name ? obj->name : "Unnamed"));
00122
00123 }
00124 }
00125 else
00126 {
00127 GL_THROW("Rectifier:%d - %s -- Rectifiers must be parented to inverters",obj->id,(obj->name ? obj->name : "Unnamed"));
00128
00129
00130
00131
00132 }
00133
00134
00135 if (gen_mode_v==UNKNOWN)
00136 {
00137 GL_THROW("Generator control mode is not specified.");
00138 }
00139 else if(gen_mode_v == CONSTANT_V)
00140 {
00141 GL_THROW("Generator mode CONSTANT_V is not implemented yet.");
00142 }
00143 else if(gen_mode_v == CONSTANT_PQ)
00144 {
00145 GL_THROW("Generator mode CONSTANT_PQ is not implemented yet.");
00146 }
00147 else if(gen_mode_v == CONSTANT_PF)
00148 {
00149 GL_THROW("Generator mode CONSTANT_PF is not implemented yet.");
00150 }
00151
00152
00153
00154 switch(rectifier_type_v){
00155 case ONE_PULSE:
00156 efficiency = 0.5;
00157 break;
00158 case TWO_PULSE:
00159 efficiency = 0.7;
00160 break;
00161 case THREE_PULSE:
00162 efficiency = 0.7;
00163 break;
00164 case SIX_PULSE:
00165 efficiency = 0.8;
00166 break;
00167 case TWELVE_PULSE:
00168 efficiency = 0.9;
00169 break;
00170 default:
00171 efficiency = 0.8;
00172 break;
00173 }
00174
00175 return 1;
00176 }
00177
00178 TIMESTAMP rectifier::presync(TIMESTAMP t0, TIMESTAMP t1)
00179 {
00180 return TS_NEVER;
00181 }
00182
00183
00184 TIMESTAMP rectifier::sync(TIMESTAMP t0, TIMESTAMP t1)
00185 {
00186 gld_wlock *test_rlock;
00187
00188 V_Out = complex(V_Rated, 0);
00189
00190
00191
00192 double VInMag = V_Out.Mag() * PI / (3 * sqrt(6.0));
00193 voltage_out[0] = complex(VInMag,0);
00194 voltage_out[1] = complex(-VInMag/2, VInMag * sqrt(3.0) / 2);
00195 voltage_out[2] = complex(-VInMag/2, -VInMag * sqrt(3.0) / 2);
00196
00197
00198 switch(gen_mode_v){
00199 case SUPPLY_DRIVEN:
00200 {
00201
00202 complex S_A_In, S_B_In, S_C_In;
00203
00204
00205 S_A_In = voltage_out[0]*(~(current_out[0]));
00206 S_B_In = voltage_out[1]*(~(current_out[1]));
00207 S_C_In = voltage_out[2]*(~(current_out[2]));
00208
00209 power_out[0] = S_A_In.Re();
00210 power_out[1] = S_B_In.Re();
00211 power_out[2] = S_C_In.Re();
00212 VA_In = power_out[0] + power_out[1] + power_out[2];
00213
00214 VA_Out = VA_In * efficiency;
00215
00216 I_Out = ~(VA_Out / V_Out);
00217
00218
00219 pLine_I->setp<complex>(I_Out,*test_rlock);
00220
00221
00222 pCircuit_V->setp<complex>(V_Out,*test_rlock);
00223
00224 return TS_NEVER;
00225 }
00226 break;
00227 default:
00228 break;
00229
00230 return TS_NEVER;
00231
00232 }
00233 return TS_NEVER;
00234 }
00235
00236 TIMESTAMP rectifier::postsync(TIMESTAMP t0, TIMESTAMP t1)
00237 {
00238 return TS_NEVER;
00239 }
00240
00242
00244
00245 EXPORT int create_rectifier(OBJECT **obj, OBJECT *parent)
00246 {
00247 try
00248 {
00249 *obj = gl_create_object(rectifier::oclass);
00250 if (*obj!=NULL)
00251 {
00252 rectifier *my = OBJECTDATA(*obj,rectifier);
00253 gl_set_parent(*obj,parent);
00254 return my->create();
00255 }
00256 else
00257 return 0;
00258 }
00259 CREATE_CATCHALL(rectifier);
00260 }
00261
00262 EXPORT int init_rectifier(OBJECT *obj, OBJECT *parent)
00263 {
00264 try
00265 {
00266 if (obj!=NULL)
00267 return OBJECTDATA(obj,rectifier)->init(parent);
00268 else
00269 return 0;
00270 }
00271 INIT_CATCHALL(rectifier);
00272 }
00273
00274 EXPORT TIMESTAMP sync_rectifier(OBJECT *obj, TIMESTAMP t1, PASSCONFIG pass)
00275 {
00276 TIMESTAMP t2 = TS_NEVER;
00277 rectifier *my = OBJECTDATA(obj,rectifier);
00278 try
00279 {
00280 switch (pass) {
00281 case PC_PRETOPDOWN:
00282 t2 = my->presync(obj->clock,t1);
00283 break;
00284 case PC_BOTTOMUP:
00285 t2 = my->sync(obj->clock,t1);
00286 break;
00287 case PC_POSTTOPDOWN:
00288 t2 = my->postsync(obj->clock,t1);
00289 break;
00290 default:
00291 GL_THROW("invalid pass request (%d)", pass);
00292 break;
00293 }
00294 if (pass==clockpass)
00295 obj->clock = t1;
00296 }
00297 SYNC_CATCHALL(rectifier);
00298 return t2;
00299 }