You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

248 lines
11 KiB
C++

/*
* AlgorithmStop.cpp
*
* Author: Aleksey Gerasimenko
* gerasimenko.aleksey.n@gmail.com
*/
#include "SYSCTRL/AlgorithmStop.h"
namespace SYSCTRL
{
//CONSTRUCTOR
AlgorithmStop::AlgorithmStop(SYSCTRL::SystemEnvironment& env):
SYSCTRL::AlgorithmBase(),
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
#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
_execute_single_phase(m_env.phase_control.phase_a,
m_env.main_abc_orts.phase_a,
m_env.regulator_voltage_load_a_active,
m_env.regulator_voltage_load_a_reactive);
//
_execute_single_phase(m_env.phase_control.phase_b,
m_env.main_abc_orts.phase_b,
m_env.regulator_voltage_load_b_active,
m_env.regulator_voltage_load_b_reactive);
//
_execute_single_phase(m_env.phase_control.phase_c,
m_env.main_abc_orts.phase_c,
m_env.regulator_voltage_load_c_active,
m_env.regulator_voltage_load_c_reactive);
//
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
#pragma CODE_SECTION("ramfuncs");
inline void AlgorithmStop::_execute_single_phase(SYSCTRL::AlgorithmSinglePhaseControl& phase,
SYSCTRL::VectorOrthogonalProjection& orts,
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 * orts.active;
phase.reference.voltage_cell_jm = phase.reference.voltage_cell_ampl_jm * 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 */