diff --git a/Config/Entities/IperlEnums.cs b/Config/Entities/IperlEnums.cs index ce32d3848..3a3bf135b 100644 --- a/Config/Entities/IperlEnums.cs +++ b/Config/Entities/IperlEnums.cs @@ -25,6 +25,14 @@ namespace Config.Entities Count } + public enum Counting + { + Arbitrary, + Positive, + Negative, + Count + } + public enum OptoHeadState { Disabled, diff --git a/Results/Entities/WaterMeter.cs b/Results/Entities/WaterMeter.cs index 2b44ef355..c18141f46 100644 --- a/Results/Entities/WaterMeter.cs +++ b/Results/Entities/WaterMeter.cs @@ -93,6 +93,8 @@ namespace Results.Entities #if ORACLE_DB public virtual int Pruefindex { get; set; } /// Not mapped to DB !!! 0=unknown (saving to Oracle failed), >=1 ... pruefindex public virtual int HydrPruefung { get; set; } /// Not mapped to DB !!! + public virtual int WMTypeRevision { get; set; } /// Not mapped to DB !!! + public virtual object TestInfos { get; set; } /// SensusTestInfo[] array fetched at the beginning of the cycle, not mapped to DB !!! #endif public virtual WaterMeterData WaterMeterData { get; set; } public virtual Batch Batch { get; set; } @@ -341,6 +343,12 @@ namespace Results.Entities public WaterMeter() { MeterTestRslts = new List(); +#if ORACLE_DB + Pruefindex = 1; + HydrPruefung = 0; + WMTypeRevision = 0; + TestInfos = null; +#endif } @@ -394,6 +402,8 @@ namespace Results.Entities #if ORACLE_DB Pruefindex = src.Pruefindex; HydrPruefung = src.HydrPruefung; + WMTypeRevision = src.WMTypeRevision; + TestInfos = src.TestInfos; #endif foreach (var mtr in MeterTestRslts) { diff --git a/Results/Entities/WaterMeterData.cs b/Results/Entities/WaterMeterData.cs index c70578b75..dd06aa7b9 100644 --- a/Results/Entities/WaterMeterData.cs +++ b/Results/Entities/WaterMeterData.cs @@ -54,7 +54,6 @@ namespace Results.Entities #if ORACLE_DB public virtual int WMTypeId { get; set; } - public virtual int WMTypeRev { get; set; } #endif public WaterMeterData() @@ -111,7 +110,6 @@ namespace Results.Entities #if ORACLE_DB if (WMTypeId != wmd.WMTypeId) return false; - if (WMTypeRev != wmd.WMTypeRev) return false; #endif return true; } diff --git a/Results/Mappings/WaterMeterDataMap.cs b/Results/Mappings/WaterMeterDataMap.cs index 79164a664..13529ee14 100644 --- a/Results/Mappings/WaterMeterDataMap.cs +++ b/Results/Mappings/WaterMeterDataMap.cs @@ -54,7 +54,6 @@ namespace Results.Mappings #endif #if ORACLE_DB Map(x => x.WMTypeId); - Map(x => x.WMTypeRev); #endif } } diff --git a/ResultsBrowser/Properties/AssemblyInfo.cs b/ResultsBrowser/Properties/AssemblyInfo.cs index b7dfbffed..3a4ad442c 100644 --- a/ResultsBrowser/Properties/AssemblyInfo.cs +++ b/ResultsBrowser/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.18.1122.0")] -[assembly: AssemblyFileVersion("2.18.1122.0")] +[assembly: AssemblyVersion("2.18.1140.0")] +[assembly: AssemblyFileVersion("2.18.1140.0")] diff --git a/TBF/BenchControl/Operations/LargeMessageBoxForm.Designer.cs b/TBF/BenchControl/Operations/LargeMessageBoxForm.Designer.cs new file mode 100644 index 000000000..8df2405a0 --- /dev/null +++ b/TBF/BenchControl/Operations/LargeMessageBoxForm.Designer.cs @@ -0,0 +1,86 @@ +/// +/// Copyright (c) 2019 Sensus Metering Systems +/// +namespace TBF.BenchControl.Operations +{ + partial class LargeMessageBoxForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.okButton = new System.Windows.Forms.Button(); + this.messageLabel = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // okButton + // + this.okButton.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.okButton.ForeColor = System.Drawing.Color.Black; + this.okButton.Location = new System.Drawing.Point(452, 523); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(98, 63); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // messageLabel + // + this.messageLabel.AutoSize = true; + this.messageLabel.Font = new System.Drawing.Font("Verdana", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); + this.messageLabel.Location = new System.Drawing.Point(34, 29); + this.messageLabel.Name = "messageLabel"; + this.messageLabel.Size = new System.Drawing.Size(91, 23); + this.messageLabel.TabIndex = 4; + this.messageLabel.Text = "Message"; + // + // LargeMessageBoxForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Goldenrod; + this.ClientSize = new System.Drawing.Size(1002, 617); + this.Controls.Add(this.messageLabel); + this.Controls.Add(this.okButton); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "LargeMessageBoxForm"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.TopMost = true; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MessageBoxForm_FormClosing); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.Label messageLabel; + } +} \ No newline at end of file diff --git a/TBF/BenchControl/Operations/LargeMessageBoxForm.cs b/TBF/BenchControl/Operations/LargeMessageBoxForm.cs new file mode 100644 index 000000000..432389835 --- /dev/null +++ b/TBF/BenchControl/Operations/LargeMessageBoxForm.cs @@ -0,0 +1,99 @@ +/// +/// Copyright (c) 2019 Sensus Slovensko a.s. +/// +using System; +using System.Drawing; +using System.Windows.Forms; +using log4net; +using TBF.Resources; + +namespace TBF.BenchControl.Operations +{ + public partial class LargeMessageBoxForm : Form + { + static readonly ILog log = LogManager.GetLogger(typeof(LargeMessageBoxForm)); + + /// Set to 'true' when the form closes + public bool Completed { get { return completed; } } + bool completed; + + + public LargeMessageBoxForm(string message, Color backgroundColor) + { + InitializeComponent(); + //ControlBox = false; + + Localize(); + messageLabel.Text = message; + BackColor = backgroundColor; + + float textWidth = Graphics.FromImage(new Bitmap(1, 1)).MeasureString(messageLabel.Text, messageLabel.Font).Width; + int rqrdFormWidth = (int)textWidth + 80; /// Form width calculated from the text width + + if (rqrdFormWidth > Width) + { + int shift = (rqrdFormWidth - Width) / 2; + Width = rqrdFormWidth; + okButton.Left += shift; + } + + completed = false; + StartForceCloseHandler(); + } + + void Localize() + { + okButton.Text = Strings.OkBtnText; + } + + private void okButton_Click(object sender, EventArgs e) + { + completed = true; + Close(); + } + + private void MessageBoxForm_FormClosing(object sender, FormClosingEventArgs e) + { + completed = true; + } + + #region Forced close handling + + /// + /// Used by CoverTest, AskYesNoOp and LargeMessageBoxOp. + /// + public void OnCloseThisForm(object sender, EventArgs args) + { + if (CloseThisFormHandler == null) return; + try + { + CloseThisFormHandler(sender, null); + } + catch (Exception e) + { + log.Error("CloseThisFormHandler(...) failed", e); + } + } + + public event EventHandler CloseThisFormHandler; + + public void StartForceCloseHandler() + { + CloseThisFormHandler += delegate(object sender, EventArgs args) + { + if (InvokeRequired) + Invoke(new EventHandler(OnForceClose), sender, args); + else + OnForceClose(sender, args); + }; + } + + private void OnForceClose(object sender, EventArgs args) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + #endregion + } +} diff --git a/TBF/BenchControl/Operations/LargeMessageBoxForm.resx b/TBF/BenchControl/Operations/LargeMessageBoxForm.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/TBF/BenchControl/Operations/LargeMessageBoxForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF/BenchControl/Operations/LargeMessageBoxOp.cs b/TBF/BenchControl/Operations/LargeMessageBoxOp.cs new file mode 100644 index 000000000..f4749eb4a --- /dev/null +++ b/TBF/BenchControl/Operations/LargeMessageBoxOp.cs @@ -0,0 +1,76 @@ +/// +/// Copyright (c) 2019 Sensus Slovensko a.s. +/// +using System; +using System.Collections.Generic; +using System.Drawing; +using TBF.BenchControl; +using TBF.Resources; + +namespace TBF.BenchControl.Operations +{ + public class LargeMessageBoxOp : IOperation + { + LargeMessageBoxForm form; + + string message; + Color backColor; + bool completed = false; + + /// Reference to the operation + public LargeMessageBoxOp() + : this(Strings.Message) + { + } + + public LargeMessageBoxOp(string message) + : this (message, Color.Goldenrod) + { + } + + public LargeMessageBoxOp(string message, Color backColor) + { + this.message = message; + this.backColor = backColor; + } + + delegate void MessageBoxFormDlgt(LargeMessageBoxOp myRef); + /// + void OpenFormDlg(LargeMessageBoxOp myRef) + { + myRef.form = new LargeMessageBoxForm(message, backColor); + form.Show(); + } + + /// Start this operation + public void Start() + { + completed = false; + Program.MainWnd.Invoke(new MessageBoxFormDlgt(OpenFormDlg), this); + } + + /// Run this operation + /// Event.ResultsPrinted + public Event Run() + { + if (completed || form.Completed) + { + completed = true; + form = null; + return Event.OK; + } + + return Event.None; + } + + /// Stop this operation + public void Stop() + { + if (form != null) + { + form.OnCloseThisForm(this, null); + form = null; + } + } + } +} diff --git a/TBF/BenchControl/Output/DB/SensusOracle/Database.cs b/TBF/BenchControl/Output/DB/SensusOracle/Database.cs index fef55552e..96808d398 100644 --- a/TBF/BenchControl/Output/DB/SensusOracle/Database.cs +++ b/TBF/BenchControl/Output/DB/SensusOracle/Database.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2015-2018 Sensus Metering Systems +/// Copyright (c) 2015-2019 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -21,7 +21,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, GenericDevices.IStartInfoReader, Generic.IDevice { private static readonly ILog log = LogManager.GetLogger(typeof(Database)); - public override string ToString() { return string.Format("Sensus-Oracle-Database({0})", Cfg.ToString(1)); } + public override string ToString() { return string.Format("{0}({1})", GetType().Namespace.Substring(17), Cfg.ToString(1)); } const int Anbid_StaraTura = 4; @@ -58,10 +58,10 @@ namespace TBF.BenchControl.Output.DB.SensusOracle OracleConnection connection; /// Oracle database connection /// - /// The following 3 variables are always update together + /// The following 3 variables are always updated together /// - int id_WZTyp; - int rev_WZTyp; + int wmTypeId; + int wmTypeRevision; SensusTestInfo[] completeTestInfos; /// Contains (1) range (90-100/100-110), (2) TBF test name, (3) string form of the flowId ... /// ... in addition to incomplete test info from Oracle @@ -136,19 +136,36 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// Water meter type Id /// Water meter type revision /// SensusTestInfos array - SensusTestInfo[] GetMatchingTestInfo(OracleConnection conn, int wmTypeId, int wmTypeRevision) + SensusTestInfo[] GetMatchingTestInfo(OracleConnection conn, int wmTypeId, out int wmTypeRevision) { /// /// Read 'incomplete' TestInfo from Oracle database containing only flowId-s ad qBezeichnung-s /// IList oraDbTinfos = new List(); - OracleCommand cmd = new OracleCommand("SELECT PruefungsNr, PosFehlerKalt, QBezeichnung FROM VT_PRUEFPUNKT_SOLL_SD WHERE ANBID=4 AND ID_WZTyp=:1 AND Rev_WZTyp=:2", conn); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeId }); ///:1 - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); ///:2 + /// + /// For a given 'wmTypeId' find the most recent active 'wmTypeRevision' + /// + wmTypeRevision = -1; + OracleCommand cmd = new OracleCommand("select REV_WZTYP from VT_WZTYP_SD where ANBID=4 and ID_WZTyp=:1 and AKTIV=:2", conn); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeId }); ///:1 + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 1 }); ///:2 /// OracleDataReader dr = cmd.ExecuteReader(); while (dr.Read()) + { + wmTypeRevision = dr.GetInt32(0); + } + dr.Close(); + + if (wmTypeRevision == -1) return null; /// No 'wmTypeRevision' found + + cmd = new OracleCommand("select PruefungsNr, PosFehlerKalt, QBezeichnung from VT_PRUEFPUNKT_SOLL_SD where ANBID=4 and ID_WZTyp=:1 and Rev_WZTyp=:2", conn); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeId }); ///:1 + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); ///:2 + /// + dr = cmd.ExecuteReader(); + while (dr.Read()) { int pruefungsNr = dr.GetInt32(0); double errLimHi = dr.GetDouble(1); @@ -394,23 +411,31 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// /// Read start info of one water meter from the database /// - /// 0-based water meter number - /// Sorted list of results to update + /// Oracke DB connection + /// Water meter entity + /// Retv.OK when successful, Retv.Error on error Retv ReadSingleWMfromDB(OracleConnection conn, Results.Entities.WaterMeter wm) { if (string.IsNullOrEmpty(wm.SerialNr)) return Retv.Error; /// No database activity possible w/o PCB number try { - if (completeTestInfos == null || (id_WZTyp != wm.WaterMeterData.WMTypeId) || (rev_WZTyp != wm.WaterMeterData.WMTypeRev)) + if (completeTestInfos == null || (wmTypeId == 0) || (wmTypeId != wm.WaterMeterData.WMTypeId)) { - SensusTestInfo[] ti = GetMatchingTestInfo(conn, wm.WaterMeterData.WMTypeId, wm.WaterMeterData.WMTypeRev); + int wmTR; + SensusTestInfo[] ti = GetMatchingTestInfo(conn, wm.WaterMeterData.WMTypeId, out wmTR); if (ti != null) { + /// All 3 updated together + wmTypeId = wm.WaterMeterData.WMTypeId; + wmTypeRevision = wmTR; completeTestInfos = ti; - id_WZTyp = wm.WaterMeterData.WMTypeId; - rev_WZTyp = wm.WaterMeterData.WMTypeRev; + + /// Write to WaterMeter entity + wm.TestInfos = ti; + wm.WMTypeRevision = wmTR; + Sequences.ProcessData.TestInfos = ti; } else { @@ -466,7 +491,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// log.ErrorFormat("Water meter {0} was not found in ORACLE database.", wm.SerialNr); dr.Close(); - return Retv.Error; + return dbCfg.StartInfoIsRequired ? Retv.Error : Retv.OK; } dr.Close(); @@ -496,7 +521,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// cmd = new OracleCommand("select PRUEFINDEX, Q2CORRECTIONLEFT, Q2CORRECTIONRIGHT, ERRQ2 from VT_IP_ZAEHLER_PINDEX_PD where VT_FERNUM = :1 AND ANBID = 4", conn); /// pruefindex, Q2_correction_RL, Q2_correction_LR, Q2_error_before_correction - cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); dr = cmd.ExecuteReader(); while (dr.Read()) { @@ -516,8 +541,8 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// /// testID, flow, rel.err., passed cmd = new OracleCommand("select PRUEFUNGSNR, Q_WZ, Q_FEHLER, Q_BEST from VT_PRUEFREIHE_IST_PD where VT_FERNUM = :1 AND PRUEFINDEX = :2 AND ANBID = 4", conn); - cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); - cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = 100 * testBenchID + maxPruefindex }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 100 * testBenchID + maxPruefindex }); dr = cmd.ExecuteReader(); while (dr.Read()) @@ -557,7 +582,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// /// Copy acquired data to WaterMeter object /// - wm.Pruefindex = maxPruefindex; + wm.Pruefindex = maxPruefindex + 1; /// Increment the proefindex from Oracle so that it is the pruefindex of the current cycle log.InfoFormat("Data of water meter {0} successfully read from ORACLE database.", wm.SerialNr); log.DebugFormat(" MaxPruefindex = {0}", wm.Pruefindex); #if TURA_SPECIAL @@ -728,15 +753,17 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// Batch void SaveBatchData(OracleConnection conn, Results.Entities.Batch b) { - if ((completeTestInfos == null) || (id_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeId) || (rev_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeRev)) + if ((wmTypeId != b.WaterMeters[0].WaterMeterData.WMTypeId) || (completeTestInfos == null) || (wmTypeRevision == 0)) { - SensusTestInfo[] ti = GetMatchingTestInfo(conn, b.WaterMeters[0].WaterMeterData.WMTypeId, b.WaterMeters[0].WaterMeterData.WMTypeRev); + int wmTR = 0; + SensusTestInfo[] ti = GetMatchingTestInfo(conn, b.WaterMeters[0].WaterMeterData.WMTypeId, out wmTR); if (ti != null) { + /// All 3 updated together completeTestInfos = ti; - id_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeId; - rev_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeRev; + wmTypeId = b.WaterMeters[0].WaterMeterData.WMTypeId; + wmTypeRevision = wmTR; } else { @@ -744,6 +771,11 @@ namespace TBF.BenchControl.Output.DB.SensusOracle } } + if (completeTestInfos == null || wmTypeId == 0 || wmTypeRevision == 0) + { + throw new Exception("No matching test infos found"); + } + OracleCommand cmd = new OracleCommand("INSERT INTO VT_PRUEFREIHE_PD(ANBID, ID_Pruefstand, ID_WzPruefreihe, ID_WZTyp, " + "Rev_WZTyp, Rev_Pruefstand_WZTyp, StartDatumZeit, EndDatumZeit, Betriebsart, " + "QVzKontakt, FuellenBegDruck, DruckEvakVorne, DruckEvakHinten, DruckBeiAbpressen, " + @@ -754,7 +786,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 18000 + b.TestBenchId }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = b.BatchNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = b.WaterMeters[0].WaterMeterData.WMTypeId }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = b.WaterMeters[0].WaterMeterData.WMTypeRev }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 1 }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = b.StartTime }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.TimeStamp, Value = b.EndTime }); @@ -771,45 +803,85 @@ namespace TBF.BenchControl.Output.DB.SensusOracle foreach (var testInfo in completeTestInfos) { - Results.Entities.TestRslt tr = b.GetTestRslt(testInfo.TestName, 0); + if ((-20 <= testInfo.PruefungsNr) && (testInfo.PruefungsNr <= 20)) /// LU PruefungsNr-s are between -20 and 20 + { + Results.Entities.TestRslt tr = b.GetTestRslt(testInfo.TestName, 0); - if (tr == null) tr = b.GetTestRslt(testInfo.TestName, 1); /// TODO: Remove this workaround for large watermeters with multiple parts at Q3 - if (tr == null) continue; - double Q_ist = (tr.VolumeMaster != 0) ? (tr.FlowVolume * tr.VolumeCTV / tr.VolumeMaster) : (double)tr.FlowVolume; + if (tr == null) tr = b.GetTestRslt(testInfo.TestName, 1); /// TODO: Remove this workaround for large watermeters with multiple parts at Q3 + if (tr == null) continue; - OracleCommand cmd2 = new OracleCommand("INSERT INTO VT_PRUEFDURCHFLUSS_PD(" + - "ANBID, ID_Pruefstand, ID_WzPruefreihe, PruefungsNr, " + - "PVOL, PMasse, MinDurchfluss, MaxDurchfluss, " + - "Q_ist, KFaktor, Q_VZ, F_VZ, RegelEinstellZeit, Drehzahl, " + - "BeginnDruck_Vorne, BeginnDruck_Hinten, EndDruck_Vorne, EndDruck_Hinten, " + - "TVWZ, IVWZ, Verwendeter_VZ, BeginnGewicht, EndGewicht)" + - " VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, " + - ":16, :17, :18, :19, :20, :21, :22, :23)", conn); +#if false + OracleCommand cmd2 = new OracleCommand("INSERT INTO VT_PRUEFDURCHFLUSS_PD(ANBID, ID_Pruefstand, ID_WzPruefreihe, PruefungsNr, PVOL, PMasse, " + + "MinDurchfluss, MaxDurchfluss, Q_ist, KFaktor, Q_VZ, F_VZ, RegelEinstellZeit, Drehzahl, BeginnDruck_Vorne, " + + "BeginnDruck_Hinten, EndDruck_Vorne, EndDruck_Hinten, TVWZ, IVWZ, Verwendeter_VZ, BeginnGewicht, EndGewicht) " + + "VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17, :18, :19, :20, :21, :22, :23)", conn); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 18000 + b.TestBenchId }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = b.BatchNr }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = testInfo.PruefungsNr }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.l, tr.VolumeCTV) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd-tr.MassStart) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMin) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMax) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, Q_ist) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = tr.ConstMaster }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowVolume) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = tr.ErrorMaster }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = (double)tr.FlowSetTime }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpStart) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownStart) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpEnd) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownEnd) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = tr.TestTime }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = tr.PulsesMaster }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassStart) }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd) }); - cmd2.ExecuteNonQuery(); /// Returns nr. of updated rows + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 18000 + b.TestBenchId }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = b.BatchNr }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = testInfo.PruefungsNr }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.l, tr.VolumeCTV) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd - tr.MassStart) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMin) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMax) }); + double Q_ist = (tr.VolumeMaster != 0) ? (tr.FlowVolume * tr.VolumeCTV / tr.VolumeMaster) : (double)tr.FlowVolume; + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, Q_ist) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = tr.ConstMaster }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowVolume) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = tr.ErrorMaster }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = (double)tr.FlowSetTime }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpStart) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownStart) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpEnd) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownEnd) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = tr.TestTime }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = tr.PulsesMaster }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassStart) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd) }); + cmd2.ExecuteNonQuery(); /// Returns nr. of updated rows +#else + OracleCommand cmd2 = new OracleCommand("INSERT INTO VT_PRUEFDURCHFLUSS_PD(" + + "ANBID, ID_Pruefstand, ID_WzPruefreihe, PruefungsNr, " + + "PVOL, PMasse, MinDurchfluss, MaxDurchfluss, " + + "Q_ist, KFaktor, Q_VZ, F_VZ, RegelEinstellZeit, Drehzahl, " + + "BeginnDruck_Vorne, BeginnDruck_Hinten, EndDruck_Vorne, EndDruck_Hinten, " + + "TVWZ, IVWZ, Verwendeter_VZ, BeginnGewicht, EndGewicht)" + + " VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, " + + ":16, :17, :18, :19, :20, :21, :22, :23)", conn); + OracleParameter parm; + parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd2.Parameters.Add(parm); ///:1 + parm = new OracleParameter("ID_Pruefstand", OracleDbType.Int32); parm.Value = 18000 + b.TestBenchId; cmd2.Parameters.Add(parm); ///:2 + parm = new OracleParameter("ID_WzPruefreihe", OracleDbType.Int32); parm.Value = b.BatchNr; cmd2.Parameters.Add(parm); ///:3 + parm = new OracleParameter("PruefungsNr", OracleDbType.Int32); parm.Value = testInfo.PruefungsNr; cmd2.Parameters.Add(parm); ///:4 + /// + parm = new OracleParameter("PVOL", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.l, tr.VolumeCTV); cmd2.Parameters.Add(parm); ///:5 + parm = new OracleParameter("PMasse", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.kg, tr.MassEnd-tr.MassStart); cmd2.Parameters.Add(parm); ///:6 + parm = new OracleParameter("MinDurchfluss", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, tr.FlowMin); cmd2.Parameters.Add(parm); ///:7 + parm = new OracleParameter("MaxDurchfluss", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, tr.FlowMax); cmd2.Parameters.Add(parm); ///:8 + + double Q_ist = (tr.VolumeMaster != 0) ? (tr.FlowVolume * tr.VolumeCTV / tr.VolumeMaster) : (double)tr.FlowVolume; + parm = new OracleParameter("Q_ist", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, Q_ist); cmd2.Parameters.Add(parm); ///:9 + parm = new OracleParameter("KFaktor", OracleDbType.Double); parm.Value = tr.ConstMaster; cmd2.Parameters.Add(parm); ///:10 + parm = new OracleParameter("Q_VZ", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.lph, tr.FlowVolume); cmd2.Parameters.Add(parm); ///:11 + parm = new OracleParameter("F_VZ", OracleDbType.Double); parm.Value = tr.ErrorMaster; cmd2.Parameters.Add(parm); ///:12 + parm = new OracleParameter("RegelEinstellZeit", OracleDbType.Double); parm.Value = (double)tr.FlowSetTime; cmd2.Parameters.Add(parm); ///:13 + parm = new OracleParameter("Drehzahl", OracleDbType.Int32); parm.Value = 0; /* TODO */ cmd2.Parameters.Add(parm); ///:14 + /// + parm = new OracleParameter("BeginnDruck_Vorne", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressUpStart); cmd2.Parameters.Add(parm); ///:15 + parm = new OracleParameter("BeginnDruck_Hinten", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressDownStart); cmd2.Parameters.Add(parm); ///:16 + parm = new OracleParameter("EndDruck_Vorne", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressUpEnd); cmd2.Parameters.Add(parm); ///:17 + parm = new OracleParameter("EndDruck_Hinten", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.bar, tr.PressDownEnd); cmd2.Parameters.Add(parm); ///:18 + /// + parm = new OracleParameter("TVWZ", OracleDbType.Double); parm.Value = tr.TestTime; cmd2.Parameters.Add(parm); ///:19 + parm = new OracleParameter("IVWZ", OracleDbType.Int32); parm.Value = tr.PulsesMaster; cmd2.Parameters.Add(parm); ///:20 + parm = new OracleParameter("Verwendeter_VZ", OracleDbType.Int32); parm.Value = 0; /* TODO */ cmd2.Parameters.Add(parm); ///:21 + parm = new OracleParameter("BeginnGewicht", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.kg, tr.MassStart); cmd2.Parameters.Add(parm); ///:22 + parm = new OracleParameter("EndGewicht", OracleDbType.Double); parm.Value = Units.ConvertTo(Unit.kg, tr.MassEnd); cmd2.Parameters.Add(parm); ///:23 + cmd2.ExecuteNonQuery(); /// Returns nr. of updated rows +#endif + } } log.InfoFormat("Batch data saved, batchNr={0}", b.BatchNr); @@ -885,41 +957,44 @@ namespace TBF.BenchControl.Output.DB.SensusOracle foreach (var testInfo in completeTestInfos) { - Results.Entities.TestData tData = wm.GetTestData(testInfo.TestName); - Results.Entities.MeterTestRslt mtr; - if (tData == null) + if ((-20 <= testInfo.PruefungsNr) && (testInfo.PruefungsNr <= 20)) /// LU PruefungsNr-s are between -20 and 20 { - throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", testInfo.TestName, wm.WMPosition)); - } - else if (tData.Repeats == 1) - { - mtr = wm.GetMeterTestRslt(testInfo.TestName); - if (mtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", testInfo.TestName, wm.WMPosition)); - } - else - { - Results.Entities.MeterTestRslt firstMtr = wm.GetMeterTestRslt(Utils.TestTitle(tData, 1)); - if (firstMtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", Utils.TestTitle(tData, 1), wm.WMPosition)); - - mtr = new Results.Entities.MeterTestRslt(); - mtr.CopyContentFrom(firstMtr); - mtr.TestRslt = firstMtr.TestRslt; - mtr.WaterMeter = firstMtr.WaterMeter; - for (int i = 2; i <= tData.Repeats; i++) + Results.Entities.TestData tData = wm.GetTestData(testInfo.TestName); + Results.Entities.MeterTestRslt mtr; + if (tData == null) { - Results.Entities.MeterTestRslt nextMtr = wm.GetMeterTestRslt(Utils.TestTitle(tData, i)); - if (nextMtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", Utils.TestTitle(tData, i), wm.WMPosition)); - - mtr.TestTime += nextMtr.TestTime; - mtr.VolumeMeter += nextMtr.VolumeMeter; - mtr.VolumeRef += nextMtr.VolumeRef; - mtr.VolumeEnd = nextMtr.VolumeEnd; - mtr.Passed = (mtr.Passed && nextMtr.Passed); + throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", testInfo.TestName, wm.WMPosition)); } - mtr.Error = Formulas.ErrorFromVolumes(mtr.VolumeMeter, mtr.VolumeRef); - } + else if (tData.Repeats == 1) + { + mtr = wm.GetMeterTestRslt(testInfo.TestName); + if (mtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", testInfo.TestName, wm.WMPosition)); + } + else + { + Results.Entities.MeterTestRslt firstMtr = wm.GetMeterTestRslt(Utils.TestTitle(tData, 1)); + if (firstMtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", Utils.TestTitle(tData, 1), wm.WMPosition)); - SaveMeterTestResult(conn, mtr, testInfo.PruefungsNr, max_Pruefindex); + mtr = new Results.Entities.MeterTestRslt(); + mtr.CopyContentFrom(firstMtr); + mtr.TestRslt = firstMtr.TestRslt; + mtr.WaterMeter = firstMtr.WaterMeter; + for (int i = 2; i <= tData.Repeats; i++) + { + Results.Entities.MeterTestRslt nextMtr = wm.GetMeterTestRslt(Utils.TestTitle(tData, i)); + if (nextMtr == null) throw new Exception(string.Format("'{0}' test results missing, watermeter {1}", Utils.TestTitle(tData, i), wm.WMPosition)); + + mtr.TestTime += nextMtr.TestTime; + mtr.VolumeMeter += nextMtr.VolumeMeter; + mtr.VolumeRef += nextMtr.VolumeRef; + mtr.VolumeEnd = nextMtr.VolumeEnd; + mtr.Passed = (mtr.Passed && nextMtr.Passed); + } + mtr.Error = Formulas.ErrorFromVolumes(mtr.VolumeMeter, mtr.VolumeRef); + } + + SaveMeterTestResult(conn, mtr, testInfo.PruefungsNr, max_Pruefindex, wmTypeRevision); + } } @@ -954,7 +1029,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle /// /// q = 0, 1, 2 or 3 (Adj., Q1, Q2, Q3) /// Nr. of rows updated - int SaveMeterTestResult(OracleConnection conn, Results.Entities.MeterTestRslt mtr, int pruefungsNr, int max_Pruefindex) /// + int SaveMeterTestResult(OracleConnection conn, Results.Entities.MeterTestRslt mtr, int pruefungsNr, int max_Pruefindex, int wmTypeRevision) { double Q_wm = 3600.0 * mtr.VolumeMeter / mtr.TestTime; /// in [l/hour] double Q_wm_with_upper_bound = Math.Min(2 * 1000 * mtr.TestRslt.FlowVolume, Math.Max(0.0, Q_wm)); @@ -970,14 +1045,14 @@ namespace TBF.BenchControl.Output.DB.SensusOracle cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = pruefungsNr }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = mtr.WaterMeter.WaterMeterData.WMTypeId }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = mtr.WaterMeter.WaterMeterData.WMTypeRev }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 1 }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Q_wm_with_upper_bound }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Min(100.0, Math.Max(-100.0, mtr.Error)) }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = mtr.Passed ? 1 : 0 }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = 0 }); /// mtr.VolumeStart - cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = 0 }); /// mtr.VolumeEnd + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Max(-99999.999, Math.Min(mtr.VolumeStart, 99999.999)) }); + cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Max(-99999.999, Math.Min(mtr.VolumeEnd, 99999.999)) }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Min(100.0, Math.Max(-100.0, mtr.KorrErrQ)) }); cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = Math.Min(100000, mtr.TestTime) }); @@ -987,5 +1062,5 @@ namespace TBF.BenchControl.Output.DB.SensusOracle return retv; } #endif - } + } } diff --git a/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfg.cs b/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfg.cs index 8faa7e4da..a247b6ed8 100644 --- a/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfg.cs +++ b/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfg.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2015-2018 Sensus Slovensko a.s. +/// Copyright (c) 2015-2019 Sensus Slovensko a.s. /// using System; using System.Xml.Serialization; @@ -39,6 +39,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle public int Baujahr; /// Written to the database public bool ReadStartInfo; public bool SaveResults; + public bool StartInfoIsRequired; /// Private parameterless constructor invoked by all other (public) constructors @@ -51,6 +52,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle Baujahr = 2015; ReadStartInfo = true; SaveResults = true; + StartInfoIsRequired = false; } public DatabaseCfg(IComponentFactory factory) @@ -61,12 +63,14 @@ namespace TBF.BenchControl.Output.DB.SensusOracle public string ToString(int i) { - return string.Format("BenchId={0}, DBUsed={1}, Baujahr={2}, ReadStartInfo={3}, SaveResults={4}", + return string.Format("Name={0}, BenchId={1}, DB={2}, Bjahr={3}, RdStartInfo={4}, SaveRslts={5}, StartInfoRqrd={6}", + Name, TestBenchId, DBUsed, Baujahr, ReadStartInfo, - SaveResults); + SaveResults, + StartInfoIsRequired); } } } diff --git a/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.cs b/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.cs index 91a1bb11d..855ae5301 100644 --- a/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.cs +++ b/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.cs @@ -52,6 +52,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle baujahrTextBox.Text = config.Baujahr.ToString(); readStartInfoCheckBox.Checked = config.ReadStartInfo; saveResultsCheckBox.Checked = config.SaveResults; + startInfoIsRequiredCheckBox.Checked = config.StartInfoIsRequired; } public void Unlock() @@ -62,6 +63,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle baujahrTextBox.Enabled = true; readStartInfoCheckBox.Enabled = true; saveResultsCheckBox.Enabled = true; + startInfoIsRequiredCheckBox.Enabled = true; } public CfgUpdateFlags VerifyCfg(ref string message) @@ -135,6 +137,11 @@ namespace TBF.BenchControl.Output.DB.SensusOracle config.SaveResults = saveResultsCheckBox.Checked; flags = CfgUpdateFlags.RestartRqrd; } + if (startInfoIsRequiredCheckBox.Checked != config.StartInfoIsRequired) + { + config.StartInfoIsRequired = startInfoIsRequiredCheckBox.Checked; + flags = CfgUpdateFlags.RestartRqrd; + } return flags; } diff --git a/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.designer.cs b/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.designer.cs index 7711d1fb6..54657cca0 100644 --- a/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.designer.cs +++ b/TBF/BenchControl/Output/DB/SensusOracle/DatabaseCfgCtrl.designer.cs @@ -42,6 +42,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle this.dbUsedLabel = new System.Windows.Forms.Label(); this.baujahrTextBox = new System.Windows.Forms.TextBox(); this.baujahrLabel = new System.Windows.Forms.Label(); + this.startInfoIsRequiredCheckBox = new System.Windows.Forms.CheckBox(); this.SuspendLayout(); // // nameTextBox @@ -74,7 +75,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle // this.readStartInfoCheckBox.AutoSize = true; this.readStartInfoCheckBox.Enabled = false; - this.readStartInfoCheckBox.Location = new System.Drawing.Point(111, 144); + this.readStartInfoCheckBox.Location = new System.Drawing.Point(111, 136); this.readStartInfoCheckBox.Name = "readStartInfoCheckBox"; this.readStartInfoCheckBox.Size = new System.Drawing.Size(95, 17); this.readStartInfoCheckBox.TabIndex = 15; @@ -85,7 +86,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle // this.saveResultsCheckBox.AutoSize = true; this.saveResultsCheckBox.Enabled = false; - this.saveResultsCheckBox.Location = new System.Drawing.Point(111, 167); + this.saveResultsCheckBox.Location = new System.Drawing.Point(111, 159); this.saveResultsCheckBox.Name = "saveResultsCheckBox"; this.saveResultsCheckBox.Size = new System.Drawing.Size(84, 17); this.saveResultsCheckBox.TabIndex = 16; @@ -144,10 +145,22 @@ namespace TBF.BenchControl.Output.DB.SensusOracle this.baujahrLabel.TabIndex = 7; this.baujahrLabel.Text = "Baujahr"; // + // startInfoIsRequiredCheckBox + // + this.startInfoIsRequiredCheckBox.AutoSize = true; + this.startInfoIsRequiredCheckBox.Enabled = false; + this.startInfoIsRequiredCheckBox.Location = new System.Drawing.Point(110, 182); + this.startInfoIsRequiredCheckBox.Name = "startInfoIsRequiredCheckBox"; + this.startInfoIsRequiredCheckBox.Size = new System.Drawing.Size(119, 17); + this.startInfoIsRequiredCheckBox.TabIndex = 17; + this.startInfoIsRequiredCheckBox.Text = "Start info is required"; + this.startInfoIsRequiredCheckBox.UseVisualStyleBackColor = true; + // // DatabaseCfgCtrl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.startInfoIsRequiredCheckBox); this.Controls.Add(this.baujahrTextBox); this.Controls.Add(this.baujahrLabel); this.Controls.Add(this.dbUsedComboBox); @@ -180,5 +193,6 @@ namespace TBF.BenchControl.Output.DB.SensusOracle private System.Windows.Forms.Label dbUsedLabel; private System.Windows.Forms.TextBox baujahrTextBox; private System.Windows.Forms.Label baujahrLabel; + private System.Windows.Forms.CheckBox startInfoIsRequiredCheckBox; } } diff --git a/TBF/BenchControl/Output/FileWriters/IperlLogger/Writer.cs b/TBF/BenchControl/Output/FileWriters/IperlLogger/Writer.cs index 4024993f3..9efc85b22 100644 --- a/TBF/BenchControl/Output/FileWriters/IperlLogger/Writer.cs +++ b/TBF/BenchControl/Output/FileWriters/IperlLogger/Writer.cs @@ -23,8 +23,6 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger WriterCfg writerCfg; - SensusTestInfo[] testInfos; - enum CurrentOp { None, @@ -51,8 +49,6 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger writerCfg = cfg as WriterCfg; currentOp = CurrentOp.None; - testInfos = SensusTestInfo.GetTestInfos(writerCfg.LogType); - log.Debug(this.ToString()); } @@ -176,13 +172,22 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger return Retv.Error; /// No logger } + Results.Entities.WaterMeter wm0 = null; foreach (var m in batch.WaterMeters) if (m != null) { wm0 = m; break; } if (wm0 == null) { return Retv.Error; /// Not a single watermeter in the batch } - + + + SensusTestInfo[] testInfos = wm0.TestInfos as SensusTestInfo[]; + if (testInfos == null) + { + return Retv.Error; /// No test infos + } + + Results.Entities.WaterMeterData wmData = wm0.WaterMeterData; Results.Entities.MeterTestRslt[] wm0trs = new Results.Entities.MeterTestRslt[testInfos.Length]; @@ -213,11 +218,11 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger logger.WriteLine(string.Format("Qn={0}", wmData.Q3_Qn.ToString("F1", Program.AltCulture))); logger.WriteLine(string.Format("Impulsrate=1")); logger.WriteLine(string.Format("WZid={0}", wmData.WMTypeId)); - logger.WriteLine(string.Format("RevWzTyp={0}", wmData.WMTypeRev)); + logger.WriteLine(string.Format("RevWzTyp={0}", wm0.WMTypeRevision)); logger.WriteLine(string.Format("RevPruefstandWzTyp=2")); for (int j = 0; j < testInfos.Length; j++) - { + { string fId = testInfos[j].PruefungsNrStr; string qBz = testInfos[j].QBezeichnung; Results.Entities.MeterTestRslt wm0r = wm0trs[j]; @@ -225,7 +230,7 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger if (wm0r != null) { - logger.WriteLine(string.Format("Durchfluss{0}={1}", fId, Units.ConvertTo(Unit.lph, wm0r.Qfrom()).ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("Durchfluss{0}={1}", fId, Units.ConvertTo(Unit.lph, (wm0r.Qfrom() + wm0r.Qto()) / 2).ToString("F1", Program.AltCulture))); logger.WriteLine(string.Format("Prüfzeit{0}={1}", fId, wm0r.TargetTime().ToString("F0"))); logger.WriteLine(string.Format("Prüfbereich100_110{0}={1}", fId, (pb_100_110 ? 1 : 0))); logger.WriteLine(string.Format("PrüfbereichMin{0}={1}", fId, (pb_100_110 ? 100 : 90))); @@ -233,8 +238,8 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger logger.WriteLine(string.Format("QBezeichnung{0}={1}", fId, qBz)); if (fId != "-1") { - logger.WriteLine(string.Format("PosFehlergrenze{0}={1}", fId, wm0r.ErrLimHi().ToString("F1", Program.AltCulture))); - logger.WriteLine(string.Format("NegFehlergrenze{0}={1}", fId, wm0r.ErrLimLo().ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("PosFehlergrenze{0}={1}", fId, (wm0r.ErrLimHi() - wm0r.Uncertainty()).ToString("F1", Program.AltCulture))); + logger.WriteLine(string.Format("NegFehlergrenze{0}={1}", fId, (wm0r.ErrLimLo() + wm0r.Uncertainty()).ToString("F1", Program.AltCulture))); logger.WriteLine(string.Format("PosFehlergrenzeWarm{0}=0,0", fId)); logger.WriteLine(string.Format("NegFehlergrenzeWarm{0}=0,0", fId)); } diff --git a/TBF/BenchControl/Output/FileWriters/IperlLogger/WriterCfg.cs b/TBF/BenchControl/Output/FileWriters/IperlLogger/WriterCfg.cs index 0e963dc88..4627ba838 100644 --- a/TBF/BenchControl/Output/FileWriters/IperlLogger/WriterCfg.cs +++ b/TBF/BenchControl/Output/FileWriters/IperlLogger/WriterCfg.cs @@ -17,7 +17,6 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger public IComponentCfgCtrl GetControl() { return new Configs.ParamsProvider.ComponentCfgCtrl(this, null); } - public LogType LogType; public string DestinationPath; /// Directory path into which the logs will be saved public bool YearFolders; public bool MonthFolders; @@ -42,7 +41,6 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger public void InitializeAll() { - LogType = LogType.Just_Q1Q2Q3; DestinationPath = Program.HomeDir + "Logs\\"; YearFolders = true; MonthFolders = true; @@ -51,7 +49,6 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger string[] paramNames = new string[] { - "Log type", "Destination path", "Year folders", "Month folders", @@ -64,14 +61,9 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger { switch (i) { - case 0: - IList list1 = new List(); - for (LogType lt = 0; lt < LogType.Count; lt++) list1.Add(lt.ToString()); - return list1; - + case 1: case 2: case 3: - case 4: IList list2 = new List(); list2.Add(Strings.yes); list2.Add(Strings.no); @@ -85,9 +77,8 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger { if (i == -1) { - return string.Format("{0}: LogType={1}, Dest.={2}, Y={3}, M={4}, D={5}", + return string.Format("{0}: Dest.={1}, Y={2}, M={3}, D={4}", Name, - LogType, DestinationPath, YearFolders, MonthFolders, @@ -96,11 +87,10 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger switch (i) { - case 0: return LogType.ToString(); - case 1: return DestinationPath; - case 2: return YearFolders ? Strings.yes : Strings.no; - case 3: return MonthFolders ? Strings.yes : Strings.no; - case 4: return DayFolders ? Strings.yes : Strings.no; + case 0: return DestinationPath; + case 1: return YearFolders ? Strings.yes : Strings.no; + case 2: return MonthFolders ? Strings.yes : Strings.no; + case 3: return DayFolders ? Strings.yes : Strings.no; default: return string.Empty; } } @@ -109,21 +99,10 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger { switch (i) { - case 0: - for (LogType lt = 0; lt < LogType.Count; lt++) - { - if (lt.ToString() == strValue) - { - LogType = lt; - return CfgUpdateFlags.RestartRqrd; - } - } - return CfgUpdateFlags.None; - - case 1: DestinationPath = strValue; return CfgUpdateFlags.RestartRqrd; - case 2: YearFolders = (strValue == Strings.yes); return CfgUpdateFlags.RestartRqrd; - case 3: MonthFolders = (strValue == Strings.yes); return CfgUpdateFlags.RestartRqrd; - case 4: DayFolders = (strValue == Strings.yes); return CfgUpdateFlags.RestartRqrd; + case 0: DestinationPath = strValue; return CfgUpdateFlags.RestartRqrd; + case 1: YearFolders = (strValue == Strings.yes); return CfgUpdateFlags.RestartRqrd; + case 2: MonthFolders = (strValue == Strings.yes); return CfgUpdateFlags.RestartRqrd; + case 3: DayFolders = (strValue == Strings.yes); return CfgUpdateFlags.RestartRqrd; default: return CfgUpdateFlags.None; } @@ -136,16 +115,10 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger switch (i) { case 0: - for (LogType lt = 0; lt < LogType.Count; lt++) - { - if (lt.ToString() == strValue) return true; - } - break; - case 1: return true; + case 1: case 2: case 3: - case 4: if (strValue == Strings.yes || strValue == Strings.no) return true; break; default: @@ -159,7 +132,6 @@ namespace TBF.BenchControl.Output.FileWriters.IperlLogger void CopyContentTo(WriterCfg prms) { - prms.LogType = this.LogType; prms.DestinationPath = this.DestinationPath; prms.YearFolders = this.YearFolders; prms.MonthFolders = this.MonthFolders; diff --git a/TBF/BenchControl/Output/SensusTestInfo.cs b/TBF/BenchControl/Output/SensusTestInfo.cs index 8bce22829..43d458a60 100644 --- a/TBF/BenchControl/Output/SensusTestInfo.cs +++ b/TBF/BenchControl/Output/SensusTestInfo.cs @@ -8,8 +8,9 @@ namespace TBF.BenchControl.Output { public enum LogType { + Auto, Just_Q1Q2Q3, - Just_Q1Q2Q2adjQ3, /// Greece + Just_Q1Q2Q2adjQ3, /// Greece Just_Q1Q2__Q3, DEWA, /// Q1, Q2adj, Q2, Q3, Q4 Suez, /// two directions @@ -56,9 +57,9 @@ namespace TBF.BenchControl.Output /// true when two test info-s are compatible public static bool AreCompatible(IList oraDbTInfo, SensusTestInfo[] myCompleteTInfo) { - if (oraDbTInfo.Count != myCompleteTInfo.Length) return false; + if ((oraDbTInfo == null) || (myCompleteTInfo == null) || (oraDbTInfo.Count > myCompleteTInfo.Length)) return false; - for (int i = 0; i < myCompleteTInfo.Length; i++) + for (int i = 0; i < oraDbTInfo.Count; i++) { if (oraDbTInfo[i].PruefungsNr != myCompleteTInfo[i].PruefungsNr) { @@ -84,15 +85,15 @@ namespace TBF.BenchControl.Output { switch (logType) { - default: case LogType.Just_Q1Q2Q3: return new SensusTestInfo[] { - new SensusTestInfo(-1, "-1", "Just", Range.R90_100, "Adjustment"), - new SensusTestInfo( 1, "01", "Q1", Range.R100_110, "Q1"), - new SensusTestInfo( 2, "02", "Q2", Range.R100_110, "Q2"), - new SensusTestInfo( 3, "03", "Q3", Range.R90_100, "Q3"), + new SensusTestInfo( -1, "-1", "Just", Range.R90_100, "Adjustment"), + new SensusTestInfo( 1, "01", "Q1", Range.R100_110, "Q1"), + new SensusTestInfo( 2, "", "Q2", Range.R100_110, "Q2"), + new SensusTestInfo( 3, "03", "Q3", Range.R90_100, "Q3"), + new SensusTestInfo( 99, "02", "Q2", Range.R100_110, "Q2adj"), /// <-- This is to generate opto-data }; case LogType.Just_Q1Q2Q2adjQ3: @@ -110,10 +111,11 @@ namespace TBF.BenchControl.Output return new SensusTestInfo[] { - new SensusTestInfo(-1, "-1", "Just", Range.R90_100, "Adjustment"), - new SensusTestInfo( 1, "01", "Q1", Range.R100_110, "Q1"), - new SensusTestInfo( 2, "02", "Q2", Range.R100_110, "Q2"), - new SensusTestInfo( 5, "05", "Q3", Range.R90_100, "Q3"), + new SensusTestInfo( -1, "-1", "Just", Range.R90_100, "Adjustment"), + new SensusTestInfo( 1, "01", "Q1", Range.R100_110, "Q1"), + new SensusTestInfo( 2, "", "Q2", Range.R100_110, "Q2"), + new SensusTestInfo( 5, "05", "Q3", Range.R90_100, "Q3"), + new SensusTestInfo( 99, "02", "Q2", Range.R100_110, "Q2adj"), /// <-- This is to generate opto-data }; case LogType.DEWA: @@ -176,7 +178,16 @@ namespace TBF.BenchControl.Output new SensusTestInfo(11, "11", "Q3", Range.R90_100, "Q3"), new SensusTestInfo(12, "12", "Q4", Range.R90_100, "Q4"), }; + + default: + + return null; } } + + public override string ToString() + { + return string.Format("{0}-'{1}'-'{2}'-'{3}'-{4}", PruefungsNr, PruefungsNrStr, QBezeichnung, TestName, Range); + } } } diff --git a/TBF/BenchControl/Sequences/MainSeq.cs b/TBF/BenchControl/Sequences/MainSeq.cs index c91e322a8..082d57b48 100644 --- a/TBF/BenchControl/Sequences/MainSeq.cs +++ b/TBF/BenchControl/Sequences/MainSeq.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2018 Sensus Slovensko a.s. +/// Copyright (c) 2013-2019 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -533,11 +533,11 @@ namespace TBF.BenchControl.Sequences Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, simultWithPurgingCfg, simultWithPurgingTests, simultWithPurgingParams }); } + /// /// Purging @ cycle start /// Event evt = Transition(purgeBegin, TransitionContext.PurgeBegin); - /// switch (evt) { case Event.Error: @@ -550,11 +550,35 @@ namespace TBF.BenchControl.Sequences break; } - if (simultWithPurgingCount > 0) + /// + /// Prepare reading start info from the DB @ cycle start + /// + State readingStartInfo = State.Create("MainSeq : Reading start info from DB"); + /// + string[] resultWriters = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' }); + foreach (var writerName in resultWriters) + { + IStartInfoReader infoReader = TbfComponents.FindComponent(writerName) as IStartInfoReader; + if (infoReader != null) + { + try + { + IOperation op = infoReader.ReadStartInfoOp(ProcessData.BatchRslts.WaterMeters); + if (op != null) readingStartInfo.AddOperation(op); + } + catch (Exception exc) + { + Bridge.OnError(this, string.Format(Strings.Component_0_crashed_Results_not_saved, writerName)); + log.FatalFormat("StartInfoReader {0} crashed: {1}", writerName, exc.Message); + } + } + } + + /// + /// Wait until iPerl communications or S/N data entry are completed + /// + if ((simultWithPurgingCount > 0) || (readingStartInfo.Operations.Count > 0)) { - /// - /// Wait until iPerl communications are completed - /// bool completed = !(modelessDlg is GenericDevices.IHasCompleted) || (modelessDlg as GenericDevices.IHasCompleted).Completed; if (!completed) @@ -582,27 +606,6 @@ namespace TBF.BenchControl.Sequences /// /// Read start info from the DB @ cycle start /// - State readingStartInfo = State.Create("MainSeq : Reading start info from DB"); - /// - string[] resultWriters = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' }); - foreach (var writerName in resultWriters) - { - IStartInfoReader infoReader = TbfComponents.FindComponent(writerName) as IStartInfoReader; - if (infoReader != null) - { - try - { - IOperation op = infoReader.ReadStartInfoOp(ProcessData.BatchRslts.WaterMeters); - if (op != null) readingStartInfo.AddOperation(op); - } - catch (Exception exc) - { - Bridge.OnError(this, string.Format(Strings.Component_0_crashed_Results_not_saved, writerName)); - log.FatalFormat("StartInfoReader {0} crashed: {1}", writerName, exc.Message); - } - } - } - /// if (readingStartInfo.Operations.Count > 0) { readingStartInfo.AddOperation(checkUiOp).EnterState(); @@ -619,6 +622,9 @@ namespace TBF.BenchControl.Sequences log.ErrorFormat("StartInfoReader failed to read data from the database"); /// TODO: Message for an operator? Error? } + + /// Redraw on-screen results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(string.Empty, null)); } @@ -1523,7 +1529,6 @@ namespace TBF.BenchControl.Sequences HeatMeter = heatMeters, #if ORACLE_DB WMTypeId = 0, /// <--------------------------- TODO - WMTypeRev = 0, #endif }; } @@ -1601,7 +1606,6 @@ namespace TBF.BenchControl.Sequences wm.Disabled = false; #if ORACLE_DB wm.WaterMeterData.WMTypeId = wm2.WaterMeterData.WMTypeId; - wm.WaterMeterData.WMTypeRev = wm2.WaterMeterData.WMTypeRev; #endif break; } diff --git a/TBF/BenchControl/Sequences/ProcessData.cs b/TBF/BenchControl/Sequences/ProcessData.cs index ebc00e59b..fed331a7b 100644 --- a/TBF/BenchControl/Sequences/ProcessData.cs +++ b/TBF/BenchControl/Sequences/ProcessData.cs @@ -9,6 +9,7 @@ namespace TBF.BenchControl.Sequences public static IBenchInfo BenchInfo; public static IErrorFlags ErrorFlagsComp; public static Output.DB.SensusOracle.Database OracleDB; + public static Output.SensusTestInfo[] TestInfos; public static FloatBox AmbTemp = new FloatBox() { Name = "Ambient Temperature", Format = "F1" }; /// [Celsius] public static FloatBox AmbPress = new FloatBox() { Name = "Ambient Pressure", Format = "F0", Factor = 1000 }; /// [bar], printed by ToString() in [mbar] diff --git a/TBF/BenchControl/State.cs b/TBF/BenchControl/State.cs index 6dae50740..af98c15db 100644 --- a/TBF/BenchControl/State.cs +++ b/TBF/BenchControl/State.cs @@ -1,5 +1,5 @@ /// -/// Copyright (c) 2013-2015 Sensus Metering Systems +/// Copyright (c) 2013-2019 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; @@ -63,7 +63,6 @@ namespace TBF.BenchControl Operations = new List(); foreach (var op in PermanentOperations) Operations.Add(op); Transitions = new List(); - log.Debug(this.ToString()); } /// @@ -172,7 +171,9 @@ namespace TBF.BenchControl /// public State EnterState() { - StopAndStartOperations(State.currentState, this); + log.Debug(this.ToString()); + + StopAndStartOperations(State.currentState, this); State.currentState = this; UiBridge.Bridge.OnStateChanged(this, State.currentState.ToString()); return this; diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs index efc4c631c..d77076fa5 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs @@ -188,6 +188,8 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},2,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("Cal={0}", buf[0] + 256 * buf[1])); else if ((messageID == MessageID.Calibration) && (offset == 34) && (lenght == 2)) rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},34,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("CalLNA={0}", buf[0] + 256 * buf[1])); + else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (lenght == 2)) + rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1},6264,2,...) returned {2} {3}", name, messageID, retv, (retv != 0) ? "!" : string.Format("LR={0} RL={1}", (int)buf[0], (int)buf[1])); else rfidDataLogger.InfoFormat("{0}: ReadRequestPort({1}, {2}, {3}, ...) returned {4} {5}", name, messageID, offset, lenght, retv, (retv != 0) ? "!" : ""); @@ -1662,6 +1664,13 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication resultStr = "Q2 corrections successfully read"; ihead.Q2CorrLR = rdData[0]; ihead.Q2CorrRL = rdData[1]; +#if IPERL + if (wm != null) + { + wm.Q2CorrLR = ihead.Q2CorrLR; + wm.Q2CorrRL = ihead.Q2CorrRL; + } +#endif } ClosePort(threadId, ihead); /// Close RFID port @@ -2330,7 +2339,6 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication { #if ORACLE_DB meterRslt.WaterMeter.WaterMeterData.WMTypeId = iperlHeads[i].WMType_ID; - meterRslt.WaterMeter.WaterMeterData.WMTypeRev = iperlHeads[i].WMType_Rev; #endif meterRslt.WaterMeter.SerialNr = iperlHeads[i].SerialNr; meterRslt.Passed = (!iperlHeads[i].CommFailed && !iperlHeads[i].Disabled); diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs index a51c14095..a178bb91e 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationParams.cs @@ -68,6 +68,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication retVal.Add(iPerlCommunicationForm.Write2HzCorrectionStr); retVal.Add(string.Format("{0} if enabled", iPerlCommunicationForm.ReadConfigurationStr)); retVal.Add(string.Format("{0} 80", iPerlCommunicationForm.SetTestModeStr)); + retVal.Add("iPerl_check pruefindex q2factors direction"); } else { diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs index 358ef734e..568665c46 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationSeq.cs @@ -58,7 +58,8 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication const string Q2correctedFromCmd = "q2 corrected from "; const string Q2correctionCheckCmd = "q2 correction check "; - const string Hz2correctedFromCmd = "2Hz corrected from "; + const string IperlCheckCmd = "iperl_check "; + const string Hz2correctedFromCmd = "2Hz corrected from "; if (testParams.Activity.ToLower().Contains(Q2correctedFromCmd)) { @@ -99,6 +100,96 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication rList.Add(Event.Done); return rList; } + else if (testParams.Activity.ToLower().Contains(IperlCheckCmd)) + { + TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.JustStarted)); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, Config.Entities.Progress.FlowSetting)); + + string[] args = testParams.Activity.Substring(IperlCheckCmd.Length).Split(new char[] { ' ' }); + + int maxTestIndex = (ProcessData.BenchInfo is BenchInfo.iPerl.Component) + ? (ProcessData.BenchInfo as BenchInfo.iPerl.Component).MaxTestIndex + : int.MaxValue; + + Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(test.Name, 0); + + bool anyError = false; + string message = string.Empty; + + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + Results.Entities.WaterMeter wm = BatchRslts.WaterMeters[i]; + Results.Entities.MeterTestRslt mtr = ProcessData.BatchRslts.GetMeterTestRslt(test.Name, i, CompoundMeterId.Single); + + if ((wm != null) && (mtr != null)) + { + bool anyMeterError = false; + foreach (var arg in args) + { +#if ORACLE_DB + if (arg.ToLower() == "pruefindex") + { + if (wm.Pruefindex > maxTestIndex) + { + anyMeterError = true; + anyError = true; + message += string.Format("Príliš veľa opakovaní testu vodomera {0}{1}", i, Environment.NewLine); + } + } +#endif +#if TURA_SPECIAL + if (arg.ToLower() == "q2factors") + { + if ((wm.ProdQ2CorrRL != wm.Q2CorrRL) || (wm.ProdQ2CorrLR != wm.Q2CorrLR)) + { + anyMeterError = true; + anyError = true; + message += string.Format("Q2 korekčné faktory vodomera {0} nesedia{1}", i, Environment.NewLine); + } + } +#endif + if (arg.ToLower() == "direction") + { + //if (wm.Pruefindex > maxTestIndex) + //{ + // anyMeterError = true; + // anyError = true; + // message += string.Format("Príliš veľa opakovaní testu vodomera {0}{1}", i, Environment.NewLine); + //} + } + } + + mtr.TestDone = true; + mtr.Passed = !anyMeterError; + } + } + + 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); + + if (anyError) + { + State.Create("iPerlCommunicationSeq : Show check result") + .AddOperation(new Operations.LargeMessageBoxOp(message)) + .EnterState(); + do { e = StateMachine.WaitRunDevsRunOps(); } + while (!e.Contains(Event.OK)); + + Bridge.OnError(this, string.Format("Niečo nie je v poriadku !")); + + rList.Add(Event.UiCmdStop); + } + else + { + rList.Add(Event.Done); + } + + return rList; + } //else if (testParams.Activity.ToLower().Contains(Hz2correctedFromCmd)) //{ // TestProgressEventArgs.SetEstimatedTimes(new int[] { 0, 0, 0, 30, 0, 30, 0, 0 }); diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/FlowDirectionDetection.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/FlowDirectionDetection.cs index caa9104c0..551710a10 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/FlowDirectionDetection.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/FlowDirectionDetection.cs @@ -109,7 +109,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead /// Verify whether the flow direction is correct /// /// OptoHeadState.OptoAndDirOK, OptoHeadState.OptoNok or OptoHeadState.DirNok - public OptoHeadState CheckFlowDirection(FlowDir flowDir) + public OptoHeadState CheckFlowDirection(Counting counting) { if (!AreFifoDataValid()) return OptoHeadState.OptoNok; @@ -123,11 +123,11 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead if (slope > maxSlope) maxSlope = slope; if (slope < minSlope) minSlope = slope; - if ((flowDir == FlowDir.R_L) && (maxSlope > -2 * minSlope)) + if ((counting == Counting.Positive) && (maxSlope > -2 * minSlope)) { return OptoHeadState.OptoAndDirOK; } - else if ((flowDir == FlowDir.L_R) && (minSlope < -2 * maxSlope)) + else if ((counting == Counting.Negative) && (minSlope < -2 * maxSlope)) { return OptoHeadState.OptoAndDirOK; } diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs index 6ccfc3be1..26e98656e 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs @@ -38,11 +38,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead public float CalibTarget { get { return iperlHeadCfg.ProcParams.CalibTarget; } } public ushort FactorLimitLo { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitLo; } } public ushort FactorLimitHi { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitHi; } } - public FlowDir InitFlowDir { get { return (iperlHeadCfg != null && iperlHeadCfg.ProcParams != null) ? iperlHeadCfg.ProcParams.FlowDir : FlowDir.R_L; } } - public LogType LogType { get { return iperlHeadCfg.ProcParams.LogType; } } + public Counting InitFlowDir { get { return (iperlHeadCfg != null && iperlHeadCfg.ProcParams != null) ? iperlHeadCfg.ProcParams.Counting : Counting.Arbitrary; } } #if ORACLE_DB public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB - public int WMType_Rev { get { return iperlHeadCfg.ProcParams.WMType_Rev; } } /// Required by Oracle DB #endif /// Properties set by the Begin and the End form @@ -459,7 +457,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead } - FlowDir currentFlowDir; + Counting currentFlowDir; /// public OptoHeadState CheckFlowDirection() { @@ -468,7 +466,22 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead /// public void ChangeFlowDirection() { - currentFlowDir = (InitFlowDir == FlowDir.R_L) ? FlowDir.L_R : FlowDir.R_L; + switch (InitFlowDir) + { + case Counting.Positive: + currentFlowDir = Counting.Negative; + break; + + case Counting.Negative: + currentFlowDir = Counting.Positive; + break; + + case Counting.Arbitrary: + default: + currentFlowDir = Counting.Arbitrary; + break; + } + if (flowDirectionDetection != null) flowDirectionDetection.ClearFifo(); /// Clear FIFO for flow direction detection } @@ -567,20 +580,22 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead string wmPosition = Name.Substring(5); if (wmPosition.Length == 1) wmPosition = "0" + wmPosition; - SensusTestInfo[] testInfos = SensusTestInfo.GetTestInfos(LogType); - + SensusTestInfo[] testInfos = Sequences.ProcessData.TestInfos; optoDataLogFileName = null; /// - foreach (var ti in testInfos) + if (testInfos != null) { - if ((testName != null) && (testName == ti.TestName)) + foreach (var ti in testInfos) { - optoDataLogFileName = string.Format("{0}_{1}_{2}_{3}.txt", - (ConfigStruct != null) ? ConfigStruct.GetPcbNrString() : "UnknownPcbNr", - wmPosition, - ti.PruefungsNrStr, - StateMachine.CycleStartTimeStamp.ToString("HH_mm_ss")); - break; + if ((testName != null) && (testName == ti.TestName) && !string.IsNullOrEmpty(ti.PruefungsNrStr)) + { + optoDataLogFileName = string.Format("{0}_{1}_{2}_{3}.txt", + (ConfigStruct != null) ? ConfigStruct.GetPcbNrString() : "UnknownPcbNr", + wmPosition, + ti.PruefungsNrStr, + StateMachine.CycleStartTimeStamp.ToString("HH_mm_ss")); + break; + } } } @@ -620,37 +635,42 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead /// Stop this operation public void Stop() { - if ((TestStartTelegramIx > 0) && (TestStartTelegramIx < StartOptoDataCount) && (optoData[TestStartTelegramIx].Flags == OptoTelegramFlags.OK)) - { - optoData[TestStartTelegramIx].Flags = OptoTelegramFlags.OK_TestStart; - OptoTelegramRaw.TestStartTimestampDec = optoData[TestStartTelegramIx].TimestampDec(); - } + int startIx = OptoTelegramRaw.BufferIdx(TestStartTelegramIx); + int endIx = OptoTelegramRaw.BufferIdx(TestEndTelegramIx); - if (optoData[OptoTelegramRaw.BufferIdx(TestEndTelegramIx)].Flags == OptoTelegramFlags.OK) - { - optoData[OptoTelegramRaw.BufferIdx(TestEndTelegramIx)].Flags = OptoTelegramFlags.OK_TestEnd; - } + log.WarnFormat("IperlHeadd.Stop() startIx={0} endIx={1} optoData.Len={2} filename={3}", startIx, endIx, optoData.Length, !string.IsNullOrEmpty(optoDataLogFileName) ? optoDataLogFileName : ""); - StopParsingOptoSerialPort(); - if (optoDataCount <= MaxOptoDataCount) - { - OptoTelegramRaw.FIRFilterFlow(optoData, 0, optoDataCount - 1); - } - else - { - OptoTelegramRaw.FIRFilterFlow(optoData, 0, StartOptoDataCount - 1); - OptoTelegramRaw.FIRFilterFlow(optoData, (optoDataCount - EndOptoDataCount), optoDataCount - 1); - } + if ((startIx > 0) && (startIx < StartOptoDataCount) && (optoData[startIx].Flags == OptoTelegramFlags.OK)) + { + optoData[startIx].Flags = OptoTelegramFlags.OK_TestStart; + OptoTelegramRaw.TestStartTimestampDec = optoData[startIx].TimestampDec(); + } + + if ((endIx > 0) && (optoData[endIx].Flags == OptoTelegramFlags.OK)) + { + optoData[endIx].Flags = OptoTelegramFlags.OK_TestEnd; + } + + StopParsingOptoSerialPort(); + if (optoDataCount <= MaxOptoDataCount) + { + OptoTelegramRaw.FIRFilterFlow(optoData, 0, optoDataCount - 1); + } + else + { + OptoTelegramRaw.FIRFilterFlow(optoData, 0, StartOptoDataCount - 1); + OptoTelegramRaw.FIRFilterFlow(optoData, (optoDataCount - EndOptoDataCount), optoDataCount - 1); + } SaveOptoData(); - if (TestStartTelegramIx == 0 || optoDataCount < 100) - { - resultCode |= (int)Results.Entities.ResultCode.MissingOptoData; - } - else if (volumeLtrEnd == volumeLtrStart) - { - resultCode |= (int)Results.Entities.ResultCode.OptoDataWithZeroFlow; - } + if (TestStartTelegramIx == 0 || optoDataCount < 100) + { + resultCode |= (int)Results.Entities.ResultCode.MissingOptoData; + } + else if (volumeLtrEnd == volumeLtrStart) + { + resultCode |= (int)Results.Entities.ResultCode.OptoDataWithZeroFlow; + } } /// @@ -658,7 +678,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead /// void SaveOptoData() { - if (optoDataLogFileName != null) + if (!string.IsNullOrEmpty(optoDataLogFileName)) { string directory = Path.Combine("C:\\TBF\\ProcessData", StateMachine.CycleStartTimeStamp.ToString("yy"), StateMachine.CycleStartTimeStamp.ToString("MM"), diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs index 259312a49..eccdfe194 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs @@ -3,12 +3,9 @@ /// using System; using System.IO; -using System.Text; using System.Xml.Serialization; using Config.Entities; using TBF.BenchControl.Generic; -using TBF.BenchControl.Output; -using TBF.Resources; using System.Collections.Generic; namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead @@ -22,11 +19,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead public float CalibTarget; /// Target error after calibration in [%] public int FactorLimitLo; /// Lower limit for the calibration factor public int FactorLimitHi; /// Upper limit for the calibration factor - public FlowDir FlowDir; /// Initial iPerl flow direction (R_L or L_R) - public LogType LogType; + public Counting Counting; /// Initial iPerl counting (Artbitrary, Positive or Negative) #if ORACLE_DB public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD - public int WMType_Rev; /// Required for Oracle DB: Rev_WZTyp in table VT_PRUEFPUNKT_SOLL_SD #endif @@ -36,11 +31,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead CalibTarget = 0; FactorLimitLo = 1000; FactorLimitHi = 8000; - FlowDir = FlowDir.R_L; - LogType = LogType.Just_Q1Q2Q3; + Counting = Counting.Arbitrary; #if ORACLE_DB WMType_ID = 2; /// Value for iPerl DN15 - WMType_Rev = 1; /// Value for iPerl DN15 #endif } @@ -50,11 +43,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead "Calib. target [%]", "Calib. factor Lo", "Calib. factor Hi", - "Flow direction", - "Log type", + "Counting", #if ORACLE_DB - "WMType ID", - "WMType Rev.", + "WM type ID", #endif }; public override string ParamName(int i) { return paramNames[i]; } @@ -71,13 +62,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead else if (i == 4) { IList retVal = new List(); - for (FlowDir fd = 0; fd < FlowDir.Count; fd++) retVal.Add(fd.ToString()); - return retVal; - } - else if (i == 5) - { - IList retVal = new List(); - for (LogType lt = 0; lt < LogType.Count; lt++) retVal.Add(lt.ToString()); + for (Counting c = 0; c < Counting.Count; c++) retVal.Add(c.ToString()); return retVal; } return null; @@ -91,11 +76,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead case 1: return CalibTarget.ToString(); case 2: return FactorLimitLo.ToString(); case 3: return FactorLimitHi.ToString(); - case 4: return FlowDir.ToString(); - case 5: return LogType.ToString(); + case 4: return Counting.ToString(); #if ORACLE_DB - case 6: return WMType_ID.ToString(); - case 7: return WMType_Rev.ToString(); + case 5: return WMType_ID.ToString(); #endif default: return string.Empty; } @@ -115,20 +98,13 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead case 2: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None; case 3: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None; case 4: - for (FlowDir fd = 0; fd < FlowDir.Count; fd++) + for (Counting c = 0; c < Counting.Count; c++) { - if (fd.ToString().Equals(strValue)) { FlowDir = fd; return CfgUpdateFlags.None; } - } - break; - case 5: - for (LogType lt = 0; lt < LogType.Count; lt++) - { - if (lt.ToString().Equals(strValue)) { LogType = lt; return CfgUpdateFlags.None; } + if (c.ToString().Equals(strValue)) { Counting = c; return CfgUpdateFlags.None; } } break; #if ORACLE_DB - case 6: WMType_ID = int.Parse(strValue); return CfgUpdateFlags.None; - case 7: WMType_Rev = int.Parse(strValue); return CfgUpdateFlags.None; + case 5: WMType_ID = int.Parse(strValue); return CfgUpdateFlags.None; #endif default: return CfgUpdateFlags.None; } @@ -156,14 +132,10 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true; break; case 4: - for (FlowDir fd = 0; fd < FlowDir.Count; fd++) if (fd.ToString().Equals(strValue)) return true; - break; - case 5: - for (LogType lt = 0; lt < LogType.Count; lt++) if (lt.ToString().Equals(strValue)) return true; + for (Counting c = 0; c < Counting.Count; c++) if (c.ToString().Equals(strValue)) return true; break; #if ORACLE_DB - case 6: /// WMType_ID - case 7: /// WMType_Rev + case 5: /// WMType_ID if (int.TryParse(strValue, out iDummy)) return true; break; #endif @@ -182,11 +154,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead prms.CalibTarget = this.CalibTarget; prms.FactorLimitLo = this.FactorLimitLo; prms.FactorLimitHi = this.FactorLimitHi; - prms.FlowDir = this.FlowDir; - prms.LogType = this.LogType; + prms.Counting = this.Counting; #if ORACLE_DB prms.WMType_ID = this.WMType_ID; - prms.WMType_Rev = this.WMType_Rev; #endif } diff --git a/TBF/Properties/AssemblyInfo.cs b/TBF/Properties/AssemblyInfo.cs index b05494d98..eee762d5f 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.1131.0")] -[assembly: AssemblyFileVersion("2.18.1131.0")] +[assembly: AssemblyVersion("2.18.1140.0")] +[assembly: AssemblyFileVersion("2.18.1140.0")] diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index 03e1d8350..494af4591 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -789,6 +789,13 @@ + + Form + + + LargeMessageBoxForm.cs + + @@ -2598,6 +2605,9 @@ AskYesNoForm.cs + + LargeMessageBoxForm.cs + MessageBoxForm.cs