00001
00009 #include <stdlib.h>
00010 #include <stdio.h>
00011 #include <errno.h>
00012 #include <math.h>
00013
00014 #include "energy_storage.h"
00015 #include "gridlabd.h"
00016
00017
00018
00019 #define HOUR 3600 * TS_SECOND
00020
00021 CLASS *energy_storage::oclass = NULL;
00022 energy_storage *energy_storage::defaults = NULL;
00023
00024 static PASSCONFIG passconfig = PC_BOTTOMUP|PC_POSTTOPDOWN;
00025 static PASSCONFIG clockpass = PC_BOTTOMUP;
00026
00027
00028 energy_storage::energy_storage(){};
00029
00030
00031
00032 energy_storage::energy_storage(MODULE *module)
00033 {
00034 if (oclass==NULL)
00035 {
00036 oclass = gl_register_class(module,"energy_storage",PC_PRETOPDOWN|PC_BOTTOMUP|PC_POSTTOPDOWN);
00037 if (oclass==NULL)
00038 GL_THROW("unable to register object class implemented by %s", __FILE__);
00039
00040 if (gl_publish_variable(oclass,
00041 PT_enumeration,"GENERATOR_MODE",PADDR(gen_mode_v),
00042 PT_KEYWORD,"UNKNOWN",UNKNOWN,
00043 PT_KEYWORD,"CONSTANT_V",CONSTANT_V,
00044 PT_KEYWORD,"CONSTANT_PQ",CONSTANT_PQ,
00045 PT_KEYWORD,"CONSTANT_PF",CONSTANT_PF,
00046 PT_KEYWORD,"SUPPLY_DRIVEN",SUPPLY_DRIVEN,
00047
00048 PT_enumeration,"GENERATOR_STATUS",PADDR(gen_status_v),
00049 PT_KEYWORD,"OFFLINE",OFFLINE,
00050 PT_KEYWORD,"ONLINE",ONLINE,
00051
00052 PT_enumeration,"POWER_TYPE",PADDR(power_type_v),
00053 PT_KEYWORD,"AC",AC,
00054 PT_KEYWORD,"DC",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",PHASE_A,
00080 PT_KEYWORD, "B",PHASE_B,
00081 PT_KEYWORD, "C",PHASE_C,
00082 PT_KEYWORD, "N",PHASE_N,
00083 PT_KEYWORD, "S",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
00106
00107
00108
00109
00110
00111
00112
00113
00114 int energy_storage::init(OBJECT *parent)
00115 {
00116
00117 gl_verbose("energy_storage init: about to exit");
00118 return 1;
00119 }
00120
00121
00122 double energy_storage::calculate_efficiency(complex voltage, complex current){
00123 return 1;
00124 }
00125
00126
00127 complex energy_storage::calculate_v_terminal(complex v, complex i){
00128 return v - (i * Rinternal);
00129 }
00130
00131
00132 complex *energy_storage::get_complex(OBJECT *obj, char *name)
00133 {
00134 PROPERTY *p = gl_get_property(obj,name);
00135 if (p==NULL || p->ptype!=PT_complex)
00136 return NULL;
00137 return (complex*)GETADDR(obj,p);
00138 }
00139
00140
00141
00142
00143
00144 TIMESTAMP energy_storage::presync(TIMESTAMP t0, TIMESTAMP t1)
00145 {
00146
00147 TIMESTAMP t2 = TS_NEVER;
00148
00149 return t2;
00150 }
00151
00152
00153 TIMESTAMP energy_storage::sync(TIMESTAMP t0, TIMESTAMP t1)
00154 {
00155
00156 return TS_NEVER;
00157 }
00158
00159
00160 TIMESTAMP energy_storage::postsync(TIMESTAMP t0, TIMESTAMP t1)
00161 {
00162 TIMESTAMP t2 = TS_NEVER;
00163
00164 return t2;
00165 }
00166
00168
00170
00171 EXPORT int create_energy_storage(OBJECT **obj, OBJECT *parent)
00172 {
00173 try
00174 {
00175 *obj = gl_create_object(energy_storage::oclass,sizeof(energy_storage));
00176 if (*obj!=NULL)
00177 {
00178 energy_storage *my = OBJECTDATA(*obj,energy_storage);
00179 gl_set_parent(*obj,parent);
00180 return my->create();
00181 }
00182 }
00183 catch (char *msg)
00184 {
00185 gl_error("create_energy_storage: %s", msg);
00186 }
00187 return 0;
00188 }
00189
00190 EXPORT int init_energy_storage(OBJECT *obj, OBJECT *parent)
00191 {
00192 try
00193 {
00194 if (obj!=NULL)
00195 return OBJECTDATA(obj,energy_storage)->init(parent);
00196 }
00197 catch (char *msg)
00198 {
00199 gl_error("init_energy_storage(obj=%d;%s): %s", obj->id, obj->name?obj->name:"unnamed", msg);
00200 }
00201 return 0;
00202 }
00203
00204 EXPORT TIMESTAMP sync_energy_storage(OBJECT *obj, TIMESTAMP t1, PASSCONFIG pass)
00205 {
00206 TIMESTAMP t2 = TS_NEVER;
00207 energy_storage *my = OBJECTDATA(obj,energy_storage);
00208 try
00209 {
00210 switch (pass) {
00211 case PC_PRETOPDOWN:
00212 t2 = my->presync(obj->clock,t1);
00213 break;
00214 case PC_BOTTOMUP:
00215 t2 = my->sync(obj->clock,t1);
00216 break;
00217 case PC_POSTTOPDOWN:
00218 t2 = my->postsync(obj->clock,t1);
00219 break;
00220 default:
00221 GL_THROW("invalid pass request (%d)", pass);
00222 break;
00223 }
00224 if (pass==clockpass)
00225 obj->clock = t1;
00226 }
00227 catch (char *msg)
00228 {
00229 gl_error("sync_energy_storage(obj=%d;%s): %s", obj->id, obj->name?obj->name:"unnamed", msg);
00230 }
00231 return t2;
00232 }