diff --git a/Results/Entities/TestRslt.cs b/Results/Entities/TestRslt.cs index eb1be2171..bc11cfebd 100644 --- a/Results/Entities/TestRslt.cs +++ b/Results/Entities/TestRslt.cs @@ -39,8 +39,8 @@ namespace Results.Entities public virtual double VolumeCTV { get; set; } /// [l] Volume conventional true value public virtual double VolumeMaster { get; set; } /// [l] Volume from the master flow meter public virtual double ErrorMaster { get; set; } /// [%] - public virtual int ErrorFlags { get; set; } /// bitfield : bit0=E1, bit1=E2, bit2=E3, etc. - public virtual sbyte ErrorFlagsMd { get; set; } /// 0=off, 1=info, 2=on (evaluated in MeterTestRslt.Passed) + public virtual int ErrorFlags { get; set; } /// bitfield : bit0=E1, bit1=E2, bit2=E3, etc. + public virtual sbyte ErrorFlagsMd { get; set; } /// 0=off, 1=info, 2=on (evaluated in MeterTestRslt.Passed) /// Main results of heat meters public virtual double RefEnergy { get; set; } /// [J] Joul diff --git a/Results/Entities/WaterMeter.cs b/Results/Entities/WaterMeter.cs index a5b5a37d0..8ea88c2a3 100644 --- a/Results/Entities/WaterMeter.cs +++ b/Results/Entities/WaterMeter.cs @@ -50,7 +50,9 @@ namespace Results.Entities public virtual string EndStateAux { get; set; } /// End state of the auxiliary water meter public virtual double QRise { get; set; } /// [m3/h] detected Q_rise of a composed meter public virtual double QFall { get; set; } /// [m3/h] detected Q_fall of a composed meter - public virtual bool Passed { get; set; } + //public virtual int ErrorFlags { get; set; } /// bitfield : bit14=E15, bit15=E16 + //public virtual sbyte ErrorFlagsMd { get; set; } /// 0=off, 1=info, 2=on (evaluated in MeterTestRslt.Passed) + public virtual bool Passed { get; set; } public virtual int ResultCode { get; set; } public virtual string ArchivePath { get; set; } public virtual string Remark { get; set; } @@ -109,6 +111,16 @@ namespace Results.Entities public virtual MeterTestRslt LastMeterTestRslts() { return lastMeterTestRslts; } + //public virtual int ErrorFlagsFromTestsAndWM() + //{ + // int errorFlags = TBF.BenchControl.Sequences.ProcessData.ErrorFlagsComp.ErrorFlags; + // foreach (var mtr in MeterTestRslts) + // { + // if (mtr.TestDone) errorFlags |= mtr.TestRslt.ErrorFlags; + // } + // return errorFlags; + //} + public virtual bool PassedFromTests() { bool passed = true; diff --git a/TestBenchFramework/BenchControl/GenericDevices/IErrorFlags.cs b/TestBenchFramework/BenchControl/GenericDevices/IErrorFlags.cs index a770a9138..b304de1ea 100644 --- a/TestBenchFramework/BenchControl/GenericDevices/IErrorFlags.cs +++ b/TestBenchFramework/BenchControl/GenericDevices/IErrorFlags.cs @@ -2,7 +2,6 @@ /// Copyright (c) 2017 Sensus Metering Systems /// using System; -using System.Collections.Generic; using TBF.BenchControl.Generic; using Results.Entities; @@ -14,8 +13,8 @@ namespace TBF.BenchControl.GenericDevices int GetErrorFlags(TestRslt testRslt, bool getE9E10, bool getE11E12, int switchTimeStart, int switchTimeEnd); - int GetE15(IList meterTestRslts); /// Return value is either 0 (=OK) or 0x4000 (=E15), it should be OR-ed with error flags + int GetE15(MeterTestRslt mtrQ3, MeterTestRslt mtrQ2, MeterTestRslt mtrQ1); /// Return value is either 0 (=OK) or 0x4000 (=E15), it should be OR-ed with error flags - int GetE16(IList meterTestRslts); /// Return value is either 0 (=OK) or 0x8000 (=E16), it should be OR-ed with error flags + int GetE16(MeterTestRslt mtrQ3, MeterTestRslt mtrQ2, MeterTestRslt mtrQ1); /// Return value is either 0 (=OK) or 0x8000 (=E16), it should be OR-ed with error flags } } diff --git a/TestBenchFramework/BenchControl/Various/ErrorFlags/Errors.cs b/TestBenchFramework/BenchControl/Various/ErrorFlags/Errors.cs index 0862e39da..a96bc6ded 100644 --- a/TestBenchFramework/BenchControl/Various/ErrorFlags/Errors.cs +++ b/TestBenchFramework/BenchControl/Various/ErrorFlags/Errors.cs @@ -12,10 +12,8 @@ namespace TBF.BenchControl.Various.ErrorFlags { public class Errors : ComponentBase, GenericDevices.IErrorFlags { - /// TODO: Implement support for sharing one camera by multiple ROI-s - private static readonly ILog log = LogManager.GetLogger(typeof(Errors)); - public override string ToString() + public override string ToString() { return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); } @@ -116,20 +114,43 @@ namespace TBF.BenchControl.Various.ErrorFlags return ErrorFlags; } - public int GetE15(IList meterTestRslts) + + MeterTestRslt GetMtrTstRsltFromNames(IList meterTestRslts, string testNames) { - if (Mode == Config.Entities.ErrorFlagsMode.Off || !errorsCfg.TestParams.E15) + if (string.IsNullOrEmpty(testNames)) return null; + + string[] names = testNames.Split(new char[] { ';' }); + + foreach (var nm in names) { - return 0; + foreach (var mtr in meterTestRslts) if (mtr.Name() == nm) return mtr; } - MeterTestRslt mtrQ3 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q3Names); - MeterTestRslt mtrQ2 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q2Names); - MeterTestRslt mtrQ1 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q1Names); + return null; /// No matching MeterTestRslt found + } - if (mtrQ3 != null && mtrQ3.TestDone && (mtrQ3.Error > mtrQ3.ErrLimHi() / 2) && - mtrQ2 != null && mtrQ2.TestDone && (mtrQ2.Error > mtrQ2.ErrLimHi() / 2) && - mtrQ1 != null && mtrQ1.TestDone && (mtrQ1.Error > mtrQ1.ErrLimHi() / 2)) + /// + /// Returns 'true' when all three test were found and all three are 'TestDone' + /// + /// + /// mtrQ3 or null + /// mtrQ2 or null + /// mtrQ1 or null + /// + public bool GetSelectedMtrs(IList meterTestRslts, out MeterTestRslt mtrQ3, out MeterTestRslt mtrQ2, out MeterTestRslt mtrQ1) + { + mtrQ3 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q3Names); + mtrQ2 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q2Names); + mtrQ1 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q1Names); + + return (mtrQ3 != null && mtrQ3.TestDone && mtrQ2 != null && mtrQ2.TestDone && mtrQ1 != null && mtrQ1.TestDone); + } + + public int GetE15(MeterTestRslt mtrQ3, MeterTestRslt mtrQ2, MeterTestRslt mtrQ1) + { + if ((mtrQ3.Error > mtrQ3.ErrLimHi() / 2) && + (mtrQ2.Error > mtrQ2.ErrLimHi() / 2) && + (mtrQ1.Error > mtrQ1.ErrLimHi() / 2)) { return 0x4000; } @@ -139,20 +160,11 @@ namespace TBF.BenchControl.Various.ErrorFlags } } - public int GetE16(IList meterTestRslts) + public int GetE16(MeterTestRslt mtrQ3, MeterTestRslt mtrQ2, MeterTestRslt mtrQ1) { - if (Mode == Config.Entities.ErrorFlagsMode.Off || !errorsCfg.TestParams.E16) - { - return 0; - } - - MeterTestRslt mtrQ3 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q3Names); - MeterTestRslt mtrQ2 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q2Names); - MeterTestRslt mtrQ1 = GetMtrTstRsltFromNames(meterTestRslts, errorsCfg.Q1Names); - - if (mtrQ3 != null && mtrQ3.TestDone && (mtrQ3.Error < mtrQ3.ErrLimLo() / 2) && - mtrQ2 != null && mtrQ2.TestDone && (mtrQ2.Error < mtrQ2.ErrLimLo() / 2) && - mtrQ1 != null && mtrQ1.TestDone && (mtrQ1.Error < mtrQ1.ErrLimLo() / 2)) + if ((mtrQ3.Error < mtrQ3.ErrLimLo() / 2) && + (mtrQ2.Error < mtrQ2.ErrLimLo() / 2) && + (mtrQ1.Error < mtrQ1.ErrLimLo() / 2)) { return 0x8000; } @@ -162,18 +174,18 @@ namespace TBF.BenchControl.Various.ErrorFlags } } - MeterTestRslt GetMtrTstRsltFromNames(IList meterTestRslts, string testNames) + public int GetErrorFlags(IList meterTestRslts) { - if (string.IsNullOrEmpty(testNames)) return null; + MeterTestRslt mtrQ3, mtrQ2, mtrQ1; + int errorFlags = 0; - string[] names = testNames.Split(new char[] {';'}); - - foreach (var nm in names) + if (GetSelectedMtrs(meterTestRslts, out mtrQ3, out mtrQ2, out mtrQ1)) { - foreach (var mtr in meterTestRslts) if (mtr.Name() == nm) return mtr; + errorFlags |= GetE15(mtrQ3, mtrQ1, mtrQ1); + errorFlags |= GetE16(mtrQ3, mtrQ1, mtrQ1); } - - return null; /// No matching MeterTestRslt found + + return errorFlags; } @@ -191,6 +203,7 @@ namespace TBF.BenchControl.Various.ErrorFlags log.Debug(this.ToString()); } + #region Configuration Change Handling public static void OnCfgChange(object sender, CfgChangeArgs args)