(1) Auto. wmTypeRev (2) IperlCheck t.meth. (3) Pruefindex, Q2corr. read from Ora.on start (4) VolStart/VolEnd written to Ora. bounded, (5) iPerlCommForm.ReadQ2Corr() bug fix (6) LU logging cleanup, etc, ver. 2.18.1140

This commit is contained in:
Milan Hanajik 2019-02-06 10:34:43 +01:00
parent dd8273798a
commit 32873ee2b0
27 changed files with 883 additions and 293 deletions

View File

@ -25,6 +25,14 @@ namespace Config.Entities
Count
}
public enum Counting
{
Arbitrary,
Positive,
Negative,
Count
}
public enum OptoHeadState
{
Disabled,

View File

@ -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<MeterTestRslt>();
#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)
{

View File

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

View File

@ -54,7 +54,6 @@ namespace Results.Mappings
#endif
#if ORACLE_DB
Map(x => x.WMTypeId);
Map(x => x.WMTypeRev);
#endif
}
}

View File

@ -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")]

View File

@ -0,0 +1,86 @@
///
/// Copyright (c) 2019 Sensus Metering Systems
///
namespace TBF.BenchControl.Operations
{
partial class LargeMessageBoxForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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
/// <summary>
/// Used by CoverTest, AskYesNoOp and LargeMessageBoxOp.
/// </summary>
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<EventArgs> CloseThisFormHandler;
public void StartForceCloseHandler()
{
CloseThisFormHandler += delegate(object sender, EventArgs args)
{
if (InvokeRequired)
Invoke(new EventHandler<EventArgs>(OnForceClose), sender, args);
else
OnForceClose(sender, args);
};
}
private void OnForceClose(object sender, EventArgs args)
{
DialogResult = DialogResult.Cancel;
Close();
}
#endregion
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -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;
/// <returns>Reference to the operation</returns>
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();
}
/// <summary>Start this operation</summary>
public void Start()
{
completed = false;
Program.MainWnd.Invoke(new MessageBoxFormDlgt(OpenFormDlg), this);
}
/// <summary>Run this operation</summary>
/// <returns>Event.ResultsPrinted</returns>
public Event Run()
{
if (completed || form.Completed)
{
completed = true;
form = null;
return Event.OK;
}
return Event.None;
}
/// <summary>Stop this operation</summary>
public void Stop()
{
if (form != null)
{
form.OnCloseThisForm(this, null);
form = null;
}
}
}
}

View File

@ -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
/// <param name="wmTypeId">Water meter type Id</param>
/// <param name="wmTypeRevision">Water meter type revision</param>
/// <returns>SensusTestInfos array</returns>
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<SensusTestInfo> oraDbTinfos = new List<SensusTestInfo>();
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
/// <summary>
/// Read start info of one water meter from the database
/// </summary>
/// <param name="wmNr">0-based water meter number</param>
/// <param name="results">Sorted list of results to update</param>
/// <param name="conn">Oracke DB connection</param>
/// <param name="wm">Water meter entity</param>
/// <returns>Retv.OK when successful, Retv.Error on error</returns>
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
/// <param name="b">Batch</param>
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
/// </summary>
/// <param name="q">q = 0, 1, 2 or 3 (Adj., Q1, Q2, Q3)</param>
/// <returns>Nr. of rows updated</returns>
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
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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<string> list1 = new List<string>();
for (LogType lt = 0; lt < LogType.Count; lt++) list1.Add(lt.ToString());
return list1;
case 1:
case 2:
case 3:
case 4:
IList<string> list2 = new List<string>();
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;

View File

@ -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
/// <returns>true when two test info-s are compatible</returns>
public static bool AreCompatible(IList<SensusTestInfo> 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);
}
}
}

View File

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

View File

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

View File

@ -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<IOperation>();
foreach (var op in PermanentOperations) Operations.Add(op);
Transitions = new List<Transition>();
log.Debug(this.ToString());
}
/// <summary>
@ -172,7 +171,9 @@ namespace TBF.BenchControl
/// </summary>
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;

View File

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

View File

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

View File

@ -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<Event> rList = new List<Event>(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 });

View File

@ -109,7 +109,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead
/// Verify whether the flow direction is correct
/// </summary>
/// <returns>OptoHeadState.OptoAndDirOK, OptoHeadState.OptoNok or OptoHeadState.DirNok</returns>
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;
}

View File

@ -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
/// <summary>Stop this operation</summary>
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 : "<null>");
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;
}
}
/// <summary>
@ -658,7 +678,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication.iPerlHead
/// </summary>
void SaveOptoData()
{
if (optoDataLogFileName != null)
if (!string.IsNullOrEmpty(optoDataLogFileName))
{
string directory = Path.Combine("C:\\TBF\\ProcessData", StateMachine.CycleStartTimeStamp.ToString("yy"),
StateMachine.CycleStartTimeStamp.ToString("MM"),

View File

@ -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<string> retVal = new List<string>();
for (FlowDir fd = 0; fd < FlowDir.Count; fd++) retVal.Add(fd.ToString());
return retVal;
}
else if (i == 5)
{
IList<string> retVal = new List<string>();
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
}

View File

@ -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")]

View File

@ -789,6 +789,13 @@
<Compile Include="BenchControl\Network\Telnet\VirtualTerminal.cs" />
<Compile Include="BenchControl\Operations\EnduranceDataLoggingOp.cs" />
<Compile Include="BenchControl\Operations\EnthalpyCalculationOp.cs" />
<Compile Include="BenchControl\Operations\LargeMessageBoxForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="BenchControl\Operations\LargeMessageBoxForm.designer.cs">
<DependentUpon>LargeMessageBoxForm.cs</DependentUpon>
</Compile>
<Compile Include="BenchControl\Operations\LargeMessageBoxOp.cs" />
<Compile Include="BenchControl\Operations\ReturnGivenEventOp.cs" />
<Compile Include="BenchControl\Output\DB\ProductionTracing\Enums.cs" />
<Compile Include="BenchControl\Output\DB\ProductionTracing\Tracing.cs" />
@ -2598,6 +2605,9 @@
<EmbeddedResource Include="BenchControl\Operations\AskYesNoForm.resx">
<DependentUpon>AskYesNoForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="BenchControl\Operations\LargeMessageBoxForm.resx">
<DependentUpon>LargeMessageBoxForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="BenchControl\Operations\MessageBoxForm.resx">
<DependentUpon>MessageBoxForm.cs</DependentUpon>
</EmbeddedResource>