00001
00010 #include <stdlib.h>
00011 #include <stdio.h>
00012 #include <errno.h>
00013 #include <math.h>
00014
00015 #include "energy_storage.h"
00016
00017 #define HOUR 3600 * TS_SECOND
00018
00019 CLASS *energy_storage::oclass = NULL;
00020 energy_storage *energy_storage::defaults = NULL;
00021
00022 static PASSCONFIG passconfig = PC_BOTTOMUP|PC_POSTTOPDOWN;
00023 static PASSCONFIG clockpass = PC_BOTTOMUP;
00024
00025
00026 energy_storage::energy_storage(){};
00027
00028
00029
00030 energy_storage::energy_storage(MODULE *module)
00031 {
00032 if (oclass==NULL)
00033 {
00034 oclass = gl_register_class(module,"energy_storage",sizeof(energy_storage),PC_PRETOPDOWN|PC_BOTTOMUP|PC_POSTTOPDOWN|PC_AUTOLOCK);
00035 if (oclass==NULL)
00036 throw "unable to register class energy_storage";
00037 else
00038 oclass->trl = TRL_PROOF;
00039
00040 if (gl_publish_variable(oclass,
00041 PT_enumeration,"generator_mode",PADDR(gen_mode_v),
00042 PT_KEYWORD,"UNKNOWN",(enumeration)UNKNOWN,
00043 PT_KEYWORD,"CONSTANT_V",(enumeration)CONSTANT_V,
00044 PT_KEYWORD,"CONSTANT_PQ",(enumeration)CONSTANT_PQ,
00045 PT_KEYWORD,"CONSTANT_PF",(enumeration)CONSTANT_PF,
00046 PT_KEYWORD,"SUPPLY_DRIVEN",(enumeration)SUPPLY_DRIVEN,
00047
00048 PT_enumeration,"generator_status",PADDR(gen_status_v),
00049 PT_KEYWORD,"OFFLINE",(enumeration)OFFLINE,
00050 PT_KEYWORD,"ONLINE",(enumeration)ONLINE,
00051
00052 PT_enumeration,"power_type",PADDR(power_type_v),
00053 PT_KEYWORD,"AC",(enumeration)AC,
00054 PT_KEYWORD,"DC",(enumeration)DC,
00055
00056
00057 PT_double, "Rinternal", PADDR(Rinternal),
00058 PT_double, "V_Max[V]", PADDR(V_Max),
00059 PT_complex, "I_Max[A]", PADDR(I_Max),
00060 PT_double, "E_Max", PADDR(E_Max),
00061 PT_double, "Energy",PADDR(Energy),
00062 PT_double, "efficiency", PADDR(efficiency),
00063
00064
00065 PT_double, "Rated_kVA[kVA]", PADDR(Rated_kVA),
00066 PT_complex, "V_Out[V]", PADDR(V_Out),
00067 PT_complex, "I_Out[A]", PADDR(I_Out),
00068 PT_complex, "VA_Out[VA]", PADDR(VA_Out),
00069 PT_complex, "V_In[V]", PADDR(V_In),
00070 PT_complex, "I_In[A]", PADDR(I_In),
00071 PT_complex, "V_Internal[V]", PADDR(V_Internal),
00072 PT_complex, "I_Internal[A]",PADDR(I_Internal),
00073 PT_complex, "I_Prev[A]", PADDR(I_Prev),
00074
00075
00076
00077 PT_set, "phases", PADDR(phases),
00078
00079 PT_KEYWORD, "A",(set)PHASE_A,
00080 PT_KEYWORD, "B",(set)PHASE_B,
00081 PT_KEYWORD, "C",(set)PHASE_C,
00082 PT_KEYWORD, "N",(set)PHASE_N,
00083 PT_KEYWORD, "S",(set)PHASE_S,
00084 NULL)<1) GL_THROW("unable to publish properties in %s",__FILE__);
00085 defaults = this;
00086
00087
00088
00089
00090 memset(this,0,sizeof(energy_storage));
00091
00092 }
00093 }
00094
00095
00096 int energy_storage::create(void)
00097 {
00098 memcpy(this,defaults,sizeof(*this));
00099
00100 return 1;
00101 }
00102
00103
00104
00105 int energy_storage::init(OBJECT *parent)
00106 {
00107
00108 gl_verbose("energy_storage init: about to exit");
00109 return 1;
00110 }
00111
00112
00113 double energy_storage::calculate_efficiency(complex voltage, complex current){
00114 return 1;
00115 }
00116
00117
00118 complex energy_storage::calculate_v_terminal(complex v, complex i){
00119 return v - (i * Rinternal);
00120 }
00121
00122
00123 TIMESTAMP energy_storage::presync(TIMESTAMP t0, TIMESTAMP t1)
00124 {
00125
00126 TIMESTAMP t2 = TS_NEVER;
00127
00128 return t2;
00129 }
00130
00131
00132 TIMESTAMP energy_storage::sync(TIMESTAMP t0, TIMESTAMP t1)
00133 {
00134
00135 return TS_NEVER;
00136 }
00137
00138
00139 TIMESTAMP energy_storage::postsync(TIMESTAMP t0, TIMESTAMP t1)
00140 {
00141 TIMESTAMP t2 = TS_NEVER;
00142
00143 return t2;
00144 }
00145
00147
00149
00150 EXPORT int create_energy_storage(OBJECT **obj, OBJECT *parent)
00151 {
00152 try
00153 {
00154 *obj = gl_create_object(energy_storage::oclass);
00155 if (*obj!=NULL)
00156 {
00157 energy_storage *my = OBJECTDATA(*obj,energy_storage);
00158 gl_set_parent(*obj,parent);
00159 return my->create();
00160 }
00161 else
00162 return 0;
00163 }
00164 CREATE_CATCHALL(energy_storage);
00165 }
00166
00167 EXPORT int init_energy_storage(OBJECT *obj, OBJECT *parent)
00168 {
00169 try
00170 {
00171 if (obj!=NULL)
00172 return OBJECTDATA(obj,energy_storage)->init(parent);
00173 else
00174 return 0;
00175 }
00176 INIT_CATCHALL(energy_storage);
00177 }
00178
00179 EXPORT TIMESTAMP sync_energy_storage(OBJECT *obj, TIMESTAMP t1, PASSCONFIG pass)
00180 {
00181 TIMESTAMP t2 = TS_NEVER;
00182 energy_storage *my = OBJECTDATA(obj,energy_storage);
00183 try
00184 {
00185 switch (pass) {
00186 case PC_PRETOPDOWN:
00187 t2 = my->presync(obj->clock,t1);
00188 break;
00189 case PC_BOTTOMUP:
00190 t2 = my->sync(obj->clock,t1);
00191 break;
00192 case PC_POSTTOPDOWN:
00193 t2 = my->postsync(obj->clock,t1);
00194 break;
00195 default:
00196 GL_THROW("invalid pass request (%d)", pass);
00197 break;
00198 }
00199 if (pass==clockpass)
00200 obj->clock = t1;
00201 }
00202 SYNC_CATCHALL(energy_storage);
00203 return t2;
00204 }