Merge branch 'main' of https://slm.sms-esaap.com/la_operations/laa_production
This commit is contained in:
@@ -102,9 +102,14 @@
|
||||
<PropertyGroup />
|
||||
<PropertyGroup />
|
||||
<PropertyGroup />
|
||||
<PropertyGroup />
|
||||
<PropertyGroup />
|
||||
<ItemGroup>
|
||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net40\Newtonsoft.Json.dll</HintPath>
|
||||
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net40\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NLog.5.2.2\lib\net35\NLog.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PdfSharp, Version=1.50.5147.0, Culture=neutral, PublicKeyToken=f94615aa0424f9eb, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.dll</HintPath>
|
||||
@@ -113,9 +118,14 @@
|
||||
<HintPath>..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.Charting.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net.Http">
|
||||
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Net.Http.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="GenerateReport.cs" />
|
||||
@@ -152,6 +162,8 @@
|
||||
<DependentUpon>PreAdjustmentControl.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="PreAdjustmentSettingsContainer.cs" />
|
||||
<Compile Include="Processes\Actions\MagFluxZeroFlow.cs" />
|
||||
<Compile Include="Processes\Actions\PressureTestProcess.cs" />
|
||||
<Compile Include="Processes\Actions\FlushProcess.cs" />
|
||||
<Compile Include="Processes\Actions\PrepareTestProcess.cs" />
|
||||
<Compile Include="Processes\Actions\AmplitudeTestProcess.cs" />
|
||||
@@ -225,6 +237,10 @@
|
||||
<Project>{2E139F63-B6FE-4EA9-A098-85364FE9B26C}</Project>
|
||||
<Name>PortCore</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Hardware\Interfaces\Protocols\ProtocolCore\ProtocolCore.csproj">
|
||||
<Project>{8BDD2789-96D4-43EA-AAD7-0F49D0347998}</Project>
|
||||
<Name>ProtocolCore</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Hardware\WaterMeter\Genesis\DataPackages\DataPackages.csproj">
|
||||
<Project>{0E524D43-7B66-45CD-AA74-41D51AFC3D99}</Project>
|
||||
<Name>DataPackages</Name>
|
||||
|
||||
@@ -6,6 +6,7 @@ using System.IO;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using Xylem.Common.CommonCore.Consts;
|
||||
using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig;
|
||||
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
|
||||
|
||||
|
||||
@@ -28,6 +28,18 @@ namespace Xylem.Common.Ui.CordonelPreadjustmentUi.Parameters
|
||||
FlowrateQmH = 100;
|
||||
DurationS = 120;
|
||||
break;
|
||||
case MeterSize.DN100:
|
||||
FlowrateQmH = 140;
|
||||
DurationS = 120;
|
||||
break;
|
||||
case MeterSize.DN125:
|
||||
FlowrateQmH = 140;
|
||||
DurationS = 120;
|
||||
break;
|
||||
case MeterSize.DN150:
|
||||
FlowrateQmH = 200;
|
||||
DurationS = 120;
|
||||
break;
|
||||
default:
|
||||
Message = $"Warning no parameter for meter size {meterSize.GetHashCode()} use default!{Environment.NewLine}";
|
||||
FlowrateQmH = 40;
|
||||
|
||||
@@ -11,7 +11,9 @@ using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
|
||||
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
|
||||
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
|
||||
using Xylem.Common.Logic.ProductionOrderCore.OrderData;
|
||||
using Xylem.Common.Ui.CordonelPreadjustmentUi.Parameters;
|
||||
|
||||
@@ -393,6 +395,7 @@ namespace CordonelPreadjustmentUi
|
||||
{
|
||||
this.l_ZeroFlowCal_TempCal.ForeColor = color;
|
||||
}
|
||||
|
||||
public enum StatusPanelItems
|
||||
{
|
||||
None = 0,
|
||||
@@ -1675,15 +1678,21 @@ namespace CordonelPreadjustmentUi
|
||||
|
||||
List<IProcess> listOfProgrammParts = new List<IProcess>();
|
||||
|
||||
|
||||
|
||||
listOfProgrammParts.Add(new PrepareTestProcess("PrepareTest", StatusPanelItems.Detect, string.Empty, string.Empty, 1 * 60));
|
||||
|
||||
listOfProgrammParts.Add(new LoginProcess("Login", StatusPanelItems.Detect, PredefinedMessages.WaitUntilLoginFinished(pp.Setting.Culture), PredefinedMessages.LoginFailed(pp.Setting.Culture), 1 * 60));
|
||||
|
||||
listOfProgrammParts.Add(new FlushProcess("First Flush", StatusPanelItems.Detect, PredefinedMessages.WaitUntilFlushFinished(pp.Setting.Culture), string.Empty, 2 * 60));
|
||||
|
||||
listOfProgrammParts.Add(new PressureTestProcess("PreussureTest", StatusPanelItems.Prepare, PredefinedMessages.WaitUntilPreparationFinished(pp.Setting.Culture), PredefinedMessages.PreparationFailed(pp.Setting.Culture), 1 * 60));
|
||||
|
||||
|
||||
listOfProgrammParts.Add(new PreparationProcess("Preparation", StatusPanelItems.Prepare, PredefinedMessages.WaitUntilPreparationFinished(pp.Setting.Culture), PredefinedMessages.PreparationFailed(pp.Setting.Culture), 1 * 60));
|
||||
|
||||
|
||||
|
||||
if (!pp.Setting.TempOnly)
|
||||
{
|
||||
listOfProgrammParts.Add(new AmplitudeTestProcess("Amplitude Test", StatusPanelItems.Amplitude, PredefinedMessages.WaitUntilAmplitudeTestFinished(pp.Setting.Culture), PredefinedMessages.AmplitudeFailed(pp.Setting.Culture), 4 * 60));
|
||||
@@ -1857,7 +1866,7 @@ namespace CordonelPreadjustmentUi
|
||||
{
|
||||
if (!pp.IsAutomaticMode)
|
||||
{
|
||||
checkMeterForFailed.Meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.ZeroFlowFailed);
|
||||
checkMeterForFailed.Meter.SetProcessState(DisplayCodes.ZeroFlowFailed);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1930,7 +1939,7 @@ namespace CordonelPreadjustmentUi
|
||||
}
|
||||
}
|
||||
|
||||
private void PushProgressBars(int totalSecondsEstm, DateTimeOffset totalStart, int currentProccessEstm, DateTimeOffset currentProccessStartTime)
|
||||
public void PushProgressBars(int totalSecondsEstm, DateTimeOffset totalStart, int currentProccessEstm, DateTimeOffset currentProccessStartTime)
|
||||
{
|
||||
if (this.InvokeRequired)
|
||||
{
|
||||
|
||||
@@ -63,6 +63,7 @@ namespace CordonelPreadjustmentUi
|
||||
public Int32 OffsetTestBadDataLimit { get; internal set; } = 3;
|
||||
#endregion
|
||||
|
||||
public bool Production = true;
|
||||
|
||||
private string CultureStr;
|
||||
public List<Int32> TempMeters = new List<Int32>() { 1, 10 };
|
||||
@@ -122,7 +123,7 @@ namespace CordonelPreadjustmentUi
|
||||
Double upperTempLimit = 35,
|
||||
Double lowerTempLimit = 15,
|
||||
Double tempDeviationLimit = 1,
|
||||
Int32 ampTestTofRecordingTime = 2,
|
||||
Int32 ampTestTofRecordingTime = 6,
|
||||
Double ampTestTriggerValue = 0.5,
|
||||
bool ampTestGenerateLogfiles = true,
|
||||
bool ampTestGenerateMeanValuesFile = true,
|
||||
|
||||
@@ -6,7 +6,9 @@ using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using Xylem.Common.CommonCore.Configuration;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
|
||||
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
|
||||
using Xylem.Common.Logic.SoftwareAccessHelper;
|
||||
using static CordonelPreadjustmentUi.PreAdjustmentControl;
|
||||
|
||||
@@ -151,7 +153,7 @@ namespace CordonelPreadjustmentUi.Processes.Actions
|
||||
{
|
||||
if (pp.IsAutomaticMode)
|
||||
{
|
||||
meterctl.Meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.ZeroFlowFailed);
|
||||
meterctl.Meter.SetProcessState(DisplayCodes.ZeroFlowFailed);
|
||||
}
|
||||
pp.DebugMessage($"{ProcessName} procedure failed", meterctl.Slot, "APP", meterctl.Meter.PcbId);
|
||||
pp.GenerateReturnNote(PredefinedMessages.CompletionFailed(pp.Setting.Culture), meterctl);
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
//using CordonelPreadjustmentUi.Processes;
|
||||
//using CordonelPreadjustmentUi.Processes.Itinerary;
|
||||
//using System;
|
||||
//using System.Collections.Generic;
|
||||
//using System.Linq;
|
||||
//using System.Threading.Tasks;
|
||||
//using static CordonelPreadjustmentUi.PreAdjustmentControl;
|
||||
|
||||
//namespace Xylem.Common.Ui.CordonelPreadjustmentUi.Processes.Actions
|
||||
//{
|
||||
// public class MagFluxZeroFlowProcess : BaseProcess
|
||||
// {
|
||||
// public MagFluxZeroFlowProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS) : base(processName, panelState, performMessage, failedMessage, expectedTimeS)
|
||||
// {
|
||||
// }
|
||||
// public override List<Task> StartWork()
|
||||
// {
|
||||
// return doWorkProcess(base.CurrentProcessProgress);
|
||||
// }
|
||||
|
||||
// private List<Task> doWorkProcess(ProcessProgress currentProcessProgress)
|
||||
// {
|
||||
// private List<Task> doWorkProcess(ProcessProgress pp)
|
||||
// {
|
||||
|
||||
|
||||
// var MetersToProcess = MeterStateCtls.Where(e => e.IsEnabled).ToList();
|
||||
|
||||
// var listOfProcessTask = new List<Task>();
|
||||
|
||||
// listOfProcessTask.Add(new Task<bool>(() =>
|
||||
// {
|
||||
|
||||
// pp.DebugMessage($"Performing {ProcessName} procedure", null, "APP");
|
||||
|
||||
// var ZeroOffsetTime = DateTimeOffset.UtcNow.AddMinutes(2);
|
||||
|
||||
// var MetersToProcess = MeterStateCtls.Where(e => e.IsEnabled).ToList();
|
||||
|
||||
|
||||
|
||||
// while (ZeroOffsetTime > DateTimeOffset.UtcNow)
|
||||
// {
|
||||
// Thread.Sleep(1000);
|
||||
// }
|
||||
|
||||
|
||||
// return true;
|
||||
// }));
|
||||
|
||||
|
||||
// return listOfProcessTask;
|
||||
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
//}
|
||||
|
||||
@@ -16,8 +16,6 @@ namespace CordonelPreadjustmentUi.Processes.Actions
|
||||
{
|
||||
public class PreparationProcess : BaseProcess
|
||||
{
|
||||
|
||||
|
||||
public PreparationProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS) : base(processName, panelState, performMessage, failedMessage, expectedTimeS)
|
||||
{
|
||||
}
|
||||
@@ -99,9 +97,17 @@ namespace CordonelPreadjustmentUi.Processes.Actions
|
||||
|
||||
Ok = WriteRegisterSafe(meterctl.Meter, "Samplerate", Register.Genesisflow.SampleRate, pp.Setting.Samplerate);
|
||||
if (CheckAbort(Ok, meterctl)) { return Ok; }
|
||||
|
||||
Ok = WriteRegisterSafe(meterctl.Meter, "Metersize", Register.Genesisflow.MeterSize, pp.Setting.MeterSize.GetHashCode(), false);
|
||||
if (CheckAbort(Ok, meterctl)) { return Ok; }
|
||||
if (pp.Setting.Production)
|
||||
{
|
||||
Ok = WriteRegisterSafe(meterctl.Meter, "Metersize", Register.Genesisflow.MeterSize, pp.Setting.MeterSize.GetHashCode(), false);
|
||||
if (CheckAbort(Ok, meterctl)) { return Ok; }
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteRegisterSafe(meterctl.Meter, "Metersize", Register.Genesisflow.MeterSize, pp.Setting.MeterSize.GetHashCode(), false);
|
||||
if (CheckAbort(Ok, meterctl)) { return Ok; }
|
||||
}
|
||||
|
||||
|
||||
Ok = WriteRegisterSafe(meterctl.Meter, "LED mode", Register.Genesisflow.LedMode, pp.Setting.LedMode.GetHashCode());
|
||||
if (CheckAbort(Ok, meterctl)) { return Ok; }
|
||||
|
||||
@@ -0,0 +1,256 @@
|
||||
namespace CordonelPreadjustmentUi.Processes.Actions
|
||||
{
|
||||
using Newtonsoft.Json;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Xylem.Common.CommonCore.Configuration;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
|
||||
using Xylem.Common.Logic.SoftwareAccessHelper;
|
||||
|
||||
using static CordonelPreadjustmentUi.PreAdjustmentControl;
|
||||
|
||||
/// <summary>
|
||||
/// Process for cordonel water meters with pressure sensor.
|
||||
/// </summary>
|
||||
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
|
||||
/// Just started implementing pressure test for water meters with pressure sensor.
|
||||
/// </remarks>
|
||||
public class PressureTestProcess : BaseProcess
|
||||
{
|
||||
/// <summary>
|
||||
/// Read / Write is pressure present for the water meter.
|
||||
/// </summary>
|
||||
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
|
||||
/// Just started implementing pressure test for water meters with pressure sensor.
|
||||
/// </remarks>
|
||||
private const string PRESSURE_PRESENT = "METROLOGYASST_PressurePresent";
|
||||
/// <summary>
|
||||
/// Read / Write pressure measurements for the water meter.
|
||||
/// </summary>
|
||||
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
|
||||
/// Just started implementing pressure test for water meters with pressure sensor.
|
||||
/// </remarks>
|
||||
private const string PRESSURE_MEASURE = "METROLOGYASST_PressureMeasure";
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for passing parameters to the base constructor of the derived class.
|
||||
/// </summary>
|
||||
/// <param name="processName">The name used to show into the GUI.</param>
|
||||
/// <param name="panelState">TODO: Get the right description. Probably the state for the box into the GUI. ???</param>
|
||||
/// <param name="performMessage">TODO: Get the right description. Probably the success message to show into the GUI. ???</param>
|
||||
/// <param name="failedMessage">TODO: Get the right description. Probably the error message to show into the GUI. ???</param>
|
||||
/// <param name="expectedTimeS">TODO: Get the right description. Probably the expected time for process the pressure tests. ???</param>
|
||||
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
|
||||
/// Just started implementing pressure test for water meters with pressure sensor.
|
||||
/// </remarks>
|
||||
public PressureTestProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS)
|
||||
: base(processName, panelState, performMessage, failedMessage, expectedTimeS)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determinates and initializes a list of pressure measure tests processes on the logedin cordonels with pressure sensor.
|
||||
/// Programm workflow for Cordonels with pressure sensor.
|
||||
/// When any of the water meters has presure sensor - load the test specification.
|
||||
/// Acording to the test specification process all meters, also the referenz on workplaces 11 and 12.
|
||||
/// <list type="number">
|
||||
/// <listheader>Measurement as follow.</listheader>
|
||||
/// <item>Measure starts with <see cref="PRESSURE_MEASURE"/> = 1</item>
|
||||
/// <item>Then registry is readeded and comaired to the referenz meters acording to the specification.</item>
|
||||
/// </list>
|
||||
/// </summary>
|
||||
/// <returns>Returns a <see cref="List{Task}"/> for processing the pressure tests on the goggedin cordonels.</returns>
|
||||
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
|
||||
/// Just started implementing pressure test for water meters with pressure sensor.
|
||||
/// </remarks>
|
||||
public override List<Task> StartWork()
|
||||
{
|
||||
/// List of the processes to start.
|
||||
var listOfPresureTestTasks = new List<Task>();
|
||||
var pressureTestSpecification = default(PressureTestSpecification);
|
||||
var pressureTestSpecificationLoaded = false;
|
||||
/// Just to not lose from focus the process progrss object.
|
||||
var processProgress = base.CurrentProcessProgress;
|
||||
var minPressureReferenzValue = default(int?);
|
||||
var maxPressureReferenzValue = default(int?);
|
||||
|
||||
/// Looping trough all <see cref="MeterStateControl"/>s to determinate whitch are with pressure sensor.
|
||||
foreach (var meterStateControl in base.MeterStateCtls)
|
||||
{
|
||||
/// If the meter is enabled and pressure sensor is present a new pressure mesure task should be initialized and added to the processes list.
|
||||
if (meterStateControl.IsEnabled)
|
||||
{
|
||||
/// Getting the meter object from the state control.
|
||||
var meter = meterStateControl.Meter;
|
||||
/// Reads the buffer for determinating if the pressure sensor is present.
|
||||
var isPressurePresentBuffer = meter.ReadRegister(PRESSURE_PRESENT);
|
||||
/// Converted value for determinating if the pressure sensor is present.
|
||||
var isPressurePresent = RegisterConverter.ConvertTo<bool>(isPressurePresentBuffer);
|
||||
|
||||
if (!isPressurePresent)
|
||||
{
|
||||
processProgress.DebugMessage($"Watermeter has no pressure sensor!", meterStateControl.Slot, "DC", meter.PcbId);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/// Loads the pressure test specification from the defined web service if not yet loaded.
|
||||
if (pressureTestSpecification is null && !pressureTestSpecificationLoaded)
|
||||
{
|
||||
pressureTestSpecificationLoaded = true;
|
||||
pressureTestSpecification = this.LoadPressureTestSpecification();
|
||||
|
||||
/// if loading fails
|
||||
if (pressureTestSpecification is null)
|
||||
{
|
||||
processProgress.DebugMessage($"Test specification could not be loaded properly!", meterStateControl.Slot, "DC", meter.PcbId);
|
||||
|
||||
// TODO: Handle possible exceptions by making http request.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/// Initialize min and max referenz values ones for all meters
|
||||
if (minPressureReferenzValue is null)
|
||||
{
|
||||
/// setting the min and max values on their oposit values.
|
||||
/// checking the equality later will set up a value by 1 or more referenz meters.
|
||||
minPressureReferenzValue = int.MaxValue;
|
||||
maxPressureReferenzValue = int.MinValue;
|
||||
|
||||
if (processProgress.Setting.GetTempUseTempFlansh() || TempMeterStateCtls.Any(a => a.IsEnabled))
|
||||
{
|
||||
/// Determinates the min and max values aus temperatur meters list.
|
||||
foreach (var referenzMeterState in base.TempMeterStateCtls)
|
||||
{
|
||||
if (referenzMeterState.IsEnabled)
|
||||
{
|
||||
var referenzMeter = referenzMeterState.Meter;
|
||||
/// Reset meter pressure
|
||||
referenzMeter.WriteRegister(PRESSURE_MEASURE, 1);
|
||||
|
||||
if (!referenzMeter.IsLoggedOn)
|
||||
{
|
||||
referenzMeter.Login();
|
||||
}
|
||||
|
||||
var referenzPressureBuffer = referenzMeter.ReadRegister(PRESSURE_MEASURE);
|
||||
var referenzPressure = RegisterConverter.ConvertTo<int>(referenzPressureBuffer);
|
||||
|
||||
if (referenzPressure < minPressureReferenzValue)
|
||||
{
|
||||
minPressureReferenzValue = referenzPressure;
|
||||
}
|
||||
|
||||
if (referenzPressure > maxPressureReferenzValue)
|
||||
{
|
||||
maxPressureReferenzValue = referenzPressure;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Continue if min pressure value is still its oposit for the type. There was no referenz zehler found.
|
||||
if (minPressureReferenzValue == int.MaxValue)
|
||||
{
|
||||
processProgress.DebugMessage($"No referenz watermeter found!", meterStateControl.Slot, "DC", meter.PcbId);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
listOfPresureTestTasks.Add(new Task<bool>(() =>
|
||||
{
|
||||
var measuredTestValues = new int[pressureTestSpecification.NumberOfMeasurements];
|
||||
var measurementDelyInS = pressureTestSpecification.TimeMeasurementsInS * 1000;
|
||||
var numberOfMeasurements = pressureTestSpecification.NumberOfMeasurements;
|
||||
var testDate = DateTime.Now;
|
||||
|
||||
for (int measurement = 0; measurement < numberOfMeasurements; measurement++)
|
||||
{
|
||||
/// Reset meter pressure
|
||||
meter.WriteRegister(PRESSURE_MEASURE, 1);
|
||||
|
||||
/// Read the new meter pressure
|
||||
var pressureMeasureBuffer = meter.ReadRegister(PRESSURE_MEASURE);
|
||||
var pressureInPascals = RegisterConverter.ConvertTo<int>(pressureMeasureBuffer);
|
||||
|
||||
measuredTestValues[measurement] = pressureInPascals;
|
||||
processProgress.DebugMessage($"Measure {measurement + 1}: {pressureInPascals}Pa", meterStateControl.Slot, "DC", meter.PcbId);
|
||||
|
||||
/// Dely only for first n - 1 measurements
|
||||
if (measurement < numberOfMeasurements - 1)
|
||||
{
|
||||
Thread.Sleep(measurementDelyInS);
|
||||
}
|
||||
}
|
||||
|
||||
var avgPressure = (int)measuredTestValues.Average();
|
||||
var testPassed = minPressureReferenzValue <= avgPressure && avgPressure <= maxPressureReferenzValue;
|
||||
var avgPressureInBars = avgPressure / 100_000F;
|
||||
|
||||
processProgress.DebugMessage($"Average pressure: {avgPressure}Pa", meterStateControl.Slot, "DC", meter.PcbId);
|
||||
processProgress.DebugMessage($"Average pressure: {avgPressureInBars}Bar", meterStateControl.Slot, "DC", meter.PcbId);
|
||||
|
||||
if (!this.PostPressureTestResult(meter.PcbId, avgPressureInBars, testPassed, testDate))
|
||||
{
|
||||
processProgress.DebugMessage($"Test result was not posted!", meterStateControl.Slot, "DC", meter.PcbId);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return testPassed;
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return listOfPresureTestTasks;
|
||||
}
|
||||
|
||||
private PressureTestSpecification LoadPressureTestSpecification()
|
||||
{
|
||||
try
|
||||
{
|
||||
var responseContent = LocalWebRequest.GetRequest(ServiceUrls.GetPressureSensorSpecificationURL);
|
||||
|
||||
return JsonConvert.DeserializeObject<PressureTestSpecification>(responseContent);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private bool PostPressureTestResult(string pcbIdText, float avgPressure, bool passed, DateTime testDate)
|
||||
{
|
||||
try
|
||||
{
|
||||
return LocalWebRequest.PostRequestAsync(ServiceUrls.PostPressureSensorResultURL, json: new
|
||||
{
|
||||
PcbId = int.TryParse(pcbIdText, out int pcbId) ? pcbId : default(int?),
|
||||
AvgPressureInBar = avgPressure,
|
||||
TestPassed = passed,
|
||||
TestDate = testDate,
|
||||
});
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class PressureTestSpecification
|
||||
{
|
||||
public int NumberOfMeasurements { get; set; }
|
||||
|
||||
public int TimeMeasurementsInS { get; set; }
|
||||
|
||||
public float MaxDeviationInBar { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ namespace CordonelPreadjustmentUi.Processes
|
||||
public readonly string PerformMessage;
|
||||
public readonly int ExpectedTimeS;
|
||||
public DateTimeOffset StartTime;
|
||||
|
||||
public BaseProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS = null)
|
||||
{
|
||||
ProcessName = processName;
|
||||
@@ -30,6 +31,7 @@ namespace CordonelPreadjustmentUi.Processes
|
||||
|
||||
ExpectedTimeS = expectedTimeS.HasValue ? expectedTimeS.Value : 0;
|
||||
}
|
||||
|
||||
internal List<MeterStateControl> AllMeterStateCtrls()
|
||||
{
|
||||
var r = new List<MeterStateControl>();
|
||||
@@ -75,29 +77,29 @@ namespace CordonelPreadjustmentUi.Processes
|
||||
|
||||
|
||||
var completTasks = new Task(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
while (!listOfProcessTasks.All(t => t.IsCompleted))
|
||||
{
|
||||
try
|
||||
if (pp.CancellationSource != null && pp.CancellationSource.IsCancellationRequested)
|
||||
{
|
||||
while (!listOfProcessTasks.All(t => t.IsCompleted))
|
||||
{
|
||||
if (pp.CancellationSource != null && pp.CancellationSource.IsCancellationRequested)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Thread.Sleep(5);
|
||||
}
|
||||
|
||||
GetSequenceResult($"{ProcessName} sequence");
|
||||
pp.IsBusy = false;
|
||||
return;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Thread.Sleep(5);
|
||||
}
|
||||
|
||||
throw new ApplicationException("Error on waiting for completition", ex);
|
||||
}
|
||||
GetSequenceResult($"{ProcessName} sequence");
|
||||
pp.IsBusy = false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
throw new ApplicationException("Error on waiting for completition", ex);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
});
|
||||
completTasks.Start();
|
||||
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ using System.Globalization;
|
||||
using System.Threading;
|
||||
using Logic.ProductionToProductMapper.Cordonel;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
|
||||
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
|
||||
using Xylem.Common.Ui.CordonelPreadjustmentUi;
|
||||
using System.Collections.Generic;
|
||||
using Xylem.Common.Logic.ProductionOrderCore.OrderData;
|
||||
|
||||
@@ -9,6 +9,8 @@ using System.Linq;
|
||||
using System.Threading;
|
||||
using Logic.ProductionToProductMapper.Cordonel;
|
||||
using Xylem.Common.CommonCore.Consts;
|
||||
using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
|
||||
using Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.EventArguments;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords;
|
||||
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig;
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<appSettings>
|
||||
<add key="GetPressureSensorSpecificationURL" value="http://sla12iis01.emea.sensus.net/MeterProcessState/api/CordonelPressureSensorTest/GetTestSpec"/>
|
||||
<add key="PostPressureSensorResultURL" value="http://sla12iis01.emea.sensus.net/MeterProcessState/api/CordonelPressureSensorTest/PostTestResults"/>
|
||||
<add key="PressureSensorResultsURL" value="http://sla12iis01.emea.sensus.net/MeterProcessState/api/CordonelPressureSensorTest/GetTestResults/{0}"/>
|
||||
</appSettings>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net40" />
|
||||
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net40" />
|
||||
<package id="NLog" version="5.2.2" targetFramework="net40" />
|
||||
<package id="PDFsharp" version="1.50.5147" targetFramework="net40" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user