112 lines
3.5 KiB
C++
112 lines
3.5 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_ */
|