206 lines
8.6 KiB
C++
206 lines
8.6 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_ */
|