Correct reading of WM pulses (windowing effect, only lower 16 bits of a counter value are available).

This commit is contained in:
Milan Hanajik
2021-04-19 14:48:03 +02:00
parent 3f0124825d
commit 17c77758c6
2 changed files with 51 additions and 2 deletions
+46 -2
View File
@@ -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]);
}
/// <summary>
/// Get number of pulses corrected for windowing effect
/// </summary>
/// <param name="wmNr1">1-based water meter number</param>
/// <param name="lowerWordOfMeterPulses"></param>
/// <param name="firstReading">When true lastPulses[wmNr1] is disregarded and is overwritten with lowerWordOfMeterPulses value</param>
/// <returns>Corrected water meter pulses</returns>
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];
}
}
/// <summary>
+5
View File
@@ -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);