diff --git a/Common/.shared/SharedAssemblyInfo.cs b/Common/.shared/SharedAssemblyInfo.cs index f97c684a..c8e1cbc9 100644 --- a/Common/.shared/SharedAssemblyInfo.cs +++ b/Common/.shared/SharedAssemblyInfo.cs @@ -14,4 +14,4 @@ using System.Reflection; //[assembly: AssemblyVersion("1.2.*.0")] -[assembly: AssemblyVersion("2.7.1.*")] +[assembly: AssemblyVersion("2.7.2.*")] diff --git a/Common/Hardware/WaterMeter/Genesis/GenesisCore/configuration.json b/Common/Hardware/WaterMeter/Genesis/GenesisCore/configuration.json index 99714277..bf25bc78 100644 --- a/Common/Hardware/WaterMeter/Genesis/GenesisCore/configuration.json +++ b/Common/Hardware/WaterMeter/Genesis/GenesisCore/configuration.json @@ -716,47 +716,52 @@ }, "statictype": "dynamic" }, - { - "type": "uint32_t", - "privilege": { - "lvl1": "RO", - "lvl2": "RO", - "lvl3": "RW", - "lvl4": "RO", - "lvl5": "RW", - "lvl6": "RW", - "lvl7": "RW", - "lvl8": "RW" + { + "type": "uint32_t", + "privilege": { + "lvl1": "RO", + "lvl2": "RO", + "lvl3": "RW", + "lvl4": "RO", + "lvl5": "RW", + "lvl6": "RW", + "lvl7": "RW", + "lvl8": "RW" + }, + "description": "Any set bits manually clear the corresponding alarm.", + "version": { + "first": 111, + "last": 164 + }, + "values": { + "default": 4294967295, + "minimum": 0, + "maximum": 4294967295 + }, + "statictype": "dynamic", + "production": { + "required": true, + "kitron": false, + "csd": null, + "vako": false, + "operation_calibration": true, + "runtime_ignore": false, + "responsible": [], + "remarks": "Cancel all alarms at the end of production.", + "region": { + "emea": { + "values": { + "default": 4294967295 + } }, - "description": "Any set bits manually clear the corresponding alarm.", - "version": { - "first": 111, - "last": 164 - }, - "statictype": "dynamic", - "production": { - "required": true, - "kitron": false, - "csd": null, - "vako": false, - "operation_calibration": true, - "runtime_ignore": false, - "responsible": [], - "remarks": "Cancel all alarms at the end of production.", - "region": { - "emea": { - "values": { - "default": 4294967295 - } - }, - "na": { - "values": { - "default": 4294967295 - } - } - } + "na": { + "values": { + "default": 4294967295 + } } + } } + } ] }, "AlarmStatus2": { diff --git a/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs b/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs index 5ac3a4b2..2e4e4e70 100644 --- a/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs +++ b/Common/Hardware/WaterMeter/Genesis/MockGenesis/MockGenesis.cs @@ -75,6 +75,22 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.MockGenesis new RecoveryRegisterItem("_StoreConfiguration", new Byte[]{0x01}, new Byte[]{0x00}) }; + /// + /// A list of all known registers to trigger a rest of the input bit. + /// EXAMPLES: + /// - CUSTOMER_TriggerAlarmCancel register value + /// before input 0000 0001 0001 1111 + /// new reset input 0000 1111 1111 0000 + /// output 0000 0000 0000 1111 + /// + /// + private static readonly List SpecialRegisterResetBits = new List + { + // (partial) name placeholder for input and output + new RecoveryRegisterItem("CUSTOMER_TriggerAlarmCancel", new Byte[4]), + }; + + /// /// The root path for all mock FwPackaged. /// @@ -857,9 +873,39 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.MockGenesis /// /// - Initial MockGenesis simulation. /// - private static void CheckAndModifySpecialReplies(String regName, Byte[] data) + /// + /// - Simulation of reset bits. + /// + private void CheckAndModifySpecialReplies(String regName, Byte[] data) { + // Reset a bit mask + if (SpecialRegisterResetBits.Any(n => regName.Contains(n.RegisterIdent))) + { + var readValue = ReadRegister(regName); + if (readValue != null) + { + for (var c = 0; c < data.Length; c++) + { + if (c < readValue.Length) + { + data[c] = (Byte)(readValue[c] & (Byte)~data[c]); + } + else + { + data[c] = 0; + } + } + } + else + { + for (var c = 0; c < data.Length; c++) + { + data[c] = 0x00; + } + } + } + // Input value forces a constant reply if the input matches if (SpecialRegisterReplies.Any(n => regName.Contains(n.RegisterIdent))) { foreach (var special in SpecialRegisterReplies.Where(special => diff --git a/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs b/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs index 1866cd62..125cb408 100644 --- a/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs +++ b/Common/Logic/ProductionOrderCore/OrderData/OrderProgrammingParameters.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using Xylem.Common.Hardware.WaterMeter.Genesis.Registers; using Xylem.Common.Logic.ProductionOrderCore.Csd; using Xylem.Common.Logic.ProductionOrderCore.Vako; @@ -158,6 +159,21 @@ namespace Xylem.Common.Logic.ProductionOrderCore.OrderData ident += vakoData.KeyValues.First(k => k.Key == "Nennweite").Charcode; } + if (!string.IsNullOrWhiteSpace(csdIdent)) + { + var csdTokens = csdIdent.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + + if (csdTokens.Length >= 2) + { + var csdNr = csdTokens[1]; + + if (!string.IsNullOrWhiteSpace(csdNr)) + { + csdIdent = csdNr; + } + } + } + var retStr = LocalWebRequest.GetRequest($"http://sla12iis01/csdcore/csdservice/getstampings?CsdIdent={csdIdent}&GroupId=1&ProductIdent={ident}&ProductDn={rawVako.Dn}&ShowOnlyValidStampings=0", 8000); var retListRealCsd = JsonConvert.DeserializeObject>(retStr); if (retListRealCsd != null && retListRealCsd.Any()) diff --git a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc index ce83576f..35e01172 100644 Binary files a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc and b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SDDe.doc differ diff --git a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx index 55104fa9..5a24b3b1 100644 Binary files a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx and b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOL_SRSe.docx differ diff --git a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOLe.pptx b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOLe.pptx index b4b89829..678830a2 100644 Binary files a/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOLe.pptx and b/Common/Production/ProductionUiCordonel/Docu/TBF_COM_EOLe.pptx differ diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs index 748d0a79..46bf77d6 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/BaseProductionProcess.cs @@ -30,7 +30,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses { #region ------------------------------------------ Variables -------------------------------------------------- // remind manually changed culture setting - private static readonly CultureInfo _cultureInfo = Thread.CurrentThread.CurrentCulture; + private static readonly CultureInfo _cultureInfo = CultureInfo.CurrentUICulture; // user defined control for main screen protected UserControl UserControl diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs index f885e362..5fe1983d 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/EolProcesses/ExecRebootCordonel.cs @@ -99,6 +99,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr return StatusReturn.Failed; } } + ActualProcessProgress++; // Get the time in UTC to program the time for the Cordonel in seconds since 01. Jan 2000 // to set the new UTC after reboot @@ -112,6 +113,7 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // This is the manufacturing date of the Cordonel retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("IRDA_MfgDate", rawSeconds, ProgrammingSource.ProgramInternal)); + ActualProcessProgress++; // Reset reboot counter retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("CUSTOMER_RebootCount", new Byte[] { 0x00 }, ProgrammingSource.ProgramInternal)); @@ -136,22 +138,11 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr // Reset periodic log reset counter retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("PERIODICLOG_ResetCounter", new Byte[] { 0x00 }, ProgrammingSource.ProgramInternal)); - - // Reset main and extended alarm mask - retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("SENSUSRADIO_MainAlarmMask", - new Byte[] { 0 }, ProgrammingSource.ProgramInternal)); - retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("SENSUSRADIO_ExtendedAlarmMask", - new Byte[] { 0 }, ProgrammingSource.ProgramInternal)); - - // System state sensus radio to 0xFF for re-initialize + // System state sensus radio to 0xFF for re-initialize retValBol &= WriteRegisterLogAndProcessCtr(new ProgrammingParameters("SENSUSRADIO_SystemState", new Byte[] { 0xFF }, ProgrammingSource.ProgramInternal)); - // Read back alarm masks - var mainAlarmMask = - RegisterConverter.ByteArrayToValue(Meter.ReadRegister("SENSUSRADIO_MainAlarmMask")); - var extendedAlarmMask = - RegisterConverter.ByteArrayToValue(Meter.ReadRegister("SENSUSRADIO_ExtendedAlarmMask")); + ActualProcessProgress++; var finalRadioSystemState = RegisterConverter.ByteArrayToValue(Meter.ReadRegister("SENSUSRADIO_SystemState")); @@ -160,13 +151,12 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.EolPr ProgrammingSource.ProgramInternal); retValBol &= WriteRegisterLogAndProcessCtr(sensusRadioResetCtr); - if (!retValBol || mainAlarmMask != 0 || extendedAlarmMask !=0 || finalRadioSystemState != 0x02) + if (!retValBol || finalRadioSystemState != 0x02) { ErrorMsgDispatcher(Resources.StrErrorMsgAlarmReset); EolProgress.RebootDoneChecked = EOLStatus.FAIL; return StatusReturn.Failed; } - } SuccessMsgDispatcher(Resources.StrSuccessMsgAlarmReset); diff --git a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs index 94163443..aeaf1622 100644 --- a/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs +++ b/Common/Production/ProductionUiCordonel/ProductionProcesses/GenericModules/GenericChecks.cs @@ -56,8 +56,8 @@ namespace Xylem.Common.Production.ProductionUiCordonel.ProductionProcesses.Gener // Decide which station Assembly-Line or Shipping-Line (EOL) var strStation = assemblyLine - ? $"{productionRequirements.RequiredLifeTimeYearsAssembly:F2} %" - : $"{productionRequirements.RequiredLifeTimeYearsShipping:F2} %"; + ? $"{productionRequirements.RequiredLifeTimeYearsAssembly:F2} " + : $"{productionRequirements.RequiredLifeTimeYearsShipping:F2} "; // Build message for required versus calculated lifetime var lifeTime = $"{Resources.StrMsgRemainingLifeTime}: " + // Actual calculated lifetime based on readings from meter diff --git a/Common/Production/ProductionUiCordonel/ProductionWindow.xaml.cs b/Common/Production/ProductionUiCordonel/ProductionWindow.xaml.cs index c4d720b1..d7c29425 100644 --- a/Common/Production/ProductionUiCordonel/ProductionWindow.xaml.cs +++ b/Common/Production/ProductionUiCordonel/ProductionWindow.xaml.cs @@ -39,7 +39,6 @@ namespace Xylem.Common.Production.ProductionUiCordonel #region variables and properties private readonly ILogger _logger; // remind manually changed culture setting - private static readonly CultureInfo _cultureInfo = Thread.CurrentThread.CurrentCulture; private static readonly AssemblyName _assemblyName = Assembly.GetExecutingAssembly().GetName(); private static readonly String _assemblyExecRootPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); private static readonly Version _version = _assemblyName.Version; diff --git a/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs b/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs index 3068d24d..d036cde9 100644 --- a/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs +++ b/Common/Service/MeterProcessState/Controllers/FinalCheckController.cs @@ -726,8 +726,7 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers - - + dt = dataacces.ExecuteQuery(sb.ToString()); @@ -1435,7 +1434,7 @@ namespace Xylem.Common.Service.MeterProcessState.Controllers , MAX(c1.ID) AS CalId1 , MAX(c2.ID) AS CalId2 , MAX(c3.ID) AS CalId3 - FROM MapPcbIdToSerialNumber AS _map + FROM MapPcbIdToSerialNumber AS _map LEFT JOIN GenesisMeterRegisterHistory AS c1 ON c1.Address = '0F-0D' AND c1.Value IS NOT NULL diff --git a/Common/Service/MeterProcessState/MeterProcessState.csproj.user b/Common/Service/MeterProcessState/MeterProcessState.csproj.user index caeb1dad..fd13e9b2 100644 --- a/Common/Service/MeterProcessState/MeterProcessState.csproj.user +++ b/Common/Service/MeterProcessState/MeterProcessState.csproj.user @@ -2,7 +2,7 @@ Debug|Any CPU - C:\Users\drabesch_ro\Repo\lab\la_operations\laa_production\Common\Service\MeterProcessState\Properties\PublishProfiles\a.pubxml + a true