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

206 lines
6.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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_ */