319 lines
13 KiB
C#
319 lines
13 KiB
C#
using CordonelPreadjustmentUi.Processes.Itinerary;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
|
|
using Xylem.Common.Ui.CordonelPreadjustmentUi.Helper.Extensions;
|
|
|
|
using static CordonelPreadjustmentUi.PreAdjustmentControl;
|
|
|
|
namespace CordonelPreadjustmentUi.Processes.Actions
|
|
{
|
|
public class TemperatureCalibrationProcess : BaseProcess
|
|
{
|
|
public TemperatureCalibrationProcess(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 pp)
|
|
{
|
|
#region Wait for settling time (60s)
|
|
for (Int32 Time = pp.Setting.OffsetTestSettlingTime; Time >= 0; Time--)
|
|
{
|
|
|
|
pp.StatusLabel = $"{PredefinedMessages.ZeroflowOffsetWaitForSettling(pp.Setting.Culture)}{Time.ToString(pp.Setting.Culture)}";
|
|
Thread.Sleep(1000);
|
|
}
|
|
#endregion
|
|
|
|
var MetersToProcess = MeterStateCtls.Where(e => e.IsEnabled).ToList();
|
|
|
|
var listOfProcessTask = new List<Task>();
|
|
|
|
|
|
pp.StatusLabel = (PredefinedMessages.WaitUntilTemperatureAcquisitionFinished(pp.Setting.Culture));
|
|
bool skipMan = false;
|
|
if (pp.Setting.GetTempUseTempFlansh() || TempMeterStateCtls.Any(a => a.IsEnabled))
|
|
{
|
|
skipMan = false;
|
|
//aoutmatic
|
|
decimal avgTemp = 0;
|
|
int TempFlanshCount = 0;
|
|
var listOFEnabledTempMeters = TempMeterStateCtls.Where(a => a.IsEnabled).ToList();
|
|
foreach (var avgTempCtls in listOFEnabledTempMeters)
|
|
{
|
|
var check = avgTempCtls.GetTemperature();
|
|
if (check > 5 && (double)check != 25.0d )
|
|
{
|
|
avgTemp = avgTemp + avgTempCtls.GetTemperature();
|
|
TempFlanshCount = TempFlanshCount + 1;
|
|
skipMan = true;
|
|
}
|
|
|
|
}
|
|
if (TempFlanshCount <= 1)
|
|
{
|
|
System.Windows.Forms.MessageBox.Show("Fehler beim auslesen der TemperaturFlansche.");
|
|
throw new ApplicationException("No TempFlansch");
|
|
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
avgTemp = avgTemp / TempFlanshCount;
|
|
|
|
foreach (var meterctl in MetersToProcess)
|
|
{
|
|
meterctl.SetTemperature(avgTemp);
|
|
|
|
}
|
|
pp.RequestTemperatur();
|
|
while (!pp.PushedTestBenchTemp.HasValue)
|
|
{
|
|
Thread.Sleep(5000);
|
|
}
|
|
|
|
foreach (var putTempIntoMeter in MetersToProcess)
|
|
{
|
|
if (Math.Abs(Convert.ToDecimal(pp.PushedTestBenchTemp.Value) - avgTemp) > (decimal)2.0)
|
|
{
|
|
System.Windows.Forms.MessageBox.Show("Abweichung von SPS zu Flansch gößer als 2°C");
|
|
}
|
|
putTempIntoMeter.Meter.calibrationResult.AddAdditionalLog($"SPS Temp", Convert.ToDecimal(pp.PushedTestBenchTemp.Value).ToString());
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!skipMan)
|
|
{
|
|
//manual input
|
|
foreach (var meterctl in MetersToProcess)
|
|
{
|
|
meterctl.SetTemperature((decimal)0);
|
|
}
|
|
|
|
if (pp.Setting.GetTempUsePtOverSps())
|
|
{
|
|
pp.RequestTemperatur();
|
|
|
|
}
|
|
else
|
|
{
|
|
pp.RequestTempretureSelection();
|
|
|
|
}
|
|
while (!pp.TempretureSelected)
|
|
{
|
|
Thread.Sleep(5000);
|
|
}
|
|
foreach (var meterctl in TempMeterStateCtls)
|
|
{
|
|
|
|
meterctl.OnTempretureChangedHandler += delegate (Object sender, EventArgsDecimal d)
|
|
{
|
|
decimal avgTemp = 0;
|
|
foreach (var tempMeter in TempMeterStateCtls)
|
|
{
|
|
avgTemp = avgTemp + tempMeter.GetTemperature();
|
|
}
|
|
|
|
avgTemp = avgTemp / TempMeterStateCtls.Count;
|
|
|
|
foreach (var updateMeter in MetersToProcess)
|
|
{
|
|
updateMeter.SetTemperature(avgTemp);
|
|
}
|
|
|
|
};
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pp.DebugMessage($"Performing {ProcessName} procedure");
|
|
|
|
listOfProcessTask.Add(new Task<bool>(() =>
|
|
{
|
|
|
|
|
|
if (pp.Setting.GetTempUsePtOverSps() && pp.PushedTestBenchTemp.HasValue)
|
|
{
|
|
foreach (var updateMeter in MetersToProcess)
|
|
{
|
|
updateMeter.SetTemperature(Convert.ToDecimal(pp.PushedTestBenchTemp.Value));
|
|
}
|
|
}
|
|
var listOfSubTasks = new List<Task<bool>>();
|
|
foreach (var disableTempInputMeter in MetersToProcess)
|
|
{
|
|
disableTempInputMeter.DisableTemperatureinput(true);
|
|
}
|
|
foreach (var disableTempInputMeter in TempMeterStateCtls)
|
|
{
|
|
disableTempInputMeter.DisableTemperatureinput(true);
|
|
}
|
|
|
|
|
|
foreach (var putTempIntoMeter in MetersToProcess)
|
|
{
|
|
listOfSubTasks.Add(new Task<bool>(() =>
|
|
{
|
|
|
|
var originTemp = putTempIntoMeter.GetTemperature();
|
|
if (originTemp == (decimal)25.0 || originTemp == (decimal)1 || originTemp == (decimal)0)
|
|
{
|
|
pp.DebugMessage($"Temperature check failed - default", putTempIntoMeter.Meter.Slot, "APP", putTempIntoMeter.Meter.PcbId);
|
|
return false;
|
|
}
|
|
UInt32 TempToRegister = (UInt32)(originTemp * 4096);
|
|
|
|
#region Set temperature calibration register
|
|
var Ok = false;
|
|
pp.StatusLabel = PredefinedMessages.WaitUntilRegisterWriteFinished(pp.Setting.Culture);
|
|
Ok = WriteRegisterSafe(putTempIntoMeter.Meter, "Temperature calibration", Register.Genesisflow.ToFTempCalibrate, TempToRegister, false);
|
|
if (CheckAbort(Ok, putTempIntoMeter)) { return Ok; }
|
|
putTempIntoMeter.Meter.calibrationResult.AddAdditionalLog($"Temperature calibration Register", TempToRegister.ToString());
|
|
putTempIntoMeter.Meter.calibrationResult.AddAdditionalLog($"Temperature calibration Origin", originTemp.ToString());
|
|
|
|
#endregion
|
|
#region Wait for some seconds
|
|
const UInt16 WaitingTime = 10;
|
|
|
|
|
|
putTempIntoMeter.Meter.listOfTotalTimeOfFlightSPerPath.Update(null, new List<Double>());
|
|
putTempIntoMeter.Meter.CurrentRecords.Clear();
|
|
putTempIntoMeter.Meter.logAmpTest = true;
|
|
|
|
|
|
for (Int32 Seconds = 0; Seconds < WaitingTime; Seconds++) // eight seconds remove /2
|
|
{
|
|
Ok = ActivityCheck(pp, putTempIntoMeter.Meter.listOfTotalTimeOfFlightSPerPath, Seconds);
|
|
if (CheckAbort(Ok, putTempIntoMeter))
|
|
{
|
|
|
|
pp.DebugMessage($"Activity check failed", putTempIntoMeter.Meter.Slot, "DC", putTempIntoMeter.Meter.PcbId);
|
|
return Ok;
|
|
}
|
|
pp.StatusLabel = $"{PredefinedMessages.WaitSeconds(Seconds, pp.Setting.Culture)}";
|
|
Thread.Sleep(1000);
|
|
}
|
|
#endregion
|
|
#region Check temperature
|
|
putTempIntoMeter.Meter.CurrentRecords.Clear();
|
|
putTempIntoMeter.Meter.logAmpTest = true;
|
|
Thread.Sleep(1000);
|
|
var tmpTempCheckRecords = putTempIntoMeter.Meter.CurrentRecords.ToList();
|
|
if (tmpTempCheckRecords.Any())
|
|
{
|
|
|
|
|
|
var checkTempMeter = (decimal)tmpTempCheckRecords.Average(a => a.TemperatureDegC);
|
|
|
|
var sbTemp = new StringBuilder();
|
|
|
|
sbTemp.AppendLine(
|
|
$"Ref. temp = {Math.Round(originTemp, 2).ToString("00.00", pp.Setting.Culture)}°C vs. Meter temp = {checkTempMeter}°C at {putTempIntoMeter.Meter.Slot}");
|
|
|
|
if (Math.Abs(originTemp - checkTempMeter) > (decimal)pp.Setting.TempDeviationLimit)
|
|
{
|
|
pp.DebugMessage($"Temperature check failed", putTempIntoMeter.Meter.Slot, "APP", putTempIntoMeter.Meter.PcbId);
|
|
Ok = false;
|
|
}
|
|
if (CheckAbort(Ok, putTempIntoMeter)) { return Ok; }
|
|
|
|
pp.DebugMessage($"Temperature check OK", putTempIntoMeter.Meter.Slot, "APP", putTempIntoMeter.Meter.PcbId);
|
|
|
|
#endregion
|
|
|
|
|
|
#region Get 'TOF offset' registers
|
|
if (pp.Setting.NumberOfPaths > 0)
|
|
{
|
|
byte[] rawResult;
|
|
Ok = ReadRegister(putTempIntoMeter.Meter, "TOF offset1", Register.Genesisflow.ToFTempOffset1, out rawResult);
|
|
if (CheckAbort(Ok, putTempIntoMeter)) { return Ok; }
|
|
if (rawResult != null)
|
|
{
|
|
var tmp = BitConverter.ToInt32(rawResult, 0);
|
|
}
|
|
|
|
}
|
|
if (pp.Setting.NumberOfPaths > 1)
|
|
{
|
|
byte[] rawResult;
|
|
Ok = ReadRegister(putTempIntoMeter.Meter, "TOF offset2", Register.Genesisflow.ToFTempOffset2, out rawResult);
|
|
if (CheckAbort(Ok, putTempIntoMeter)) { return Ok; }
|
|
if (rawResult != null)
|
|
{
|
|
var tmp = BitConverter.ToInt32(rawResult, 0);
|
|
}
|
|
|
|
}
|
|
|
|
if (pp.Setting.NumberOfPaths > 2)
|
|
{
|
|
byte[] rawResult;
|
|
Ok = ReadRegister(putTempIntoMeter.Meter, "TOF offset3", Register.Genesisflow.ToFTempOffset3, out rawResult);
|
|
if (CheckAbort(Ok, putTempIntoMeter)) { return Ok; }
|
|
if (rawResult != null)
|
|
{
|
|
var tmp = BitConverter.ToInt32(rawResult, 0);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
|
|
|
|
putTempIntoMeter.SetWatcher((decimal)pp.Setting.LowerTempLimit, (decimal)pp.Setting.UpperTempLimit, (decimal)pp.Setting.TempDeviationLimit);
|
|
putTempIntoMeter.StartTempWatch();
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
pp.DebugMessage($"Temperature check failed - No Records", putTempIntoMeter.Meter.Slot, "APP", putTempIntoMeter.Meter.PcbId);
|
|
return false;
|
|
}
|
|
|
|
}));
|
|
}
|
|
|
|
listOfSubTasks.ForEach(t => t.Start());
|
|
while (!listOfSubTasks.All(t => t.IsCompleted))
|
|
{
|
|
Thread.Sleep(5);
|
|
}
|
|
|
|
return true;
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
return listOfProcessTask;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|