From ead350eef3fce468212b17df37734b0f053ef05b Mon Sep 17 00:00:00 2001 From: Marek Frniak Date: Thu, 19 Feb 2026 17:58:26 +0100 Subject: [PATCH] Add initial MassMeter implementation --- Common/Enums.cs | 10 +- Results/Entities/MeterTestRslt.cs | 41 +- Results/Entities/TestRslt.cs | 8 +- Results/Entities/WaterMeterData.cs | 7 +- Results/Mappings/MeterTestRsltMap.cs | 10 +- Results/Mappings/TestRsltMap.cs | 4 + ....GeneratedMSBuildEditorConfig.editorconfig | 5 +- .../obj/SharedComponents.csproj.nuget.g.props | 7 +- TBF/Properties/app.manifest | 2 +- TBF/Resources/Strings.Designer.cs | 28 + TBF/Resources/Strings.cs.resx | 1740 ++++++------ TBF/Resources/Strings.de.resx | 1472 +++++----- TBF/Resources/Strings.es.resx | 9 + TBF/Resources/Strings.fr.resx | 70 +- TBF/Resources/Strings.it.resx | 125 +- TBF/Resources/Strings.pl.resx | 1579 ++++++----- TBF/Resources/Strings.resx | 16 +- TBF/Resources/Strings.ro.resx | 1165 ++++---- TBF/Resources/Strings.ru.resx | 161 +- TBF/Resources/Strings.sk.resx | 65 +- TBF/Resources/Strings.zh-CN.resx | 1663 +++++------ .../DataEntry/StandardCamera/ProcParams.cs | 67 +- .../StandartCameraPurchaseOrder/ProcParams.cs | 67 +- TBF/Rig/DataEntry/Uni/ProcParams.cs | 67 +- TBF/Rig/Generic/IProcedureParams.cs | 2 +- TBF/Rig/GenericDevices/IRegReader.cs | 7 +- .../TempControl/Easytherm/ProcParams.cs | 33 +- .../Modbus/TempControl/Novus/ProcParams.cs | 67 +- TBF/Rig/Network/Camera/Roi/ProcedureParams.cs | 61 +- TBF/Rig/Network/Camera/Roi/Roi.cs | 9 +- .../RoiForFixedStart/ProcedureParams.cs | 63 +- .../Network/Camera/RoiForFixedStart/Roi.cs | 11 +- .../RoiForFixedStartCJMS11/ProcedureParams.cs | 63 +- .../Camera/RoiForFixedStartCJMS11/Roi.cs | 12 +- .../ProcedureParams.cs | 60 +- .../Camera/RoiForFixedStartKeyence/Roi.cs | 11 +- .../Output/DB/SensusOracle/ProcedureParams.cs | 51 +- TBF/Rig/ProcedureParamsBase.cs | 3 +- .../DataStream/Reader/ProcParams.cs | 31 +- .../DataStream/Reader/Reader.cs | 7 +- .../FrequencyRegisterReader.cs | 11 +- .../FrequencyMeterFromUniCB/RRProcParams.cs | 61 +- .../implementations/SmartReader.cs | 3 + .../KPackE/RegisterReader/ProcedureParams.cs | 61 +- .../KPackE/RegisterReader/RegisterReader.cs | 6 +- .../PoseidonProcParams.cs | 37 +- .../PoseidonCmdStartStop/PoseidonReader.cs | 8 +- .../PoseidonReader/ProcParams.cs | 49 +- .../PoseidonReader/SmartReader.cs | 6 +- .../implementations/PoseidonReader.cs | 6 +- .../RegisterReaders/PulsesFromUniCB/RRCfg.cs | 4 +- .../PulsesFromUniCB/RRCfgCtrl.cs | 4 +- .../PulsesFromUniCB/RRCfgCtrl.designer.cs | 170 +- .../PulsesFromUniCB/RRProcParams.cs | 114 +- .../PulsesFromUniCB/RegisterReader.cs | 37 +- .../RegisterReaders/S640Stream/S640Stream.cs | 6 +- .../SerialStream/ProcParams.cs | 59 +- .../SerialStream/SerialStream.cs | 7 +- .../StandingStartStop/RRProcParams.cs | 112 +- .../StandingStartStop/RegisterReader.cs | 11 +- .../implementations/SmartReader.cs | 3 + .../iPerlReaderUNI/ProcParams.cs | 49 +- .../FlyingStartMassCollectionSeq.cs | 111 +- .../S640Communication/ProcParams.cs | 67 +- .../StandingStartMassCollectionSeq.cs | 73 +- .../iPerlCommunication/iPerlHead/IperlHead.cs | 7 +- .../iPerlHead/ProcParams.cs | 60 +- TBF/Rig/WaterMeters/WaterMeter/ProcParams.cs | 67 +- TBF/TBF.csproj | 9 +- end | 2520 +++++++++++++++++ 70 files changed, 8013 insertions(+), 4604 deletions(-) create mode 100644 end diff --git a/Common/Enums.cs b/Common/Enums.cs index 39c1e968e..5c9916494 100644 --- a/Common/Enums.cs +++ b/Common/Enums.cs @@ -293,7 +293,15 @@ namespace Common SingleOrCompound, /// Only used when querying results } - public enum Medium + public enum PulsesTypeByQuantity : short + { + [Description("dm3")] Volume_dm3, + [Description("kg")] Mass_kg, + + Count + } + + public enum Medium { [Description("")] NotSpecified, #if LANG_PL diff --git a/Results/Entities/MeterTestRslt.cs b/Results/Entities/MeterTestRslt.cs index 92a463fbb..beb66d7c2 100644 --- a/Results/Entities/MeterTestRslt.cs +++ b/Results/Entities/MeterTestRslt.cs @@ -16,20 +16,26 @@ namespace Results.Entities public virtual double PulsesMeter { get; set; } /// # of water meter or heat meter pulses public virtual double PulsesMaster { get; set; } /// # of reference flowmeter pulses (gated by this water meter pulses) public virtual double PulsesPerLiter { get; set; } /// [l ^ -1], in case of heat meters (CompoundMeterId==5) pulses per kWh in [kWh ^ -1] + public virtual double PulsesPerKilogram { get; set; } /// [kg ^ -1] public virtual double VolumeStart { get; set; } /// Volume or energy (CompoundMeterId==5) on test start in [l] or [J] public virtual double VolumeEnd { get; set; } /// Volume or energy (CompoundMeterId==5) on test end in [l] or [J] - public virtual double VolumeMeter { get; set; } /// Measured volume or energy (CompoundMeterId==5) in [l] or [J] - public virtual double VolumeRef { get; set; } /// Reference volume or energy (CompoundMeterId==5) in [l] or [J] + public virtual double VolumeMeter { get; set; } /// Measured volume or energy (CompoundMeterId==5) in [l] or [J] + public virtual double MassMeter { get; set; } /// Measured mass or energy (CompoundMeterId==5) in [kg] or [J] + public virtual double VolumeRef { get; set; } /// Reference volume or energy (CompoundMeterId==5) in [l] or [J] + public virtual double MassRef { get; set; } /// Reference mass or energy (CompoundMeterId==5) in [kg] or [J] public virtual double TimestampStart { get; set; } /// [s] public virtual double TimestampEnd { get; set; } /// [s] public virtual double TestTime { get; set; } /// [s] /// Main result - public virtual double Error { get; set; } /// [%] + public virtual double Error { get; set; } /// [%] for volume register reader + public virtual double ErrorMass { get; set; } /// [%] for mass register reader public virtual long ErrorIndicators { get; set; } /// Not mapped to DB !!!, bit24=E25, bit25=E26, bit26=E27, bit27=E28 (error flags) public virtual long InfoIndicators { get; set; } /// Not mapped to DB !!!, bit24=E25, bit25=E26, bit26=E27, bit27=E28 (info flags) public virtual bool TestDone { get; set; } /// true = test was completed - public virtual bool Passed { get; set; } /// true = test passed, water meter is OK + public virtual bool Passed { get; set; } /// true = test passed, water meter is OK for Volume RegisterReader + public virtual bool PassedMass { get; set; } /// true = test passed, water meter is OK for Mass RegisterReader + public virtual string QuantityUnits { get; set; } /// dm3, kg, etc. - this value defined the quantity of meter, its decisive for distinction of pulse types #if IPERL public virtual int CalibFactor { get; set; } public virtual int CalibFactorLNA { get; set; } @@ -123,6 +129,33 @@ namespace Results.Entities return Passed ? yesNo[0] : ((yesNo.Length >= 2) ? yesNo[1] : Results.Resources.Strings.No); } } + public virtual string PassedMassColorStr(string yesNoFormatOrEmpty) + { + if (string.IsNullOrEmpty(yesNoFormatOrEmpty)) + { + return Utils.PassedColorStr(PassedMass, Evaluate()); + } + else + { + string[] yesNo = yesNoFormatOrEmpty.Split(new char[] { '~' }); + return PassedMass ? yesNo[0] : ((yesNo.Length >= 2) ? yesNo[1] : Results.Resources.Strings.No); + } + } + + public virtual string GetQuantityFromUnits() + { + + if (QuantityUnits == "kg") + { + return "Mass"; + } + else if (QuantityUnits == "dm3") + { + return "Volume"; + } + + return "Volume"; + } public MeterTestRslt() { diff --git a/Results/Entities/TestRslt.cs b/Results/Entities/TestRslt.cs index 158b9fe0c..4f3e5afe4 100644 --- a/Results/Entities/TestRslt.cs +++ b/Results/Entities/TestRslt.cs @@ -36,6 +36,8 @@ namespace Results.Entities public virtual double ConstMasterCorr { get; set; } /// [l/pls] Liters per pulse of the master flow meter corrected by a correction table. public virtual double ConstMaster { get; set; } /// [l/pls] Liters per pulse of the master flow meter calculated from a mass measurement. /// When mass measurement is not available, corrected by a correction table. + public virtual double MassConstMaster { get; set; } /// [kg/pls] kilograms per pulse of the master flow meter calculated from a mass measurement. + /// When mass measurement is not available, corrected by a correction table. public virtual double MassStartRaw { get; set; } /// [kg] public virtual double MassStart { get; set; } /// [kg] public virtual double MassEndRaw { get; set; } /// [kg] @@ -48,7 +50,11 @@ namespace Results.Entities public virtual double Flow { get; set; } /// [m3/h] calculated from conventional true value public virtual double VolumeCTV { get; set; } /// [l] Volume conventional true value public virtual double VolumeMaster { get; set; } /// [l] Volume from the master flow meter - public virtual double ErrorMaster { get; set; } /// [%] Error of the master flow meter + public virtual double ErrorMaster { get; set; } /// [%] Error of the master flow meter + public virtual double MassFlow { get; set; } /// [t/h] calculated from conventional true value + public virtual double MassCTV { get; set; } /// [kg] Volume conventional true value + public virtual double MassMaster { get; set; } /// [kg] Volume from the master flow meter + public virtual double MassErrorMaster { get; set; } /// [%] Error of the master flow meter public virtual float DiverterStart { get; set; } /// [s] Diverter switch time or a start/stop valve open time when the test starts public virtual float DivStart10 { get; set; } /// [s] Diverter switch time when test starts at level 10 (e.g. 10%) (not mapped to DB) diff --git a/Results/Entities/WaterMeterData.cs b/Results/Entities/WaterMeterData.cs index 170069e68..5eaf6e3a0 100644 --- a/Results/Entities/WaterMeterData.cs +++ b/Results/Entities/WaterMeterData.cs @@ -33,7 +33,8 @@ namespace Results.Entities public virtual string ApprovalInfo { get; set; } public virtual string Certificate { get; set; } public virtual double PulsesPerLtr { get; set; } - + public virtual double PulsesPerKilogram { get; set; } + /// Concerns compound water meters public virtual string ProducerAux { get; set; } public virtual double Q3_Qn_Aux { get; set; } /// [m3/h] @@ -85,6 +86,7 @@ namespace Results.Entities ApprovalInfo = oriWMData.ApprovalInfo; Certificate = oriWMData.Certificate; PulsesPerLtr = oriWMData.PulsesPerLtr; + PulsesPerKilogram = oriWMData.PulsesPerKilogram; ProducerAux = oriWMData.ProducerAux; Q3_Qn_Aux = oriWMData.Q3_Qn_Aux; MetrologicalClassAux = oriWMData.MetrologicalClassAux; @@ -129,6 +131,7 @@ namespace Results.Entities if (ApprovalInfo != wmd.ApprovalInfo) return false; if (Certificate != wmd.Certificate) return false; if (PulsesPerLtr != wmd.PulsesPerLtr) return false; + if (PulsesPerKilogram != wmd.PulsesPerKilogram) return false; if (ProducerAux != wmd.ProducerAux) return false; if (Q3_Qn_Aux != wmd.Q3_Qn_Aux) return false; if (MetrologicalClassAux != wmd.MetrologicalClassAux) return false; @@ -188,6 +191,7 @@ namespace Results.Entities writer.Write((ApprovalInfo != null) ? ApprovalInfo : string.Empty); writer.Write((Certificate != null) ? Certificate : string.Empty); writer.Write(PulsesPerLtr); + writer.Write(PulsesPerKilogram); writer.Write((ProducerAux != null) ? ProducerAux : string.Empty); writer.Write(Q3_Qn_Aux); writer.Write((MetrologicalClassAux != null) ? MetrologicalClassAux : string.Empty); @@ -227,6 +231,7 @@ namespace Results.Entities ApprovalInfo = reader.ReadString(); Certificate = reader.ReadString(); PulsesPerLtr = reader.ReadDouble(); + PulsesPerKilogram = reader.ReadDouble(); ProducerAux = reader.ReadString(); Q3_Qn_Aux = reader.ReadDouble(); MetrologicalClassAux = reader.ReadString(); diff --git a/Results/Mappings/MeterTestRsltMap.cs b/Results/Mappings/MeterTestRsltMap.cs index 1bb53fb5d..9789b4608 100644 --- a/Results/Mappings/MeterTestRsltMap.cs +++ b/Results/Mappings/MeterTestRsltMap.cs @@ -16,16 +16,22 @@ namespace Results.Mappings Map(x => x.PulsesMeter); Map(x => x.PulsesMaster); Map(x => x.PulsesPerLiter); - Map(x => x.VolumeStart); + Map(x => x.PulsesPerKilogram); + Map(x => x.VolumeStart); Map(x => x.VolumeEnd); Map(x => x.VolumeMeter); Map(x => x.VolumeRef); - Map(x => x.TimestampStart); + Map(x => x.MassMeter); + Map(x => x.MassRef); + Map(x => x.TimestampStart); Map(x => x.TimestampEnd); Map(x => x.TestTime); Map(x => x.Error); + Map(x => x.ErrorMass); Map(x => x.TestDone); Map(x => x.Passed); + Map(x => x.PassedMass); + Map(x => x.QuantityUnits); #if IPERL Map(x => x.ExtraDataPath); Map(x => x.X1); diff --git a/Results/Mappings/TestRsltMap.cs b/Results/Mappings/TestRsltMap.cs index 18ccb9b79..7713566a9 100644 --- a/Results/Mappings/TestRsltMap.cs +++ b/Results/Mappings/TestRsltMap.cs @@ -45,6 +45,10 @@ namespace Results.Mappings Map(x => x.VolumeCTV); Map(x => x.VolumeMaster); Map(x => x.ErrorMaster); + Map(x => x.MassFlow).Column("MassFlow"); + Map(x => x.MassCTV); + Map(x => x.MassMaster); + Map(x => x.MassErrorMaster); Map(x => x.DiverterStart); Map(x => x.DiverterEnd); Map(x => x.ErrorFlags); diff --git a/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig b/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig index a02128ff9..64e85c9ac 100644 --- a/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig +++ b/SharedComponents/obj/Debug/net472/SharedComponents.GeneratedMSBuildEditorConfig.editorconfig @@ -1,5 +1,8 @@ is_global = true build_property.RootNamespace = SharedComponents -build_property.ProjectDir = C:\Users\micha\git\tbf\SharedComponents\ +build_property.ProjectDir = C:\Sensus projects\LocalBranch_start_at_19.2.2026\tbf-exchange260123\tbf\SharedComponents\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = +build_property.EnableCodeStyleSeverity = diff --git a/SharedComponents/obj/SharedComponents.csproj.nuget.g.props b/SharedComponents/obj/SharedComponents.csproj.nuget.g.props index 568c2629e..d780aba7f 100644 --- a/SharedComponents/obj/SharedComponents.csproj.nuget.g.props +++ b/SharedComponents/obj/SharedComponents.csproj.nuget.g.props @@ -5,11 +5,12 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\micha\.nuget\packages\ + C:\Users\MFRNIAK\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference - 7.0.0 + 6.14.0 - + + \ No newline at end of file diff --git a/TBF/Properties/app.manifest b/TBF/Properties/app.manifest index 42ff09e5e..285640398 100644 --- a/TBF/Properties/app.manifest +++ b/TBF/Properties/app.manifest @@ -19,8 +19,8 @@ - + diff --git a/TBF/Resources/Strings.Designer.cs b/TBF/Resources/Strings.Designer.cs index 81ef6c1a2..8805c70ae 100644 --- a/TBF/Resources/Strings.Designer.cs +++ b/TBF/Resources/Strings.Designer.cs @@ -1,6 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -4415,6 +4416,15 @@ namespace TBF.Resources { } } + /// + /// Looks up a localized string similar to Pulses per kilogram. + /// + internal static string PulsesPerKilogram { + get { + return ResourceManager.GetString("PulsesPerKilogram", resourceCulture); + } + } + /// /// Looks up a localized string similar to Pulses per kWh. /// @@ -4433,6 +4443,15 @@ namespace TBF.Resources { } } + /// + /// Looks up a localized string similar to Pulses per unit. + /// + internal static string PulsesPerUnit { + get { + return ResourceManager.GetString("PulsesPerUnit", resourceCulture); + } + } + /// /// Looks up a localized string similar to Pump. /// @@ -6686,6 +6705,15 @@ namespace TBF.Resources { } } + /// + /// Looks up a localized string similar to Units. + /// + internal static string Units { + get { + return ResourceManager.GetString("Units", resourceCulture); + } + } + /// /// Looks up a localized string similar to Unlock. /// diff --git a/TBF/Resources/Strings.cs.resx b/TBF/Resources/Strings.cs.resx index f7c77c8ea..cf271f0ad 100644 --- a/TBF/Resources/Strings.cs.resx +++ b/TBF/Resources/Strings.cs.resx @@ -117,432 +117,117 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <nic> - - - (offline) - - - O Test Bench Framework - - - Činnost - - - Přidat > - - - Přidat - - - Adresa - - - Nastavení probíhá - - - Správce - - - Okolní vlhkost - - - Okolní tlak - - - Okolní teplota - - - Nastala neošetřená chyba - - - Schválení - - - Datum schválení - - - Schválení ID - - - Schválení info. - - - Schválil - - - Uspořádání testovaných měřidel - - - Uspořádání testu - - - Uspořádání testů - - - Výstup: - - - Výstupní vodoměr - - - Výst. WM State - - - Výst. WM Seriové č. - - - Dostupné komponenty: - - - Dostupné výsledky - - - <Zpět - - - Váha - - - Stanice - - - Testovací stanice neběží, ale můžete změnit nastavení k vyřešení problému. - - - Konflikt názvu stanice, použijte jiný název, prosím - - - Parametry stanice - - - Datum sestavení {0} - - - Specialista pro kalibraci - - - Chyba kamery - - - Zrušit - - - Vymazat výsledky - - - Zmazat - - - zavřít - - - Zavřít vyprazdňovací ventil - - - Zavřít - - - Uzavření vstupního ventilu, vypnutí čerpadla - - - Studený - - - Kombinovaná měřidla - - - Kombinovaný - - - Komunikace - - - Komponent - - - Konfigurace - - - Konfigurovat - - - Konfigurace testovací stanice (vyžadováno heslo) - Potvrzení - - Připojovací řetězec - - - Kopie - - - Copyright © 2013 - {0} - - - Opraveno - - - Vytvořit DB - - - Data - - - Nastavení databáze - - - Typ databáze - - - Datum a čas - - - Databáze byla úspěšně vytvořena! - - - Databáze bude přepsána - - - Hustota - - - Popis - - - Detekce dokončena - - - Detekce se nezdařila - - - Práh detekce [%] - - - Zařízení - - - dflt - - - Klapka - - - Chcete pokračovat? - Chcete uložit tento postup? - - Dolů - - - Doba průtoku [s] - - - Doba PMax [s] - - - Doba [s] - - - Editace - - - Nouzové zastavení - - - Vyprázdnění - - - Vypouštění ({0}: Krok {1} / {2}) - - - Vyprázdnění nádrže - - - Vyprazdňovací ventil - - - Konec - - - Koncová podmínka - - - Konečný stav - - - Zadejte heslo - - - Err. cor. - [%] - - - Err. cor. +[%] - - - Err. Limit - [%] - - - Err. Limit + [%] - Chyba Chyba při načítání uživatelů z databáze: - - Chyba [%] - - - Chyba při vytváření databáze. Důvod: - - - Vyhodnocení - - - Ukončit - - - NOK - Nepodařilo se vytvořit ukázkové databáze: Nepodařilo se exportovat databáze: - - Plnění - - - Naplnit zkušební stolici s vodou? - - - Dokončit - - - Výběr průtoku - - - Průtokoměr - - - Získat hmotnost vody v nádrži - - - Vedoucí laboratoře - - - Horizontálně - - - horký - - - Změny budou ztraceny. Chcete pokračovat? - - - Ignorovat - - - Ignorovat - - - Neplatné heslo - Neplatné uživatelské jméno, heslo, nebo stolice - - iPERL Komunikace probíhá + + Heslo - - Jazyk + + Prosím, vyberte zkušební stolici - - Méně + + Musíte restartovat, aby tyto změny proběhly - - Načítání postupu + + Zkušební stolice - - Zámek + + Uživatelské jméno - - Protokolování + + Varování - - Hlavní: + + Toto uživatelské jméno již bylo použito. Prosím, vyberte jiné. - - Hlavní Vodoměr + + zavřít - - Hlavní WM stav + + Klapka - - Hlavní WM seriové č. - - - Specialista na údržbu - - - Vyprázdnit nádrž - - - Hmotnost - - - Změřte hmotnost - - - Změřeno - - - Měření hmotnosti - - - Zpráva - - - Zkušební metoda - - - Zkušební metoda výběru - - - Metrologická třída - - - Metrolog - - - Metrologie - - - Mode - - - Více + + Vyprazdňovací ventil Jméno + + otevřít + + + Čerpadlo + + + P up + + + P down + + + Q od + + + Q do + + + Etalon + + + Reg. ventil + + + Váha + + + Sensor + + + T div + + + T in + + + T out + + + Tlakoměr + + + Doba [s] + + + ne + + + ano + PBench PFeed - - - Kopie - PQ @@ -555,80 +240,218 @@ Test - - Nový přechodný název - - - Nová karta - - - Další> - - - ne - - - Žádná zkušební stolice v konfiguraci programu. - - - Ne - - - Nelze se připojit k databázi. - - - <není potřeba nic nastavovat> - - - Oznámení + + - Kopie Nr. - - Počet měřidel ve skupině + + Přidat + + + Zrušit + + + Zavřít + + + Zámek + + + Odstranit + + + Odemknout OK - - otevřít + + Uživatelské jméno + + + Uživatelský login + + + Kopie + + + Dolů + + + Editace + + + Nahoru + + + Nelze se připojit k databázi. + + + Konfigurace testovací stanice (vyžadováno heslo) + + + Ukončit + + + Opakovat připojení k databázi + + + Zadejte heslo + + + Neplatné heslo + + + Konflikt názvu stanice, použijte jiný název, prosím + + + Databáze byla úspěšně vytvořena! + + + Databáze bude přepsána + + + Chcete pokračovat? + + + Oznámení + + + Žádná zkušební stolice v konfiguraci programu. + + + Popis + + + Postupy + + + Postup + + + Test + + + Opraveno + + + Změřeno + + + Test + + + Testovací stanice neběží, ale můžete změnit nastavení k vyřešení problému. + + + Vyprázdnění + + + Q-Set Metoda + + + Počet opakování + + + Test + + + Nulování + + + Stanice + + + Err. cor. - [%] + + + Err. cor. +[%] + + + Err. Limit - [%] + + + Err. Limit + [%] + + + Plnění Výstup - - P up + + Režim reakce - - P down + + Sensory - - str. + + Tol. červený. [%] - - Parametry + + Zkušební doba - - Mateřský komponent + + Chyba při vytváření databáze. Důvod: - - Část - - - OK - - - Heslo - - - PID + + Metrologie Prosím, změňte následující nastavení: - - Prosím, vyberte cyklus, test nebo vypouštění + + Vlastnosti + + + Neošetřená chyba v + + + Uživatel + + + (offline) + + + Správce + + + Specialista pro kalibraci + + + Vedoucí laboratoře + + + Specialista na údržbu + + + Metrolog + + + Tester + + + Testovací technik + + + Zavřít vyprazdňovací ventil + + + Získat hmotnost vody v nádrži + + + Ignorovat + + + Načítání postupu + + + Vyprázdnit nádrž + + + Změřte hmotnost Prosím zvolte postup @@ -636,230 +459,26 @@ Prosím zvolte test - - Prosím, vyberte zkušební stolici - - - Výkon [%] - - - Tlak max. [bar] - - - Tlak min. [bar] - - - Tlakoměr - - - Výběr tlaku - - - Tiskárna - - - Tiskárna - - - Postup - - - Postupy - - - Výrobce - - - Jméno výrobku - - - Restart programu vyžaduje použít některá nastavení - - - V činnosti - - - Vlastnosti - - - Protokol - - - Publikovat - - - Impulsy na litr - - - Čerpadlo - - - Výkon čerpadla [%] - - - Naplnit zkušební stolici s vodou? - Vyplachování - - Napouštění ({0}: Krok {1} / {2}) - - - Objednávka - - - Q od - - - Q-Set Metoda - - - Q do - - - Qfall - - - Qmin - - - Qn - - - Qrise - - - Qt - - - Otázka - - - Rychlost změny [%] - Ready - - Režim reakce - - - Etalon - - - Reg. ventil - - - Relativní Q z - - - Relativní Q do - - - zbývající čas - - - < Odebrat - - - << Odebrat vše - - - Odstranit - - - Odstranit Tab - - - Přejmenovat Tab - - - Počet opakování - - - Musíte restartovat, aby tyto změny proběhly - - - Opakovat - - - Opakovat připojení k databázi - - - Rozeznávání ROI probíhá - - - Screen - - - s - - - Výběr komponent - - - Vybrané výsledky - - - Sensor - - - Sensory - - - Sensory - - - Sériové číslo - Nastavte průtok Nastavte cestu - - Nastavení průtoku - - - Nastavení tlaku vody - - - Zobrazit konec cyklu - - - Současně s dalším krokem - - - Současně s předchozím krokem - - - Jednoduchý - - - Start - Zapněte čerpadlo Spustit test - - Spuštění systému - - - Spuštění kamery - - - Spuštění čerpadla - - - Zapnout ventil - - - Stav + + Zastavení Zastavte čerpadlo @@ -867,47 +486,188 @@ Zastavit test - - Zastavení + + Dehtování - - Zastavení průtoku před zkouškou s pevným startem + + Probíhá test - - Potlačit vibrace vodoměru + + <Zpět - - Detekce přepínacího průtoku + + Dokončit - - Přepínací body + + Další> - - T div + + Výběr průtoku - - T in + + Jméno testu - - T out + + Zkušební metoda + + + Relativní Q z + + + Relativní Q do Cílový {0} - - Dehtování + + Kombinovaná měřidla - - Test + + Práh detekce [%] - - Zkušební stolice + + Rychlost změny [%] - - Konfigurace komponentů zkušební stolice + + Impulsy na litr - - Údaje testovací stolice + + Komponent + + + <nic> + + + Zkušební metoda výběru + + + Sensory + + + Zkušební metoda + + + Objem a výběr mezní chyby + + + Vymazat výsledky + + + Konfigurovat + + + Uspořádání testovaných měřidel + + + Uspořádání testů + + + Horizontálně + + + Testy jsou sloupce + + + Testy jsou řádky + + + Vertikálně + + + Konfigurace + + + NOK + + + OK + + + Zmazat + + + Vyprázdnění nádrže + + + Měření hmotnosti + + + Nastavení průtoku + + + Test dokončen + + + příprava zkoušek + + + Napouštění ({0}: Krok {1} / {2}) + + + Vypouštění ({0}: Krok {1} / {2}) + + + Detekce přepínacího průtoku + + + Činnost + + + V činnosti + + + Prosím, vyberte cyklus, test nebo vypouštění + + + Schválení info. + + + Metrologická třída + + + Výrobce + + + Qn + + + Vodoměry + + + Tiskárna + + + Verze + + + Číslo zkušebního stolice + + + <není potřeba nic nastavovat> + + + Naplnit zkušební stolici s vodou? + + + Ne + + + Otázka + + + Ano + + + Parametry stanice + + + Připojovací řetězec + + + Vytvořit DB + + + Typ databáze Specifikace databáze zkušební stolice @@ -918,38 +678,71 @@ Název testu stolice - - Číslo zkušebního stolice - - - Testovací stolice: - - - Test dokončen - Zkušební připojení - - Test + + Uživatelé a skupiny - - Probíhá test + + Údaje vodoměru - - Test + + Typy vodoměrů - - Zkušební metoda + + Protokolování - - Zkušební metoda 2 + + Mode - - Jméno testu + + Parametry - - příprava zkoušek + + Mateřský komponent + + + Typ + + + Konfigurace komponentů zkušební stolice + + + Přechody + + + Nová karta + + + Odstranit Tab + + + Přejmenovat Tab + + + Nový přechodný název + + + Výkon [%] + + + Rozeznávání ROI probíhá + + + Detekce dokončena + + + Nouzové zastavení + + + Konec - přechod + + + Start - přechod + + + Spuštění kamery Zkušební start ({0}: Krok {1} / {2}) @@ -957,126 +750,336 @@ Zkouška zastavení ({0}: Krok {1} / {2}) - - Zkušební doba + + Přidat > - - Tester + + Dostupné výsledky - - Testovací technik + + < Odebrat - - Testy jsou sloupce + + << Odebrat vše - - Testy jsou řádky + + Vybrané výsledky - - T stop - hmotnost msrmt. [s] + + Potlačit vibrace vodoměru - - T průtok stab. - Start [s] + + Naplnit zkušební stolici s vodou? - - Čas vypršel + + Zpráva - - Tol. červený. [%] + + Zapnout ventil - - Konec - přechod + + dflt - - Přechody - - - Start - přechod - - - Typ - - - Neošetřená chyba v - - - Odemknout - - - Nahoru - - - Uživatel - - - Uživatelský login - - - Uživatelské jméno - - - Uživatelské jméno - - - Toto uživatelské jméno již bylo použito. Prosím, vyberte jiné. - - - Uživatelé a skupiny - - - Verze - - - Verze {0} - - - Vertikálně - - - Objem a výběr mezní chyby - - - Varování - - - Voda + + Zastavení průtoku před zkouškou s pevným startem Vodoměr - - Údaje vodoměru - Sériová čísla vodoměru a stavy Stav vodoměrů - - Typy vodoměrů - - - Vodoměry - S/N Stav [litr] - - ano + + Detekce se nezdařila - - Ano + + Chyba kamery - - Nulování + + Spuštění systému + + + zbývající čas + + + s + + + T stop - hmotnost msrmt. [s] + + + Méně + + + Více + + + Restart programu vyžaduje použít některá nastavení + + + Změny budou ztraceny. Chcete pokračovat? + + + PID + + + Průtokoměr + + + Část + + + Čas vypršel + + + Kombinovaný + + + Zařízení + + + Tiskárna + + + Screen + + + Jednoduchý + + + Výstupní vodoměr + + + Výst. WM State + + + Data + + + Konečný stav + + + Hlavní Vodoměr + + + Hlavní WM stav + + + Protokol + + + Qfall + + + Qrise + + + Sériové číslo + + + Stav + + + Přepínací body + + + Výst. WM Seriové č. + + + Hlavní WM seriové č. + + + Výkon čerpadla [%] + + + Nastavení probíhá + + + Chyba [%] + + + Spuštění čerpadla + + + Nastavení tlaku vody + + + Tlak max. [bar] + + + Tlak min. [bar] + + + Výběr tlaku + + + Doba průtoku [s] + + + Doba PMax [s] + + + Uzavření vstupního ventilu, vypnutí čerpadla + + + Objednávka + + + Projtové číslo + + + Okolní vlhkost + + + Okolní tlak + + + Okolní teplota + + + Schválení + + + Datum a čas + + + str. + + + T průtok stab. - Start [s] + + + Konec + + + Start + + + Hustota + + + Počet měřidel ve skupině + + + Zobrazit konec cyklu + + + Koncová podmínka + + + Komunikace + + + Výstup: + + + Hlavní: + + + Qmin + + + Qt + + + Voda + + + Jméno výrobku + + + Adresa + + + Datum schválení + + + Schválení ID + + + Schválil + + + Vyhodnocení + + + Publikovat + + + Současně s dalším krokem + + + Současně s předchozím krokem + + + iPERL Komunikace probíhá + + + Jazyk + + + Údaje testovací stolice + + + Dostupné komponenty: + + + Výběr komponent + + + Nastavení databáze + + + Testovací stolice: + + + O Test Bench Framework + + + Datum sestavení {0} + + + Copyright © 2013 - {0} + + + Verze {0} + + + Nastala neošetřená chyba + + + Ignorovat + + + Opakovat + + + Výsledky + + + Predešlé výsledky + + + Cesty Pokračovat v cyklu po tomto testu? + + Certifikát + + + Montáž + Kalibrace @@ -1086,6 +1089,21 @@ Platná do + + Hmotnost + + + Měřič + + + Impulsy + + + Impulsy etalonu + + + Cílový objem + Uzavírání programu @@ -1107,6 +1125,9 @@ Test Bench Framework program se zavírá + + Vytisknout + Tisknout pouze dobré výsledky @@ -1119,21 +1140,18 @@ Uložit znovu - - Predešlé výsledky - Odeslané Zadejte údaje o protokolu - - Ukládání a tisk výsledků - Zadejte údaje o vodoměrech + + Ukládání a tisk výsledků + Chcete odstranit tento postup? @@ -1164,9 +1182,6 @@ Poslední změna - - Testované typy měřičů - Poznámky @@ -1191,9 +1206,6 @@ Ukládání výsledků - - Stručný popis - Další instance programu Test Bench Framework je spuštěna. Uzavřete jí prosím s použitím 'Správce úloh'. @@ -1203,14 +1215,11 @@ Hlavička - - Montáž - Objem - - Vytisknout + + Zobrazit Chcete uložit změny? @@ -1227,23 +1236,23 @@ Zopakovat - - Znovu otevřít + + Vypustit - - Zobrazit + + Relace Číslo dávky - - Při teplotě + + Uložit Korekce hustoty - - Uložit + + Při teplotě Aktivujte / deaktivujte hlavice @@ -1275,6 +1284,9 @@ Poznámka + + Zobrazit poznámku + Spustit stanici @@ -1284,9 +1296,6 @@ Obnovit - - současný - Průtok @@ -1296,6 +1305,9 @@ Po dokončení stiskněte tlačítko OK. + + Počet impulsů je OK + Min. výška @@ -1332,27 +1344,18 @@ Chyba při ukládání parametrů {0} - - Zobrazit poznámku - Následující Předešlé - + opakování - - Měřič - Výsledek - - Výsledky - Ztlumit sirénu @@ -1383,18 +1386,9 @@ Nesprávny smer počítania iPerlu - - Impulsy - Počet impulsů - - Počet impulsů je OK - - - Impulsy etalonu - Počet imp. etalonu @@ -1425,6 +1419,12 @@ Chcete zálohovat výsledky? + + Chcete obnovit konfigurační databázi ze souboru {0} ? + + + Chcete obnovit výsledkovou databázi ze souboru {0} ? + Ukládám všechny výsledky @@ -1452,12 +1452,6 @@ Vzdálená databáze nemůže být naimportována - - Chcete obnovit konfigurační databázi ze souboru {0} ? - - - Chcete obnovit výsledkovou databázi ze souboru {0} ? - Databáze která se právě používá byla naimportována. @@ -1488,21 +1482,9 @@ Vyprázdnění před - - Testovací profily - - - Profil - Zrušit relaci - - Vypustit - - - Vypustit zásobník - Uložit a ukončit @@ -1512,18 +1494,24 @@ Trať - - Relace - Spustit postup - - Skutečně chcete pokračovat v nedokončeném cyklu? + + Testovací profily + + + Profil + + + Vypustit zásobník Obnovit nedokončený cyklus + + Skutečně chcete pokračovat v nedokončeném cyklu? + Číslo dávky nesedí @@ -1626,9 +1614,6 @@ Celý den - - Certifikát - Připojení k databázi pro seldování výroby zlyhalo @@ -1704,9 +1689,6 @@ Jednotky - - Cílový objem - Konečná hmotnost @@ -1722,6 +1704,9 @@ předvolená tiskárna + + Tisknout + zjistit @@ -1737,25 +1722,46 @@ PDF soubory - - Cesty - O - - Tisknout - Proud Napětí - - Projtové číslo - Zobraz Okno + + Uspořádání testu + + + Studený + + + horký + + + Zkušební metoda 2 + + + Testované typy měřičů + + + Stručný popis + + + Znovu otevřít + + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.de.resx b/TBF/Resources/Strings.de.resx index e3c8ed208..1af7a2954 100644 --- a/TBF/Resources/Strings.de.resx +++ b/TBF/Resources/Strings.de.resx @@ -117,6 +117,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Bestätigung + + + Möchten Sie die Prüfvorlage speichern? + Fehler @@ -150,6 +156,12 @@ Warnung + + (max._X_ alphanumerische Zeichen) + + + Benutzername bereits vorhanden. Bitte einen anderen Benutzername wählen. + geschlossen @@ -234,11 +246,8 @@ - Kopie - - Benutzername - - - Anmelden + + Nr. Neu @@ -246,6 +255,30 @@ Abbrechen + + Beenden + + + Abschließen + + + Löschen + + + Ändern + + + OK + + + Ungültiger Benutzername oder Passwort + + + Benutzername + + + Anmelden + Kopieren @@ -255,39 +288,87 @@ Bearbeiten - - OK - - - Löschen - Aufwärts - + + Datenbankverbindung konnte nicht hergestellt werden. + + + Prüfstand konfigurieren (Passwort erforderlich) + + Beenden - - Ändern + + Datenbankverbindung wiederherstellen + + + Passwort eingeben. + + + Ungültiges Passwort + + + Der Prüfstandsname ist ungültig. Bitte wählen Sie einen anderen Namen. + + + Die Datenbank wurde erfolgreich erstellt. + + + Die vorhandene Datenbank wird überschrieben. + + + Möchten Sie fortfahren? + + + Benachrichtigung + + + Es ist kein Prüfstand in der Programmkonfiguration definiert. Beschreibung - - Prüfvorlage - Prüfvorlagen + + Prüfvorlage + Prüfpunkt - - Prüfstand + + Korrigiert + + + Gemessen + + + Korrigierte Prüfung + + + Der Prüfstand ist nicht in Betrieb. Sie können die Einstellungen ändern, um das Problem zu lösen. Entleeren + + Q-Set Methode + + + Wiederh. Nr. + + + Prüfpunkt + + + Nullstellen + + + Prüfstand + Fehl. Korr.- [%] @@ -303,107 +384,26 @@ Wasserzulauf - - Prüfverfahren - Regelstrecke - - Q von [l/h] - - - Q-Set Methode - - - Q bis [l/h] - Reduktionsart - - Wiederh. Nr. - Abtastsysteme - - Prüfpunkt - Tol. Abzug [%] - - Nullstellen - Dauer - - Metr.Daten - - - Benutzer - - - Der Prüfstand ist nicht in Betrieb. Sie können die Einstellungen ändern, um das Problem zu lösen. - - - Der Prüfstandsname ist ungültig. Bitte wählen Sie einen anderen Namen. - - - Prüfstand konfigurieren (Passwort erforderlich) - - - Bestätigung - - - Korrigiert - - - Die Datenbank wurde erfolgreich erstellt. - - - Die vorhandene Datenbank wird überschrieben. - - - Möchten Sie fortfahren? - - - Möchten Sie die Prüfvorlage speichern? - - - Passwort eingeben. - Fehler beim Erzeugen der Datenbank. - - Beenden - - - Ungültiges Passwort - - - Abschließen - - - Masse - - - Gemessen - - - Es ist kein Prüfstand in der Programmkonfiguration definiert. - - - Datenbankverbindung konnte nicht hergestellt werden. - - - Benachrichtigung - - - Nr. + + Metr.Daten Bitte ändern Sie die folgenden Einstellungen: @@ -411,12 +411,12 @@ Eigenschaften - - Datenbankverbindung wiederherstellen - Es trat ein unbehandelter Fehler auf in + + Benutzer + (Getrennt) @@ -498,24 +498,60 @@ Prüfung läuft - - Prüfvorlage - < Zurück + + Beenden + Weiter > + + Einstellung Durchfluss + + + Prüfvorlage + + + Prüfverfahren + + + Relativer Q von + + + Relativer Q bis + + + Verbundwasserzähler + + + Schwellwert [%] + + + Durchflussänderung [%] + + + Impulse pro Liter + + + Komponente + <kein> + + Auswahl Prüfart + Abtastung Prüfart + + Auswahl Volumen und Fehlergrenzen + Ergebnisse löschen @@ -573,9 +609,6 @@ Enwässern ({0}: Schritt {1}/{2}) - - Beenden - Umschaltpunkt suchen @@ -588,9 +621,6 @@ Ende - - Ziel Q [m3/h] - Zulassungszeichen @@ -600,6 +630,9 @@ Hersteller + + Qn [m3/h] + Zählerdaten @@ -639,6 +672,9 @@ Datenbank Typ + + Grunddaten Spezifikation + Prüfstand wird von diesem Computer gesteuert @@ -678,23 +714,29 @@ Übergänge - - Komponente + + Neue Tabelle - - Schwellwert [%] + + Tabelle entfernen - - Impulse pro Liter + + Tabelle umbenennen - - Durchflussänderung [%] + + Neue Bezeichnung - - Relativer Q von + + Leistung [%] - - Relativer Q bis + + ROI-Erkennung läuft + + + Erkennung erfolgt + + + Not-Aus Ubergang - Ende @@ -702,14 +744,29 @@ Ubergang - Start - - Einstellung Durchfluss + + Kamera Start - - Auswahl Prüfart + + Prüfung Start ({0}: Schritt {1}/{2}) - - Auswahl Volumen und Fehlergrenzen + + Ürüfung Stop ({0}: Schritt {1}/{2}) + + + Hinzufügen + + + Ergebnisse + + + Entfernen + + + Alles entfernen + + + Ergebnisse ausgewählt Filter Fehlimpulse WZ! @@ -723,6 +780,33 @@ Startventil + + Vorgabe + + + Durchfluss Anhalten + + + Wasserzähler + + + WZ-Serienummer-Stand + + + WZ-Stand + + + Seriennummer + + + WZ_Stand + + + Erkennung fehlgeschlagen + + + Kamerafehler + Prüfung start @@ -741,21 +825,57 @@ Mehr + + Neustart erforderlich + + + Ergebnisse gehen verloren! Wollen sie fortfahren? + + + PID-Regler + Durchflussmesser Teil + + Zeit abgelaufen + + + Verbund + + + Gerät + + + Drucker + + + Bildschirm + + + Einzel + Nebenzähler + + Nebenzähler-Stand + + + Daten + Endstand Hauptzähler + + Hauptzählerstand + Protokoll @@ -765,7 +885,7 @@ Qsteig - + Seriennummer @@ -774,143 +894,137 @@ Umschaltpunkte - - Daten - - - Nebenzähler-Stand - - - Hauptzählerstand - Nebenzähler Seriennummer Hauptzähler Seriennummer - - Hinzufügen + + Pumpe Leistung [%] Justierung läuft ... - - Ergebnisse - - - Kamerafehler - - - Ergebnisse gehen verloren! Wollen sie fortfahren? - - - Verbund - - - Verbundwasserzähler - - - Erkennung erfolgt - - - Erkennung fehlgeschlagen - - - Gerät - - - Vorgabe - - - Not-Aus - Fehler [%] - - Neue Tabelle + + Pumpe starten - - Neue Bezeichnung + + Abpressdruck einstellen - - PID-Regler + + Druck bis [bar] - - Leistung [%] + + Druck von [bar] - - Drucker + + Einstellung Druck - - Neustart erforderlich + + Leckage Dauer - - Pumpe Leistung [%] + + Pmax Dauer - - Entfernen + + Schließen Ventil Zulauf und Pumpe Aus - - Tabelle entfernen + + Bestellung - - Alles entfernen + + Projektnummer - - ROI-Erkennung läuft + + Luftfeuchtigkeit - - Bildschirm + + Umgebungsdruck - - Ergebnisse ausgewählt + + Umgebungstemperatur - - Einzel + + Zulassung - - Kamera Start + + Datum und Uhrzeit - - Durchfluss Anhalten + + Seite - - Grunddaten Spezifikation + + Zeit Durchfl. IO-Start [s] - - Korrigierte Prüfung + + Ende - - Prüfung Start ({0}: Schritt {1}/{2}) + + Start - - Ürüfung Stop ({0}: Schritt {1}/{2}) + + Dichte - - Zeit abgelaufen + + Anzahl Zähler in der Gruppe - - WZ-Serienummer-Stand + + Anzeigen Ende Zyklus - - Seriennummer + + Bedingung für das Ende - - WZ_Stand + + Kommunikation - - Druck Eingang Ende + + Nebenzähler - - Druck Eingang Start + + Hauptzähler - - Druck Ausgang Ende + + Qmin [m3/h] - - Druck Ausgang Start + + Qt [m3/h] + + + Wasser + + + Produktname + + + Adresse + + + Zulassung Datum + + + Zulassung Nr.: + + + Zugelassen von: + + + Bewerten + + + Veröffentlichen + + + Parallel mit Folgeschritt + + + Prallel mit vorherigem Schritt + + + iPerl Kommunikation läuft Sprache @@ -942,18 +1056,42 @@ Version {0} + + Benutzereigenschaften ändern + + + Gruppen + + + Benutzer + Ein Ausnahmefehler ist aufgetreten! + + Ignorieren + + + Wiederholen + Prüfvorlage {0} hinzugefügt. Prüfvorlage {0} geändert. + + Revision?? + + + Ergebnisse + Unsicherheit [%] + + Vorherige Ergebnisse + Prüftisch @@ -969,30 +1107,78 @@ Pfade + + ID Nummer + + + Greifen + + + Live + Kamera + + Behälter Schließen + + + Waagebehälter Volumen prüfen + + + Zeit zur Durchflusseinst. [s] + + + Zeit Pumpe-Startventil [s] + + + Stop Rückflussventil + + + Mit dem nächsten Prüfpunkt fortfahren? + + + Auftrieb falsch. Bitte um Korrektur! + + + Ungültige Einstellung. Bitte um Korrektur! + + + Qmax [m3/h] + + + Zertifikat + + + Länge + + + Max. erlaubter Druck! + + + Temperaturklasse + + + Durchflussprofil Empfindlichkeit Klasse + + + Montage + + + Druckverlust Klasse + + + Eingabe Seriennr. am Ende + Luftdichte [kg/m3] - - Luftfeuchtigkeit - - - Umgebungsdruck - - - Umgebungstemperatur - Kalibrierung Datum - - Datum und Uhrzeit - Referenzmassendichte [kg/m3] @@ -1017,6 +1203,9 @@ Masse dif. [kg]: + + Masse + Wasserzähler @@ -1056,23 +1245,17 @@ Prüfimpulse: - - Prüfvolumen [l]: - Speichern - - Wasserzähler - - - Mit dem nächsten Prüfpunkt fortfahren? - Eichjahr - - Montage + + Nebenzähler + + + Hauptzähler Schließen des Programms @@ -1098,9 +1281,6 @@ TBF Programm schließt - - Zulassung - Verbindung mit der Datenbank nicht möglich. @@ -1119,9 +1299,6 @@ Wieder speichern - - Vorherige Ergebnisse - Versendet @@ -1131,9 +1308,6 @@ Virtuelle Prüfstandssequenz - - Bestellung - Geben Sie die Protokolldaten ein @@ -1143,57 +1317,27 @@ Speichern und Drucken Ergebnisse - - Anzahl Zähler in der Gruppe - - - Zertifikat - - - Dichte - - - Ende - - - Bedingung für das Ende - Gedruckt - - Bewerten - - - Veröffentlichen - - - Tabelle umbenennen - Möchten Sie die Prüfvorlage löschen? - - Druck bis [bar] - - - Druck von [bar] - - - Einstellung Druck - - - Abpressdruck einstellen - - - Bestellung + + Sensus Erweiterungen Schnell + + Bestellung + Massemessmethode + + Bestellung darf max. {0} Ziffern haben! + Masse wiederholungen @@ -1221,6 +1365,9 @@ T warm + + P heiß + Errstellt von @@ -1236,15 +1383,15 @@ Letzte Änderung von - - Wasserzähler geprüft - Bemerkung Druck + + Prüfvorlage Name + Prozess @@ -1260,426 +1407,6 @@ Ergebnisse speichern! - - Kurzbeschreibung - - - Das TBF Programm wurde bereits ausgeführt. Bitte schließen Sie das Programm im Taskmanager. - - - Fußzeile - - - Kopfzeile - - - Temperatur einstellen - - - Volumen - - - Druck wiederholen - - - Anzeigen - - - Druckdifferenz - - - Zeit zur Durchflusseinst. [s] - - - Zeit Durchfl. IO-Start [s] - - - Zeit Pumpe-Startventil [s] - - - Waagebehälter Volumen prüfen - - - Pumpe starten - - - Wollen sie die Änderungen speichern? - - - Fehler beim initialisieren von Teil '{0}':{1}{2} - - - Fehler beim initialisieren von Gerät '{0}':{1}{2} - - - Adresse - - - Kanal - - - Kommunikation - - - Basis Einheiten - - - Möchten Sie den Abschnitt '{0}' löschen? - - - Möchten Sie diese Zelle kopieren in alle Zellen darunter? - - - Prüfvorlage Name - - - Andere - - - Solltemperatur [°C] - - - Prüfvolumen überschreitet Wägevolumen - - - Neues Durchflussvolumen - - - Warte bis {0} Messbehälter leer ist! - - - Abrechen - - - Wiederholen - - - Wählen Sie Bilder aus und drücken Sie 'Wiederholen', um die Erkennung zu wiederholen - - - Richtung ändern - - - Im Uhrzeigersinn - - - Gegen den Uhrzeigersinn - - - ROI Daten - - - Wiederherstellen - - - Nebenleitung - - - Temperatur - - - Zählerlos Nr. - - - Waage resetten! - - - Dichtekorektur - - - Bei Temperatur - - - Korrektur - - - Wassertemperaturregelung - - - Obere Temperaturgrenze - - - Untere Temperaturgrenze - - - Alle Prüfpunkte müssen durchgeführt werden - - - Manuelle Steuerung deaktiviert - - - Geschützter Prüfprozess - - - von - - - bis - - - Bemerkung - - - Starten Sie den Prüfstand - - - Beenden Sie die Messungen bitte - - - Aktualisierung - - - Aktuell - - - Durchfluss - - - Druck - - - Durchfluss nicht erreicht - - - Drucken Sie OK, wenn Sie fertig sind. - - - Vorherige Ergebnisse Herunterladen - - - Nächste - - - Vorherige - - - Ergebnis - - - Ergebnisse - - - Stummschaltung des Alarms - - - Geräte herunterfahren - - - Kurze Impulse - - - Verdunstung - - - Unterbrechen - - - Entleeren - - - Behälter entleeren - - - Ergebnis speichern - - - Befüllen - - - Prüfstrecke - - - Session - - - Start Prüfzyklus - - - Stopp - - - Kalender - - - Veranstaltungen - - - Hilfe - - - Einstellungen - - - Alle Ereignisse - - - Prüfstand - - - Klasse - - - Lesen bestätigen - - - Datum / Uhrzeit - - - Schwere - - - Ursprung - - - Unbestätigte Ereignisse - - - Ereignisauslöser - - - (max._X_ alphanumerische Zeichen) - - - Benutzername bereits vorhanden. Bitte einen anderen Benutzername wählen. - - - Ungültiger Benutzername oder Passwort - - - Qn [m3/h] - - - WZ-Stand - - - Leckage Dauer - - - Pmax Dauer - - - Schließen Ventil Zulauf und Pumpe Aus - - - Seite - - - Start - - - Anzeigen Ende Zyklus - - - Nebenzähler - - - Hauptzähler - - - Qmin [m3/h] - - - Qt [m3/h] - - - Wasser - - - Produktname - - - Zulassung Datum - - - Zulassung Nr.: - - - Zugelassen von: - - - Parallel mit Folgeschritt - - - Prallel mit vorherigem Schritt - - - iPerl Kommunikation läuft - - - Benutzereigenschaften ändern - - - Gruppen - - - Benutzer - - - Ignorieren - - - Wiederholen - - - Revision?? - - - ID Nummer - - - Greifen - - - Live - - - Behälter Schließen - - - Stop Rückflussventil - - - Auftrieb falsch. Bitte um Korrektur! - - - Ungültige Einstellung. Bitte um Korrektur! - - - Qmax [m3/h] - - - Länge - - - Max. erlaubter Druck! - - - Temperaturklasse - - - Durchflussprofil Empfindlichkeit Klasse - - - Druckverlust Klasse - - - Eingabe Seriennr. am Ende - - - Nebenzähler - - - Hauptzähler - - - Sensus Erweiterungen - - - Bestellung darf max. {0} Ziffern haben! - - - P heiß - Kurzbeschreibung @@ -1692,6 +1419,15 @@ T m warm + + Das TBF Programm wurde bereits ausgeführt. Bitte schließen Sie das Programm im Taskmanager. + + + Fußzeile + + + Kopfzeile + T kalt von @@ -1707,21 +1443,36 @@ Wärmezähler Optionen + + Möchten Sie diese Zelle kopieren in alle Zellen darunter? + T v kalt T v warm + + Temperatur einstellen + Energie + + Volumen + + + Basis Einheiten + Invalid {0} Prompt + + Kanal + Übergeordneter Name @@ -1740,6 +1491,9 @@ Widerstand + + Temperatur + IST-27 Kalibrier Koeffizient @@ -1755,6 +1509,21 @@ Berrechnetes Volumen + + Möchten Sie den Abschnitt '{0}' löschen? + + + Druckdifferenz + + + Druck wiederholen + + + Anzeigen + + + Wollen sie die Änderungen speichern? + Dauerversuch Zyklen Stufen @@ -1785,6 +1554,12 @@ Benutzercode + + Fehler beim initialisieren von Gerät '{0}':{1}{2} + + + Fehler beim initialisieren von Teil '{0}':{1}{2} + Wähle Kaltwasser @@ -1812,6 +1587,12 @@ T warm heizen + + Andere + + + Solltemperatur [°C] + Einstellen Kaltwasser Kühltemperatur @@ -1827,12 +1608,45 @@ Einstellen Warmwasser Heiztemperatur + + Prüfvolumen überschreitet Wägevolumen + Passwort wiederholen Passwörter sind unterschiedlich! Bitte neu eingeben! + + Neues Durchflussvolumen + + + Warte bis {0} Messbehälter leer ist! + + + Abrechen + + + Wiederholen + + + Wählen Sie Bilder aus und drücken Sie 'Wiederholen', um die Erkennung zu wiederholen + + + Im Uhrzeigersinn + + + Gegen den Uhrzeigersinn + + + ROI Daten + + + Richtung ändern + + + Wiederherstellen + Pfad für Prüfstrecke kann nicht geladen werden. @@ -1845,6 +1659,21 @@ Pfad für Abtastung kann nicht geladen werden. + + Alle Prüfpunkte müssen durchgeführt werden + + + Geschützter Prüfprozess + + + Entleeren + + + Session + + + Nebenleitung + Schutzhaube schließen! @@ -1857,9 +1686,15 @@ {0} - warten bis Prüfbehälter leer ist + + Manuelle Steuerung deaktiviert + Zählerlos + + Zählerlos Nr. + Wärmezähler @@ -1875,21 +1710,36 @@ RFID Kommunikation fehlgeschlagen! - - Abtastkopf wurde deaktiviert vom Benutzer! - {0}' Eingabe fehlerhaft ({1}) Speichern + + Wassertemperaturregelung + + + Obere Temperaturgrenze + + + Untere Temperaturgrenze + + + Waage resetten! + Waage Kommunikationsfehler! Waage Kommunikation timeout! + + Dichtekorektur + + + Bei Temperatur + Prüfstellenleiter @@ -1899,6 +1749,9 @@ Information + + Korrektur + Grafik @@ -1914,18 +1767,45 @@ Volumen im Behälter überschreitet die Waagenkapazität! + + von + + + bis + MID-Temperatur ausserhalb der Prüfbedingungen! Nächstes Prüfvolumen + + Bemerkung + Aktivieren "Bemerkung" OK Drücken um Prüfstand zu starten + + Starten Sie den Prüfstand + + + Beenden Sie die Messungen bitte + + + Aktualisierung + + + Durchfluss + + + Druck + + + Durchfluss nicht erreicht + Prüfstandskomponenten Klasse @@ -1941,6 +1821,9 @@ Fernzugriff auf Datenbank is nicht kompatibel. + + Drucken Sie OK, wenn Sie fertig sind. + Impulse OK @@ -1995,6 +1878,15 @@ Fehler Speicherparameter von {0} + + Vorherige Ergebnisse Herunterladen + + + Nächste + + + Vorherige + Vergleichen @@ -2004,9 +1896,18 @@ Importieren - + Wiederholung + + Ergebnis + + + Stummschaltung des Alarms + + + Geräte herunterfahren + PC ausschalten nach Beendigung der TBF @@ -2046,12 +1947,18 @@ Keine optischen Impulse vorhanden + + Kurze Impulse + Reparatur Keine Nr. + + Verdunstung + Max. Massezunahme [Kg] @@ -2151,6 +2058,24 @@ Entwässern davor + + Unterbrechen + + + Ergebnis speichern + + + Befüllen + + + Prüfstrecke + + + Start Prüfzyklus + + + Stopp + Q Ziel @@ -2184,6 +2109,9 @@ Bilder markieren + + Behälter entleeren + Beliebig @@ -2199,6 +2127,48 @@ Programmversion passt nicht. + + Kalender + + + Veranstaltungen + + + Hilfe + + + Einstellungen + + + Alle Ereignisse + + + Prüfstand + + + Klasse + + + Lesen bestätigen + + + Datum / Uhrzeit + + + Schwere + + + Ursprung + + + Unbestätigte Ereignisse + + + Ereignisauslöser + + + Kalibrierschein gültigkeit abgelaufen + Warten bis @@ -2208,19 +2178,55 @@ Kalibrierschein - - Kalibrierschein gültigkeit abgelaufen - Strom Spannung - - Projektnummer - Dialog anzeigen + + Wasserzähler geprüft + + + Kurzbeschreibung + + + Q von [l/h] + + + Q bis [l/h] + + + Ziel Q [m3/h] + + + Druck Eingang Ende + + + Druck Eingang Start + + + Druck Ausgang Ende + + + Druck Ausgang Start + + + Prüfvolumen [l]: + + + Abtastkopf wurde deaktiviert vom Benutzer! + + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.es.resx b/TBF/Resources/Strings.es.resx index d335c426c..42dd41499 100644 --- a/TBF/Resources/Strings.es.resx +++ b/TBF/Resources/Strings.es.resx @@ -126,4 +126,13 @@ Mostrar diálogo + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.fr.resx b/TBF/Resources/Strings.fr.resx index d309483ec..2454e6cec 100644 --- a/TBF/Resources/Strings.fr.resx +++ b/TBF/Resources/Strings.fr.resx @@ -117,9 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Activité - Confirmation @@ -399,9 +396,6 @@ Toler rouge. [%] - - Temps test [s] - Erreur lors de la création de la base de données. Raison: @@ -525,9 +519,6 @@ Q relatif à - - Q cible [m3/h] - Mètres composés @@ -618,6 +609,9 @@ Détection flux commutation + + Activité + Progrès @@ -888,7 +882,7 @@ Q hausse - + Numéro série @@ -939,6 +933,9 @@ Commande + + Numéro de projet + Humidité ambiante @@ -1245,9 +1242,6 @@ Cible ref impulsions: - - Volume cible [l]: - Enregistrer largeurs colonne @@ -1386,9 +1380,6 @@ Dernier changement dby - - Types compteurs testés - Remarques @@ -1671,6 +1662,9 @@ Procédure protégée + + Vidanger + Session @@ -1713,9 +1707,6 @@ Échec communication RFID - - tête désactivée par utilisateur - {0}' exclamation échoué ({1}) !!! @@ -1803,9 +1794,6 @@ Rafraîchir - - actuel - Couler @@ -1905,7 +1893,7 @@ Importation - + répétition @@ -1989,6 +1977,9 @@ Terminer le cycle + + Inonder + Pipeline @@ -2001,25 +1992,40 @@ Q obj. - - Vidanger - Vidanger réservoir - - Inonder - Curren Tension - - Numéro de projet - Afficher la boîte de dialogue + + Types compteurs testés + + + Q cible [m3/h] + + + Volume cible [l]: + + + tête désactivée par utilisateur + + + Temps test [s] + + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.it.resx b/TBF/Resources/Strings.it.resx index d66470268..84f8d64d5 100644 --- a/TBF/Resources/Strings.it.resx +++ b/TBF/Resources/Strings.it.resx @@ -117,9 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Attività - conferma @@ -252,9 +249,6 @@ numero - - massa - Aggiunta @@ -276,12 +270,6 @@ Ok - - flusso - - - pressione - Username o password non validi @@ -399,12 +387,6 @@ Uscite - - Qda [l/h] - - - Q a [l/h] - tipo rosso @@ -414,9 +396,6 @@ tolleranza rossa [%] - - test time [s] - errore durante la creazione del data base. ragioni: @@ -540,9 +519,6 @@ Q relativo a - - target Q [m3/h] - metri composti @@ -633,6 +609,9 @@ rilevamento del flusso di commutazione + + Attività + progressi @@ -903,7 +882,7 @@ Qalta - + Numero Seriale @@ -954,6 +933,9 @@ ordine acquisto + + Numero del progetto + Umidità dell'ambiente @@ -981,9 +963,6 @@ Inizio - - @temperatura [°C] - densità @@ -1125,15 +1104,15 @@ ID - - messa a fuoco - afferrare dal vivo + + Fotocamera + chiusura del serbatoio @@ -1212,15 +1191,15 @@ misuratore composto {0} - - Errore: - tempo stimato [s]: mass diff [kg]: + + massa + metri @@ -1260,9 +1239,6 @@ Target ref. count: - - target volume [l]: - salva larghezza colonne @@ -1314,6 +1290,9 @@ stampare i risultati dei contatori + + inviato + inviato @@ -1398,9 +1377,6 @@ ultimo cambiato da - - tipi di contatori testati - note @@ -1572,9 +1548,6 @@ codice utente - - inviato - Errore dispositivo '{0}':{1}{2} @@ -1686,8 +1659,8 @@ Procedura protetta - - Drenare + + Svuotare Sessione @@ -1740,14 +1713,17 @@ correzione - - Fotocamera + + Avvio del banco prova Finire la misurazione perfavore - - Avvio del banco prova + + flusso + + + pressione Errore impostazione del flusso @@ -1761,12 +1737,6 @@ Interrompere - - Svuotare - - - Svuotare il serbatoio - Finire il ciclo @@ -1779,16 +1749,55 @@ Avviare il ciclo + + Svuotare il serbatoio + Corrente Voltaggio - - Numero del progetto - Mostra dialogo + + tipi di contatori testati + + + Qda [l/h] + + + Q a [l/h] + + + target Q [m3/h] + + + target volume [l]: + + + test time [s] + + + @temperatura [°C] + + + messa a fuoco + + + Errore: + + + Drenare + + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.pl.resx b/TBF/Resources/Strings.pl.resx index 5a351ca4b..a68877112 100644 --- a/TBF/Resources/Strings.pl.resx +++ b/TBF/Resources/Strings.pl.resx @@ -117,387 +117,114 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Aktywność - - - <żaden> - - - (niedostępny) - - - & Dodaj> - - - Dodaj - - - Kalibracja w toku - - - Administrator - - - Wilgotność otoczenia - - - Ciśnienie otoczenia - - - Temperatura otoczenia - - - Zatwierdzenie - - - Info zatwierdzenia - - - Rozmieszczenie badanych wodomierzy - - - Układ testu - - - Układ testów - - - temperatura [degC] - - - We. - - - We. Wodomierz - - - We. Stan wodomierza - - - We. Nr fabryczny wodomierza - - - Dostępne wyniki: - - - < Powrót - - - Waga - - - Stanowisko pomiarowe - - - Stanowisko pomiarowe nie jest uruchomione, jednak aby rozwiązać problem można zmienić ustawienia. - - - Konflikt nazwy stanowiska pomiarowego, należy użyć innej nazwy - - - Parametry stanowiska - - - Specjalistyczna kalibracja - - - Błąd kamery - - - Anuluj - - - Usuń wyniki - - - Usuń - - - Zamknij - - - Zamykanie zawór opróżniania - - - Zamknij - - - Zamknięcie zaworu wejściowego, wyłączanie pompy - - - Wodomierze sprzężone - - - Sprzężone - - - Komunikacja - - - Element - - - Konfiguracja - - - Skonfiguruj - - - Skonfiguruj stanowisko pomiarowe (wymagane hasło) - Potwierdzenie - - Parametry połączenia - - - Kopia - - - Poprawiono - - - Tworzenie bazy danych - - - Dane - - - Typ bazy danych - - - Data i czas - - - Baza danych została utworzona pomyślnie! - - - Baza danych zostanie nadpisana - - - Gęstość - - - Opis - - - Wykrywanie zakończone - - - Wykrywanie nieudane - - - Próg wykrywania [%] - - - Urządzenie - - - Przeszkoda - - - Zawór przerzutowy - - - Czy chcesz kontynuować? - Czy chcesz zapisać procedurę? - - W dół - - - Czas trwania wycieku [s] - - - Czas trwania Pmax [s] - - - Czas trwania [s] - - - Edycja - - - STOP awaryjny - - - Opróżnianie - - - Opróżnianie ({0}: {1} krok / {2}) - - - Opróżnianie zbiornika - - - Zawór opróżniania - - - Koniec - - - Warunek końcowy - - - Stan końcowy - - - Wprowadź hasło - - - Bł. kor. - [%] - - - Bł. kor. + [%] - - - Bł. Limit - [%] - - - Bł. Limit + [%] - Błąd Błąd podczas ładowania użytkowników z bazy danych: - - Błąd [%] - - - Błąd podczas tworzenia bazy danych. Powód: - - - Wyjście - - - NOK - Nie udało się utworzyć bazy danych: Nie udało się wyeksportować bazy danych: - - Napełnianie - - - Napełnić stanowisko pomiarowe wodą? - - - Koniec - - - Przepływ - - - Wybór przepływu - - - Przepływomierz - - - Określenie masy wody w zbiorniku - - - Kierownik Laboratorium - - - Poziomo - - - Zmiany zostaną utracone. Czy chcesz kontynuować? - - - Zignorować - - - Nieprawidłowe hasło - Nieprawidłowy użytkownik, hasło lub stanowisko - - Mniej + + Hasło - - Ładowanie procedury + + Proszę wybrać stanowisko pomiarowe - - Blokowanie + + Musisz ponownie uruchomić, aby zastosować zmiany - - Logowanie + + Stanowisko pomiarowe - - Wodomierz główny + + Nazwa użytkownika - - Stan wodomierza głównego + + Ostrzeżenie - - Nr fabryczny wodomierza głównego + + Zamknij - - Konserwator + + Zawór przerzutowy - - Opróżnianie zbiornika - - - Masa - - - Pomiar masy - - - Zmierzona - - - Pomiar wagi - - - Wiadomość - - - Metoda sprawdzania - - - Wybór metody sprawdzania - - - Klasa obciążeń - - - Legalizator - - - Metrologia - - - Tryb - - - Więcej + + Zawór opróżniania Nazwa + + otwarte + + + Pompa + + + P w górę + + + P w dół + + + Q od + + + Q do + + + Odniesienie + + + Reg. zawór + + + Waga + + + Czujnik + + + T zaw. + + + T we + + + T wyj + + + Miernik ciśnienia + + + Czas trwania [s] + + + nie + + + tak + PBench PFeed - - - Kopia - PQ @@ -510,92 +237,215 @@ Test - - Nowa nazwa przejścia - - - Nowa karta - - - Następna> - - - nie - - - Brak konfiguracji stanowiska w programie. - - - Nie - - - Nie można połączyć się z bazą danych. - - - <nic nie konfiguruj> - - - Zgłoszenie + + - Kopia Nr. - - Nr. wodomierza w grupie: + + Dodaj + + + Anuluj + + + Zamknij + + + Blokowanie + + + Usuń + + + Odblokować OK - - otwarte + + Nazwa Użytkownika + + + Login użytkownika + + + Kopia + + + W dół + + + Edycja + + + W górę + + + Nie można połączyć się z bazą danych. + + + Skonfiguruj stanowisko pomiarowe (wymagane hasło) + + + Wyjście + + + Ponów połączenie z bazą danych + + + Wprowadź hasło + + + Nieprawidłowe hasło + + + Konflikt nazwy stanowiska pomiarowego, należy użyć innej nazwy + + + Baza danych została utworzona pomyślnie! + + + Baza danych zostanie nadpisana + + + Czy chcesz kontynuować? + + + Zgłoszenie + + + Brak konfiguracji stanowiska w programie. + + + Opis + + + Wodomierzy + + + Procedura + + + Punkt kontrolny + + + Poprawiono + + + Zmierzona + + + Test skorygowany + + + Stanowisko pomiarowe nie jest uruchomione, jednak aby rozwiązać problem można zmienić ustawienia. + + + Opróżnianie + + + Metoda Q-Set + + + Powtórzenie nr. + + + Punkt kontrolny + + + Zerowanie + + + Stanowisko pomiarowe + + + Bł. kor. - [%] + + + Bł. kor. + [%] + + + Bł. Limit - [%] + + + Bł. Limit + [%] + + + Napełnianie Wyjście - - P w górę + + Redukcja typu - - P do końca + + Czujniki - - P w górę start + + Toler. Czerwony. [%] - - P w dół + + Błąd podczas tworzenia bazy danych. Powód: - - P w dół końca - - - P dół początek - - - Strona - - - Parametry - - - Nadrzędny - - - Część - - - OK - - - Hasło - - - PID + + Metrologia Proszę zmienić następujące ustawienia: - - Proszę wybrać cykl, test lub opróżnianie + + Właściwości + + + Wystąpił nieobsługiwany błąd w + + + Użytkownik + + + (niedostępny) + + + Administrator + + + Specjalistyczna kalibracja + + + Kierownik Laboratorium + + + Konserwator + + + Legalizator + + + Pracownik wykonujący testy + + + Specjalista ds. Testów + + + Zamykanie zawór opróżniania + + + Określenie masy wody w zbiorniku + + + Zignorować + + + Ładowanie procedury + + + Opróżnianie zbiornika + + + Pomiar masy Proszę wybrać procedurę @@ -603,218 +453,26 @@ Proszę wybrać test - - Proszę wybrać stanowisko pomiarowe - - - Moc [%] - - - Ciśnienie - - - Ciśnienie Hi [bar] - - - Ciśnienie Lo [bar] - - - Miernik ciśnienia - - - Wybór ciśnienia - - - Drukarka - - - Drukarka - - - Procedura - - - Wodomierzy - - - Producent - - - Dla zastosowania niektórych ustawień konieczne jest ponowne uruchomienie programu - - - Postęp - - - Właściwości - - - Zapiska - - - Impulsy na litr - - - Pompa - - - Moc pompy [%] - - - Napełnić stanowisko pomiarowe wodą? - Oczyszczanie - - Czyszczenie ({0}: {1} krok / {2}) - - - Zamówienie - - - Q od - - - Q od [l/h] - - - Metoda Q-Set - - - Q do - - - Q do [l/h] - - - Qopad - - - Qn - - - Qwzras - - - Pytanie - - - Szybkość zmian [%] - Gotowy - - Redukcja typu - - - Odniesienie - - - Reg. zawór - - - Względne Q od - - - Względne Q do - - - pozostały czas - - - Usuń - - - Usuń wszystko - - - Usuń - - - Usuń zakładkę - - - Zmień nazwę Zakładki - - - Powtórzenie nr. - - - Musisz ponownie uruchomić, aby zastosować zmiany - - - Ponów połączenie z bazą danych - - - Wykrywanie ROI w toku - - - Wykrywanie działa - - - Ekran - - - s - - - Wybrane wyniki: - - - Czujnik - - - Czujniki - - - Czujniki - - - Numer fabryczny - Ustaw przepływ Ustaw linię pomiarową - - Ustawienie przepływu - - - Ustawienie ciśnienia wody - - - Pokaż formularz końca cyklu - - - Pojedynczy - - - Start - Uruchomić pompę Start testu - - Uruchamianie systemu - - - Uruchamianie kamer - - - Uruchamianie pompy - - - Start zaworu - - - Stan + + Zatrzymanie Zatrzymanie pompy @@ -822,44 +480,185 @@ Zatrzymanie sprawdzania - - Zatrzymanie + + Tarowanie - - Zatrzymanie przepływu przed uruchomieniem ustalonego sprawdzania + + Sprawdzanie w toku - - Tłumienie wibracji wodomierza + + < Powrót + + + Koniec + + + Następna> + + + Wybór przepływu + + + Nazwa testu + + + Metoda sprawdzania + + + Względne Q od + + + Względne Q do + + + Wodomierze sprzężone + + + Próg wykrywania [%] + + + Szybkość zmian [%] + + + Impulsy na litr + + + Element + + + <żaden> + + + Wybór metody sprawdzania + + + Czujniki + + + Metoda sprawdzania + + + Wybór dopuszczalnej objętości i błędu + + + Usuń wyniki + + + Skonfiguruj + + + Rozmieszczenie badanych wodomierzy + + + Układ testów + + + Poziomo + + + Testy są kolumnami + + + Testy są wierszami + + + Pionowo + + + Konfiguracja + + + NOK + + + OK + + + Usuń + + + Opróżnianie zbiornika + + + Pomiar wagi + + + Ustawienie przepływu + + + Sprawdzanie zakończone + + + Przygotowanie testu + + + Czyszczenie ({0}: {1} krok / {2}) + + + Opróżnianie ({0}: {1} krok / {2}) Włączanie wykrywania przepływu - - Punkty przełączania + + Aktywność - - T zaw. + + Postęp - - T we + + Proszę wybrać cykl, test lub opróżnianie - - T wyj + + Info zatwierdzenia - - Docelowe Q [m3/h] + + Klasa obciążeń - - Tarowanie + + Producent - - Punkt kontrolny + + Qn - - Stanowisko pomiarowe + + Wodomierze - - Konfiguracja elementów stanowiska pomiarowego + + Drukarka + + + Wersja + + + Numer stanowiska pomiarowego + + + <nic nie konfiguruj> + + + Napełnić stanowisko pomiarowe wodą? + + + Nie + + + Pytanie + + + tak + + + Parametry stanowiska + + + Parametry połączenia + + + Tworzenie bazy danych + + + Typ bazy danych Specyfikacja bazy danych stanowiska @@ -870,35 +669,71 @@ Nazwa stanowiska pomiarowego - - Numer stanowiska pomiarowego - - - Sprawdzanie zakończone - Test połączenia - - Punkt kontrolny + + Użytkownicy i grupy - - Sprawdzanie w toku + + Dane z wodomierza - - Test skorygowany + + Typy wodomierzy - - Metoda sprawdzania + + Logowanie - - Metoda sprawdzania + + Tryb - - Nazwa testu + + Parametry - - Przygotowanie testu + + Nadrzędny + + + Typ + + + Konfiguracja elementów stanowiska pomiarowego + + + Przejście + + + Nowa karta + + + Usuń zakładkę + + + Zmień nazwę Zakładki + + + Nowa nazwa przejścia + + + Moc [%] + + + Wykrywanie ROI w toku + + + Wykrywanie zakończone + + + STOP awaryjny + + + Przejście - Koniec + + + Przejście - Początek + + + Uruchamianie kamer Rozpoczęcie testu ({0}: krok {1}/{2}) @@ -906,125 +741,236 @@ Koniec testu ({0}: krok {1}/{2}) - - Czas testu [s] + + & Dodaj> - - Pracownik wykonujący testy + + Dostępne wyniki: - - Specjalista ds. Testów + + Usuń - - Testy są kolumnami + + Usuń wszystko - - Testy są wierszami + + Wybrane wyniki: - - T stop - masa msrmt. [s] + + Tłumienie wibracji wodomierza - - T stab przepływu - Start [s] + + Napełnić stanowisko pomiarowe wodą? - - Koniec czasu + + Wiadomość - - Toler. Czerwony. [%] + + Start zaworu - - Przejście - Koniec + + Przeszkoda - - Przejście - - - Przejście - Początek - - - Typ - - - Wystąpił nieobsługiwany błąd w - - - Odblokować - - - W górę - - - Użytkownik - - - Login użytkownika - - - Nazwa użytkownika - - - Nazwa Użytkownika - - - Użytkownicy i grupy - - - Wersja - - - Pionowo - - - Wybór dopuszczalnej objętości i błędu - - - Ostrzeżenie + + Zatrzymanie przepływu przed uruchomieniem ustalonego sprawdzania Obiekt - - Dane z wodomierza - Numery seryjne wodomierzy oraz Stany Stany wodomierzy - - Typy wodomierzy - - - Wodomierze - Nr seryjny Stan [l] - - tak + + Wykrywanie nieudane - - tak + + Błąd kamery - - Zerowanie + + Uruchamianie systemu - - Wersja {0} + + pozostały czas - - Licznik ciepła + + s - - Czujniki licznika ciepła + + T stop - masa msrmt. [s] - - Objętość + + Mniej + + + Więcej + + + Dla zastosowania niektórych ustawień konieczne jest ponowne uruchomienie programu + + + Zmiany zostaną utracone. Czy chcesz kontynuować? + + + PID + + + Przepływomierz + + + Część + + + Koniec czasu + + + Sprzężone + + + Urządzenie + + + Drukarka + + + Ekran + + + Pojedynczy + + + We. Wodomierz + + + We. Stan wodomierza + + + Dane + + + Stan końcowy + + + Wodomierz główny + + + Stan wodomierza głównego + + + Zapiska + + + Qopad + + + Qwzras + + + Numer fabryczny + + + Stan + + + Punkty przełączania + + + We. Nr fabryczny wodomierza + + + Nr fabryczny wodomierza głównego + + + Moc pompy [%] + + + Kalibracja w toku + + + Błąd [%] + + + Uruchamianie pompy + + + Ustawienie ciśnienia wody + + + Ciśnienie Hi [bar] + + + Ciśnienie Lo [bar] + + + Wybór ciśnienia + + + Czas trwania wycieku [s] + + + Czas trwania Pmax [s] + + + Zamknięcie zaworu wejściowego, wyłączanie pompy + + + Zamówienie + + + Numer projektu + + + Wilgotność otoczenia + + + Ciśnienie otoczenia + + + Temperatura otoczenia + + + Zatwierdzenie + + + Data i czas + + + Strona + + + T stab przepływu - Start [s] + + + Koniec + + + Start + + + Gęstość + + + Nr. wodomierza w grupie: + + + Pokaż formularz końca cyklu + + + Warunek końcowy + + + Komunikacja + + + We. Główny: @@ -1095,6 +1041,9 @@ Prawa autorskie © 2013 - {0} + + Wersja {0} + Wystąpił nieobsługiwany błąd @@ -1140,9 +1089,6 @@ ID - - Zogniskować - Przechwycić @@ -1236,6 +1182,9 @@ Różnica masy [kg]: + + Masa + Wodomierz @@ -1275,9 +1224,6 @@ Zadany zakres impulsów - - Zadana objętość [l] - Zachować szerokość kolumn @@ -1329,9 +1275,6 @@ Wydruk wyników woodmierzy - - Jeszcze raz - Wysłano @@ -1380,6 +1323,12 @@ stabilny + + Licznik ciepła + + + Czujniki licznika ciepła + T zimna @@ -1410,9 +1359,6 @@ Zmieniono - - Typy testowanych liczników - Uwagi @@ -1488,6 +1434,9 @@ Energia + + Objętość + Jednostka domyślna @@ -1581,8 +1530,11 @@ Kod użytkownika - - Krótki opis + + Opróżniać + + + Sesja Legalizator @@ -1590,9 +1542,18 @@ Korekta + + Wykresy + Uruchom stanowisko pomiarowe + + Przepływ + + + Ciśnienie + Wynik @@ -1602,15 +1563,12 @@ Odparowanie + + Nepevność + Zrzut - - Opróżniać - - - Opróżnij zbiornik - Akceptuj wyniki @@ -1620,20 +1578,20 @@ Przewód - - Sesja - Start cyklu - - Stanowisko + + Profile + + + Opróżnij zbiornik Kalendarz - - Wykresy + + Logi Pomoc @@ -1641,8 +1599,23 @@ Ustawienia - - Logi + + Stanowisko + + + Klasa + + + Data/czas + + + Poziom ważności + + + Źródło + + + Baza danych Hydraulika @@ -1653,46 +1626,82 @@ Elementy - - Baza danych - Aktualizacja bazy danych O - - Klasa - - - Data/czas - Edycja schematu - - Poziom ważności - - - Źródło - Framework stanowiska pomiarowego - - Profile - - - Nepevność - Prąd Napięcie - - Numer projektu + + Układ testu + + + Metoda sprawdzania + + + Typy testowanych liczników + + + Krótki opis + + + Q od [l/h] + + + Q do [l/h] + + + Docelowe Q [m3/h] + + + P do końca + + + P w górę start + + + P w dół końca + + + P dół początek + + + Zadana objętość [l] + + + Czas testu [s] + + + temperatura [degC] + + + Zogniskować + + + Wykrywanie działa + + + Jeszcze raz + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.resx b/TBF/Resources/Strings.resx index e20e67a67..306edc155 100644 --- a/TBF/Resources/Strings.resx +++ b/TBF/Resources/Strings.resx @@ -198,10 +198,10 @@ Reg. valve - + Reg. min step - + Application diagnostic @@ -2449,7 +2449,7 @@ Upgrade database - + Application diagnostic @@ -2473,5 +2473,13 @@ Save Communication - + + Pulses per unit + + + Pulses per kilogram + + + Units + \ No newline at end of file diff --git a/TBF/Resources/Strings.ro.resx b/TBF/Resources/Strings.ro.resx index c2e3cd45d..fdb95c768 100644 --- a/TBF/Resources/Strings.ro.resx +++ b/TBF/Resources/Strings.ro.resx @@ -117,122 +117,149 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <none> + + Confirmare - - (offline) + + Doriti sa salvati procedura? - - Despre test - - - Proces - - - Adauga - - - Nou - - - Adresa - - - Calibrare - - - Administrator - - - C.mediue:Umiditate - - - C.mediue:Presiune - - - C.mediue:Temperatura - - + Eroare - - Inapoi + + Eroare utilizator - - Balanta + + Parola - - Stand + + Pentru validarea modificarilor trebuie sa reporniti aplicatia - - Renunta + + Instalatia - - stergere rezultate + + Nume utilizator - - Stergere + + Atentie + + + (max. _X_ caractere alfanumerice) + + + Acest nume de utilizator este deja folosit. Va rugam alegeti alt nume. Inchide - - Inchide vana de golire + + Deviator + + + Nume + + + Deschis + + + Pompa + + + Q de la + + + Q pana la + + + Referinta + + + vana reglare + + + Balanta + + + Senzor + + + Senzor presiune + + + Durata [s] + + + da + + + Procedura + + + Copie + + + Nr. + + + Nou + + + Renunta Inchide - - se inchide vana de alimentare, se opreste pompa + + Bloca - - rece + + Stergere - - Contor combinat + + Modificare - - Combinat + + OK - - Comunicatie + + Utilizator sau parola incorecta - - Componenta + + Nume utilizator - - Configuratie - - - Configurare - - - Configurarea instalatie( necesar parola) - - - Confirmare - - - String conexiune + + Logare utilizator Copiere - - Creare BD + + Jos - - Data + + Editare - - Setare baza de date + + Sus - - Tip baza de date + + Conectare esuata la baza de date - - Data si timpul + + Configurarea instalatie( necesar parola) + + + Iesire + + + Reincercati conecxiunea la baza de date + + + Introduceti parola + + + Parola incorecta Baza de data a fost creata @@ -240,53 +267,44 @@ Baza de date va fi suprascrisa - - Densitate + + Doriri sa continuati? + + + Notificare Descriere - - Aparat + + Proceduri - - Deviator + + Procedura - - Doriri sa continuati? + + Debitul de verificare - - Doriti sa salvati procedura? - - - Jos - - - Scurgere_timp [s] - - - Pmax_timp[s] - - - Durata [s] - - - Editare_utilizator - - - Editare - - - STOP-AVARIE + + Cantarit Golire - - Golire vas masurare + + Q-Metoda Selectata - - Introduceti parola + + Nr. repetari + + + debit verificare + + + resetare + + + Stand Eroare. cor. - [%] @@ -300,344 +318,86 @@ Eroare. Limita + [%] - - Eroare - - - Eroare utilizator - - - Eroarea [%] - - - Eroare creare baza de date - - - Evaluare - - - Iesire - - - Resp - Alimentare - - Umpleti instalatia cu apa? - - - Sfarsit - - - Debit - - - Selectare debit - - - Debitmetru - - - Se determina masa apei din vas - - - Grupuri - - - Sef Laborator - - - Orizontal - - - fierbinte - - - Rezultatele se vor pierde. Doriti sa continuati? - - - Ignora - - - Ignora - - - Parola incorecta - - - Utilizator sau parola incorecta - - - Limba - - - mai putin - - - Incarcarea procedurii - - - Bloca - - - Specialist intretinere - - - Goliti vasul - - - Masa - - - (max. _X_ caractere alfanumerice) - - - Cantarire masa - - - Cantarit - - - Cantarire - - - Mesaj - - - Metoda verificare - - - Selectare metoda verificare - - - Clasa metrologica - - - Metrolog - - - Date Metr. - - - Mod - - - mai mult - - - Nume - - - Copie - - - Procedura - - - Nu - - - Conectare esuata la baza de date - - - <nimic de configurat> - - - Notificare - - - Nr. - - - Nr. contoare intr-un grup - - - OK - - - Deschis - - - Parametri - - - Parola - - - PID - - - Va rugam schimbati urmatoarele setari - - - Putere [%] - - - Presiune - - - Presiune max [bar] - - - Presiune min [bar] - - - Senzor presiune - - - Selectare domen. Pres - - - Imprimanta - - - Imprimanta - - - Procedura - - - Proceduri - - - Producator - - - Se impune repormirea programului pentru a validarea noilor setari - - - in curs - - - Caracteristici - - - impuls pe litru - - - Pompa - - - Putere pompa - - - Alimentati cu apa instalatia? - - - Alimentare - - - Umplere instalatie - - - Q de la [l/h] - - - Q de la - - - Q-Metoda Selectata - - - Q pana la - - - Q pana la [l/h] - - - Qn - - - Qt - - - Intrebare - - - Variatie debit [%] - - - Referinta - - - vana reglare - - - Timp - - - Elimina - - - Elimina toate - - - Stergere - - - Stergere tabele - - - Redenumire tabel - - - Nr. repetari - - - Pentru validarea modificarilor trebuie sa reporniti aplicatia - - - Reincercati - - - Reincercati conecxiunea la baza de date - - - Ecranare - - - Selectare componente - - - Rezultatele selectate: - - - Senzor - - - senzori - Sistemul senzori - - Numar serie + + Tol verificare + + + Eroare creare baza de date + + + Date Metr. + + + Va rugam schimbati urmatoarele setari + + + Caracteristici + + + A aparut o eroare in + + + Utilizator + + + (offline) + + + Administrator + + + Sef Laborator + + + Specialist intretinere + + + Metrolog + + + Metrolog + + + Expert + + + Inchide vana de golire + + + Se determina masa apei din vas + + + Ignora + + + Incarcarea procedurii + + + Goliti vasul + + + Cantarire masa + + + Alimentare Setare debit - - Reglare debit verificare - - - Reglare presiune apa - Porneste pompa Pornire verificare - - Initializare sistem - - - Pornire pompa - - - deschide valva + + oprire Stop pompa @@ -645,74 +405,62 @@ Stop verificare - - oprire - - - Debit setat Q [m3/h] - Tarare - - Debitul de verificare - - - Instalatia - - - Configurare componente instalatie - - - Date Instlatie - - - Instalatia este asistata de acest PC - - - Nume instalatie - - - Nr. Instalatie - - - Instalatii: - - - Verificare efectuata - - - debit verificare - Verificare in curs - - Metoda verificare + + Inapoi + + + Sfarsit + + + Selectare debit Nume verificare - - Pregatire verificare + + Metoda verificare - - Start pregatire verif. + + Contor combinat - - Stop pregatire verif. + + Variatie debit [%] - - Durata + + impuls pe litru - - Metrolog + + Componenta - - Metrolog: + + <none> - - Expert + + Selectare metoda verificare + + + senzori + + + Metoda verificare + + + Selectarea volumului si limitei de erori + + + stergere rezultate + + + Configurare + + + Orizontal debitele de verificare_coloane @@ -720,101 +468,329 @@ debitele de verificare_linii - - Stabilizare [s] - - - T stab debit start[s] - - - Timeout - - - Tol verificare - - - sfarsit-pregatire - - - Pregatiri - - - Start-Pregatire - - - Tip - - - A aparut o eroare in - - - Modificare - - - Sus - - - Utilizator - - - Logare utilizator - - - Administrare utilizatori - - - Nume utilizator - - - Nume utilizator - - - Acest nume de utilizator este deja folosit. Va rugam alegeti alt nume. - - - Utilizatori si grupuri - - - Versiunea - - - Versiunea - Vertical - - Selectarea volumului si limitei de erori + + Configuratie - - Atentie + + Resp - - Contor de apa + + Stergere - - Date contor de apa + + Golire vas masurare - - Seria contoarelor + + Cantarire - - Tip contor de apa + + Reglare debit verificare + + + Verificare efectuata + + + Pregatire verificare + + + Umplere instalatie + + + Proces + + + in curs + + + Clasa metrologica + + + Producator + + + Qn Contoare de apa - - seria + + Imprimanta - - da + + Versiunea + + + Nr. Instalatie + + + <nimic de configurat> + + + Umpleti instalatia cu apa? + + + Nu + + + Intrebare da - - resetare + + String conexiune + + + Creare BD + + + Tip baza de date + + + Instalatia este asistata de acest PC + + + Nume instalatie + + + Utilizatori si grupuri + + + Date contor de apa + + + Tip contor de apa + + + Mod + + + Parametri + + + Tip + + + Configurare componente instalatie + + + Pregatiri + + + Stergere tabele + + + Redenumire tabel + + + Putere [%] + + + STOP-AVARIE + + + sfarsit-pregatire + + + Start-Pregatire + + + Start pregatire verif. + + + Stop pregatire verif. + + + Adauga + + + Elimina + + + Elimina toate + + + Rezultatele selectate: + + + Alimentati cu apa instalatia? + + + Mesaj + + + deschide valva + + + Contor de apa + + + Seria contoarelor + + + Initializare sistem + + + Timp + + + Stabilizare [s] + + + mai putin + + + mai mult + + + Se impune repormirea programului pentru a validarea noilor setari + + + Rezultatele se vor pierde. Doriti sa continuati? + + + PID + + + Debitmetru + + + Timeout + + + Combinat + + + Aparat + + + Imprimanta + + + Ecranare + + + Data + + + Numar serie + + + Putere pompa + + + Calibrare + + + Eroarea [%] + + + Pornire pompa + + + Reglare presiune apa + + + Presiune max [bar] + + + Presiune min [bar] + + + Selectare domen. Pres + + + Scurgere_timp [s] + + + Pmax_timp[s] + + + se inchide vana de alimentare, se opreste pompa + + + Numărul proiectului + + + C.mediue:Umiditate + + + C.mediue:Presiune + + + C.mediue:Temperatura + + + Data si timpul + + + T stab debit start[s] + + + Densitate + + + Nr. contoare intr-un grup + + + Comunicatie + + + Qt + + + Adresa + + + Evaluare + + + Limba + + + Date Instlatie + + + Selectare componente + + + Setare baza de date + + + Instalatii: + + + Despre test + + + Versiunea + + + Editare_utilizator + + + Grupuri + + + Administrare utilizatori + + + Eroare + + + Ignora + + + Reincercati + + + Rezultate + + + Masa Volum @@ -822,12 +798,15 @@ Corectii + + Debit + + + Presiune + Rezultat - - Rezultate - Evaporare @@ -837,10 +816,40 @@ Voltage - - Numărul proiectului - Save Communication + + rece + + + fierbinte + + + Q de la [l/h] + + + Q pana la [l/h] + + + Debit setat Q [m3/h] + + + Durata + + + Metrolog: + + + seria + + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.ru.resx b/TBF/Resources/Strings.ru.resx index c823348c7..1bb6a3835 100644 --- a/TBF/Resources/Strings.ru.resx +++ b/TBF/Resources/Strings.ru.resx @@ -117,9 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Активность - Подтверждение @@ -183,6 +180,12 @@ P вниз + + Q от + + + Q до + Ссылка @@ -240,9 +243,6 @@ - - Масса - Добавить @@ -264,12 +264,6 @@ OK - - Расход - - - Давление - Имя пользователя @@ -384,12 +378,6 @@ Выход - - Q от [л/ч] - - - Q до [л/ч] - Тип сокращ. @@ -399,9 +387,6 @@ Toler. red. [%] - - Время теста [с] - Ошибка при создании базы данных. Причина: @@ -525,9 +510,6 @@ Относительный Q до - - Заданный Q [м3/ч] - Комбинированные счетчики @@ -618,6 +600,9 @@ Переключение потока + + Активность + Прогресс @@ -888,7 +873,7 @@ Qпониж - + Серийный номер @@ -939,6 +924,9 @@ Заказ + + Номер проекта + Относительная влажность окружающей среды @@ -966,9 +954,6 @@ Старт - - температура [°C] - Плотность @@ -996,12 +981,6 @@ Qt - - холодный - - - горячий - Вода @@ -1110,9 +1089,6 @@ ID - - Сфокусировать - Захватить @@ -1203,6 +1179,9 @@ Mass diff. [kg]: + + Масса + Счетчик @@ -1242,9 +1221,6 @@ Target ref. count: - - Заданный объем [л]: - Сохранить ширину столбцов @@ -1296,9 +1272,6 @@ Печатать результатов водосчетчиков - - Снова - Отправлено @@ -1383,9 +1356,6 @@ Изменено - - Типы испытываемых счетчиков - Заметки @@ -1557,6 +1527,57 @@ Код пользователя + + Сброс весов + + + Коррекция + + + Расход + + + Давление + + + Результат + + + испарение + + + Строка 1 + + + Current + + + Voltage + + + холодный + + + горячий + + + Метод испытаний 2 + + + Типы испытываемых счетчиков + + + Краткое описание + + + Q от [л/ч] + + + Q до [л/ч] + + + Заданный Q [м3/ч] + P вверх конец @@ -1569,43 +1590,31 @@ P вниз начало - - Q от + + Заданный объем [л]: - - Q до + + Время теста [с] + + + температура [°C] + + + Сфокусировать Продолжается распознавание - - Строка 1 + + Снова - - Метод испытаний 2 + + - - Краткое описание + + - - Коррекция - - - Сброс весов - - - Результат - - - испарение - - - Current - - - Voltage - - - Номер проекта + + \ No newline at end of file diff --git a/TBF/Resources/Strings.sk.resx b/TBF/Resources/Strings.sk.resx index ec3e3a6a7..d29c07921 100644 --- a/TBF/Resources/Strings.sk.resx +++ b/TBF/Resources/Strings.sk.resx @@ -117,33 +117,51 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Činnosť + + Chyba + + + Senzor Zrušiť - - Združený + + Áno + + + Ukončiť Združené vodomery - - Chyba + + Činnosť + + + Združený + + + Sériové číslo + + + Číslo projektu Jazyk - - Áno + + Cesty - - Hlavica bola vypnutá používateľom + + Merač Zlyhala RFID komunikácia + + Hlavica bola vypnutá používateľom + Hladina @@ -156,15 +174,9 @@ Strana - - Merač - Výsledok - - Senzor - Stlmiť sirénu @@ -217,9 +229,6 @@ Výrobná zákazka a sériové čísla - - Sériové číslo - Sériové čísla @@ -235,19 +244,19 @@ Naozaj chcete vymazať všetky kódy ? - - Ukončiť - - - Cesty - - - Číslo projektu - Zobraz dialóg Ulož komunikáciu + + + + + + + + + \ No newline at end of file diff --git a/TBF/Resources/Strings.zh-CN.resx b/TBF/Resources/Strings.zh-CN.resx index 49c2c95e3..c10a02c9c 100644 --- a/TBF/Resources/Strings.zh-CN.resx +++ b/TBF/Resources/Strings.zh-CN.resx @@ -117,435 +117,114 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - <无> - - - (离线) - - - 关于校验台框架 - - - 活动 - - - 加入 Add> - - - 添加 Add - - - 地址 - - - 调整正在进行 - - - 管理员 - - - 环境湿度 - - - 环境压力 - - - 环境温度 - - - 未处理的错误发生 - - - 批准 - - - 批准日期 - - - 认证身份 - - - 审批信息 - - - 批准人 - - - 已测试水表安排 - - - 测试安排 - - - 温度[°C] - - - 辅助: - - - 辅助水表 - - - 辅助水表状态 - - - 辅助水表序列号 - - - 可用组件: - - - 可用的结果: - - - <Back 返回 - - - 平衡 - - - 工作台 - - - 校验台不在运行,但你可以更改设置来解决问题。 - - - 试验台名称冲突,请使用其他名称 - - - 工作台参数 - - - 构建日期 {0} - - - 校准专员 - - - 相机错误 - - - 取消 Cancel - - - 清除结果 - - - 清除 Clear - - - close - - - 关闭放空阀 - - - 关闭 Close - - - 关闭输入阀,关闭水泵 - - - - - - 组合水表 - - - 组合的 - - - 通讯 - - - 部件 - - - 配置 - - - 设置 - - - 设置校验台(需要密码) - 确认 - - 连接字符串 - - - 复制 Copy - - - 版权所有 ©2013 - {0} - - - 更正 - - - 创建数据库 - - - 数据 - - - 数据库设置 - - - 数据库类型 - - - 日期和时间 - - - 数据库创建成功! - - - 该数据库将被覆盖 - - - 密度 - - - 描述 - - - 检测完成 - - - 检测不合格 - - - 检测阈值[%] - - - 设备 - - - 错误 - - - 分流 - - - 要继续吗? - 是否要保存该程序? - - 向下 Down - - - 泄漏持续时间[秒] - - - 最大压力持续时间[秒] - - - 持续时间[秒] - - - 编辑 Edit - - - 紧急停止 - - - 排空 - - - 排空({0}:步骤 {1}/{2}) - - - 排空水箱 - - - 排空阀门 - - - 结束 - - - 结束条件 - - - 结束状态 - - - 输入密码 - - - 错误 修正 - [%] - - - 错误 修正 + [%] - - - 错误范围 - [%] - - - 错误范围 + [%] - 错误 Error 从数据库加载用户错误: - - 错误[%] - - - 建立数据库出错。原因: - - - 评估 - - - 退出 Exit - - - NOK - 无法创建一个数据库样例: 无法导出数据库: - - 进料 - - - 将校验台装满水? - - - 完成 Finish - - - 流量 - - - 流量选择 - - - 流量计 - - - 从水箱中获取水的质量 - - - 实验室负责人 - - - 横向 - - - - - - 更改将丢失。想继续吗? - - - 忽略 - - - 忽略 Ignore - - - 无效的密码 - 无效的用户名,密码,或工作台 - - 正在进行Iperl通信 + + 密码 - - 语言 + + 请选择一个校验台 - - 少 Less + + 必须重新启动以使改变生效 - - 加载程序 + + 校验台 - - 锁定 Lock + + 用户名 - - 日志 + + 警告 Warning - - 主要的 + + close - - 主要水表 + + 分流 - - 主要水表状态 - - - 主要水表序列号 - - - 维护专员 - - - 排空水箱 - - - 质量 - - - 测量质量 - - - 已测量的 - - - 测量重量 - - - 信息 - - - 测试方法 - - - 测试方法选择 - - - 计量等级 - - - 计量者 - - - 计量 - - - 模式 - - - 更多 More + + 排空阀门 名称 + + open + + + 水泵 + + + 升高压力 + + + 降低压力 + + + Q起始点 + + + Q终止 + + + 参考 + + + 调节阀门 + + + 平衡 + + + 传感器 + + + T转换 + + + T 入 + + + T出 + + + 压力表 + + + 持续时间[秒] + + + 没有 no + + + 是的 yes + 压力台 压力输入 - - - 复制 - PQ @@ -558,92 +237,215 @@ 测试 Test - - 新的转换名 - - - 新标签 New - - - 下一页 Next> - - - 没有 no - - - 程序中未设置校验台。 - - - 没有 No - - - 无法连接到数据库。 - - - <未设置> - - - 通知 Notification + + - 复制 数量 - - 一组中的水表数量: + + 添加 Add + + + 取消 Cancel + + + 关闭 Close + + + 锁定 Lock + + + 删除 Remove + + + 解锁 Unlock 好 OK - - open + + 用户名 + + + 用户登录 + + + 复制 Copy + + + 向下 Down + + + 编辑 Edit + + + 向上 Up + + + 无法连接到数据库。 + + + 设置校验台(需要密码) + + + 退出 Exit + + + 修改 + + + 输入密码 + + + 无效的密码 + + + 试验台名称冲突,请使用其他名称 + + + 数据库创建成功! + + + 该数据库将被覆盖 + + + 要继续吗? + + + 通知 Notification + + + 程序中未设置校验台。 + + + 描述 + + + 程序 + + + 程序 + + + 测试 + + + 更正 + + + 已测量的 + + + 测试 + + + 校验台不在运行,但你可以更改设置来解决问题。 + + + 排空 + + + Q-设置方法 + + + 重复次数 + + + 测试 + + + 归零 + + + 工作台 + + + 错误 修正 - [%] + + + 错误 修正 + [%] + + + 错误范围 - [%] + + + 错误范围 + [%] + + + 进料 输出 - - 升高压力 + + 完成类型 - - 结束升高压力 + + 传感器 - - 开始升高压力 + + 弦误差。红色。 [%] - - 降低压力 + + 建立数据库出错。原因: - - 结束降低压力 - - - 开始降低压力 - - - - - - 参数 - - - 主体 - - - 部分 - - - 好 OK - - - 密码 - - - PID + + 计量 请更改以下设置: - - 请选择一个周期,测试或放空 + + 属性 + + + 未处理的错误发生在 + + + 用户 + + + (离线) + + + 管理员 + + + 校准专员 + + + 实验室负责人 + + + 维护专员 + + + 计量者 + + + 测试者 + + + 测试专员 + + + 关闭放空阀 + + + 从水箱中获取水的质量 + + + 忽略 + + + 加载程序 + + + 排空水箱 + + + 测量质量 请选择一个过程 @@ -651,251 +453,26 @@ 请选择一个测试 - - 请选择一个校验台 - - - 功率[%] - - - 压力 - - - 压力高值[bar] - - - 压力低值[bar] - - - 压力表 - - - 压力选择 - - - 以前的结果 - - - 打印机 - - - 打印机 - - - 程序 - - - 程序{0}添加。 - - - 程序{0}修改。 - - - 程序 - - - 制造者 - - - 产品名称 - - - 程序需要重新启动以应用某些设置 - - - 进度 - - - 属性 - - - 协议 - - - 发布 - - - 每升脉冲 - - - 水泵 - - - 水泵功率[%] - - - 将校验台装满水? - 净化 - - 净化({0}:步骤{1}/{2}) - - - 采购订单 - - - Q起始点 [l/h] - - - Q起始点 - - - Q-设置方法 - - - Q终止点 [l/h] - - - Q终止 - - - Q下降 - - - Qmin - - - Qn - - - Q上升 - - - Qt - - - 问题 - - - 变化率[%] - 准备完毕 - - 完成类型 - - - 参考 - - - 调节阀门 - - - Q相对值起始点 - - - Q相对值终止点 - - - 剩余时间 - - - <&删除 - - - << 删除所有 - - - 删除 Remove - - - 删除标签 Remove Tab - - - 重命名标签 Rename Tab - - - 重复次数 - - - 必须重新启动以使改变生效 - - - 重试 - - - 重试数据库连接 Retry - - - 修改 - - - 进行中的ROI检测 - - - 屏幕 - - - - - - 选择组件 - - - 已选结果 : - - - 传感器 - - - 传感器 - - - 传感器 - - - 序列号 - 设置流量 设置路径 - - 设置流量 - - - 设置水压 - - - 展示循环和形态 - - - 同时进行以下步骤 - - - 同时进行之前步骤 - - - 单个的 - - - 启动 - 启动水泵 开始测试 - - 启动系统 - - - 启动相机 - - - 启动水泵 - - - 开启阀门 - - - 状态 + + 停止 停止水泵 @@ -903,47 +480,185 @@ 停止测试 - - 停止 + + 涂上焦油 - - 设定的开始测试前停止水流 + + 测试进行中 - - 抑制水表颤音 + + <Back 返回 + + + 完成 Finish + + + 下一页 Next> + + + 流量选择 + + + 测试名称 + + + 测试方法 + + + Q相对值起始点 + + + Q相对值终止点 + + + 组合水表 + + + 检测阈值[%] + + + 变化率[%] + + + 每升脉冲 + + + 部件 + + + <无> + + + 测试方法选择 + + + 传感器 + + + 测试方法 + + + 音量和误差区间选择 + + + 清除结果 + + + 设置 + + + 已测试水表安排 + + + 测试安排 + + + 横向 + + + 测试列 + + + 测试行 + + + 垂直 + + + 配置 + + + NOK + + + 好 OK + + + 清除 Clear + + + 排空水箱 + + + 测量重量 + + + 设置流量 + + + 测试完成 + + + 测试准备 + + + 净化({0}:步骤{1}/{2}) + + + 排空({0}:步骤 {1}/{2}) 切换流量检测 - - 切换点 + + 活动 - - T转换 + + 进度 - - T 入 + + 请选择一个周期,测试或放空 - - T出 + + 审批信息 - - 目标Q值[m3/h] + + 计量等级 - - 涂上焦油 + + 制造者 - - 测试 + + Qn - - 校验台 + + 水表 - - 校验台组件配置 + + 打印机 - - 校验台数据 + + 版本 + + + 测试台编号 + + + <未设置> + + + 将校验台装满水? + + + 没有 No + + + 问题 + + + 是的 Yes + + + 工作台参数 + + + 连接字符串 + + + 创建数据库 + + + 数据库类型 校验台数据库说明 @@ -954,35 +669,68 @@ 校验台名称 - - 测试台编号 - - - 校验台: - - - 测试完成 - 测试连接 - - 测试 + + 用户和组别 - - 测试进行中 + + 水表数据 - - 测试 + + 水表类型 - - 测试方法 + + 日志 - - 测试名称 + + 模式 - - 测试准备 + + 参数 + + + 主体 + + + 类型 + + + 校验台组件配置 + + + 转换 + + + 新标签 New + + + 删除标签 Remove Tab + + + 重命名标签 Rename Tab + + + 新的转换名 + + + 功率[%] + + + 检测完成 + + + 紧急停止 + + + 转换 - 结束 + + + 转换 - 启动 + + + 启动相机 测试开始({0}:步{1}/{2}) @@ -990,122 +738,332 @@ 测试停止({0}:步{1}/{2}) - - 测试时间[秒] + + 加入 Add> - - 测试者 + + 可用的结果: - - 测试专员 + + <&删除 - - 测试列 + + << 删除所有 - - 测试行 + + 已选结果 : - - T停止 - [秒] + + 抑制水表颤音 - - T - 启动[秒] + + 将校验台装满水? - - 超时 + + 信息 - - 弦误差。红色。 [%] + + 开启阀门 - - 转换 - 结束 + + 错误 - - 转换 - - - 转换 - 启动 - - - 类型 - - - 不确定性[%] - - - 未处理的错误发生在 - - - 解锁 Unlock - - - 向上 Up - - - 用户 - - - 用户登录 - - - 用户名 - - - 用户名 - - - 用户和组别 - - - 版本 - - - 版本 {0} - - - 垂直 - - - 音量和误差区间选择 - - - 警告 Warning - - - + + 设定的开始测试前停止水流 水表 - - 水表数据 - 水表序列号和状态 水表状态 - - 水表类型 - - - 水表 - 序列号: 状态[升] - - 是的 yes + + 检测不合格 - - 是的 Yes + + 相机错误 - - 归零 + + 启动系统 + + + 剩余时间 + + + + + + T停止 - [秒] + + + 少 Less + + + 更多 More + + + 程序需要重新启动以应用某些设置 + + + 更改将丢失。想继续吗? + + + PID + + + 流量计 + + + 部分 + + + 超时 + + + 组合的 + + + 设备 + + + 打印机 + + + 屏幕 + + + 单个的 + + + 辅助水表 + + + 辅助水表状态 + + + 数据 + + + 结束状态 + + + 主要水表 + + + 主要水表状态 + + + 协议 + + + Q下降 + + + Q上升 + + + 序列号 + + + 状态 + + + 切换点 + + + 辅助水表序列号 + + + 主要水表序列号 + + + 水泵功率[%] + + + 调整正在进行 + + + 错误[%] + + + 启动水泵 + + + 设置水压 + + + 压力高值[bar] + + + 压力低值[bar] + + + 压力选择 + + + 泄漏持续时间[秒] + + + 最大压力持续时间[秒] + + + 关闭输入阀,关闭水泵 + + + 采购订单 + + + 环境湿度 + + + 环境压力 + + + 环境温度 + + + 批准 + + + 日期和时间 + + + + + + T - 启动[秒] + + + 结束 + + + 启动 + + + 密度 + + + 一组中的水表数量: + + + 展示循环和形态 + + + 结束条件 + + + 通讯 + + + 辅助: + + + 主要的 + + + Qmin + + + Qt + + + + + + 产品名称 + + + 地址 + + + 批准日期 + + + 认证身份 + + + 批准人 + + + 评估 + + + 发布 + + + 同时进行以下步骤 + + + 同时进行之前步骤 + + + 正在进行Iperl通信 + + + 语言 + + + 校验台数据 + + + 可用组件: + + + 选择组件 + + + 数据库设置 + + + 校验台: + + + 关于校验台框架 + + + 构建日期 {0} + + + 版权所有 ©2013 - {0} + + + 版本 {0} + + + 未处理的错误发生 + + + 忽略 Ignore + + + 重试数据库连接 Retry + + + 程序{0}添加。 + + + 程序{0}修改。 + + + 进行中的ROI检测 + + + 重试 + + + 不确定性[%] + + + 以前的结果 工作台 Bench @@ -1122,9 +1080,6 @@ 工作台 - 路径 - - 重点 - 抓取 @@ -1134,6 +1089,9 @@ 相机 + + 质量 + 创建者 @@ -1146,12 +1104,6 @@ 变更历史记录 - - 最后修改者 - - - 测试仪表型号 - 记录 @@ -1185,6 +1137,12 @@ 更正 + + 流量 + + + 压力 + 重试 @@ -1197,4 +1155,55 @@ Voltage + + + + + + + + 测试仪表型号 + + + Q起始点 [l/h] + + + Q终止点 [l/h] + + + 目标Q值[m3/h] + + + 结束升高压力 + + + 开始升高压力 + + + 结束降低压力 + + + 开始降低压力 + + + 测试时间[秒] + + + 温度[°C] + + + 重点 + + + 最后修改者 + + + + + + + + + + \ No newline at end of file diff --git a/TBF/Rig/DataEntry/StandardCamera/ProcParams.cs b/TBF/Rig/DataEntry/StandardCamera/ProcParams.cs index d4c891e95..5c5f14111 100644 --- a/TBF/Rig/DataEntry/StandardCamera/ProcParams.cs +++ b/TBF/Rig/DataEntry/StandardCamera/ProcParams.cs @@ -1,17 +1,22 @@ -/// +using Common; +using Config.Entities; +using log4net; + +/// /// Copyright (c) 2022 Sensus Slovensko a.s. /// +using System; using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Rig.Generic; namespace TBF.Rig.DataEntry.StandardCamera { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public string OcrWorkspace; /// Path to a Cognex workspace file @@ -92,28 +97,42 @@ namespace TBF.Rig.DataEntry.StandardCamera return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - /// - /// Parameterless constructor initializes the parameters - /// - public ProcParams() + return false; + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() { } diff --git a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/ProcParams.cs b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/ProcParams.cs index 0fc76aeef..36edf5176 100644 --- a/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/ProcParams.cs +++ b/TBF/Rig/DataEntry/StandartCameraPurchaseOrder/ProcParams.cs @@ -1,17 +1,22 @@ -/// +using Common; +using Config.Entities; +using log4net; +using System; + +/// /// Copyright (c) 2022 Sensus Slovensko a.s. /// using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Rig.Generic; namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public string OcrWorkspace; /// Path to a Cognex workspace file @@ -92,28 +97,42 @@ namespace TBF.Rig.DataEntry.StandartCameraPurchaseOrder return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - /// - /// Parameterless constructor initializes the parameters - /// - public ProcParams() + return false; + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() { } diff --git a/TBF/Rig/DataEntry/Uni/ProcParams.cs b/TBF/Rig/DataEntry/Uni/ProcParams.cs index b2f21007a..3fce4e9ba 100644 --- a/TBF/Rig/DataEntry/Uni/ProcParams.cs +++ b/TBF/Rig/DataEntry/Uni/ProcParams.cs @@ -1,17 +1,22 @@ -/// +using Common; +using Config.Entities; +using log4net; +using System; + +/// /// Copyright (c) 2022-2023 Sensus Slovensko a.s. /// using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Rig.Generic; namespace TBF.Rig.DataEntry.Uni { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public string OcrWorkspace; /// Path to a Cognex workspace file @@ -92,28 +97,42 @@ namespace TBF.Rig.DataEntry.Uni return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - /// - /// Parameterless constructor initializes the parameters - /// - public ProcParams() + return false; + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() { } diff --git a/TBF/Rig/Generic/IProcedureParams.cs b/TBF/Rig/Generic/IProcedureParams.cs index 5fc3ba6cf..c8f35f9f2 100644 --- a/TBF/Rig/Generic/IProcedureParams.cs +++ b/TBF/Rig/Generic/IProcedureParams.cs @@ -7,7 +7,7 @@ namespace TBF.Rig.Generic { public interface IProcedureParams { - void UpdateFromDbEntity(ComponentProcedure dbEntity); + bool UpdateFromDbEntity(ComponentProcedure dbEntity); void FromDbEntity(string componentName, Procedure procedure); ComponentProcedure ToDbEntity(string componentName, Procedure procedure); } diff --git a/TBF/Rig/GenericDevices/IRegReader.cs b/TBF/Rig/GenericDevices/IRegReader.cs index 1aca96ba5..04197ab2c 100644 --- a/TBF/Rig/GenericDevices/IRegReader.cs +++ b/TBF/Rig/GenericDevices/IRegReader.cs @@ -9,12 +9,11 @@ namespace TBF.Rig.GenericDevices Common.RegisterReaderType RegisterReaderType { get; } int Position { get; } - double PulsesPerLtr { get; } /// [imp/l] ... water meter or volume measurement part of a heat meter + double PulsesPerLtr { get; set; } /// [imp/l] ... water meter or volume measurement part of a heat meter double LtrsPerPulse { get; } /// [l/imp] - - int WMPulses { get; } /// Counted pulses of the water meter + string QuantityUnits { get; set; } /// dm3, kg, etc + int WMPulses { get; } /// Counted pulses of the water meter int WMRefPulses { get; } /// 'Gated' reference pulses of the water meters - double WMVolume { get; } /// Counted volume of the water meter double BeginWMState { get; } /// Test begin state of the water meter double EndWMState { get; } /// Test end state of the water meter diff --git a/TBF/Rig/Modbus/TempControl/Easytherm/ProcParams.cs b/TBF/Rig/Modbus/TempControl/Easytherm/ProcParams.cs index 05be1b3b9..eb7eec43e 100644 --- a/TBF/Rig/Modbus/TempControl/Easytherm/ProcParams.cs +++ b/TBF/Rig/Modbus/TempControl/Easytherm/ProcParams.cs @@ -1,10 +1,13 @@ -/// +using Common; +using Config.Entities; +using log4net; +using System; + +/// /// Copyright (c) 2017-2022 Sensus Slovensko a.s. /// using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Resources; using TBF.Rig.Generic; using TBF.Rig.Sequences; @@ -13,6 +16,8 @@ namespace TBF.Rig.Modbus.TempControl.Easytherm { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -127,9 +132,9 @@ namespace TBF.Rig.Modbus.TempControl.Easytherm return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) { - if (dbEntity == null) return; + if (dbEntity == null) return false; try { ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; @@ -138,10 +143,24 @@ namespace TBF.Rig.Modbus.TempControl.Easytherm componentName = dbEntity.CmpntName; procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; } - catch + catch (Exception ex) { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; } } diff --git a/TBF/Rig/Modbus/TempControl/Novus/ProcParams.cs b/TBF/Rig/Modbus/TempControl/Novus/ProcParams.cs index e6682742a..268f0b375 100644 --- a/TBF/Rig/Modbus/TempControl/Novus/ProcParams.cs +++ b/TBF/Rig/Modbus/TempControl/Novus/ProcParams.cs @@ -1,10 +1,13 @@ -/// +using Common; +using Config.Entities; +using log4net; +using System; + +/// /// Copyright (c) 2022 Sensus Slovensko a.s. /// using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Resources; using TBF.Rig.Generic; using TBF.Rig.Sequences; @@ -12,8 +15,10 @@ using TBF.Rig.Sequences; namespace TBF.Rig.Modbus.TempControl.Novus { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double Temp_A; /// [°C] Target temperature for a tempe. controller or 0=not communicated to the controller @@ -127,28 +132,42 @@ namespace TBF.Rig.Modbus.TempControl.Novus return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - /// - /// Parameterless constructor initializes the parameters - /// - public ProcParams() + return false; + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() { } diff --git a/TBF/Rig/Network/Camera/Roi/ProcedureParams.cs b/TBF/Rig/Network/Camera/Roi/ProcedureParams.cs index 00e516e41..1915ef2dc 100644 --- a/TBF/Rig/Network/Camera/Roi/ProcedureParams.cs +++ b/TBF/Rig/Network/Camera/Roi/ProcedureParams.cs @@ -1,20 +1,23 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2017 Sensus Metering Systems /// using System; using System.IO; using System.Text; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.Network.Camera.Roi { public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcedureParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// [l^-1] @@ -114,25 +117,39 @@ namespace TBF.Rig.Network.Camera.Roi return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - public ProcedureParams() { } + return false; + } + } + + public ProcedureParams() { } public ProcedureParams(bool initialize) { diff --git a/TBF/Rig/Network/Camera/Roi/Roi.cs b/TBF/Rig/Network/Camera/Roi/Roi.cs index 3075eff49..a59484015 100644 --- a/TBF/Rig/Network/Camera/Roi/Roi.cs +++ b/TBF/Rig/Network/Camera/Roi/Roi.cs @@ -39,8 +39,13 @@ namespace TBF.Rig.Network.Camera.Roi } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.Camera; } } - public double PulsesPerLtr { get { return RoiCfg.ProcParams.PulsesPerLtr; } } - public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public double PulsesPerLtr + { + get { return RoiCfg.ProcParams.PulsesPerLtr; } + set { RoiCfg.ProcParams.PulsesPerLtr = value; } + } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public string QuantityUnits { get; set; } int cameraPulses; int pulsesDelta; /// = (WMPulses - cameraPulses) ... WMPulses = cameraPulses + pulsesDelta, Clear() calculates pulsesDelta diff --git a/TBF/Rig/Network/Camera/RoiForFixedStart/ProcedureParams.cs b/TBF/Rig/Network/Camera/RoiForFixedStart/ProcedureParams.cs index 4bb6276de..4ca43c668 100644 --- a/TBF/Rig/Network/Camera/RoiForFixedStart/ProcedureParams.cs +++ b/TBF/Rig/Network/Camera/RoiForFixedStart/ProcedureParams.cs @@ -1,18 +1,23 @@ -/// +using Common; +using Config.Entities; +using log4net; +using System; + +/// /// Copyright (c) 2017 Sensus Metering Systems /// using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.Network.Camera.RoiForFixedStart { public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcedureParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// [l^-1] @@ -80,25 +85,39 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStart return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - public ProcedureParams() { } + return false; + } + } + + public ProcedureParams() { } public ProcedureParams(bool initialize) { diff --git a/TBF/Rig/Network/Camera/RoiForFixedStart/Roi.cs b/TBF/Rig/Network/Camera/RoiForFixedStart/Roi.cs index 50bbc86e8..2549942be 100644 --- a/TBF/Rig/Network/Camera/RoiForFixedStart/Roi.cs +++ b/TBF/Rig/Network/Camera/RoiForFixedStart/Roi.cs @@ -36,11 +36,16 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStart } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.Manual; } } - public double PulsesPerLtr { get { return roiCfg.ProcParams.PulsesPerLtr; } } - public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public double PulsesPerLtr + { + get { return roiCfg.ProcParams.PulsesPerLtr; } + set { roiCfg.ProcParams.PulsesPerLtr = value; } + } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public string QuantityUnits { get; set; } - double beginWMState; + double beginWMState; public double BeginWMState { get { return beginWMState; } diff --git a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs index f36571ebe..6de7a9062 100644 --- a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs +++ b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/ProcedureParams.cs @@ -1,18 +1,23 @@ -/// +using Common; +using Config.Entities; +using log4net; +using System; + +/// /// Copyright (c) 2017 Sensus Metering Systems /// using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11 { public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcedureParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// [l^-1] @@ -80,25 +85,39 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11 return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - public ProcedureParams() { } + return false; + } + } + + public ProcedureParams() { } public ProcedureParams(bool initialize) { diff --git a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs index 5f2b47fc7..6c29ec345 100644 --- a/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs +++ b/TBF/Rig/Network/Camera/RoiForFixedStartCJMS11/Roi.cs @@ -36,11 +36,15 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartCJMS11 } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.Manual; } } - public double PulsesPerLtr { get { return roiCfg.ProcParams.PulsesPerLtr; } } - public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public double PulsesPerLtr + { + get { return roiCfg.ProcParams.PulsesPerLtr; } + set { roiCfg.ProcParams.PulsesPerLtr = value; } + } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public string QuantityUnits { get; set; } - - double beginWMState; + double beginWMState; public double BeginWMState { get { return beginWMState; } diff --git a/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/ProcedureParams.cs b/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/ProcedureParams.cs index acc0adbe0..62482034e 100644 --- a/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/ProcedureParams.cs +++ b/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/ProcedureParams.cs @@ -1,18 +1,22 @@ -/// +using Common; +using Config.Entities; +using log4net; +using System; +/// /// Copyright (c) 2017 Sensus Metering Systems /// using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.Network.Camera.RoiForFixedStartKeyence { public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcedureParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// [l^-1] @@ -80,23 +84,37 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartKeyence return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } + } public ProcedureParams() { } diff --git a/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/Roi.cs b/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/Roi.cs index 53f43243d..f75cbbcb9 100644 --- a/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/Roi.cs +++ b/TBF/Rig/Network/Camera/RoiForFixedStartKeyence/Roi.cs @@ -38,11 +38,16 @@ namespace TBF.Rig.Network.Camera.RoiForFixedStartKeyence } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.Manual; } } - public double PulsesPerLtr { get { return roiCfg.ProcParams.PulsesPerLtr; } } - public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public double PulsesPerLtr + { + get { return roiCfg.ProcParams.PulsesPerLtr; } + set { roiCfg.ProcParams.PulsesPerLtr = value; } + } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public string QuantityUnits { get; set; } - double beginWMState; + double beginWMState; public double BeginWMState { get { return beginWMState; } diff --git a/TBF/Rig/Output/DB/SensusOracle/ProcedureParams.cs b/TBF/Rig/Output/DB/SensusOracle/ProcedureParams.cs index 7e904b97d..9050d4d3c 100644 --- a/TBF/Rig/Output/DB/SensusOracle/ProcedureParams.cs +++ b/TBF/Rig/Output/DB/SensusOracle/ProcedureParams.cs @@ -16,7 +16,7 @@ using TBF.Resources; namespace TBF.Rig.Output.DB.SensusOracle { public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { + { private static readonly ILog log = LogManager.GetLogger(typeof(ProcedureParams)); public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; @@ -267,27 +267,40 @@ namespace TBF.Rig.Output.DB.SensusOracle return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch (Exception exc) - { - log.ErrorFormat("Failed to UpdateFromDbEntity({0}): {1}", dbEntity, exc.Message); - } - } - + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - public ProcedureParams() + return false; + } + } + + + public ProcedureParams() { } diff --git a/TBF/Rig/ProcedureParamsBase.cs b/TBF/Rig/ProcedureParamsBase.cs index 3e998cced..e2328e42e 100644 --- a/TBF/Rig/ProcedureParamsBase.cs +++ b/TBF/Rig/ProcedureParamsBase.cs @@ -43,8 +43,9 @@ namespace TBF.Rig } /// To be overridden - public virtual void UpdateFromDbEntity(ComponentProcedure dbEntity) + public virtual bool UpdateFromDbEntity(ComponentProcedure dbEntity) { + return false; } public void FromDbEntity(string cmpntName, Procedure procedure) diff --git a/TBF/Rig/RegisterReaders/DataStream/Reader/ProcParams.cs b/TBF/Rig/RegisterReaders/DataStream/Reader/ProcParams.cs index 9edd743af..f3be998bb 100644 --- a/TBF/Rig/RegisterReaders/DataStream/Reader/ProcParams.cs +++ b/TBF/Rig/RegisterReaders/DataStream/Reader/ProcParams.cs @@ -1,12 +1,13 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2022 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Resources; using TBF.Rig.Generic; using TBF.Rig.Sequences; @@ -22,6 +23,8 @@ namespace TBF.Rig.RegisterReaders.DataStream.Reader public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -183,9 +186,9 @@ namespace TBF.Rig.RegisterReaders.DataStream.Reader return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) { - if (dbEntity == null) return; + if (dbEntity == null) return false; try { ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; @@ -194,10 +197,24 @@ namespace TBF.Rig.RegisterReaders.DataStream.Reader componentName = dbEntity.CmpntName; procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; } - catch + catch (Exception ex) { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; } } diff --git a/TBF/Rig/RegisterReaders/DataStream/Reader/Reader.cs b/TBF/Rig/RegisterReaders/DataStream/Reader/Reader.cs index 9bac33b72..34844af08 100644 --- a/TBF/Rig/RegisterReaders/DataStream/Reader/Reader.cs +++ b/TBF/Rig/RegisterReaders/DataStream/Reader/Reader.cs @@ -33,8 +33,13 @@ namespace TBF.Rig.RegisterReaders.DataStream.Reader readonly ReaderCfg myCfg; public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.DataStream; } } public int Position { get { return (myCfg != null) ? myCfg.Position : 1; } } - public double PulsesPerLtr { get { return 1.0; } } + public double PulsesPerLtr + { + get { return 1.0; } + set { } + } public double LtrsPerPulse { get { return 1.0; } } + public string QuantityUnits { get; set; } public UnitsSource UnitsSource { get { return (myCfg != null && myCfg.ProcParams != null) ? myCfg.ProcParams.UnitsSource : UnitsSource.AsDefined; } } public Common.Unit AsDefTimeUnit { get { return (myCfg != null && myCfg.ProcParams != null) ? myCfg.ProcParams.TimeUnit : Common.Unit.s; } } diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/FrequencyRegisterReader.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/FrequencyRegisterReader.cs index 0d0e15e36..149081f9c 100644 --- a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/FrequencyRegisterReader.cs +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/FrequencyRegisterReader.cs @@ -17,8 +17,15 @@ namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB public int Position { get{ return rrCfg.Position; } } public Common.RegisterReaderType RegisterReaderType { get { return Common.RegisterReaderType.Pulses; } } - public double PulsesPerLtr { get { return rrCfg.ProcParams.PulsesPerLtr; } } - public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); ; } } + + public double PulsesPerLtr + { + get { return rrCfg.ProcParams.PulsesPerLtr; } + set { rrCfg.ProcParams.PulsesPerLtr = value; } + } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public string QuantityUnits { get; set; } + public int Filter { get { return rrCfg.ProcParams.Filter; } } public int WMPulses { get { return cb.PulsesWM(Position); } } diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRProcParams.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRProcParams.cs index 228c8a8c3..bcad9f57e 100644 --- a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRProcParams.cs +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRProcParams.cs @@ -1,3 +1,6 @@ +using Common; +using Config.Entities; +using log4net; /// /// Copyright (c) 2021 Sensus Slovensko a.s. /// @@ -5,16 +8,16 @@ using System; using System.IO; using System.Text; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB { public class RRProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(RRProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// [l^-1] @@ -94,26 +97,40 @@ namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - RRProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as RRProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + RRProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as RRProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } - + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - public RRProcParams() + return false; + } + } + + + public RRProcParams() { } diff --git a/TBF/Rig/RegisterReaders/IPerlReader/implementations/SmartReader.cs b/TBF/Rig/RegisterReaders/IPerlReader/implementations/SmartReader.cs index 7c34fe550..f7b05fcf7 100644 --- a/TBF/Rig/RegisterReaders/IPerlReader/implementations/SmartReader.cs +++ b/TBF/Rig/RegisterReaders/IPerlReader/implementations/SmartReader.cs @@ -484,6 +484,7 @@ namespace TBF.Rig.RegisterReaders.IPerlReader.implementations public double PulsesPerLtr { get { return 1000.0; } + set { PulsesPerLtr = value; } } public double LtrsPerPulse @@ -491,6 +492,8 @@ namespace TBF.Rig.RegisterReaders.IPerlReader.implementations get { return 1 / PulsesPerLtr; } } + public string QuantityUnits { get; set; } + public int WMPulses { get { return wmPulses; } diff --git a/TBF/Rig/RegisterReaders/KPackE/RegisterReader/ProcedureParams.cs b/TBF/Rig/RegisterReaders/KPackE/RegisterReader/ProcedureParams.cs index 3a3b62739..4df525fa3 100644 --- a/TBF/Rig/RegisterReaders/KPackE/RegisterReader/ProcedureParams.cs +++ b/TBF/Rig/RegisterReaders/KPackE/RegisterReader/ProcedureParams.cs @@ -1,20 +1,23 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2018 Sensus Slovensko a.s. /// using System; using System.IO; using System.Text; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.RegisterReaders.KPackE.RegisterReader { public class ProcedureParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcedureParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcedureParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// Target low limit of the flow increase or decrease @@ -82,26 +85,40 @@ namespace TBF.Rig.RegisterReaders.KPackE.RegisterReader return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcedureParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcedureParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } + } - public ProcedureParams() + public ProcedureParams() { } diff --git a/TBF/Rig/RegisterReaders/KPackE/RegisterReader/RegisterReader.cs b/TBF/Rig/RegisterReaders/KPackE/RegisterReader/RegisterReader.cs index 84055e80a..5a49f6f33 100644 --- a/TBF/Rig/RegisterReaders/KPackE/RegisterReader/RegisterReader.cs +++ b/TBF/Rig/RegisterReaders/KPackE/RegisterReader/RegisterReader.cs @@ -29,8 +29,12 @@ namespace TBF.Rig.RegisterReaders.KPackE.RegisterReader } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.Manual; } } - public double PulsesPerLtr { get { return rrCfg.ProcParams.PulsesPerLtr; } } + public double PulsesPerLtr { + get { return rrCfg.ProcParams.PulsesPerLtr; } + set { rrCfg.ProcParams.PulsesPerLtr = value; } + } public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public string QuantityUnits { get; set; } /// /// Writen to by DataEntryForRadio component diff --git a/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonProcParams.cs b/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonProcParams.cs index 697c30c77..778883d87 100644 --- a/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonProcParams.cs +++ b/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonProcParams.cs @@ -1,16 +1,21 @@ -using System.IO; -using System.Xml.Serialization; using Common; using Config.Entities; +using log4net; +using System; +using System.IO; +using System.Xml.Serialization; using TBF.Resources; using TBF.Rig.Generic; using TBF.Rig.RegisterReaders.SerialStream; + namespace TBF.Rig.RegisterReaders.PoseidonCmdStartStop { public class PoseidonProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PoseidonProcParams) })[0]; + private static readonly ILog log = LogManager.GetLogger(typeof(PoseidonProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(PoseidonProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public StreamType StreamType; /// Enumerated stream type @@ -250,9 +255,9 @@ namespace TBF.Rig.RegisterReaders.PoseidonCmdStartStop return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) { - if (dbEntity == null) return; + if (dbEntity == null) return false; try { PoseidonProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as PoseidonProcParams; @@ -261,11 +266,25 @@ namespace TBF.Rig.RegisterReaders.PoseidonCmdStartStop componentName = dbEntity.CmpntName; procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) { - } + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } } diff --git a/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonReader.cs b/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonReader.cs index dd6f2ebdd..7451e9cb6 100644 --- a/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonReader.cs +++ b/TBF/Rig/RegisterReaders/PoseidonCmdStartStop/PoseidonReader.cs @@ -93,10 +93,14 @@ namespace TBF.Rig.RegisterReaders.PoseidonCmdStartStop } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.DataStream; } } - public double PulsesPerLtr { get { return 1000.0; } } + public double PulsesPerLtr { + get { return 1000.0;} + set { PulsesPerLtr = value; } + } public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + public string QuantityUnits { get; set; } - /// + /// /// Wrappers for procedure parameters /// public StreamType StreamType { get { return (registerReaderCfg.ProcParams != null) ?registerReaderCfg.ProcParams.StreamType : StreamType.None; } } diff --git a/TBF/Rig/RegisterReaders/PoseidonReader/ProcParams.cs b/TBF/Rig/RegisterReaders/PoseidonReader/ProcParams.cs index 29b02ff2c..478646d27 100644 --- a/TBF/Rig/RegisterReaders/PoseidonReader/ProcParams.cs +++ b/TBF/Rig/RegisterReaders/PoseidonReader/ProcParams.cs @@ -1,8 +1,10 @@ +using Common; +using Config.Entities; +using log4net; +using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Rig.Generic; using TBF.Rig.RegisterReaders.CommonRR; @@ -10,7 +12,8 @@ namespace TBF.Rig.RegisterReaders.PoseidonReader { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams { - + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -146,22 +149,36 @@ namespace TBF.Rig.RegisterReaders.PoseidonReader return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } } diff --git a/TBF/Rig/RegisterReaders/PoseidonReader/SmartReader.cs b/TBF/Rig/RegisterReaders/PoseidonReader/SmartReader.cs index 4d7da189a..d296ee0d5 100644 --- a/TBF/Rig/RegisterReaders/PoseidonReader/SmartReader.cs +++ b/TBF/Rig/RegisterReaders/PoseidonReader/SmartReader.cs @@ -400,8 +400,12 @@ namespace TBF.Rig.RegisterReaders.PoseidonReader double wmVolume; double wmTestTime; - public double PulsesPerLtr { get { return 1000.0; } } + public double PulsesPerLtr { + get { return 1000.0; } + set { PulsesPerLtr = value; } + } public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + public string QuantityUnits { get; set; } public int WMPulses { get { return wmPulses; } } public int WMRefPulses { get { return wmRefPulses; }} public double WMVolume { get { return wmVolume; } } diff --git a/TBF/Rig/RegisterReaders/PoseidonReader/implementations/PoseidonReader.cs b/TBF/Rig/RegisterReaders/PoseidonReader/implementations/PoseidonReader.cs index aaecb32c3..b24c9204b 100644 --- a/TBF/Rig/RegisterReaders/PoseidonReader/implementations/PoseidonReader.cs +++ b/TBF/Rig/RegisterReaders/PoseidonReader/implementations/PoseidonReader.cs @@ -121,8 +121,12 @@ namespace TBF.Rig.RegisterReaders.PoseidonReader.implementations private double _endWmState ; - public double PulsesPerLtr { get => _pulsesPerLtr; } + public double PulsesPerLtr { + get => _pulsesPerLtr; + set => _pulsesPerLtr = value; + } public double LtrsPerPulse { get => _ltrsPerPulse; } + public string QuantityUnits { get; set; } public int WMPulses { get => _wmPulses; } public int WMRefPulses { get =>_wmRefPulses; } public double WMVolume { get =>_wmVolume; } diff --git a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfg.cs b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfg.cs index d822dbd48..80d089181 100644 --- a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfg.cs +++ b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfg.cs @@ -21,8 +21,8 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB /// public int Position; /// 1..nrWaterMeters - /// Procedure parameters - [XmlIgnore] + /// Procedure parameters + [XmlIgnore] public RRProcParams ProcParams; public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } public override IParamsProvider CreateProcParamsProvider() { return new RRProcParams(true); } diff --git a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.cs b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.cs index f0c23779c..8fe50cd12 100644 --- a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.cs +++ b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.cs @@ -63,14 +63,14 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB nameTextBox.Text = config.Name; parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; positionTextBox.Text = config.Position.ToString(); - } + } public void Unlock() { nameTextBox.Enabled = true; parentNameComboBox.Enabled = true; positionTextBox.Enabled = true; - } + } public CfgUpdateFlags VerifyCfg(ref string message) { diff --git a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.designer.cs b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.designer.cs index 6d8fb3d6f..82961c366 100644 --- a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.designer.cs +++ b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRCfgCtrl.designer.cs @@ -31,92 +31,92 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB /// private void InitializeComponent() { - this.positionTextBox = new System.Windows.Forms.TextBox(); - this.positionLabel = new System.Windows.Forms.Label(); - this.parentNameLabel = new System.Windows.Forms.Label(); - this.nameTextBox = new System.Windows.Forms.TextBox(); - this.nameLabel = new System.Windows.Forms.Label(); - this.componentNameLabel = new System.Windows.Forms.Label(); - this.parentNameComboBox = new System.Windows.Forms.ComboBox(); - this.SuspendLayout(); - // - // positionTextBox - // - this.positionTextBox.Enabled = false; - this.positionTextBox.Location = new System.Drawing.Point(136, 119); - this.positionTextBox.Name = "positionTextBox"; - this.positionTextBox.Size = new System.Drawing.Size(46, 20); - this.positionTextBox.TabIndex = 6; - // - // positionLabel - // - this.positionLabel.AutoSize = true; - this.positionLabel.Location = new System.Drawing.Point(26, 122); - this.positionLabel.Name = "positionLabel"; - this.positionLabel.Size = new System.Drawing.Size(44, 13); - this.positionLabel.TabIndex = 5; - this.positionLabel.Text = "Position"; - // - // parentNameLabel - // - this.parentNameLabel.AutoSize = true; - this.parentNameLabel.Location = new System.Drawing.Point(26, 96); - this.parentNameLabel.Name = "parentNameLabel"; - this.parentNameLabel.Size = new System.Drawing.Size(69, 13); - this.parentNameLabel.TabIndex = 3; - this.parentNameLabel.Text = "Parent Name"; - // - // nameTextBox - // - this.nameTextBox.Enabled = false; - this.nameTextBox.Location = new System.Drawing.Point(136, 67); - this.nameTextBox.Name = "nameTextBox"; - this.nameTextBox.Size = new System.Drawing.Size(130, 20); - this.nameTextBox.TabIndex = 2; - // - // nameLabel - // - this.nameLabel.AutoSize = true; - this.nameLabel.Location = new System.Drawing.Point(26, 70); - this.nameLabel.Name = "nameLabel"; - this.nameLabel.Size = new System.Drawing.Size(35, 13); - this.nameLabel.TabIndex = 1; - this.nameLabel.Text = "Name"; - // - // componentNameLabel - // - this.componentNameLabel.AutoSize = true; - this.componentNameLabel.Location = new System.Drawing.Point(133, 43); - this.componentNameLabel.Name = "componentNameLabel"; - this.componentNameLabel.Size = new System.Drawing.Size(83, 13); - this.componentNameLabel.TabIndex = 0; - this.componentNameLabel.Text = "ComonentName"; - // - // parentNameComboBox - // - this.parentNameComboBox.Enabled = false; - this.parentNameComboBox.FormattingEnabled = true; - this.parentNameComboBox.Location = new System.Drawing.Point(136, 93); - this.parentNameComboBox.Name = "parentNameComboBox"; - this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); - this.parentNameComboBox.TabIndex = 4; - // - // RegisterReaderCfgCtrl - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.parentNameComboBox); - this.Controls.Add(this.positionTextBox); - this.Controls.Add(this.positionLabel); - this.Controls.Add(this.parentNameLabel); - this.Controls.Add(this.nameTextBox); - this.Controls.Add(this.nameLabel); - this.Controls.Add(this.componentNameLabel); - this.Name = "RegisterReaderCfgCtrl"; - this.Size = new System.Drawing.Size(300, 200); + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(136, 119); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(26, 122); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(26, 96); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(136, 67); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(26, 70); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(133, 43); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(136, 93); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // RRCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "RRCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); this.Load += new System.EventHandler(this.RegisterReaderCfgCtrl_Load); this.ResumeLayout(false); - this.PerformLayout(); + this.PerformLayout(); } @@ -129,5 +129,5 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB private System.Windows.Forms.Label nameLabel; private System.Windows.Forms.Label componentNameLabel; private System.Windows.Forms.ComboBox parentNameComboBox; - } + } } diff --git a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRProcParams.cs b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRProcParams.cs index 4f56095b4..212f24411 100644 --- a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRProcParams.cs +++ b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RRProcParams.cs @@ -1,45 +1,86 @@ -/// +using Common; +using Config.Entities; +using log4net; +using SharedComponents; + +/// /// Copyright (c) 2021 Sensus Slovensko a.s. /// using System; +using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Text; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.RegisterReaders.PulsesFromUniCB { public class RRProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; + private static readonly ILog log = LogManager.GetLogger(typeof(RRProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// [l^-1] + public string Units; /// [kg^-1]...MF public int Filter; public override void InitializeAll() { PulsesPerLtr = 1.0; + Units = "---"; //...MF Filter = 0; } string[] paramNames = new string[] { - Strings.PulsesPerLtr, + //Strings.PulsesPerLtr, + Strings.PulsesPerUnit, + Strings.Units, Strings.Filter, }; - public override string ParamName(int i) { return paramNames[i]; } + + //...MF + private void RefreshParamNames(int i) { + if (i == 0) + { + if (Units == "kg") paramNames[0] = Strings.PulsesPerKilogram; + else if (Units == "dm3") paramNames[0] = Strings.PulsesPerLtr; + else paramNames[0] = Strings.PulsesPerLtr; + } + } + + + public override string ParamName(int i) + { + //if(i==0) RefreshParamNames(0);//...MF + return paramNames[i]; + } public override int ParamsCount() { return paramNames.Length; } - public override string ToString(int i) + public ICollection ParamValues(int ix) + { + var values = new List(); + switch (ix) + { + case 1: + for (PulsesTypeByQuantity m = 0; m < PulsesTypeByQuantity.Count; m++) values.Add(m.ToDescription()); + return values; + default: + return null; + } + } + + public override string ToString(int i) { switch (i) { case 0: return PulsesPerLtr.ToString(); - case 1: return Filter.ToString(); + case 1: return Units; + case 2: return Filter.ToString(); default: return string.Empty; } } @@ -50,7 +91,8 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB switch (i) { case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; - case 1: Filter = int.Parse(strValue); return CfgUpdateFlags.None; + case 1: Units = strValue; return CfgUpdateFlags.None; + case 2: Filter = int.Parse(strValue); return CfgUpdateFlags.None; default: return CfgUpdateFlags.None; } } @@ -67,8 +109,9 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB case 0: if (Utils.TryParseUDouble(strValue, out dummy)) return true; break; - case 1: + return true; + case 2: if (int.TryParse(strValue, out idummy) && (idummy >= 0)) return true; break; @@ -84,6 +127,7 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB void CopyContentTo(RRProcParams prms) { prms.PulsesPerLtr = this.PulsesPerLtr; + prms.Units = this.Units; //...MF prms.Filter = this.Filter; } @@ -94,9 +138,9 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) { - if (dbEntity == null) return; + if (dbEntity == null) return false; try { RRProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as RRProcParams; @@ -105,13 +149,34 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB componentName = dbEntity.CmpntName; procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) { - } + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + LiveLogDiag.Log1( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } } - public RRProcParams() { @@ -129,4 +194,17 @@ namespace TBF.Rig.RegisterReaders.PulsesFromUniCB this.procedure = procedure; } } + + /// + /// Diagnostic logging MF + /// Activated by compilation condition: DIAG_ENDURANCE_xyz + /// + static class LiveLogDiag + { + [Conditional("DIAG_LOG_MASS1")] + public static void Log1(string format, params object[] args) + { + LiveLogCache.Instance.AddLog(string.Format(format, args)); + } + } } diff --git a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RegisterReader.cs b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RegisterReader.cs index b122aa1fa..956b83a63 100644 --- a/TBF/Rig/RegisterReaders/PulsesFromUniCB/RegisterReader.cs +++ b/TBF/Rig/RegisterReaders/PulsesFromUniCB/RegisterReader.cs @@ -7,41 +7,46 @@ using log4net; namespace TBF.Rig.RegisterReaders.PulsesFromUniCB { - public class RegisterReader : ComponentBase, GenericDevices.IRegReader - { - private static readonly ILog log = LogManager.GetLogger(typeof(RegisterReader)); + public class RegisterReader : ComponentBase, GenericDevices.IRegReader + { + private static readonly ILog log = LogManager.GetLogger(typeof(RegisterReader)); public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } readonly RRCfg rrCfg; readonly TBF.Rig.ControlBoard.IControlBoard cb; - public int Position { get { return rrCfg.Position; } } /// 1 .. ProcessData.WMsCount + public int Position { get { return rrCfg.Position; } } /// 1 .. ProcessData.WMsCount public Common.RegisterReaderType RegisterReaderType { get { return Common.RegisterReaderType.Pulses; } } - public double PulsesPerLtr { get { return rrCfg.ProcParams.PulsesPerLtr; } } - public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); ; } } + public double PulsesPerLtr + { + get => rrCfg.ProcParams.PulsesPerLtr; + set => rrCfg.ProcParams.PulsesPerLtr = value; + } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); ; } } + public string QuantityUnits { get { return rrCfg.ProcParams.Units; } set { rrCfg.ProcParams.Units = value; } } public int Filter { get { return rrCfg.ProcParams.Filter; } } public int WMPulses { get { return cb.PulsesWM(Position); } } public int WMRefPulses { get { return cb.RefPulsesWM(Position); } } public double WMVolume { get { return LtrsPerPulse * Convert.ToDouble(WMPulses); } } - public double BeginWMState { get { return 0; } } /// Always 0 - public double EndWMState { get { return WMVolume; } } /// Derived from WMVolume + public double BeginWMState { get { return 0; } } /// Always 0 + public double EndWMState { get { return WMVolume; } } /// Derived from WMVolume - public RegisterReader() { } + public RegisterReader() { } - public RegisterReader(Generic.IComponentCfg cfg, IList components) - : base(cfg) - { - rrCfg = cfg as RRCfg; + public RegisterReader(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + rrCfg = cfg as RRCfg; - cb = TbfComponents.FindComponent(cfg.ParentName, components) as TBF.Rig.ControlBoard.IControlBoard; - if (cb == null) throw new Exception("Cannot find " + Name + " parent"); + cb = TbfComponents.FindComponent(cfg.ParentName, components) as TBF.Rig.ControlBoard.IControlBoard; + if (cb == null) throw new Exception("Cannot find " + Name + " parent"); log.Warn(this.ToString()); - } + } public override void Initialize() { } } diff --git a/TBF/Rig/RegisterReaders/S640Stream/S640Stream.cs b/TBF/Rig/RegisterReaders/S640Stream/S640Stream.cs index 6a301d193..d5d2e6626 100644 --- a/TBF/Rig/RegisterReaders/S640Stream/S640Stream.cs +++ b/TBF/Rig/RegisterReaders/S640Stream/S640Stream.cs @@ -25,8 +25,12 @@ namespace TBF.Rig.RegisterReaders.S640Stream public int Position { get { return myCfg.Position; } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.DataStream; } } - public double PulsesPerLtr { get { return 1000.0; } } + public double PulsesPerLtr { + get { return 1000.0; } + set { PulsesPerLtr = value; } + } public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + public string QuantityUnits { get; set; } public Unit VolumeUnits { get { return Unit.ml; } } public double VolumeScaleFactor { get { return 1; } } public Unit TimeUnits { get { return Unit.ms; } } diff --git a/TBF/Rig/RegisterReaders/SerialStream/ProcParams.cs b/TBF/Rig/RegisterReaders/SerialStream/ProcParams.cs index 89e88135a..d09e99386 100644 --- a/TBF/Rig/RegisterReaders/SerialStream/ProcParams.cs +++ b/TBF/Rig/RegisterReaders/SerialStream/ProcParams.cs @@ -1,18 +1,21 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2018 Sensus Slovensko a.s. /// using System; using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Rig.Generic; namespace TBF.Rig.RegisterReaders.SerialStream { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -252,26 +255,40 @@ namespace TBF.Rig.RegisterReaders.SerialStream return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } + } - public ProcParams() + public ProcParams() { } diff --git a/TBF/Rig/RegisterReaders/SerialStream/SerialStream.cs b/TBF/Rig/RegisterReaders/SerialStream/SerialStream.cs index e304327a9..25281edde 100644 --- a/TBF/Rig/RegisterReaders/SerialStream/SerialStream.cs +++ b/TBF/Rig/RegisterReaders/SerialStream/SerialStream.cs @@ -34,9 +34,12 @@ namespace TBF.Rig.RegisterReaders.SerialStream } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.DataStream; } } - public double PulsesPerLtr { get { return 1000.0; } } + public double PulsesPerLtr { + get { return 1000.0; } + set { PulsesPerLtr = value; } + } public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } - + public string QuantityUnits { get; set; } /// /// Wrappers for procedure parameters diff --git a/TBF/Rig/RegisterReaders/StandingStartStop/RRProcParams.cs b/TBF/Rig/RegisterReaders/StandingStartStop/RRProcParams.cs index 5715799c3..b0c6ed40e 100644 --- a/TBF/Rig/RegisterReaders/StandingStartStop/RRProcParams.cs +++ b/TBF/Rig/RegisterReaders/StandingStartStop/RRProcParams.cs @@ -1,42 +1,79 @@ -/// +using Common; +using Config.Entities; +using log4net; +using SharedComponents; + +/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; +using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Text; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.RegisterReaders.StandingStartStop { public class RRProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(RRProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public double PulsesPerLtr; /// Target low limit of the flow increase or decrease + public string Units; /// [kg^-1]...MF - public override void InitializeAll() + public override void InitializeAll() { PulsesPerLtr = 1.0; - } + Units = "---"; //...MF + } string[] paramNames = new string[] { - Strings.PulsesPerLtr, + //Strings.PulsesPerLtr, + Strings.PulsesPerUnit,//...MF + Strings.Units,//...MF }; - public override string ParamName(int i) { return paramNames[i]; } + + //...MF + private void RefreshParamNames(int i) + { + if (i == 0) + { + if (Units == "kg") paramNames[0] = Strings.PulsesPerKilogram; + else if (Units == "dm3") paramNames[0] = Strings.PulsesPerLtr; + else paramNames[0] = Strings.PulsesPerLtr; + } + } + + public override string ParamName(int i) { return paramNames[i]; } public override int ParamsCount() { return paramNames.Length; } - public override string ToString(int i) + public ICollection ParamValues(int ix) + { + var values = new List(); + switch (ix) + { + case 1: + for (PulsesTypeByQuantity m = 0; m < PulsesTypeByQuantity.Count; m++) values.Add(m.ToDescription()); + return values; + default: + return null; + } + } + + public override string ToString(int i) { switch (i) { case 0: return PulsesPerLtr.ToString(); - default: return string.Empty; + case 1: return Units;//...MF + default: return string.Empty; } } @@ -46,6 +83,7 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop switch (i) { case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + case 1: Units = strValue; return CfgUpdateFlags.None; default: return CfgUpdateFlags.None; } } @@ -61,7 +99,9 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop case 0: if (Utils.TryParseUDouble(strValue, out dummy)) return true; break; - default: + case 1: + return true; + default: message = "Invalid index"; return false; } @@ -73,7 +113,8 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop void CopyContentTo(RRProcParams prms) { prms.PulsesPerLtr = this.PulsesPerLtr; - } + prms.Units = this.Units; //...MF + } public IParamsProvider Clone() { @@ -82,9 +123,9 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) { - if (dbEntity == null) return; + if (dbEntity == null) return false; try { RRProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as RRProcParams; @@ -93,12 +134,26 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop componentName = dbEntity.CmpntName; procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } + } public RRProcParams() @@ -116,4 +171,17 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop this.componentName = componentName; } } + + /// + /// Diagnostic logging MF + /// Activated by compilation condition: DIAG_ENDURANCE_xyz + /// + static class LiveLogDiag + { + [Conditional("DIAG_LOG_MASS1")] + public static void Log1(string format, params object[] args) + { + LiveLogCache.Instance.AddLog(string.Format(format, args)); + } + } } diff --git a/TBF/Rig/RegisterReaders/StandingStartStop/RegisterReader.cs b/TBF/Rig/RegisterReaders/StandingStartStop/RegisterReader.cs index e1f380d41..af15ff9e5 100644 --- a/TBF/Rig/RegisterReaders/StandingStartStop/RegisterReader.cs +++ b/TBF/Rig/RegisterReaders/StandingStartStop/RegisterReader.cs @@ -28,11 +28,16 @@ namespace TBF.Rig.RegisterReaders.StandingStartStop } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.Manual; } } - public double PulsesPerLtr { get { return registerReaderCfg.ProcParams.PulsesPerLtr; } } - public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public double PulsesPerLtr + { + get { return registerReaderCfg.ProcParams.PulsesPerLtr; } + set { } + } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); } } + public string QuantityUnits { get; set; } - double beginWMState; + double beginWMState; public double BeginWMState { get { return beginWMState; } diff --git a/TBF/Rig/RegisterReaders/iPerlASICReader/implementations/SmartReader.cs b/TBF/Rig/RegisterReaders/iPerlASICReader/implementations/SmartReader.cs index 3a8b95229..28b42e19f 100644 --- a/TBF/Rig/RegisterReaders/iPerlASICReader/implementations/SmartReader.cs +++ b/TBF/Rig/RegisterReaders/iPerlASICReader/implementations/SmartReader.cs @@ -484,12 +484,15 @@ namespace TBF.Rig.RegisterReaders.iPerlASICReader.implementations public double PulsesPerLtr { get { return 1000.0; } + set { PulsesPerLtr = value; } } public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } + + public string QuantityUnits { get; set; } public int WMPulses { diff --git a/TBF/Rig/RegisterReaders/iPerlReaderUNI/ProcParams.cs b/TBF/Rig/RegisterReaders/iPerlReaderUNI/ProcParams.cs index 5522ef00d..a52b2e8e8 100644 --- a/TBF/Rig/RegisterReaders/iPerlReaderUNI/ProcParams.cs +++ b/TBF/Rig/RegisterReaders/iPerlReaderUNI/ProcParams.cs @@ -1,8 +1,10 @@ +using Common; +using Config.Entities; +using log4net; +using System; using System.Collections.Generic; using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Rig.Generic; using TBF.Rig.RegisterReaders.CommonRR; @@ -10,7 +12,8 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams { - + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -146,22 +149,36 @@ namespace TBF.Rig.RegisterReaders.iPerlReaderUNI return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + + return false; + } } diff --git a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs index c1206bd20..62e2cb0e4 100644 --- a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +++ b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs @@ -1,20 +1,23 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2013-2021 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; +using System.IO; using System.Text; -using log4net; -using Common; -using Config.Entities; -using TBF.Rig; +using System.Xml.Serialization; using TBF.Boxes; using TBF.Resources; -using TBF.UiBridge; +using TBF.Rig; using TBF.Rig.GenericDevices; using TBF.Rig.RegisterReaders.PoseidonReader; using TBF.Rig.RegisterReaders.PoseidonReader.implementations; using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; +using TBF.UiBridge; +using TBF.Rig.RegisterReaders.PulsesFromUniCB; namespace TBF.Rig.TestMethods.FlyingStartMassCollection { @@ -708,7 +711,21 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection tstRslt.Flow = 3.6 * tstRslt.VolumeCTV / tstRslt.TestTime; /// Flow from VolumeCTV and time tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); tstRslt.ConstMaster = (tstRslt.PulsesMaster != 0) ? (tstRslt.VolumeCTV / tstRslt.PulsesMaster) : tstRslt.ConstMasterCorr; - /// Master pulses per liter from the measured mass + /// Master pulses per liter from the measured mass + + /// Main result calculation for mass + tstRslt.MassCTV = tstRslt.Batch.Buoyancy * mass; + if ((outPath.Diverter != null) && (tstRslt.TestTime > float.Epsilon)) + { + tstRslt.TestTimeCorrection = outPath.Diverter.TestTimeCorrection(flowMID); + tstRslt.MassCTV *= tstRslt.TestTime + tstRslt.TestTimeCorrection; + tstRslt.MassCTV /= tstRslt.TestTime; + } + tstRslt.MassFlow = 3.6 * tstRslt.MassCTV / tstRslt.TestTime; /// Flow from MassCTV and time + tstRslt.MassErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.MassCTV); + tstRslt.MassConstMaster = (tstRslt.PulsesMaster != 0) ? (tstRslt.MassCTV / tstRslt.PulsesMaster) : tstRslt.ConstMasterCorr; + + /// Flow statistics correction tstRslt.FlowMean = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Average / tstRslt.ConstMasterRaw); tstRslt.FlowStart = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.First / tstRslt.ConstMasterRaw); @@ -915,8 +932,36 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection if (meterRslt != null && regReader != null) { meterRslt.RegReaderType = (int)regReader.RegisterReaderType; - meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; - meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); + ComponentProcedure procParamsEntity = test.Procedure.GetProcedureParamsEntity(regReader.Name); + + try + { + if (regReader.RegisterReaderType == RegisterReaderType.Pulses) + { + XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; + RRProcParams tmp = Serializer.Deserialize(new StringReader(procParamsEntity.Parameters.ToString())) as RRProcParams; + regReader.PulsesPerLtr = tmp.PulsesPerLtr; + regReader.QuantityUnits = tmp.Units; + } + else + { + //MessageBox.Show("Cannot create or initialize a printer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + } + } + catch (Exception ex) + { + /*log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + );*/ + } + + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr;//...MF 11.12.2025 toto chybalo, v .csv bol stlpec naplneny nulami + meterRslt.QuantityUnits = regReader.QuantityUnits; + meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); if (dstrReader != null) { @@ -1050,26 +1095,50 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection /// Normal measurement meterRslt.TestTime = cBrd.TestTimeWM(regReader.Position); meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// [l] + meterRslt.MassRef = meterRslt.PulsesMaster * tstRslt.MassConstMaster; /// [kg] } else { /// None or one pulse from the water meter meterRslt.TestTime = tstRslt.TestTime; meterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] - } - - log.DebugFormat("Pulses: Pref4meter={0} Vmeter={1} Vref4meter={2} Ttime4meter={3} Ttime={4}", - meterRslt.PulsesMaster, - meterRslt.VolumeMeter, - meterRslt.VolumeRef, - meterRslt.TestTime, - tstRslt.TestTime); + meterRslt.MassRef = tstRslt.MassCTV; } - meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); - meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) - && (meterRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) - && (tstRslt.ErrorFlags == 0); + log.DebugFormat("Pulses: Pref4meter={0} Vmeter={1} Vref4meter={2} Mmeter={3} Mref4meter={4} Ttime4meter={5} Ttime={6}", + meterRslt.PulsesMaster, + meterRslt.VolumeMeter, + meterRslt.VolumeRef, + meterRslt.MassMeter, + meterRslt.MassRef, + meterRslt.TestTime, + tstRslt.TestTime); + } + + double Error = 0; + if (meterRslt.GetQuantityFromUnits() == "Mass") + Error = Formulas.ErrorFromVolumes(meterRslt.MassMeter, meterRslt.MassRef); + else + Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + + meterRslt.Error = Error; + + var ErrLimLo_Volume = test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime); + var ErrLimHi_Volume = test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime); + var ErrLimLo_Mass = test.GetErrLimLo(tstRslt.MassCTV, tstRslt.TestTime); + var ErrLimHi_Mass = test.GetErrLimHi(tstRslt.MassCTV, tstRslt.TestTime); + + bool Passed; + if (meterRslt.GetQuantityFromUnits() == "Mass") + Passed = (meterRslt.Error >= ErrLimLo_Volume + test.Uncertainty) && + (meterRslt.Error <= ErrLimHi_Volume - test.Uncertainty) && + (tstRslt.ErrorFlags == 0); + else + Passed = (meterRslt.Error >= ErrLimLo_Mass + test.Uncertainty) && + (meterRslt.Error <= ErrLimHi_Mass - test.Uncertainty) && + (tstRslt.ErrorFlags == 0); + + meterRslt.Passed = Passed; meterRslt.TestDone = true; tstRslt.TestDone = true; #if ORACLE_DB diff --git a/TBF/Rig/TestMethods/S640Communication/ProcParams.cs b/TBF/Rig/TestMethods/S640Communication/ProcParams.cs index 731375574..7b94bf908 100644 --- a/TBF/Rig/TestMethods/S640Communication/ProcParams.cs +++ b/TBF/Rig/TestMethods/S640Communication/ProcParams.cs @@ -1,4 +1,7 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2021 Sensus Slovensko a.s. /// using System; @@ -6,16 +9,16 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.TestMethods.S640Communication { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -324,28 +327,42 @@ namespace TBF.Rig.TestMethods.S640Communication return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - /// - /// Parameterless constructor initializes the parameters - /// - public ProcParams() + return false; + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() { } diff --git a/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs index 7bcab41c9..f6ab4bfae 100644 --- a/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs +++ b/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs @@ -13,6 +13,8 @@ using TBF.Resources; using TBF.Rig.GenericDevices; using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; using TBF.UiBridge; +using System.Xml.Serialization; +using TBF.Rig.RegisterReaders.PulsesFromUniCB; namespace TBF.Rig.TestMethods.StandingStartMassCollection { @@ -844,7 +846,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection double buoyancy = Formulas.Buoyancy(); double massOfEvaporatedWater = (double)(tMass2 - tMass1) * outPath.Scale.EvaporationRate(TempDivStat.Average); double volumeCTV = 1000.0 * buoyancy * (massEnd - massStart + massOfEvaporatedWater) / densityOut; - if (debugLevel == Common.DebugMode.Simulate) volumeCTV = test.Volume; + double massCTV = buoyancy * (massEnd - massStart + massOfEvaporatedWater); + if (debugLevel == Common.DebugMode.Simulate) volumeCTV = test.Volume; double refEnergy = Energy.Sum * volumeCTV / VolumeForEnergy.Sum; /// [J]=[J]*[l]/[l] @@ -1077,6 +1080,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection /// Main results tstRslt.VolumeCTV = volumeCTV; /// [l] 1000.0f is because density is in [kg/m3] tstRslt.Flow = 3.6 * volumeCTV / tstRslt.TestTime; /// [m3/h] + tstRslt.MassCTV = massCTV; /// [kg] 1000.0f is because density is in [kg/m3] + tstRslt.MassFlow = 3.6 * massCTV / tstRslt.TestTime; /// [kg/h] if (cBrd is ControlBoard.Uni.UniCB) { @@ -1085,6 +1090,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.Flow, tstRslt.TempDownMean); tstRslt.VolumeMaster = tstRslt.ConstMasterRaw * tstRslt.PulsesMaster; /// [l] volume from the master flow meter tstRslt.ConstMaster = (tstRslt.VolumeMaster != 0) ? (tstRslt.ConstMasterRaw * tstRslt.VolumeCTV / tstRslt.VolumeMaster) : tstRslt.ConstMasterCorr; + tstRslt.MassConstMaster = (tstRslt.PulsesMaster != 0) ? (tstRslt.MassCTV / tstRslt.PulsesMaster) : tstRslt.ConstMasterCorr; } else { @@ -1095,6 +1101,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection tstRslt.ConstMaster = 1; } tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + tstRslt.MassErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.MassCTV); tstRslt.FlowMean = (float)RefFlowStat.Average; tstRslt.FlowStart = (float)RefFlowStat.First; @@ -1244,18 +1251,72 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection if (meterRslt != null && regReader != null) { meterRslt.RegReaderType = (int)regReader.RegisterReaderType; - meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; + ComponentProcedure procParamsEntity = test.Procedure.GetProcedureParamsEntity(regReader.Name); + + try + { + if (regReader.RegisterReaderType == RegisterReaderType.Pulses || regReader.RegisterReaderType == RegisterReaderType.Manual) + { + XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; + RRProcParams tmp = Serializer.Deserialize(new StringReader(procParamsEntity.Parameters.ToString())) as RRProcParams; + regReader.PulsesPerLtr = tmp.PulsesPerLtr; + regReader.QuantityUnits = tmp.Units; + } + else + { + //MessageBox.Show("Cannot create or initialize a printer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); + } + } + catch (Exception ex) + { + /*log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + );*/ + } + + meterRslt.PulsesPerLiter = regReader.PulsesPerLtr;//...MF 11.12.2025 toto chybalo, v .csv bol stlpec naplneny nulami + meterRslt.QuantityUnits = regReader.QuantityUnits; meterRslt.VolumeStart = regReader.BeginWMState; meterRslt.VolumeEnd = regReader.EndWMState; meterRslt.VolumeMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); - meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + meterRslt.MassMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter + meterRslt.MassRef = tstRslt.MassCTV; /// kg meterRslt.PulsesMeter = meterRslt.VolumeMeter; meterRslt.PulsesMaster = tstRslt.PulsesMaster; meterRslt.TestTime = tstRslt.TestTime; - meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); - meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) + //meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + double Error = 0; + if (meterRslt.GetQuantityFromUnits() == "Mass") + Error = Formulas.ErrorFromVolumes(meterRslt.MassMeter, meterRslt.MassRef); + else + Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); + + meterRslt.Error = Error; + + /*meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) && (meterRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) - && (tstRslt.ErrorFlags == 0); + && (tstRslt.ErrorFlags == 0);*/ + var ErrLimLo_Volume = test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime); + var ErrLimHi_Volume = test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime); + var ErrLimLo_Mass = test.GetErrLimLo(tstRslt.MassCTV, tstRslt.TestTime); + var ErrLimHi_Mass = test.GetErrLimHi(tstRslt.MassCTV, tstRslt.TestTime); + + bool Passed; + if (meterRslt.GetQuantityFromUnits() == "Mass") + Passed = (meterRslt.Error >= ErrLimLo_Volume + test.Uncertainty) && + (meterRslt.Error <= ErrLimHi_Volume - test.Uncertainty) && + (tstRslt.ErrorFlags == 0); + else + Passed = (meterRslt.Error >= ErrLimLo_Mass + test.Uncertainty) && + (meterRslt.Error <= ErrLimHi_Mass - test.Uncertainty) && + (tstRslt.ErrorFlags == 0); + + meterRslt.Passed = Passed; meterRslt.TestDone = true; tstRslt.TestDone = true; if (regReader is ICommonRegReader regReaderCommon) diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs index 6f95a88d6..2df3887c2 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHead.cs @@ -89,9 +89,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead } } public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.DataStream; } } - public double PulsesPerLtr { get { return 1000.0; } } + public double PulsesPerLtr { + get { return 1000.0; } + set {PulsesPerLtr = value; } + } public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } } - + public string QuantityUnits { get; set; } public double CalibTarget { get { return iperlHeadCfg.ProcParams.CalibTarget; } } public ushort FactorLimitLo { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitLo; } } public ushort FactorLimitHi { get { return (ushort)iperlHeadCfg.ProcParams.FactorLimitHi; } } diff --git a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs index 56300811f..0fab699f5 100644 --- a/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs +++ b/TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/ProcParams.cs @@ -1,19 +1,22 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2015-2023 Sensus Slovensko a.s. /// using System; +using System.Collections.Generic; using System.IO; using System.Xml.Serialization; -using Common; -using Config.Entities; using TBF.Rig.Generic; -using System.Collections.Generic; namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public int WMType_ID; @@ -146,26 +149,39 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); + return false; + } + } - public ProcParams() + public ProcParams() { } diff --git a/TBF/Rig/WaterMeters/WaterMeter/ProcParams.cs b/TBF/Rig/WaterMeters/WaterMeter/ProcParams.cs index a57e968b3..4a4ba17e7 100644 --- a/TBF/Rig/WaterMeters/WaterMeter/ProcParams.cs +++ b/TBF/Rig/WaterMeters/WaterMeter/ProcParams.cs @@ -1,4 +1,7 @@ -/// +using Common; +using Config.Entities; +using log4net; +/// /// Copyright (c) 2013-2023 Sensus Slovensko a.s. /// using System; @@ -6,16 +9,16 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Xml.Serialization; -using Common; -using Config.Entities; -using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.Generic; namespace TBF.Rig.WaterMeters.WaterMeter { public class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams - { - public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProcParams)); + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -372,28 +375,42 @@ namespace TBF.Rig.WaterMeters.WaterMeter return pars; } - public override void UpdateFromDbEntity(ComponentProcedure dbEntity) - { - if (dbEntity == null) return; - try - { - ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; + public override bool UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return false; + try + { + ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams; - procedureParamsEntity = dbEntity; - componentName = dbEntity.CmpntName; - procedure = dbEntity.Procedure; + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; - if (tmp != null) tmp.CopyContentTo(this); - } - catch - { - } - } + if (tmp != null) + { + tmp.CopyContentTo(this); + return true; + } + else return false; + } + catch (Exception ex) + { + log.DebugFormat( + "Error during RRProcParams deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", + dbEntity?.CmpntName, + dbEntity?.Procedure, + dbEntity?.Parameters, + ex + ); - /// - /// Parameterless constructor initializes the parameters - /// - public ProcParams() + return false; + } + } + + /// + /// Parameterless constructor initializes the parameters + /// + public ProcParams() { } diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index 062ee596a..7d8ac14f6 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -17,6 +17,7 @@ false + 8 D:\_Sensus\Temp\Bin\ true Disk @@ -33,7 +34,6 @@ true true true - 8 true @@ -101,6 +101,9 @@ false + + false + ..\packages\Castle.Core.5.1.1\lib\net462\Castle.Core.dll @@ -1456,7 +1459,9 @@ - + + Component + diff --git a/end b/end new file mode 100644 index 000000000..e1e7747a4 --- /dev/null +++ b/end @@ -0,0 +1,2520 @@ +diff --git a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +index c1206bd20..261e8efad 100644 +--- a/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs ++++ b/TBF/Rig/TestMethods/FlyingStartMassCollection/FlyingStartMassCollectionSeq.cs +@@ -1,26 +1,28 @@ +-/// ++using Common; ++using Config.Entities; ++using log4net; ++/// + /// Copyright (c) 2013-2021 Sensus Slovensko a.s. + /// + using System; + using System.Collections.Generic; ++using System.IO; + using System.Text; +-using log4net; +-using Common; +-using Config.Entities; +-using TBF.Rig; ++using System.Xml.Serialization; + using TBF.Boxes; + using TBF.Resources; +-using TBF.UiBridge; ++using TBF.Rig; + using TBF.Rig.GenericDevices; + using TBF.Rig.RegisterReaders.PoseidonReader; + using TBF.Rig.RegisterReaders.PoseidonReader.implementations; + using TBF.Rig.Uni.SharedDialogs.SmartMetersCommunication.common; ++using TBF.UiBridge; +  + namespace TBF.Rig.TestMethods.FlyingStartMassCollection + { +- public class FlyingStartMassCollectionSeq : Sequences.SequenceBase ++ public class FlyingStartMassCollectionSeq : Sequences.SequenceBase + { +- private static readonly ILog log = LogManager.GetLogger(typeof(FlyingStartMassCollectionSeq)); ++ private static readonly ILog log = LogManager.GetLogger(typeof(FlyingStartMassCollectionSeq)); +  + ///  + /// Check capabilities of devces in the output path required for this test method +@@ -44,11 +46,11 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + } +  + if (test.Volume > devices.Scale.Capacity * Constants.TankFullFactor) +- { ++ { + /// Scale capacity is not sufficient + message = string.Format("{0}: {1}", test.Name, Strings.Test_volume_exceeds_the_scale_capacity); + return false; +- } ++ } +  + if (!(devices.Diverter is IDiverter)) + { +@@ -75,28 +77,28 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + return true; + } +  +- ///  +- /// Flying start mass collection method sequence +- ///  +- /// Test entity +- ///  +- /// Event.Done . . . . . . . OK +- /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP +- /// Event.OpArgumentError . Target flow is out of range +- /// Event.Error . . . . . . Unspecified error +- ///  +- public IList Execute(Test test, int repetitionNr, bool isLastRepetition, ++ ///  ++ /// Flying start mass collection method sequence ++ ///  ++ /// Test entity ++ ///  ++ /// Event.Done . . . . . . . OK ++ /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP ++ /// Event.OpArgumentError . Target flow is out of range ++ /// Event.Error . . . . . . Unspecified error ++ ///  ++ public IList Execute(Test test, int repetitionNr, bool isLastRepetition, + bool isDelayedStart, Compound.CombinedTestParams compoundTestParams, + HeatMeters.TestParams heatMetersTestParams, DebugMode debugLevel) +- { +- if (debugLevel == Common.DebugMode.Simulate) +- { +- return Simulate1(test, repetitionNr, isLastRepetition, compoundTestParams, heatMetersTestParams); +- } +- else if (debugLevel == Common.DebugMode.Inherit) +- { +- return Simulate2(test, repetitionNr, isLastRepetition, compoundTestParams, heatMetersTestParams); +- } ++ { ++ if (debugLevel == Common.DebugMode.Simulate) ++ { ++ return Simulate1(test, repetitionNr, isLastRepetition, compoundTestParams, heatMetersTestParams); ++ } ++ else if (debugLevel == Common.DebugMode.Inherit) ++ { ++ return Simulate2(test, repetitionNr, isLastRepetition, compoundTestParams, heatMetersTestParams); ++ } +  + ControlBoard.Uni.UniCB cBrd = StateMachine.ControlBoardMain as ControlBoard.Uni.UniCB; + IScale scale = cBrd.Devices.Scale as IScale; +@@ -131,30 +133,31 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + cBrd.SetFiltersPidShortPulses(filters, outPath.PidCoef, test.ShortPulses); +  + IList readTempPressOps = new List(); +- if(benchPath.TempMtrUp != null) readTempPressOps.Add(benchPath.TempMtrUp.ReadTempOp(ref TempUp)); +- if(benchPath.TempMtrDown != null) readTempPressOps.Add(benchPath.TempMtrDown.ReadTempOp(ref TempDown)); +- if(outPath.TempMtrDiv != null) readTempPressOps.Add(outPath.TempMtrDiv.ReadTempOp(ref TempDiv)); +- if(benchPath.PressMtrUp != null) readTempPressOps.Add(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)); +- if(benchPath.PressMtrDown != null) readTempPressOps.Add(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)); +- if(benchPath.PressMtrDelta != null) readTempPressOps.Add(benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)); +- if(benchPath.ElectricMtrUp != null) readTempPressOps.Add(benchPath.ElectricMtrUp.ReadPressureOp(ref ElectricUp)); +- if(benchPath.ElectricMtrDown != null) readTempPressOps.Add(benchPath.ElectricMtrDown.ReadPressureOp(ref ElectricDown)); +- if(benchPath.ElectricMtrDelta != null) readTempPressOps.Add(benchPath.ElectricMtrDelta.ReadPressureOp(ref ElectricDelta)); +- if(heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)); +- if(heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)); +- if(heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)); +- if(heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)); ++ if (benchPath.TempMtrUp != null) readTempPressOps.Add(benchPath.TempMtrUp.ReadTempOp(ref TempUp)); ++ if (benchPath.TempMtrDown != null) readTempPressOps.Add(benchPath.TempMtrDown.ReadTempOp(ref TempDown)); ++ if (outPath.TempMtrDiv != null) readTempPressOps.Add(outPath.TempMtrDiv.ReadTempOp(ref TempDiv)); ++ if (benchPath.PressMtrUp != null) readTempPressOps.Add(benchPath.PressMtrUp.ReadPressureOp(ref PressUp)); ++ if (benchPath.PressMtrDown != null) readTempPressOps.Add(benchPath.PressMtrDown.ReadPressureOp(ref PressDown)); ++ if (benchPath.PressMtrDelta != null) readTempPressOps.Add(benchPath.PressMtrDelta.ReadPressureOp(ref PressDelta)); ++ if (benchPath.ElectricMtrUp != null) readTempPressOps.Add(benchPath.ElectricMtrUp.ReadPressureOp(ref ElectricUp)); ++ if (benchPath.ElectricMtrDown != null) readTempPressOps.Add(benchPath.ElectricMtrDown.ReadPressureOp(ref ElectricDown)); ++ if (benchPath.ElectricMtrDelta != null) readTempPressOps.Add(benchPath.ElectricMtrDelta.ReadPressureOp(ref ElectricDelta)); ++ if (heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefWarm1.ReadTempOp(ref TempRefHi1)); ++ if (heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefWarm2.ReadTempOp(ref TempRefHi2)); ++ if (heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefCold1.ReadTempOp(ref TempRefLo1)); ++ if (heatMetersPath != null) readTempPressOps.Add(heatMetersPath.TMeterRefCold2.ReadTempOp(ref TempRefLo2)); +  + int totalPulses = Convert.ToInt32(test.Volume / outPath.FlowMeter.LtrPerPulse); +  + ///============================================================================================ +-  ++ + /// Read pressure and temperature once before calling Bridge.OnTestSelected(...) + State.Create(string.Format("{0}({1}) : Measuring process data", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +@@ -163,8 +166,8 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection +  + /// Start the test, initialize test results + Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, heatMetersPath)); +- string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); +- TestStartTime = DateTime.Now; ++ string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr); ++ TestStartTime = DateTime.Now; +  + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Checking_tank_capacity); +@@ -189,35 +192,36 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + .AddOperation(cBrd.SetValvesOp(scale.DrainValve, null)) + .AddOperations(readTempPressOps) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + #endif + } +  +  +- /// +- /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test +- /// +- IOperation heatMetersPromptOp = null; +- if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) +- { +- /// Make sure the CycleBeginForm is closed +- if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; ++ /// ++ /// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test ++ /// ++ IOperation heatMetersPromptOp = null; ++ if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) ++ { ++ /// Make sure the CycleBeginForm is closed ++ if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; +  +- heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); +- } ++ heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); ++ } +  +  + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ +  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +- int flowSetTime0 = StateMachine.Time; ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); ++ int flowSetTime0 = StateMachine.Time; +  +  + if (inPath.Pump is GenericDevices.IPumpFM) +@@ -227,12 +231,13 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + /// + State.Create(string.Format("{0}({1}) : Starting pump {2}", test.Method, test.Name, (inPath.Pump != null) ? inPath.Pump.Name : "?")) + .AddOperation(checkUiOp) +-// .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) ++ // .AddOperation(new Operations.SetAllRegulValvesOp(inPath.RegulValves, inPath.RegulValvesPct, 60)) + .AddOperations(readTempPressOps) + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +@@ -249,8 +254,9 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperations(readTempPressOps) + .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +@@ -267,11 +273,12 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + .AddOperation(cBrd.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperations(readTempPressOps) + .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } +@@ -284,8 +291,9 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperations(readTempPressOps) + .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +@@ -302,13 +310,14 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + .AddOperation(cBrd.SetFlowOp(test.QfromM3ph(), test.QtoM3ph(), RefFlow, FlowSettingTimeoutSec)) + .AddOperations(readTempPressOps) + .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +- if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); +@@ -334,12 +343,13 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + double Tw_last = 0; + double Tc_last = 0; +  +- State.Create(string.Format("{0}({1}) : Check temperature stabilized.", test.Method, test.Name)) ++ State.Create(string.Format("{0}({1}) : Check temperature stabilized.", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) goto temperature_set; +@@ -368,63 +378,64 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + } + while (true); + } +- else if (!string.IsNullOrEmpty(test.TempControl) && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) +- { +- //--------------------------------------------------- +- Bridge.OnActivity(this, Strings.Setting_temperature); +- //--------------------------------------------------- +- +- State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) +- .AddOperation(checkUiOp) ++ else if (!string.IsNullOrEmpty(test.TempControl) && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) ++ { ++ //--------------------------------------------------- ++ Bridge.OnActivity(this, Strings.Setting_temperature); ++ //--------------------------------------------------- ++ ++ State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) ++ .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .EnterState(); +- do { +- e = StateMachine.WaitRunDevsRunOps(); +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +- if (e.Contains(Event.Next)) goto temperature_set; ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (e.Contains(Event.Next)) goto temperature_set; +  + if ((test.TempLimLo <= TempUp.Val) && (TempUp.Val <= test.TempLimHi) && + (test.TempLimLo <= TempDown.Val) && (TempDown.Val <= test.TempLimHi)) + { +- goto temperature_set; +- } +- } +- while (true); +- } ++ goto temperature_set; ++ } ++ } ++ while (true); ++ } +  + temperature_set: +  + /// +- /// Prepare cameras, ROI-s and measurementOperations +- /// ++ /// Prepare cameras, ROI-s and measurementOperations ++ /// +  +- /// Find successfully detected ROI-s +- IList rois = new List(); +- foreach (var rr in sensPath.RegisterReaders) +- { ++ /// Find successfully detected ROI-s ++ IList rois = new List(); ++ foreach (var rr in sensPath.RegisterReaders) ++ { + GenericDevices.IRegReaderLiveCamera cameraRoI = rr as GenericDevices.IRegReaderLiveCamera; + if ((cameraRoI != null) && cameraRoI.Detected) + { + rois.Add(cameraRoI); + } +- } ++ } +  +- /// Find cameras +- IList cameras = new List(); ++ /// Find cameras ++ IList cameras = new List(); + foreach (var roi in rois) + { +- if (roi.Camera != null && !cameras.Contains(roi.Camera)) +- { +- cameras.Add(roi.Camera); +- roi.Camera.ClearRoiParams(); +- } ++ if (roi.Camera != null && !cameras.Contains(roi.Camera)) ++ { ++ cameras.Add(roi.Camera); ++ roi.Camera.ClearRoiParams(); ++ } + } +  +- /// Register ROI-parameters to cameras +- foreach (var roi in rois) roi.RegisterRoiToCamera(); ++ /// Register ROI-parameters to cameras ++ foreach (var roi in rois) roi.RegisterRoiToCamera(); +  +- /// Prepare measurementOperations +- IList cameraMeasurementOps = new List(); ++ /// Prepare measurementOperations ++ IList cameraMeasurementOps = new List(); + foreach (var camera in cameras) + { + cameraMeasurementOps.Add(camera.MeasurementOp()); +@@ -446,60 +457,62 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + } +  +  +- if (drainTheTank) +- { +- //------------------------------------------------ +- Bridge.OnActivity(this, Strings.Closing_the_tank); +- //------------------------------------------------ ++ if (drainTheTank) ++ { ++ //------------------------------------------------ ++ Bridge.OnActivity(this, Strings.Closing_the_tank); ++ //------------------------------------------------ +  +- /// +- /// Make sure tank draining completed +- /// ++ /// ++ /// Make sure tank draining completed ++ /// + switch (DrainTheTank(scale, readTempPressOps)) +- { +- case Event.Error: { retVal = Event.Error; goto stopTest; } +- case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } +- } ++ { ++ case Event.Error: { retVal = Event.Error; goto stopTest; } ++ case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } ++ } +  +- drainTheTank = false; +- } +- else +- { +- /// Close the drain valve anyway +- State.Create(string.Format("{0}({1}) : Close the drain valve", test.Method, test.Name)) +- .AddOperation(checkUiOp) ++ drainTheTank = false; ++ } ++ else ++ { ++ /// Close the drain valve anyway ++ State.Create(string.Format("{0}({1}) : Close the drain valve", test.Method, test.Name)) ++ .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperation(cBrd.SetValvesOp(null, scale.DrainValve)) + .EnterState(); +- do { +- e = StateMachine.WaitRunDevsRunOps(); +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +- } +- while (e.Contains(Event.ValvesBusy)); +- } ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ } ++ while (e.Contains(Event.ValvesBusy)); ++ } +  +  +- //---------------------------------------------------- +- Bridge.OnActivity(this, Strings.Measuring_the_weight); +- //---------------------------------------------------- ++ //---------------------------------------------------- ++ Bridge.OnActivity(this, Strings.Measuring_the_weight); ++ //---------------------------------------------------- +  + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); +  +- if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); +- else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); +-  +- State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) +- .AddOperation(checkUiOp) ++ if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); ++ else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); ++ ++ State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) ++ .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperations(cameraMeasurementOps) + .AddOperation(scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { +- e = StateMachine.WaitRunDevsRunOps(); +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.ScaleTimeout)) + { + Bridge.OnError(this, Strings.Mass_measurement_timeout); +@@ -513,9 +526,9 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + log.WarnFormat("Start mass = {0}kg", StartMass); +  +  +- if (heatMetersPath == null) ++ if (heatMetersPath == null) + LogProcessDataHeader(processDataLogger, "Measurement"); +- else ++ else + LogProcessDataHeaderHeatMeters(processDataLogger, "Measurement"); +  + //------------------------------------------------ +@@ -531,18 +544,19 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection +  + /// Measurement loop + State.Create(string.Format("{0}({1}) : FlyingStartStopTestWithDivOp is running", test.Method, test.Name)) +- .AddOperation(checkUiOp) ++ .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperations(readDatastreamOps) + .AddOperations(cameraMeasurementOps) + .AddOperation(cBrd.FlyingStartStopTestOp(test, test.QfromM3ph(), test.QtoM3ph(), totalPulses, true, isDelayedStart, false, 0, true, DiverterStart, DiverterEnd)) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +  + /// Show remaining time + if ((remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0)) > 60) +@@ -602,32 +616,34 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + .AddOperations(readTempPressOps) + .AddOperation(cBrd.SetValvesOp(StateMachine.DefaultValvesOpen, StateMachine.DefaultValvesClose)) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } +  +- //------------------------------------------------ +- Bridge.OnActivity(this, Strings.Measuring_the_weight); +- //------------------------------------------------ ++ //------------------------------------------------ ++ Bridge.OnActivity(this, Strings.Measuring_the_weight); ++ //------------------------------------------------ +  +- if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); +- else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); ++ if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "End mass"); ++ else LogProcessDataHeaderHeatMeters(processDataLogger, "End mass"); +  + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) +- .AddOperation(checkUiOp) ++ .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperation(scale.ReadStableMassOp(ref EndMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) + .AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec)) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { +- e = StateMachine.WaitRunDevsRunOps(); +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(test,e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.ScaleTimeout)) + { + Bridge.OnError(this, Strings.Mass_measurement_timeout); +@@ -639,7 +655,7 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + /// + tMass2 = StateMachine.Time; + log.WarnFormat("End mass = {0}kg", EndMass); +- TestEndTime = DateTime.Now; ++ TestEndTime = DateTime.Now; +  + if (test.DoDrainingAfter) + { +@@ -648,47 +664,48 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + .AddOperation(cBrd.SetValvesOp(scale.DrainValve, null)) + .AddOperations(readTempPressOps) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (e.Contains(Event.ValvesBusy)); + } +  +- //------------------------------------------------ +- Bridge.OnActivity(this, Strings.Test_completed); +- //------------------------------------------------ ++ //------------------------------------------------ ++ Bridge.OnActivity(this, Strings.Test_completed); ++ //------------------------------------------------ +  +- /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results +- if (heatMetersPromptOp == null) +- { +- if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; +- } ++ /// Make sure the CycleBeginForm is closed so that water meter data (s/n) can be copied into results ++ if (heatMetersPromptOp == null) ++ { ++ if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; ++ } +  +- /// +- /// Populate TestResult data entity with data +- ///  +- Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); ++ /// ++ /// Populate TestResult data entity with data ++ ///  ++ Results.Entities.TestRslt tstRslt = BatchRslts.GetTestRslt(testName, test.Part); +  + bool stopCycle = false; + if (tstRslt != null) + { + Results.Utils.GetCounterStates(tstRslt, Program.LocalSettings.Counters); +  +- /// Raw data ++ /// Raw data + UpdateTempPressDensAmb(tstRslt); +- tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; +- tstRslt.StartTime = TestStartTime; +- tstRslt.EndTime = TestEndTime; +- tstRslt.FlowSetTime = flowSetTime; +- tstRslt.TestTime = cBrd.TestTime; /// [s] measurement time +- tstRslt.PulsesMaster = Convert.ToDouble(cBrd.RefPulses); /// Pulses of the master flow meter (test total) +- tstRslt.MassStartRaw = StartMass.Val; +- tstRslt.MassEndRaw = EndMass.Val; ++ tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; ++ tstRslt.StartTime = TestStartTime; ++ tstRslt.EndTime = TestEndTime; ++ tstRslt.FlowSetTime = flowSetTime; ++ tstRslt.TestTime = cBrd.TestTime; /// [s] measurement time ++ tstRslt.PulsesMaster = Convert.ToDouble(cBrd.RefPulses); /// Pulses of the master flow meter (test total) ++ tstRslt.MassStartRaw = StartMass.Val; ++ tstRslt.MassEndRaw = EndMass.Val; + tstRslt.TimeBtwnMassMsrmnts = tMass2 - tMass1; + tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; +- tstRslt.VolumeMaster = tstRslt.ConstMasterRaw * tstRslt.PulsesMaster; /// [l] volume from the master flow meter +- double flowMID = 3.6 * tstRslt.VolumeMaster / tstRslt.TestTime; /// [m3/h] flow before correction from the master flow meter ++ tstRslt.VolumeMaster = tstRslt.ConstMasterRaw * tstRslt.PulsesMaster; /// [l] volume from the master flow meter ++ double flowMID = 3.6 * tstRslt.VolumeMaster / tstRslt.TestTime; /// [m3/h] flow before correction from the master flow meter +  + /// Corrected data + tstRslt.MassStart = MeasurementCorrection.CorrectedValue(tstRslt.MassStartRaw, scale.Corrections); +@@ -698,23 +715,37 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(flowMID, tstRslt.TempDownMean); +  + /// Main result calculation +- tstRslt.VolumeCTV = 1000 * tstRslt.Batch.Buoyancy * mass / tstRslt.DensityLine; ++ tstRslt.VolumeCTV = 1000 * tstRslt.Batch.Buoyancy * mass / tstRslt.DensityLine; + if ((outPath.Diverter != null) && (tstRslt.TestTime > float.Epsilon)) + { + tstRslt.TestTimeCorrection = outPath.Diverter.TestTimeCorrection(flowMID); + tstRslt.VolumeCTV *= tstRslt.TestTime + tstRslt.TestTimeCorrection; + tstRslt.VolumeCTV /= tstRslt.TestTime; + } +- tstRslt.Flow = 3.6 * tstRslt.VolumeCTV / tstRslt.TestTime; /// Flow from VolumeCTV and time ++ tstRslt.Flow = 3.6 * tstRslt.VolumeCTV / tstRslt.TestTime; /// Flow from VolumeCTV and time + tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); + tstRslt.ConstMaster = (tstRslt.PulsesMaster != 0) ? (tstRslt.VolumeCTV / tstRslt.PulsesMaster) : tstRslt.ConstMasterCorr; +- /// Master pulses per liter from the measured mass ++ /// Master pulses per liter from the measured mass ++ ++ /// Main result calculation for mass ++ tstRslt.MassCTV = tstRslt.Batch.Buoyancy * mass; ++ if ((outPath.Diverter != null) && (tstRslt.TestTime > float.Epsilon)) ++ { ++ tstRslt.TestTimeCorrection = outPath.Diverter.TestTimeCorrection(flowMID); ++ tstRslt.MassCTV *= tstRslt.TestTime + tstRslt.TestTimeCorrection; ++ tstRslt.MassCTV /= tstRslt.TestTime; ++ } ++ tstRslt.MassFlow = 3.6 * tstRslt.MassCTV / tstRslt.TestTime; /// Flow from MassCTV and time ++ tstRslt.MassErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.MassCTV); ++ tstRslt.MassConstMaster = (tstRslt.PulsesMaster != 0) ? (tstRslt.MassCTV / tstRslt.PulsesMaster) : tstRslt.ConstMasterCorr; ++ ++ + /// Flow statistics correction +- tstRslt.FlowMean = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Average / tstRslt.ConstMasterRaw); ++ tstRslt.FlowMean = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Average / tstRslt.ConstMasterRaw); + tstRslt.FlowStart = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.First / tstRslt.ConstMasterRaw); +- tstRslt.FlowEnd = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Last / tstRslt.ConstMasterRaw); +- tstRslt.FlowMin = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Min / tstRslt.ConstMasterRaw); +- tstRslt.FlowMax = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Max / tstRslt.ConstMasterRaw); ++ tstRslt.FlowEnd = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Last / tstRslt.ConstMasterRaw); ++ tstRslt.FlowMin = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Min / tstRslt.ConstMasterRaw); ++ tstRslt.FlowMax = Convert.ToSingle(tstRslt.ConstMaster * RefFlowStat.Max / tstRslt.ConstMasterRaw); +  + tstRslt.DiverterStart = outPath.Diverter.SwitchTimeStart.Val; + tstRslt.DivStart10 = 0; +@@ -734,114 +765,114 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + : 0; + tstRslt.InfoFlags = infoFlags; +  +- if (compoundTestParams != null) +- { +- /// +- /// Compound meters +- /// +- for (int i = 0; i < BatchRslts.WMPositionsCount; i++) +- { +- if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue; ++ if (compoundTestParams != null) ++ { ++ /// ++ /// Compound meters ++ /// ++ for (int i = 0; i < BatchRslts.WMPositionsCount; i++) ++ { ++ if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue; +  +- var mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.CompoundMain); +- var auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.CompoundAux); ++ var mainMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.CompoundMain); ++ var auxMeterRslt = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.CompoundAux); +  +- for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux ++ for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { +- IRegReader regReader = sensPath.RegisterReaders[2 * i + isAux]; +- var oneMTR = (isAux == 0) ? mainMeterRslt : auxMeterRslt; ++ IRegReader regReader = sensPath.RegisterReaders[2 * i + isAux]; ++ var oneMTR = (isAux == 0) ? mainMeterRslt : auxMeterRslt; +  +- if (oneMTR != null && regReader != null) +- { ++ if (oneMTR != null && regReader != null) ++ { + oneMTR.RegReaderType = (int)regReader.RegisterReaderType; + if (regReader is PoseidonReader poseidon) //is Poseidon reader family + { +- oneMTR.PulsesPerLiter = 0; +- +- /// Optionally supress pulses from the large water meter +- oneMTR.PulsesMeter = 0; +- oneMTR.PulsesMaster = 0; +- oneMTR.TestTime = cBrd.TestTime; +- oneMTR.VolumeStart = 0; +- oneMTR.VolumeEnd = 0; +- oneMTR.VolumeRef = tstRslt.VolumeCTV; +- +- if (oneMTR.PulsesMaster != 0) +- { +- oneMTR.PulsesMeter *= (tstRslt.PulsesMaster / oneMTR.PulsesMaster); +- oneMTR.PulsesMaster = tstRslt.PulsesMaster; +- } +- +- oneMTR.VolumeMeter = poseidon.WMVolume; +-  +- oneMTR.Error = +- Formulas.ErrorFromVolumes(oneMTR.VolumeMeter, +- tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation ++ oneMTR.PulsesPerLiter = 0; ++ ++ /// Optionally supress pulses from the large water meter ++ oneMTR.PulsesMeter = 0; ++ oneMTR.PulsesMaster = 0; ++ oneMTR.TestTime = cBrd.TestTime; ++ oneMTR.VolumeStart = 0; ++ oneMTR.VolumeEnd = 0; ++ oneMTR.VolumeRef = tstRslt.VolumeCTV; ++ ++ if (oneMTR.PulsesMaster != 0) ++ { ++ oneMTR.PulsesMeter *= (tstRslt.PulsesMaster / oneMTR.PulsesMaster); ++ oneMTR.PulsesMaster = tstRslt.PulsesMaster; ++ } ++ ++ oneMTR.VolumeMeter = poseidon.WMVolume; ++ ++ oneMTR.Error = ++ Formulas.ErrorFromVolumes(oneMTR.VolumeMeter, ++ tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + } + else + { +- oneMTR.PulsesPerLiter = regReader.PulsesPerLtr; +- +- /// Optionally supress pulses from the large water meter +- oneMTR.PulsesMeter = (isAux == 0 && compoundTestParams.SupressTrills) +- ? 0 +- : Convert.ToDouble(regReader.WMPulses); +- oneMTR.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); +- oneMTR.TestTime = cBrd.TestTime; +- oneMTR.VolumeStart = 0; +- oneMTR.VolumeEnd = 0; +- oneMTR.VolumeRef = tstRslt.VolumeCTV; +- +- if (oneMTR.PulsesMaster != 0) +- { +- oneMTR.PulsesMeter *= (tstRslt.PulsesMaster / oneMTR.PulsesMaster); +- oneMTR.PulsesMaster = tstRslt.PulsesMaster; +- } +- +- oneMTR.VolumeMeter = oneMTR.PulsesMeter * regReader.LtrsPerPulse; /// liter +- +- oneMTR.Error = +- Formulas.ErrorFromVolumes(oneMTR.VolumeMeter, +- tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation ++ oneMTR.PulsesPerLiter = regReader.PulsesPerLtr; ++ ++ /// Optionally supress pulses from the large water meter ++ oneMTR.PulsesMeter = (isAux == 0 && compoundTestParams.SupressTrills) ++ ? 0 ++ : Convert.ToDouble(regReader.WMPulses); ++ oneMTR.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); ++ oneMTR.TestTime = cBrd.TestTime; ++ oneMTR.VolumeStart = 0; ++ oneMTR.VolumeEnd = 0; ++ oneMTR.VolumeRef = tstRslt.VolumeCTV; ++ ++ if (oneMTR.PulsesMaster != 0) ++ { ++ oneMTR.PulsesMeter *= (tstRslt.PulsesMaster / oneMTR.PulsesMaster); ++ oneMTR.PulsesMaster = tstRslt.PulsesMaster; ++ } ++ ++ oneMTR.VolumeMeter = oneMTR.PulsesMeter * regReader.LtrsPerPulse; /// liter ++ ++ oneMTR.Error = ++ Formulas.ErrorFromVolumes(oneMTR.VolumeMeter, ++ tstRslt.VolumeCTV); /// Main/Aux meter error is not usedfor evaluation + } +- } +- } ++ } ++ } +  +- var compoundMTR = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Compound); ++ var compoundMTR = BatchRslts.GetMeterTestRslt(testName, i, CompoundMeterId.Compound); +  +- if (compoundMTR != null && mainMeterRslt != null && auxMeterRslt != null) +- { +- compoundMTR.VolumeRef = tstRslt.VolumeCTV; +- compoundMTR.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; +- compoundMTR.PulsesMaster = tstRslt.PulsesMaster; +- compoundMTR.TestTime = tstRslt.TestTime; +- compoundMTR.Error = Formulas.ErrorFromVolumes(compoundMTR.VolumeMeter, compoundMTR.VolumeRef); +- compoundMTR.Passed = (compoundMTR.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) +- && (compoundMTR.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) ++ if (compoundMTR != null && mainMeterRslt != null && auxMeterRslt != null) ++ { ++ compoundMTR.VolumeRef = tstRslt.VolumeCTV; ++ compoundMTR.VolumeMeter = mainMeterRslt.VolumeMeter + auxMeterRslt.VolumeMeter; ++ compoundMTR.PulsesMaster = tstRslt.PulsesMaster; ++ compoundMTR.TestTime = tstRslt.TestTime; ++ compoundMTR.Error = Formulas.ErrorFromVolumes(compoundMTR.VolumeMeter, compoundMTR.VolumeRef); ++ compoundMTR.Passed = (compoundMTR.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) ++ && (compoundMTR.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) + && (tstRslt.ErrorFlags == 0); +- mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMTR.Passed; +- mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMTR.TestDone = true; ++ mainMeterRslt.Passed = auxMeterRslt.Passed = compoundMTR.Passed; ++ mainMeterRslt.TestDone = auxMeterRslt.TestDone = compoundMTR.TestDone = true; + tstRslt.TestDone = true; +- } +- } +- } +- else if (heatMetersTestParams != null) +- { ++ } ++ } ++ } ++ else if (heatMetersTestParams != null) ++ { + /// + /// Heat meters + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] +  +- tstRslt.Custom1 = (float)TempRefHiStat.Average; +- tstRslt.Custom2 = (float)TempRefHiStat.First; +- tstRslt.Custom3 = (float)TempRefHiStat.Last; +- tstRslt.Custom4 = (float)TempRefHiStat.Min; +- tstRslt.Custom5 = (float)TempRefHiStat.Max; +- tstRslt.Custom6 = (float)TempRefLoStat.Average; +- tstRslt.Custom7 = (float)TempRefLoStat.First; +- tstRslt.Custom8 = (float)TempRefLoStat.Last; +- tstRslt.Custom9 = (float)TempRefLoStat.Min; +- tstRslt.Custom10 = (float)TempRefLoStat.Max;  ++ tstRslt.Custom1 = (float)TempRefHiStat.Average; ++ tstRslt.Custom2 = (float)TempRefHiStat.First; ++ tstRslt.Custom3 = (float)TempRefHiStat.Last; ++ tstRslt.Custom4 = (float)TempRefHiStat.Min; ++ tstRslt.Custom5 = (float)TempRefHiStat.Max; ++ tstRslt.Custom6 = (float)TempRefLoStat.Average; ++ tstRslt.Custom7 = (float)TempRefLoStat.First; ++ tstRslt.Custom8 = (float)TempRefLoStat.Last; ++ tstRslt.Custom9 = (float)TempRefLoStat.Min; ++ tstRslt.Custom10 = (float)TempRefLoStat.Max; +  + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { +@@ -868,10 +899,10 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + volumeRslt.TestTime = cBrd.TestTimeWM(i + 1); /// [s] +  + volumeRslt.Error = Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); +- volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || +- ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) && +- (volumeRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) && +- (tstRslt.ErrorFlags == 0)); ++ volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || ++ ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) && ++ (volumeRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) && ++ (tstRslt.ErrorFlags == 0)); + volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } +@@ -883,103 +914,131 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + energyRslt.PulsesMaster = Convert.ToDouble(energyRegReader.WMRefPulses); + energyRslt.VolumeStart = 0; + energyRslt.VolumeEnd = 0; +- energyRslt.VolumeRef = tstRslt.RefEnergy * (energyRslt.PulsesMaster / tstRslt.PulsesMaster); /// [J] ++ energyRslt.VolumeRef = tstRslt.RefEnergy * (energyRslt.PulsesMaster / tstRslt.PulsesMaster); /// [J] + energyRslt.VolumeMeter = energyRslt.PulsesMeter * Common.Units.ConvertFrom(Common.Unit.kWh, energyRegReader.LtrsPerPulse); /// [J] + energyRslt.TestTime = cBrd.TestTimeWM(i + 1); /// [s] +  + energyRslt.Error = Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); +- energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) +- && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) ++ energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) ++ && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0); + energyRslt.TestDone = true; + tstRslt.TestDone = true; + } + } + } +- else +- { +- /// +- /// Single meters +- /// +- for (int i = 0; i < BatchRslts.WMPositionsCount; i++) +- { +- if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue; +- +- /// MetersKind.Single meters +- Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Common.CompoundMeterId.Single); +- GenericDevices.IRegReader regReader = sensPath.RegisterReaders[i]; ++ else ++ { ++ /// ++ /// Single meters ++ /// ++ for (int i = 0; i < BatchRslts.WMPositionsCount; i++) ++ { ++ if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue; ++ ++ /// MetersKind.Single meters ++ Results.Entities.MeterTestRslt meterRslt = BatchRslts.GetMeterTestRslt(testName, i, Common.CompoundMeterId.Single); ++ GenericDevices.IRegReader regReader = sensPath.RegisterReaders[i]; + GenericDevices.IRegReaderDatastream dstrReader = regReader as GenericDevices.IRegReaderDatastream; + TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead; + GenericDevices.IRegReaderLiveCamera cameraRoi = regReader as GenericDevices.IRegReaderLiveCamera; +  +- if (meterRslt != null && regReader != null) +- { ++ if (meterRslt != null && regReader != null) ++ { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; +- meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; +- meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); ++ ComponentProcedure procParamsEntity = test.Procedure.GetProcedureParamsEntity(regReader.Name); ++ ++ try ++ { ++ if (regReader.RegisterReaderType == RegisterReaderType.Pulses) ++ { ++ XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; ++ RRProcParams tmp = Serializer.Deserialize(new StringReader(procParamsEntity.Parameters.ToString())) as RRProcParams; ++ regReader.PulsesPerLtr = tmp.PulsesPerLtr; ++ regReader.QuantityUnits = tmp.Units; ++ } ++ else ++ { ++ //MessageBox.Show("Cannot create or initialize a printer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); ++ } ++ } ++ catch (Exception ex) ++ { ++ /*log.DebugFormat( ++ "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", ++ dbEntity?.CmpntName, ++ dbEntity?.Procedure, ++ dbEntity?.Parameters, ++ ex ++ );*/ ++ } ++ ++ meterRslt.PulsesPerLiter = regReader.PulsesPerLtr;//...MF 11.12.2025 toto chybalo, v .csv bol stlpec naplneny nulami ++ meterRslt.QuantityUnits = regReader.QuantityUnits; ++ meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses); +  + if (dstrReader != null) +- { +- +- if (dstrReader is SmartReader poseidon) //is Poseidon reader family +- { +- log.Info("Poseidon reader detected - Results"); +- meterRslt.TimestampStart = poseidon.TimestampSecStart; +- meterRslt.TimestampEnd = !poseidon.NoSamples +- ? poseidon.TimestampSecEnd +- : (poseidon.TimestampSecStart + tstRslt.TestTime); +- meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; +- meterRslt.VolumeStart = poseidon.VolumeLtrStart; /// liter ++ { ++ ++ if (dstrReader is SmartReader poseidon) //is Poseidon reader family ++ { ++ log.Info("Poseidon reader detected - Results"); ++ meterRslt.TimestampStart = poseidon.TimestampSecStart; ++ meterRslt.TimestampEnd = !poseidon.NoSamples ++ ? poseidon.TimestampSecEnd ++ : (poseidon.TimestampSecStart + tstRslt.TestTime); ++ meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; ++ meterRslt.VolumeStart = poseidon.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = poseidon.VolumeLtrStart + poseidon.WMVolume; //dstrReader.VolumeLtrEnd; /// liter +- meterRslt.VolumeMeter = poseidon.WMVolume; +- +- if (!(meterRslt.TestTime == 0 || tstRslt.TestTime == 0)) +- { +- meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; +- meterRslt.PulsesMaster = +- tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; +- } +- else +- { +- meterRslt.VolumeRef = tstRslt.VolumeCTV; +- meterRslt.PulsesMaster = tstRslt.PulsesMaster; +- } +- +- log.Info($"meterRslt.TimestampStart = {meterRslt.TimestampStart} \n" + +- $"meterRslt.TimestampEnd = {meterRslt.TimestampEnd }\n" + +- $"meterRslt.TestTime = {meterRslt.TestTime}\n" + +- $"meterRslt.VolumeStart = {meterRslt.VolumeStart}\n" + +- $"meterRslt.VolumeEnd = {meterRslt.VolumeEnd}\n" + +- $"meterRslt.VolumeMeter = {meterRslt.VolumeMeter}\n" + +- $"meterRslt.VolumeRef = {meterRslt.VolumeRef}\n" + +- $"meterRslt.PulsesMaster = {meterRslt.PulsesMaster}\n"); +-  +-  +- } +- else +- { +- meterRslt.TimestampStart = dstrReader.TimestampSecStart; +- meterRslt.TimestampEnd = !dstrReader.NoSamples +- ? dstrReader.TimestampSecEnd +- : (dstrReader.TimestampSecStart + tstRslt.TestTime); +- meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; +- meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter ++ meterRslt.VolumeMeter = poseidon.WMVolume; ++ ++ if (!(meterRslt.TestTime == 0 || tstRslt.TestTime == 0)) ++ { ++ meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; ++ meterRslt.PulsesMaster = ++ tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; ++ } ++ else ++ { ++ meterRslt.VolumeRef = tstRslt.VolumeCTV; ++ meterRslt.PulsesMaster = tstRslt.PulsesMaster; ++ } ++ ++ log.Info($"meterRslt.TimestampStart = {meterRslt.TimestampStart} \n" + ++ $"meterRslt.TimestampEnd = {meterRslt.TimestampEnd}\n" + ++ $"meterRslt.TestTime = {meterRslt.TestTime}\n" + ++ $"meterRslt.VolumeStart = {meterRslt.VolumeStart}\n" + ++ $"meterRslt.VolumeEnd = {meterRslt.VolumeEnd}\n" + ++ $"meterRslt.VolumeMeter = {meterRslt.VolumeMeter}\n" + ++ $"meterRslt.VolumeRef = {meterRslt.VolumeRef}\n" + ++ $"meterRslt.PulsesMaster = {meterRslt.PulsesMaster}\n"); ++ ++ ++ } ++ else ++ { ++ meterRslt.TimestampStart = dstrReader.TimestampSecStart; ++ meterRslt.TimestampEnd = !dstrReader.NoSamples ++ ? dstrReader.TimestampSecEnd ++ : (dstrReader.TimestampSecStart + tstRslt.TestTime); ++ meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart; ++ meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter + meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter + meterRslt.VolumeMeter = +- Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); +- meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; +- meterRslt.PulsesMaster = +- tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; +- } ++ Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart); ++ meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; ++ meterRslt.PulsesMaster = ++ tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; ++ } +  +- if (iPerl != null) ++ if (iPerl != null) + { + if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0) + { + meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode; + } + #if IPERL +- meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor; ++ meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor; + meterRslt.ExtraDataPath = iPerl.ExtraDataPath; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 1) meterRslt.X1 = iPerl.X[0]; + if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 2) meterRslt.X2 = iPerl.X[1]; +@@ -1005,18 +1064,18 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + meterRslt.VolumeMeter, + meterRslt.VolumeRef); + } +- else if (cameraRoi != null) +- { +- meterRslt.TimestampStart = cameraRoi.TimestampStart; /// [s] +- meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// [s] +- meterRslt.VolumeStart = cameraRoi.VolumeStart; /// [l] +- meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// [l] +- meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// [l] ++ else if (cameraRoi != null) ++ { ++ meterRslt.TimestampStart = cameraRoi.TimestampStart; /// [s] ++ meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// [s] ++ meterRslt.VolumeStart = cameraRoi.VolumeStart; /// [l] ++ meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// [l] ++ meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// [l] +  + if (meterRslt.VolumeMeter != 0) + { + /// Normal measurement with camera +- meterRslt.TestTime = cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// [s] ++ meterRslt.TestTime = cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// [s] + meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime; + meterRslt.PulsesMaster = tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime; + } +@@ -1038,11 +1097,11 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + meterRslt.VolumeMeter, + meterRslt.VolumeRef); + } +- else +- { ++ else ++ { + meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses); + meterRslt.VolumeStart = 0; +- meterRslt.VolumeEnd = 0; ++ meterRslt.VolumeEnd = 0; + meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// [l] +  + if (regReader.WMPulses >= 1) +@@ -1050,43 +1109,67 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + /// Normal measurement + meterRslt.TestTime = cBrd.TestTimeWM(regReader.Position); + meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// [l] ++ meterRslt.MassRef = meterRslt.PulsesMaster * tstRslt.MassConstMaster; /// [kg] + } + else + { + /// None or one pulse from the water meter + meterRslt.TestTime = tstRslt.TestTime; + meterRslt.VolumeRef = tstRslt.VolumeCTV; /// [l] ++ meterRslt.MassRef = tstRslt.MassCTV; + } +  +- log.DebugFormat("Pulses: Pref4meter={0} Vmeter={1} Vref4meter={2} Ttime4meter={3} Ttime={4}", ++ log.DebugFormat("Pulses: Pref4meter={0} Vmeter={1} Vref4meter={2} Mmeter={3} Mref4meter={4} Ttime4meter={5} Ttime={6}", + meterRslt.PulsesMaster, + meterRslt.VolumeMeter, + meterRslt.VolumeRef, ++ meterRslt.MassMeter, ++ meterRslt.MassRef, + meterRslt.TestTime, + tstRslt.TestTime); + } +  +- meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); +- meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) +- && (meterRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) +- && (tstRslt.ErrorFlags == 0); ++ double Error = 0; ++ if (meterRslt.GetQuantityFromUnits() == "Mass") ++ Error = Formulas.ErrorFromVolumes(meterRslt.MassMeter, meterRslt.MassRef); ++ else ++ Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); ++ ++ meterRslt.Error = Error; ++ ++ var ErrLimLo_Volume = test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime); ++ var ErrLimHi_Volume = test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime); ++ var ErrLimLo_Mass = test.GetErrLimLo(tstRslt.MassCTV, tstRslt.TestTime); ++ var ErrLimHi_Mass = test.GetErrLimHi(tstRslt.MassCTV, tstRslt.TestTime); ++ ++ bool Passed; ++ if (meterRslt.GetQuantityFromUnits() == "Mass") ++ Passed = (meterRslt.Error >= ErrLimLo_Volume + test.Uncertainty) && ++ (meterRslt.Error <= ErrLimHi_Volume - test.Uncertainty) && ++ (tstRslt.ErrorFlags == 0); ++ else ++ Passed = (meterRslt.Error >= ErrLimLo_Mass + test.Uncertainty) && ++ (meterRslt.Error <= ErrLimHi_Mass - test.Uncertainty) && ++ (tstRslt.ErrorFlags == 0); ++ ++ meterRslt.Passed = Passed; + meterRslt.TestDone = true; + tstRslt.TestDone = true; + #if ORACLE_DB + meterRslt.ErrorBC = meterRslt.Error; + #endif + } +- } +- } +- +- tstRslt.Components = Results.Entities.Components.UpdateList(BatchRslts.ComponentsList, +- new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, +- (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", +- inPath.Pump != null ? inPath.Pump.Name : string.Empty, +- outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, +- cBrd.Devices.Scale.Name, +- outPath.RegValve != null ? outPath.RegValve.Name : string.Empty, +- outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); ++ } ++ } ++ ++ tstRslt.Components = Results.Entities.Components.UpdateList(BatchRslts.ComponentsList, ++ new Results.Entities.Components((BenchInfo != null) ? BenchInfo.TestBenchId : 1, ++ (BenchInfo != null) ? BenchInfo.TestBenchName : "testbench", ++ inPath.Pump != null ? inPath.Pump.Name : string.Empty, ++ outPath.FlowMeter != null ? outPath.FlowMeter.Name : string.Empty, ++ cBrd.Devices.Scale.Name, ++ outPath.RegValve != null ? outPath.RegValve.Name : string.Empty, ++ outPath.Diverter != null ? outPath.Diverter.Name : string.Empty)); +  + /// Update water meter error flags + if (ErrorFlagsComp != null) +@@ -1105,24 +1188,24 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + } + } +  +- /// Update results +- Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); +- } ++ /// Update results ++ Bridge.OnTestCompleted(this, new TestCompletedEventArgs(testName, tstRslt)); ++ } +  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.TransitionAfter)); ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.TransitionAfter)); +  +- /// Append the results to the CSV-file +- allResults.Info(TestResult2CsvLine(testName, test.Part)); ++ /// Append the results to the CSV-file ++ allResults.Info(TestResult2CsvLine(testName, test.Part)); +  + if (stopCycle) retVal = Event.ErrorFlagsStop; +  +- stopTest: ++ stopTest: +  +- StopRecordingStatistics(); /// Make sure graph files are closed ++ StopRecordingStatistics(); /// Make sure graph files are closed +  +- /// +- /// Quit this sequence +- /// ++ /// ++ /// Quit this sequence ++ /// + if (isLastRepetition || retVal == Event.UiCmdStop + || retVal == Event.OpArgumentError + || retVal == Event.RecoverableError +@@ -1133,18 +1216,18 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + cBrd.StopAll(false); + } +  +- return new List { retVal }; +- } ++ return new List { retVal }; ++ } +  +  +- IList Simulate1(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, +- Compound.CombinedTestParams compoundTestParams, +- HeatMeters.TestParams heatMetersTestParams) +- { +- /// +- /// Test method simulation +- ///  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); ++ IList Simulate1(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, ++ Compound.CombinedTestParams compoundTestParams, ++ HeatMeters.TestParams heatMetersTestParams) ++ { ++ /// ++ /// Test method simulation ++ ///  ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  + foreach (var rr in sensPath.RegisterReaders) + { +@@ -1157,12 +1240,12 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + StateMachine.WaitRunDevsRunOps(); + StateMachine.WaitRunDevsRunOps(); +  +-  +- if (compoundTestParams != null) +- { ++ ++ if (compoundTestParams != null) ++ { + if (test.Name.ToLower().Contains("nok")) MakeSimulatedCompound(test, 1, test.Part, 4.7f, 0.9f); + else MakeSimulatedCompound(test, repetitionNr, test.Part, 0.7f, 1.0f); +- } ++ } + else if (heatMetersTestParams != null) + { + MakeSimulatedHeatMeters(test, repetitionNr, test.Part, 1.5f, 1000000, heatMetersTestParams.ErrorLimitLo, heatMetersTestParams.ErrorLimitHi, heatMetersTestParams.EvaluateVolume); +@@ -1170,91 +1253,91 @@ namespace TBF.Rig.TestMethods.FlyingStartMassCollection + else + { + float errorPctBase = -1.0f; +- if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; ++ if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; + else if (test.Name.ToLower().Contains("q2")) errorPctBase = 0.5f; + else if (test.Name.ToLower().Contains("q1")) errorPctBase = -5.1f; +  + MakeSimulated(test, repetitionNr, test.Part, errorPctBase + repetitionNr * 0.1f); + } +  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed)); +- Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); +- allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed)); ++ Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); ++ allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file +  +- //------------------------------------------------------------------- +- Bridge.OnActivity(this, string.Format("{0} Simulation", test.Name)); +- //------------------------------------------------------------------- ++ //------------------------------------------------------------------- ++ Bridge.OnActivity(this, string.Format("{0} Simulation", test.Name)); ++ //------------------------------------------------------------------- +  +- State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) +- .AddOperation(checkUiOp) +- .EnterState(); +- IList e = StateMachine.WaitRunDevsRunOps(); ++ State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) ++ .AddOperation(checkUiOp) ++ .EnterState(); ++ IList e = StateMachine.WaitRunDevsRunOps(); +  + return new List { TestAndLogUiCmdStop(test, e) ? Event.UiCmdStop : Event.Done }; +- } ++ } +  +  +- IList Simulate2(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, +- Compound.CombinedTestParams compoundTestParams, +- HeatMeters.TestParams heatMetersTestParams) +- { +- IList e; +- Event retVal = Event.Done; ++ IList Simulate2(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, ++ Compound.CombinedTestParams compoundTestParams, ++ HeatMeters.TestParams heatMetersTestParams) ++ { ++ IList e; ++ Event retVal = Event.Done; +  +- /// +- /// Test method with flow chart simulation +- ///  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); ++ /// ++ /// Test method with flow chart simulation ++ ///  ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +  +- /// Simulate flow ++ /// Simulate flow + StartNewStatistics(null, BatchRslts.Batch.BatchNr, test, repetitionNr, 0); +  +- IntBox remainingTime = new IntBox((int)test.TestTime); +- State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) +- .AddOperation(checkUiOp) +- .AddOperation(new Operations.TimerOp((int)test.TestTime, remainingTime)) +- .EnterState(); +- do +- { +- e = StateMachine.WaitRunDevsRunOps(); +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } +- +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); +- +- if (remainingTime.Val > 60) +- { +- Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime.Val / 60, "min", remainingTime.Val % 60, Strings.sec)); +- } +- else +- { +- Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime.Val)); +- } +- //------------------------------------------------ +- +- RefFlow.Val = (1.0 + 0.2 * Math.Sin(2 * Math.PI * (float)remainingTime.Val / test.TestTime)) * (test.QfromM3ph() + test.QtoM3ph()) / 2.0; ++ IntBox remainingTime = new IntBox((int)test.TestTime); ++ State.Create(string.Format("{0}({1}) : Simulation", test.Method, test.Name)) ++ .AddOperation(checkUiOp) ++ .AddOperation(new Operations.TimerOp((int)test.TestTime, remainingTime)) ++ .EnterState(); ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } ++ ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); ++ ++ if (remainingTime.Val > 60) ++ { ++ Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Test_in_progress, remainingTime.Val / 60, "min", remainingTime.Val % 60, Strings.sec)); ++ } ++ else ++ { ++ Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime.Val)); ++ } ++ //------------------------------------------------ ++ ++ RefFlow.Val = (1.0 + 0.2 * Math.Sin(2 * Math.PI * (float)remainingTime.Val / test.TestTime)) * (test.QfromM3ph() + test.QtoM3ph()) / 2.0; + PressUp.Val = 2.7f; + PressDown.Val = 2.2f; +  +- UpdateAllStatistics(); +- } +- while (!e.Contains(Event.TimerExpired)); ++ UpdateAllStatistics(); ++ } ++ while (!e.Contains(Event.TimerExpired)); +  +- StopRecordingStatistics(); ++ StopRecordingStatistics(); +  +- if (retVal != Event.UiCmdStop) +- { +- float errorPctBase = -1.0f; ++ if (retVal != Event.UiCmdStop) ++ { ++ float errorPctBase = -1.0f; +  +- if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; +- else if (test.Name.ToLower().Contains("q2")) errorPctBase = 0.5f; +- else if (test.Name.ToLower().Contains("q1")) errorPctBase = -5.1f; ++ if (test.Name.ToLower().Contains("q3")) errorPctBase = -0.5f; ++ else if (test.Name.ToLower().Contains("q2")) errorPctBase = 0.5f; ++ else if (test.Name.ToLower().Contains("q1")) errorPctBase = -5.1f; +  +- MakeSimulated(test, repetitionNr, test.Part, errorPctBase + repetitionNr * 0.1f); ++ MakeSimulated(test, repetitionNr, test.Part, errorPctBase + repetitionNr * 0.1f); +  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed)); +- Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); +- allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Completed)); ++ Bridge.OnTestCompleted(this, new TestCompletedEventArgs(test.Name, BatchRslts.GetTestRslt(Results.Utils.GetTestName(test.Name, 1, 1), 0))); ++ allResults.Info(TestResult2CsvLine(test.Name, 0)); /// Append the results to the CSV-file + } +  + return new List { retVal }; /// default 'retVal' value is Event.Done +diff --git a/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs b/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs +--- a/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs ++++ b/TBF/Rig/TestMethods/StandingStartMassCollection/StandingStartMassCollectionSeq.cs +@@ -1,13 +1,14 @@ +-/// ++using Common; ++using Config.Entities; ++using log4net; ++/// + /// Copyright (c) 2013-2021 Sensus Slovensko a.s. + /// + using System; + using System.Collections.Generic; + using System.IO; + using System.Threading; +-using log4net; +-using Common; +-using Config.Entities; ++using System.Xml.Serialization; + using TBF.Boxes; + using TBF.Resources; + using TBF.Rig.GenericDevices; +@@ -74,21 +75,21 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + return true; + } +  +- ///  +- /// Fixed start mass collection method sequence +- ///  +- /// Test entity +- ///  +- /// Event.Done . . . . . . . OK +- /// Event.MakeSecondPass . . OK, 2nd pass (=evaluation) required +- /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP +- /// Event.OpArgumentError . Target flow is out of range +- /// Event.Error . . . . . . Unspecified error +- ///  +- public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, ++ ///  ++ /// Fixed start mass collection method sequence ++ ///  ++ /// Test entity ++ ///  ++ /// Event.Done . . . . . . . OK ++ /// Event.MakeSecondPass . . OK, 2nd pass (=evaluation) required ++ /// Event.UiCmdStop . . . . Stopped by the user using the on-screen button STOP ++ /// Event.OpArgumentError . Target flow is out of range ++ /// Event.Error . . . . . . Unspecified error ++ ///  ++ public IList Execute(Config.Entities.Test test, int repetitionNr, bool isLastRepetition, + bool compound, +- HeatMeters.TestParams heatMetersTestParams, +- Common.DebugMode debugLevel) ++ HeatMeters.TestParams heatMetersTestParams, ++ Common.DebugMode debugLevel) + { + ControlBoard.IControlBoard cBrd = StateMachine.ControlBoardMain; + IScale scale = cBrd.Devices.Scale as IScale; +@@ -101,7 +102,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + } +  + IList e; /// Events from currently running operations +- int waterMetersCount = Math.Min(BenchInfo.WaterMetersCount, sensPath.RegisterReaders.Length);  ++ int waterMetersCount = Math.Min(BenchInfo.WaterMetersCount, sensPath.RegisterReaders.Length); + DateTimeBox timeStampStart = new DateTimeBox(); + DateTimeBox timeStampEnd = new DateTimeBox(); + FloatBox startSwitchTime = new FloatBox(); +@@ -154,7 +155,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +@@ -172,53 +174,54 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + IOperation heatMetersPromptOp = null; + if (heatMetersTestParams != null && !string.IsNullOrEmpty(heatMetersTestParams.Prompt)) + { +- /// Make sure the CycleBeginForm is closed +- if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; ++ /// Make sure the CycleBeginForm is closed ++ if (UIFlowControl.Stop == WaitBeginFormClosed()) goto stopTest; +  +- heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); ++ heatMetersPromptOp = new Operations.MessageBoxOp(heatMetersTestParams.Prompt); + } +  +  + if (test.DoDraining || (scale.Mass + test.Volume >= scale.Capacity * Constants.TankFullFactor)) +- { ++ { + /// + /// There is not enough room in the tank OR unconditional draining ... drain the water tank + /// + IList ops = new List(readTempPressOps); + ops.Add(heatMetersPromptOp); +- switch (DrainTheTank(scale, ops)) +- { +- case Event.Error: { retVal = Event.Error; goto stopTest; } +- case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } +- } +- } +- /// +- /// Make sure the drain valve is closed +- /// +- State.Create(string.Format("{0}({1}) : Make sure the drain valve is closed", test.Method, test.Name)) +- .AddOperation(checkUiOp) ++ switch (DrainTheTank(scale, ops)) ++ { ++ case Event.Error: { retVal = Event.Error; goto stopTest; } ++ case Event.UiCmdStop: { retVal = Event.UiCmdStop; goto stopTest; } ++ } ++ } ++ /// ++ /// Make sure the drain valve is closed ++ /// ++ State.Create(string.Format("{0}({1}) : Make sure the drain valve is closed", test.Method, test.Name)) ++ .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) +- .AddOperation(heatMetersPromptOp) +- .AddOperation(cBrd.SetValvesOp(null, scale.DrainValve)) +- .EnterState(); +- do { +- e = StateMachine.WaitRunDevsRunOps(); +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.JustStarted)); ++ .AddOperation(heatMetersPromptOp) ++ .AddOperation(cBrd.SetValvesOp(null, scale.DrainValve)) ++ .EnterState(); ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.JustStarted)); +  +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +- } +- while (!e.Contains(Event.ValvesSet)); ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ } ++ while (!e.Contains(Event.ValvesSet)); +  +  + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Starting_the_pump); + //------------------------------------------------ +  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +- int flowSetTime0 = StateMachine.Time; ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); ++ int flowSetTime0 = StateMachine.Time; +  +- if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); ++ if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) +@@ -227,14 +230,15 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(heatMetersPromptOp) + .AddOperation(inPath.Pump != null ? cBrd.SetValvesOp(inPath.Pump, null) : null) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } +- while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); ++ while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); +  +  + if (test.TimePump2StartV > 0) +@@ -245,7 +249,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperation(heatMetersPromptOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +@@ -263,10 +268,11 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(cBrd.SetValvesOp(benchPath.StopBFValve, null)) + .AddOperation(heatMetersPromptOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); + } +@@ -280,7 +286,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperation(heatMetersPromptOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +@@ -302,8 +309,9 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperations(readTempPressOps) + .AddOperation(cBrd.SetValvesOp(inPath.Pump, null)) + .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +@@ -317,7 +325,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(cBrd.OpenStartValveOp()) + .AddOperation(heatMetersPromptOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  +@@ -329,14 +338,15 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperation(cBrd.SetFlowOp(test.QfromM3ph(), test.QtoM3ph(), RefFlow, FlowSettingTimeoutSec)) +- .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .AddOperation(heatMetersPromptOp) ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); +  + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); +@@ -362,15 +372,16 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + //--------------------------------------------------- +  + int lastTimeSec = StateMachine.Time; +- double Tw_last = 0; +- double Tc_last = 0; ++ double Tw_last = 0; ++ double Tc_last = 0; +  + State.Create(string.Format("{0}({1}) : Checking if the temperature is stable", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) +- .AddOperation(heatMetersPromptOp) +- .EnterState(); +- do { ++ .AddOperation(heatMetersPromptOp) ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) +@@ -378,56 +389,57 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + break; /// Simulate temperature is within range + } +  +- if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) +- { +- if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) +- { +- double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; +- double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; +- if ((heatMetersTestParams.TempWarmLo <= Tw) && (Tw <= heatMetersTestParams.TempWarmHi) && +- (heatMetersTestParams.TempColdLo <= Tc) && (Tc <= heatMetersTestParams.TempColdHi) && +- (Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm) && +- (Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold) && +- (Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm) && +- (Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold)) +- { ++ if (TempRefHi1.Val != 0 && TempRefHi2.Val != 0 && TempRefLo1.Val != 0 && TempRefLo2.Val != 0) ++ { ++ if (StateMachine.Time - lastTimeSec > 10 || StateMachine.Time - lastTimeSec < 0) ++ { ++ double Tw = (TempRefHi1.Val + TempRefHi2.Val) / 2; ++ double Tc = (TempRefLo1.Val + TempRefLo2.Val) / 2; ++ if ((heatMetersTestParams.TempWarmLo <= Tw) && (Tw <= heatMetersTestParams.TempWarmHi) && ++ (heatMetersTestParams.TempColdLo <= Tc) && (Tc <= heatMetersTestParams.TempColdHi) && ++ (Math.Abs(Tw - Tw_last) <= heatMetersTestParams.ChangeInTimeWarm) && ++ (Math.Abs(Tc - Tc_last) <= heatMetersTestParams.ChangeInTimeCold) && ++ (Math.Abs(TempRefHi1.Val - TempRefHi2.Val) <= heatMetersTestParams.DeltaTempWarm) && ++ (Math.Abs(TempRefLo1.Val - TempRefLo2.Val) <= heatMetersTestParams.DeltaTempCold)) ++ { + break; /// Temperature is withing required range + } +  +- lastTimeSec = StateMachine.Time; +- Tw_last = Tw; +- Tc_last = Tc; +- } +- } ++ lastTimeSec = StateMachine.Time; ++ Tw_last = Tw; ++ Tc_last = Tc; ++ } ++ } + } + while (true); + } +- else if (!string.IsNullOrEmpty(test.TempControl) && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) +- { +- //--------------------------------------------------- +- Bridge.OnActivity(this, Strings.Setting_temperature); +- //--------------------------------------------------- +- +- State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) +- .AddOperation(checkUiOp) ++ else if (!string.IsNullOrEmpty(test.TempControl) && benchPath.TempMtrUp != null && benchPath.TempMtrDown != null) ++ { ++ //--------------------------------------------------- ++ Bridge.OnActivity(this, Strings.Setting_temperature); ++ //--------------------------------------------------- ++ ++ State.Create(string.Format("{0}({1}) : Wait until the water temperature is within limits", test.Method, test.Name)) ++ .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) +- .EnterState(); +- do { +- e = StateMachine.WaitRunDevsRunOps(); +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ .EnterState(); ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.Next)) + { + break; /// Simulate temperature is within range + } +  +- if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && +- TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) +- { ++ if (TempUp.Val >= test.TempLimLo && TempUp.Val <= test.TempLimHi && ++ TempDown.Val >= test.TempLimLo && TempDown.Val <= test.TempLimHi) ++ { + break; /// Temperature set withing required range + } +- } +- while (true); +- } ++ } ++ while (true); ++ } +  + /// + /// Temperature is withing required range at this point +@@ -435,7 +447,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection +  + //----------------------------------------------------------------- + Bridge.OnActivity(this, Strings.Stopping_flow_for_the_fixed_start); +- //----------------------------------------------------------------- ++ //----------------------------------------------------------------- + State.Create(string.Format("{0}({1}) : Stop flow regulation", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) +@@ -451,10 +463,11 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperation(cBrd.CloseStartValveOp()) +- .EnterState(); +- do { ++ .EnterState(); ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ValvesSet)); +@@ -483,10 +496,10 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + if (heatMetersPath == null) LogProcessDataHeader(processDataLogger, "Start mass"); + else LogProcessDataHeaderHeatMeters(processDataLogger, "Start mass"); +  +- /// +- /// Enter water meter begin states and read the start mass at the same time +- /// +- GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; ++ /// ++ /// Enter water meter begin states and read the start mass at the same time ++ /// ++ GenericDevices.IHasWMStatesForm dataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IHasWMStatesForm; + IOperation readStartMassOp = scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread); +  + if (dataEntryCmpnt != null) +@@ -515,7 +528,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + triggerValve = roi.GetValve(); + if (triggerValve != null && !triggerSend) + { +- OpenValveGrabImage(cBrd,testInProgress, triggerValve, e, ++ OpenValveGrabImage(cBrd, testInProgress, triggerValve, e, + string.Format("{0}({1}) : Grabbing images - valve open", test.Method, test.Name)); + triggerSend = true; + } +@@ -533,27 +546,28 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + } + } + state2.EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); +  + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); +  +- if (e.Contains(Event.Error)) { retVal = Event.Error; break; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; break; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } + } + while (e.Contains(Event.CameraBusy)); +  + (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).StartImages = startImages; + } +-  ++ + ///valve trigger camera close + if (triggerValve != null) + { +- CloseValveGrabImage(cBrd,testInProgress,triggerValve, e, ++ CloseValveGrabImage(cBrd, testInProgress, triggerValve, e, + string.Format("{0}({1}) : Grabbing images - valve close", test.Method, test.Name)); + } + /////// +-  ++ +  + Bridge.OnActivity(this, Strings.Enter_water_meter_data); + long readStartTime = StateMachine.Time; +@@ -564,13 +578,14 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation((dataEntryCmpnt as GenericDevices.IHasWMStatesForm).ShowTestStartFormOp(sensPath.RegisterReaders)) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } + while (!e.Contains(Event.ModelessFormClosed)); + long readEndTime = StateMachine.Time; +-  ++ + log.Debug("Read poseidon - took:" + (readEndTime - readStartTime)); +  + if (heatMetersTestParams != null) +@@ -612,7 +627,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + { + (rr as Rig.Network.Camera.RoiForFixedStartKeyence.Roi).BeginWMState = + dataEntryCmpnt.WMStartState(i); +- log.DebugFormat(" StandingStartMassCollectionSeq.cs - BeginWMState [{0}] -> RoiForFixedStartKeyence.Roi",dataEntryCmpnt.WMStartState(i)); ++ log.DebugFormat(" StandingStartMassCollectionSeq.cs - BeginWMState [{0}] -> RoiForFixedStartKeyence.Roi", dataEntryCmpnt.WMStartState(i)); + } + if (rr is Rig.Network.Camera.RoiForFixedStartCJMS11.Roi) + (rr as Rig.Network.Camera.RoiForFixedStartCJMS11.Roi).BeginWMState = dataEntryCmpnt.WMStartState(i); +@@ -638,7 +653,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + string destFName = string.IsNullOrEmpty((dataEntryCmpnt as IDataEntryForCamera).TestStartImgName(i, testName)) + ? fileName : (dataEntryCmpnt as IDataEntryForCamera).TestStartImgName(i, testName); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, destFName), true); +- log.DebugFormat("Save images sourceFile: {0}, destFile: {1} ",Path.Combine(srcDir, fileName), Path.Combine(destDir, destFName)); ++ log.DebugFormat("Save images sourceFile: {0}, destFile: {1} ", Path.Combine(srcDir, fileName), Path.Combine(destDir, destFName)); + } + } + catch (Exception exc) +@@ -681,7 +696,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +@@ -724,11 +740,12 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(controlFlowOp) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.OpArgumentError)) { retVal = Event.OpArgumentError; goto stopTest; } +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } +  + /// Show remaining time + if ((remainingTime = Math.Max(estimtdEndTime - StateMachine.Time, 0)) > 60) +@@ -767,8 +784,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection +  + Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); + } +- while ((cBrd.DebugLevel==DebugMode.Simulate && !e.Contains(Event.FlowReached)) ||  +- (cBrd.DebugLevel!=DebugMode.Simulate && cBrd.RefPulses < initialPulsesCount + totalPulses && !e.Contains(Event.TestCompleted) && !e.Contains(Event.Next))); ++ while ((cBrd.DebugLevel == DebugMode.Simulate && !e.Contains(Event.FlowReached)) || ++ (cBrd.DebugLevel != DebugMode.Simulate && cBrd.RefPulses < initialPulsesCount + totalPulses && !e.Contains(Event.TestCompleted) && !e.Contains(Event.Next))); +  + /// Measurement loop end + log.WarnFormat("Start valve switch time on test start = {0} ms", cBrd.ValveOpenCloseTime); +@@ -783,7 +800,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(cBrd.CloseStartValveOp(timeStampEnd, stopSwitchTime)) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + } +@@ -807,9 +825,10 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + .AddOperation(new Operations.TimerOp(StableMassMsrmntTimeoutSec)) + .AddOperation(processDataLoggingOp) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); +- if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } ++ if (e.Contains(Event.Error)) { retVal = Event.Error; goto stopTest; } + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + if (e.Contains(Event.ScaleTimeout)) + { +@@ -844,7 +863,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + double buoyancy = Formulas.Buoyancy(); + double massOfEvaporatedWater = (double)(tMass2 - tMass1) * outPath.Scale.EvaporationRate(TempDivStat.Average); + double volumeCTV = 1000.0 * buoyancy * (massEnd - massStart + massOfEvaporatedWater) / densityOut; +- if (debugLevel == Common.DebugMode.Simulate) volumeCTV = test.Volume; ++ if (debugLevel == Common.DebugMode.Simulate) volumeCTV = test.Volume; +  + double refEnergy = Energy.Sum * volumeCTV / VolumeForEnergy.Sum; /// [J]=[J]*[l]/[l] +  +@@ -853,33 +872,33 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + /// + if (dataEntryCmpnt != null) + { +- string fileName = string.Format("{0}-{1}-end.bmp", test.Name, repetitionNr); //string.Format("{0}-end.bmp", test.Name); +-  ++ string fileName = string.Format("{0}-{1}-end.bmp", test.Name, repetitionNr); //string.Format("{0}-end.bmp", test.Name); ++ + IValve triggerValve = null; + bool triggerSend = false; +- if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera) +- { +- string[] endImages = new string[sensPath.RegisterReaders.Length]; +- +- State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) +- .AddOperation(checkUiOp); +- for (int i = 0; i < sensPath.RegisterReaders.Length; i++) +- { +- GenericDevices.IRegReaderStillCamera roi = sensPath.RegisterReaders[i] as GenericDevices.IRegReaderStillCamera; +- if (roi != null) +- { ++ if (dataEntryCmpnt is GenericDevices.IDataEntryForCamera) ++ { ++ string[] endImages = new string[sensPath.RegisterReaders.Length]; ++ ++ State state2 = State.Create(string.Format("{0}({1}) : Grabbing images", test.Method, test.Name)) ++ .AddOperation(checkUiOp); ++ for (int i = 0; i < sensPath.RegisterReaders.Length; i++) ++ { ++ GenericDevices.IRegReaderStillCamera roi = sensPath.RegisterReaders[i] as GenericDevices.IRegReaderStillCamera; ++ if (roi != null) ++ { + ///if exist valve trigger camera open + triggerValve = roi.GetValve(); + if (triggerValve != null && !triggerSend) + { +- OpenValveGrabImage(cBrd,testInProgress,triggerValve, e, ++ OpenValveGrabImage(cBrd, testInProgress, triggerValve, e, + string.Format("{0}({1}) : Grabbing images - valve open", test.Method, test.Name)); + triggerSend = true; + } +- string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); +- Directory.CreateDirectory(directory); +- endImages[i] = Path.Combine(directory, fileName); +- state2.AddOperation(roi.GrabImageOp(endImages[i])); ++ string directory = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); ++ Directory.CreateDirectory(directory); ++ endImages[i] = Path.Combine(directory, fileName); ++ state2.AddOperation(roi.GrabImageOp(endImages[i])); + state2.AddOperation(testInProgress); + } + else +@@ -890,47 +909,49 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + endImages[i] = Path.Combine(directory, fileName); + } + } +- state2.EnterState(); +- do { +- e = StateMachine.WaitRunDevsRunOps(); ++ state2.EnterState(); ++ do ++ { ++ e = StateMachine.WaitRunDevsRunOps(); ++ ++ Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); +  +- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); ++ if (e.Contains(Event.Error)) { retVal = Event.Error; break; } ++ if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } ++ } ++ while (e.Contains(Event.CameraBusy)); +  +- if (e.Contains(Event.Error)) { retVal = Event.Error; break; } +- if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; break; } +- } +- while (e.Contains(Event.CameraBusy)); ++ (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).EndImages = endImages; ++ } +  +- (dataEntryCmpnt as GenericDevices.IDataEntryForCamera).EndImages = endImages; +- } +-  + ///valve trigger camera close + if (triggerValve != null) + { +- CloseValveGrabImage(cBrd,testInProgress, triggerValve, e, ++ CloseValveGrabImage(cBrd, testInProgress, triggerValve, e, + string.Format("{0}({1}) : Grabbing images - valve close", test.Method, test.Name)); + } + /////// +-  +- Bridge.OnActivity(this, Strings.Enter_water_meter_data); ++ ++ Bridge.OnActivity(this, Strings.Enter_water_meter_data); + State state = State.Create(string.Format("{0}({1}) : Entering the end-state", test.Method, test.Name)); + if (heatMetersTestParams != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) + { + state.AddOperation((dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm). +- ShowTestEndFormOp(sensPath.RegisterReaders, +- volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty, ++ ShowTestEndFormOp(sensPath.RegisterReaders, ++ volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty, + refEnergy, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); + } + else + { +- state.AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders, +- volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); ++ state.AddOperation(dataEntryCmpnt.ShowTestEndFormOp(sensPath.RegisterReaders, ++ volumeCTV, test.ErrLimLo + test.Uncertainty, test.ErrLimHi - test.Uncertainty)); + } + state.AddOperation(checkUiOp) + .AddOperations(readTempPressOps) + .AddOperation(testInProgress) + .EnterState(); +- do { ++ do ++ { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(test, e)) { retVal = Event.UiCmdStop; goto stopTest; } + } +@@ -958,41 +979,41 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + { + for (int i = 0; i < waterMetersCount; i++) + { +- GenericDevices.IRegReader rr = sensPath.RegisterReaders[i]; +-  ++ GenericDevices.IRegReader rr = sensPath.RegisterReaders[i]; ++ + if (rr is ICommonRegReader) + (rr as ICommonRegReader).EndWMState = dataEntryCmpnt.WMEndState(i); +  +  +- if (rr is Rig.RegisterReaders.StandingStartStop.RegisterReader) +- (rr as Rig.RegisterReaders.StandingStartStop.RegisterReader).EndWMState = dataEntryCmpnt.WMEndState(i); ++ if (rr is Rig.RegisterReaders.StandingStartStop.RegisterReader) ++ (rr as Rig.RegisterReaders.StandingStartStop.RegisterReader).EndWMState = dataEntryCmpnt.WMEndState(i); +  +- if (rr is Rig.Network.Camera.RoiForFixedStart.Roi) +- (rr as Rig.Network.Camera.RoiForFixedStart.Roi).EndWMState = dataEntryCmpnt.WMEndState(i); ++ if (rr is Rig.Network.Camera.RoiForFixedStart.Roi) ++ (rr as Rig.Network.Camera.RoiForFixedStart.Roi).EndWMState = dataEntryCmpnt.WMEndState(i); +  + if (rr is Rig.Network.Camera.RoiForFixedStartKeyence.Roi) + { + (rr as Rig.Network.Camera.RoiForFixedStartKeyence.Roi).EndWMState = + dataEntryCmpnt.WMEndState(i); +- log.DebugFormat(" StandingStartMassCollectionSeq.cs - EndWMState [{0}] -> RoiForFixedStartKeyence.Roi",dataEntryCmpnt.WMEndState(i)); ++ log.DebugFormat(" StandingStartMassCollectionSeq.cs - EndWMState [{0}] -> RoiForFixedStartKeyence.Roi", dataEntryCmpnt.WMEndState(i)); + } +- if(rr is Rig.Network.Camera.RoiForFixedStartCJMS11.Roi) ++ if (rr is Rig.Network.Camera.RoiForFixedStartCJMS11.Roi) + (rr as Rig.Network.Camera.RoiForFixedStartCJMS11.Roi).EndWMState = dataEntryCmpnt.WMEndState(i); +  + } + } +  +- if (dataEntryCmpnt is IDataEntryForCamera && (dataEntryCmpnt as IDataEntryForCamera).SaveImages) +- { ++ if (dataEntryCmpnt is IDataEntryForCamera && (dataEntryCmpnt as IDataEntryForCamera).SaveImages) ++ { + log.Debug("Save images EndWMState..."); +- /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle +- for (int i = 0; i < sensPath.RegisterReaders.Length; i++) +- { +- var roi = sensPath.RegisterReaders[i] as IRegReaderStillCamera; +- if (roi != null) +- { +- string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); +- string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); ++ /// SaveImages==true ... copy images to the directory that will be archived at the end of the cycle ++ for (int i = 0; i < sensPath.RegisterReaders.Length; i++) ++ { ++ var roi = sensPath.RegisterReaders[i] as IRegReaderStillCamera; ++ if (roi != null) ++ { ++ string srcDir = Path.Combine(Program.TempImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); ++ string destDir = Path.Combine(Program.ImagesDir, BatchRslts.Batch.BatchNr.ToString(), (i + 1).ToString()); + try + { + if (File.Exists(Path.Combine(srcDir, fileName))) +@@ -1001,7 +1022,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + string destFName = string.IsNullOrEmpty((dataEntryCmpnt as IDataEntryForCamera).TestEndImgName(i, testName)) + ? fileName : (dataEntryCmpnt as IDataEntryForCamera).TestEndImgName(i, testName); + File.Copy(Path.Combine(srcDir, fileName), Path.Combine(destDir, destFName), true); +- log.DebugFormat("Save images sourceFile: {0}, destFile: {1} ",Path.Combine(srcDir, fileName), Path.Combine(destDir, destFName)); ++ log.DebugFormat("Save images sourceFile: {0}, destFile: {1} ", Path.Combine(srcDir, fileName), Path.Combine(destDir, destFName)); + } + } + catch (Exception exc) +@@ -1009,8 +1030,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + log.ErrorFormat("Failed to copy image {0} to {1}: {2}", fileName, destDir, exc.Message); + } + } +- } +- } ++ } ++ } +  + //...MF...kvapkanie + //------------------------------------------------ +@@ -1059,14 +1080,14 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection +  + /// Raw data + UpdateTempPressDensAmb(tstRslt); +- tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; +- tstRslt.StartTime = TestStartTime; +- tstRslt.EndTime = TestEndTime; +- tstRslt.FlowSetTime = flowSetTime; +- tstRslt.TestTime = Math.Max(1.0, DateTimeBox.DurationSec(timeStampStart, timeStampEnd)); /// Min. 1s to prevent division by zero ++ tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; ++ tstRslt.StartTime = TestStartTime; ++ tstRslt.EndTime = TestEndTime; ++ tstRslt.FlowSetTime = flowSetTime; ++ tstRslt.TestTime = Math.Max(1.0, DateTimeBox.DurationSec(timeStampStart, timeStampEnd)); /// Min. 1s to prevent division by zero + tstRslt.PulsesMaster = Convert.ToDouble(cBrd.RefPulses); /// Pulses of the master flow meter (test total) + tstRslt.MassStartRaw = StartMass.Val; +- tstRslt.MassEndRaw = EndMass.Val; ++ tstRslt.MassEndRaw = EndMass.Val; + tstRslt.TimeBtwnMassMsrmnts = tMass2 - tMass1; +  + /// Corrected values +@@ -1077,6 +1098,8 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + /// Main results + tstRslt.VolumeCTV = volumeCTV; /// [l] 1000.0f is because density is in [kg/m3] + tstRslt.Flow = 3.6 * volumeCTV / tstRslt.TestTime; /// [m3/h] ++ tstRslt.MassCTV = massCTV; /// [kg] 1000.0f is because density is in [kg/m3] ++ tstRslt.MassFlow = 3.6 * massCTV / tstRslt.TestTime; /// [kg/h] +  + if (cBrd is ControlBoard.Uni.UniCB) + { +@@ -1085,6 +1108,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.Flow, tstRslt.TempDownMean); + tstRslt.VolumeMaster = tstRslt.ConstMasterRaw * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMaster = (tstRslt.VolumeMaster != 0) ? (tstRslt.ConstMasterRaw * tstRslt.VolumeCTV / tstRslt.VolumeMaster) : tstRslt.ConstMasterCorr; ++ tstRslt.MassConstMaster = (tstRslt.PulsesMaster != 0) ? (tstRslt.MassCTV / tstRslt.PulsesMaster) : tstRslt.ConstMasterCorr; + } + else + { +@@ -1095,11 +1119,12 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + tstRslt.ConstMaster = 1; + } + tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); ++ tstRslt.MassErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.MassCTV); +  + tstRslt.FlowMean = (float)RefFlowStat.Average; +- tstRslt.FlowStart = (float)RefFlowStat.First; +- tstRslt.FlowEnd = (float)RefFlowStat.Last; +- tstRslt.FlowMin = (float)RefFlowStat.Min; ++ tstRslt.FlowStart = (float)RefFlowStat.First; ++ tstRslt.FlowEnd = (float)RefFlowStat.Last; ++ tstRslt.FlowMin = (float)RefFlowStat.Min; + tstRslt.FlowMax = (float)RefFlowStat.Max; +  + tstRslt.DiverterStart = startSwitchTime.Val; +@@ -1124,7 +1149,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + for (int isAux = 0; isAux <= 1; isAux++) /// 0=main, 1=aux + { + Results.Entities.MeterTestRslt meterRslt = (isAux == 0) ? mainMeterRslt : auxMeterRslt; +- GenericDevices.IRegReader regReader = sensPath.RegisterReaders[2 * i + isAux]; ++ GenericDevices.IRegReader regReader = sensPath.RegisterReaders[2 * i + isAux]; +  + if (meterRslt != null && regReader != null) + { +@@ -1166,63 +1191,63 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + /// + tstRslt.RefEnergy = Energy.Sum * tstRslt.VolumeCTV / VolumeForEnergy.Sum; /// [J] = [J] * [l] / [l] +  +- tstRslt.Custom1 = (float)TempRefHiStat.Average; +- tstRslt.Custom2 = (float)TempRefHiStat.First; +- tstRslt.Custom3 = (float)TempRefHiStat.Last; +- tstRslt.Custom4 = (float)TempRefHiStat.Min; +- tstRslt.Custom5 = (float)TempRefHiStat.Max; +- tstRslt.Custom6 = (float)TempRefLoStat.Average; +- tstRslt.Custom7 = (float)TempRefLoStat.First; +- tstRslt.Custom8 = (float)TempRefLoStat.Last; +- tstRslt.Custom9 = (float)TempRefLoStat.Min; +- tstRslt.Custom10 = (float)TempRefLoStat.Max;  ++ tstRslt.Custom1 = (float)TempRefHiStat.Average; ++ tstRslt.Custom2 = (float)TempRefHiStat.First; ++ tstRslt.Custom3 = (float)TempRefHiStat.Last; ++ tstRslt.Custom4 = (float)TempRefHiStat.Min; ++ tstRslt.Custom5 = (float)TempRefHiStat.Max; ++ tstRslt.Custom6 = (float)TempRefLoStat.Average; ++ tstRslt.Custom7 = (float)TempRefLoStat.First; ++ tstRslt.Custom8 = (float)TempRefLoStat.Last; ++ tstRslt.Custom9 = (float)TempRefLoStat.Min; ++ tstRslt.Custom10 = (float)TempRefLoStat.Max; +  + for (int i = 0; i < BatchRslts.WMPositionsCount; i++) + { + if (!test.IsPartCompatible(Utils.PartNr(i + 1, BatchRslts.Batch.Compound))) continue; +  + Results.Entities.MeterTestRslt volumeRslt = BatchRslts.GetMeterTestRslt(testName, i, Common.CompoundMeterId.HeatMeterVolume); +- Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Common.CompoundMeterId.HeatMeterEnergy); ++ Results.Entities.MeterTestRslt energyRslt = BatchRslts.GetMeterTestRslt(testName, i, Common.CompoundMeterId.HeatMeterEnergy); +  +- GenericDevices.IRegReader volumeRegReader = ++ GenericDevices.IRegReader volumeRegReader = + (sensPath.RegisterReaders.Length > 2 * i) ? sensPath.RegisterReaders[2 * i] : null; +  +- GenericDevices.IRegReader energyRegReader = ++ GenericDevices.IRegReader energyRegReader = + (sensPath.RegisterReaders.Length > 2 * i + 1) ? sensPath.RegisterReaders[2 * i + 1] : null; +  + if (volumeRslt != null && volumeRegReader != null) + { +- volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; +- volumeRslt.VolumeStart = volumeRegReader.BeginWMState; +- volumeRslt.VolumeEnd = volumeRegReader.EndWMState; +- volumeRslt.VolumeMeter = volumeRslt.VolumeEnd - volumeRslt.VolumeStart; +- volumeRslt.VolumeRef = tstRslt.VolumeCTV; +- volumeRslt.PulsesMeter = volumeRslt.VolumeMeter; +- volumeRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? ++ volumeRslt.PulsesPerLiter = volumeRegReader.PulsesPerLtr; ++ volumeRslt.VolumeStart = volumeRegReader.BeginWMState; ++ volumeRslt.VolumeEnd = volumeRegReader.EndWMState; ++ volumeRslt.VolumeMeter = volumeRslt.VolumeEnd - volumeRslt.VolumeStart; ++ volumeRslt.VolumeRef = tstRslt.VolumeCTV; ++ volumeRslt.PulsesMeter = volumeRslt.VolumeMeter; ++ volumeRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? + volumeRslt.TestTime = tstRslt.TestTime; +  + volumeRslt.Error = Formulas.ErrorFromVolumes(volumeRslt.VolumeMeter, volumeRslt.VolumeRef); +- volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || +- ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) && +- (volumeRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) && +- (tstRslt.ErrorFlags == 0)); +- volumeRslt.TestDone = true; ++ volumeRslt.Passed = !heatMetersTestParams.EvaluateVolume || ++ ((volumeRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) && ++ (volumeRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) && ++ (tstRslt.ErrorFlags == 0)); ++ volumeRslt.TestDone = true; + tstRslt.TestDone = true; + } +  + if (energyRslt != null && energyRegReader != null && dataEntryCmpnt is GenericDevices.IHasHeatMtrStatesForm) +- { +- volumeRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; +- energyRslt.VolumeStart = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); +- energyRslt.VolumeEnd = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); +- energyRslt.VolumeMeter = energyRslt.VolumeEnd - energyRslt.VolumeStart; +- energyRslt.VolumeRef = tstRslt.RefEnergy; +- energyRslt.PulsesMeter = energyRslt.VolumeMeter; ++ { ++ volumeRslt.PulsesPerLiter = energyRegReader.PulsesPerLtr; ++ energyRslt.VolumeStart = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyStartState(i); ++ energyRslt.VolumeEnd = (dataEntryCmpnt as GenericDevices.IHasHeatMtrStatesForm).EnergyEndState(i); ++ energyRslt.VolumeMeter = energyRslt.VolumeEnd - energyRslt.VolumeStart; ++ energyRslt.VolumeRef = tstRslt.RefEnergy; ++ energyRslt.PulsesMeter = energyRslt.VolumeMeter; + energyRslt.PulsesMaster = tstRslt.PulsesMaster; /// <----------------- ??? +  + energyRslt.Error = Formulas.ErrorFromVolumes(energyRslt.VolumeMeter, energyRslt.VolumeRef); +- energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) +- && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) ++ energyRslt.Passed = (energyRslt.Error >= heatMetersTestParams.ErrorLimitLo) ++ && (energyRslt.Error <= heatMetersTestParams.ErrorLimitHi) + && (tstRslt.ErrorFlags == 0); + energyRslt.TestDone = true; + tstRslt.TestDone = true; +@@ -1244,18 +1269,75 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + if (meterRslt != null && regReader != null) + { + meterRslt.RegReaderType = (int)regReader.RegisterReaderType; +- meterRslt.PulsesPerLiter = regReader.PulsesPerLtr; ++ ++ ++ ComponentProcedure procParamsEntity = test.Procedure.GetProcedureParamsEntity(regReader.Name); ++ ++ try ++ { ++ if (regReader.RegisterReaderType == RegisterReaderType.Pulses || regReader.RegisterReaderType == RegisterReaderType.Manual) ++ { ++ XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; ++ RRProcParams tmp = Serializer.Deserialize(new StringReader(procParamsEntity.Parameters.ToString())) as RRProcParams; ++ regReader.PulsesPerLtr = tmp.PulsesPerLtr; ++ regReader.QuantityUnits = tmp.Units; ++ } ++ else ++ { ++ //MessageBox.Show("Cannot create or initialize a printer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); ++ } ++ } ++ catch (Exception ex) ++ { ++ /*log.DebugFormat( ++ "Error during Procedure parameters deserialization. CmpntName='{0}', Procedure='{1}', Parameters='{2}', Exception: {3}", ++ dbEntity?.CmpntName, ++ dbEntity?.Procedure, ++ dbEntity?.Parameters, ++ ex ++ );*/ ++ } ++ ++ meterRslt.PulsesPerLiter = regReader.PulsesPerLtr;//...MF 11.12.2025 toto chybalo, v .csv bol stlpec naplneny nulami ++ meterRslt.QuantityUnits = regReader.QuantityUnits; + meterRslt.VolumeStart = regReader.BeginWMState; + meterRslt.VolumeEnd = regReader.EndWMState; + meterRslt.VolumeMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); +- meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter ++ meterRslt.MassMeter = Math.Abs(meterRslt.VolumeEnd - meterRslt.VolumeStart); ++ meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter ++ meterRslt.MassRef = tstRslt.MassCTV; /// kg + meterRslt.PulsesMeter = meterRslt.VolumeMeter; + meterRslt.PulsesMaster = tstRslt.PulsesMaster; + meterRslt.TestTime = tstRslt.TestTime; +- meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); +- meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) ++ ++ //meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); ++ double Error = 0; ++ if (meterRslt.GetQuantityFromUnits() == "Mass") ++ Error = Formulas.ErrorFromVolumes(meterRslt.MassMeter, meterRslt.MassRef); ++ else ++ Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef); ++ ++ meterRslt.Error = Error; ++ ++ /*meterRslt.Passed = (meterRslt.Error >= test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime) + test.Uncertainty) + && (meterRslt.Error <= test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime) - test.Uncertainty) +- && (tstRslt.ErrorFlags == 0); ++ && (tstRslt.ErrorFlags == 0);*/ ++ var ErrLimLo_Volume = test.GetErrLimLo(tstRslt.VolumeCTV, tstRslt.TestTime); ++ var ErrLimHi_Volume = test.GetErrLimHi(tstRslt.VolumeCTV, tstRslt.TestTime); ++ var ErrLimLo_Mass = test.GetErrLimLo(tstRslt.MassCTV, tstRslt.TestTime); ++ var ErrLimHi_Mass = test.GetErrLimHi(tstRslt.MassCTV, tstRslt.TestTime); ++ ++ bool Passed; ++ if (meterRslt.GetQuantityFromUnits() == "Mass") ++ Passed = (meterRslt.Error >= ErrLimLo_Volume + test.Uncertainty) && ++ (meterRslt.Error <= ErrLimHi_Volume - test.Uncertainty) && ++ (tstRslt.ErrorFlags == 0); ++ else ++ Passed = (meterRslt.Error >= ErrLimLo_Mass + test.Uncertainty) && ++ (meterRslt.Error <= ErrLimHi_Mass - test.Uncertainty) && ++ (tstRslt.ErrorFlags == 0); ++ ++ meterRslt.Passed = Passed; + meterRslt.TestDone = true; + tstRslt.TestDone = true; + if (regReader is ICommonRegReader regReaderCommon) +@@ -1265,7 +1347,7 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection + { + meterRslt.WaterMeter.SerialNr = regReaderCommon.SerialNr; + } +-  ++ + } + } + } +@@ -1308,9 +1390,9 @@ namespace TBF.Rig.TestMethods.StandingStartMassCollection +  + if (stopCycle) retVal = Event.ErrorFlagsStop; +  +- stopTest: ++ stopTest: +  +- StopRecordingStatistics(); ++ StopRecordingStatistics(); +  + /// + /// Quit this sequence