206 lines
6.3 KiB
C++
206 lines
6.3 KiB
C++
/*
|
||
* SignalIntegrator.hh
|
||
*
|
||
* Created on: 11 нояб. 2021 г.
|
||
* Author: sozonov
|
||
*/
|
||
|
||
#ifndef UMLIBRARY_SCHEMATIC_SIGNALINTEGRATOR_HH_
|
||
#define UMLIBRARY_SCHEMATIC_SIGNALINTEGRATOR_HH_
|
||
|
||
#include <cmath>
|
||
#include <utility>
|
||
#include "../systemic/IProcess.hh"
|
||
#include "../systemic/ISignal.hh"
|
||
#include "../systemic/IFunctor.hh"
|
||
|
||
namespace schematic {
|
||
/**
|
||
* Интегратор сигналов.
|
||
* В классе реализованы функции простого интегрирования, а так же возможность выставить насыщение интегратора и значения сброса интегратора.
|
||
*
|
||
*
|
||
* Если верхняя граница сброса меньше init_state, то верхняя граница не включается.
|
||
* Если нижняя граница сброса больше init_state, то нижняя граница не включается.
|
||
*
|
||
*
|
||
* Если положительная граница насыщения меньше нуля, то она становится равной нулю.
|
||
* Если отрицательная граница насыщения больше нуля, то она становится равной нулю.
|
||
*/
|
||
class SignalIntegrator : public systemic::IProcess {
|
||
private:
|
||
|
||
struct ResetTo : systemic::IFunctor<void, float> {
|
||
|
||
float & output;
|
||
|
||
void operator()( float value ) {
|
||
|
||
output = value;
|
||
|
||
}
|
||
|
||
ResetTo( float & output ) : output(output) {}
|
||
|
||
} reset_to;
|
||
|
||
public:
|
||
typedef systemic::ISignal Value; //!< Интерфейс входного сигнала.
|
||
/**
|
||
* Стандартный конструктор.
|
||
*/
|
||
SignalIntegrator( Value & _inp );
|
||
|
||
/**
|
||
* Стандартный конструктор с входными параметрами.
|
||
* @param _inp Интерфейс доступа ко входному значению.
|
||
* @param _wrap_up Верхняя граница сброса.
|
||
* @param _wrap_down Нижняя граница сброса.
|
||
* @param _pos_sat Значение насыщения интегратора в положительной области расчёта.
|
||
* @param _neg_sat Значение насыщения интегратора в отрицательной области расчёта.
|
||
* @param _init_state Начальное значение интегратора.
|
||
*/
|
||
SignalIntegrator( Value & _inp, float _wrap_up, float _wrap_down, float _pos_sat, float _neg_sat, float _init_state ) ;
|
||
|
||
//!Коэффициенты смещения, амплитуды, частоты и фазы синуса.
|
||
struct Setting {
|
||
float init_state; //!< Начальное значение интегратора.
|
||
|
||
float wrap_up; //!< Верхняя граница сброса выходного сигнала.
|
||
float wrap_down; //!< Нижняя граница сброса выходного сигнала.
|
||
|
||
float positive_saturation; //!< Положительное значение насыщения интегратора.
|
||
float negative_saturation; //!< Отрицательное значение насыщения интегратора.
|
||
|
||
Setting();
|
||
|
||
bool isValid();
|
||
};
|
||
|
||
bool configure( Setting &config );
|
||
|
||
systemic::IFunctor<void, float> & getResetAction() { return reset_to; }
|
||
|
||
|
||
/**
|
||
* Выставление входного значения.
|
||
* @param _in_value Входное значение, которое будет проинтегрировано.
|
||
*/
|
||
void set_input( float _in_value );
|
||
|
||
/**
|
||
* Выставление постоянной времени интегрирования.
|
||
* @param _dt Постоянная времени интегрирования.
|
||
*/
|
||
void set_dt ( float _dt );
|
||
|
||
/**
|
||
* Выставление границ сброса.
|
||
*
|
||
* Если верхняя граница сброса меньше init_state, то верхняя граница не включается.
|
||
* Если нижняя граница сброса больше init_state, то нижняя граница не включается.
|
||
*
|
||
* Если нижняя граница больше верхней, то она становится верхней, а верхняя - нижней.
|
||
*
|
||
* @param _wr_val_up Вехняя граница сброса.
|
||
* @param _wr_val_down Нижняя граница сброса.
|
||
*/
|
||
void set_wrap_value( float _wr_val_up, float _wr_val_down );
|
||
|
||
/**
|
||
* Выставление положительной и отрицательной границы насыщения.
|
||
* Если положительная граница насыщения меньше нуля, то она становится равной нулю.
|
||
* Если отрицательная граница насыщения больше нуля, то она становится равной нулю.
|
||
*
|
||
* @param _positive_saturation Насыщение в положительной области.
|
||
* @param _negative_saturation Насыщение в отрицательной области.
|
||
*/
|
||
void set_saturation( float _positive_saturation, float _negative_saturation );
|
||
|
||
/**
|
||
* Получение результирующего значения.
|
||
* @return Результирующее значение.
|
||
*/
|
||
float get_output_value() const;
|
||
|
||
/**
|
||
* Получение признака достижения верхней границы насыщения.
|
||
* @return Признак насыщения.
|
||
*/
|
||
const bool & get_saturation_upper_reached();
|
||
|
||
/**
|
||
* Получение признака достижения нижней границы насыщения.
|
||
* @return Признак насыщения.
|
||
*/
|
||
const bool & get_saturation_down_reached();
|
||
|
||
/**
|
||
* Главный фоновый метод.
|
||
*/
|
||
void process() override;
|
||
|
||
/**
|
||
* Сброс выходного значения.
|
||
*/
|
||
void reset();
|
||
|
||
/**
|
||
* Преобразования значения со входного интерфейса в значение с плавующей точкой.
|
||
*/
|
||
void value_update();
|
||
|
||
/**
|
||
* Метод интерфейса процесса.
|
||
* Получение времени интегрирования, приведенного к реальному, с учетом периодичности процесса.
|
||
* @param ts_in_second Период прерывания в секундах.
|
||
*/
|
||
virtual void setSampleTime( float ts_in_second ) override
|
||
{ dt = ts_in_second; };
|
||
|
||
|
||
private:
|
||
|
||
Value & i_input; //!< Интерфейс входного параметра.
|
||
|
||
float input; //!< Входной параметр интегратора.
|
||
float output; //!< Результат работы интегратора.
|
||
|
||
float dt; //!< Постоянная времени интегратора.
|
||
|
||
float init_state; //!< Начальное значение интегратора.
|
||
|
||
std::pair<float, float> wrap_value; //!< Границы сброса интегратора.
|
||
|
||
std::pair<float, float> saturation; //!< Значение положительного и отрицательного значения ограничения.
|
||
|
||
bool saturation_upper_reached; //!< Признак достижение одной из границ насыщения.
|
||
|
||
bool saturation_down_reached; //!< Признак достижение одной из границ насыщения.
|
||
|
||
float delta_wrap; //!< Разница, между границами сброса.
|
||
|
||
|
||
/**
|
||
* Метод расчёта интеграла, без учета насыщения и сброса.
|
||
*/
|
||
void integration();
|
||
|
||
/**
|
||
* Метод, учёта сброса.
|
||
*/
|
||
void wrap_state();
|
||
/**
|
||
* Метод проверки достижения значения насыщения.
|
||
*/
|
||
void check_saturation();
|
||
};
|
||
|
||
inline void initialize( SignalIntegrator &si, SignalIntegrator::Setting &config ) {
|
||
si.configure( config );
|
||
}
|
||
|
||
} /* namespace schematic */
|
||
|
||
#endif /* UMLIBRARY_SCHEMATIC_SIGNALINTEGRATOR_HH_ */
|