112 lines
4.3 KiB
C++
112 lines
4.3 KiB
C++
/*
|
||
* 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<vector::ITechValue> > & control_system_wrapper,
|
||
ResourceKeeper<vector::ITechValue> & speed_limit,
|
||
ResourceKeeper<vector::ITechValue> & torque_limit,
|
||
ResourceKeeper<vector::ITechValue> & 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<vector::ITechValue> > wrapper;
|
||
vector::ITechValue * control_system;
|
||
|
||
Locable<vector::ITechValue> speed_limit;
|
||
Locable<vector::ITechValue> torque_limit;
|
||
Locable<vector::ITechValue> 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_ */
|