|
|
|
/*
|
|
|
|
* AlgoritmStart.cpp
|
|
|
|
*
|
|
|
|
* Author: Aleksey Gerasimenko
|
|
|
|
* gerasimenko.aleksey.n@gmail.com
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "SYSCTRL/AlgorithmStart.h"
|
|
|
|
|
|
|
|
namespace SYSCTRL
|
|
|
|
{
|
|
|
|
//CONSTRUCTOR
|
|
|
|
AlgorithmStart::AlgorithmStart(SYSCTRL::SystemEnvironment& env):
|
|
|
|
SYSCTRL::AlgorithmBase(),
|
|
|
|
m_env(env),
|
|
|
|
#if TYPECONTROL == VECTORCONTROL
|
|
|
|
m_reference_zero(FP_ZERO),
|
|
|
|
m_reference_current_cell_direct(FP_ZERO),
|
|
|
|
m_reference_current_cell_quadrature(FP_ZERO),
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
|
|
|
m_reference_zero(FP_ZERO),
|
|
|
|
m_reference_current_cell_direct(FP_ZERO),
|
|
|
|
m_reference_current_cell_quadrature(FP_ZERO),
|
|
|
|
#endif
|
|
|
|
_execute(&SYSCTRL::AlgorithmStart::_execute_undef)
|
|
|
|
{}//CONSTRUCTOR
|
|
|
|
//
|
|
|
|
void AlgorithmStart::setup()
|
|
|
|
{
|
|
|
|
_execute = &SYSCTRL::AlgorithmStart::_execute_run;
|
|
|
|
//
|
|
|
|
}//
|
|
|
|
#pragma CODE_SECTION("ramfuncs");
|
|
|
|
void AlgorithmStart::reset()
|
|
|
|
{
|
|
|
|
|
|
|
|
#if TYPECONTROL == VECTORCONTROL
|
|
|
|
//
|
|
|
|
m_env.regulator_current_load_direct.reset();
|
|
|
|
m_env.regulator_current_load_quadrature.reset();
|
|
|
|
//
|
|
|
|
m_env.referencer_current_bypass_direct.reset();
|
|
|
|
m_env.referencer_current_bypass_quadrature.reset();
|
|
|
|
//
|
|
|
|
#endif
|
|
|
|
#if TYPECONTROL == SCALARCONTROL
|
|
|
|
m_env.current_referencer_a_active.reset();
|
|
|
|
m_env.current_referencer_a_reactive.reset();
|
|
|
|
m_env.current_referencer_b_active.reset();
|
|
|
|
m_env.current_referencer_b_reactive.reset();
|
|
|
|
m_env.current_referencer_c_active.reset();
|
|
|
|
m_env.current_referencer_c_reactive.reset();
|
|
|
|
|
|
|
|
m_env.current_regulator_a_active.reset();
|
|
|
|
m_env.current_regulator_a_reactive.reset();
|
|
|
|
m_env.current_regulator_b_active.reset();
|
|
|
|
m_env.current_regulator_b_reactive.reset();
|
|
|
|
m_env.current_regulator_c_active.reset();
|
|
|
|
m_env.current_regulator_c_reactive.reset();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
|
|
|
//
|
|
|
|
m_env.drc_regulator_current_load_direct.reset();
|
|
|
|
m_env.drc_regulator_current_load_quadrature.reset();
|
|
|
|
//
|
|
|
|
m_env.drc_referencer_current_bypass_direct.reset();
|
|
|
|
m_env.drc_referencer_current_bypass_quadrature.reset();
|
|
|
|
//
|
|
|
|
#endif
|
|
|
|
|
|
|
|
m_voltage_a = FP_ZERO;
|
|
|
|
m_voltage_b = FP_ZERO;
|
|
|
|
m_voltage_c = FP_ZERO;
|
|
|
|
//
|
|
|
|
}//
|
|
|
|
//
|
|
|
|
#pragma CODE_SECTION("ramfuncs");
|
|
|
|
void AlgorithmStart::execute()
|
|
|
|
{
|
|
|
|
(this->*_execute)();
|
|
|
|
//
|
|
|
|
}//
|
|
|
|
//
|
|
|
|
#if TYPECONTROL == VECTORCONTROL
|
|
|
|
#pragma CODE_SECTION("ramfuncs");
|
|
|
|
void AlgorithmStart::_execute_run()
|
|
|
|
{
|
|
|
|
//
|
|
|
|
m_env.hardware.ref_control_order = ORDER_START;
|
|
|
|
//
|
|
|
|
m_env.timer_start.execute();
|
|
|
|
//
|
|
|
|
m_reference_current_cell_direct = m_env.referencer_current_bypass_direct.execute(m_reference_zero, m_env.current_bypass_direct);
|
|
|
|
m_reference_current_cell_quadrature = m_env.referencer_current_bypass_quadrature.execute(m_reference_zero, m_env.current_bypass_quadrature);
|
|
|
|
//
|
|
|
|
m_env.voltage_cell_direct = m_env.regulator_current_load_direct.execute(m_env.current_cell_direct, m_reference_current_cell_direct);
|
|
|
|
m_env.voltage_cell_quadrature = m_env.regulator_current_load_quadrature.execute(m_env.current_cell_quadrature, m_reference_current_cell_quadrature);
|
|
|
|
//
|
|
|
|
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;
|
|
|
|
//
|
|
|
|
}//
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if TYPECONTROL == SCALARCONTROL
|
|
|
|
#pragma CODE_SECTION("ramfuncs");
|
|
|
|
void AlgorithmStart::_execute_run()
|
|
|
|
{
|
|
|
|
//
|
|
|
|
m_env.hardware.ref_control_order = ORDER_START;
|
|
|
|
//
|
|
|
|
m_env.timer_start.execute();
|
|
|
|
|
|
|
|
//**** Phase A ***
|
|
|
|
//-reference constructor
|
|
|
|
//m_env.start_control.phase_a.reference.current_bypass_active = FP_ZERO;
|
|
|
|
//m_env.start_control.phase_a.reference.current_bypass_reactive = FP_ZERO;
|
|
|
|
//
|
|
|
|
m_env.start_control.phase_a.reference.current_bypass_active = m_env.start_control.common_ref.active;
|
|
|
|
m_env.start_control.phase_a.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive;
|
|
|
|
//
|
|
|
|
//m_env.start_control.phase_a.test_ref = m_env.start_control.common_ref;
|
|
|
|
|
|
|
|
//-feedback constructor
|
|
|
|
m_env.start_control.phase_a.feedback.current_bypass_active = m_env.projection_current_bypass_a.active;
|
|
|
|
m_env.start_control.phase_a.feedback.current_bypass_reactive = m_env.projection_current_bypass_a.reactive;
|
|
|
|
//
|
|
|
|
m_env.start_control.phase_a.feedback.current_cell_active = m_env.projection_current_cell_a.active;
|
|
|
|
m_env.start_control.phase_a.feedback.current_cell_reactive = m_env.projection_current_cell_a.reactive;
|
|
|
|
//
|
|
|
|
//-control
|
|
|
|
_execute_single_phase(m_env.start_control.phase_a,
|
|
|
|
m_env.main_abc_orts.phase_a,
|
|
|
|
m_env.cell_dc_voltage_a_reciprocal,
|
|
|
|
m_env.current_referencer_a_active,
|
|
|
|
m_env.current_referencer_a_reactive,
|
|
|
|
m_env.current_regulator_a_active,
|
|
|
|
m_env.current_regulator_a_reactive);
|
|
|
|
//<>
|
|
|
|
|
|
|
|
//**** Phase B ***
|
|
|
|
//-reference constructor
|
|
|
|
//m_env.start_control.phase_b.reference.current_bypass_active = FP_ZERO;
|
|
|
|
//m_env.start_control.phase_b.reference.current_bypass_reactive = FP_ZERO;
|
|
|
|
//
|
|
|
|
m_env.start_control.phase_b.reference.current_bypass_active = m_env.start_control.common_ref.active;
|
|
|
|
m_env.start_control.phase_b.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive;
|
|
|
|
//
|
|
|
|
//m_env.start_control.phase_b.test_ref = m_env.start_control.common_ref;
|
|
|
|
|
|
|
|
//-feedback constructor
|
|
|
|
m_env.start_control.phase_b.feedback.current_bypass_active = m_env.projection_current_bypass_b.active;
|
|
|
|
m_env.start_control.phase_b.feedback.current_bypass_reactive = m_env.projection_current_bypass_b.reactive;
|
|
|
|
//
|
|
|
|
m_env.start_control.phase_b.feedback.current_cell_active = m_env.projection_current_cell_b.active;
|
|
|
|
m_env.start_control.phase_b.feedback.current_cell_reactive = m_env.projection_current_cell_b.reactive;
|
|
|
|
//
|
|
|
|
//-control
|
|
|
|
_execute_single_phase(m_env.start_control.phase_b,
|
|
|
|
m_env.main_abc_orts.phase_b,
|
|
|
|
m_env.cell_dc_voltage_b_reciprocal,
|
|
|
|
m_env.current_referencer_b_active,
|
|
|
|
m_env.current_referencer_b_reactive,
|
|
|
|
m_env.current_regulator_b_active,
|
|
|
|
m_env.current_regulator_b_reactive);
|
|
|
|
//<>
|
|
|
|
|
|
|
|
|
|
|
|
//**** Phase C ***
|
|
|
|
//-reference constructor
|
|
|
|
//m_env.start_control.phase_c.reference.current_bypass_active = FP_ZERO;
|
|
|
|
//m_env.start_control.phase_c.reference.current_bypass_reactive = FP_ZERO;
|
|
|
|
//
|
|
|
|
m_env.start_control.phase_c.reference.current_bypass_active = m_env.start_control.common_ref.active;
|
|
|
|
m_env.start_control.phase_c.reference.current_bypass_reactive = m_env.start_control.common_ref.reactive;
|
|
|
|
//
|
|
|
|
//m_env.start_control.phase_c.test_ref = m_env.start_control.common_ref;
|
|
|
|
|
|
|
|
//-feedback constructor
|
|
|
|
m_env.start_control.phase_c.feedback.current_bypass_active = m_env.projection_current_bypass_c.active;
|
|
|
|
m_env.start_control.phase_c.feedback.current_bypass_reactive = m_env.projection_current_bypass_c.reactive;
|
|
|
|
//
|
|
|
|
m_env.start_control.phase_c.feedback.current_cell_active = m_env.projection_current_cell_c.active;
|
|
|
|
m_env.start_control.phase_c.feedback.current_cell_reactive = m_env.projection_current_cell_c.reactive;
|
|
|
|
//
|
|
|
|
//-control
|
|
|
|
_execute_single_phase(m_env.start_control.phase_c,
|
|
|
|
m_env.main_abc_orts.phase_c,
|
|
|
|
m_env.cell_dc_voltage_c_reciprocal,
|
|
|
|
m_env.current_referencer_c_active,
|
|
|
|
m_env.current_referencer_c_reactive,
|
|
|
|
m_env.current_regulator_c_active,
|
|
|
|
m_env.current_regulator_c_reactive);
|
|
|
|
//<>
|
|
|
|
|
|
|
|
m_voltage_a = m_env.start_control.phase_a.reference.voltage_cell_relative;
|
|
|
|
m_voltage_b = m_env.start_control.phase_b.reference.voltage_cell_relative;
|
|
|
|
m_voltage_c = m_env.start_control.phase_c.reference.voltage_cell_relative;
|
|
|
|
//
|
|
|
|
}//
|
|
|
|
#endif
|
|
|
|
//
|
|
|
|
#if TYPECONTROL == SCALARCONTROL
|
|
|
|
#pragma CODE_SECTION("ramfuncs");
|
|
|
|
inline void AlgorithmStart::_execute_single_phase(SYSCTRL::AlgorithmStartSinglePhaseControl& phase,
|
|
|
|
SYSCTRL::VectorOrthogonalProjection& orts,
|
|
|
|
float dc_voltage_reciprocal,
|
|
|
|
FLTSYSLIB::PIController& referencer_active,
|
|
|
|
FLTSYSLIB::PIController& referencer_reactive,
|
|
|
|
FLTSYSLIB::PIController& regulator_active,
|
|
|
|
FLTSYSLIB::PIController& regulator_reactive)
|
|
|
|
{
|
|
|
|
//
|
|
|
|
phase.reference.current_cell_active = referencer_active.execute(phase.reference.current_bypass_active, phase.feedback.current_bypass_active);
|
|
|
|
phase.reference.current_cell_reactive = referencer_reactive.execute(phase.reference.current_bypass_reactive, phase.feedback.current_bypass_reactive);
|
|
|
|
//
|
|
|
|
phase.reference.voltage_cell_ampl_active = regulator_active.execute(phase.feedback.current_cell_active, phase.reference.current_cell_active);
|
|
|
|
phase.reference.voltage_cell_ampl_reactive = regulator_reactive.execute(phase.feedback.current_cell_reactive, phase.reference.current_cell_reactive);
|
|
|
|
//
|
|
|
|
//phase.reference.voltage_cell_ampl_active = regulator_active.execute(phase.feedback.current_cell_active, phase.test_ref.active);
|
|
|
|
//phase.reference.voltage_cell_ampl_reactive = regulator_reactive.execute(phase.feedback.current_cell_reactive, phase.test_ref.reactive);
|
|
|
|
//
|
|
|
|
phase.reference.voltage_cell_active = phase.reference.voltage_cell_ampl_active * orts.active;
|
|
|
|
phase.reference.voltage_cell_reactive = phase.reference.voltage_cell_ampl_reactive * orts.reactive;
|
|
|
|
//
|
|
|
|
phase.reference.voltage_cell = phase.reference.voltage_cell_active - phase.reference.voltage_cell_reactive;
|
|
|
|
phase.reference.voltage_cell_relative = phase.reference.voltage_cell * dc_voltage_reciprocal;
|
|
|
|
//
|
|
|
|
}//
|
|
|
|
#endif
|
|
|
|
//
|
|
|
|
#if TYPECONTROL == DIRECTREVERSECONTROL
|
|
|
|
#pragma CODE_SECTION("ramfuncs");
|
|
|
|
void AlgorithmStart::_execute_run()
|
|
|
|
{
|
|
|
|
//
|
|
|
|
m_env.hardware.ref_control_order = ORDER_START;
|
|
|
|
//
|
|
|
|
m_env.timer_start.execute();
|
|
|
|
//
|
|
|
|
m_reference_current_cell_direct = m_env.drc_referencer_current_bypass_direct.execute(m_reference_zero, m_env.drc_current_bypass_direct);
|
|
|
|
m_reference_current_cell_quadrature = m_env.drc_referencer_current_bypass_quadrature.execute(m_reference_zero, m_env.drc_current_bypass_quadrature);
|
|
|
|
//
|
|
|
|
m_env.drc_positive_voltage_cell_direct = m_env.drc_regulator_current_load_direct.execute(m_env.drc_current_cell_direct, m_reference_current_cell_direct);
|
|
|
|
m_env.drc_positive_voltage_cell_quadrature = m_env.drc_regulator_current_load_quadrature.execute(m_env.drc_current_cell_quadrature, m_reference_current_cell_quadrature);
|
|
|
|
//
|
|
|
|
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;
|
|
|
|
|
|
|
|
}//
|
|
|
|
//
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
} /* namespace SYSCTRL */
|