iPerl : (1) results DB change, (2) reading from Oracle on cycle start, (3) reading Q2 corr. factors from iPerl, (4) new result items, (5) MainSeq cleanup, ver. 2.18.1125

This commit is contained in:
Milan Hanajik 2019-01-23 08:34:31 +01:00
parent 88496cf003
commit f8ac27ba3c
13 changed files with 658 additions and 235 deletions

View File

@ -41,8 +41,8 @@ namespace Results.Entities
public class WaterMeter
{
public virtual int Id { get; protected set; }
public virtual string SerialNr { get; set; } /// Main s/n for compound meters, PCB Number for iPerl water meter
public virtual string SerialNrAux { get; set; } /// Aux s/n for compound meters, Serial number for iPerl water meter
public virtual string SerialNr { get; set; } /// S/N _or_ S/N of the main meter of a compound meter _or_ PCB Number of an iPerl water meter
public virtual string SerialNrAux { get; set; } /// S/N of the aux. meter of a compound meter _or_ a complete assigned S/N of an iPerl water meter
public virtual string PurchaseOrder { get; set; }
public virtual int YearOfProduction { get; set; }
public virtual int WMPosition { get; set; }
@ -57,7 +57,6 @@ namespace Results.Entities
public virtual string Remark { get; set; }
#if IPERL
public virtual int SerialNrEx { get; set; } /// Aux s/n for compound meters, Serial number for iPerl water meter
public virtual double OrigCalibFactor { get; set; } /// Original iPerl calibration factor used during the test
public virtual double CalibFactor { get; set; } /// iPerl calibration factor used during the test
public virtual double OrigCalibFactorLNA{ get; set; } /// Original iPerl LNA calibration factor used during the test
@ -73,6 +72,24 @@ namespace Results.Entities
public virtual int Hz2Correction { get; set; } /// iPerl Q2 correction used during the test
public virtual string FWVersion { get; set; }
#endif
#if TURA_SPECIAL
/// <summary>
/// Data from a production test bench (in case of tests on iPerl special)
/// </summary>
public virtual int AssignedSerialNr { get; set; }
public virtual string CompleteSerialNr { get; set; }
public virtual string RadioAddress { get; set; }
public virtual int PaletteNr { get; set; }
public virtual int UmkartonNr { get; set; }
public virtual string ProdTestBench { get; set; }
public virtual int ProdWMPosition { get; set; }
public virtual string ProdUserName { get; set; }
public virtual string ProdPurchaseOrder { get; set; }
public virtual bool ProdPassed { get; set; }
public virtual int ProdResultCode { get; set; }
public virtual int ProdQ2CorrRL { get; set; } /// iPerl Q2 correction for the R-flow written to iPerl
public virtual int ProdQ2CorrLR { get; set; } /// iPerl Q2 correction for the L-flow written to iPerl
#endif
#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 !!!
@ -346,7 +363,6 @@ namespace Results.Entities
ArchivePath = src.ArchivePath;
Remark = src.Remark;
#if IPERL
SerialNrEx = src.SerialNrEx;
OrigCalibFactor = src.OrigCalibFactor;
CalibFactor = src.CalibFactor;
Q2ErrWOCorrection = src.Q2ErrWOCorrection;
@ -358,6 +374,7 @@ namespace Results.Entities
Diff2Hz8Hz = src.Diff2Hz8Hz;
Hz2CorrectionDone = src.Hz2CorrectionDone;
Hz2Correction = src.Hz2Correction;
RadioAddress = src.RadioAddress;
FWVersion = src.FWVersion;
#endif
#if ORACLE_DB
@ -379,7 +396,7 @@ namespace Results.Entities
{
StringBuilder sb = new StringBuilder(80);
#if IPERL
sb.AppendFormat("PCB:{0} S/N:{1} ", SerialNr, SerialNrEx);
sb.AppendFormat("PCB:{0} S/N:{1} ", SerialNr, SerialNrAux);
#else
sb.AppendFormat("S/N:{0} ", SerialNr);
#endif

View File

@ -270,6 +270,21 @@ namespace Results
CalibFactorLNA, /// 232
WM_remark, /// 233
/// iPerl special
Prod_AssignedSerialNr, /// 234
Prod_CompleteSerialNr, /// 235
Prod_RadioAddress, /// 236
Prod_PaletteNr, /// 237
Prod_UmkartonNr, /// 238
Prod_TestBench, /// 239
Prod_WMPosition, /// 240
Prod_UserName, /// 241
Prod_PurchaseOrder, /// 242
Prod_Passed, /// 243
Prod_ResultCode, /// 244
Prod_Q2CorrRL, /// 245
Prod_Q2CorrLR, /// 246
Count,
}

View File

@ -28,7 +28,6 @@ namespace Results.Mappings
.CustomType("StringClob")
.CustomSqlType("varchar(2000)");
#if IPERL
Map(x => x.SerialNrEx);
Map(x => x.OrigCalibFactor);
Map(x => x.CalibFactor);
Map(x => x.OrigCalibFactorLNA);
@ -36,14 +35,29 @@ namespace Results.Mappings
Map(x => x.Q2ErrWOCorrection);
Map(x => x.Q2CorrectionDone);
Map(x => x.Q2Correction);
Map(x => x.Q2CorrRL).Column("Q2CorrRFlow");
Map(x => x.Q2CorrLR).Column("Q2CorrLFlow");
Map(x => x.Q2CorrRL);
Map(x => x.Q2CorrLR);
Map(x => x.Q2CorrFlowRight);
Map(x => x.Diff2Hz8Hz);
Map(x => x.Hz2CorrectionDone);
Map(x => x.Hz2Correction);
Map(x => x.FWVersion);
#endif
#if TURA_SPECIAL
Map(x => x.AssignedSerialNr);
Map(x => x.CompleteSerialNr);
Map(x => x.RadioAddress);
Map(x => x.PaletteNr);
Map(x => x.UmkartonNr);
Map(x => x.ProdTestBench);
Map(x => x.ProdWMPosition);
Map(x => x.ProdUserName);
Map(x => x.ProdPurchaseOrder);
Map(x => x.ProdPassed);
Map(x => x.ProdResultCode);
Map(x => x.ProdQ2CorrRL);
Map(x => x.ProdQ2CorrLR);
#endif
#if ORACLE_DB
Map(x => x.Pruefindex);
Map(x => x.HydrPruefung);

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.1110.0")]
[assembly: AssemblyFileVersion("2.18.1110.0")]
[assembly: AssemblyVersion("2.18.1125.0")]
[assembly: AssemblyFileVersion("2.18.1125.0")]

View File

@ -31,6 +31,21 @@ namespace Results
}
}
public static string BenchNameFromOracleBenchID(int id)
{
switch (id)
{
case 4: return "WR9";
case 5: return "WR10";
case 6: return "WR11";
case 7: return "PT7";
case 8: return "WR13";
case 9: return "WR15";
case 10: return "WR14";
default: return string.Empty;
}
}
/// <summary>
/// Converts ErrorFlags integer to string. Supports up to 31 flags (E1..E31).

View File

@ -426,6 +426,23 @@ namespace Results
AllItems.Add(new WMeterRsltItemSpec(ItemID.Max_test_index, "iPerl test index", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, (w.Pruefindex % 100))));
#endif
#endif
#if TURA_SPECIAL
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_AssignedSerialNr, "iPerl assigned s/n", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.AssignedSerialNr)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_CompleteSerialNr, "iPerl complete s/n", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.CompleteSerialNr)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_RadioAddress, "iPerl radio address", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.RadioAddress)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_PaletteNr, "iPerl palette nr.", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.PaletteNr)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_UmkartonNr, "iPerl umkarton nr.", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.UmkartonNr)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_TestBench, "Prod iPerl test bench", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.ProdTestBench)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_WMPosition, "Prod iPerl WM position", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.ProdWMPosition)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_UserName, "Prod iPerl user name", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.ProdUserName)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_PurchaseOrder, "Prod iPerl purchase order", Quantity.String, ItemCategory.MeterResult, (w, t, u, f, p) => FormatStr(f, w.ProdPurchaseOrder)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_Passed, "Prod iPerl passed", Quantity.Boolean,ItemCategory.MeterResult, (w, t, u, f, p) => FormatBool(f,w.ProdPassed)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_ResultCode, "Prod iPerl result code", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.ProdResultCode)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_Q2CorrRL, "Prod iPerl Q2Corr R-L", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.Q2CorrRL)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.Prod_Q2CorrLR, "Prod iPerl Q2Corr L-R", Quantity.Number, ItemCategory.MeterResult, (w, t, u, f, p) => FormatInt(f, w.Q2CorrLR)));
#endif
AllItems.Add(new WMeterRsltItemSpec(ItemID.TestDone, Strings.Test_done + "()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => FormatBool(f, (w.GetMeterTestRslt(t) != null) && w.GetMeterTestRslt(t).TestDone)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.TestPassed, Strings.Test_passed + "()", Quantity.Boolean, ItemCategory.TestResult, (w, t, u, f, p) => FormatBool(f, (w.GetMeterTestRslt(t) != null) && w.GetMeterTestRslt(t).Passed)));
AllItems.Add(new WMeterRsltItemSpec(ItemID.ErrorFlags, Strings.Error_flags + "()", Quantity.String, ItemCategory.TestResult, (w, t, u, f, p) => FormatStr(f, (w.GetTestRslt(t) != null) ? w.GetTestRslt(t).ErrorFlagsStr() : w.ErrorFlagsStr())));
@ -460,7 +477,8 @@ namespace Results
public static string FormatStr(string format, string value)
{
return string.IsNullOrEmpty(format) ? value : string.Format(format, value);
string valueEx = string.IsNullOrEmpty(value) ? string.Empty : value;
return string.IsNullOrEmpty(format) ? valueEx : string.Format(format, valueEx);
}
public static string FormatBool(string format, bool value)

View File

@ -11,6 +11,6 @@ namespace TBF.BenchControl.GenericDevices
/// Reads information on start of a cycle, Events: Event.InfoRead
/// </summary>
/// <returns>Reference to the operation</returns>
IOperation ReadStartInfoOp(Results.Entities.Batch batchResults);
IOperation ReadStartInfoOp(Results.Entities.WaterMeter[] waterMeters);
}
}

View File

@ -45,6 +45,11 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
///
GenericDevices.IRegisterReader[] iperlHeads;
/// <summary>
/// Start info is read into WaterMeter objects referenced by this array
/// </summary>
Results.Entities.WaterMeter[] waterMeters;
/// <summary>
/// Results to print
/// </summary>
@ -52,11 +57,13 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
OracleConnection connection; /// Oracle database connection
///
/// The following 3 variables are always update together
///
int id_WZTyp;
int rev_WZTyp;
IList<SensusTestInfo> oraDbTestInfos = new List<SensusTestInfo>(); /// Contains only flowId-s ad qBezeichnung-s
SensusTestInfo[] completeTestInfos; /// Contains also a range (90-100/100-110), a TBF test name and a string form of the flowId
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
public Database() {}
@ -71,6 +78,10 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
log.Debug(this.ToString());
}
///
/// IDevice interface implementation
///
public void Initialize()
{
switch (dbCfg.DBUsed)
@ -107,24 +118,89 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
connection.Close();
}
}
///
public void RunDeviceBefore() {}
public void RunDeviceAfter() {}
///
public void StopDevice()
{
if (connection != null) connection.Dispose();
}
public void StopDevice2() { }
/// <summary>
/// Get a complete information about tests given water meter type Id and revision
/// </summary>
/// <param name="conn">An open Oracle DB connection</param>
/// <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)
{
///
/// 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 { ParameterName = "1", OracleDbType = OracleDbType.Int32, Value = wmTypeId }); ///:1
cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = wmTypeRevision }); ///:2
///
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
int pruefungsNr = dr.GetInt32(0);
double errLimHi = dr.GetDouble(1);
string qBezeichnung = dr.GetString(2);
oraDbTinfos.Add(new SensusTestInfo(pruefungsNr, string.Empty, qBezeichnung, Range.R100_110, errLimHi.ToString()));
}
dr.Close();
if (oraDbTinfos.Count == 0) return null; /// No 'incomplete' TestInfo in Oracle DN for this 'wmTypeId' and 'wmTypeRevision'
///
/// Find a matching complete test info
///
SensusTestInfo[] cmpltTinfos = null;
oraDbTinfos = oraDbTinfos.OrderBy(x => x.PruefungsNr).ToList<SensusTestInfo>();
for (LogType lt = 0; lt < LogType.Count; lt++)
{
SensusTestInfo[] myTinfos = SensusTestInfo.GetTestInfos(lt);
if (SensusTestInfo.AreCompatible(oraDbTinfos, myTinfos))
{
cmpltTinfos = myTinfos;
break;
}
}
foreach (var ti in oraDbTinfos)
{
log.WarnFormat("VT_PRUEFPUNKT_SOLL_SD info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} PosFehlerKalt={3} QBezeichnung={4}",
wmTypeId, wmTypeRevision, ti.PruefungsNr, ti.TestName, ti.QBezeichnung);
}
if (cmpltTinfos != null)
{
foreach (var ti in cmpltTinfos)
{
log.WarnFormat("Selected test info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} Str={3} QBezeichnung={4} Range={5} Test={6}",
wmTypeId, wmTypeRevision, ti.PruefungsNr, ti.PruefungsNrStr, ti.QBezeichnung, ti.Range, ti.TestName);
}
}
return cmpltTinfos;
}
/// <summary>
/// Reads information on start of a cycle, Events: Event.InfoRead
/// </summary>
/// <param name="batch">Batch results</param>
/// <param name="waterMeters">Results of water meters</param>
/// <returns>Reference to the operation</returns>
public IOperation ReadStartInfoOp(Results.Entities.Batch batch)
public IOperation ReadStartInfoOp(Results.Entities.WaterMeter[] waterMeters)
{
if (!dbCfg.ReadStartInfo)
{
@ -137,7 +213,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
else
{
currentOp = CurrentOp.ReadStartInfo;
this.batch = batch;
this.waterMeters = waterMeters;
return this;
}
}
@ -165,7 +241,6 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
}
}
public IOperation CheckBarcodeScanningOp(GenericDevices.IRegisterReader[] iperlHeads)
{
if (currentOp != CurrentOp.None)
@ -178,6 +253,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
return this;
}
/// <summary>Start this operation</summary>
public void Start()
{
@ -193,11 +269,11 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
{
if (!opCompleted)
{
if (batch.WaterMeters.Count == 0) return Event.ResultsWritten;
if ( waterMeters.Length == 0) return Event.ResultsWritten;
#if ORACLE_DB
if (dbCfg.DebugLevel != DebugMode.Simulate && connection != null)
if ((dbCfg.DebugLevel == DebugMode.Normal) && (connection != null))
{
if (ReadStartInfoFromDB(connection, batch) == Retv.Error) anyError = true;
if (ReadStartInfoFromDB(connection) == Retv.Error) anyError = true;
}
#endif
opCompleted = true;
@ -211,7 +287,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
{
if (batch.WaterMeters.Count == 0) return Event.ResultsWritten;
#if ORACLE_DB
if (dbCfg.DebugLevel != DebugMode.Simulate && connection != null)
if ((dbCfg.DebugLevel == DebugMode.Normal) && (connection != null))
{
if (WriteResultsToDB(connection, batch, false) == Retv.Error) anyError = true;
}
@ -226,7 +302,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
if (!opCompleted)
{
#if ORACLE_DB
if (dbCfg.DebugLevel != DebugMode.Simulate && connection != null)
if ((dbCfg.DebugLevel == DebugMode.Normal) && (connection != null))
{
if (CheckBarcodeScanning(connection, iperlHeads) == Retv.Error) anyError = true; ;
}
@ -291,15 +367,16 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
}
public Retv ReadStartInfoFromDB(OracleConnection conn, Results.Entities.Batch batch)
public Retv ReadStartInfoFromDB(OracleConnection conn)
{
bool anyError = false;
try
{
conn.Open(); /// Open the Oracle database
foreach (var wMtr in batch.WaterMeters)
foreach (var wMtr in waterMeters)
{
ReadSingleWMfromDB(conn, wMtr);
if ((wMtr != null) && (ReadSingleWMfromDB(conn, wMtr) != Retv.OK)) anyError = true;
}
}
catch (Exception exc)
@ -311,21 +388,213 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
}
conn.Close();
return Retv.OK;
return anyError ? Retv.Error : Retv.OK;
}
/// <summary>
/// Read start info of one water meter from the database
/// </summary>
/// </summary>
/// <param name="wmNr">0-based water meter number</param>
/// <param name="results">Sorted list of results to update</param>
void ReadSingleWMfromDB(OracleConnection conn, Results.Entities.WaterMeter wm)
Retv ReadSingleWMfromDB(OracleConnection conn, Results.Entities.WaterMeter wm)
{
if (string.IsNullOrEmpty(wm.SerialNr)) return; /// No database activity possible w/o PCB number
if (string.IsNullOrEmpty(wm.SerialNr)) return Retv.Error; /// No database activity possible w/o PCB number
wm.Pruefindex = ReadMaxPruefindex(conn, wm);
try
{
if (completeTestInfos == null || (id_WZTyp != wm.WaterMeterData.WMTypeId) || (rev_WZTyp != wm.WaterMeterData.WMTypeRev))
{
SensusTestInfo[] ti = GetMatchingTestInfo(conn, wm.WaterMeterData.WMTypeId, wm.WaterMeterData.WMTypeRev);
// select (Q_Fehler) from VT_PRUEFREIHE_IST_PD where VT_fernum=(1) AND PruefungsNr=(2) AND ANBID=4
if (ti != null)
{
completeTestInfos = ti;
id_WZTyp = wm.WaterMeterData.WMTypeId;
rev_WZTyp = wm.WaterMeterData.WMTypeRev;
}
else
{
return Retv.Error;
}
}
OracleCommand cmd;
OracleDataReader dr;
// SELECT * FROM VT_ZAEHLER_PD WHERE VT_Fernum = :1 AND ANBID = 4
int maxPruefindex = 0;
string purchaseOrder = string.Empty;
int assignedSerialNr = 0;
int paletteNr = 0;
int umkartonNr = 0;
string completeSerialNr = string.Empty;
string radioAddress = string.Empty;
int testBenchID = 0;
int pruefreiheID = 0;
int wmPosition = 0;
bool passed = false;
int resultCode = 0;
int userId = 0;
int q2CorrectionRL = 0;
int q2CorrectionLR = 0;
double q2ErrorBeforeCorrection = 0;
///
/// Read data from VT_ZAEHLER_PD
///
cmd = new OracleCommand("select MAX_PRUEFINDEX, AUFTRAGSNUMMER, ZAEHLERNUMMER, PALETTE_NR, UMKARTON_NR, Z_NR_KOMPLETT, VT_MODUL_SNR from VT_ZAEHLER_PD where VT_FERNUM = :1 AND ANBID = 4", conn);
/// 100*benchId+MPix, purchase_order, assigned_s/n, palette_nr, box_nr., complete_s/n, radio_address
cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr });
dr = cmd.ExecuteReader();
if (dr.Read())
{
int i = 0;
int benchId_x_100_plus_MaxPruefindex = dr.GetInt32(i++);
maxPruefindex = benchId_x_100_plus_MaxPruefindex % 100;
testBenchID = benchId_x_100_plus_MaxPruefindex / 100;
try { purchaseOrder = dr.GetString(i++); } catch { purchaseOrder = string.Empty; }
try { assignedSerialNr = dr.GetInt32(i++); } catch { assignedSerialNr = 0; }
try { paletteNr = dr.GetInt32(i++); } catch { paletteNr = 0; }
try { umkartonNr = dr.GetInt32(i++); } catch { umkartonNr = 0; }
try { completeSerialNr = dr.GetString(i++); } catch { completeSerialNr = string.Empty; }
try { radioAddress = dr.GetString(i++); } catch { radioAddress = string.Empty; }
}
else
{
///
/// Water meter with given PCB number was not found in ORACLE
///
log.ErrorFormat("Water meter {0} was not found in ORACLE database.", wm.SerialNr);
dr.Close();
return Retv.Error;
}
dr.Close();
///
/// Read data from VT_ZAEHLER_PINDEX_PD
///
cmd = new OracleCommand("select PRUEFINDEX, ID_WZPRUEFREIHE, WT_PLATZ_NR, WZGUT, ID_BENUTZER from VT_ZAEHLER_PINDEX_PD where VT_FERNUM = :1 AND ANBID = 4", conn);
/// test_bench_ID, line_ID, WM_position, result, user_ID
cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Varchar2, Value = wm.SerialNr });
dr = cmd.ExecuteReader();
while (dr.Read())
{
int i = 0;
int prfix = (dr.GetInt32(i++) % 100);
if (prfix == maxPruefindex)
{
pruefreiheID = dr.GetInt32(i++);
wmPosition = dr.GetInt32(i++);
passed = (dr.GetInt32(i++) != 0);
userId = dr.GetInt32(i++);
}
}
dr.Close();
///
/// Read data from VT_IP_ZAEHLER_PINDEX_PD
///
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 });
dr = cmd.ExecuteReader();
while (dr.Read())
{
int i = 0;
int prfix = (dr.GetInt32(i++) % 100);
if (prfix == maxPruefindex)
{
q2CorrectionRL = dr.GetInt32(i++);
q2CorrectionLR = dr.GetInt32(i++);
q2ErrorBeforeCorrection = dr.GetDouble(i++);
}
}
dr.Close();
///
/// Read data from VT_PRUEFREIHE_IST_PD
///
/// 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 });
dr = cmd.ExecuteReader();
while (dr.Read())
{
int i = 0;
int testId = dr.GetInt32(i++);
double flow = dr.GetDouble(i++);
double error = dr.GetDouble(i++);
bool testPassed = (dr.GetInt32(i++) != 0);
string testName = null;
foreach (var ti in completeTestInfos)
{
if (ti.PruefungsNr == testId)
{
testName = ti.TestName;
break;
}
}
if (!string.IsNullOrEmpty(testName))
{
foreach (var mtr in wm.MeterTestRslts)
{
string mtrTestName = mtr.TestRslt.Name();
int ix = mtrTestName.LastIndexOf(" (");
string mtrBaseTestName = (ix < 0) ? mtrTestName : mtrTestName.Substring(0, ix);
if (mtrBaseTestName == testName)
{
mtr.LastError = error;
}
}
}
}
dr.Close();
///
/// Copy acquired data to WaterMeter object
///
wm.Pruefindex = maxPruefindex;
wm.AssignedSerialNr = assignedSerialNr;
wm.CompleteSerialNr = completeSerialNr;
wm.RadioAddress = radioAddress;
wm.PaletteNr = paletteNr;
wm.UmkartonNr = umkartonNr;
wm.ProdTestBench = Results.Utils.BenchNameFromOracleBenchID(testBenchID);
wm.ProdWMPosition = wmPosition;
wm.ProdUserName = userId.ToString();
wm.ProdPurchaseOrder = purchaseOrder;
wm.ProdPassed = passed;
wm.ProdResultCode = resultCode;
wm.ProdQ2CorrRL = q2CorrectionRL;
wm.ProdQ2CorrLR = q2CorrectionLR;
log.InfoFormat("Data of water meter {0} successfully read from ORACLE database.", wm.SerialNr);
log.DebugFormat(" MaxPruefindex = {0}", wm.Pruefindex);
log.DebugFormat(" AssignedSerialNr = {0}", wm.AssignedSerialNr);
log.DebugFormat(" CompleteSerialNr = {0}", wm.CompleteSerialNr);
log.DebugFormat(" RadioAddress = {0}", wm.RadioAddress);
log.DebugFormat(" PaletteNr = {0}", wm.PaletteNr);
log.DebugFormat(" UmkartonNr = {0}", wm.UmkartonNr);
log.DebugFormat(" ProdTestBench = {0}", wm.ProdTestBench);
log.DebugFormat(" ProdWMPosition = {0}", wm.ProdWMPosition);
log.DebugFormat(" ProdUserName = {0}", wm.ProdUserName);
log.DebugFormat(" ProdPurchaseOrder = {0}", wm.ProdPurchaseOrder);
log.DebugFormat(" ProdPassed = {0}", wm.ProdPassed);
log.DebugFormat(" ProdResultCode = {0}", wm.ProdResultCode);
log.DebugFormat(" ProdQ2CorrRL = {0}", wm.ProdQ2CorrRL);
log.DebugFormat(" ProdQ2CorrLR = {0}", wm.ProdQ2CorrLR);
return Retv.OK;
}
catch (Exception exc)
{
log.ErrorFormat("Error reading data of water meter {0} from ORACLE database: {1}", wm.SerialNr, exc.Message);
return Retv.Error;
}
}
@ -336,6 +605,7 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
try
{
conn.Open(); /// Open the Oracle database
transaction = conn.BeginTransaction();
SaveBatchData(conn, batch);
@ -450,65 +720,22 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
return maxPrfIndex;
}
/// <summary>
/// Save common batch data
/// </summary>
/// <param name="b">Batch</param>
void SaveBatchData(OracleConnection conn, Results.Entities.Batch b)
{
OracleParameter parm;
if ((id_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeId) || (rev_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeRev) || oraDbTestInfos.Count == 0 || completeTestInfos == null)
if ((completeTestInfos == null) || (id_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeId) || (rev_WZTyp != b.WaterMeters[0].WaterMeterData.WMTypeRev))
{
id_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeId;
rev_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeRev;
SensusTestInfo[] ti = GetMatchingTestInfo(conn, b.WaterMeters[0].WaterMeterData.WMTypeId, b.WaterMeters[0].WaterMeterData.WMTypeRev);
///
/// Read 'incomplete' TestInfo from the database
///
OracleCommand cmd1 = new OracleCommand("SELECT PruefungsNr, PosFehlerKalt, QBezeichnung FROM VT_PRUEFPUNKT_SOLL_SD WHERE ANBID=4 AND ID_WZTyp=:1 AND Rev_WZTyp=:2", conn);
parm = new OracleParameter("ID_WZTyp", OracleDbType.Int32); parm.Value = id_WZTyp; cmd1.Parameters.Add(parm); ///:1
parm = new OracleParameter("Rev_WZTyp", OracleDbType.Int32); parm.Value = rev_WZTyp; cmd1.Parameters.Add(parm); ///:2
oraDbTestInfos.Clear();
OracleDataReader dr = cmd1.ExecuteReader();
while (dr.Read())
if (ti != null)
{
int pruefungsNr = dr.GetInt32(0);
double errLimHi = dr.GetDouble(1);
string qBezeichnung = dr.GetString(2);
oraDbTestInfos.Add(new SensusTestInfo(pruefungsNr, string.Empty, qBezeichnung, Range.R100_110, errLimHi.ToString()));
}
dr.Close();
///
/// Find a matching complete test info
///
oraDbTestInfos = oraDbTestInfos.OrderBy(x => x.PruefungsNr).ToList<SensusTestInfo>();
completeTestInfos = null;
for (LogType lt = 0; lt < LogType.Count; lt++)
{
SensusTestInfo[] myTinfos = SensusTestInfo.GetTestInfos(lt);
if (SensusTestInfo.AreCompatible(oraDbTestInfos, myTinfos))
{
completeTestInfos = myTinfos;
break;
}
}
foreach (var ti in oraDbTestInfos)
{
log.WarnFormat("VT_PRUEFPUNKT_SOLL_SD info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} PosFehlerKalt={3} QBezeichnung={4}",
id_WZTyp, rev_WZTyp, ti.PruefungsNr, ti.TestName, ti.QBezeichnung);
}
if (completeTestInfos != null)
{
foreach (var ti in completeTestInfos)
{
log.WarnFormat("Selected test info : ID_WZTyp={0} Rev_WZTyp={1} PruefungsNr={2} Str={3} QBezeichnung={4} Range={5} Test={6}",
id_WZTyp, rev_WZTyp, ti.PruefungsNr, ti.PruefungsNrStr, ti.QBezeichnung, ti.Range, ti.TestName);
}
completeTestInfos = ti;
id_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeId;
rev_WZTyp = b.WaterMeters[0].WaterMeterData.WMTypeRev;
}
else
{
@ -516,43 +743,38 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
}
}
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, " +
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, " +
"Druckentwaessern, SpuelDurchflussIst, ProgrammVersion)" +
" VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13, :14, :15, :16, :17)", conn);
parm = new OracleParameter("ANBID", OracleDbType.Int32); parm.Value = Anbid_StaraTura; cmd.Parameters.Add(parm); ///:1
parm = new OracleParameter("ID_Pruefstand", OracleDbType.Int32); parm.Value = 18000 + b.TestBenchId; cmd.Parameters.Add(parm); ///:2
parm = new OracleParameter("ID_WzPruefreihe", OracleDbType.Int32); parm.Value = b.BatchNr; cmd.Parameters.Add(parm); ///:3
parm = new OracleParameter("ID_WZTyp", OracleDbType.Int32); parm.Value = b.WaterMeters[0].WaterMeterData.WMTypeId; cmd.Parameters.Add(parm); ///:4
parm = new OracleParameter("Rev_WZTyp", OracleDbType.Int32); parm.Value = b.WaterMeters[0].WaterMeterData.WMTypeRev; cmd.Parameters.Add(parm); ///:5
parm = new OracleParameter("Rev_Pruefstand_WZTyp", OracleDbType.Int32); parm.Value = 1; cmd.Parameters.Add(parm); ///:6
parm = new OracleParameter("StartDatumZeit", OracleDbType.TimeStamp); parm.Value = b.StartTime; cmd.Parameters.Add(parm); ///:7
parm = new OracleParameter("EndDatumZeit", OracleDbType.TimeStamp); parm.Value = b.EndTime; cmd.Parameters.Add(parm); ///:8
parm = new OracleParameter("Betriebsart", OracleDbType.Varchar2); parm.Value = ""; cmd.Parameters.Add(parm); ///:9
parm = new OracleParameter("QVzKontakt", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:10
parm = new OracleParameter("FuellenBegDruck", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:11
parm = new OracleParameter("DruckEvakVorne", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:12
parm = new OracleParameter("DruckEvakHinten", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:13
parm = new OracleParameter("DruckBeiAbpressen", OracleDbType.Double); parm.Value = 0; /*TODO*/ cmd.Parameters.Add(parm); ///:14
parm = new OracleParameter("Druckentwaessern", OracleDbType.Double); parm.Value = 0; cmd.Parameters.Add(parm); ///:15
parm = new OracleParameter("SpuelDurchflussIst", OracleDbType.Double); parm.Value = 0; /*TODO*/ cmd.Parameters.Add(parm); ///:16
parm = new OracleParameter("ProgrammVersion", OracleDbType.Varchar2); parm.Value = "TBF v." + b.ProgramVersion; cmd.Parameters.Add(parm); ///:17
cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura });
cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = 18000 + b.TestBenchId });
cmd.Parameters.Add(new OracleParameter { ParameterName = "3", OracleDbType = OracleDbType.Int32, Value = b.BatchNr });
cmd.Parameters.Add(new OracleParameter { ParameterName = "4", OracleDbType = OracleDbType.Int32, Value = b.WaterMeters[0].WaterMeterData.WMTypeId });
cmd.Parameters.Add(new OracleParameter { ParameterName = "5", OracleDbType = OracleDbType.Int32, Value = b.WaterMeters[0].WaterMeterData.WMTypeRev });
cmd.Parameters.Add(new OracleParameter { ParameterName = "6", OracleDbType = OracleDbType.Int32, Value = 1 });
cmd.Parameters.Add(new OracleParameter { ParameterName = "7", OracleDbType = OracleDbType.TimeStamp, Value = b.StartTime });
cmd.Parameters.Add(new OracleParameter { ParameterName = "8", OracleDbType = OracleDbType.TimeStamp, Value = b.EndTime });
cmd.Parameters.Add(new OracleParameter { ParameterName = "9", OracleDbType = OracleDbType.Varchar2, Value = string.Empty });
cmd.Parameters.Add(new OracleParameter { ParameterName = "10", OracleDbType = OracleDbType.Double, Value = 0 });
cmd.Parameters.Add(new OracleParameter { ParameterName = "11", OracleDbType = OracleDbType.Double, Value = 0 });
cmd.Parameters.Add(new OracleParameter { ParameterName = "12", OracleDbType = OracleDbType.Double, Value = 0 });
cmd.Parameters.Add(new OracleParameter { ParameterName = "13", OracleDbType = OracleDbType.Double, Value = 0 });
cmd.Parameters.Add(new OracleParameter { ParameterName = "14", OracleDbType = OracleDbType.Double, Value = 0 }); /// TODO: DruckBeiAbpressen
cmd.Parameters.Add(new OracleParameter { ParameterName = "15", OracleDbType = OracleDbType.Double, Value = 0 });
cmd.Parameters.Add(new OracleParameter { ParameterName = "16", OracleDbType = OracleDbType.Double, Value = 0 }); /// TODO: SpuelDurchflussIst
cmd.Parameters.Add(new OracleParameter { ParameterName = "17", OracleDbType = OracleDbType.Varchar2, Value = string.Format("TBF v.{0}", b.ProgramVersion) });
cmd.ExecuteNonQuery(); /// Returns nr. of updated rows
foreach (var testInfo in completeTestInfos)
{
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;
OracleCommand cmd2 = new OracleCommand("INSERT INTO VT_PRUEFDURCHFLUSS_PD(" +
"ANBID, ID_Pruefstand, ID_WzPruefreihe, PruefungsNr, " +
@ -562,36 +784,29 @@ namespace TBF.BenchControl.Output.DB.SensusOracle
"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);
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
cmd.Parameters.Add(new OracleParameter { ParameterName = "1", OracleDbType = OracleDbType.Int32, Value = Anbid_StaraTura });
cmd.Parameters.Add(new OracleParameter { ParameterName = "2", OracleDbType = OracleDbType.Int32, Value = 18000 + b.TestBenchId });
cmd.Parameters.Add(new OracleParameter { ParameterName = "3", OracleDbType = OracleDbType.Int32, Value = b.BatchNr });
cmd.Parameters.Add(new OracleParameter { ParameterName = "4", OracleDbType = OracleDbType.Int32, Value = testInfo.PruefungsNr });
cmd.Parameters.Add(new OracleParameter { ParameterName = "5", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.l, tr.VolumeCTV) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "6", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd-tr.MassStart) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "7", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMin) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "8", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowMax) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "9", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, Q_ist) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "10", OracleDbType = OracleDbType.Double, Value = tr.ConstMaster });
cmd.Parameters.Add(new OracleParameter { ParameterName = "11", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.lph, tr.FlowVolume) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "12", OracleDbType = OracleDbType.Double, Value = tr.ErrorMaster });
cmd.Parameters.Add(new OracleParameter { ParameterName = "13", OracleDbType = OracleDbType.Double, Value = (double)tr.FlowSetTime });
cmd.Parameters.Add(new OracleParameter { ParameterName = "14", OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO
cmd.Parameters.Add(new OracleParameter { ParameterName = "15", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpStart) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "16", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownStart) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "17", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressUpEnd) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "18", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.bar, tr.PressDownEnd) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "19", OracleDbType = OracleDbType.Double, Value = tr.TestTime });
cmd.Parameters.Add(new OracleParameter { ParameterName = "20", OracleDbType = OracleDbType.Int32, Value = tr.PulsesMaster });
cmd.Parameters.Add(new OracleParameter { ParameterName = "21", OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO
cmd.Parameters.Add(new OracleParameter { ParameterName = "22", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassStart) });
cmd.Parameters.Add(new OracleParameter { ParameterName = "23", OracleDbType = OracleDbType.Double, Value = Units.ConvertTo(Unit.kg, tr.MassEnd) });
cmd2.ExecuteNonQuery(); /// Returns nr. of updated rows
}

View File

@ -13,6 +13,8 @@ namespace TBF.BenchControl.Output
Just_Q1Q2__Q3,
DEWA, /// Q1, Q2adj, Q2, Q3, Q4
Suez, /// two directions
Suez_Repeatability, /// Q3(1/3), Q3(2/3), Q3(3/3), Q2(1/3), Q2(2/3), Q2(3/3), Q1(1/3), Q1(2/3), Q1(3/3)
Suez_EMP, /// Q4 ... Q1 (12 flow rates)
Count
}
@ -141,6 +143,39 @@ namespace TBF.BenchControl.Output
new SensusTestInfo( 8, "08", "Q2", Range.R100_110, "Q2_rl"),
new SensusTestInfo(10, "10", "Q3", Range.R90_100, "Q3_rl"),
};
case LogType.Suez_Repeatability:
return new SensusTestInfo[]
{
new SensusTestInfo( 1, "01", "Q1 (3/3)", Range.R100_110, "Q1 (3/3)"),
new SensusTestInfo( 2, "02", "Q1 (2/3)", Range.R100_110, "Q1 (2/3)"),
new SensusTestInfo( 3, "03", "Q1 (1/3)", Range.R100_110, "Q1 (1/3)"),
new SensusTestInfo( 4, "04", "Q2 (3/3)", Range.R100_110, "Q2 (3/3)"),
new SensusTestInfo( 5, "05", "Q2 (2/3)", Range.R100_110, "Q2 (2/3)"),
new SensusTestInfo( 6, "06", "Q2 (1/3)", Range.R100_110, "Q2 (1/3)"),
new SensusTestInfo( 7, "07", "Q2 (3/3)", Range.R90_100, "Q2 (3/3)"),
new SensusTestInfo( 8, "08", "Q3 (2/3)", Range.R90_100, "Q3 (2/3)"),
new SensusTestInfo( 9, "09", "Q3 (1/3)", Range.R90_100, "Q3 (1/3)"),
};
case LogType.Suez_EMP:
return new SensusTestInfo[]
{
new SensusTestInfo( 1, "01", "Q1", Range.R100_110, "Q1"),
new SensusTestInfo( 2, "02", "Q2", Range.R100_110, "Q2"),
new SensusTestInfo( 3, "03", "Q0,09", Range.R100_110, "Q0,09"),
new SensusTestInfo( 4, "04", "Q0,16", Range.R100_110, "Q0,16"),
new SensusTestInfo( 5, "05", "Q0,35", Range.R100_110, "Q0,35"),
new SensusTestInfo( 6, "06", "Q0,65", Range.R100_110, "Q0,65"),
new SensusTestInfo( 7, "07", "Q1,35", Range.R100_110, "Q1,35"),
new SensusTestInfo( 8, "08", "Q2,5", Range.R100_110, "Q2,5"),
new SensusTestInfo( 9, "09", "Q5", Range.R100_110, "Q5"),
new SensusTestInfo(10, "10", "Q8", Range.R100_110, "Q8"),
new SensusTestInfo(11, "11", "Q3", Range.R90_100, "Q3"),
new SensusTestInfo(12, "12", "Q4", Range.R90_100, "Q4"),
};
}
}
}

View File

@ -91,7 +91,136 @@ namespace TBF.BenchControl.Sequences
simultWithEvacuationCfg = null;
simultWithEvacuationTests = new List<Config.Entities.Test>();
simultWithEvacuationParams = new List<Generic.ITestParams>();
}
checkUiOp = new CheckUIOp(true); /// Running in almost all states
}
/// <summary>
/// Unconditionally wait for OK button
/// </summary>
void WaitForOkButton()
{
State.Create("MainSeq : Press OK to start the system")
.AddOperation(new BenchControl.Operations.MessageBoxOp(Strings.Start_the_test_bench, System.Drawing.Color.OliveDrab))
.EnterState();
while (!StateMachine.WaitRunDevsRunOps().Contains(Event.OK)) { }
}
/// <summary>
/// Unconditionally set valves to default position
/// </summary>
void SetValvesToDefaultState()
{
State.Create("MainSeq : Setting valves to default positions")
.AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose))
.EnterState();
while (StateMachine.WaitRunDevsRunOps().Contains(Event.ValvesBusy)) { }
}
/// <summary>
/// Test communication with all scales that support S/N read operation
/// </summary>
/// <param name="scaleName">Name of a scale that failed</param>
/// <param name="message">Message in case of a failure</param>
/// <returns>true = Test passed, all scales communicate OK</returns>
bool TestCommunicationWithScales(out string scaleName, out string message)
{
///
/// Read S/N-s from scales (cannot be stopped, but is limitted to Scales count x 3s (=timeout)
///
IScaleOrTank[] tanks = new IScaleOrTank[] { StateMachine.Tank1, StateMachine.Tank2, StateMachine.Tank3 };
foreach (var tank in tanks)
{
if (tank is IScale)
{
IScale scale = tank as IScale;
string sn = string.Empty;
IOperation getSNOp = scale.GetSerNumOp(ref sn);
if (getSNOp != null)
{
const int nrRetries = 3;
for (int i = 1; i <= nrRetries; i++)
{
IList<Event> e;
bool error = false;
bool timeout = false;
State.Create(string.Format("MainSeq : Reading S/N of scale {0} trial {1}", scale.Name, i))
.AddOperation(getSNOp)
.AddOperation(new Operations.TimerOp(2))
.EnterState();
do
{
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error))
{
if (i == nrRetries)
{
///
/// All retries completed => the scale failed
///
scaleName = scale.Name;
message = Strings.Scale_communication_error;
return false;
}
else
{
/// The scale failed => try one more time
error = true;
break;
}
}
if (e.Contains(Event.Busy) && e.Contains(Event.TimerExpired))
{
if (i == nrRetries)
{
///
/// All retries completed, the scale failed
///
scaleName = scale.Name;
message = Strings.Scale_communication_timeout;
return false;
}
else
{
/// The scale failed => try one more time
timeout = true;
break;
}
}
}
while (e.Contains(Event.Busy));
if (!error && !timeout)
{
/// This scale communicates OK, break "for (int i = ... " loop
if (!string.IsNullOrEmpty(sn)) log.WarnFormat("Scale {0} : s/n = {1}", scale.Name, sn);
break; ///
}
/// Wait one state machine tick (1 second), kreep retrying, stay inside "for (int i = ... " loop
State.Create(string.Format("MainSeq : Reading S/N of scale {0}", scale.Name)).EnterState();
StateMachine.WaitRunDevsRunOps();
}
}
}
}
///
/// All scales communicate OK, test passed
///
scaleName = string.Empty;
message = string.Empty;
return true;
}
/// <summary>
@ -101,100 +230,21 @@ namespace TBF.BenchControl.Sequences
/// <returns></returns>
public IList<Event> Execute(Test dummyArg)
{
/// Operations running in more then one state
checkUiOp = new CheckUIOp(true);
IList<Event> e;
Selection selection;
string selectedTestName;
ISession sessn = Config.FluentCommon.CreateSession(Users.Entities.DBKind.Config);
StateMachine.LoadPathsAndTransitions(sessn); // TODO: Implement as an operation so that the worker thread is not blocked
string selectedTestName;
Bridge.OnActivity(this, Strings.Starting_system);
State.Create("MainSeq : Press OK to start the system")
.AddOperation(new BenchControl.Operations.MessageBoxOp(Strings.Start_the_test_bench, System.Drawing.Color.OliveDrab))
.EnterState();
while (!StateMachine.WaitRunDevsRunOps().Contains(Event.OK));
State.Create("MainSeq : Setting valves to default positions")
.AddOperation(StateMachine.ControlBoard.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose))
.EnterState();
while (StateMachine.WaitRunDevsRunOps().Contains(Event.ValvesBusy));
///
/// Read S/N-s from scales (cannot be stopped, but is limitted to Scales count x 3s (=timeout)
///
IScaleOrTank[] tanks = new IScaleOrTank[] { StateMachine.Tank1, StateMachine.Tank2, StateMachine.Tank3 };
foreach (var tank in tanks)
{
if (tank is IScale)
{
IScale scale = tank as IScale;
string sn = string.Empty;
IOperation getSNOp = scale.GetSerNumOp(ref sn);
if (getSNOp != null)
{
const int nrRetries = 3;
for (int i = 1; i <= nrRetries; i++)
{
bool error = false;
bool timeout = false;
State.Create(string.Format("MainSeq : Reading S/N of scale {0} trial {1}", scale.Name, i))
.AddOperation(getSNOp)
.AddOperation(new Operations.TimerOp(2))
.EnterState();
do
{
e = StateMachine.WaitRunDevsRunOps();
if (e.Contains(Event.Error))
{
if (i == nrRetries)
{
Bridge.OnError(this, string.Format("{0} : {1}", scale.Name, Strings.Scale_communication_error));
goto error;
}
else
{
error = true;
break;
}
}
if (e.Contains(Event.Busy) && e.Contains(Event.TimerExpired))
{
if (i == nrRetries)
{
Bridge.OnError(this, string.Format("{0} : {1}", scale.Name, Strings.Scale_communication_timeout));
goto error;
}
else
{
timeout = true;
break;
}
}
}
while (e.Contains(Event.Busy));
if (!error && !timeout)
{
/// Successful
if (!string.IsNullOrEmpty(sn)) log.WarnFormat("Scale {0} : s/n = {1}", scale.Name, sn);
break;
}
State.Create(string.Format("MainSeq : Reading S/N of scale {0}", scale.Name)).EnterState();
StateMachine.WaitRunDevsRunOps();
}
}
}
}
WaitForOkButton();
SetValvesToDefaultState();
string scaleName;
string message;
if (TestCommunicationWithScales(out scaleName, out message) == false)
{
Bridge.OnError(this, string.Format("{0} : {1}", scaleName, message));
goto error;
}
///
/// Enable stop draining buttons
@ -315,6 +365,7 @@ namespace TBF.BenchControl.Sequences
}
while (e.Contains(Event.Busy));
//--------------------------------------------------------------------------------------------
Bridge.OnActivity(this, Strings.Measuring_the_weight);
State.Create("MainSeq : Mesuring the weight for the 1st time")
@ -541,7 +592,7 @@ namespace TBF.BenchControl.Sequences
{
try
{
IOperation op = infoReader.ReadStartInfoOp(ProcessData.BatchRslts.Batch);
IOperation op = infoReader.ReadStartInfoOp(ProcessData.BatchRslts.WaterMeters);
if (op != null) readingStartInfo.AddOperation(op);
}
catch (Exception exc)

View File

@ -260,6 +260,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
public const string WriteCalibrationV4FactorsStr = "Write calibration_V4";
public const string NormalizeCalibrationFactorStr = "Normalize calibration factor";
public const string NormalizeCalibrationV4FactorsStr = "Normalize calibration_V4";
public const string ReadQ2CorrectionStr = "Read Q2 corrections";
public const string ResetQ2CorrectionStr = "Reset Q2 correction";
public const string WriteQ2CorrectionStr = "Write Q2 correction";
public const string WriteQ2CorrectionAltStr = "Write Q2 correction Alt";
@ -770,6 +771,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
else if (activity.ToLower().Contains(WriteQ2CorrectionGreeceStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, ref resultStr, Q2CorrType.Greece, activity.Substring(WriteQ2CorrectionGreeceStr.Length).Trim(), true);
else if (activity.ToLower().Contains(WriteQ2CorrectionRLStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, ref resultStr, Q2CorrType.RL, activity.Substring(WriteQ2CorrectionRLStr.Length).Trim(), true);
else if (activity.ToLower().Contains(WriteQ2CorrectionLRStr.ToLower())) error = WriteQ2Correction(threadID, ihead, wm, ref resultStr, Q2CorrType.LR, activity.Substring(WriteQ2CorrectionLRStr.Length).Trim(), true);
else if (activity.ToLower().Equals(ReadQ2CorrectionStr.ToLower())) error = ReadQ2Correction(threadID, ihead, wm, ref resultStr);
else if (activity.ToLower().Equals(Reset2HzCorrectionStr.ToLower())) error = Reset2HzCorrection(threadID, ihead, wm, ref resultStr);
else if (activity.ToLower().Equals(Write2HzCorrectionStr.ToLower())) error = Write2HzCorrection(threadID, ihead, wm, ref resultStr);
else
@ -1628,6 +1630,46 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
}
/// <summary>
/// Reset both Q2 correction factors in the memory to 0.
/// Read them back to verify factors were written correctly.
/// </summary>
/// <param name="ihead">Water meter object</param>
/// <param name="resultStr">String passed to caller</param>
/// <returns>true on success</returns>
static CommErr ReadQ2Correction(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
if (OpenPort(threadId, ihead) != 0) return CommErr.OpenPort; /// Open RFID port
CommErr error = CommErr.Read;
/// Write zero Q2 correction
byte[] rdData = null;
///
for (int j = 0; j < cfg.MaxCommRetries; j++)
{
if (0 == ReadRequestPort(threadId, ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, cfg.CommTimeout))
{
error = CommErr.None;
break;
}
}
if ((error == CommErr.None) && (rdData != null) && (rdData.Length == 2))
{
resultStr = "Q2 corrections successfully read";
ihead.Q2CorrLR = rdData[0];
ihead.Q2CorrRL = rdData[1];
}
ClosePort(threadId, ihead); /// Close RFID port
return error;
}
/// <summary>
/// Reset both Q2 correction factors in the memory to 0.
/// Read them back to verify factors were written correctly.

View File

@ -51,6 +51,7 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
retVal.Add(iPerlCommunicationForm.ReadCalibrationV4Str);
retVal.Add(iPerlCommunicationForm.NormalizeCalibrationFactorStr);
retVal.Add(iPerlCommunicationForm.NormalizeCalibrationV4FactorsStr);
retVal.Add(iPerlCommunicationForm.ReadQ2CorrectionStr);
retVal.Add(iPerlCommunicationForm.ResetQ2CorrectionStr);
retVal.Add(iPerlCommunicationForm.WriteCalibrationFactorStr);
retVal.Add(iPerlCommunicationForm.WriteCalibrationV4FactorsStr);

View File

@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("2.18.1122.0")]
[assembly: AssemblyFileVersion("2.18.1122.0")]
[assembly: AssemblyVersion("2.18.1125.0")]
[assembly: AssemblyFileVersion("2.18.1125.0")]