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++
493 lines
22 KiB
C++
5 months ago
|
/*
|
||
|
* 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 */
|