00001
00010 #include <stdlib.h>
00011 #include <stdio.h>
00012 #include <errno.h>
00013 #include <math.h>
00014 #include "network.h"
00015
00016
00018
00020
00021 CLASS* meter::oclass = NULL;
00022 meter *meter::defaults = NULL;
00023 CLASS* meter::pclass = NULL;
00024
00025
00026 meter::meter(MODULE *mod) : node(mod)
00027 {
00028
00029 if (oclass==NULL)
00030 {
00031
00032 pclass = node::oclass;
00033
00034
00035 meter_class = oclass = gl_register_class(mod,"meter",sizeof(meter),PC_BOTTOMUP);
00036 if (oclass==NULL)
00037 GL_THROW("unable to register object class implemented by %s",__FILE__);
00038
00039
00040 if (gl_publish_variable(oclass,
00041 PT_enumeration,"type",PADDR(type),
00042 PT_KEYWORD,"MT_ONEPHASE",MT_ONEPHASE,
00043 PT_KEYWORD,"MT_THREEPHASE",MT_THREEPHASE,
00044 PT_complex, "demand[kW]", PADDR(demand),
00045 PT_complex, "meter[kWh]", PADDR(meterkWh),
00046 PT_complex, "line1_current[A]", PADDR(line1_current),
00047 PT_complex, "line2_current[A]", PADDR(line2_current),
00048 PT_complex, "line3_current[A]", PADDR(line3_current),
00049 PT_complex, "line1_admittance[1/Ohm]", PADDR(line1_admittance),
00050 PT_complex, "line2_admittance[1/Ohm]", PADDR(line2_admittance),
00051 PT_complex, "line3_admittance[1/Ohm]", PADDR(line3_admittance),
00052 PT_complex, "line1_power[S]", PADDR(line1_power),
00053 PT_complex, "line2_power[S]", PADDR(line2_power),
00054 PT_complex, "line3_power[S]", PADDR(line3_power),
00055 PT_complex, "line1_volts[V]", PADDR(V),
00056 PT_complex, "line2_volts[V]", PADDR(V),
00057 PT_complex, "line3_volts[V]", PADDR(V),
00058 NULL)<1) GL_THROW("unable to publish properties in %s",__FILE__);
00059
00060
00061 defaults = this;
00062 type = MT_ONEPHASE;
00063 demand = complex(0,0);
00064 meterkWh = complex(0,0);
00065 line1_current = complex(0,0);
00066 line2_current = complex(0,0);
00067 line3_current = complex(0,0);
00068 line1_admittance = complex(0,0);
00069 line2_admittance = complex(0,0);
00070 line3_admittance = complex(0,0);
00071 line1_power = complex(0,0);
00072 line2_power = complex(0,0);
00073 line3_power = complex(0,0);
00074 }
00075 }
00076
00077 int meter::create()
00078 {
00079
00080
00081
00082 int result = node::create();
00083 memcpy(this,defaults,sizeof(*this));
00084 return result;
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 return 1;
00101 }
00102
00103 int meter::init(OBJECT *parent)
00104 {
00105 return node::init(parent);
00106 }
00107
00108 TIMESTAMP meter::postsync(TIMESTAMP t0, TIMESTAMP t1)
00109 {
00110 switch (type) {
00111 case MT_ONEPHASE:
00112 S = line1_power + line3_power;
00113
00114 break;
00115 case MT_THREEPHASE:
00116 Ys += line1_admittance + line2_admittance + line3_admittance;
00117 YVs += line1_current + line2_current + line3_current;
00118 S = line1_power + line2_power + line3_power;
00119
00120 break;
00121 default:
00122 return TS_NEVER;
00123 }
00124 meterkWh = S * (double)((t1-t0)/TS_SECOND/3600);
00125 return node::postsync(t1);
00126 }
00127
00129
00131
00132
00133
00134 EXPORT int create_meter(OBJECT **obj, OBJECT *parent)
00135 {
00136 *obj = gl_create_object(meter_class);
00137 if (*obj!=NULL)
00138 {
00139 meter *my = OBJECTDATA(*obj,meter);
00140 gl_set_parent(*obj,parent);
00141 my->create();
00142 return 1;
00143 }
00144 return 0;
00145 }
00146
00147 EXPORT int init_meter(OBJECT *obj)
00148 {
00149 meter *my = OBJECTDATA(obj,meter);
00150 return my->init(obj->parent);
00151 }
00152
00153 EXPORT TIMESTAMP sync_meter(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00154 {
00155 TIMESTAMP t1 = OBJECTDATA(obj,meter)->postsync(obj->clock,t0);
00156 obj->clock = t0;
00157 return t1;
00158 }
00159
00160 EXPORT TIMESTAMP meter_isa(OBJECT *obj, char *type)
00161 {
00162 return strcmp(type,"meter")==0 || strcmp(type,"node")==0;
00163 }