MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/schematic/SignalIntegrator.hh

206 lines
8.6 KiB
C++
Raw Normal View History

2024-06-07 11:12:56 +03:00
/*
* 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_ */