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