Start/EndTestingSealedMeter activity for iPerlCommunicationForm.

This commit is contained in:
Milan Hanajik 2022-09-06 19:55:54 +02:00
parent 0e77a31a0f
commit b044b00571
5 changed files with 175 additions and 9 deletions

View File

@ -91,6 +91,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
public const string Write2HzCorrectionStr = "Write 2Hz correction";
public const string DewaReworkRLStr = "DEWA rework R-L";
public const string DewaReworkLRStr = "DEWA rework L-R";
public const string StartTestingSealedMetersStr = "Start testing sealed meters";
public const string EndTestingSealedMetersStr = "End testing sealed meters";
public static Color DisabledColor = Color.DarkGray;
public static Color OptoAndDirOKColor = Color.Green;
@ -1230,7 +1232,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
else if (currentActivity.ToLower() == GetDefaultQ2CorrectionsStr.ToLower()) error = GetQ2PreCorrectionsFormRest(threadID, ihead, wm, ref resultStr);
else if (currentActivity.ToLower() == DewaReworkRLStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.R_L, ref resultStr);
else if (currentActivity.ToLower() == DewaReworkLRStr.ToLower()) error = DewaRework(ihead, wm, FlowDir.L_R, ref resultStr);
else if (currentActivity.ToLower().Contains(StartTestingSealedMetersStr.ToLower())) error = StartTestingSealedMeter(ihead, wm, ref resultStr);
else if (currentActivity.ToLower().Contains(EndTestingSealedMetersStr.ToLower())) error = EndTestingSealedMeter(ihead, wm, ref resultStr);
#endif
else
{
@ -2950,12 +2953,12 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
return error;
}
/// <summary>
/// DEWA rework.
/// </summary>
/// <param name="ihead">iPERL head object</param>
/// <param name="wm">Water meter object</param>
/// <param name="flowDir">Arrow direction</param>
/// <param name="resultStr">String passed to caller</param>
/// <returns>true on success</returns>
static CommErr DewaRework(IperlHead ihead, Results.Entities.WaterMeter wm, FlowDir flowDir, ref string resultStr)
@ -3027,6 +3030,155 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
}
}
/// <summary>
/// Start testing a sealed meter
/// </summary>
/// <param name="ihead">iPERL head object</param>
/// <param name="wm">Water meter object</param>
/// <param name="resultStr">String passed to caller</param>
/// <returns>true on success</returns>
static CommErr StartTestingSealedMeter(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
Byte testModeConfig = 0xA0; /// Default value
///
if (multiTestParams[currentActivityStep].Activity.Length > StartTestingSealedMetersStr.Length)
{
string testModeConfigStr = multiTestParams[currentActivityStep].Activity.Substring(StartTestingSealedMetersStr.Length + 1);
UInt16 byteVal;
if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255)
{
testModeConfig = (Byte)byteVal; /// Update with specified value
}
}
iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[]
{
new iPerlDataWrite(MessageID.MetrologyMemory, 0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), /// 0x5A=sealed, 0xA5=unsealed
new iPerlDataWrite(MessageID.RadioPassthrough, 0x1804, new byte[] { (byte)1 }, "System Status"),
new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
new iPerlDataWrite(MessageID.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
};
if (ihead.ConfigStruct != null) ihead.OrigTestModeConfig = ihead.ConfigStruct.TestModeConfig;
int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step
int mask = 1;
foreach (var wData in dataToBeWritten)
{
bool isSuccessfullyWritten = false;
for (int j = 0; j < cfg.MaxCommRetries; j++)
{
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.Offset, wData.Data.Length, wData.Data, cfg.CommTimeout))
{
isSuccessfullyWritten = true;
break;
}
/// Delay between retries
if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
}
if (!isSuccessfullyWritten)
{
/// Communication failed in this step
successfyllyWrittenFlags = (successfyllyWrittenFlags | mask);
}
mask = (mask << 1); /// Adjust the mask for the next step
}
ClosePort(ihead); /// Close RFID port
if (successfyllyWrittenFlags == 0)
{
/// Success
if (ihead.ConfigStruct != null)
{
ihead.ConfigStruct.MeterState = MeterState.Active;
ihead.ConfigStruct.TestModeConfig = (byte)0xA0;
}
resultStr = "OK";
return CommErr.None;
}
else
{
return CommErr.Write;
}
}
/// <summary>
/// End testing a sealed meter
/// </summary>
/// <param name="ihead">iPERL head object</param>
/// <param name="wm">Water meter object</param>
/// <param name="resultStr">String passed to caller</param>
/// <returns>true on success</returns>
static CommErr EndTestingSealedMeter(IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
{
if (ihead.CommFailed) return CommErr.CommFailed;
if (OpenPort(ihead) != 0) return CommErr.OpenPort; /// Open RFID port
Byte testModeConfig = (ihead.OrigTestModeConfig != 0) ? ihead.OrigTestModeConfig : (byte)0x80; /// Restore original value (default is 0x80)
iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[]
{
new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
new iPerlDataWrite(MessageID.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
new iPerlDataWrite(MessageID.RadioPassthrough, 0x1804, new byte[] { (byte)0 }, "System Status"),
new iPerlDataWrite(MessageID.MetrologyMemory, 0x19A1, new byte[] { (byte)0x5A }, "Close Sealing"),
};
int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step
int mask = 1;
foreach (var wData in dataToBeWritten)
{
bool isSuccessfullyWritten = false;
for (int j = 0; j < cfg.MaxCommRetries; j++)
{
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.Offset, wData.Data.Length, wData.Data, cfg.CommTimeout))
{
isSuccessfullyWritten = true;
break;
}
/// Delay between retries
if (cfg.DelayBetweenRetries > 0) Thread.Sleep(cfg.DelayBetweenRetries);
}
if (!isSuccessfullyWritten)
{
/// Communication failed in this step
successfyllyWrittenFlags = (successfyllyWrittenFlags | mask);
}
mask = (mask << 1); /// Adjust the mask for the next step
}
ClosePort(ihead); /// Close RFID port
if (successfyllyWrittenFlags == 0)
{
/// Success
if (ihead.ConfigStruct != null)
{
ihead.ConfigStruct.MeterState = MeterState.Active;
ihead.ConfigStruct.TestModeConfig = (byte)0xA0;
}
resultStr = "OK";
return CommErr.None;
}
else
{
return CommErr.Write;
}
}
static CommErr GetQ2PreCorrectionsFormRest(int threadId, IperlHead ihead, Results.Entities.WaterMeter wm, ref string resultStr)
{

View File

@ -86,6 +86,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
retVal.Add(iPerlCommunicationForm.Write2HzCorrectionStr);
retVal.Add(iPerlCommunicationForm.DewaReworkRLStr);
retVal.Add(iPerlCommunicationForm.DewaReworkLRStr);
retVal.Add(iPerlCommunicationForm.StartTestingSealedMetersStr);
retVal.Add(iPerlCommunicationForm.EndTestingSealedMetersStr);
retVal.Add(string.Format("{0} if enabled", iPerlCommunicationForm.ReadConfigurationStr));
retVal.Add(string.Format("{0} 80", iPerlCommunicationForm.SetTestModeStr));
retVal.Add("iPerl_check prevWorkStep direction q2factors");

View File

@ -103,6 +103,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
public CalibrationStruct CalibrationStruct; /// CalibrationStruct of WM obtained or updated by iPerlCommunication
public CalibrationStructV4 CalibrationStructV4; /// CalibrationStruct of WM obtained or updated by iPerlCommunication
public Byte OrigTestModeConfig; /// Written to by StartTestingSealedMeter(), read from by EndTestingSealedMeter()
public ushort OrigCalibFactor;
public ushort CalibFactor
{
@ -451,6 +453,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
CalibrationStruct = null;
CalibrationStructV4 = null;
OrigTestModeConfig = 0;
LastTestResult = null;
LastTestResult2 = null;

View File

@ -328,7 +328,9 @@ namespace TBF.UI.Procedures
catch (Exception exc)
{
transaction.Rollback();
log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", newProcedure.Name, exc.Message);
log.ErrorFormat("Could not save procedure '{0}':", newProcedure.Name);
log.ErrorFormat("Exception: {0}", exc.Message);
if (exc.InnerException != null) log.ErrorFormat("InnerException: {0}", exc.InnerException.Message);
}
}
}
@ -563,8 +565,10 @@ namespace TBF.UI.Procedures
}
catch (Exception exc)
{
log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", modifiedProcedure.Name, exc.Message);
transaction.Rollback();
log.ErrorFormat("Could not save procedure '{0}':", modifiedProcedure.Name);
log.ErrorFormat("Exception: {0}", exc.Message);
if (exc.InnerException != null) log.ErrorFormat("InnerException: {0}", exc.InnerException.Message);
transaction.Rollback();
}
}
session.Flush();
@ -847,7 +851,9 @@ namespace TBF.UI.Procedures
catch (Exception exc)
{
transaction.Rollback();
log.ErrorFormat("Exception when saving Procedure '{0}' : {1}", newProcedure.Name, exc.Message);
log.ErrorFormat("Could not save procedure '{0}':", newProcedure.Name);
log.ErrorFormat("Exception: {0}", exc.Message);
if (exc.InnerException != null) log.ErrorFormat("InnerException: {0}", exc.InnerException.Message);
}
}
}

View File

@ -75,13 +75,15 @@ namespace TBF.UI.Procedures.TestWizard
{
if (test == null) return;
foreach (var path in sensorPaths) sensorsComboBox.Items.Add(path.Name);
qFromTextBox.Text = Units.ConvertTo(flowUnit, test.Qfrom).ToString();
qToTextBox.Text = Units.ConvertTo(flowUnit, test.Qto).ToString();
selectorComboBox.Items.Add(EmptySelector);
foreach (var selector in selectorValues) selectorComboBox.Items.Add(selector);
selectorComboBox.Text = EmptySelector;
foreach (var path in sensorPaths) sensorsComboBox.Items.Add(path.Name);
qFromTextBox.Text = Units.ConvertTo(flowUnit, test.Qfrom).ToString();
qToTextBox.Text = Units.ConvertTo(flowUnit, test.Qto).ToString();
nextButton.Enabled = IsFormValid();
}