temporary implemented new battery calculations and requirements checks

This commit is contained in:
Stoyan Zlatev 2025-04-29 10:26:11 +02:00
parent 66f457dc0b
commit c0cf3e1908
8 changed files with 322 additions and 63 deletions

View File

@ -420,6 +420,19 @@ namespace Xylem.Common.CommonCore.Configuration
DefaultGetCordonelRequirementInfoUrl;
}
/// <summary>
/// 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.
/// </summary>
/// <returns></returns>
public static String GetCordonelRequirementByFANrInfoServiceUrl(string ponr)
{
return $"http://sla12iis01.emea.sensus.net/LaaProductionWeb/api/cordonel/requirements/pono/{ponr}";
}
/// <summary>
/// Get all applications versions installed to a specific Cordonel.
/// </summary>

View File

@ -230,6 +230,10 @@
<Project>{26AFCF1E-1287-48B8-A506-32B1E8A0DD0E}</Project>
<Name>WaterMeterRegisters</Name>
</ProjectReference>
<ProjectReference Include="..\LaaPackages\LaaPackages.Features.Cordonel\LaaPackages.Features.Cordonel.csproj">
<Project>{8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}</Project>
<Name>LaaPackages.Features.Cordonel</Name>
</ProjectReference>
<ProjectReference Include="..\Logic.PrdoctionToProductMapper\Logic.ProductionToProductMapper.csproj">
<Project>{D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}</Project>
<Name>Logic.ProductionToProductMapper</Name>

View File

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

View File

@ -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<CordonelRequirements>(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;
}
/// <summary>
/// Get the calibration results for a meter from a test-bench calibration.
/// </summary>

View File

@ -1 +1 @@
8cb55c312de586b683d72cf58c13e2801d10e14b767777d98338d3e1473a1213
89102b0142e574de38a9f47d370f3334e5e6c268

@ -1 +1 @@
Subproject commit e7aa3e2723a435f0a714df661dc5d86dfd45a71c
Subproject commit ce1dc26047374fd7a9328914a6c2bd7eb591f012

View File

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

View File

@ -728,6 +728,10 @@
<Project>{26afcf1e-1287-48b8-a506-32b1e8a0dd0e}</Project>
<Name>WaterMeterRegisters</Name>
</ProjectReference>
<ProjectReference Include="..\..\LaaPackages\LaaPackages.Features.Cordonel\LaaPackages.Features.Cordonel.csproj">
<Project>{8BEFD3AC-BB21-4B62-8D9A-CF8CBFD439EB}</Project>
<Name>LaaPackages.Features.Cordonel</Name>
</ProjectReference>
<ProjectReference Include="..\..\Logic.PrdoctionToProductMapper\Logic.ProductionToProductMapper.csproj">
<Project>{D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}</Project>
<Name>Logic.ProductionToProductMapper</Name>