From c0cf3e1908301d5b813eec9ffddec5146e415958 Mon Sep 17 00:00:00 2001 From: Stoyan Zlatev Date: Tue, 29 Apr 2025 10:26:11 +0200 Subject: [PATCH] temporary implemented new battery calculations and requirements checks --- .../CommonCore.Configuration/ServiceUrls.cs | 13 ++ .../CordonelAssemblyLine.csproj | 4 + .../Model/PickingModel.cs | 177 ++++++++++++++---- .../GenesisStatus/GenesisStatusHandler.cs | 38 ++++ ...erRegisters.csproj.CoreCompileInputs.cache | 2 +- Common/LaaPackages | 2 +- Common/Ui/GenesisToolBox/FrmQsTool.cs | 145 +++++++++++--- .../Ui/GenesisToolBox/GenesisToolBox.csproj | 4 + 8 files changed, 322 insertions(+), 63 deletions(-) diff --git a/Common/CommonCore.Configuration/ServiceUrls.cs b/Common/CommonCore.Configuration/ServiceUrls.cs index 1cee286c..3abb956c 100644 --- a/Common/CommonCore.Configuration/ServiceUrls.cs +++ b/Common/CommonCore.Configuration/ServiceUrls.cs @@ -420,6 +420,19 @@ namespace Xylem.Common.CommonCore.Configuration DefaultGetCordonelRequirementInfoUrl; } + /// + /// Get all production infos for skip process checks or limits for production like: + /// - Battery drained percentage upper limit, + /// - Production due date for a special register, + /// - Required life time for assembly line, + /// - Required life time for shipping line. + /// + /// + public static String GetCordonelRequirementByFANrInfoServiceUrl(string ponr) + { + return $"http://sla12iis01.emea.sensus.net/LaaProductionWeb/api/cordonel/requirements/pono/{ponr}"; + } + /// /// Get all applications versions installed to a specific Cordonel. /// diff --git a/Common/CordonelAssemblyLine/CordonelAssemblyLine.csproj b/Common/CordonelAssemblyLine/CordonelAssemblyLine.csproj index 5aa52c31..4fade0db 100644 --- a/Common/CordonelAssemblyLine/CordonelAssemblyLine.csproj +++ b/Common/CordonelAssemblyLine/CordonelAssemblyLine.csproj @@ -230,6 +230,10 @@ {26AFCF1E-1287-48B8-A506-32B1E8A0DD0E} WaterMeterRegisters + + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB} + LaaPackages.Features.Cordonel + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D} Logic.ProductionToProductMapper diff --git a/Common/CordonelAssemblyLine/Model/PickingModel.cs b/Common/CordonelAssemblyLine/Model/PickingModel.cs index 731c6b28..d909d012 100644 --- a/Common/CordonelAssemblyLine/Model/PickingModel.cs +++ b/Common/CordonelAssemblyLine/Model/PickingModel.cs @@ -1,4 +1,5 @@ -using Logic.ProductionToProductMapper.Cordonel; +using LaaPackages.Features.Cordonel.Models; +using Logic.ProductionToProductMapper.Cordonel; using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -569,10 +570,10 @@ namespace CordonelAssemblyLine.Model meter.SetProcessState(DisplayCodes.PickingStarted); var ret = RunCheck(checkAppsIdVersion, frequency, meterSize, pressurePresent, meter); lblS08Color = _progressWaiting; + var sbMSG = new StringBuilder(); + if (ret) { - - if (!meter.WriteRegister("POWERMON_BatteryQuantity", 2, true, true)) { lblS08Text = "1"; @@ -582,55 +583,157 @@ namespace CordonelAssemblyLine.Model meter.WriteRegister("POWERMON_StoreConfiguration", 1, true); - - - var genesisStatus = new GenesisStatus(); + var requirements = new CordonelRequirements(); - // this calculates all life time values - if (!GenesisStatusHandler.BuildLifeTimeInformation(meter, genesisStatus, out _)) + if (GenesisStatusHandler.GetCordonelRequirementInfoFromDbByFANr(_order, requirements, out var error)) { - meter.WriteLog("Batterie nicht lesbar"); - lblS08Text = "Batterie nicht lesbar"; - lblS08Color = _progressError; - ret = false; - } - else - { - var sbMSG = new StringBuilder(); - sbMSG.AppendLine($"Pcb = {meter.PcbId}"); + genesisStatus.QuiescentCurrent_uA = requirements.QuiescentCurrent_uA; + genesisStatus.EstimatedProductionBatteryLoadPercent = requirements.EstimatedProductionBatteryLoadPercent; - sbMSG.AppendLine($"POWERMON_TotalUsedSeconds = {genesisStatus.ExceededLifeTime_s}"); - sbMSG.AppendLine($"POWERMON_TotalUsedCharge = {genesisStatus.DrainedBatteryLoad_uAs}"); - sbMSG.AppendLine($"POWERMON_BatteryQuantity = {genesisStatus.BatteryQuantity}"); - sbMSG.AppendLine($"POWERMON_BatteryMilliAHrRating = {genesisStatus.InitialBatteryLoad_mAh}"); - sbMSG.AppendLine(""); - sbMSG.AppendLine($"Remaining life time in years {genesisStatus.RemainingLifeTimeYears:F2}"); - sbMSG.AppendLine($"Totally drained battery load in % {genesisStatus.DrainedBatteryLoadPercent:F2}"); - if (genesisStatus.RemainingLifeTimeYears >= 21 || genesisStatus.DrainedBatteryLoadPercent <= 1) + if (GenesisStatusHandler.BuildLifeTimeInformation(meter, genesisStatus, out _)) { - lblS08Text = $"{genesisStatus.RemainingLifeTimeYears} Jahre"; + sbMSG.AppendLine($"Pcb = {meter.PcbId}"); + + sbMSG.AppendLine($"POWERMON_TotalUsedSeconds = {genesisStatus.ExceededLifeTime_s}"); + sbMSG.AppendLine($"POWERMON_TotalUsedCharge = {genesisStatus.DrainedBatteryLoad_uAs}"); + sbMSG.AppendLine($"POWERMON_BatteryQuantity = {genesisStatus.BatteryQuantity}"); + sbMSG.AppendLine($"POWERMON_BatteryMilliAHrRating = {genesisStatus.InitialBatteryLoad_mAh}"); + sbMSG.AppendLine(""); + sbMSG.AppendLine($"Remaining life time in years {genesisStatus.RemainingLifeTimeYears:F2}"); + sbMSG.AppendLine($"Totally drained battery load in % {genesisStatus.DrainedBatteryLoadPercent:F2}"); + + //restlaufzeit monate -RequiredLifeTimeYearsAssembly + + + var hasFehlern = false; + + // restlaufzeit monate - RequiredLifeTimeYearsAssembly + if (genesisStatus.RemainingLifeTimeYears < requirements.RequiredLifeTimeYearsAssembly) + { + lblS08Text = $"{nameof(genesisStatus.RemainingLifeTimeYears)}: " + + $"{genesisStatus.RemainingLifeTimeYears} < " + + $"{requirements.RequiredLifeTimeYearsAssembly}"; + lblS08Color = _progressError; + ret = false; + sbMSG.AppendLine($"{nameof(genesisStatus.RemainingLifeTimeYears)}: " + + $"{genesisStatus.RemainingLifeTimeYears} < " + + $"{requirements.RequiredLifeTimeYearsAssembly}"); + } + else sbMSG.AppendLine($"Restlaufzeit i.O."); + + + + + if (genesisStatus.AlternativeRequiredBatteryLoadPercent != null && + genesisStatus.AlternativeRequiredBatteryLoadPercent > requirements.MaxDrainedBatteryLoadPercentAssembly) + { + sbMSG.AppendLine($"{nameof(genesisStatus.AlternativeRequiredBatteryLoadPercent)}: " + + $"{genesisStatus.AlternativeRequiredBatteryLoadPercent} > " + + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"); + ret = false; + } + else sbMSG.AppendLine($"Alternative Batterieverbrauch Montage i.O."); + // max bat verbrauch - MaxDrainedBatteryLoadPercentAssembly + + if (genesisStatus.DrainedBatteryLoadPercent > requirements.MaxDrainedBatteryLoadPercentAssembly) + { + lblS08Text = $"{nameof(genesisStatus.DrainedBatteryLoadPercent)}: " + + $"{genesisStatus.DrainedBatteryLoadPercent} > " + + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"; + lblS08Color = _progressError; + ret = false; + sbMSG.AppendLine($"{nameof(genesisStatus.DrainedBatteryLoadPercent)}: " + + $"{genesisStatus.DrainedBatteryLoadPercent} > " + + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"); + } + else sbMSG.AppendLine($"Maximaler Batterieverbrauch Montage i.O."); + // lagerzeit - MaxStorageMonths + if (genesisStatus.StorageMonths > requirements.MaxStorageMonths) + { + lblS08Text = $"{nameof(genesisStatus.DrainedBatteryLoadPercent)}: " + + $"{genesisStatus.DrainedBatteryLoadPercent} > " + + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"; + lblS08Color = _progressError; + ret = false; + sbMSG.AppendLine($"{nameof(genesisStatus.StorageMonths)}: " + + $"{genesisStatus.StorageMonths} > " + + $"{requirements.MaxStorageMonths}"); + } + + else sbMSG.AppendLine($"Maximallagerzeit i.O."); + meter.WriteLog(sbMSG.ToString()); } + + + + + + + + + + + + + + + + + + + + + + + + + else { - lblS08Text = $"{genesisStatus.RemainingLifeTimeYears} Jahre"; + meter.WriteLog("Batterie nicht lesbar"); + lblS08Text = "Batterie nicht lesbar"; lblS08Color = _progressError; ret = false; } - if (_orderDetails.FrequencyIndicator == 0) - { - if ((342000000 + (genesisStatus.ExceededLifeTime_s * 77.7)) <= genesisStatus.DrainedBatteryLoad_uAs) - { - lblS08Text = $"UNT Limit überschritten"; - lblS08Color = _progressError; - ret = false; - } - } - meter.WriteLog(sbMSG.ToString()); + } + else + { + if (string.IsNullOrWhiteSpace(error)) error = "Fehler beim laden von Cordonel Freigaben"; + + + meter.WriteLog(error); + lblS08Text = error; + + + + + + + + + + + + + + + + + lblS08Color = _progressError; + ret = false; + } + + // this calculates all life time values } + if (!ret) + sbMSG.AppendLine($"Battery lifetime limits sind Übreschritten"); + else + sbMSG.AppendLine($"Battery lifetime limits sind OK"); + if (_skipProcessSteps == null || !_skipProcessSteps.SkipLUT) { diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisStatus/GenesisStatusHandler.cs b/Common/Hardware/WaterMeter/Genesis/GenesisStatus/GenesisStatusHandler.cs index 6490f1f8..59fdd835 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisStatus/GenesisStatusHandler.cs +++ b/Common/Hardware/WaterMeter/Genesis/GenesisStatus/GenesisStatusHandler.cs @@ -101,6 +101,44 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisStatus return false; } + public static Boolean GetCordonelRequirementInfoFromDbByFANr(String fanr, CordonelRequirements prodRequirements, out string errorMsg) + { + errorMsg = ""; + if (null == prodRequirements || string.IsNullOrEmpty(fanr)) + { + return false; + } + + try + { + var url = ServiceUrls.GetCordonelRequirementByFANrInfoServiceUrl(fanr); + var response = LocalWebRequest.GetRequest(url, 30000, out var httpStatus); + if (httpStatus == HttpStatusCode.OK && !string.IsNullOrEmpty(response)) + { + var requirements = JsonConvert.DeserializeObject(response); + var type = typeof(CordonelRequirements); + foreach (var prop in type.GetProperties()) + { + if (prop.CanWrite) + prop.SetValue(prodRequirements, prop.GetValue(requirements, null), null); + } + + // For standard requirements the order number has to be set as those are neither PcbId based + // nor order number based + if (prodRequirements.ProductionOrderNr == null) + prodRequirements.ProductionOrderNr = prodRequirements.OuterProductionOrderNr; + return true; + } + } + catch (Exception e) + { + errorMsg = e.Message; + return false; + } + + return false; + } + /// /// Get the calibration results for a meter from a test-bench calibration. /// diff --git a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache index 4163759b..8865d283 100644 --- a/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache +++ b/Common/Hardware/WaterMeter/WaterMeterCore/WaterMeterRegisters/obj/Debug/WaterMeterRegisters.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -8cb55c312de586b683d72cf58c13e2801d10e14b767777d98338d3e1473a1213 +89102b0142e574de38a9f47d370f3334e5e6c268 diff --git a/Common/LaaPackages b/Common/LaaPackages index e7aa3e27..ce1dc260 160000 --- a/Common/LaaPackages +++ b/Common/LaaPackages @@ -1 +1 @@ -Subproject commit e7aa3e2723a435f0a714df661dc5d86dfd45a71c +Subproject commit ce1dc26047374fd7a9328914a6c2bd7eb591f012 diff --git a/Common/Ui/GenesisToolBox/FrmQsTool.cs b/Common/Ui/GenesisToolBox/FrmQsTool.cs index 60d13991..da16f69c 100644 --- a/Common/Ui/GenesisToolBox/FrmQsTool.cs +++ b/Common/Ui/GenesisToolBox/FrmQsTool.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using LaaPackages.Features.Cordonel.Models; +using Newtonsoft.Json; using NLog; using System; using System.Collections.Generic; @@ -108,8 +109,17 @@ namespace Xylem.Common.Ui.GenesisToolBox _currentGenesis = ((GenesisMeter)me); var genesisStatus = new GenesisStatus(); + var requirements = new CordonelRequirements(); + + + + if (GenesisStatusHandler.GetCordonelRequirementInfoFromDb($"{_currentGenesis.PcbId}", requirements, out var error)) + { + genesisStatus.QuiescentCurrent_uA = requirements.QuiescentCurrent_uA; + genesisStatus.EstimatedProductionBatteryLoadPercent = requirements.EstimatedProductionBatteryLoadPercent; + } //TODO Roland: Check this implementation --- START - if (_currentGenesis.Region.Equals("EMEA")) + else if (_currentGenesis.Region.Equals("EMEA")) { genesisStatus.QuiescentCurrent_uA = 119.8; genesisStatus.EstimatedProductionBatteryLoadPercent = 1.0; @@ -119,8 +129,11 @@ namespace Xylem.Common.Ui.GenesisToolBox genesisStatus.QuiescentCurrent_uA = 77.7; genesisStatus.EstimatedProductionBatteryLoadPercent = 1.0; } - if (GenesisStatusHandler.BuildLifeTimeInformation(_currentGenesis, genesisStatus, out _)) + + if (GenesisStatusHandler.BuildLifeTimeInformation(_currentGenesis, genesisStatus, out var message)) { + if (!string.IsNullOrWhiteSpace(message)) + MessageBox.Show(message); var sbMSG = new StringBuilder(); sbMSG.AppendLine($"Pcb = {_currentGenesis.PcbId}"); @@ -135,33 +148,117 @@ namespace Xylem.Common.Ui.GenesisToolBox sbMSG.AppendLine($"Totally drained battery load in %: {genesisStatus.DrainedBatteryLoadPercent:F2}"); sbMSG.AppendLine(""); + var hasFehlern = false; + + + // + RemainingLifeTimeYears + + // restlaufzeit monate - RequiredLifeTimeYearsAssembly + if (genesisStatus.RemainingLifeTimeYears < requirements.RequiredLifeTimeYearsAssembly) + { + hasFehlern = true; + sbMSG.AppendLine($"{nameof(genesisStatus.RemainingLifeTimeYears)}: " + + $"{genesisStatus.RemainingLifeTimeYears} < " + + $"{requirements.RequiredLifeTimeYearsAssembly}"); + } + else sbMSG.AppendLine($"Restlaufzeit i.O."); + + + + + // + AlternativeRequiredBatteryLoadPercent + if (genesisStatus.AlternativeRequiredBatteryLoadPercent != null && + genesisStatus.AlternativeRequiredBatteryLoadPercent > requirements.MaxDrainedBatteryLoadPercentAssembly) + { + sbMSG.AppendLine($"{nameof(genesisStatus.AlternativeRequiredBatteryLoadPercent)}: " + + $"{genesisStatus.AlternativeRequiredBatteryLoadPercent} > " + + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"); + hasFehlern = true; + } + else sbMSG.AppendLine($"Alternative Batterieverbrauch Montage i.O."); + // max bat verbrauch - MaxDrainedBatteryLoadPercentAssembly + + // + DrainedBatteryLoadPercent + if (genesisStatus.DrainedBatteryLoadPercent > requirements.MaxDrainedBatteryLoadPercentAssembly) + { + sbMSG.AppendLine($"{nameof(genesisStatus.DrainedBatteryLoadPercent)}: " + + $"{genesisStatus.DrainedBatteryLoadPercent} > " + + $"{requirements.MaxDrainedBatteryLoadPercentAssembly}"); + hasFehlern = true; + } + else sbMSG.AppendLine($"Maximaler Batterieverbrauch Montage i.O."); + + + // + StorageMonths + // lagerzeit - MaxStorageMonths + if (genesisStatus.StorageMonths > requirements.MaxStorageMonths) + { + hasFehlern = true; + sbMSG.AppendLine($"{nameof(genesisStatus.StorageMonths)}: " + + $"{genesisStatus.StorageMonths} > " + + $"{requirements.MaxStorageMonths}"); + } + + else sbMSG.AppendLine($"Maximallagerzeit i.O."); + + //// strom verbrauch - QuiescentCurrent_uA + //if (genesisStatus.QuiescentCurrent_uA > requirements.QuiescentCurrent_uA) + //{ + // hasFehlern = true; + // sbMSG.AppendLine($"{nameof(genesisStatus.QuiescentCurrent_uA)}: " + + // $"{genesisStatus.QuiescentCurrent_uA} > " + + // $"{requirements.QuiescentCurrent_uA}"); + //} // max bat verbrauch prod - EstimatedProductionBatteryLoadPercent + //else sbMSG.AppendLine($"Stromverbrauch i.O."); + //if (genesisStatus.EstimatedProductionBatteryLoadPercent > requirements.EstimatedProductionBatteryLoadPercent) + //{ + // sbMSG.AppendLine($"{nameof(genesisStatus.EstimatedProductionBatteryLoadPercent)}: " + + // $"{genesisStatus.EstimatedProductionBatteryLoadPercent} > " + + // $"{requirements.EstimatedProductionBatteryLoadPercent}"); + // // TODO error + // hasFehlern = true; + //} + + + + + + //else sbMSG.AppendLine($"Maximaler Batterieverbrauch Produktion i.O."); + //if (_currentGenesis.Region == "NA") //{ //if (genesisStatus.UNTStatus) // This is the limit given by the "AlternativeRequiredBatteryLoadPercent" - if (genesisStatus.AlternativeRequiredBatteryLoadPercent != null && - genesisStatus.DrainedBatteryLoadPercent < genesisStatus.AlternativeRequiredBatteryLoadPercent) - { - sbMSG.AppendLine($"{_currentGenesis.Region} limit OK "); - } - else - { - sbMSG.AppendLine($"{_currentGenesis.Region} limit Failed "); - } - //sbMSG.AppendLine($"UNT Limit data Limit {genesisStatus.UNTLimit} Meter has {genesisStatus.DrainedBatteryLoad_uAs}"); - sbMSG.AppendLine($"Maximum drained battery load: {genesisStatus.AlternativeRequiredBatteryLoadPercent} %"); - sbMSG.AppendLine($"Meter reports drained battery load: {genesisStatus.DrainedBatteryLoadPercent} %"); + //if (genesisStatus.AlternativeRequiredBatteryLoadPercent != null && + // genesisStatus.DrainedBatteryLoadPercent < requirements.MaxDrainedBatteryLoadPercentAssembly) + //{ + // sbMSG.AppendLine($"{_currentGenesis.Region} limit OK "); + //} + //else + //{ + // sbMSG.AppendLine($"{_currentGenesis.Region} limit Failed "); + //} + ////sbMSG.AppendLine($"UNT Limit data Limit {genesisStatus.UNTLimit} Meter has {genesisStatus.DrainedBatteryLoad_uAs}"); + //sbMSG.AppendLine($"Maximum drained battery load: {genesisStatus.AlternativeRequiredBatteryLoadPercent} %"); + //sbMSG.AppendLine($"Meter reports drained battery load: {genesisStatus.DrainedBatteryLoadPercent} %"); - var preproductionLimit = genesisStatus.AlternativeRequiredBatteryLoadPercent - - genesisStatus.EstimatedProductionBatteryLoadPercent; - if (genesisStatus.DrainedBatteryLoadPercent < preproductionLimit) - { - sbMSG.AppendLine($"{_currentGenesis.Region} preproduction limit OK "); - } + //var preproductionLimit = genesisStatus.AlternativeRequiredBatteryLoadPercent - + // genesisStatus.EstimatedProductionBatteryLoadPercent; + //if (genesisStatus.DrainedBatteryLoadPercent < preproductionLimit) + //{ + // sbMSG.AppendLine($"{_currentGenesis.Region} preproduction limit OK "); + //} + //else + //{ + // sbMSG.AppendLine($"{_currentGenesis.Region} preproduction limit Failed "); + //} + if (hasFehlern) + sbMSG.AppendLine($"Battery lifetime limits sind Übreschritten"); else - { - sbMSG.AppendLine($"{_currentGenesis.Region} preproduction limit Failed "); - } + sbMSG.AppendLine($"Battery lifetime limits sind OK"); + + sbMSG.AppendLine( + ); sbMSG.AppendLine($"Preproduction max. drained battery load: {genesisStatus.AlternativeRequiredBatteryLoadPercent} %"); sbMSG.AppendLine($"Meter reports drained battery load: {genesisStatus.DrainedBatteryLoadPercent} %"); diff --git a/Common/Ui/GenesisToolBox/GenesisToolBox.csproj b/Common/Ui/GenesisToolBox/GenesisToolBox.csproj index 16faa439..78ef1599 100644 --- a/Common/Ui/GenesisToolBox/GenesisToolBox.csproj +++ b/Common/Ui/GenesisToolBox/GenesisToolBox.csproj @@ -728,6 +728,10 @@ {26afcf1e-1287-48b8-a506-32b1e8a0dd0e} WaterMeterRegisters + + {8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB} + LaaPackages.Features.Cordonel + {D0C859D9-D55E-4E85-AC50-0FF31B1CE50D} Logic.ProductionToProductMapper