From acb54912258e31293c95613cfaa223e2efd730dd Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 1 Jun 2018 11:55:36 +0200 Subject: [PATCH] DatastreamFrame logging fixed, FrameFormat handling improved, PD log file names fixed, ver. 2.18.910 --- .../GenericDevices/IHasTestName.cs | 14 +++++++ .../SerialStream/DatastreamFrame.cs | 40 ++++++++++--------- .../SerialStream/FrameFormat.cs | 10 +++++ .../SerialStream/SerialStream.cs | 39 +++++++++++------- .../TestMethods/Endurance/EnduranceSeq.cs | 11 +++-- .../TestMethods/FlyingStart/FlyingStartSeq.cs | 13 +++--- .../FlyingStartFirstRepetWithMassCollSeq.cs | 13 +++--- .../FlyingStartMassCollProlongedSeq.cs | 13 +++--- .../FlyingStartMassCollectionSeq.cs | 13 +++--- .../iPerlCommunication/iPerlHead/IperlHead.cs | 18 ++++++--- TBF/Properties/AssemblyInfo.cs | 4 +- TBF/TBF.csproj | 1 + 12 files changed, 123 insertions(+), 66 deletions(-) create mode 100644 TBF/BenchControl/GenericDevices/IHasTestName.cs diff --git a/TBF/BenchControl/GenericDevices/IHasTestName.cs b/TBF/BenchControl/GenericDevices/IHasTestName.cs new file mode 100644 index 000000000..ec6d15e4f --- /dev/null +++ b/TBF/BenchControl/GenericDevices/IHasTestName.cs @@ -0,0 +1,14 @@ +/// +/// Copyright (c) 2018 Sensus Slovensko a.s. +/// +using System; + +namespace TBF.BenchControl.GenericDevices +{ + interface IHasTestName + { + string TestName { set; } + int TestRepeats { set; } + int RepetitionNr { set; } + } +} diff --git a/TBF/BenchControl/RegisterReaders/SerialStream/DatastreamFrame.cs b/TBF/BenchControl/RegisterReaders/SerialStream/DatastreamFrame.cs index 74bb9910c..1ed785f82 100644 --- a/TBF/BenchControl/RegisterReaders/SerialStream/DatastreamFrame.cs +++ b/TBF/BenchControl/RegisterReaders/SerialStream/DatastreamFrame.cs @@ -23,9 +23,9 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream public float RefFlow; /// [m3/h] public int Counter; - const int MaxLength = 256; - public char[] Data = new char[MaxLength]; - public int Length; + const int MaxDataLength = 256; + char[] data = new char[MaxDataLength]; + int dataLength; public byte CheckSum; @@ -38,11 +38,11 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream /// /// Calculated values /// - public double Volume(double scalingFactor) { return (double)VolumeRawExt / scalingFactor; } - public decimal TimestampDec() { return (decimal)TimestampExt / (decimal)8192; } + public double Volume(FrameFormat ff) { return (double)VolumeRawExt / ff.VolumeScaleFactor; } + public decimal TimestampDec(FrameFormat ff) { return (decimal)TimestampExt / (decimal)ff.TimeScaleFactor; } - public double VolumeDelta(double scalingFactor, DatastreamFrame previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); } - public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; } + public double VolumeDelta(FrameFormat ff, DatastreamFrame previous) { return (previous == null) ? 0 : Volume(ff) - previous.Volume(ff); } + public decimal TimeDelta(FrameFormat ff) { return TimestampDec(ff) - TestStartTimestampDec; } public string Label() { @@ -103,8 +103,9 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream return false; } - Length = frame.Length; - for (int i = 0; i < Math.Min(MaxLength, frame.Length); i++) Data[i] = frame[i]; + /// Copy data into the fixed size buffer + dataLength = frame.Length - 2; + for (int i = 0; i < Math.Min(MaxDataLength, dataLength); i++) data[i] = frame[i]; bool f1 = UInt32.TryParse(frame.Substring(ff.VolumeFieldStart, ff.VolumeFieldLength), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw); bool f2 = UInt32.TryParse(frame.Substring(ff.TimeFieldStart, ff.TimeFieldLength), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp); @@ -175,6 +176,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream return false; } + dataLength = 0; return true; } @@ -185,7 +187,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream } - public string ToString(double scalingFactor, DatastreamFrame previous) + public string ToString(FrameFormat ff, DatastreamFrame previous) { if (Flags == FrameFlags.SyncError) { @@ -195,20 +197,20 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream { return "Invalid telegram"; } - else /// if (flags == OptoTelegramFlags.OK / OptoTelegramFlags.OK_TestStart / OptoTelegramFlags.OK_TestEnd) + else /// if (flags == OptoTelegramFlags.OK || OptoTelegramFlags.OK_TestStart || OptoTelegramFlags.OK_TestEnd) { - StringBuilder sb = new StringBuilder(MaxLength); - for (int i = 0; i < Math.Min(MaxLength, Length - 2); i++) sb.Append(Data[i]); + StringBuilder sb = new StringBuilder(MaxDataLength); + for (int i = 0; i < Math.Min(MaxDataLength, dataLength); i++) sb.Append(data[i]); - return string.Format("{0}:{1}:{2}.{3}\t{4} : {5} Volume={6} Time={7} {8}", + return string.Format("{0}:{1}:{2}.{3} #{4} : {5} Volume={6} Time={7} {8}", DateTime.Hour.ToString("D2"), DateTime.Minute.ToString("D2"), DateTime.Second.ToString("D2"), - DateTime.Millisecond.ToString("D4"), - Counter, - sb, - VolumeRaw.ToString("X6"), - Timestamp.ToString("X8"), + DateTime.Millisecond.ToString("D3"), + Counter.ToString("D6"), + sb.ToString(), + Volume(ff), + TimestampDec(ff), Label()); } } diff --git a/TBF/BenchControl/RegisterReaders/SerialStream/FrameFormat.cs b/TBF/BenchControl/RegisterReaders/SerialStream/FrameFormat.cs index 030ed7b94..b31be515b 100644 --- a/TBF/BenchControl/RegisterReaders/SerialStream/FrameFormat.cs +++ b/TBF/BenchControl/RegisterReaders/SerialStream/FrameFormat.cs @@ -75,5 +75,15 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream TimeWrapThreshold = 1L << (4 * TimeFieldLength - 1); } } + + public override string ToString() + { + return string.Format("L={0} V={1}-{2}-{3}-{4}-{5} T={6}-{7}-{8}-{9}-{10}", + FrameLength, + VolumeUnits, VolumeScaleFactor, + VolumeFieldStart, VolumeFieldEnd, VolumeFieldFormat, + TimeUnits, TimeScaleFactor, + TimeFieldStart, TimeFieldEnd, TimeFieldFormat); + } } } \ No newline at end of file diff --git a/TBF/BenchControl/RegisterReaders/SerialStream/SerialStream.cs b/TBF/BenchControl/RegisterReaders/SerialStream/SerialStream.cs index 5a6b4aefb..b91bc6132 100644 --- a/TBF/BenchControl/RegisterReaders/SerialStream/SerialStream.cs +++ b/TBF/BenchControl/RegisterReaders/SerialStream/SerialStream.cs @@ -13,7 +13,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream /// /// This component = instance of this class is a placeholder for a combined main watermeter /// - public class SerialStream : ComponentBase, IDevice, GenericDevices.IRegisterReader, IOperation + public class SerialStream : ComponentBase, IDevice, GenericDevices.IRegisterReader, GenericDevices.IHasTestName, IOperation { private static readonly ILog log = LogManager.GetLogger(typeof(SerialStream)); public override string ToString() { return string.Format("RegisterReaders.SerialStream({0})", Cfg.ToString(1)); } @@ -82,7 +82,13 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream /// Name set by the test, to be used as a part of the opto-data log file name - public string TestName; + public string TestName { set { testName = value; } } + public int TestRepeats { set { testRepeats = value; } } + public int RepetitionNr { set { repetitionNr = value; } } + /// + string testName; + int testRepeats; + int repetitionNr; /// Name set by the test, to be used as a part of the opto-data log file name public string BenchName; @@ -193,6 +199,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream VolumeFieldStart, VolumeFieldEnd, VolumeFieldFormat, TimeUnits, TimeScaleFactor, TimeFieldStart, TimeFieldEnd, TimeFieldFormat); + log.WarnFormat("Initialize() ... FrameFormat set to {0}", currentFrameFormat); /// Allocate memory for opto-data from iPerl datastreamFrames = new DatastreamFrame[MaxDatastreamFramesCount]; @@ -309,10 +316,11 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream int digitIx = Name.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }); string position = (digitIx >= 0) ? Name.Substring(digitIx) : string.Empty; - datastreamLogFileName = string.Format("{0}_{1}_{2}.txt", + datastreamLogFileName = string.Format("{0}_{1}_{2}_{3}.txt", StateMachine.CycleStartTimeStamp.ToString("HHmmss"), position, - TestName); + testName, + repetitionNr); StartParsingDatastream(new FrameFormat(FrameLength, VolumeUnits, VolumeScaleFactor, @@ -357,7 +365,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream if (TestStartFrameIx > 0 && TestStartFrameIx < datastreamFrames.Length && datastreamFrames[TestStartFrameIx].Flags == FrameFlags.OK) { datastreamFrames[TestStartFrameIx].Flags = FrameFlags.OK_TestStart; - DatastreamFrame.TestStartTimestampDec = datastreamFrames[TestStartFrameIx].TimestampDec(); + DatastreamFrame.TestStartTimestampDec = datastreamFrames[TestStartFrameIx].TimestampDec(currentFrameFormat); } if (TestEndFrameIx > 0 && TestEndFrameIx < datastreamFrames.Length && datastreamFrames[TestEndFrameIx].Flags == FrameFlags.OK) @@ -367,11 +375,11 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream StopParsingDatastream(); DatastreamFrame.FIRFilterFlow(datastreamFrames, datastreamFramesCount); - SaveDatastreamLog(); + SaveDatastreamLog(currentFrameFormat); } - void SaveDatastreamLog() + void SaveDatastreamLog(FrameFormat ff) { string directory = string.Format("C:\\TBF\\ProcessData\\{0}\\{1}\\{2}\\", StateMachine.CycleStartTimeStamp.ToString("yy"), @@ -386,8 +394,8 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream using (TextWriter datastreamLogFile = new StreamWriter(datastreamLogPathName)) { - datastreamLogFile.WriteLine(datastreamFrames[0].ToString(scalFact, null)); - for (int i = 1; i < datastreamFramesCount; i++) datastreamLogFile.WriteLine(datastreamFrames[i].ToString(scalFact, datastreamFrames[i - 1])); + datastreamLogFile.WriteLine(datastreamFrames[0].ToString(ff, null)); + for (int i = 1; i < datastreamFramesCount; i++) datastreamLogFile.WriteLine(datastreamFrames[i].ToString(ff, datastreamFrames[i - 1])); datastreamLogFile.Close(); } } @@ -418,6 +426,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream { currentFrameFormat = ff; datastreamParsingEnabled = true; + log.WarnFormat("StartParsingDatastream() ... FrameFormat set to {0}", currentFrameFormat); } /// Stop parsig the opto serial port data @@ -472,7 +481,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream // CR+LF found if (streamState == DatastreamState.Read) { - if (pos < FrameLength - 2) + if (pos < ff.FrameLength - 2) { /// CR+LF found too early, truncate the beginning incl CR+LF and keep scanning in this loop allRcvd = allRcvd.Substring(pos + 2); @@ -484,7 +493,7 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream synchronized = true; } // CR+LF found and (pos >= OptoTelegramRaw.Length - 2) - else if (datastreamFrames[datastreamFramesCount].UpdateFromString(allRcvd.Substring(pos - ff.FrameLength + 2), ff, datastreamFramesCount, ref volumeRawExtLast, ref timestampExtLast)) + else if (datastreamFrames[datastreamFramesCount].UpdateFromString(allRcvd.Substring(pos - ff.FrameLength + 2, ff.FrameLength), ff, datastreamFramesCount, ref volumeRawExtLast, ref timestampExtLast)) { OptoTelegramRreceived(datastreamFramesCount++, synchronized2); synchronized2 = synchronized; @@ -539,22 +548,22 @@ namespace TBF.BenchControl.RegisterReaders.SerialStream if (volumeLtr == 0 && volumeLtr0 == 0) { - volumeLtr = (double)lastVolumeRaw * ScalingFactor() / 16000.0; + volumeLtr = (double)lastVolumeRaw / currentFrameFormat.VolumeScaleFactor; volumeLtr0 = volumeLtr; } else { - volumeLtr = (double)lastVolumeRaw * ScalingFactor() / 16000.0; + volumeLtr = (double)lastVolumeRaw / currentFrameFormat.VolumeScaleFactor; } if (timestampSec == 0 && timestampSec0 == 0) { - timestampSec = (double)lastTimestamp / 8192.0; + timestampSec = (double)lastTimestamp / currentFrameFormat.TimeScaleFactor; timestampSec0 = timestampSec; } else { - timestampSec = (double)lastTimestamp / 8192.0; + timestampSec = (double)lastTimestamp / currentFrameFormat.TimeScaleFactor; } //optoDataLogger.InfoFormat("{0} {1} {2} ltr {3} {4}", optoTelegram, lastTimestamp, lastVolumeRaw.ToString("X8"), timestampSec.ToString("F1"), volumeLtr.ToString("F3")); diff --git a/TBF/BenchControl/TestMethods/Endurance/EnduranceSeq.cs b/TBF/BenchControl/TestMethods/Endurance/EnduranceSeq.cs index ee5119f91..19aa7c57c 100644 --- a/TBF/BenchControl/TestMethods/Endurance/EnduranceSeq.cs +++ b/TBF/BenchControl/TestMethods/Endurance/EnduranceSeq.cs @@ -255,10 +255,13 @@ namespace TBF.BenchControl.TestMethods.Endurance foreach (var rr in sensPath.RegisterReaders) { - if (rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) - { - (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).TestName = test.Name; - } + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } } diff --git a/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs b/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs index 7a6e1f0cf..d04cfb4ac 100644 --- a/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStart/FlyingStartSeq.cs @@ -404,11 +404,14 @@ namespace TBF.BenchControl.TestMethods.FlyingStart foreach (var rr in sensPath.RegisterReaders) { - if (rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) - { - (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).TestName = test.Name; - } - } + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + } /// Measurement loop - preparation diff --git a/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/FlyingStartFirstRepetWithMassCollSeq.cs b/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/FlyingStartFirstRepetWithMassCollSeq.cs index d534df51f..976cbcc3c 100644 --- a/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/FlyingStartFirstRepetWithMassCollSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStartFirstRepetWithMassColl/FlyingStartFirstRepetWithMassCollSeq.cs @@ -570,11 +570,14 @@ namespace TBF.BenchControl.TestMethods.FlyingStartFirstRepetWithMassColl foreach (var rr in sensPath.RegisterReaders) { - if (rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) - { - (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).TestName = test.Name; - } - } + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + } /// Measurement loop - preparation diff --git a/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs b/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs index 80d501752..8eebb19f0 100644 --- a/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStartMassCollProlonged/FlyingStartMassCollProlongedSeq.cs @@ -575,11 +575,14 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollProlonged foreach (var rr in sensPath.RegisterReaders) { - if (rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) - { - (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).TestName = test.Name; - } - } + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + } /// Measurement loop - preparation diff --git a/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index 3d137db75..992588b47 100644 --- a/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TBF/BenchControl/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -625,11 +625,14 @@ namespace TBF.BenchControl.TestMethods.FlyingStartMassCollection foreach (var rr in sensPath.RegisterReaders) { - if (rr is TestMethods.iPerlCommunication.iPerlHead.IperlHead) - { - (rr as TestMethods.iPerlCommunication.iPerlHead.IperlHead).TestName = test.Name; - } - } + GenericDevices.IHasTestName readerWithTstName = rr as GenericDevices.IHasTestName; + if (readerWithTstName != null) + { + readerWithTstName.TestName = test.Name; + readerWithTstName.TestRepeats = test.Repeats; + readerWithTstName.RepetitionNr = repetitionNr; + } + } /// Measurement loop - preparation diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs index 73db92485..24de5c9ab 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs @@ -18,7 +18,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead /// /// This component = instance of this class is a placeholder for a combined main watermeter /// - public class IperlHead : ComponentBase, IDevice, GenericDevices.IRegisterReader, IOperation + public class IperlHead : ComponentBase, IDevice, GenericDevices.IRegisterReader, GenericDevices.IHasTestName, IOperation { private static readonly ILog log = LogManager.GetLogger(typeof(IperlHead)); public override string ToString() { return string.Format("iPerl({0})", Cfg.ToString(1)); } @@ -282,7 +282,13 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead /// Name set by the test, to be used as a part of the opto-data log file name - public string TestName; + public string TestName { set { testName = value; } } + public int TestRepeats { set { testRepeats = value; } } + public int RepetitionNr { set { repetitionNr = value; } } + /// + string testName; + int testRepeats; + int repetitionNr; /// Name set by the test, to be used as a part of the opto-data log file name public string BenchName; @@ -521,10 +527,10 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead if (wmPosition.Length == 1) wmPosition = "0" + wmPosition; string flowNr; - if (TestName != null && TestName.ToLower().Contains("q1")) flowNr = "01"; - else if (TestName != null && TestName.ToLower().Contains("q2")) flowNr = "02"; - else if (TestName != null && TestName.ToLower().Contains("q3")) flowNr = "03"; - else if (TestName != null && TestName.ToLower().Contains("adj")) flowNr = "0-1"; + if (testName != null && testName.ToLower().Contains("q1")) flowNr = "01"; + else if (testName != null && testName.ToLower().Contains("q2")) flowNr = "02"; + else if (testName != null && testName.ToLower().Contains("q3")) flowNr = "03"; + else if (testName != null && testName.ToLower().Contains("adj")) flowNr = "0-1"; else flowNr = "99"; optoDataLogFileName = string.Format("{0}_{1}_{2}_{3}.txt", diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index 185e4b85e..d38635821 100644 --- a/TBF/Properties/AssemblyInfo.cs +++ b/TBF/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.18.909.0")] -[assembly: AssemblyFileVersion("2.18.909.0")] +[assembly: AssemblyVersion("2.18.910.0")] +[assembly: AssemblyFileVersion("2.18.910.0")] diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index c7b67f9e2..11733e302 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -520,6 +520,7 @@ ValveCfgCtrl.cs +