/* * 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); #if (TYPECONTROL == SCALARCONTROL) && (SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_ABC) m_environment.cell_dc_voltage_a_reciprocal = 1.0/REGULATOR_VOLTAGE_ABC_SATURATION; m_environment.cell_dc_voltage_b_reciprocal = 1.0/REGULATOR_VOLTAGE_ABC_SATURATION; m_environment.cell_dc_voltage_c_reciprocal = 1.0/REGULATOR_VOLTAGE_ABC_SATURATION; #endif #if (TYPECONTROL == SCALARCONTROL) && (SCALARCONTROL_VOLTAGEREGULATOR == SCALARCONTROL_VOLTAGEREGULATOR_RMS) m_environment.cell_dc_voltage_a_reciprocal = 1.0/REGULATOR_VOLTAGE_RMS_SATURATION; m_environment.cell_dc_voltage_b_reciprocal = 1.0/REGULATOR_VOLTAGE_RMS_SATURATION; m_environment.cell_dc_voltage_c_reciprocal = 1.0/REGULATOR_VOLTAGE_RMS_SATURATION; #endif #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 */