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