diff --git a/TestBenchFramework/BenchControl/TestMethods/FlyingStartCollectionMethod/FlyingStartCollectionMethodSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FlyingStartCollectionMethod/FlyingStartCollectionMethodSeq.cs
index 64a35ff4b..3fb7c5c7f 100644
--- a/TestBenchFramework/BenchControl/TestMethods/FlyingStartCollectionMethod/FlyingStartCollectionMethodSeq.cs
+++ b/TestBenchFramework/BenchControl/TestMethods/FlyingStartCollectionMethod/FlyingStartCollectionMethodSeq.cs
@@ -447,15 +447,17 @@ namespace TBF.BenchControl.TestMethods.FlyingStartCollectionMethod
tstRslt.TimeDivEnd5 = 0;
for (int i = 0; i < Program.WMsCount; i++)
{
+ WaterMeters.iPerl.WaterMeter iPerl = (sensPath.RegisterReaders[i] as WaterMeters.iPerl.WaterMeter); /// != null for iPerl
+
if ((sensPath.RegisterReaders[i] != null) && (WaterMeters.Count > i) && !WaterMeters[i].Disabled)
{
tstRslt.Meters[i].SerialNr = (WaterMeters.Count > i) ? WaterMeters[i].SerialNr : string.Empty;
tstRslt.Meters[i].VolumeStart = 0; /// liter
tstRslt.Meters[i].VolumeEnd = 0; /// liter
- tstRslt.Meters[i].PulsesPerLiter = (sensPath.RegisterReaders[i] == null ? 1.0f : sensPath.RegisterReaders[i].PulsesPerLtr);
- if (sensPath.RegisterReaders[i] is WaterMeters.iPerl.WaterMeter)
+ tstRslt.Meters[i].PulsesPerLiter = (sensPath.RegisterReaders[i] == null ? 1.0f : sensPath.RegisterReaders[i].PulsesPerLtr);
+
+ if (iPerl != null)
{
- WaterMeters.iPerl.WaterMeter iPerl = (sensPath.RegisterReaders[i] as WaterMeters.iPerl.WaterMeter);
tstRslt.Meters[i].VolumeMeter = (float)Math.Abs(iPerl.VolumeLtrEnd - iPerl.VolumeLtrStart);
tstRslt.Meters[i].VolumeRef = tstRslt.VolumeCTV * (float)(iPerl.TimestampSecEnd - iPerl.TimestampSecStart) / tstRslt.Time;
iPerl.VolumeLtrRef = (double)tstRslt.Meters[i].VolumeRef;
@@ -466,6 +468,7 @@ namespace TBF.BenchControl.TestMethods.FlyingStartCollectionMethod
else tstRslt.Meters[i].VolumeMeter = Convert.ToSingle(WMPulses[i]) / sensPath.RegisterReaders[i].PulsesPerLtr;
tstRslt.Meters[i].VolumeRef = tstRslt.ConstMaster * WMRefPulses[i]; /// liter
}
+
tstRslt.Meters[i].PulsesMeter = WMPulses[i];
tstRslt.Meters[i].PulsesMaster = WMRefPulses[i];
tstRslt.Meters[i].Time = cBrd.TTime;
@@ -487,6 +490,12 @@ namespace TBF.BenchControl.TestMethods.FlyingStartCollectionMethod
{
tstRslt.Meters[i].Disabled = true;
}
+
+ if (iPerl != null)
+ {
+ iPerl.LastTestResult = tstRslt.Meters[i]; /// Save this water meter test result to iPerl WM
+ iPerl.NominalTestFlow = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour
+ }
}
/// Add data - end
diff --git a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
index cf6dd03b4..64347fd4f 100644
--- a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
+++ b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
@@ -861,8 +861,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
CommErr error = CommErr.Write;
/// Write zero Q2 correction
- Byte q2CorrRFlow = 0;
- Byte q2CorrLFlow = 0;
+ double q2CorrectionFactor = wm.Q2CorrectionFactor();
+ Byte q2CorrRFlow = (byte)((int)(q2CorrectionFactor / 2 + 0.5) & 0x000000FF);
+ Byte q2CorrLFlow = (byte)((int)(q2CorrectionFactor + 0.5) & 0x000000FF);
byte[] wrData = new byte[2] { q2CorrRFlow, q2CorrLFlow };
for (int j = 0; j < MaxCommRetries; j++)
diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
index 7c0d43b37..8b8407cfb 100644
--- a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
+++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
@@ -90,9 +90,19 @@ namespace TBF.BenchControl.WaterMeters.iPerl
}
CalibrationStruct calibrationStruct;
+ public ushort CalibrationFactor { get { return CalibrationStruct.Calibration; } }
- public ushort CalibrationFactor { get { return CalibrationStruct.Calibration; } }
+ /// Result of the last test used to calculate Q2 correction factors, etc
+ public Entities.MeterTestResult LastTestResult;
+ public double NominalTestFlow; /// liter per hour
+
+ ///
+ /// New calibration factor calculated from the original factor (argument)
+ /// and results of the last test.
+ ///
+ /// Original calibration factor
+ /// New calibration factor
public UInt16 CalculateNewCalibFactor(UInt16 originalCalibrationFactor)
{
double volumeMeter = Math.Abs(VolumeLtrEnd - VolumeLtrStart);
@@ -113,8 +123,23 @@ namespace TBF.BenchControl.WaterMeters.iPerl
}
}
+ ///
+ /// Q2 correction factor calculated from the last test (Q2).
+ /// This factors should be used only for R800 meters.
+ ///
+ /// Q2 correction factor
+ public double Q2CorrectionFactor()
+ {
+ double A = 16.0 / ScalingFactor(); /// Raw units per ml: DN15=16, DN20=8, DN25=4, DN32=2, DN40=1
+ const double B = 8.0; /// Raw units per minute, 8
+ const double C = B * 60.0; /// Raw units per hour, 480
+ double D = C / A; /// ml correction per hour
+ double F = D / (NominalTestFlow * 10.0); /// Error corrected with 8 Raw Units per minute [%]
+ double G = F / B; /// Error corrected with 1 Raw Unit per minute [%]
+
+ return (-1) * (LastTestResult.VolumeErrorPct / G) * (LastTestResult.VolumeRef / LastTestResult.VolumeMeter);
+ }
- int sampleNr;
///
/// Volume of water from the opto telegram
@@ -299,6 +324,8 @@ namespace TBF.BenchControl.WaterMeters.iPerl
}
+ int sampleNr; /// This is to determine when the test start sample should be taken
+
/// Start this operation
public void Start()
{
@@ -327,6 +354,7 @@ namespace TBF.BenchControl.WaterMeters.iPerl
ReadPulses();
if (sampleNr == 3)
{
+ /// Take the test start sample
VolumeLtrStart = volumeLtr;
TimestampSecStart = timestampSec;
}