00001
00009 #ifndef _inverter_H
00010 #define _inverter_H
00011
00012 #include <utility>
00013 #include <vector>
00014 #include <string>
00015 #include <stdarg.h>
00016
00017 #include "generators.h"
00018
00019 EXPORT STATUS preupdate_inverter(OBJECT *obj,TIMESTAMP t0, unsigned int64 delta_time);
00020 EXPORT SIMULATIONMODE interupdate_inverter(OBJECT *obj, unsigned int64 delta_time, unsigned long dt, unsigned int iteration_count_val);
00021 EXPORT STATUS postupdate_inverter(OBJECT *obj, complex *useful_value, unsigned int mode_pass);
00022 EXPORT STATUS inverter_NR_current_injection_update(OBJECT *obj);
00023
00024
00025 typedef struct {
00026 double P_Out[3];
00027 double Q_Out[3];
00028 double ed[3];
00029 double eq[3];
00030 double ded[3];
00031 double deq[3];
00032 double md[3];
00033 double mq[3];
00034 double dmd[3];
00035 double dmq[3];
00036 complex Idq[3];
00037 complex Iac[3];
00038
00039
00040 double V_StateVal[3];
00041 double dV_StateVal[3];
00042 double e_source_mag[3];
00043
00044
00045 double f_mea_delayed;
00046 double df_mea_delayed;
00047
00048
00049 double V_mea_delayed[3];
00050 double dV_mea_delayed[3];
00051
00052
00053 double p_mea_delayed;
00054 double dp_mea_delayed;
00055
00056
00057 double q_mea_delayed;
00058 double dq_mea_delayed;
00059
00060
00061 double fmax_ini_StateVal;
00062 double dfmax_ini_StateVal;
00063 double fmax_StateVal;
00064
00065
00066 double fmin_ini_StateVal;
00067 double dfmin_ini_StateVal;
00068 double fmin_StateVal;
00069
00070 } INV_STATE;
00071
00072
00073 typedef struct {
00074 complex error[3];
00075 complex mod_vals[3];
00076 complex integrator_vals[3];
00077 complex derror[3];
00078 complex current_vals_ref[3];
00079 complex current_vals[3];
00080 complex current_set_raw[3];
00081 complex current_set[3];
00082 double reference_angle[3];
00083 double max_error_val;
00084 double phase_Pref;
00085 double phase_Qref;
00086 double I_in;
00087 } PID_INV_VARS;
00088
00089
00090 class inverter: public gld_object
00091 {
00092 private:
00093 bool deltamode_inclusive;
00094 bool first_sync_delta_enabled;
00095 char first_iter_counter;
00096 INV_STATE pred_state;
00097 INV_STATE next_state;
00098 bool first_run;
00099
00100 gld_property *pIGenerated[3];
00101 complex generator_admittance[3][3];
00102 complex prev_VA_out[3];
00103 complex curr_VA_out[3];
00104 complex value_IGenerated[3];
00105 double Pref_prev;
00106 double Qref_prev[3];
00107
00108 protected:
00109
00110 public:
00111
00112 int32 number_of_phases_out;
00113
00114
00115 set phases;
00116 enum GENERATOR_MODE {CONSTANT_V=1, CONSTANT_PQ=2, CONSTANT_PF=4, SUPPLY_DRIVEN=5};
00117 enumeration gen_mode_v;
00118
00119 INV_STATE curr_state;
00120 enum INVERTER_TYPE {TWO_PULSE=0, SIX_PULSE=1, TWELVE_PULSE=2, PWM=3, FOUR_QUADRANT = 4};
00121 enumeration inverter_type_v;
00122 enum GENERATOR_STATUS {OFFLINE=1, ONLINE=2};
00123 enum DYNAMIC_MODE {PID_CONTROLLER=0, PI_CONTROLLER=1};
00124 enumeration inverter_dyn_mode;
00125 enumeration gen_status_v;
00126
00127 complex V_In;
00128 double Vdc;
00129 complex I_In;
00130 complex VA_In;
00131
00132 double efficiency;
00133
00134 enum PF_REG {INCLUDED=1, EXCLUDED=2, INCLUDED_ALT=3} pf_reg;
00135 enum PF_REG_STATUS {REGULATING = 1, IDLING = 2} pf_reg_status;
00136 enum LOAD_FOLLOW_STATUS {IDLE=0, DISCHARGE=1, CHARGE=2} load_follow_status;
00137
00138 complex VA_Out;
00139 complex VA_Out_past;
00140 double P_Out;
00141 double Q_Out;
00142 double p_in;
00143 double b_soc;
00144 double soc_reserve;
00145 double p_rated;
00146 double bp_rated;
00147 double f_nominal;
00148 double inv_eta;
00149 double V_Set_A;
00150 double V_Set_B;
00151 double V_Set_C;
00152 double margin;
00153 complex I_out_prev;
00154 complex I_step_max;
00155 double C_Storage_In;
00156 double power_factor;
00157 double P_Out_t0;
00158 double Q_Out_t0;
00159 double power_factor_t0;
00160
00161 complex V_In_Set_A;
00162 complex V_In_Set_B;
00163 complex V_In_Set_C;
00164 double output_frequency;
00165
00166 double pCircuit_V_Avg;
00167
00168
00169 double kpd;
00170 double kpq;
00171 double kid;
00172 double kiq;
00173 double kdd;
00174 double kdq;
00175 PID_INV_VARS prev_PID_state;
00176 PID_INV_VARS curr_PID_state;
00177
00178 double Pref;
00179 double Qref;
00180 double Qref_PI[3];
00181
00182 double Tfreq_delay;
00183 double freq_ref;
00184 double Pref0;
00185 bool inverter_droop_fp;
00186 double R_fp;
00187 double kppmax;
00188 double kipmax;
00189 double Pmax;
00190 double Pmin;
00191
00192 double Tvol_delay;
00193 double V_ref[3];
00194 double Qref0[3];
00195 bool inverter_droop_vq;
00196 double R_vq;
00197
00198 enumeration VSI_bustype;
00199
00200
00201 enum VSI_MODE {VSI_ISOCHRONOUS=0, VSI_DROOP=1};
00202 enumeration VSI_mode;
00203 double VSI_freq;
00204
00205 double Zbase;
00206 double Rfilter;
00207 double Xfilter;
00208 double V_angle_past[3];
00209 double V_angle[3];
00210 double V_mag_ref[3];
00211 double V_mag[3];
00212 complex e_source[3];
00213 double Tp_delay;
00214 double Tq_delay;
00215
00216 bool checkRampRate_real;
00217 double rampUpRate_real;
00218 double rampDownRate_real;
00219 bool checkRampRate_reactive;
00220 double rampUpRate_reactive;
00221 double rampDownRate_reactive;
00222
00223 complex phaseA_I_Out_prev;
00224 complex phaseB_I_Out_prev;
00225 complex phaseC_I_Out_prev;
00226
00227 complex phaseA_V_Out;
00228 complex phaseB_V_Out;
00229 complex phaseC_V_Out;
00230 complex phaseA_I_Out;
00231 complex phaseB_I_Out;
00232 complex phaseC_I_Out;
00233 complex power_val[3];
00234 complex p_clip_A;
00235 complex p_clip_B;
00236 complex p_clip_C;
00237 complex last_current[4];
00238 complex last_power[4];
00239 bool islanded;
00240
00241
00242 bool use_multipoint_efficiency;
00243 double p_max;
00244 double p_dco;
00245 double v_dco;
00246 double p_so;
00247 double c_o;
00248 double c_1;
00249 double c_2;
00250 double c_3;
00251 double C1;
00252 double C2;
00253 double C3;
00254 enum INVERTER_MANUFACTURER {NONE=0,FRONIUS=1,SMA=2,XANTREX=3};
00255 enumeration inverter_manufacturer;
00256
00257
00258 enum FOUR_QUADRANT_CONTROL_MODE {FQM_NONE=0,FQM_CONSTANT_PQ=1,FQM_CONSTANT_PF=2,FQM_CONSTANT_V=3,FQM_VOLT_VAR=4,FQM_LOAD_FOLLOWING=5, FQM_GENERIC_DROOP=6, FQM_GROUP_LF=7, FQM_VOLT_VAR_FREQ_PWR=8, FQM_VSI = 9, FQM_VOLT_WATT=10};
00259 enumeration four_quadrant_control_mode;
00260
00261 double excess_input_power;
00262
00263
00264 OBJECT *sense_object;
00265 double max_charge_rate;
00266 double max_discharge_rate;
00267 double charge_on_threshold;
00268 double charge_off_threshold;
00269 double discharge_on_threshold;
00270 double discharge_off_threshold;
00271 double charge_lockout_time;
00272 double discharge_lockout_time;
00273
00274
00275 double pf_reg_activate;
00276 double pf_reg_deactivate;
00277
00278
00279 double pf_target_var;
00280 double pf_reg_high;
00281 double pf_reg_low;
00282
00283 double pf_reg_activate_lockout_time;
00284
00285
00286 double charge_threshold;
00287 double discharge_threshold;
00288 double group_max_charge_rate;
00289 double group_max_discharge_rate;
00290 double group_rated_power;
00291
00292 double inverter_convergence_criterion;
00293
00294
00295 double V_base;
00296 double V1;
00297 double V2;
00298 double V3;
00299 double V4;
00300 double Q1;
00301 double Q2;
00302 double Q3;
00303 double Q4;
00304 double m12;
00305 double b12;
00306 double m23;
00307 double b23;
00308 double m34;
00309 double b34;
00310 double getVar(double volt, double m, double b);
00311 double vv_lockout;
00312 TIMESTAMP allowed_vv_action;
00313 TIMESTAMP last_vv_check;
00314 bool vv_operation;
00315
00316
00317 double VW_V1;
00318 double VW_V2;
00319 double VW_P1;
00320 double VW_P2;
00321
00322
00323 bool enable_1547_compliance;
00324 double reconnect_time;
00325 bool inverter_1547_status;
00326
00327 enum IEEE_1547_STATUS {IEEE_NONE=0, IEEE1547=1, IEEE1547A=2};
00328 enumeration ieee_1547_version;
00329
00330
00331 double over_freq_high_band_setpoint;
00332 double over_freq_high_band_delay;
00333 double over_freq_high_band_viol_time;
00334 double over_freq_low_band_setpoint;
00335 double over_freq_low_band_delay;
00336 double over_freq_low_band_viol_time;
00337 double under_freq_high_band_setpoint;
00338 double under_freq_high_band_delay;
00339 double under_freq_high_band_viol_time;
00340 double under_freq_low_band_setpoint;
00341 double under_freq_low_band_delay;
00342 double under_freq_low_band_viol_time;
00343
00344
00345 double under_voltage_lowest_voltage_setpoint;
00346 double under_voltage_middle_voltage_setpoint;
00347 double under_voltage_high_voltage_setpoint;
00348 double over_voltage_low_setpoint;
00349 double over_voltage_high_setpoint;
00350 double under_voltage_lowest_delay;
00351 double under_voltage_middle_delay;
00352 double under_voltage_high_delay;
00353 double over_voltage_low_delay;
00354 double over_voltage_high_delay;
00355 double under_voltage_lowest_viol_time;
00356 double under_voltage_middle_viol_time;
00357 double under_voltage_high_viol_time;
00358 double over_voltage_low_viol_time;
00359 double over_voltage_high_viol_time;
00360
00361 typedef enum {
00362 IEEE_1547_NONE=0,
00363 IEEE_1547_HIGH_OF=1,
00364 IEEE_1547_LOW_OF=2,
00365 IEEE_1547_HIGH_UF=3,
00366 IEEE_1547_LOW_UF=4,
00367 IEEE_1547_LOWEST_UV=5,
00368 IEEE_1547_MIDDLE_UV=6,
00369 IEEE_1547_HIGH_UV=7,
00370 IEEE_1547_LOW_OV=8,
00371 IEEE_1547_HIGH_OV=9
00372 };
00373
00374 enumeration ieee_1547_trip_method;
00375
00376
00377 bool disable_volt_var_if_no_input_power;
00378 double delay_time;
00379 double max_var_slew_rate;
00380 double max_pwr_slew_rate;
00381 char volt_var_sched[1024];
00382 char freq_pwr_sched[1024];
00383 std::vector<std::pair<double,double> > VoltVArSched;
00384 std::vector<std::pair<double,double> > freq_pwrSched;
00385 private:
00386
00387 bool parent_is_a_meter;
00388 bool parent_is_triplex;
00389
00390 gld_property *pCircuit_V[3];
00391 gld_property *pLine_I[3];
00392 gld_property *pLine_unrotI[3];
00393 gld_property *pPower[3];
00394 gld_property *pLine12;
00395 gld_property *pPower12;
00396 gld_property *pMeterStatus;
00397
00398
00399 complex value_Circuit_V[3];
00400 complex value_Line_I[3];
00401 complex value_Line_unrotI[3];
00402 complex value_Power[3];
00403 complex value_Line12;
00404 complex value_Power12;
00405 enumeration value_MeterStatus;
00406 complex value_Meter_I[3];
00407
00408
00409 bool phaseAOut;
00410 bool phaseBOut;
00411 bool phaseCOut;
00412 double Max_P;
00413 double Max_Q;
00414 double Rated_kVA;
00415 double Rated_kV;
00416
00417
00418 FUNCTIONADDR powerCalc;
00419 bool sense_is_link;
00420 gld_property *sense_power;
00421 double lf_dispatch_power;
00422 TIMESTAMP next_update_time;
00423 bool lf_dispatch_change_allowed;
00424
00425
00426 bool pf_reg_dispatch_change_allowed;
00427 double pf_reg_dispatch_VAR;
00428 TIMESTAMP pf_reg_next_update_time;
00429
00430 TIMESTAMP prev_time;
00431 double prev_time_dbl;
00432 double event_deltat;
00433
00434 TIMESTAMP start_time;
00435
00436 complex last_I_Out[3];
00437 complex I_Out[3];
00438 double last_I_In;
00439
00440
00441 double pa_vw_limited;
00442 double pb_vw_limited;
00443 double pc_vw_limited;
00444 double VW_m;
00445
00446
00447 double out_of_violation_time_total;
00448 gld_property *pFrequency;
00449 double value_Frequency;
00450 double node_nominal_voltage;
00451 double ieee_1547_double;
00452
00453
00454 gld_property *mapped_freq_variable;
00455
00456 gld_property *pbus_full_Y_mat;
00457 gld_property *pGenerated;
00458
00459
00460 bool VSI_esource_init;
00461
00462 double ki_Vterminal;
00463 double kp_Vterminal;
00464 double V_set_droop;
00465
00466 void update_control_references(void);
00467 STATUS initalize_IEEE_1547_checks(OBJECT *parent);
00468
00469
00470 gld_property *map_complex_value(OBJECT *obj, char *name);
00471 gld_property *map_double_value(OBJECT *obj, char *name);
00472 void pull_complex_powerflow_values(void);
00473 void reset_complex_powerflow_accumulators(void);
00474 void push_complex_powerflow_values(void);
00475
00476 double lin_eq_volt(double volt, double m, double b);
00477 public:
00478
00479 inverter(MODULE *module);
00480 int create(void);
00481 int init(OBJECT *parent);
00482 TIMESTAMP presync(TIMESTAMP t0, TIMESTAMP t1);
00483 TIMESTAMP sync(TIMESTAMP t0, TIMESTAMP t1);
00484 TIMESTAMP postsync(TIMESTAMP t0, TIMESTAMP t1);
00485 STATUS pre_deltaupdate(TIMESTAMP t0, unsigned int64 delta_time);
00486 SIMULATIONMODE inter_deltaupdate(unsigned int64 delta_time, unsigned long dt, unsigned int iteration_count_val);
00487 STATUS post_deltaupdate(complex *useful_value, unsigned int mode_pass);
00488 double perform_1547_checks(double timestepvalue);
00489 STATUS updateCurrInjection();
00490 complex check_VA_Out(complex temp_VA, double p_max);
00491 double getEff(double val);
00492 public:
00493 static CLASS *oclass;
00494 static inverter *defaults;
00495 static CLASS *plcass;
00496 complex complex_exp(double angle);
00497 STATUS init_PI_dynamics(INV_STATE *curr_time);
00498 STATUS init_PID_dynamics(void);
00499 #ifdef OPTIONAL
00500 static CLASS *pclass;
00501 TIMESTAMPP plc(TIMESTAMP t0, TIMESTAMP t1);
00502 #endif
00503 };
00504
00505 #endif
00506