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.

493 lines
22 KiB
C++

/*
* SystemControlMethods.cpp
*
* Author: Aleksey Gerasimenko
* gerasimenko.aleksey.n@gmail.com
*/
#include "SYSCTRL/SystemControl.h"
namespace SYSCTRL
{
#pragma CODE_SECTION("ramfuncs");
void SystemControl::process_analog_input(AnalogInput& analog_input)
{
m_environment.analog_input = analog_input;
m_environment.adc_voltage_grid_a = (float)m_environment.analog_input.analog_input_channel_1004 - m_environment.offset_voltage_grid_static_a;
m_environment.adc_voltage_grid_b = (float)m_environment.analog_input.analog_input_channel_1002 - m_environment.offset_voltage_grid_static_b;
m_environment.adc_voltage_grid_c = (float)m_environment.analog_input.analog_input_channel_1003 - m_environment.offset_voltage_grid_static_c;
//
m_environment.adc_current_input_a = (float)m_environment.analog_input.analog_input_channel_1001 - m_environment.offset_current_input_static_a;
m_environment.adc_current_input_b = (float)m_environment.analog_input.analog_input_channel_1005 - m_environment.offset_current_input_static_b;
m_environment.adc_current_input_c = (float)m_environment.analog_input.analog_input_channel_1007 - m_environment.offset_current_input_static_c;
//
m_environment.adc_current_cell_a = (float)m_environment.analog_input.analog_input_channel_1010 - m_environment.offset_current_cell_static_a;
m_environment.adc_current_cell_b = (float)m_environment.analog_input.analog_input_channel_1011 - m_environment.offset_current_cell_static_b;
m_environment.adc_current_cell_c = (float)m_environment.analog_input.analog_input_channel_1012 - m_environment.offset_current_cell_static_c;
//
m_environment.adc_voltage_load_a = (float)m_environment.analog_input.analog_input_channel_1016 - m_environment.offset_voltage_load_static_a;
m_environment.adc_voltage_load_b = (float)m_environment.analog_input.analog_input_channel_1017 - m_environment.offset_voltage_load_static_b;
m_environment.adc_voltage_load_c = (float)m_environment.analog_input.analog_input_channel_1018 - m_environment.offset_voltage_load_static_c;
//
m_environment.adc_current_load_a = (float)m_environment.analog_input.analog_input_channel_1013 - m_environment.offset_current_load_static_a;
m_environment.adc_current_load_b = (float)m_environment.analog_input.analog_input_channel_1014 - m_environment.offset_current_load_static_b;
m_environment.adc_current_load_c = (float)m_environment.analog_input.analog_input_channel_1015 - m_environment.offset_current_load_static_c;
//
m_environment.adc_current_bypass_a = (float)m_environment.analog_input.analog_input_channel_1006 - m_environment.offset_current_bypass_static_a;
m_environment.adc_current_bypass_b = (float)m_environment.analog_input.analog_input_channel_1008 - m_environment.offset_current_bypass_static_b;
m_environment.adc_current_bypass_c = (float)m_environment.analog_input.analog_input_channel_1009 - m_environment.offset_current_bypass_static_c;
//<>
m_environment.voltage_grid_a = m_environment.scale_voltage_grid_a * (m_environment.adc_voltage_grid_a - m_environment.offset_voltage_grid_a);
m_environment.voltage_grid_b = m_environment.scale_voltage_grid_b * (m_environment.adc_voltage_grid_b - m_environment.offset_voltage_grid_b);
m_environment.voltage_grid_c = m_environment.scale_voltage_grid_c * (m_environment.adc_voltage_grid_c - m_environment.offset_voltage_grid_c);
//
m_environment.current_input_a = m_environment.scale_current_input_a * (m_environment.adc_current_input_a - m_environment.offset_current_input_a);
m_environment.current_input_b = m_environment.scale_current_input_b * (m_environment.adc_current_input_b - m_environment.offset_current_input_b);
m_environment.current_input_c = m_environment.scale_current_input_c * (m_environment.adc_current_input_c - m_environment.offset_current_input_c);
//
m_environment.current_bypass_a = m_environment.scale_current_bypass_a * (m_environment.adc_current_bypass_a - m_environment.offset_current_bypass_a);
m_environment.current_bypass_b = m_environment.scale_current_bypass_b * (m_environment.adc_current_bypass_b - m_environment.offset_current_bypass_b);
m_environment.current_bypass_c = m_environment.scale_current_bypass_c * (m_environment.adc_current_bypass_c - m_environment.offset_current_bypass_c);
//
m_environment.current_cell_a = m_environment.scale_current_cell_a * (m_environment.adc_current_cell_a - m_environment.offset_current_cell_a);
m_environment.current_cell_b = m_environment.scale_current_cell_b * (m_environment.adc_current_cell_b - m_environment.offset_current_cell_b);
m_environment.current_cell_c = m_environment.scale_current_cell_c * (m_environment.adc_current_cell_c - m_environment.offset_current_cell_c);
//
m_environment.voltage_load_a = m_environment.scale_voltage_load_a * (m_environment.adc_voltage_load_a - m_environment.offset_voltage_load_a);
m_environment.voltage_load_b = m_environment.scale_voltage_load_b * (m_environment.adc_voltage_load_b - m_environment.offset_voltage_load_b);
m_environment.voltage_load_c = m_environment.scale_voltage_load_c * (m_environment.adc_voltage_load_c - m_environment.offset_voltage_load_c);
//
m_environment.current_load_a = m_environment.scale_current_load_a * (m_environment.adc_current_load_a - m_environment.offset_current_load_a);
m_environment.current_load_b = m_environment.scale_current_load_b * (m_environment.adc_current_load_b - m_environment.offset_current_load_b);
m_environment.current_load_c = m_environment.scale_current_load_c * (m_environment.adc_current_load_c - m_environment.offset_current_load_c);
//<>
//
// m_environment.m_rms_voltage_input_max = fmaxf(m_environment.m_rms_voltage_input_a, m_environment.m_rms_voltage_input_b);
// m_environment.m_rms_voltage_input_max = fmaxf(m_environment.m_rms_voltage_input_max, m_environment.m_rms_voltage_input_c);
// m_environment.m_rms_voltage_input_min = fminf(m_environment.m_rms_voltage_input_a, m_environment.m_rms_voltage_input_b);
// m_environment.m_rms_voltage_input_min = fminf(m_environment.m_rms_voltage_input_min, m_environment.m_rms_voltage_input_c);
// m_environment.m_rms_voltage_input_avr = (0.333333)*(m_environment.m_rms_voltage_input_a + m_environment.m_rms_voltage_input_b + m_environment.m_rms_voltage_input_c);
//
}//process_analog_input()
#pragma CODE_SECTION("ramfuncs");
void SystemControl::process_digital_input(DigitalInput& digital_input)
{
//m_environment.input_discrete.digital.all = digital_input.all;
m_environment.digital_input.all = digital_input.all;
// FOR DEBUG ONLY!!!!!!!
//m_environment.digital_input.bits.DI_3016 = m_km1_external_command_trigger.getOUT();
// FOR DEBUG ONLY!!!!!!!
//m_environment.digital_input.bits.DI_3017 = m_km3_external_command_trigger.getOUT();
// FOR DEBUG ONLY!!!!!!!
//m_environment.digital_input.bits.DI_3005 = m_q1_external_command_trigger.getOUT();
//m_environment.digital_input.bits.DI_3005 = m_environment.digital_input_debug.bits.DI_3005;
//m_environment.input_discrete.signal.auxiliary_q1 = m_environment.digital_input_debug.bits.DI_3005;
// FOR DEBUG ONLY!!!!!!!
//m_environment.input_discrete.digital.all = m_environment.digital_input_debug.all;
//m_environment.digital_input.all = m_environment.digital_input_debug.all;
//
// DIGITAL INPUTS
//
m_environment.remote_start.execute(!digital_input.bits.DI_3001); //3001
m_environment.remote_stop.execute(!digital_input.bits.DI_3002); //3002
m_environment.remote_reset.execute(!digital_input.bits.DI_3003); //3003
m_environment.remote_e_stop.execute(!digital_input.bits.DI_3004); //3004
m_environment.auxiliary_q1.execute(!digital_input.bits.DI_3005); //3005
// m_environment.auxiliary_q1.execute(m_q1_control_trigger.signal.quit); //3005
// m_environment.bypass_ready.execute(!digital_input.bits.DI_3006); //3006
m_environment.transformer_inv_over_temperature_alarm.execute(!digital_input.bits.DI_3007); //3007
m_environment.local_e_stop.execute(!digital_input.bits.DI_3008); //3008
m_environment.cabinet_door_interlocked.execute(digital_input.bits.DI_3009); //3009
m_environment.arc_and_fire.execute(!digital_input.bits.DI_3010);//3010
// m_environment.hw_dvr_ready.execute(!digital_input.bits.DI_3011); //3011
// m_environment.auxiliary_km2.execute(!digital_input.bits.DI_3012); //3012
m_environment.auxiliary_km2.execute(m_km2_control_trigger.signal.quit); //3012
// m_environment.auxiliary_km11.execute(!digital_input.bits.DI_3013); //3013
m_environment.transformer_t_over_temperature_fault.execute(!digital_input.bits.DI_3014);//3014
m_environment.control_power_supply_status.execute(!digital_input.bits.DI_3015);//3015
// m_environment.auxiliary_km1.execute(!digital_input.bits.DI_3016); //3016
m_environment.auxiliary_km1.execute(m_km1_control_trigger.signal.quit); //3016
// m_environment.auxiliary_km3.execute(!digital_input.bits.DI_3017); //3017
m_environment.auxiliary_km3.execute(m_km3_control_trigger.signal.quit); //3017
m_environment.transformer_inv_over_temperature_fault.execute(!digital_input.bits.DI_3018); //3018
m_environment.fan_fault.execute(!digital_input.bits.DI_3019); //3019
m_environment.local_remote.execute(digital_input.bits.DI_3020); //3020 1-Local, 0-Remote
//
// DIGITAL INPUTS cleaned from noise
m_environment.input_discrete.field.DI_3001 = m_environment.remote_start.state.signal.is_on; //3001
m_environment.input_discrete.field.DI_3002 = m_environment.remote_stop.state.signal.is_on; //3002
m_environment.input_discrete.field.DI_3003 = m_environment.remote_reset.state.signal.is_on; //3003
m_environment.input_discrete.field.DI_3004 = m_environment.remote_e_stop.state.signal.is_on; //3004
m_environment.input_discrete.field.DI_3005 = m_environment.auxiliary_q1.state.signal.is_on; //3005
m_environment.input_discrete.field.DI_3006 = m_environment.bypass_ready.state.signal.is_on; //3006
m_environment.input_discrete.field.DI_3007 = m_environment.transformer_inv_over_temperature_alarm.state.signal.is_on; //3007
m_environment.input_discrete.field.DI_3008 = m_environment.local_e_stop.state.signal.is_on; //3008
m_environment.input_discrete.field.DI_3009 = m_environment.cabinet_door_interlocked.state.signal.is_on; //3009
m_environment.input_discrete.field.DI_3010 = m_environment.arc_and_fire.state.signal.is_on;//3010
m_environment.input_discrete.field.DI_3011 = m_environment.hw_dvr_ready.state.signal.is_on; //3011
m_environment.input_discrete.field.DI_3012 = m_environment.auxiliary_km2.state.signal.is_on; //3012
m_environment.input_discrete.field.DI_3013 = m_environment.auxiliary_km11.state.signal.is_on; //3013
m_environment.input_discrete.field.DI_3014 = m_environment.transformer_t_over_temperature_fault.state.signal.is_on;//3014
m_environment.input_discrete.field.DI_3015 = m_environment.control_power_supply_status.state.signal.is_on;//3015
m_environment.input_discrete.field.DI_3016 = m_environment.auxiliary_km1.state.signal.is_on; //3016
m_environment.input_discrete.field.DI_3017 = m_environment.auxiliary_km3.state.signal.is_on; //3017
m_environment.input_discrete.field.DI_3018 = m_environment.transformer_inv_over_temperature_fault.state.signal.is_on; //3018
m_environment.input_discrete.field.DI_3019 = m_environment.fan_fault.state.signal.is_on; //3019
m_environment.input_discrete.field.DI_3020 = m_environment.local_remote.state.signal.is_on; //3020 1-Local, 0-Remote
//<>
// FOR DEBUG ONLY!!!!!!!
//m_environment.input_discrete.all = m_environment.digital_input_debug.all;
//
// Contactor Fault Control
//
m_q1_control_fault.execute(m_q1_control_trigger.signal.quit & m_environment.input_discrete.signal.hw_dvr_ready,
m_environment.input_discrete.signal.auxiliary_q1 & m_environment.input_discrete.signal.hw_dvr_ready);
m_km1_control_fault.execute(m_km1_control_trigger.signal.quit & m_environment.input_discrete.signal.hw_dvr_ready,
m_environment.auxiliary_km1.state.signal.is_on & m_environment.input_discrete.signal.hw_dvr_ready);
m_km2_control_fault.execute(m_km2_control_trigger.signal.quit & m_environment.input_discrete.signal.hw_dvr_ready,
m_environment.auxiliary_km2.state.signal.is_on & m_environment.input_discrete.signal.hw_dvr_ready);
m_km3_control_fault.execute(m_km3_control_trigger.signal.quit & m_environment.input_discrete.signal.hw_dvr_ready,
m_environment.auxiliary_km3.state.signal.is_on & m_environment.input_discrete.signal.hw_dvr_ready);
//<>
//
// Fan Control
//
m_environment.fan_control.execute(m_environment.auxiliary_q1.state.signal.is_switched_on, m_environment.auxiliary_q1.state.signal.is_off);
//<>
//
// FOR DEBUG ONLY
//
//m_environment.input_discrete.all = m_environment.input_discrete_debug_only.all;
//
}//process_digital_input()
//
#pragma CODE_SECTION("ramfuncs");
Uint32 SystemControl::get_digital_output()
{
return (Uint32)m_environment.digital_output_inverse.all;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::setup_hvcell()
{
m_environment.hardware.ref_control_order = ORDER_STOP;
//m_environment.hardware.control_order = ORDER_SELFCHECK;
set_hvcell_level();
send_hvcell_control_order();
get_hvcell_version();
get_pwm_version();
get_hvcell_state();
get_cpu_cpld_version();
//
}//selftest_hvcell()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::send_hvcell_syn_signal()
{
sendSynSignal();
//
}//send_syn_signal()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::send_hvcell_control_order()
{
if(m_environment.hardware.control_order_cell != m_environment.hardware.ref_control_order)
{
m_environment.hardware.control_order_cell = m_environment.hardware.ref_control_order;
//
}//if
//
sendControlOrder(m_environment.hardware.control_order_cell);
//
}//send_control_order()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::set_hvcell_level()
{
m_environment.hardware.error = setCellLevel(m_environment.hardware.level);
//m_environment.hardware.error = setCellLevel(m_environment.hardware.level, m_environment.hardware.switching_freq);
//
}//set_cell_level()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::get_pwm_version()
{
getPwmVersion(m_environment.hardware.pwm_version);
//
}//get_pwm_version()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::get_hvcell_state()
{
getCellState(m_environment.hardware.level, m_environment.hardware.hvcell.state);
//
}//get_cell_state()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::get_hvcell_dc_voltage()
{
static float aux_a = FP_ZERO, aux_b = FP_ZERO, aux_c = FP_ZERO;
getCellDCVoltage(m_environment.hardware.level, m_environment.hardware.hvcell.dc_voltage);
aux_a = FP_ZERO;
aux_b = FP_ZERO;
aux_c = FP_ZERO;
//
for(Uint16 cellnum = 0; cellnum < m_environment.hardware.level; cellnum++)
{
aux_a += m_environment.hardware.hvcell.dc_voltage[0][cellnum];
aux_b += m_environment.hardware.hvcell.dc_voltage[1][cellnum];
aux_c += m_environment.hardware.hvcell.dc_voltage[2][cellnum];
//
}//for
//
m_environment.cell_dc_voltage_a = aux_a;
m_environment.cell_dc_voltage_b = aux_b;
m_environment.cell_dc_voltage_c = aux_c;
//
m_environment.cell_dc_voltage_a_average = m_cell_dc_voltage_a_filter.execute(aux_a);
m_environment.cell_dc_voltage_b_average = m_cell_dc_voltage_b_filter.execute(aux_b);
m_environment.cell_dc_voltage_c_average = m_cell_dc_voltage_c_filter.execute(aux_c);
//m_environment.cell_dc_voltage_a_reciprocal = hvcell_dc_voltage_reciprocal(m_environment.cell_dc_voltage_a_average);
//m_environment.cell_dc_voltage_b_reciprocal = hvcell_dc_voltage_reciprocal(m_environment.cell_dc_voltage_b_average);
//m_environment.cell_dc_voltage_c_reciprocal = hvcell_dc_voltage_reciprocal(m_environment.cell_dc_voltage_c_average);
m_environment.cell_dc_voltage_a_reciprocal = 1.0/5.0/900.0;
m_environment.cell_dc_voltage_b_reciprocal = 1.0/5.0/900.0;
m_environment.cell_dc_voltage_c_reciprocal = 1.0/5.0/900.0;
#if TYPECONTROL == SCALARCONTROL
m_environment.phase_control.phase_a.feedback.voltage_cell_dc_reciprocal = m_environment.cell_dc_voltage_a_reciprocal;
m_environment.phase_control.phase_b.feedback.voltage_cell_dc_reciprocal = m_environment.cell_dc_voltage_b_reciprocal;
m_environment.phase_control.phase_c.feedback.voltage_cell_dc_reciprocal = m_environment.cell_dc_voltage_c_reciprocal;
#endif
//
}//get_cell_dc_voltage()
//
#pragma CODE_SECTION("ramfuncs");
inline float SystemControl::hvcell_dc_voltage_reciprocal(float& voltage)
{
if(voltage > FP_ZERO)
{
return 1.0/voltage;
//
}
else
{
return FP_ZERO;
//
}//if else
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::get_hvcell_version()
{
getCellVersion(m_environment.hardware.level, m_environment.hardware.hvcell.version);
//
}//get_cell_version()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::send_hvcell_modulate_data()
{
static float _data_u = FP_ZERO;
static float _data_v = FP_ZERO;
static float _data_w = FP_ZERO;
//
if(m_environment.hardware.hvcell.data_u >= (float)(1.0))
{
_data_u = (float)(1.0);
}
else
{
if(m_environment.hardware.hvcell.data_u <= (float)(-1.0))
{
_data_u = (float)(-1.0);
}
else
{
_data_u = m_environment.hardware.hvcell.data_u;
}
}
//
if(m_environment.hardware.hvcell.data_v >= (float)(1.0))
{
_data_v = (float)(1.0);
}
else
{
if(m_environment.hardware.hvcell.data_v <= (float)(-1.0))
{
_data_v = (float)(-1.0);
}
else
{
_data_v = m_environment.hardware.hvcell.data_v;
}
}
//
if(m_environment.hardware.hvcell.data_w >= (float)(1.0))
{
_data_w = (float)(1.0);
}
else
{
if(m_environment.hardware.hvcell.data_w <= (float)(-1.0))
{
_data_w = (float)(-1.0);
}
else
{
_data_w = m_environment.hardware.hvcell.data_w;
}
}
//
sendModulateData(_data_u, _data_v, _data_w);
//sendModulateData(m_environment.hardware.hvcell.data_u, m_environment.hardware.hvcell.data_v, m_environment.hardware.hvcell.data_w, m_environment.hardware.switching_freq);
//
}//send_modulate_data()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::get_cpu_cpld_version()
{
m_environment.hardware.cpu_cpld_version = getCpuCpldVersion();
//
}//get_cpu_cpld_version()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::hardware_diagnostic()
{
m_environment.hardware.check_status();
m_environment.hardware.check_faults(SYSCTRL::AlgorithmContext::OFF == m_algorithm_executed ? SYSCTRL::HardWare::SHORT : SYSCTRL::HardWare::COMPLETE);
//
}//
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::harmonica_multiplyer(float cos_alpha, float sin_alpha, float cos_beta, float sin_beta, float& out_cos, float& out_sin)
{
out_cos = cos_alpha * cos_beta - sin_alpha * sin_beta;
out_sin = sin_alpha * cos_beta + cos_alpha * sin_beta;
//
}//harmonica_multiplyer()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::protection_thyristor_control()
{
//
// Short Circuit VS Control
_trigger_protection_thyristor_control();
m_environment.digital_output.signal.vs_control = m_vs_protection_control_trigger.signal.quit; // 4009 Short Circuit VS Thyristor
m_environment.digital_output_inverse.all = m_environment.digital_output.all ^ 0xFFFFFFFF ;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
inline void SystemControl::_trigger_protection_thyristor_control()
{
SYSCTRL::TriggerRegister::setSet(m_vs_protection_control_trigger,
m_environment.auxiliary_km2.state.signal.is_off);
SYSCTRL::TriggerRegister::setReset(m_vs_protection_control_trigger,
m_environment.auxiliary_km2.state.signal.is_on);
SYSCTRL::TriggerRegister::execute_reset_priority(m_vs_protection_control_trigger);
hardware_analog_current_fault.signal.fault = 0;
hardware_analog_current_fault.signal.vs = m_vs_protection_control_trigger.signal.quit;
//
}//
//
#pragma CODE_SECTION("ramfuncs");
bool SystemControl::slow_loop_is_active()
{
if(m_environment.counter_slow <= 0)
{
m_environment.counter_slow = m_environment.time_prescale_slow;
return true;
}
else
{
return false;
//
}//if else
//
}//slow_loop_is_active()
//
#pragma CODE_SECTION("ramfuncs");
bool SystemControl::additional_loop_is_active()
{
if(m_environment.counter_additional <= 0)
{
m_environment.counter_additional = m_environment.time_prescale_additional;
return true;
}
else
{
return false;
//
}//if else
//
}//additional_loop_is_active()
//
#pragma CODE_SECTION("ramfuncs");
bool SystemControl::symmetrical_calculator_loop_is_active()
{
if(m_environment.counter_symmetrical <= 0)
{
m_environment.counter_symmetrical = m_environment.time_prescale_symmetrical;
return true;
}
else
{
return false;
//
}//if else
//
}//symmetrical_calculator_loop_is_active()
//
#pragma CODE_SECTION("ramfuncs");
void SystemControl::_rms_module_calculator(float xa, float xb, float xc, float& xrms)
{
xrms = sqrtf(0.333333*(xa*xa + xb*xb + xc*xc));
//
}//
//
} /* namespace SYSCTRL */