/* * SearchCondition.hh * * Created on: 5 июл. 2020 г. * Author: LeonidTitov */ #ifndef UMLIBRARY_TECHNOLOGICAL_FUNCTION_SEARCHCONDITION_HH_ #define UMLIBRARY_TECHNOLOGICAL_FUNCTION_SEARCHCONDITION_HH_ #include "../ITechFunction.hh" #include "../../processing/acs/VectorAsyncInterface.hh" #include "../adapter/ControlSystemWrapper.hpp" #include "../../systemic/IStatus.hh" #include "../../systemic/ISignal.hh" #include "../../systemic/IProcess.hh" namespace technological { namespace function { class SearchCondition : public ITechFunction, public systemic::IProcess { public: struct Input { float delta_stp; //!<Заданное относительное перемещение, рад. float torque_lim; //!<Ограничение момента, Н*м. float speed_lim; //!<Ограничение скорости, рад/с. float acc_lim; //!<Ограничение ускорения, рад/с^2. }; struct Output { float value; //!<Найденное значение. float position; //!<Позиция, в которой было найдено значение, рад. }; bool run( const char * value, std::size_t size ); void stop(); bool getResult( char * value, std::size_t size ) const; short getState() const; void process(); SearchCondition( ResourceKeeper< technological::adapter::TieInterface > & control_system_wrapper, ResourceKeeper & speed_limit, ResourceKeeper & torque_limit, ResourceKeeper & acc_limit, systemic::IStatus & condition, systemic::ISignal & value ); struct Setting { float retention_accuracy; //!<Точность достижения позиции. Setting(); bool isValid(); }; void configure( Setting & config ); //Статусы ошибок причины незапуска: bool isSizeError() const; //!<Ошибка размера входных данных. bool isInvalidInput() const; //!<Некорретность параметров запуска. bool isControlSystemBusy() const; //!<Ошибка формирования системы управления. private: enum RunErrors { Empty, SizeError, InvalidInput, ControlSystemBusy, } run_result; Locable< technological::adapter::TieInterface > wrapper; vector::ITechValue * control_system; Locable speed_limit; Locable torque_limit; Locable acc_limit; systemic::IStatus & condition; systemic::ISignal & value; struct { float speed_limit = 0.0f; float torque_limit = 0.0f; float acceleration_limit = 0.0f; } stored; float setpoint; float retention_accuracy; //!<Точность достижения позиции. static bool validate( Input & ); void apply( const Input & input ); bool hadnle( const Input & input ); bool searching; Output result; }; //Для внедрения таймаута следует сделать класс наследующий SearchCondition и добавляющий логику расчета и контроля таймаута выполнения операции. //Для внедрения внешних условий как ошибки техфункции необходимо написать обертку над техфункцией, контролирующую внешний статус. //Для внедрения блокируемых технологических функций необходимо написать обертку контролирующую статус перед и во время выполнения. //Для внедрения "действий" в момент запуска и момент остановки необходимо написать обретку над техфункцией, осуществляющую эти действия. }} #endif /* UMLIBRARY_TECHNOLOGICAL_FUNCTION_SEARCHCONDITION_HH_ */