r_n( 0.0 ),
y_scale( 1.0 ),
r_scale( 1.0 ),
+ y_offset( 0.0 ),
+ r_offset( 0.0 ),
Kp( 0.0 ),
alpha( 0.1 ),
beta( 1.0 ),
ep_n_1( 0.0 ),
edf_n_1( 0.0 ),
edf_n_2( 0.0 ),
- u_n_1( 0.0 )
+ u_n_1( 0.0 ),
+ desiredTs( 0.0 )
{
int i;
for ( i = 0; i < node->nChildren(); ++i ) {
if ( prop != NULL ) {
y_scale = prop->getDoubleValue();
}
+ prop = child->getChild( "offset" );
+ if ( prop != NULL ) {
+ y_offset = prop->getDoubleValue();
+ }
} else if ( cname == "reference" ) {
SGPropertyNode *prop = child->getChild( "prop" );
if ( prop != NULL ) {
if ( prop != NULL ) {
r_scale = prop->getDoubleValue();
}
+ prop = child->getChild( "offset" );
+ if ( prop != NULL ) {
+ r_offset = prop->getDoubleValue();
+ }
} else if ( cname == "output" ) {
int i = 0;
SGPropertyNode *prop;
} else if ( cname == "config" ) {
SGPropertyNode *prop;
+ prop = child->getChild( "Ts" );
+ if ( prop != NULL ) {
+ desiredTs = prop->getDoubleValue();
+ }
+
prop = child->getChild( "Kp" );
if ( prop != NULL ) {
Kp = prop->getDoubleValue();
double Tf; // filter time
double delta_u_n = 0.0; // incremental output
double u_n = 0.0; // absolute output
- double Ts = dt; // Sampling interval (sec)
-
- if ( Ts <= 0.0 ) {
+ double Ts; // sampling interval (sec)
+
+ elapsedTime += dt;
+ if ( elapsedTime <= desiredTs ) {
// do nothing if time step is not positive (i.e. no time has
// elapsed)
return;
}
+ Ts = elapsedTime;
+ elapsedTime = 0.0;
if (enable_prop != NULL && enable_prop->getStringValue() == enable_value) {
if ( !enabled ) {
}
if ( enabled && Ts > 0.0) {
- if ( debug ) cout << "Updating " << name << endl;
+ if ( debug ) cout << "Updating " << name
+ << " Ts " << Ts << endl;
double y_n = 0.0;
if ( input_prop != NULL ) {
- y_n = input_prop->getDoubleValue() * y_scale;
+ y_n = input_prop->getDoubleValue() * y_scale + y_offset;
}
double r_n = 0.0;
if ( r_n_prop != NULL ) {
- r_n = r_n_prop->getDoubleValue() * r_scale;
+ r_n = r_n_prop->getDoubleValue() * r_scale + r_offset;
} else {
r_n = r_n_value;
}
double r_n; // reference (set point) value
double y_scale; // scale process input from property system
double r_scale; // scale reference input from property system
+ double y_offset;
+ double r_offset;
// Configuration values
double Kp; // proportional gain
double edf_n_1; // edf[n-1] (derivative error)
double edf_n_2; // edf[n-2] (derivative error)
double u_n_1; // u[n-1] (output)
+ double desiredTs; // desired sampling interval (sec)
+ double elapsedTime; // elapsed time (sec)