Water meter pulses overflow is handled properly (only 16-bit HW counter is used)
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user