diff --git a/Results/Entities/WaterMeter.cs b/Results/Entities/WaterMeter.cs
index 1c74eef02..84e0c36c9 100644
--- a/Results/Entities/WaterMeter.cs
+++ b/Results/Entities/WaterMeter.cs
@@ -25,8 +25,11 @@ namespace Results.Entities
public virtual double CalibFactor { get; set; } /// iPerl calibration factor used during the test - Not mapped to DB !!!
public virtual double Q2ErrWOCorrection { get; set; }
public virtual bool Q2CorrectionDone { get; set; } /// true = iPerl Q2 correction was done
- public virtual double Q2Correction { get; set; } /// iPerl Q2 correction used during the test - Not mapped to DB !!!
- public virtual int Q2CorrFlowRight { get; set; } /// 1 = right to left
+ public virtual double Q2Correction { get; set; } /// iPerl Q2 correction used during the test
+ public virtual int Q2CorrFlowRight { get; set; } /// 1 = right to left
+ public virtual double Diff2Hz8Hz { get; set; }
+ public virtual bool Hz2CorrectionDone { get; set; } /// true = iPerl Q2 correction was done - Not mapped to DB !!!
+ public virtual int Hz2Correction { get; set; } /// iPerl Q2 correction used during the test - Not mapped to DB !!!
#endif
public virtual WaterMeterData WaterMeterData { get; set; }
public virtual Batch Batch { get; set; }
diff --git a/TestBenchFramework/BenchControl/DB/SensusOracle/Database.cs b/TestBenchFramework/BenchControl/DB/SensusOracle/Database.cs
index db260fbab..8509b30aa 100644
--- a/TestBenchFramework/BenchControl/DB/SensusOracle/Database.cs
+++ b/TestBenchFramework/BenchControl/DB/SensusOracle/Database.cs
@@ -934,9 +934,9 @@ namespace TBF.BenchControl.DB.SensusOracle
parm = new OracleParameter("VT_Fernum", OracleDbType.Varchar2); parm.Value = wm.SerialNr; cmd.Parameters.Add(parm); ///:1
parm = new OracleParameter("Pruefindex", OracleDbType.Int32); parm.Value = max_Pruefindex; cmd.Parameters.Add(parm); ///:2
parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); ///:3
- parm = new OracleParameter("WITHCORRECTION2HZ", OracleDbType.Int32); parm.Value = 0; cmd.Parameters.Add(parm); ///:4
- parm = new OracleParameter("CORRECTION2HZ", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:5
- parm = new OracleParameter("DIFF2HZ8HZ", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:6
+ parm = new OracleParameter("WITHCORRECTION2HZ", OracleDbType.Int32); parm.Value = wm.Hz2CorrectionDone ? 1 : 0; cmd.Parameters.Add(parm); ///:4
+ parm = new OracleParameter("CORRECTION2HZ", OracleDbType.Double); parm.Value = wm.Hz2Correction; cmd.Parameters.Add(parm); ///:5
+ parm = new OracleParameter("DIFF2HZ8HZ", OracleDbType.Double); parm.Value = wm.Diff2Hz8Hz; cmd.Parameters.Add(parm); ///:6
parm = new OracleParameter("WITHQ2CORRECTION", OracleDbType.Int32); parm.Value = wm.Q2CorrectionDone ? 1 : 0; cmd.Parameters.Add(parm); ///:7
parm = new OracleParameter("ERRQ2", OracleDbType.Double); parm.Value = q2ErrWOCorrection; cmd.Parameters.Add(parm); ///:8
parm = new OracleParameter("Q2CORRECTIONFLOWRIGHT", OracleDbType.Int32);parm.Value = wm.Q2CorrFlowRight;/*1=right to left*/ cmd.Parameters.Add(parm); ///:9
diff --git a/TestBenchFramework/BenchControl/DataEntry/iPerl/EntryForm.cs b/TestBenchFramework/BenchControl/DataEntry/iPerl/EntryForm.cs
index 07c5e9f72..79b4439ab 100644
--- a/TestBenchFramework/BenchControl/DataEntry/iPerl/EntryForm.cs
+++ b/TestBenchFramework/BenchControl/DataEntry/iPerl/EntryForm.cs
@@ -241,7 +241,11 @@ namespace TBF.BenchControl.DataEntry.iPerl
wm.CalibFactor = iPerl.CalibrationFactor;
wm.Q2ErrWOCorrection = iPerl.Q2ErrorWOCorrection;
wm.Q2CorrectionDone = iPerl.Q2CorrectionDone;
- wm.Q2Correction = iPerl.CurrentQ2Correction;
+ wm.Q2Correction = iPerl.Q2CorrectionFactor;
+ wm.Diff2Hz8Hz = iPerl.Diff2Hz8Hz;
+ wm.Hz2CorrectionDone = iPerl.Hz2CorrectionDone;
+ wm.Hz2Correction = iPerl.Hz2CorrectionFactor;
+
if (iPerl.CalibrationStruct == null)
{
wm.Q2CorrFlowRight = 0;
diff --git a/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs
index 4c13f60c5..f7de28df0 100644
--- a/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs
+++ b/TestBenchFramework/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs
@@ -297,14 +297,15 @@ namespace TBF.BenchControl.TestMethods.FlyingStart
iPerl.VolumeLtrRef = meterRslt.VolumeRef;
#if IPERLST
meterRslt.WaterMeter.CalibFactor = (iPerl.CalibrationStruct != null) ? iPerl.CalibrationStruct.Calibration : 0;
- meterRslt.WaterMeter.Q2Correction = iPerl.CurrentQ2Correction;
+ meterRslt.WaterMeter.Q2Correction = iPerl.Q2CorrectionFactor;
#endif
- iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM
- iPerl.NominalTestFlow = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour
+ iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result
+ iPerl.LastTestResult = meterRslt; /// Save this test result
+ iPerl.NominalTestFlow = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour
}
else
{
- meterRslt.TestTime = tstRslt.TestTime; /// TODO: Malo by sa citat z dosky
+ meterRslt.TestTime = tstRslt.TestTime; /// TODO: Malo by sa citat z dosky
meterRslt.VolumeStart = 0;
meterRslt.VolumeEnd = 0;
meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter
diff --git a/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs
index e1511e33b..9bb04b7cd 100644
--- a/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs
+++ b/TestBenchFramework/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs
@@ -462,14 +462,15 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection
iPerl.VolumeLtrRef = meterRslt.VolumeRef;
#if IPERLST
meterRslt.WaterMeter.CalibFactor = (iPerl.CalibrationStruct != null) ? iPerl.CalibrationStruct.Calibration : 0;
- meterRslt.WaterMeter.Q2Correction = iPerl.CurrentQ2Correction;
+ meterRslt.WaterMeter.Q2Correction = iPerl.Q2CorrectionFactor;
#endif
- iPerl.LastTestResult = meterRslt; /// Save this water meter test result to iPerl WM
- iPerl.NominalTestFlow = 500.0 * (double)(test.Qfrom + test.Qto); /// Ave. + convert to liter/hour
+ iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result
+ iPerl.LastTestResult = meterRslt; /// Save this test result
+ iPerl.NominalTestFlow = 500.0 * (test.Qfrom + test.Qto); /// Ave. + convert to liter/hour
}
else
{
- meterRslt.TestTime = tstRslt.TestTime; /// TODO: Malo by sa citat z dosky
+ meterRslt.TestTime = tstRslt.TestTime; /// TODO: Malo by sa citat z dosky
meterRslt.VolumeStart = 0; /// liter
meterRslt.VolumeEnd = 0; /// liter
meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter
diff --git a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
index dd827340c..154f1a66f 100644
--- a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
+++ b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
@@ -239,6 +239,8 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
const string WriteCalibrationFactorStr = "Write calibration factor";
const string ResetQ2CorrectionStr = "Reset Q2 correction";
const string WriteQ2CorrectionStr = "Write Q2 correction";
+ const string Reset2HzCorrectionStr = "Reset 2Hz correction";
+ const string Write2HzCorrectionStr = "Write 2Hz correction";
DateTime startTime;
@@ -644,6 +646,8 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
else if (activity.ToLower().Contains(WriteCalibrationFactorStr.ToLower())) error = WriteCalibrationFactor(wm, ref resultStr);
else if (activity.ToLower().Equals(ResetQ2CorrectionStr.ToLower())) error = ResetQ2Correction(wm, ref resultStr);
else if (activity.ToLower().Equals(WriteQ2CorrectionStr.ToLower())) error = WriteQ2Correction(wm, ref resultStr);
+ else if (activity.ToLower().Equals(Reset2HzCorrectionStr.ToLower())) error = Reset2HzCorrection(wm, ref resultStr);
+ else if (activity.ToLower().Equals(Write2HzCorrectionStr.ToLower())) error = Write2HzCorrection(wm, ref resultStr);
else
{
error = CommErr.None;
@@ -1019,9 +1023,17 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
///
for (int j = 0; j < cfg.MaxCommRetries; j++)
{
- if (0 == WriteRequestPort(wm, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, cfg.CommTimeout)) { error = CommErr.None; break; }
+ if (0 == WriteRequestPort(wm, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
+ {
+ error = CommErr.None;
+ break;
+ }
}
+ ///
+ /// Verification disabled on 16.02.2016
+ ///
+#if false
/// Verify the correction factors
if (error == CommErr.None)
{
@@ -1036,11 +1048,81 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
{
error = CommErr.None;
resultStr = "Q2 correction factors reset to 0";
- wm.CurrentQ2Correction = 0;
+ wm.Q2CorrectionFactor = 0;
break;
}
}
}
+#else
+ if (error == CommErr.None)
+ {
+ resultStr = "Q2 corrections reset to 0";
+ wm.Q2CorrectionFactor = 0;
+ }
+#endif
+
+ ClosePort(wm); /// Close RFID port
+
+ return error;
+ }
+
+
+ ///
+ /// Reset 2Hz correction factor in the memory to 0.
+ ///
+ /// Water meter object
+ /// String passed to caller
+ /// true on success
+ static CommErr Reset2HzCorrection(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
+ {
+ if (wm.CommFailed) return CommErr.CommFailed;
+
+ if (OpenPort(wm) != 0) return CommErr.OpenPort; /// Open RFID port
+
+ CommErr error = CommErr.Write;
+
+ /// Write zero Q2 correction
+ byte[] wrData = new byte[1] { 0 };
+ ///
+ for (int j = 0; j < cfg.MaxCommRetries; j++)
+ {
+ if (0 == WriteRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
+ {
+ error = CommErr.None;
+ break;
+ }
+ }
+
+ ///
+ /// Verification disabled on 16.02.2016
+ ///
+#if false
+ /// Verify the correction factors
+ if (error == CommErr.None)
+ {
+ error = CommErr.Verify;
+
+ /// Read calibration
+ byte[] rdData = null;
+ for (int j = 0; j < cfg.MaxCommRetries; j++)
+ {
+ if ((0 == ReadRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, out rdData, cfg.CommTimeout)) &&
+ (rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0))
+ {
+ error = CommErr.None;
+ resultStr = "2Hz correction reset to 0";
+ wm.Q2CorrectionFactor = 0;
+ break;
+ }
+ }
+ }
+#else
+ if (error == CommErr.None)
+ {
+ resultStr = "2Hz correction reset to 0";
+ wm.Hz2CorrectionFactor = 0;
+ }
+#endif
ClosePort(wm); /// Close RFID port
@@ -1059,11 +1141,15 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
{
if (wm.CommFailed) return CommErr.CommFailed;
- /// Write Q2 corrections
- double q2CorrectionFactor = wm.Q2CorrectionFactor();
+ wm.Q2ErrorWOCorrection = wm.LastTestResult.Error;
+ wm.Q2CorrectionDone = false;
+
+ double q2CorrectionFactor;
+ bool wmOK = wm.CalculateQ2CorrectionFactor(wm.LastTestResult, out q2CorrectionFactor);
+
if (q2CorrectionFactor == 0)
{
- resultStr = string.Format("Q2 factors = 0 (writing bypassed)");
+ resultStr = string.Format("Q2 correction = 0 (writing bypassed)");
return CommErr.None;
}
@@ -1077,12 +1163,20 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
///
for (int j = 0; j < cfg.MaxCommRetries; j++)
{
- if (0 == WriteRequestPort(wm, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, cfg.CommTimeout)) { error = CommErr.None; break; }
+ if (0 == WriteRequestPort(wm, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
+ {
+ error = CommErr.None;
+ break;
+ }
}
- if (error == CommErr.None)
+ ///
+ /// Verification disabled on 16.02.2016
+ ///
+#if false
+ if (error == CommErr.None)
{
- error = CommErr.Verify;
+ error = CommErr.Verify;
/// Read calibration
byte[] rdData = null;
@@ -1091,14 +1185,24 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
if ((0 == ReadRequestPort(wm, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout)) &&
(rdData != null) && (rdData.Length == 2) && (rdData[0] == q2CorrRFlow) && (rdData[1] == q2CorrLFlow))
{
- error = CommErr.None;
+ error = CommErr.None;
resultStr = string.Format("Q2 factors: R-flow={0}, L-flow={1}", (SByte)q2CorrRFlow, (SByte)q2CorrLFlow);
- rfidDataLogger.Warn(wm.Name + ": " + resultStr);
- wm.CurrentQ2Correction = q2CorrectionFactor;
+ rfidDataLogger.Warn(wm.Name + ": " + resultStr);
+ wm.Q2CorrectionDone = true;
+ wm.Q2CorrectionFactor = q2CorrectionFactor;
break;
}
}
}
+#else
+ if (error == CommErr.None)
+ {
+ resultStr = string.Format("Q2 correction: R-flow={0}, L-flow={1}", (SByte)q2CorrRFlow, (SByte)q2CorrLFlow);
+ rfidDataLogger.Warn(wm.Name + ": " + resultStr);
+ wm.Q2CorrectionDone = true;
+ wm.Q2CorrectionFactor = q2CorrectionFactor;
+ }
+#endif
ClosePort(wm); /// Close RFID port
@@ -1116,11 +1220,14 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
{
if (wm.CommFailed) return CommErr.CommFailed;
- /// Write Q2 corrections
- double hz2CorrectionFactor = wm.Hz2CorrectionFactor();
+ /// Calculate the correction
+ wm.Hz2CorrectionDone = false;
+ int hz2CorrectionFactor;
+ bool wmOK = wm.Calculate2HzCorrectionFactor(wm.LastTestResult2, wm.LastTestResult, out wm.Diff2Hz8Hz, out hz2CorrectionFactor);
+
if (hz2CorrectionFactor == 0)
{
- resultStr = string.Format("2Hz factors = 0 (writing bypassed)");
+ resultStr = string.Format("2Hz correction = 0 (writing bypassed)");
return CommErr.None;
}
@@ -1128,14 +1235,22 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
CommErr error = CommErr.Write;
- Byte hz2CorrectionByte = (byte)((int)Math.Round(hz2CorrectionFactor) & 0x000000FF);
+ Byte hz2CorrectionByte = (byte)(hz2CorrectionFactor & 0x000000FF);
byte[] wrData = new byte[1] { hz2CorrectionByte };
///
for (int j = 0; j < cfg.MaxCommRetries; j++)
{
- if (0 == WriteRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, 1, wrData, cfg.CommTimeout)) { error = CommErr.None; break; }
+ if (0 == WriteRequestPort(wm, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData, cfg.CommTimeout))
+ {
+ error = CommErr.None;
+ break;
+ }
}
+ ///
+ /// Verification disabled on 16.02.2016
+ ///
+#if false
if (error == CommErr.None)
{
error = CommErr.Verify;
@@ -1150,11 +1265,20 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
error = CommErr.None;
resultStr = string.Format("2Hz factor = {0}", (SByte)hz2CorrectionByte);
rfidDataLogger.Warn(wm.Name + ": " + resultStr);
- wm.Current2HzCorrection = hz2CorrectionFactor;
+ wm.Hz2CorrectionFactor = hz2CorrectionFactor;
break;
}
}
}
+#else
+ if (error == CommErr.None)
+ {
+ resultStr = string.Format("2Hz correction = {0}", (SByte)hz2CorrectionByte);
+ rfidDataLogger.Warn(wm.Name + ": " + resultStr);
+ wm.Hz2CorrectionDone = true;
+ wm.Hz2CorrectionFactor = hz2CorrectionFactor;
+ }
+#endif
ClosePort(wm); /// Close RFID port
diff --git a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
index c967ce620..f5c42c869 100644
--- a/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
+++ b/TestBenchFramework/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs
@@ -57,6 +57,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
processDataLoggingOp = new TBF.BenchControl.Operations.ProcessDataLoggingOp(processDataLogger, this);
const string Q2correctedFromCmd = "q2 corrected from ";
+ const string Hz2correctedFromCmd = "2Hz corrected from ";
if (testParams.Activity.ToLower().Contains(Q2correctedFromCmd))
{
@@ -66,7 +67,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
string fromTestName = testParams.Activity.Substring(Q2correctedFromCmd.Length);
- MakeCorrectedFrom(test.Name, fromTestName);
+ MakeQ2CorrectedFrom(test.Name, fromTestName);
Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.Completed));
Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(test.Name, 0)));
@@ -76,6 +77,33 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
rList.Add(Event.Done);
return rList;
}
+ //else if (testParams.Activity.ToLower().Contains(Hz2correctedFromCmd))
+ //{
+ // TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 60, 0, 0, 0 });
+ // Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.JustStarted));
+ // Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.FlowSetting));
+
+ // string fromTestsNames = testParams.Activity.Substring(Hz2correctedFromCmd.Length);
+ // string[] fromTestsArr = fromTestsNames.Split(new char[] { ' ' });
+ // if (fromTestsArr.Length == 2)
+ // {
+ // //MakeCorrectedFrom(test.Name, fromTestsArr[0], fromTestsArr[1]);
+
+ // Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.Completed));
+ // Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, ProcessData.BatchRslts.GetTestRslt(test.Name, 0)));
+ // allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file
+
+ // IList rList = new List(1);
+ // rList.Add(Event.Done);
+ // return rList;
+ // }
+ // else
+ // {
+ // IList rList = new List(1);
+ // rList.Add(Event.Done);
+ // return rList;
+ // }
+ //}
else if (testParams.Activity.ToLower().Contains("simulate "))
{
TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 60, 0, 0, 0 } );
@@ -171,7 +199,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
/// Q2Adj test result
/// Virtual Q2 test result
/// Assuming this test does not have multiple parts (part = 0)
- void MakeCorrectedFrom(string testName, string oriTestName)
+ void MakeQ2CorrectedFrom(string testName, string oriTestName)
{
Results.Entities.TestRslt oriTestRslt = ProcessData.BatchRslts.GetTestRslt(oriTestName, 0);
Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(testName, 0);
diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
index 51d0b39ee..19362b0f2 100644
--- a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
+++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs
@@ -113,11 +113,14 @@ namespace TBF.BenchControl.WaterMeters.iPerl
public double Q2ErrorWOCorrection;
public bool Q2CorrectionDone;
- public double CurrentQ2Correction;
+ public double Q2CorrectionFactor;
- public double Current2HzCorrection;
+ public double Diff2Hz8Hz;
+ public bool Hz2CorrectionDone;
+ public int Hz2CorrectionFactor;
/// Result of the last test used to calculate Q2 correction factors, etc
+ public Results.Entities.MeterTestRslt LastTestResult2;
public Results.Entities.MeterTestRslt LastTestResult;
public double NominalTestFlow; /// liter per hour
@@ -176,48 +179,55 @@ 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()
+ /// Test result from which to calculate the factor
+ /// The calculated Q2 correction factor
+ /// true = OK, false = failed
+ public bool CalculateQ2CorrectionFactor(Results.Entities.MeterTestRslt q2TestResult, out double q2CorrectionFactor)
{
- Q2ErrorWOCorrection = LastTestResult.Error;
+ q2CorrectionFactor = 0;
- if (Math.Abs(LastTestResult.Error) <= 0.5)
+ if (q2TestResult == null)
+ {
+ return false; /// Q2 test result is missing ==> water meter failed
+ }
+
+ if (Math.Abs(q2TestResult.Error) <= 0.5)
{
- Q2CorrectionDone = false;
- return 0; /// No Q2 correction if error < +/-0.5 %
+ return true; /// error < +/-0.5 % ==> no Q2 correction
}
- 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 [%]
+ 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 [%]
- double errLimitLo = LastTestResult.ErrLimLo() + LastTestResult.Uncertainty();
- double errLimitHi = LastTestResult.ErrLimHi() - LastTestResult.Uncertainty();
+ double errLimitLo = q2TestResult.ErrLimLo() + q2TestResult.Uncertainty();
+ double errLimitHi = q2TestResult.ErrLimHi() - q2TestResult.Uncertainty();
- if (LastTestResult.Error < errLimitLo) return 0; /// No Q2 correction if error too large -> WM failed
- if (LastTestResult.Error > errLimitHi) return 0; /// No Q2 correction if error too large -> WM failed
+ if ((q2TestResult.Error < errLimitLo) || (q2TestResult.Error > errLimitHi))
+ {
+ return false; /// Q2 error too large ==> water meter failed
+ }
- double volumeMeterErrLimLo = LastTestResult.VolumeRef * (100.0 + errLimitLo) / 100.0;
- double volumeMeterErrLimHi = LastTestResult.VolumeRef * (100.0 + errLimitHi) / 100.0;
+ double volumeMeterErrLimLo = q2TestResult.VolumeRef * (100.0 + errLimitLo) / 100.0;
+ double volumeMeterErrLimHi = q2TestResult.VolumeRef * (100.0 + errLimitHi) / 100.0;
- double corrFactorHi = (-1) * (errLimitLo / G) * (LastTestResult.VolumeRef / volumeMeterErrLimLo); /// > 0
- double corrFactorLo = (-1) * (errLimitHi / G) * (LastTestResult.VolumeRef / volumeMeterErrLimHi); /// < 0
+ double corrFactorHi = (-1) * (errLimitLo / G) * (q2TestResult.VolumeRef / volumeMeterErrLimLo); /// > 0
+ double corrFactorLo = (-1) * (errLimitHi / G) * (q2TestResult.VolumeRef / volumeMeterErrLimHi); /// < 0
- double corrFactor = (-1) * (LastTestResult.Error / G) * (LastTestResult.VolumeRef / LastTestResult.VolumeMeter);
- double origCalulatedCorrFactor = corrFactor;
+ q2CorrectionFactor = (-1) * (q2TestResult.Error / G) * (q2TestResult.VolumeRef / q2TestResult.VolumeMeter);
- log.WarnFormat("Q2 correction: {0}, corrFactor={4}, error={3}% [Lo={1}%, Hi={2}%]",
+ log.WarnFormat("Q2 correction: Pos={0}, PCB#={1}, corrFactor={2}, error={3}% [Lo={4}%, Hi={5}%]",
Name,
+ SerialNr,
+ q2CorrectionFactor.ToString("F1"),
+ q2TestResult.Error.ToString("F2"),
errLimitLo.ToString("F1"),
- errLimitHi.ToString("F1"),
- LastTestResult.Error.ToString("F2"),
- corrFactor.ToString("F1"));
+ errLimitHi.ToString("F1"));
- Q2CorrectionDone = true;
- return corrFactor;
+ return true;
}
@@ -225,50 +235,39 @@ namespace TBF.BenchControl.WaterMeters.iPerl
/// 2 Hz correction factor calculated from two Q3 tests - done at 2Hz and at 8Hz.
/// This factors should be used only for DN32 and DN40 meters.
///
- /// 2 Hz correction factor
- public double Hz2CorrectionFactor()
+ /// Test result @2Hz from which to calculate the factor
+ /// Test result @8Hz from which to calculate the factor
+ /// The calculated Q2 correction factor
+ /// true = OK, false = failed
+ public bool Calculate2HzCorrectionFactor(Results.Entities.MeterTestRslt resultAt2Hz,
+ Results.Entities.MeterTestRslt resultAt8Hz,
+ out double diff2Hz8Hz, out int hz2CorrectionFactor)
{
- Q2ErrorWOCorrection = LastTestResult.Error;
+ hz2CorrectionFactor = 0;
+ diff2Hz8Hz = 0;
- if (Math.Abs(LastTestResult.Error) <= 0.5)
+ if ((resultAt2Hz == null) || (resultAt8Hz == null))
{
- Q2CorrectionDone = false;
- return 0; /// No Q2 correction if error < +/-0.5 %
+ return false; /// Test result @2Hz and/or @8Hz is missing ==> water meter failed
}
- 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 [%]
+ diff2Hz8Hz = resultAt2Hz.Error - resultAt8Hz.Error;
- double errLimitLo = LastTestResult.ErrLimLo() + LastTestResult.Uncertainty();
- double errLimitHi = LastTestResult.ErrLimHi() - LastTestResult.Uncertainty();
+ if (Math.Abs(diff2Hz8Hz) > 2.5) return false; /// Difference of errors > 2.5 % ==> water meter failed
- if (LastTestResult.Error < errLimitLo) return 0; /// No Q2 correction if error too large -> WM failed
- if (LastTestResult.Error > errLimitHi) return 0; /// No Q2 correction if error too large -> WM failed
+ hz2CorrectionFactor = -1 * (int)Math.Round(10 * diff2Hz8Hz);
- double volumeMeterErrLimLo = LastTestResult.VolumeRef * (100.0 + errLimitLo) / 100.0;
- double volumeMeterErrLimHi = LastTestResult.VolumeRef * (100.0 + errLimitHi) / 100.0;
-
- double corrFactorHi = (-1) * (errLimitLo / G) * (LastTestResult.VolumeRef / volumeMeterErrLimLo); /// > 0
- double corrFactorLo = (-1) * (errLimitHi / G) * (LastTestResult.VolumeRef / volumeMeterErrLimHi); /// < 0
-
- double corrFactor = (-1) * (LastTestResult.Error / G) * (LastTestResult.VolumeRef / LastTestResult.VolumeMeter);
- double origCalulatedCorrFactor = corrFactor;
-
- log.WarnFormat("Q2 correction: {0}, corrFactor={4}, error={3}% [Lo={1}%, Hi={2}%]",
+ log.WarnFormat("2Hz correction: Pos={0}, PCB#={1}, corrFactor={2}, erro@2Hz={3}%, erro@8Hz={4}%",
Name,
- errLimitLo.ToString("F1"),
- errLimitHi.ToString("F1"),
- LastTestResult.Error.ToString("F2"),
- corrFactor.ToString("F1"));
+ SerialNr,
+ hz2CorrectionFactor,
+ resultAt2Hz.Error.ToString("F2"),
+ resultAt8Hz.Error.ToString("F2"));
- Q2CorrectionDone = true;
- return corrFactor;
+ return true;
}
+
/// Name set by the test, to be used as a part of the opto-data log file name
public string TestName;
@@ -368,7 +367,7 @@ namespace TBF.BenchControl.WaterMeters.iPerl
OriginalCalibFactor = 0;
Q2ErrorWOCorrection = 0;
Q2CorrectionDone = false;
- CurrentQ2Correction = 0;
+ Q2CorrectionFactor = 0;
optoDataCount = 0;
}