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.

432 lines
22 KiB
C++

/*
* PhaseAlertMonitor.cpp
*
* Author: Aleksey Gerasimenko
* gerasimenko.aleksey.n@gmail.com
*/
#include "SYSCTRL/PhaseAlertMonitor.h"
namespace SYSCTRL
{
//CONSTRUCTOR
PhaseAlertMonitor::PhaseAlertMonitor():
m_time_sample(-1.0),
m_fault(false),
m_warning(false),
m_monitor(),
status(),
fault(false),
warning(false),
m_voltage_ab_exceed_level_1(),
m_voltage_bc_exceed_level_1(),
m_voltage_ca_exceed_level_1(),
m_voltage_ab_exceed_level_2(),
m_voltage_bc_exceed_level_2(),
m_voltage_ca_exceed_level_2(),
m_voltage_ab_exceed_level_3(),
m_voltage_bc_exceed_level_3(),
m_voltage_ca_exceed_level_3(),
m_voltage_ab_exceed_level_4(),
m_voltage_bc_exceed_level_4(),
m_voltage_ca_exceed_level_4(),
m_voltage_ab_decrease_level_1(),
m_voltage_bc_decrease_level_1(),
m_voltage_ca_decrease_level_1(),
m_voltage_ab_decrease_level_2(),
m_voltage_bc_decrease_level_2(),
m_voltage_ca_decrease_level_2(),
m_voltage_ab_decrease_level_3(),
m_voltage_bc_decrease_level_3(),
m_voltage_ca_decrease_level_3(),
m_current_a_overload_level_1(),
m_current_b_overload_level_1(),
m_current_c_overload_level_1(),
m_current_a_overload_level_2(),
m_current_b_overload_level_2(),
m_current_c_overload_level_2(),
m_current_a_overload_level_3(),
m_current_b_overload_level_3(),
m_current_c_overload_level_3(),
//
m_current_invertor_a_overload_level_1(),
m_current_invertor_b_overload_level_1(),
m_current_invertor_c_overload_level_1(),
m_current_invertor_a_overload_level_2(),
m_current_invertor_b_overload_level_2(),
m_current_invertor_c_overload_level_2(),
m_current_invertor_a_overload_level_3(),
m_current_invertor_b_overload_level_3(),
m_current_invertor_c_overload_level_3(),
//
m_current_input_a_overload_level_1(),
m_current_input_b_overload_level_1(),
m_current_input_c_overload_level_1(),
m_current_input_a_overload_level_2(),
m_current_input_b_overload_level_2(),
m_current_input_c_overload_level_2(),
m_current_input_a_overload_level_3(),
m_current_input_b_overload_level_3(),
m_current_input_c_overload_level_3(),
//
_execute(&SYSCTRL::PhaseAlertMonitor::_execute_undef)
//
{}//CONSTRUCTOR
void PhaseAlertMonitor::setup(float time_sample)
{
m_time_sample = time_sample;
m_voltage_ab_exceed_level_1.setup(m_time_sample);
m_voltage_bc_exceed_level_1.setup(m_time_sample);
m_voltage_ca_exceed_level_1.setup(m_time_sample);
m_voltage_ab_exceed_level_2.setup(m_time_sample);
m_voltage_bc_exceed_level_2.setup(m_time_sample);
m_voltage_ca_exceed_level_2.setup(m_time_sample);
m_voltage_ab_exceed_level_3.setup(m_time_sample);
m_voltage_bc_exceed_level_3.setup(m_time_sample);
m_voltage_ca_exceed_level_3.setup(m_time_sample);
m_voltage_ab_exceed_level_4.setup(m_time_sample);
m_voltage_bc_exceed_level_4.setup(m_time_sample);
m_voltage_ca_exceed_level_4.setup(m_time_sample);
m_voltage_ab_decrease_level_1.setup(m_time_sample);
m_voltage_bc_decrease_level_1.setup(m_time_sample);
m_voltage_ca_decrease_level_1.setup(m_time_sample);
m_voltage_ab_decrease_level_2.setup(m_time_sample);
m_voltage_bc_decrease_level_2.setup(m_time_sample);
m_voltage_ca_decrease_level_2.setup(m_time_sample);
m_voltage_ab_decrease_level_3.setup(m_time_sample);
m_voltage_bc_decrease_level_3.setup(m_time_sample);
m_voltage_ca_decrease_level_3.setup(m_time_sample);
m_current_a_overload_level_1.setup(m_time_sample);
m_current_b_overload_level_1.setup(m_time_sample);
m_current_c_overload_level_1.setup(m_time_sample);
m_current_a_overload_level_2.setup(m_time_sample);
m_current_b_overload_level_2.setup(m_time_sample);
m_current_c_overload_level_2.setup(m_time_sample);
m_current_a_overload_level_3.setup(m_time_sample);
m_current_b_overload_level_3.setup(m_time_sample);
m_current_c_overload_level_3.setup(m_time_sample);
m_current_invertor_a_overload_level_1.setup(m_time_sample);
m_current_invertor_b_overload_level_1.setup(m_time_sample);
m_current_invertor_c_overload_level_1.setup(m_time_sample);
m_current_invertor_a_overload_level_2.setup(m_time_sample);
m_current_invertor_b_overload_level_2.setup(m_time_sample);
m_current_invertor_c_overload_level_2.setup(m_time_sample);
m_current_invertor_a_overload_level_3.setup(m_time_sample);
m_current_invertor_b_overload_level_3.setup(m_time_sample);
m_current_invertor_c_overload_level_3.setup(m_time_sample);
m_current_input_a_overload_level_1.setup(m_time_sample);
m_current_input_b_overload_level_1.setup(m_time_sample);
m_current_input_c_overload_level_1.setup(m_time_sample);
m_current_input_a_overload_level_2.setup(m_time_sample);
m_current_input_b_overload_level_2.setup(m_time_sample);
m_current_input_c_overload_level_2.setup(m_time_sample);
m_current_input_a_overload_level_3.setup(m_time_sample);
m_current_input_b_overload_level_3.setup(m_time_sample);
m_current_input_c_overload_level_3.setup(m_time_sample);
//
}//setup()
//
void PhaseAlertMonitor::configure(const PhaseAlertConfiguration& config)
{
m_voltage_ab_exceed_level_1.configure(config.voltage_exceed_level_1);
m_voltage_bc_exceed_level_1.configure(config.voltage_exceed_level_1);
m_voltage_ca_exceed_level_1.configure(config.voltage_exceed_level_1);
m_voltage_ab_exceed_level_2.configure(config.voltage_exceed_level_2);
m_voltage_bc_exceed_level_2.configure(config.voltage_exceed_level_2);
m_voltage_ca_exceed_level_2.configure(config.voltage_exceed_level_2);
m_voltage_ab_exceed_level_3.configure(config.voltage_exceed_level_3);
m_voltage_bc_exceed_level_3.configure(config.voltage_exceed_level_3);
m_voltage_ca_exceed_level_3.configure(config.voltage_exceed_level_3);
m_voltage_ab_exceed_level_4.configure(config.voltage_exceed_level_4);
m_voltage_bc_exceed_level_4.configure(config.voltage_exceed_level_4);
m_voltage_ca_exceed_level_4.configure(config.voltage_exceed_level_4);
m_voltage_ab_decrease_level_1.configure(config.voltage_decrease_level_1);
m_voltage_bc_decrease_level_1.configure(config.voltage_decrease_level_1);
m_voltage_ca_decrease_level_1.configure(config.voltage_decrease_level_1);
m_voltage_ab_decrease_level_2.configure(config.voltage_decrease_level_2);
m_voltage_bc_decrease_level_2.configure(config.voltage_decrease_level_2);
m_voltage_ca_decrease_level_2.configure(config.voltage_decrease_level_2);
m_voltage_ab_decrease_level_3.configure(config.voltage_decrease_level_3);
m_voltage_bc_decrease_level_3.configure(config.voltage_decrease_level_3);
m_voltage_ca_decrease_level_3.configure(config.voltage_decrease_level_3);
m_current_a_overload_level_1.configure(config.current_overload_level_1);
m_current_b_overload_level_1.configure(config.current_overload_level_1);
m_current_c_overload_level_1.configure(config.current_overload_level_1);
m_current_a_overload_level_2.configure(config.current_overload_level_2);
m_current_b_overload_level_2.configure(config.current_overload_level_2);
m_current_c_overload_level_2.configure(config.current_overload_level_2);
m_current_a_overload_level_3.configure(config.current_overload_level_3);
m_current_b_overload_level_3.configure(config.current_overload_level_3);
m_current_c_overload_level_3.configure(config.current_overload_level_3);
//
m_current_invertor_a_overload_level_1.configure(config.current_invertor_overload_level_1);
m_current_invertor_b_overload_level_1.configure(config.current_invertor_overload_level_1);
m_current_invertor_c_overload_level_1.configure(config.current_invertor_overload_level_1);
m_current_invertor_a_overload_level_2.configure(config.current_invertor_overload_level_2);
m_current_invertor_b_overload_level_2.configure(config.current_invertor_overload_level_2);
m_current_invertor_c_overload_level_2.configure(config.current_invertor_overload_level_2);
m_current_invertor_a_overload_level_3.configure(config.current_invertor_overload_level_3);
m_current_invertor_b_overload_level_3.configure(config.current_invertor_overload_level_3);
m_current_invertor_c_overload_level_3.configure(config.current_invertor_overload_level_3);
//
m_current_input_a_overload_level_1.configure(config.current_input_overload_level_1);
m_current_input_b_overload_level_1.configure(config.current_input_overload_level_1);
m_current_input_c_overload_level_1.configure(config.current_input_overload_level_1);
m_current_input_a_overload_level_2.configure(config.current_input_overload_level_2);
m_current_input_b_overload_level_2.configure(config.current_input_overload_level_2);
m_current_input_c_overload_level_2.configure(config.current_input_overload_level_2);
m_current_input_a_overload_level_3.configure(config.current_input_overload_level_3);
m_current_input_b_overload_level_3.configure(config.current_input_overload_level_3);
m_current_input_c_overload_level_3.configure(config.current_input_overload_level_3);
if((m_time_sample > FP_ZERO))
{
_execute = &SYSCTRL::PhaseAlertMonitor::_execute_operational;
//
}//if
//
}//configure()
//
#pragma CODE_SECTION("ramfuncs");
void PhaseAlertMonitor::get_faults(PhaseFaultRegister& ph_a, PhaseFaultRegister& ph_b, PhaseFaultRegister& ph_c)
{
ph_a.all = m_monitor.phase_a.fault.all;
ph_b.all = m_monitor.phase_b.fault.all;
ph_c.all = m_monitor.phase_c.fault.all;
//
}//
//
//
#pragma CODE_SECTION("ramfuncs");
void PhaseAlertMonitor::reset()
{
m_monitor.phase_a.warning.all = (uint16_t)0;
m_monitor.phase_a.fault.all = (uint16_t)0;
m_monitor.phase_b.warning.all = (uint16_t)0;
m_monitor.phase_b.fault.all = (uint16_t)0;
m_monitor.phase_c.warning.all = (uint16_t)0;
m_monitor.phase_c.fault.all = (uint16_t)0;
//
m_monitor.phase_a.warning.all = (uint16_t)0;
m_monitor.phase_a.fault.all = (uint16_t)0;
m_monitor.phase_b.warning.all = (uint16_t)0;
m_monitor.phase_b.fault.all = (uint16_t)0;
m_monitor.phase_c.warning.all = (uint16_t)0;
m_monitor.phase_c.fault.all = (uint16_t)0;
//
m_voltage_ab_exceed_level_1.reset();
m_voltage_bc_exceed_level_1.reset();
m_voltage_ca_exceed_level_1.reset();
m_voltage_ab_exceed_level_2.reset();
m_voltage_bc_exceed_level_2.reset();
m_voltage_ca_exceed_level_2.reset();
m_voltage_ab_exceed_level_3.reset();
m_voltage_bc_exceed_level_3.reset();
m_voltage_ca_exceed_level_3.reset();
m_voltage_ab_exceed_level_4.reset();
m_voltage_bc_exceed_level_4.reset();
m_voltage_ca_exceed_level_4.reset();
m_voltage_ab_decrease_level_1.reset();
m_voltage_bc_decrease_level_1.reset();
m_voltage_ca_decrease_level_1.reset();
m_voltage_ab_decrease_level_2.reset();
m_voltage_bc_decrease_level_2.reset();
m_voltage_ca_decrease_level_2.reset();
m_voltage_ab_decrease_level_3.reset();
m_voltage_bc_decrease_level_3.reset();
m_voltage_ca_decrease_level_3.reset();
m_current_a_overload_level_1.reset();
m_current_b_overload_level_1.reset();
m_current_c_overload_level_1.reset();
m_current_a_overload_level_2.reset();
m_current_b_overload_level_2.reset();
m_current_c_overload_level_2.reset();
m_current_a_overload_level_3.reset();
m_current_b_overload_level_3.reset();
m_current_c_overload_level_3.reset();
m_current_invertor_a_overload_level_1.reset();
m_current_invertor_b_overload_level_1.reset();
m_current_invertor_c_overload_level_1.reset();
m_current_invertor_a_overload_level_2.reset();
m_current_invertor_b_overload_level_2.reset();
m_current_invertor_c_overload_level_2.reset();
m_current_invertor_a_overload_level_3.reset();
m_current_invertor_b_overload_level_3.reset();
m_current_invertor_c_overload_level_3.reset();
//
m_fault = false;
m_warning = false;
warning = m_warning;
fault = m_fault;
status = m_monitor;
//
}//reset()
//
#pragma CODE_SECTION("ramfuncs");
void PhaseAlertMonitor::execute(float urmsa, float urmsb, float urmsc,
float irmsa, float irmsb, float irmsc,
float invrmsa, float invrmsb, float invrmsc,
float inprmsa, float inprmsb, float inprmsc)
{
(this->*_execute)(urmsa, urmsb, urmsc, irmsa, irmsb, irmsc, invrmsa, invrmsb, invrmsc, inprmsa, inprmsb, inprmsc);
//
}//execute()
//
#pragma CODE_SECTION("ramfuncs");
void PhaseAlertMonitor::_execute_undef(float urmsa, float urmsb, float urmsc,
float irmsa, float irmsb, float irmsc,
float invrmsa, float invrmsb, float invrmsc,
float inprmsa, float inprmsb, float inprmsc)
{
//
}//_execute_undef()
//
#pragma CODE_SECTION("ramfuncs");
void PhaseAlertMonitor::_execute_operational(float urmsa, float urmsb, float urmsc,
float irmsa, float irmsb, float irmsc,
float invrmsa, float invrmsb, float invrmsc,
float inprmsa, float inprmsb, float inprmsc)
{
static bool _warning = false;
_warning = false;
m_monitor.phase_a.warning.all = (uint16_t)0;
m_monitor.phase_a.fault.all = (uint16_t)0;
m_monitor.phase_b.warning.all = (uint16_t)0;
m_monitor.phase_b.fault.all = (uint16_t)0;
m_monitor.phase_c.warning.all = (uint16_t)0;
m_monitor.phase_c.fault.all = (uint16_t)0;
//
m_voltage_ab_exceed_level_1.execute(urmsa);
m_voltage_bc_exceed_level_1.execute(urmsb);
m_voltage_ca_exceed_level_1.execute(urmsc);
m_voltage_ab_exceed_level_2.execute(urmsa);
m_voltage_bc_exceed_level_2.execute(urmsb);
m_voltage_ca_exceed_level_2.execute(urmsc);
m_voltage_ab_exceed_level_3.execute(urmsa);
m_voltage_bc_exceed_level_3.execute(urmsb);
m_voltage_ca_exceed_level_3.execute(urmsc);
m_voltage_ab_exceed_level_4.execute(urmsa);
m_voltage_bc_exceed_level_4.execute(urmsb);
m_voltage_ca_exceed_level_4.execute(urmsc);
/*
m_voltage_ab_decrease_level_1.execute(urmsa);
m_voltage_bc_decrease_level_1.execute(urmsb);
m_voltage_ca_decrease_level_1.execute(urmsc);
m_voltage_ab_decrease_level_2.execute(urmsa);
m_voltage_bc_decrease_level_2.execute(urmsb);
m_voltage_ca_decrease_level_2.execute(urmsc);
*/
/*
m_voltage_ab_decrease_level_3.execute(urmsa);
m_voltage_bc_decrease_level_3.execute(urmsb);
m_voltage_ca_decrease_level_3.execute(urmsc);
*/
m_current_a_overload_level_1.execute(irmsa);
m_current_b_overload_level_1.execute(irmsb);
m_current_c_overload_level_1.execute(irmsc);
m_current_a_overload_level_2.execute(irmsa);
m_current_b_overload_level_2.execute(irmsb);
m_current_c_overload_level_2.execute(irmsc);
m_current_a_overload_level_3.execute(irmsa);
m_current_b_overload_level_3.execute(irmsb);
m_current_c_overload_level_3.execute(irmsc);
m_current_invertor_a_overload_level_1.execute(invrmsa);
m_current_invertor_b_overload_level_1.execute(invrmsb);
m_current_invertor_c_overload_level_1.execute(invrmsc);
m_current_invertor_a_overload_level_2.execute(invrmsa);
m_current_invertor_b_overload_level_2.execute(invrmsb);
m_current_invertor_c_overload_level_2.execute(invrmsc);
m_current_invertor_a_overload_level_3.execute(invrmsa);
m_current_invertor_b_overload_level_3.execute(invrmsb);
m_current_invertor_c_overload_level_3.execute(invrmsc);
//
m_current_input_a_overload_level_1.execute(inprmsa);
m_current_input_b_overload_level_1.execute(inprmsb);
m_current_input_c_overload_level_1.execute(inprmsc);
m_current_input_a_overload_level_2.execute(inprmsa);
m_current_input_b_overload_level_2.execute(inprmsb);
m_current_input_c_overload_level_2.execute(inprmsc);
m_current_input_a_overload_level_3.execute(inprmsa);
m_current_input_b_overload_level_3.execute(inprmsb);
m_current_input_c_overload_level_3.execute(inprmsc);
//
// set flags
m_monitor.phase_a.warning.bit.exceed_voltage_level_1 = m_voltage_ab_exceed_level_1.warning;
m_monitor.phase_a.warning.bit.exceed_voltage_level_2 = m_voltage_ab_exceed_level_2.warning;
m_monitor.phase_a.fault.bit.exceed_voltage_level_3 = m_voltage_ab_exceed_level_3.fault;
m_monitor.phase_a.fault.bit.exceed_voltage_level_4 = m_voltage_ab_exceed_level_4.fault;
m_monitor.phase_a.warning.bit.decrease_voltage_level_1 = m_voltage_ab_decrease_level_1.warning;
m_monitor.phase_a.warning.bit.decrease_voltage_level_2 = m_voltage_ab_decrease_level_2.warning;
m_monitor.phase_a.fault.bit.decrease_voltage_level_3 = m_voltage_ab_decrease_level_3.fault;
m_monitor.phase_a.fault.bit.overload_current_level_1 = m_current_a_overload_level_1.fault;
m_monitor.phase_a.fault.bit.overload_current_level_2 = m_current_a_overload_level_2.fault;
m_monitor.phase_a.fault.bit.overload_current_level_3 = m_current_a_overload_level_3.fault;
m_monitor.phase_a.fault.bit.overload_invertor_current_level_1 = m_current_invertor_a_overload_level_1.fault;
m_monitor.phase_a.fault.bit.overload_invertor_current_level_2 = m_current_invertor_a_overload_level_2.fault;
m_monitor.phase_a.fault.bit.overload_invertor_current_level_3 = m_current_invertor_a_overload_level_3.fault;
m_monitor.phase_a.fault.bit.overload_input_current_level_1 = m_current_input_a_overload_level_1.fault;
m_monitor.phase_a.fault.bit.overload_input_current_level_2 = m_current_input_a_overload_level_2.fault;
m_monitor.phase_a.fault.bit.overload_input_current_level_3 = m_current_input_a_overload_level_3.fault;
//
m_monitor.phase_b.warning.bit.exceed_voltage_level_1 = m_voltage_bc_exceed_level_1.warning;
m_monitor.phase_b.warning.bit.exceed_voltage_level_2 = m_voltage_bc_exceed_level_2.warning;
m_monitor.phase_b.fault.bit.exceed_voltage_level_3 = m_voltage_bc_exceed_level_3.fault;
m_monitor.phase_b.fault.bit.exceed_voltage_level_4 = m_voltage_bc_exceed_level_4.fault;
m_monitor.phase_b.warning.bit.decrease_voltage_level_1 = m_voltage_bc_decrease_level_1.warning;
m_monitor.phase_b.warning.bit.decrease_voltage_level_2 = m_voltage_bc_decrease_level_2.warning;
m_monitor.phase_b.fault.bit.decrease_voltage_level_3 = m_voltage_bc_decrease_level_3.fault;
m_monitor.phase_b.fault.bit.overload_current_level_1 = m_current_b_overload_level_1.fault;
m_monitor.phase_b.fault.bit.overload_current_level_2 = m_current_b_overload_level_2.fault;
m_monitor.phase_b.fault.bit.overload_current_level_3 = m_current_b_overload_level_3.fault;
m_monitor.phase_b.fault.bit.overload_invertor_current_level_1 = m_current_invertor_b_overload_level_1.fault;
m_monitor.phase_b.fault.bit.overload_invertor_current_level_2 = m_current_invertor_b_overload_level_2.fault;
m_monitor.phase_b.fault.bit.overload_invertor_current_level_3 = m_current_invertor_b_overload_level_3.fault;
m_monitor.phase_b.fault.bit.overload_input_current_level_1 = m_current_input_b_overload_level_1.fault;
m_monitor.phase_b.fault.bit.overload_input_current_level_2 = m_current_input_b_overload_level_2.fault;
m_monitor.phase_b.fault.bit.overload_input_current_level_3 = m_current_input_b_overload_level_3.fault;
//
m_monitor.phase_c.warning.bit.exceed_voltage_level_1 = m_voltage_ca_exceed_level_1.warning;
m_monitor.phase_c.warning.bit.exceed_voltage_level_2 = m_voltage_ca_exceed_level_2.warning;
m_monitor.phase_c.fault.bit.exceed_voltage_level_3 = m_voltage_ca_exceed_level_3.fault;
m_monitor.phase_c.fault.bit.exceed_voltage_level_4 = m_voltage_ca_exceed_level_4.fault;
m_monitor.phase_c.warning.bit.decrease_voltage_level_1 = m_voltage_ca_decrease_level_1.warning;
m_monitor.phase_c.warning.bit.decrease_voltage_level_2 = m_voltage_ca_decrease_level_2.warning;
m_monitor.phase_c.fault.bit.decrease_voltage_level_3 = m_voltage_ca_decrease_level_3.fault;
m_monitor.phase_c.fault.bit.overload_current_level_1 = m_current_c_overload_level_1.fault;
m_monitor.phase_c.fault.bit.overload_current_level_2 = m_current_c_overload_level_2.fault;
m_monitor.phase_c.fault.bit.overload_current_level_3 = m_current_c_overload_level_3.fault;
m_monitor.phase_c.fault.bit.overload_invertor_current_level_1 = m_current_invertor_c_overload_level_1.fault;
m_monitor.phase_c.fault.bit.overload_invertor_current_level_2 = m_current_invertor_c_overload_level_2.fault;
m_monitor.phase_c.fault.bit.overload_invertor_current_level_3 = m_current_invertor_c_overload_level_3.fault;
m_monitor.phase_c.fault.bit.overload_input_current_level_1 = m_current_input_c_overload_level_1.fault;
m_monitor.phase_c.fault.bit.overload_input_current_level_2 = m_current_input_c_overload_level_2.fault;
m_monitor.phase_c.fault.bit.overload_input_current_level_3 = m_current_input_c_overload_level_3.fault;
//
status = m_monitor;
//
if(m_monitor.phase_a.fault.all != (uint16_t)0){ m_fault = true;}
if(m_monitor.phase_b.fault.all != (uint16_t)0){ m_fault = true;}
if(m_monitor.phase_c.fault.all != (uint16_t)0){ m_fault = true;}
//
if(m_monitor.phase_a.warning.all != (uint16_t)0){ _warning = true;}
if(m_monitor.phase_b.warning.all != (uint16_t)0){ _warning = true;}
if(m_monitor.phase_c.warning.all != (uint16_t)0){ _warning = true;}
m_warning = _warning;
warning = m_warning;
fault = m_fault;
//
}//_execute_operational()
} /* namespace SYSCTRL */