E15 and E16 implementation in progress.

This commit is contained in:
Milan Hanajik 2017-09-27 08:26:47 +02:00
parent 4f06438371
commit d9fc5482db
4 changed files with 63 additions and 39 deletions

View File

@ -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

View File

@ -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;

View File

@ -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<MeterTestRslt> 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<MeterTestRslt> 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
}
}

View File

@ -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<MeterTestRslt> meterTestRslts)
MeterTestRslt GetMtrTstRsltFromNames(IList<MeterTestRslt> 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))
/// <summary>
/// Returns 'true' when all three test were found and all three are 'TestDone'
/// </summary>
/// <param name="meterTestRslts"></param>
/// <param name="mtrQ3">mtrQ3 or null</param>
/// <param name="mtrQ2">mtrQ2 or null</param>
/// <param name="mtrQ1">mtrQ1 or null</param>
/// <returns></returns>
public bool GetSelectedMtrs(IList<MeterTestRslt> 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<MeterTestRslt> 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<MeterTestRslt> meterTestRslts, string testNames)
public int GetErrorFlags(IList<MeterTestRslt> 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)