network/fuse.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 // fuse CLASS FUNCTIONS
00019 CLASS* fuse::oclass = NULL;
00020 CLASS* fuse::pclass = NULL;
00021 fuse *fuse::defaults = NULL;
00022 
00023 fuse::fuse(MODULE *mod) : link(mod)
00024 {
00025     // first time init
00026     if (oclass==NULL)
00027     {
00028         // register the class definition
00029         fuse_class = oclass = gl_register_class(mod,"fuse",PC_BOTTOMUP);
00030         if (oclass==NULL)
00031             GL_THROW("unable to register object class implemented by %s",__FILE__);
00032 
00033         // publish the class properties
00034         if (gl_publish_variable(oclass,
00035             PT_double, "TimeConstant", PADDR(TimeConstant),
00036             PT_double, "SetCurrent", PADDR(SetCurrent),
00037             PT_double, "SetBase", PADDR(SetBase),
00038             PT_double, "SetScale", PADDR(SetScale),
00039             PT_double, "SetCurve", PADDR(SetCurve),
00040             PT_double, "TresetAvg", PADDR(TresetAvg),
00041             PT_double, "TresetStd", PADDR(TresetStd),
00042             PT_enumeration,"State",PADDR(State),
00043                 PT_KEYWORD,"FS_GOOD",FS_GOOD,
00044                 PT_KEYWORD,"FS_BLOWN",FS_BLOWN,
00045                 PT_KEYWORD,"FS_FAULT",FS_FAULT,
00046             NULL)<1) GL_THROW("unable to publish properties in %s",__FILE__);
00047 
00048         // setup the default values
00049         defaults = this;
00050         Y = 100;            // no effective resistance
00051         TimeConstant = 1.0; // equivalent to SEL551 TimeDial setting
00052         SetCurrent = 1000;  // amps above which fusing occurs
00053         SetBase = 0.05;     // roughly like a SEL551 U3 relay
00054         SetScale = 4.0;     // roughly like a SEL551 U3 relay
00055         SetCurve = 2;       // roughly like a SEL551 U3 relay
00056         TresetAvg = 3600*4; // about 4 hours avg
00057         TresetStd = 3600;   // about 1 hours stdev
00058         State = FS_GOOD;    // fuse state
00059     }
00060 }
00061 
00062 int fuse::create() 
00063 {
00064     int result = link::create();
00065     memcpy(this,defaults,sizeof(*this));
00066     return result;
00067 }
00068 
00069 TIMESTAMP fuse::sync(TIMESTAMP t0) 
00070 {
00071     link::sync(t0);
00072 
00073     double M = I.Mag()/SetCurrent;
00074     switch (State) {
00075     case FS_GOOD:
00076         Y=100; // fuse is good
00077         if (M>1)
00078         {   // compute fuse time
00079             double t = TimeConstant * (SetBase+SetScale/(pow(M,SetCurve)-1));
00080             TIMESTAMP t1 = Tstate + (TIMESTAMP)(t*TS_SECOND);
00081             if (t1<=t0)
00082             {   // fuse blows now
00083                 State=FS_BLOWN;
00084                 Tstate = t0;
00085                 Treset = t0 + (TIMESTAMP)(gl_random_normal(TresetAvg,TresetStd)*TS_SECOND);
00086                 return TS_NEVER;
00087             }
00088             else // fuse blows soon
00089             {
00090                 Tstate = t1;
00091                 return t1;
00092             }
00093         }
00094         else if (M<=1)
00095         {   // fuse doesn't blow; reset timer
00097             Tstate = t0;
00098             return TS_NEVER;
00099         }
00100         break;
00101     case FS_BLOWN:
00102         Y=0; // fuse is gone
00103         if (Treset<=t0)
00104         {
00105             Tstate = t0;
00106             State = FS_GOOD;
00107         }
00108         break;
00109     case FS_FAULT:
00110         break;
00111     default:
00112         break;
00113     }
00114 
00115     return TS_NEVER;
00116 }
00117 
00119 // IMPLEMENTATION OF CORE LINKAGE: fuse
00121 
00122 EXPORT int create_fuse(OBJECT **obj, OBJECT *parent)
00123 {
00124     *obj = gl_create_object(fuse_class,sizeof(fuse));
00125     if (*obj!=NULL)
00126     {
00127         fuse *my = OBJECTDATA(*obj,fuse);
00128         gl_set_parent(*obj,parent);
00129         my->create();
00130         return 1;
00131     }
00132     return 0;
00133 }
00134 
00135 EXPORT TIMESTAMP sync_fuse(OBJECT *obj, TIMESTAMP t0)
00136 {
00137     TIMESTAMP t1 = OBJECTDATA(obj,fuse)->sync(t0);
00138     obj->clock = t0;
00139     return t1;
00140 }
00141 
00142 

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