T#0S THEN _rRampUpSpeed := (rTargetMax - rTargetMin) * (_rCycleTime / TIME_TO_REAL(timRampUp)); ELSE _rRampUpSpeed := rTargetMax; END_IF IF timRampDown <> T#0S THEN _rRampDownSpeed := -(rTargetMax - rTargetMin) * (_rCycleTime / TIME_TO_REAL(timRampDown)); ELSE _rRampDownSpeed := -rTargetMax; END_IF // Calculate distance left to go _rDistanceToGo := rTarget - rSetpoint; // Calculate new setpoint IF (_rDistanceToGo > 0.0) THEN IF (_rDistanceToGo > _rRampUpSpeed) THEN rSetpoint := rSetpoint + _rRampUpSpeed; ELSE rSetpoint := rTarget; END_IF ELSIF (_rDistanceToGo < 0.0) THEN IF (_rDistanceToGo < _rRampDownSpeed) THEN rSetpoint := rSetpoint + _rRampDownSpeed; ELSE rSetpoint := rTarget; END_IF ELSE rSetpoint := rTarget; END_IF // Check if we are in range of target range IF ABS(rSetpoint-rTarget) <= 0.001 THEN xInTarget := TRUE; ELSE xInTarget := FALSE; END_IF ]]>