diff --git a/TBF/Rig/ControlBoard/Uni/GeneralData.cs b/TBF/Rig/ControlBoard/Uni/GeneralData.cs
index 55e2cd753..13a5929d5 100644
--- a/TBF/Rig/ControlBoard/Uni/GeneralData.cs
+++ b/TBF/Rig/ControlBoard/Uni/GeneralData.cs
@@ -13,6 +13,8 @@ namespace TBF.Rig.ControlBoard.Uni
public const int MessageLen = 303;
public const byte MessageCode = (byte)' ';
+ public bool RestartReadingOfWMPulses = true;
+
/// General data
public ulong State; /// bytes 5,6,7,8,9,80,81 = 7 bytes = 56 bits
public uint Chyby485;
@@ -34,6 +36,9 @@ namespace TBF.Rig.ControlBoard.Uni
public Int16[] AnalogInput = new Int16[Const.ADCsCount];
public int[] TemperatureRaw = new int[8];
+ /// Private
+ int[] lastPulses = new int[Const.WMsCount + 1]; /// WMsCount = 20
+
public GeneralData()
{
@@ -121,7 +126,7 @@ namespace TBF.Rig.ControlBoard.Uni
RegVStatus[Const.RVsCount + 1] = (stavRegQ >> 4) & 2;
/// This must preceed processing bytes 91 .. 250 as Ttime is used there
- uint ttimeRaw = GetUInt32(data, offs + (int)Poz.Ttime); /// Byte 251,252,253,254
+ uint ttimeRaw = GetUInt32(data, offs + (int)Poz.Ttime); /// Byte 251,252,253,254
Ttime = Convert.ToDouble(ttimeRaw) * Const.TimeResolution; /// convert to [s]
ImpulseTime[0] = Ttime;
@@ -133,7 +138,7 @@ namespace TBF.Rig.ControlBoard.Uni
if ((State & (ulong)StatusP.SynchroMethod) != 0)
{
ushort pulses = GetUInt16(data, ix2);
- WMeterPuls[wmNr] = Convert.ToInt32(pulses);
+ WMeterPuls[wmNr] = GetCorrectedPulses(wmNr, pulses, RestartReadingOfWMPulses);
EtPulses[wmNr] = (pulses == 0) ? 0 : Convert.ToInt32(GetUInt24(data, ix1));
ImpulseTime[wmNr] = (pulses == 0) ? 0 : Const.TimeResolution * Convert.ToDouble(GetUInt24(data, ix1 + 3));
}
@@ -144,6 +149,7 @@ namespace TBF.Rig.ControlBoard.Uni
ImpulseTime[wmNr] = Ttime;
}
}
+ RestartReadingOfWMPulses = false;
StavDA[0] = GetUInt16(data, offs + (int)Poz.SDA); /// Byte 255,256
byte spare3 = data[offs + (int)Poz.spare3]; /// Byte 257
@@ -199,6 +205,44 @@ namespace TBF.Rig.ControlBoard.Uni
log.InfoFormat("Et={0} State={1:X14} Route={2} Freq={3} EtPulses={4} TTime={5} WMPulses[3]={6} WMRefPulses[3]={7}, Time[3]={8}",
(State & 7), State, Utils.ToBin40(((UInt64)Vystupy) >> 8), ReferenceFreq[0], EtPulses[0], Ttime, WMeterPuls[3], EtPulses[3], ImpulseTime[3]);
}
+
+ ///
+ /// Get number of pulses corrected for windowing effect
+ ///
+ /// 1-based water meter number
+ ///
+ /// When true lastPulses[wmNr1] is disregarded and is overwritten with lowerWordOfMeterPulses value
+ /// Corrected water meter pulses
+ private int GetCorrectedPulses(int wmNr1, UInt16 lowerWordOfMeterPulses, bool firstReading)
+ {
+ if (firstReading)
+ {
+ lastPulses[wmNr1] = (Int16)lowerWordOfMeterPulses;
+ }
+ else
+ {
+ int uncorrected = (int)(((uint)lastPulses[wmNr1] & 0xFFFF0000) | lowerWordOfMeterPulses);
+
+ if (Math.Abs(uncorrected - lastPulses[wmNr1]) <= Int16.MaxValue)
+ {
+ lastPulses[wmNr1] = uncorrected;
+ }
+ else if (Math.Abs(uncorrected + 65536 - lastPulses[wmNr1]) <= Int16.MaxValue)
+ {
+ lastPulses[wmNr1] = uncorrected + 65536;
+ }
+ else if (Math.Abs(uncorrected - 65536 - lastPulses[wmNr1]) <= Int16.MaxValue)
+ {
+ lastPulses[wmNr1] = uncorrected - 65536;
+ }
+ else
+ {
+ lastPulses[wmNr1] = uncorrected; /// Default
+ }
+ }
+
+ return lastPulses[wmNr1];
+ }
}
///
diff --git a/TBF/Rig/ControlBoard/Uni/UniCB.cs b/TBF/Rig/ControlBoard/Uni/UniCB.cs
index 325359909..50e1c8f33 100644
--- a/TBF/Rig/ControlBoard/Uni/UniCB.cs
+++ b/TBF/Rig/ControlBoard/Uni/UniCB.cs
@@ -460,6 +460,11 @@ namespace TBF.Rig.ControlBoard.Uni
}
}
+ if ((combinedAction.ActionId & ActionID.StartTest) != 0)
+ {
+ Data.RestartReadingOfWMPulses = true;
+ }
+
if (cbCfg.DebugLevel == DebugMode.Normal)
{
serialPort.Write(outData, 0, outData.Length);