00001
00009 #include <stdlib.h>
00010 #include <stdio.h>
00011 #include <errno.h>
00012 #include <math.h>
00013
00014 #include "node.h"
00015
00016 CLASS* triplex_node::oclass = NULL;
00017 CLASS* triplex_node::pclass = NULL;
00018 triplex_node *triplex_node::defaults = NULL;
00019
00020 triplex_node::triplex_node(MODULE *mod):load(mod)
00021 {
00022 if(oclass == NULL)
00023 {
00024 pclass = load::oclass;
00025
00026 oclass = gl_register_class(mod,"triplex_node",PC_BOTTOMUP|PC_POSTTOPDOWN);
00027 if(oclass == NULL)
00028 GL_THROW("unable to register object class implemented by %s",__FILE__);
00029
00030 if(gl_publish_variable(oclass,
00031 PT_double,"sync_V_limit[V]",PADDR(sync_V_limit),
00032 PT_complex, "line1_voltage[V]", PADDR(phaseA_V),
00033 PT_complex, "line2_voltage[V]", PADDR(phaseB_V),
00034 PT_complex, "lineN_voltage[V]", PADDR(phaseC_V),
00035 PT_set, "phases", PADDR(phases),
00036 PT_KEYWORD, "A",PHASE_A,
00037 PT_KEYWORD, "B",PHASE_B,
00038 PT_KEYWORD, "C",PHASE_C,
00039 PT_KEYWORD, "N",PHASE_N,
00040 PT_KEYWORD, "S",PHASE_S,
00041 NULL) < 1) GL_THROW("unable to publish properties in %s",__FILE__);
00042
00043
00044 memset(this,0,sizeof(triplex_node));
00045 defaults = this;
00046 }
00047 }
00048
00049 int triplex_node::isa(char *classname)
00050 {
00051 return strcmp(classname,"triplex_node")==0 || node::isa(classname);
00052 }
00053
00054 int triplex_node::init(OBJECT *parent)
00055 {
00056 return load::init(parent);
00057 }
00058
00059 int triplex_node::create(void)
00060 {
00061 int result = load::create();
00062 memcpy(this,defaults,sizeof(triplex_node));
00063 return result;
00064 }
00065
00066 TIMESTAMP triplex_node::sync(TIMESTAMP t0)
00067 {
00068 return load::sync(t0);
00069 }
00070
00071 TIMESTAMP triplex_node::postsync(TIMESTAMP t0)
00072 {
00073 return load::postsync(t0);
00074 }
00075
00077
00079
00087 EXPORT int create_triplex_node(OBJECT **obj, OBJECT *parent)
00088 {
00089 try
00090 {
00091 *obj = gl_create_object(triplex_node::oclass,sizeof(triplex_node));
00092 if (*obj!=NULL)
00093 {
00094 triplex_node *my = OBJECTDATA(*obj,triplex_node);
00095 gl_set_parent(*obj,parent);
00096 return my->create();
00097 }
00098 }
00099 catch (char *msg)
00100 {
00101 gl_error("create_triplex_node: %s", msg);
00102 }
00103 return 1;
00104 }
00105
00112 EXPORT int init_triplex_node(OBJECT *obj)
00113 {
00114 triplex_node *my = OBJECTDATA(obj,triplex_node);
00115 try {
00116 return my->init();
00117 }
00118 catch (char *msg)
00119 {
00120 GL_THROW("%s (triplex_node:%d): %s", my->get_name(), my->get_id(), msg);
00121 return 0;
00122 }
00123 }
00124
00132 EXPORT TIMESTAMP sync_triplex_node(OBJECT *obj, TIMESTAMP t0, PASSCONFIG pass)
00133 {
00134 triplex_node *pObj = OBJECTDATA(obj,triplex_node);
00135 try {
00136 if (pass==PC_BOTTOMUP)
00137 return pObj->sync(t0);
00138 else if (pass==PC_POSTTOPDOWN)
00139 {
00140 TIMESTAMP t1 = pObj->postsync(t0);
00141 obj->clock = t0;
00142 return t1;
00143 }
00144 else
00145 throw "invalid pass request";
00146 } catch (const char *error) {
00147 GL_THROW("%s (%s:%d): %s", pObj->get_name(), pObj->get_id(), error);
00148 return 0;
00149 } catch (...) {
00150 GL_THROW("%s (%s:%d): %s", pObj->get_name(), pObj->get_id(), "unknown exception");
00151 return 0;
00152 }
00153 }
00154
00155 EXPORT int isa_triplex_node(OBJECT *obj, char *classname)
00156 {
00157 return OBJECTDATA(obj,triplex_node)->isa(classname);
00158 }
00159