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 CLASS* fuse::oclass = NULL;
00020 CLASS* fuse::pclass = NULL;
00021 fuse *fuse::defaults = NULL;
00022
00023 fuse::fuse(MODULE *mod) : link(mod)
00024 {
00025
00026 if (oclass==NULL)
00027 {
00028
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
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
00049 defaults = this;
00050 Y = 100;
00051 TimeConstant = 1.0;
00052 SetCurrent = 1000;
00053 SetBase = 0.05;
00054 SetScale = 4.0;
00055 SetCurve = 2;
00056 TresetAvg = 3600*4;
00057 TresetStd = 3600;
00058 State = FS_GOOD;
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;
00077 if (M>1)
00078 {
00079 double t = TimeConstant * (SetBase+SetScale/(pow(M,SetCurve)-1));
00080 TIMESTAMP t1 = Tstate + (TIMESTAMP)(t*TS_SECOND);
00081 if (t1<=t0)
00082 {
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
00089 {
00090 Tstate = t1;
00091 return t1;
00092 }
00093 }
00094 else if (M<=1)
00095 {
00097 Tstate = t0;
00098 return TS_NEVER;
00099 }
00100 break;
00101 case FS_BLOWN:
00102 Y=0;
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
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