/* * SignalIntegrator.hh * * Created on: 11 нояб. 2021 г. * Author: sozonov */ #ifndef UMLIBRARY_SCHEMATIC_SIGNALINTEGRATOR_HH_ #define UMLIBRARY_SCHEMATIC_SIGNALINTEGRATOR_HH_ #include #include #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 { 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 & 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 wrap_value; //!< Границы сброса интегратора. std::pair 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_ */