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.

243 lines
8.6 KiB
C

/*
* PhaseAlertMonitor.h
*
* Author: Aleksey Gerasimenko
* gerasimenko.aleksey.n@gmail.com
*/
#include <math.h>
#include <stdint.h>
#include "SYSCTRL/ALERTHeaders.h"
#ifndef SYSCTRL_PHASEALERTMONITOR_H_
#define SYSCTRL_PHASEALERTMONITOR_H_
namespace SYSCTRL
{
struct PhaseAlertConfiguration
{
ALERT::AlertBaseConfiguration voltage_exceed_level_1;
ALERT::AlertBaseConfiguration voltage_exceed_level_2;
ALERT::AlertBaseConfiguration voltage_exceed_level_3;
ALERT::AlertBaseConfiguration voltage_exceed_level_4;
ALERT::AlertBaseConfiguration voltage_decrease_level_1;
ALERT::AlertBaseConfiguration voltage_decrease_level_2;
ALERT::AlertBaseConfiguration voltage_decrease_level_3;
ALERT::AlertBaseConfiguration current_overload_level_1;
ALERT::AlertBaseConfiguration current_overload_level_2;
ALERT::AlertBaseConfiguration current_overload_level_3;
ALERT::AlertBaseConfiguration current_invertor_overload_level_1;
ALERT::AlertBaseConfiguration current_invertor_overload_level_2;
ALERT::AlertBaseConfiguration current_invertor_overload_level_3;
ALERT::AlertBaseConfiguration current_input_overload_level_1;
ALERT::AlertBaseConfiguration current_input_overload_level_2;
ALERT::AlertBaseConfiguration current_input_overload_level_3;
PhaseAlertConfiguration():
voltage_exceed_level_1(),
voltage_exceed_level_2(),
voltage_exceed_level_3(),
voltage_exceed_level_4(),
voltage_decrease_level_1(),
voltage_decrease_level_2(),
voltage_decrease_level_3(),
current_overload_level_1(),
current_overload_level_2(),
current_overload_level_3(),
current_invertor_overload_level_1(),
current_invertor_overload_level_2(),
current_invertor_overload_level_3(),
current_input_overload_level_1(),
current_input_overload_level_2(),
current_input_overload_level_3()
{}
//
};//SystemAlertConfiguration
struct PhaseWarningBit
{
uint16_t exceed_voltage_level_1 :1;
uint16_t exceed_voltage_level_2 :1;
uint16_t decrease_voltage_level_1 :1;
uint16_t decrease_voltage_level_2 :1;
//
};//PhaseWarningBit
struct PhaseFaultBit
{
uint16_t exceed_voltage_level_3 :1; // 0
uint16_t exceed_voltage_level_4 :1; // 1
uint16_t decrease_voltage_level_3 :1; // 2
uint16_t phase_lost :1; // 3
//
uint16_t short_circuit :1; // 4
uint16_t high_current :1; // 5
uint16_t overload_current_level_1 :1; // 6
uint16_t overload_current_level_2 :1; // 7
//
uint16_t overload_current_level_3 :1; // 8
uint16_t overload_invertor_current_level_1 :1; // 9
uint16_t overload_invertor_current_level_2 :1; // 10
uint16_t overload_invertor_current_level_3 :1; // 11
//
uint16_t overload_input_current_level_1 :1; // 12
uint16_t overload_input_current_level_2 :1; // 13
uint16_t overload_input_current_level_3 :1; // 14
uint16_t reserved_15 :1; // 15
};//PhaseFaultBit
union PhaseWarningRegister
{
uint16_t all;
struct PhaseWarningBit bit;
PhaseWarningRegister():
all(uint16_t(0))
{}
//
};//PhaseWarningRegister
union PhaseFaultRegister
{
uint16_t all;
struct PhaseFaultBit bit;
PhaseFaultRegister():
all(uint16_t(0))
{}
};//PhaseFaultRegister
struct PhaseAlertStatusRegister
{
union PhaseWarningRegister warning;
union PhaseFaultRegister fault;
PhaseAlertStatusRegister():
warning(),
fault()
{}
};//PhaseAlertStatusRegister
struct PhaseAlertRegister
{
struct PhaseAlertStatusRegister phase_a;
struct PhaseAlertStatusRegister phase_b;
struct PhaseAlertStatusRegister phase_c;
PhaseAlertRegister():
phase_a(),
phase_b(),
phase_c()
{}
//
};//PhaseAlertRegister
class PhaseAlertMonitor
{
private:
float m_time_sample;
bool m_fault;
bool m_warning;
private:
PhaseAlertRegister m_monitor;
public:
PhaseAlertRegister status;
bool fault;
bool warning;
private:
ALERT::WarningExceed m_voltage_ab_exceed_level_1;
ALERT::WarningExceed m_voltage_bc_exceed_level_1;
ALERT::WarningExceed m_voltage_ca_exceed_level_1;
//
ALERT::WarningExceed m_voltage_ab_exceed_level_2;
ALERT::WarningExceed m_voltage_bc_exceed_level_2;
ALERT::WarningExceed m_voltage_ca_exceed_level_2;
//
ALERT::FaultExceed m_voltage_ab_exceed_level_3;
ALERT::FaultExceed m_voltage_bc_exceed_level_3;
ALERT::FaultExceed m_voltage_ca_exceed_level_3;
//
ALERT::FaultExceed m_voltage_ab_exceed_level_4;
ALERT::FaultExceed m_voltage_bc_exceed_level_4;
ALERT::FaultExceed m_voltage_ca_exceed_level_4;
//
ALERT::WarningDecrease m_voltage_ab_decrease_level_1;
ALERT::WarningDecrease m_voltage_bc_decrease_level_1;
ALERT::WarningDecrease m_voltage_ca_decrease_level_1;
//
ALERT::WarningDecrease m_voltage_ab_decrease_level_2;
ALERT::WarningDecrease m_voltage_bc_decrease_level_2;
ALERT::WarningDecrease m_voltage_ca_decrease_level_2;
//
ALERT::FaultDecrease m_voltage_ab_decrease_level_3;
ALERT::FaultDecrease m_voltage_bc_decrease_level_3;
ALERT::FaultDecrease m_voltage_ca_decrease_level_3;
//
ALERT::FaultExceed m_current_a_overload_level_1;
ALERT::FaultExceed m_current_b_overload_level_1;
ALERT::FaultExceed m_current_c_overload_level_1;
//
ALERT::FaultExceed m_current_a_overload_level_2;
ALERT::FaultExceed m_current_b_overload_level_2;
ALERT::FaultExceed m_current_c_overload_level_2;
//
ALERT::FaultExceed m_current_a_overload_level_3;
ALERT::FaultExceed m_current_b_overload_level_3;
ALERT::FaultExceed m_current_c_overload_level_3;
//
ALERT::FaultExceed m_current_invertor_a_overload_level_1;
ALERT::FaultExceed m_current_invertor_b_overload_level_1;
ALERT::FaultExceed m_current_invertor_c_overload_level_1;
//
ALERT::FaultExceed m_current_invertor_a_overload_level_2;
ALERT::FaultExceed m_current_invertor_b_overload_level_2;
ALERT::FaultExceed m_current_invertor_c_overload_level_2;
//
ALERT::FaultExceed m_current_invertor_a_overload_level_3;
ALERT::FaultExceed m_current_invertor_b_overload_level_3;
ALERT::FaultExceed m_current_invertor_c_overload_level_3;
ALERT::FaultExceed m_current_input_a_overload_level_1;
ALERT::FaultExceed m_current_input_b_overload_level_1;
ALERT::FaultExceed m_current_input_c_overload_level_1;
//
ALERT::FaultExceed m_current_input_a_overload_level_2;
ALERT::FaultExceed m_current_input_b_overload_level_2;
ALERT::FaultExceed m_current_input_c_overload_level_2;
//
ALERT::FaultExceed m_current_input_a_overload_level_3;
ALERT::FaultExceed m_current_input_b_overload_level_3;
ALERT::FaultExceed m_current_input_c_overload_level_3;
public:
PhaseAlertMonitor();
void setup(float time_sample);
void configure(const PhaseAlertConfiguration& config);
public:
void get_faults(PhaseFaultRegister& ph_a, PhaseFaultRegister& ph_b, PhaseFaultRegister& ph_c);
void reset();
public:
void execute(float urmsa, float urmsb, float urmsc,
float irmsa, float irmsb, float irmsc,
float invrmsa, float invrmsb, float invrmsc,
float inprmsa, float inmrmsb, float inmrmsc);
private:
void (PhaseAlertMonitor::*_execute)(float urmsa, float urmsb, float urmsc,
float irmsa, float irmsb, float irmsc,
float invrmsa, float invrmsb, float invrmsc,
float inprmsa, float inmrmsb, float inmrmsc);
void _execute_undef(float urmsa, float urmsb, float urmsc,
float irmsa, float irmsb, float irmsc,
float invrmsa, float invrmsb, float invrmsc,
float inprmsa, float inmrmsb, float inmrmsc);
void _execute_operational(float urmsa, float urmsb, float urmsc,
float irmsa, float irmsb, float irmsc,
float invrmsa, float invrmsb, float invrmsc,
float inprmsa, float inmrmsb, float inmrmsc);
//
};//PhaseAlertMonitor
} /* namespace SYSCTRL */
#endif /* SYSCTRL_PHASEALERTMONITOR_H_ */