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