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