Water meter pulses overflow is handled properly (only 16-bit HW counter is used)

This commit is contained in:
Milan Hanajik
2015-06-22 13:11:53 +02:00
parent 150777dafc
commit c3e4d1b317
5 changed files with 38 additions and 15 deletions
@@ -14,7 +14,11 @@ namespace TBF.BenchControl.Elde.RegisterReader
/// Set by the constructor
readonly RegisterReader reader;
IntBox pulses;
int lastPulses;
bool lastPulsesValid;
IntBox refPulses;
/// <summary>
@@ -28,6 +32,7 @@ namespace TBF.BenchControl.Elde.RegisterReader
if (reader == null) throw new ArgumentNullException("reader is null or it is not Elde");
this.pulses = pulses;
lastPulsesValid = false;
log.Debug(this.ToString());
}
@@ -46,7 +51,30 @@ namespace TBF.BenchControl.Elde.RegisterReader
private void ReadPulses()
{
pulses.Val = (int)reader.ControlBoard.WMeterPulses(reader.Position);
if (!lastPulsesValid)
{
lastPulses = (int)reader.ControlBoard.WMeterPulses(reader.Position);
lastPulsesValid = true;
}
else
{
UInt16 lowerWord = reader.ControlBoard.WMeterPulses(reader.Position);
int uncorrected = (int)(((uint)lastPulses & 0xFFFF0000) | lowerWord);
if (Math.Abs(uncorrected - lastPulses) <= Int16.MaxValue)
{
lastPulses = uncorrected;
}
else if (Math.Abs(uncorrected + 32768 - lastPulses) <= Int16.MaxValue)
{
lastPulses = uncorrected + 32768;
}
else if (Math.Abs(uncorrected - 32768 - lastPulses) <= Int16.MaxValue)
{
lastPulses = uncorrected - 32768;
}
}
pulses.Val = lastPulses;
if (refPulses != null)
{
refPulses.Val = (int)reader.ControlBoard.EtPulses(reader.Position);