/* * AlgorithmStop.cpp * * Author: Aleksey Gerasimenko * gerasimenko.aleksey.n@gmail.com */ #include "SYSCTRL/AlgorithmStop.h" namespace SYSCTRL { //CONSTRUCTOR AlgorithmStop::AlgorithmStop(SYSCTRL::SystemEnvironment& env): SYSCTRL::AlgorithmBase(), #if ((TYPECONTROL == SCALARCONTROL)&&(SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_ABC)) m_orts(), #endif m_env(env), _execute(&SYSCTRL::AlgorithmStop::_execute_undef) // {}//CONSTRUCTOR // void AlgorithmStop::setup() { _execute = &SYSCTRL::AlgorithmStop::_execute_run; // }// #pragma CODE_SECTION("ramfuncs"); void AlgorithmStop::reset() { }// // #pragma CODE_SECTION("ramfuncs"); void AlgorithmStop::execute() { (this->*_execute)(); // }// // #if TYPECONTROL == VECTORCONTROL #pragma CODE_SECTION("ramfuncs"); void AlgorithmStop::_execute_run() { m_env.hardware.ref_control_order = ORDER_START; // m_env.timer_stop.execute(); // if(m_env.timer_stop.is_finished()){ // m_voltage_a = FP_ZERO; m_voltage_b = FP_ZERO; m_voltage_c = FP_ZERO; // }else{ // #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_PII m_env.voltage_reference_load_direct = m_env.reference_voltage_direct_intensity.execute(m_env.voltage_grid_direct); //m_env.voltage_reference_load_direct = 0.33333*(m_env.rms_voltage_input_a + m_env.rms_voltage_input_b + m_env.rms_voltage_input_c); //m_env.voltage_reference_load_quadrature = m_env.voltage_grid_quadrature; m_env.voltage_reference_load_quadrature = FP_ZERO; m_env.voltage_pi_reg_out_direct = m_env.regulator_voltage_load_direct.execute(m_env.voltage_reference_load_direct, m_env.voltage_load_direct); //m_env.voltage_pi_reg_out_quadrature = m_env.regulator_voltage_load_quadrature.execute(m_env.voltage_reference_load_quadrature, m_env.voltage_load_quadrature); m_env.voltage_pi_reg_out_quadrature = FP_ZERO; // m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_pi_reg_out_direct); //m_env.voltage_cell_quadrature = m_env.integrator_quadrature.execute(m_env.voltage_pi_reg_out_quadrature); m_env.voltage_cell_quadrature = FP_ZERO; #endif #if TYPE_VOLTAGE_CONTROLLER == VOLTAGE_CONTROLLER_I m_env.voltage_reference_load_direct = m_env.reference_voltage_direct_intensity.execute(m_env.voltage_grid_direct); m_env.voltage_reference_load_quadrature = FP_ZERO; m_env.voltage_cell_direct = m_env.integrator_direct.execute(m_env.voltage_reference_load_direct - m_env.voltage_load_direct); m_env.voltage_cell_quadrature = FP_ZERO; #endif // FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, m_env.main_ab_orts.reactive, m_env.voltage_cell_direct, m_env.voltage_cell_quadrature, m_env.voltage_cell_alpha, m_env.voltage_cell_beta); // FLTSYSLIB::Transformation::clarke_inverse(m_env.voltage_cell_alpha, m_env.voltage_cell_beta, m_env.voltage_cell_a, m_env.voltage_cell_b, m_env.voltage_cell_c); // m_voltage_a = m_env.voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; m_voltage_b = m_env.voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; m_voltage_c = m_env.voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; // }//if else // // }// #endif // #if ((TYPECONTROL == SCALARCONTROL)&&(SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_ABC)) #pragma CODE_SECTION("ramfuncs"); void AlgorithmStop::_execute_run() { m_env.hardware.ref_control_order = ORDER_START; // m_env.timer_stop.execute(); // // //reference constructor // m_env.phase_control.common_ref.voltage_rms_real = m_env.phase_control.common_ref.voltage_module_rms; //m_env.phase_control.common_ref.voltage_rms_jm = FP_ZERO; // m_env.phase_control.phase_a.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real; //m_env.phase_control.phase_a.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm; // m_env.phase_control.phase_a.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_a.reactive; // m_env.phase_control.phase_b.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real; //m_env.phase_control.phase_b.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm; // m_env.phase_control.phase_b.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_b.reactive; // m_env.phase_control.phase_c.reference.voltage_ampl_real_const = m_env.phase_control.common_ref.voltage_rms_real; //m_env.phase_control.phase_c.reference.voltage_ampl_jm_const = m_env.phase_control.common_ref.voltage_rms_jm; // m_env.phase_control.phase_c.reference.voltage_ampl_jm_const = m_env.projection_voltage_input_c.reactive; // //m_env.phase_control.phase_a.reference.voltage_ampl_real = m_env.phase_control.phase_a.reference.voltage_ampl_real_const; //m_env.phase_control.phase_a.reference.voltage_ampl_jm = m_env.phase_control.phase_a.reference.voltage_ampl_jm_const; //m_env.phase_control.phase_b.reference.voltage_ampl_real = m_env.phase_control.phase_b.reference.voltage_ampl_real_const; //m_env.phase_control.phase_b.reference.voltage_ampl_jm = m_env.phase_control.phase_b.reference.voltage_ampl_jm_const; //m_env.phase_control.phase_c.reference.voltage_ampl_real = m_env.phase_control.phase_c.reference.voltage_ampl_real_const; //m_env.phase_control.phase_c.reference.voltage_ampl_jm = m_env.phase_control.phase_c.reference.voltage_ampl_jm_const; m_env.phase_control.phase_a.reference.voltage_ampl_real = m_env.projection_voltage_input_a.active; m_env.phase_control.phase_a.reference.voltage_ampl_jm = m_env.projection_voltage_input_a.reactive; m_env.phase_control.phase_b.reference.voltage_ampl_real = m_env.projection_voltage_input_b.active; m_env.phase_control.phase_b.reference.voltage_ampl_jm = m_env.projection_voltage_input_b.reactive; m_env.phase_control.phase_c.reference.voltage_ampl_real = m_env.projection_voltage_input_c.active; m_env.phase_control.phase_c.reference.voltage_ampl_jm = m_env.projection_voltage_input_c.reactive; // //control execute #if TYPE_ORTS == TYPE_ORTS_NORMAL m_orts = m_env.main_abc_orts.phase_a; _execute_single_phase(m_env.phase_control.phase_a, m_env.regulator_voltage_load_a_active, m_env.regulator_voltage_load_a_reactive); // m_orts = m_env.main_abc_orts.phase_b; _execute_single_phase(m_env.phase_control.phase_b, m_env.regulator_voltage_load_b_active, m_env.regulator_voltage_load_b_reactive); // m_orts = m_env.main_abc_orts.phase_c; _execute_single_phase(m_env.phase_control.phase_c, m_env.regulator_voltage_load_c_active, m_env.regulator_voltage_load_c_reactive); // #endif #if TYPE_ORTS == TYPE_ORTS_BACK m_orts.active = m_env.main_abc_orts.phase_c.reactive; m_orts.reactive = -m_env.main_abc_orts.phase_c.active; _execute_single_phase(m_env.phase_control.phase_a, m_env.regulator_voltage_load_a_active, m_env.regulator_voltage_load_a_reactive); // m_orts.active = m_env.main_abc_orts.phase_a.reactive; m_orts.reactive = -m_env.main_abc_orts.phase_a.active; _execute_single_phase(m_env.phase_control.phase_b, m_env.regulator_voltage_load_b_active, m_env.regulator_voltage_load_b_reactive); // m_orts.active = m_env.main_abc_orts.phase_b.reactive; m_orts.reactive = -m_env.main_abc_orts.phase_b.active; _execute_single_phase(m_env.phase_control.phase_c, m_env.regulator_voltage_load_c_active, m_env.regulator_voltage_load_c_reactive); // #endif #if TYPE_ORTS == TYPE_ORTS_FORWARD m_orts.active = -m_env.main_abc_orts.phase_b.reactive; m_orts.reactive = m_env.main_abc_orts.phase_b.active; _execute_single_phase(m_env.phase_control.phase_a, m_env.regulator_voltage_load_a_active, m_env.regulator_voltage_load_a_reactive); // m_orts.active = -m_env.main_abc_orts.phase_c.reactive; m_orts.reactive = m_env.main_abc_orts.phase_c.active; _execute_single_phase(m_env.phase_control.phase_b, m_env.regulator_voltage_load_b_active, m_env.regulator_voltage_load_b_reactive); // m_orts.active = -m_env.main_abc_orts.phase_a.reactive; m_orts.reactive = m_env.main_abc_orts.phase_a.active; _execute_single_phase(m_env.phase_control.phase_c, m_env.regulator_voltage_load_c_active, m_env.regulator_voltage_load_c_reactive); // #endif if(m_env.timer_stop.is_finished()){ m_voltage_a = FP_ZERO; m_voltage_b = FP_ZERO; m_voltage_c = FP_ZERO; }else{ m_voltage_a = m_env.phase_control.phase_a.reference.voltage_cell_relative; m_voltage_b = m_env.phase_control.phase_b.reference.voltage_cell_relative; m_voltage_c = m_env.phase_control.phase_c.reference.voltage_cell_relative; } // }// #endif // #if ((TYPECONTROL == SCALARCONTROL)&&(SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_RMS)) #pragma CODE_SECTION("ramfuncs"); void AlgorithmStop::_execute_run() { m_env.hardware.ref_control_order = ORDER_START; // m_env.timer_stop.execute(); // m_env.phase_control.phase_a.reference.voltage_ampl_real = m_env.reference_voltage_load_rms_intensity.execute(m_env.rms_voltage_load_module); m_env.phase_control.phase_a.reference.voltage_cell_real = m_env.regulator_voltage_load_rms.execute(m_env.phase_control.phase_a.reference.voltage_ampl_real, m_env.rms_voltage_load_module); // #if TYPE_ORTS == TYPE_ORTS_NORMAL m_env.phase_control.phase_a.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * m_env.main_abc_orts.phase_a.active; m_env.phase_control.phase_b.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * m_env.main_abc_orts.phase_b.active; m_env.phase_control.phase_c.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * m_env.main_abc_orts.phase_c.active; #endif #if TYPE_ORTS == TYPE_ORTS_BACK m_env.phase_control.phase_a.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * m_env.main_abc_orts.phase_c.reactive; m_env.phase_control.phase_b.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * m_env.main_abc_orts.phase_a.reactive; m_env.phase_control.phase_c.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * m_env.main_abc_orts.phase_b.reactive; #endif #if TYPE_ORTS == TYPE_ORTS_FORWARD m_env.phase_control.phase_a.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * (-m_env.main_abc_orts.phase_b.reactive); m_env.phase_control.phase_b.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * (-m_env.main_abc_orts.phase_c.reactive); m_env.phase_control.phase_c.reference.voltage_cell = m_env.phase_control.phase_a.reference.voltage_cell_real * (-m_env.main_abc_orts.phase_a.reactive); #endif // m_env.phase_control.phase_a.reference.voltage_cell_relative = m_env.phase_control.phase_a.reference.voltage_cell * m_env.cell_dc_voltage_a_reciprocal; m_env.phase_control.phase_b.reference.voltage_cell_relative = m_env.phase_control.phase_b.reference.voltage_cell * m_env.cell_dc_voltage_b_reciprocal; m_env.phase_control.phase_c.reference.voltage_cell_relative = m_env.phase_control.phase_c.reference.voltage_cell * m_env.cell_dc_voltage_c_reciprocal; // if(m_env.timer_stop.is_finished()){ m_voltage_a = FP_ZERO; m_voltage_b = FP_ZERO; m_voltage_c = FP_ZERO; }else{ m_voltage_a = m_env.phase_control.phase_a.reference.voltage_cell_relative; m_voltage_b = m_env.phase_control.phase_b.reference.voltage_cell_relative; m_voltage_c = m_env.phase_control.phase_c.reference.voltage_cell_relative; } // }// #endif // // #if ((TYPECONTROL == SCALARCONTROL)&&(SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_ABC)) #pragma CODE_SECTION("ramfuncs"); inline void AlgorithmStop::_execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase, FLTSYSLIB::PIController& regulator_active, FLTSYSLIB::PIController& regulator_reactive) { phase.reference.voltage_cell_ampl_real = regulator_active.execute(phase.reference.voltage_ampl_real, phase.feedback.voltage_ampl_real); phase.reference.voltage_cell_ampl_jm = regulator_reactive.execute(phase.reference.voltage_ampl_jm, phase.feedback.voltage_ampl_jm); // phase.reference.voltage_cell_real = phase.reference.voltage_cell_ampl_real * m_orts.active; phase.reference.voltage_cell_jm = phase.reference.voltage_cell_ampl_jm * m_orts.reactive; phase.reference.voltage_cell = phase.reference.voltage_cell_real - phase.reference.voltage_cell_jm; // phase.reference.voltage_cell_relative = phase.reference.voltage_cell * phase.feedback.voltage_cell_dc_reciprocal; // }// #endif // #if TYPECONTROL == DIRECTREVERSECONTROL #pragma CODE_SECTION("ramfuncs"); void AlgorithmStop::_execute_run() { m_env.hardware.ref_control_order = ORDER_START; // m_env.timer_stop.execute(); // if(m_env.timer_stop.is_finished()){ // m_voltage_a = FP_ZERO; m_voltage_b = FP_ZERO; m_voltage_c = FP_ZERO; // }else{ // m_env.drc_voltage_reference_load_direct = m_env.drc_reference_voltage_direct_intensity.execute(m_env.drc_voltage_grid_direct); m_env.drc_voltage_reference_load_quadrature = FP_ZERO; // m_env.drc_positive_voltage_cell_direct = m_env.drc_positive_voltage_controller_direct.execute(m_env.drc_voltage_reference_load_direct, m_env.drc_positive_voltage_load_direct); m_env.drc_positive_voltage_cell_quadrature = FP_ZERO; m_env.drc_negative_voltage_cell_direct = FP_ZERO; m_env.drc_negative_voltage_cell_quadrature = FP_ZERO; m_env.drc_negative_voltage_cell_alpha = FP_ZERO; m_env.drc_negative_voltage_cell_beta = FP_ZERO; m_env.drc_negative_voltage_cell_a = FP_ZERO; m_env.drc_negative_voltage_cell_b = FP_ZERO; m_env.drc_negative_voltage_cell_c = FP_ZERO; // FLTSYSLIB::Transformation::park_inverse(m_env.main_ab_orts.active, m_env.main_ab_orts.reactive, m_env.drc_positive_voltage_cell_direct, m_env.drc_positive_voltage_cell_quadrature, m_env.drc_positive_voltage_cell_alpha, m_env.drc_positive_voltage_cell_beta); // FLTSYSLIB::Transformation::clarke_inverse(m_env.drc_positive_voltage_cell_alpha, m_env.drc_positive_voltage_cell_beta, m_env.drc_positive_voltage_cell_a, m_env.drc_positive_voltage_cell_b, m_env.drc_positive_voltage_cell_c); // m_env.drc_voltage_cell_a = m_env.drc_positive_voltage_cell_a; m_env.drc_voltage_cell_b = m_env.drc_positive_voltage_cell_b; m_env.drc_voltage_cell_c = m_env.drc_positive_voltage_cell_c; // m_voltage_a = m_env.drc_voltage_cell_a * m_env.cell_dc_voltage_a_reciprocal; m_voltage_b = m_env.drc_voltage_cell_b * m_env.cell_dc_voltage_b_reciprocal; m_voltage_c = m_env.drc_voltage_cell_c * m_env.cell_dc_voltage_c_reciprocal; // }//if else // }// #endif } /* namespace SYSCTRL */