public double UpdateMeasurement(AnalogItemState<double> source)
{
Range range = source.EURange.Value;
m_measurement.Value = source.Value;
// clamp the setpoint.
if (range != null)
{
if (m_setPoint.Value > range.High)
{
m_setPoint.Value = range.High;
}
if (m_setPoint.Value < range.Low)
{
m_setPoint.Value = range.Low;
}
}
// calculate error.
m_controlOut.Value = m_setPoint.Value - m_measurement.Value;
if (range != null)
{
m_controlOut.Value /= range.Magnitude;
if (Math.Abs(m_controlOut.Value) > 1.0)
{
m_controlOut.Value = (m_controlOut.Value < 0)?-1.0:+1.0;
}
}
// return the new output.
return m_controlOut.Value;
}
#endregion