network/meter.cpp

00001 
00009 #include <stdlib.h>
00010 #include <stdio.h>
00011 #include <errno.h>
00012 #include <math.h>
00013 #include "network.h"
00014 
00015 
00017 // meter CLASS FUNCTIONS
00019 
00020 CLASS* meter::oclass = NULL;
00021 meter *meter::defaults = NULL;
00022 CLASS* meter::pclass = NULL;
00023 //CLASS *meter_class = NULL;
00024 
00025 meter::meter(MODULE *mod) : node(mod)
00026 {
00027     // first time init
00028     if (oclass==NULL)
00029     {
00030         // link to parent class (used by isa)
00031         pclass = node::oclass;
00032 
00033         // register the class definition
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         // publish the class properties
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         // setup the default values
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     //node::create();
00079     //node::type = PQ;
00080 
00081     int result = node::create();
00082     memcpy(this,defaults,sizeof(*this));
00083     return result;
00084 
00085 /*
00086     type = MT_ONEPHASE;
00087     demand_kW = complex(0,0);
00088     meter_kWh = complex(0,0);
00089     line1_A = complex(0,0);
00090     line2_A = complex(0,0);
00091     line3_A = complex(0,0);
00092     line1_Y = complex(0,0);
00093     line2_Y = complex(0,0);
00094     line3_Y = complex(0,0);
00095     line1_S = complex(0,0);
00096     line2_S = complex(0,0);
00097     line3_S = complex(0,0);
00098 */
00099     return 1;
00100 }
00101 // Initialize a distribution meter, return 1 on success
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         //S = V*(line1_A + line3_A);
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         //S = V*(line1_A + line2_A + line3_A);
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 // IMPLEMENTATION OF CORE LINKAGE: meter
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 }

GridLAB-DTM Version 1.0
An open-source project initiated by the US Department of Energy