113 lines
2.3 KiB
C++
113 lines
2.3 KiB
C++
/*
|
||
* ManagedPiControlProcess.cpp
|
||
*
|
||
* Created on: 14 янв. 2022 г.
|
||
* Author: titov
|
||
*/
|
||
|
||
|
||
#include "ManagedPiControlProcess.hh"
|
||
|
||
void processing::acs::ManagedPiControlProcess::set( TypeInput error ) {
|
||
|
||
value_error = error;
|
||
|
||
if( isConnected() and not(proc_enable) ) {
|
||
|
||
regulator.recalculate( error, reset_value );
|
||
|
||
proc_enable = true;
|
||
}
|
||
|
||
}
|
||
|
||
processing::acs::ManagedPiControlProcess::TypeOutput processing::acs::ManagedPiControlProcess::get() const {
|
||
|
||
return reset_value;
|
||
|
||
}
|
||
|
||
void processing::acs::ManagedPiControlProcess::set_output(
|
||
SetInterface * output_interface ) {
|
||
|
||
if( not output_interface ) proc_enable = false;
|
||
|
||
output = output_interface;
|
||
|
||
}
|
||
|
||
vector::ITechValue & processing::acs::ManagedPiControlProcess::getLimit() {
|
||
|
||
return limit;
|
||
|
||
}
|
||
|
||
void processing::acs::ManagedPiControlProcess::setSampleTime( float ts_in_second ) {
|
||
|
||
regulator.setTime(ts_in_second);
|
||
|
||
}
|
||
|
||
void processing::acs::ManagedPiControlProcess::do_reset() {
|
||
|
||
proc_enable = false;
|
||
value_error = 0.0f;
|
||
|
||
regulator.reset(reset_value);
|
||
|
||
}
|
||
|
||
void processing::acs::ManagedPiControlProcess::process() {
|
||
|
||
if( not proc_enable )
|
||
return;
|
||
|
||
if( not update_lock.test_and_set() ) {
|
||
|
||
systemic::FlagStiker flag(update_lock);
|
||
|
||
value_output = regulator( value_error, not( operate ) );
|
||
|
||
output->set(value_output);
|
||
|
||
if( need_reset ) {
|
||
do_reset();
|
||
need_reset = false;
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
void processing::acs::ManagedPiControlProcess::reset() {
|
||
|
||
need_reset = true;
|
||
|
||
}
|
||
|
||
processing::acs::ManagedPiControlProcess::ManagedPiControlProcess(
|
||
Regulator & regulator, systemic::ISignal & current_value, systemic::IStatus & operate,
|
||
systemic::Parameter<Regulator> params ) : regulator(regulator),
|
||
reset_value(current_value),
|
||
value_error(0.0f), limit(regulator), operate(operate),
|
||
proc_enable(false), output(nullptr), value_output(0.0f), apply_params(regulator, params),
|
||
need_reset(false) { update_lock.clear(); }
|
||
|
||
bool processing::acs::ManagedPiControlProcess::isConnected() const {
|
||
|
||
return output;
|
||
|
||
}
|
||
|
||
void processing::acs::ManagedPiControlProcess::apply() {
|
||
|
||
if( not update_lock.test_and_set() ) {
|
||
|
||
systemic::FlagStiker flag(update_lock);
|
||
|
||
apply_params();
|
||
|
||
}
|
||
|
||
}
|