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.

709 lines
19 KiB
C++

/*
* AlgorithmContext.cpp
*
* Author: Aleksey Gerasimenko
* gerasimenko.aleksey.n@gmail.com
*/
#include "SYSCTRL/AlgorithmContext.h"
namespace SYSCTRL
{
//CONSTRUCTOR
AlgorithmContext::AlgorithmContext(SYSCTRL::SystemEnvironment& env):
m_mode(SYSCTRL::AlgorithmContext::UNDEFINED),
m_algorithm(SYSCTRL::AlgorithmContext::UNKNOWN),
m_algorithm_previous(SYSCTRL::AlgorithmContext::UNKNOWN),
m_env(env),
m_algorithm_pointer(&m_off),
m_fault(env),
m_work(env),
m_stop(env),
m_start(env),
m_off(env),
m_source(env),
_strategy(&SYSCTRL::AlgorithmContext::_strategy_undef),
_set_fault(&SYSCTRL::AlgorithmContext::_set_empty_exe),
_set_work(&SYSCTRL::AlgorithmContext::_set_empty_exe),
_set_stop(&SYSCTRL::AlgorithmContext::_set_empty_exe),
_set_start(&SYSCTRL::AlgorithmContext::_set_empty_exe),
_set_off(&SYSCTRL::AlgorithmContext::_set_empty_exe),
_set_source(&SYSCTRL::AlgorithmContext::_set_empty_exe)
//
{}//CONSTRUCTOR
void AlgorithmContext::setup()
{
static bool status = true;
if(m_mode == SYSCTRL::AlgorithmContext::UNDEFINED)
{
m_algorithm = SYSCTRL::AlgorithmContext::UNKNOWN;
m_algorithm_previous = SYSCTRL::AlgorithmContext::UNKNOWN;
m_fault.setup();
m_work.setup();
m_stop.setup();
m_start.setup();
m_off.setup();
m_source.setup();
_strategy = &SYSCTRL::AlgorithmContext::_strategy_undef;
_set_fault = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_empty_exe;
if(status)
{
m_mode = SYSCTRL::AlgorithmContext::CONFIGURATE;
//
}//if
//
}//if
//
}//
//
void AlgorithmContext::configure()
{
static bool status = true;
if(m_mode == SYSCTRL::AlgorithmContext::CONFIGURATE)
{
_strategy = &SYSCTRL::AlgorithmContext::_strategy_off;
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
if(status)
{
m_algorithm = SYSCTRL::AlgorithmContext::OFF;
m_algorithm_previous = SYSCTRL::AlgorithmContext::OFF;
m_mode = SYSCTRL::AlgorithmContext::OPERATIONAL;
set_strategy_off();
set_off();
//
}//if
//
}//if
//
}//
//
SYSCTRL::AlgorithmContext::mode_t AlgorithmContext::get_mode()
{
return m_mode;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
SYSCTRL::AlgorithmContext::algorithm_t AlgorithmContext::get_algorithm()
{
return m_algorithm;
}//
//
bool AlgorithmContext::compare(const SYSCTRL::AlgorithmContext::mode_t mode)
{
return mode == m_mode;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
bool AlgorithmContext::compare_algorithm(const SYSCTRL::AlgorithmContext::algorithm_t algorithm)
{
return algorithm == m_algorithm;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::get_ref_invertor_voltage(float& volt_a, float& volt_b, float& volt_c)
{
m_algorithm_pointer->get_ref_invertor_voltage(volt_a, volt_b, volt_c);
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::strategy()
{
(this->*_strategy)();
//
}//
//
void AlgorithmContext::_strategy_undef()
{}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_strategy_fault()
{
if((!m_env.system_fault.boolbit.b0)&&(m_env.system_reset.boolbit.b0))
{
set_strategy_off();
set_off();
//
}//if
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_strategy_work()
{
if(m_env.system_fault.boolbit.b0)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_fault();
set_fault();
}
else
{
//
if(!m_env.enable_work.boolbit.b0)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_off();
set_off();
//
}else{
if((m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on)))
{
//m_env.reference_intensity_voltage_load_direct.set_output(m_env.voltage_load_active);
//m_env.reference_intensity_voltage_load_quadrature.set_output(m_env.voltage_load_reactive);
set_strategy_stop();
set_stop();
//
}//if
}
//
}//if else
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_strategy_stop()
{
if(m_env.system_fault.boolbit.b0)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_fault();
set_fault();
}
else
{
if(!m_env.enable_work.boolbit.b0 |
//(m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
//(m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on)
m_env.auxiliary_km2.state.signal.is_on
)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_off();
set_off();
//
}
//
}//if else
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_strategy_start()
{
if(m_env.system_fault.boolbit.b0)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_fault();
set_fault();
}
else
{
if(!m_env.enable_work.boolbit.b0)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_off();
set_off();
//
}
else
{
if((m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on))
)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_off();
set_off();
//
}//if
if(m_env.auxiliary_km2.state.signal.is_off)
{
//m_env.regulator_voltage_load_a.set_output(m_env.reference.start.voltage_a);
//m_env.regulator_voltage_load_b.set_output(m_env.reference.start.voltage_b);
//m_env.regulator_voltage_load_c.set_output(m_env.reference.start.voltage_c);
//
//m_env.current_regulator_active.reset();
//m_env.current_regulator_reactive.reset();
//
set_strategy_work();
set_work();
//
//set_strategy_stop();
//set_stop();
//
}//if
//
}//if else
//
}//if else
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_strategy_off()
{
if(m_env.system_fault.boolbit.b0)
{
set_strategy_fault();
set_fault();
}
else
{
if(m_env.enable_work_is_on.boolbit.b0)
{
set_strategy_start();
set_start();
//
//set_strategy_source();
//set_source();
//
//set_strategy_stop();
//set_stop();
//
}//if
//
}//if else
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_strategy_source()
{
if(m_env.system_fault.boolbit.b0)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_fault();
set_fault();
}
else
{
//
if((!m_env.enable_work.boolbit.b0) |
(m_env.local_remote.state.signal.is_off & m_env.remote_stop.state.signal.is_switched_on) |
((m_env.local_remote.state.signal.is_on & m_env.external_stop.signal.is_on))
)
{
m_env.enable_work_reset.boolbit.b0 = true;
set_strategy_off();
set_off();
//
}//if
//
}//if else
//
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_strategy_fault()
{
_strategy = &SYSCTRL::AlgorithmContext::_strategy_fault;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_strategy_work()
{
_strategy = &SYSCTRL::AlgorithmContext::_strategy_work;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_strategy_stop()
{
_strategy = &SYSCTRL::AlgorithmContext::_strategy_stop;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_strategy_start()
{
_strategy = &SYSCTRL::AlgorithmContext::_strategy_start;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_strategy_off()
{
_strategy = &SYSCTRL::AlgorithmContext::_strategy_off;
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_strategy_source()
{
_strategy = &SYSCTRL::AlgorithmContext::_strategy_source;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_fault()
{
(this->*_set_fault)();
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_work()
{
(this->*_set_work)();
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_stop()
{
(this->*_set_stop)();
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_start()
{
(this->*_set_start)();
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_off()
{
(this->*_set_off)();
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::set_source()
{
(this->*_set_source)();
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::execute()
{
m_algorithm_pointer->execute();
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_set_fault_exe()
{
//
m_algorithm_previous = m_algorithm;
m_algorithm = SYSCTRL::AlgorithmContext::FAULT;
//
_set_fault = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
//
m_env.timer_start.reset();
m_env.timer_stop.reset();
//
m_algorithm_pointer = &m_fault;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_set_work_exe()
{
//
m_algorithm_previous = m_algorithm;
m_algorithm = SYSCTRL::AlgorithmContext::WORK;
//
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
//
//
#if TYPECONTROL == VECTORCONTROL
//
m_env.regulator_voltage_load_direct.reset();
m_env.regulator_voltage_load_quadrature.reset();
//
m_env.integrator_direct.reset();
m_env.integrator_quadrature.reset();
//
m_env.regulator_current_limit.set_to_low_saturation();
m_env.regulator_current_pfc.reset();
//
#endif
#if TYPECONTROL == SCALARCONTROL
//
//m_env.regulator_dc_a.reset();
//m_env.regulator_dc_b.reset();
//m_env.regulator_dc_c.reset();
//
m_env.regulator_current_limit_a.set_to_high_saturation();
m_env.regulator_current_pfc_a.reset();
m_env.regulator_current_limit_b.set_to_high_saturation();
m_env.regulator_current_pfc_b.reset();
m_env.regulator_current_limit_c.set_to_high_saturation();
m_env.regulator_current_pfc_c.reset();
#if SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_ABC
m_env.regulator_voltage_load_a_active.reset();
m_env.regulator_voltage_load_a_reactive.reset();
m_env.regulator_voltage_load_b_active.reset();
m_env.regulator_voltage_load_b_reactive.reset();
m_env.regulator_voltage_load_c_active.reset();
m_env.regulator_voltage_load_c_reactive.reset();
#endif
#if SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_RMS
m_env.reference_voltage_load_rms_intensity.set_output(m_env.rms_voltage_load_module);
m_env.regulator_voltage_load_rms.reset();
#endif
//
#endif
#if TYPECONTROL == DIRECTREVERSECONTROL
m_env.drc_positive_voltage_controller_direct.reset();
m_env.drc_positive_voltage_controller_quadrature.reset();
m_env.drc_negative_voltage_controller_direct.reset();
m_env.drc_negative_voltage_controller_quadrature.reset();
//
m_env.drc_regulator_current_limit.set_to_low_saturation();
m_env.drc_regulator_current_pfc.reset();
m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_voltage_grid_direct);
m_work.reset_switcher();
//
#endif
//
m_env.timer_start.reset();
m_env.timer_stop.reset();
//
m_algorithm_pointer = &m_work;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_set_stop_exe()
{
//
m_algorithm_previous = m_algorithm;
m_algorithm = SYSCTRL::AlgorithmContext::STOP;
//
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
//
#if TYPECONTROL == VECTORCONTROL
m_env.reference_voltage_direct_intensity.set_output(m_env.regulator_current_limit.get_output());
#endif
#if TYPECONTROL == DIRECTREVERSECONTROL
//m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_voltage_grid_direct);
m_env.drc_reference_voltage_direct_intensity.set_output(m_env.drc_regulator_current_limit.get_output());
#endif
//
//
/* FOR DEBUG ONLY!!!! */
/*
m_env.regulator_voltage_load_a_active.reset();
m_env.regulator_voltage_load_a_reactive.reset();
m_env.regulator_voltage_load_b_active.reset();
m_env.regulator_voltage_load_b_reactive.reset();
m_env.regulator_voltage_load_c_active.reset();
m_env.regulator_voltage_load_c_reactive.reset();
*/
/* FOR DEBUG ONLY!!!! */
/* VECTOR CONTROL */
/*
m_env.regulator_voltage_load_direct.reset();
m_env.regulator_voltage_load_quadrature.reset();
//
m_env.integrator_direct.reset();
m_env.integrator_quadrature.reset();
*/
//
m_env.timer_start.reset();
m_env.timer_stop.start();
//
m_algorithm_pointer = &m_stop;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_set_start_exe()
{
//
m_algorithm_previous = m_algorithm;
m_algorithm = SYSCTRL::AlgorithmContext::START;
//
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
//
#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();
//
m_env.drc_positive_voltage_cell_direct = FP_ZERO;
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_positive_voltage_cell_alpha = FP_ZERO;
m_env.drc_positive_voltage_cell_beta = FP_ZERO;
m_env.drc_negative_voltage_cell_alpha = FP_ZERO;
m_env.drc_negative_voltage_cell_beta = FP_ZERO;
//
m_env.drc_positive_voltage_cell_a = FP_ZERO;
m_env.drc_positive_voltage_cell_b = FP_ZERO;
m_env.drc_positive_voltage_cell_c = 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;
//
#endif
//
m_env.timer_start.start();
m_env.timer_stop.reset();
//
m_algorithm_pointer = &m_start;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_set_off_exe()
{
//
m_algorithm_previous = m_algorithm;
m_algorithm = SYSCTRL::AlgorithmContext::OFF;
//
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_empty_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_source_exe;
//
m_env.timer_start.reset();
m_env.timer_stop.reset();
//
m_algorithm_pointer = &m_off;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void AlgorithmContext::_set_source_exe()
{
//
m_algorithm_previous = m_algorithm;
m_algorithm = SYSCTRL::AlgorithmContext::SOURCE;
//
_set_fault = &SYSCTRL::AlgorithmContext::_set_fault_exe;
_set_work = &SYSCTRL::AlgorithmContext::_set_work_exe;
_set_stop = &SYSCTRL::AlgorithmContext::_set_stop_exe;
_set_start = &SYSCTRL::AlgorithmContext::_set_start_exe;
_set_off = &SYSCTRL::AlgorithmContext::_set_off_exe;
_set_source = &SYSCTRL::AlgorithmContext::_set_empty_exe;
//
m_env.timer_start.reset();
m_env.timer_stop.reset();
//
m_algorithm_pointer = &m_source;
//
}//
//
void AlgorithmContext::_set_empty_exe()
{
//
}//
//
//
} /* namespace SYSCTRL */