00001
00009 #include <stdlib.h>
00010 #include <stdio.h>
00011 #include <errno.h>
00012 #include <math.h>
00013
00014 #include "capacitor.h"
00015
00017
00019 CLASS* capacitor::oclass = NULL;
00020 CLASS* capacitor::pclass = NULL;
00021 capacitor *capacitor::defaults = NULL;
00022
00029 capacitor::capacitor(MODULE *mod):node(mod)
00030 {
00031 if(oclass == NULL)
00032 {
00033 pclass = node::oclass;
00034
00035 oclass = gl_register_class(mod,"capacitor",PC_BOTTOMUP|PC_POSTTOPDOWN);
00036 if(oclass == NULL)
00037 GL_THROW("unable to register object class implemented by %s",__FILE__);
00038
00039 if(gl_publish_variable(oclass,
00040 PT_double,"sync_V_limit[V]",PADDR(sync_V_limit),
00041 PT_complex, "phaseA_V[V]", PADDR(phaseA_V),
00042 PT_complex, "phaseB_V[V]", PADDR(phaseB_V),
00043 PT_complex, "phaseC_V[V]", PADDR(phaseC_V),
00044 PT_set, "phases", PADDR(phases),
00045 PT_KEYWORD, "A",PHASE_A,
00046 PT_KEYWORD, "B",PHASE_B,
00047 PT_KEYWORD, "C",PHASE_C,
00048 PT_KEYWORD, "N",PHASE_N,
00049 PT_KEYWORD, "D",PHASE_D,
00050 PT_KEYWORD, "S",PHASE_S,
00051 PT_set, "pt_phase", PADDR(pt_phase),
00052 PT_KEYWORD, "A",PHASE_A,
00053 PT_KEYWORD, "B",PHASE_B,
00054 PT_KEYWORD, "C",PHASE_C,
00055 PT_enumeration, "switch", switch_state,
00056 PT_KEYWORD, "OPEN", OPEN,
00057 PT_KEYWORD, "CLOSED", CLOSED,
00058 PT_enumeration, "control", control,
00059 PT_KEYWORD, "MANUAL", MANUAL,
00060 PT_KEYWORD, "VAR", VAR,
00061 PT_KEYWORD, "VOLT", VOLT,
00062 PT_KEYWORD, "VARVOLT", VARVOLT,
00063 NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00064
00065
00066 memset(this,0,sizeof(capacitor));
00067 defaults = this;
00068 switch_state = CLOSED;
00069 control = MANUAL;
00070 var_close = 0.0;
00071 var_open = 0.0;
00072 volt_close = 0.0;
00073 volt_open = 0.0;
00074 pt_ratio = 60;
00075 pt_phase = PHASE_A;
00076 time_delay = 0;
00077 time_to_change = 0.0;
00078
00079 }
00080 }
00081
00082 int capacitor::create()
00083 {
00084 int result = node::create();
00085 memcpy(this,defaults,sizeof(capacitor));
00086 return result;
00087 }
00088
00089 TIMESTAMP capacitor::sync(TIMESTAMP t0)
00090 {
00091 if (switch_state==CLOSED) {
00092 switch (control) {
00093 case MANUAL:
00095 break;
00096 case VAR:
00098 break;
00099 case VOLT:
00101 break;
00102 case VARVOLT:
00104 break;
00105 default:
00106 break;
00107 }
00108 } else {
00109 switch (control) {
00110 case MANUAL:
00112 break;
00113 case VAR:
00115 break;
00116 case VOLT:
00118 break;
00119 case VARVOLT:
00121 break;
00122 default:
00123 break;
00124 }
00125 }
00126 return node::sync(t0);
00127 }
00128
00129 TIMESTAMP capacitor::postsync(TIMESTAMP t0)
00130 {
00131 return node::postsync(t0);
00132 }
00133
00134 int capacitor::isa(char *classname)
00135 {
00136 return strcmp(classname,"capacitor")==0 || node::isa(classname);
00137 }
00138
00140
00142
00150 EXPORT int create_capacitor(OBJECT **obj, OBJECT *parent)
00151 {
00152 try
00153 {
00154 *obj = gl_create_object(capacitor::oclass,sizeof(capacitor));
00155 if (*obj!=NULL)
00156 {
00157 capacitor *my = OBJECTDATA(*obj,capacitor);
00158 gl_set_parent(*obj,parent);
00159 return my->create();
00160 }
00161 }
00162 catch (char *msg)
00163 {
00164 gl_error("create_capacitor: %s", msg);
00165 }
00166 return 1;
00167 }
00168
00169
00170
00177 EXPORT int init_capacitor(OBJECT *obj)
00178 {
00179 capacitor *my = OBJECTDATA(obj,capacitor);
00180 try {
00181 return my->init(obj->parent);
00182 }
00183 catch (char *msg)
00184 {
00185 GL_THROW("%s (capacitor:%d): %s", my->get_name(), my->get_id(), msg);
00186 return 0;
00187 }
00188 }
00189
00197 EXPORT TIMESTAMP sync_capacitor(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00198 {
00199 capacitor *pObj = OBJECTDATA(obj,capacitor);
00200 try {
00201 TIMESTAMP t1 = TS_NEVER;
00202 switch (pass) {
00203 case PC_PRETOPDOWN:
00204 return pObj->presync(t0);
00205 case PC_BOTTOMUP:
00206 return pObj->sync(t0);
00207 case PC_POSTTOPDOWN:
00208 t1 = pObj->postsync(t0);
00209 obj->clock = t0;
00210 return t1;
00211 default:
00212 throw "invalid pass request";
00213 }
00214 } catch (const char *error) {
00215 GL_THROW("%s (capacitor:%d): %s", pObj->get_name(), pObj->get_id(), error);
00216 return 0;
00217 } catch (...) {
00218 GL_THROW("%s (capacitor:%d): %s", pObj->get_name(), pObj->get_id(), "unknown exception");
00219 return 0;
00220 }
00221 }
00222
00231 EXPORT int isa_capacitor(OBJECT *obj, char *classname)
00232 {
00233 return OBJECTDATA(obj,capacitor)->isa(classname);
00234 }
00235