FM2014: - commands from char to string

This commit is contained in:
Thomas Wiedebusch 2026-01-13 12:29:55 +01:00
parent ba1569ae10
commit 57422da856
5 changed files with 309 additions and 208 deletions

View File

@ -51,11 +51,23 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
/// <summary>
///
/// </summary>
CMD_UNLOCK_ERASE,
CMD_UNLOCK_SETUP,
/// <summary>
///
/// </summary>
CMD_DEF_MEAS_SETUP,
CMD_ERASE_SETUP,
/// <summary>
///
/// </summary>
CMD_READ_DEF_MEAS_SETUP,
/// <summary>
///
/// </summary>
CMD_ACT_DEF_MEAS_SETUP,
/// <summary>
///
/// </summary>
CMD_STORE_DEF_MEAS_SETUP,
/// <summary>
///
/// </summary>
@ -63,11 +75,15 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
/// <summary>
///
/// </summary>
CMD_PRINT_INFO,
CMD_PRINT_APP_INFO,
/// <summary>
///
/// </summary>
CMD_BAUDRATE_ALL,
CMD_PRINT_BOOT_INFO,
/// <summary>
///
/// </summary>
CMD_BAUDRATE_PC,
/// <summary>
///
/// </summary>
@ -251,9 +267,9 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
public readonly CmdName CmdName;
/// <summary>
/// Code being sent to FM2014 as character
/// Code being sent to FM2014 as string
/// </summary>
public readonly Char CmdCodeChar;
public readonly String CmdCodeStr;
/// <summary>
/// Command type regarding the address (broadcast or individual) and answer
@ -269,13 +285,13 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
/// Single command table entry to combine the name with the code and the communication type
/// </summary>
/// <param name="cmdName">Enumerator of command name acronym</param>
/// <param name="cmdCodeChar">Code being sent to FM2014 as character</param>
/// <param name="cmdCodeStr">Code being sent to FM2014 as string</param>
/// <param name="cmdType">Command type regarding the address (broadcast or individual) and answer</param>
/// <param name="cmdInfoStr">Multilingual command information string</param>
public Cmd(CmdName cmdName, Char cmdCodeChar, CmdType cmdType, String cmdInfoStr)
public Cmd(CmdName cmdName, String cmdCodeStr, CmdType cmdType, String cmdInfoStr)
{
CmdName = cmdName;
CmdCodeChar = cmdCodeChar;
CmdCodeStr = cmdCodeStr;
CmdType = cmdType;
CmdInfoStr = cmdInfoStr;
}
@ -289,23 +305,28 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
/// <summary>
/// FM2014 Ascii string delimiter
/// </summary>
public const Char END_OF_STRING = '\r';
public const String END_OF_STR = "\r";
/// <summary>
/// Character for address assignment in advance to the address number
/// String for address assignment in advance to the address number
/// </summary>
public const Char ADDR_RECORD_CHAR = '*';
public const String ADDR_RECORD_STR = "**";
/// <summary>
/// Address assignment validation behind the address number
/// </summary>
public const Char ADDR_VALIDATION_CHAR = '@';
public const String ADDR_VALIDATION_STR = "@";
// Unicode chars for command table
private const Char UNICODE_ACK = '\u0006';
private const Char UNICODE_DLE = '\u0010';
private const Char UNICODE_DC1 = '\u0011';
private const Char UNICODE_DC2 = '\u0012';
/// <summary>
/// Broadcast address for FM2014 all connected devices without answer
/// </summary>
public const String BROADCAST_ADDRESS = "**0@";
// Unicode Strings for command table
private const String UNICODE_ACK = "\u0006";
private const String UNICODE_DLE = "\u0010";
private const String UNICODE_DC1 = "\u0011";
private const String UNICODE_DC2 = "\u0012";
/// <summary>
/// Complete command table
@ -313,54 +334,58 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
public static List<Cmd> CmdTbl = new List<Cmd>
{
// FM2014 control and information
new Cmd(CmdName.CMD_UNLOCK_ERASE, '&', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgUnlockErase),
new Cmd(CmdName.CMD_DEF_MEAS_SETUP, '%', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDefMeasSetup),
new Cmd(CmdName.CMD_BOOT_MODE, '$', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgBootMode),
new Cmd(CmdName.CMD_PRINT_INFO, '?', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgPrintInfo),
new Cmd(CmdName.CMD_BAUDRATE_ALL, '=', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgBaudrateAll),
new Cmd(CmdName.CMD_GET_VIRTUAL_ADDRESS, ' ', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetVirtualAddress),
new Cmd(CmdName.CMD_SERIAL, '#', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgSerial),
new Cmd(CmdName.CMD_UNLOCK_SETUP, "&U@", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgUnlock),
new Cmd(CmdName.CMD_ERASE_SETUP, "&E@", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgErase),
new Cmd(CmdName.CMD_READ_DEF_MEAS_SETUP, "%D@", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgReadDefMeasSetup),
new Cmd(CmdName.CMD_ACT_DEF_MEAS_SETUP, "%A@", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgActualDefMeasSetup),
new Cmd(CmdName.CMD_STORE_DEF_MEAS_SETUP, "%S@", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgStoreDefMeasSetup),
new Cmd(CmdName.CMD_BOOT_MODE, "$B@", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgBootMode),
new Cmd(CmdName.CMD_PRINT_APP_INFO, "?A", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgPrintAppInfo),
new Cmd(CmdName.CMD_PRINT_BOOT_INFO, "?B", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgPrintBootInfo),
new Cmd(CmdName.CMD_BAUDRATE_PC, "=BP", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgBaudrateAll),
new Cmd(CmdName.CMD_GET_VIRTUAL_ADDRESS, " ", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetVirtualAddress),
new Cmd(CmdName.CMD_SERIAL, "#", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgSerial),
new Cmd(CmdName.CMD_GET_STATUS, UNICODE_ACK, CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetStatus),
new Cmd(CmdName.CMD_SET_VIRTUAL_ADDRESS, 'N', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgSetVirtualAddress),
new Cmd(CmdName.CMD_PRINT_STATISTICS, '!', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgPrintStatistics),
new Cmd(CmdName.CMD_SET_VIRTUAL_ADDRESS, "N", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgSetVirtualAddress),
new Cmd(CmdName.CMD_PRINT_STATISTICS, "!", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgPrintStatistics),
//measurement reset
new Cmd(CmdName.CMD_RST_MEAS, 'R', CmdType.BROADCAST, Resources.StrCmdMsgRstMeas),
new Cmd(CmdName.CMD_RST_MEAS, "R", CmdType.BROADCAST, Resources.StrCmdMsgRstMeas),
// Double impulse detection settings
new Cmd(CmdName.CMD_SET_DPLS_LOCK_TMR, 'S', CmdType.BROADCAST, Resources.StrCmdMsgDplsLockTmr),
new Cmd(CmdName.CMD_SET_DPLS_LOCK_MULT, 's', CmdType.BROADCAST, Resources.StrCmdMsgDplsLockMult),
new Cmd(CmdName.CMD_SET_DBPL_UNLOCK, 'G', CmdType.BROADCAST, Resources.StrCmdMsgSetDbplUnlock),
new Cmd(CmdName.CMD_SET_DPLS_LOCK_TMR, "S", CmdType.BROADCAST, Resources.StrCmdMsgDplsLockTmr),
new Cmd(CmdName.CMD_SET_DPLS_LOCK_MULT, "s", CmdType.BROADCAST, Resources.StrCmdMsgDplsLockMult),
new Cmd(CmdName.CMD_SET_DBPL_UNLOCK, "G", CmdType.BROADCAST, Resources.StrCmdMsgSetDbplUnlock),
// Main measurement pulse settings and readout
new Cmd(CmdName.CMD_DUT_SET_PLS, 'H', CmdType.BROADCAST, Resources.StrCmdMsgDutSetPls),
new Cmd(CmdName.CMD_REF_SET_PLS, 'M', CmdType.BROADCAST, Resources.StrCmdMsgRefSetPls),
new Cmd(CmdName.CMD_DUT_GET_PLS_RMN, 'I', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetPlsRmn),
new Cmd(CmdName.CMD_REF_GET_PLS_RMN, 'J', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetPlsRmn),
new Cmd(CmdName.CMD_DUT_SET_PLS, "H", CmdType.BROADCAST, Resources.StrCmdMsgDutSetPls),
new Cmd(CmdName.CMD_REF_SET_PLS, "M", CmdType.BROADCAST, Resources.StrCmdMsgRefSetPls),
new Cmd(CmdName.CMD_DUT_GET_PLS_RMN, "I", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetPlsRmn),
new Cmd(CmdName.CMD_REF_GET_PLS_RMN, "J", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetPlsRmn),
// Pulse counters start, readout and backup
new Cmd(CmdName.CMD_REF_STR_PLS_CTR, 'O', CmdType.BROADCAST, Resources.StrCmdMsgRefStrPlsCtr),
new Cmd(CmdName.CMD_DUT_STR_PLS_CTR, 'Q', CmdType.BROADCAST, Resources.StrCmdMsgDutStrPlsCtr),
new Cmd(CmdName.CMD_REF_GET_PLS_CTR, 'L', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetPlsCtr),
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR, 'U', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetPlsCtr),
new Cmd(CmdName.CMD_REF_GET_PLS_CTR_BU, 'l', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetPlsCtrBu),
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR_BU, 'u', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetPlsCtrBu),
new Cmd(CmdName.CMD_REF_DUT_STR_PLS_CTR, 'o', CmdType.BROADCAST, Resources.StrCmdMsgRefDutStrPlsCtr),
new Cmd(CmdName.CMD_REF_DUT_BU_PLS_CTR, 'q', CmdType.BROADCAST, Resources.StrCmdMsgRefDutBuPlsCtr),
new Cmd(CmdName.CMD_REF_STR_PLS_CTR, "O", CmdType.BROADCAST, Resources.StrCmdMsgRefStrPlsCtr),
new Cmd(CmdName.CMD_DUT_STR_PLS_CTR, "Q", CmdType.BROADCAST, Resources.StrCmdMsgDutStrPlsCtr),
new Cmd(CmdName.CMD_REF_GET_PLS_CTR, "L", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetPlsCtr),
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR, "U", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetPlsCtr),
new Cmd(CmdName.CMD_REF_GET_PLS_CTR_BU, "l", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetPlsCtrBu),
new Cmd(CmdName.CMD_DUT_GET_PLS_CTR_BU, "u", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetPlsCtrBu),
new Cmd(CmdName.CMD_REF_DUT_STR_PLS_CTR, "o", CmdType.BROADCAST, Resources.StrCmdMsgRefDutStrPlsCtr),
new Cmd(CmdName.CMD_REF_DUT_BU_PLS_CTR, "q", CmdType.BROADCAST, Resources.StrCmdMsgRefDutBuPlsCtr),
// General measurement setup
new Cmd(CmdName.CMD_REF_SET_SCALE, 'K', CmdType.BROADCAST, Resources.StrCmdMsgRefSetScale),
new Cmd(CmdName.CMD_DUT_LPP_SCALE, 'V', CmdType.INDIVIDUAL_NA, Resources.StrCmdMsgDutLppScale),
new Cmd(CmdName.CMD_REF_LPP_SCALE, 'W', CmdType.INDIVIDUAL_NA, Resources.StrCmdMsgRefLppScale),
new Cmd(CmdName.CMD_MEAS_SET_ATTN, 'T', CmdType.BROADCAST, Resources.StrCmdMsgMeasSetAttn),
new Cmd(CmdName.CMD_REF_SET_SCALE, "K", CmdType.BROADCAST, Resources.StrCmdMsgRefSetScale),
new Cmd(CmdName.CMD_DUT_LPP_SCALE, "V", CmdType.INDIVIDUAL_NA, Resources.StrCmdMsgDutLppScale),
new Cmd(CmdName.CMD_REF_LPP_SCALE, "W", CmdType.INDIVIDUAL_NA, Resources.StrCmdMsgRefLppScale),
new Cmd(CmdName.CMD_MEAS_SET_ATTN, "T", CmdType.BROADCAST, Resources.StrCmdMsgMeasSetAttn),
// Measurement result request
new Cmd(CmdName.CMD_DUT_GET_TMR, 'X', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetTmr),
new Cmd(CmdName.CMD_REF_GET_TMR, 'Y', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetTmr),
new Cmd(CmdName.CMD_GET_UDTLC, 'Z', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetUdtlc),
new Cmd(CmdName.CMD_GET_DTLC, 'z', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetDtlc),
new Cmd(CmdName.CMD_DUT_GET_TMR, "X", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgDutGetTmr),
new Cmd(CmdName.CMD_REF_GET_TMR, "Y", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgRefGetTmr),
new Cmd(CmdName.CMD_GET_UDTLC, "Z", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetUdtlc),
new Cmd(CmdName.CMD_GET_DTLC, "z", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetDtlc),
new Cmd(CmdName.CMD_GET_REF_PERIOD, UNICODE_DLE, CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetRefPeriod),
new Cmd(CmdName.CMD_GET_DUT_PERIOD, UNICODE_DC1, CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetDutPeriod),
new Cmd(CmdName.CMD_GET_REF_FREQU, UNICODE_DC2, CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgGetRefFrequ),
// Adjustment, place here Ids which may represent digital numbers from A to F
new Cmd(CmdName.CMD_COR_CURRENT, 'C', CmdType.BROADCAST, Resources.StrCmdMsgCorCurrent),
new Cmd(CmdName.CMD_SET_XTR_MAX, '+', CmdType.BROADCAST, Resources.StrCmdMsgSetXtrMax),
new Cmd(CmdName.CMD_SET_XTR_MIN, '-', CmdType.BROADCAST, Resources.StrCmdMsgSetXtrMin),
new Cmd(CmdName.CMD_ADDR_PC, 'A', CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgAddrPc)
new Cmd(CmdName.CMD_COR_CURRENT, "C", CmdType.BROADCAST, Resources.StrCmdMsgCorCurrent),
new Cmd(CmdName.CMD_SET_XTR_MAX, "+", CmdType.BROADCAST, Resources.StrCmdMsgSetXtrMax),
new Cmd(CmdName.CMD_SET_XTR_MIN, "-", CmdType.BROADCAST, Resources.StrCmdMsgSetXtrMin),
new Cmd(CmdName.CMD_ADDR_PC, "A", CmdType.INDIVIDUAL_WA, Resources.StrCmdMsgAddrPc)
};
/// <summary>
@ -448,18 +473,18 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Co
}
/// <summary>
/// Get char command code from command name
/// Get String command code from command name
/// </summary>
/// <param name="cmdName"></param>
/// <returns>command code to send to the FM2014</returns>
/// <remarks date="2026-Jan-08" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public static Char GetCmdChar(CmdName cmdName)
public static String GetCmdStr(CmdName cmdName)
{
return (from ct in CmdTbl
where ct.CmdName == cmdName
select ct.CmdCodeChar).FirstOrDefault();
select ct.CmdCodeStr).FirstOrDefault();
}
/// <summary>

View File

@ -56,7 +56,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
#region properties
private const Char _eos = FM2014CmdDef.END_OF_STRING;
private const String _eos = FM2014CmdDef.END_OF_STR;
/// <inheritdoc/>
public Boolean CyclicReceiveTaskLoopIsActive
@ -94,8 +94,8 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
private set;
}
private const Char _adrPre = FM2014CmdDef.ADDR_RECORD_CHAR;
private const Char _adrPost = FM2014CmdDef.ADDR_VALIDATION_CHAR;
private const String _adrPre = FM2014CmdDef.ADDR_RECORD_STR;
private const String _adrPost = FM2014CmdDef.ADDR_VALIDATION_STR;
private Int32 _address;
/// <inheritdoc/>
@ -105,24 +105,19 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
set
{
_address = value;
AddressStr = $"{_adrPre}{_adrPre}{Address}{_adrPost}{_eos}";
AddressStr = $"{_adrPre}{Address}{_adrPost}{_eos}";
}
}
/// <summary>
/// Marker if broadcast connection was last communication
/// </summary>
public Boolean BroadcastCommIsActive
private Boolean BroadcastCommIsActive
{
get;
set;
}
/// <summary>
/// Broadcast address without answer for all FM2014
/// </summary>
public static readonly String BrodcastAddressStr = $"{_adrPre}{_adrPre}0{_adrPost}{_eos}";
/// <inheritdoc/>
public String AddressStr
{
@ -189,7 +184,11 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// <summary>
/// Number of processing steps for this actual process progress
/// </summary>
private Int32 MaxActualProcessProgress { get; set; }
private Int32 MaxActualProcessProgress
{
get;
set;
}
/// <summary>
/// Progress of actual process
@ -251,7 +250,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// </remarks>
public Boolean StartPulseCounting(Boolean refCtrOn = true, Boolean dutCtrOn = false)
{
if (SerialPort == null || !SerialPort.IsOpen || (!refCtrOn && !dutCtrOn))
if (!refCtrOn && !dutCtrOn)
{
return false;
}
@ -293,32 +292,31 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
CyclicReceiveTaskLoopIsActive = true;
// Get the process information
var infoRef = FM2014CmdDef.GetCmdInfo(FM2014CmdDef.CmdName.CMD_REF_GET_PLS_CTR);
var cmdCodeRef = FM2014CmdDef.GetCmdChar(FM2014CmdDef.CmdName.CMD_REF_GET_PLS_CTR);
var infoDut = FM2014CmdDef.GetCmdInfo(FM2014CmdDef.CmdName.CMD_DUT_GET_PLS_CTR);
var cmdCodeDut = FM2014CmdDef.GetCmdChar(FM2014CmdDef.CmdName.CMD_DUT_GET_PLS_CTR);
do
{
try
{
if (refCtrOn && Write(FM2014CmdDef.CmdName.CMD_REF_GET_PLS_CTR))
cmdName = FM2014CmdDef.CmdName.CMD_REF_GET_PLS_CTR;
if (refCtrOn && Write(cmdName))
{
var refPulseStr = SerialPort.ReadTo($"{_eos}");
if (int.TryParse(refPulseStr, NumberStyles.HexNumber, new CultureInfo("en"), out var refPulses))
{
var response = new FM2014CmdDef.CmdResponse(FM2014CmdDef.CmdName.CMD_REF_GET_PLS_CTR, infoRef,
refPulses);
var response = new FM2014CmdDef.CmdResponse(cmdName, infoRef, refPulses);
OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(infoRef, specificInfoObj: response));
}
}
if (dutCtrOn && Write(FM2014CmdDef.CmdName.CMD_DUT_GET_PLS_CTR))
cmdName = FM2014CmdDef.CmdName.CMD_DUT_GET_PLS_CTR;
if (dutCtrOn && Write(cmdName))
{
var dutPulseStr = SerialPort.ReadTo($"{_eos}");
if (int.TryParse(dutPulseStr, NumberStyles.HexNumber, new CultureInfo("en"), out var dutPulses))
{
var response = new FM2014CmdDef.CmdResponse(FM2014CmdDef.CmdName.CMD_DUT_GET_PLS_CTR, infoDut,
dutPulses);
var response = new FM2014CmdDef.CmdResponse(cmdName, infoDut, dutPulses);
OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(infoDut, specificInfoObj: response));
}
}
@ -329,8 +327,6 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(Resources.StrError, specificInfoObj: response,
statusReturn: StatusReturn.Failed));
}
//Thread.Sleep(500);
} while (CyclicReceiveTaskLoopIsActive);
});
@ -347,37 +343,35 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// </remarks>
public Boolean Login()
{
if (SerialPort == null)
{
return false;
}
IsLoggedOn = false;
var cmdCode = FM2014CmdDef.GetCmdStr(FM2014CmdDef.CmdName.CMD_SERIAL);
const FM2014CmdDef.CmdName cmdName = FM2014CmdDef.CmdName.CMD_SERIAL;
try
{
SerialPort.Open();
// Establish connection to one specific FM2014
if (InitiateIndividualComm())
if (!InitiateIndividualComm())
{
var cmdCode = FM2014CmdDef.GetCmdChar(FM2014CmdDef.CmdName.CMD_SERIAL);
// Read out the serial number of this FM2014
if (!Write(FM2014CmdDef.CmdName.CMD_SERIAL))
{
return false;
}
return false;
}
SerialNumber = SerialPort.ReadTo($"{_eos}");
if (!string.IsNullOrEmpty(SerialNumber))
{
SerialNumber = SerialNumber.Replace($"{cmdCode}", "");
IsLoggedOn = true;
}
// Read out the serial number of this FM2014
if (!Write(cmdName))
{
return false;
}
SerialNumber = SerialPort.ReadTo(_eos);
if (!string.IsNullOrEmpty(SerialNumber))
{
SerialNumber = SerialNumber.Replace(cmdCode, "");
IsLoggedOn = true;
}
}
catch (Exception e)
{
Console.WriteLine(e);
var response = new FM2014CmdDef.CmdResponse(cmdName, e.Message);
OnRawRecordReceived?.Invoke(this, new ProcessExecEventArgs(Resources.StrError, specificInfoObj: response,
statusReturn: StatusReturn.Failed));
}
return IsLoggedOn;
}
@ -387,11 +381,20 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// </summary>
private Boolean InitiateBroadcastComm()
{
if (SerialPort == null || !SerialPort.IsOpen)
if (SerialPort == null)
{
return false;
}
if (!SerialPort.IsOpen)
{
SerialPort.Open();
if (!SerialPort.IsOpen)
{
return false;
}
}
// If broadcast communication is already active
if (BroadcastCommIsActive)
{
@ -399,7 +402,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
}
// Establish connection to all FM2014s with broadcast address
SerialPort.Write(BrodcastAddressStr);
SerialPort.Write(FM2014CmdDef.BROADCAST_ADDRESS);
BroadcastCommIsActive = true;
return true;
@ -411,18 +414,28 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
/// <returns></returns>
private Boolean InitiateIndividualComm()
{
if (SerialPort == null || !SerialPort.IsOpen)
if (SerialPort == null)
{
return false;
}
if (!SerialPort.IsOpen)
{
SerialPort.Open();
if (!SerialPort.IsOpen)
{
return false;
}
}
// Establish connection to one specific FM2014
SerialPort.Write(AddressStr);
FullId = SerialPort.ReadTo($"{_eos}");
FullId = SerialPort.ReadTo(_eos);
if (!string.IsNullOrEmpty(FullId))
{
FullId = FullId.Replace($"{_adrPre}", "");
FullId = FullId.Replace(_adrPre, "");
var fields = FullId.Split('.');
FwVersion = fields[1];
BroadcastCommIsActive = false;
@ -444,6 +457,9 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
{
if (SerialPort == null || !SerialPort.IsOpen)
{
BroadcastCommIsActive = false;
IsLoggedOn = false;
CyclicReceiveTaskLoopIsActive = false;
return false;
}
@ -467,8 +483,8 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
if (retVal)
{
// TODO THW Prepare data object
var cmdCodeChar = FM2014CmdDef.GetCmdChar(cmdName);
SerialPort.Write($"{cmdCodeChar}{_eos}");
var cmdCodeStr = FM2014CmdDef.GetCmdStr(cmdName);
SerialPort.Write($"{cmdCodeStr}{_eos}");
}
return retVal;
@ -512,6 +528,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core
{
ResetMeasurement();
IsLoggedOn = false;
BroadcastCommIsActive = false;
SerialPort?.Close();
return SerialPort != null && !SerialPort.IsOpen;
}

View File

@ -62,7 +62,16 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Actuel regulation measurement.
/// </summary>
internal static string StrCmdMsgActualDefMeasSetup {
get {
return ResourceManager.GetString("StrCmdMsgActualDefMeasSetup", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Address.
/// </summary>
internal static string StrCmdMsgAddrPc {
get {
@ -71,7 +80,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Baudrate.
/// </summary>
internal static string StrCmdMsgBaudrateAll {
get {
@ -80,7 +89,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Start boot code.
/// </summary>
internal static string StrCmdMsgBootMode {
get {
@ -89,7 +98,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Start current offset correction.
/// </summary>
internal static string StrCmdMsgCorCurrent {
get {
@ -97,15 +106,6 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
}
/// <summary>
/// Looks up a localized string similar to .
/// </summary>
internal static string StrCmdMsgDefMeasSetup {
get {
return ResourceManager.GetString("StrCmdMsgDefMeasSetup", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Set double pulse dead time multiplier.
/// </summary>
@ -152,7 +152,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Counted DUT timer ticks (334 us).
/// </summary>
internal static string StrCmdMsgDutGetTmr {
get {
@ -188,7 +188,16 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Erase critical settings.
/// </summary>
internal static string StrCmdMsgErase {
get {
return ResourceManager.GetString("StrCmdMsgErase", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Measured damped tolerance DUT to REF in percent.
/// </summary>
internal static string StrCmdMsgGetDtlc {
get {
@ -197,7 +206,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Measured DUT period in ticks (334 us).
/// </summary>
internal static string StrCmdMsgGetDutPeriod {
get {
@ -206,7 +215,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Measured REF frequency in Hz.
/// </summary>
internal static string StrCmdMsgGetRefFrequ {
get {
@ -215,7 +224,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Measured REF period in ticks (334 us).
/// </summary>
internal static string StrCmdMsgGetRefPeriod {
get {
@ -224,7 +233,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Status code.
/// </summary>
internal static string StrCmdMsgGetStatus {
get {
@ -233,7 +242,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Measured undamped tolerance DUT to REF in percent.
/// </summary>
internal static string StrCmdMsgGetUdtlc {
get {
@ -242,7 +251,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Read value from virtual EEPROM address.
/// </summary>
internal static string StrCmdMsgGetVirtualAddress {
get {
@ -260,16 +269,25 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Print application code information.
/// </summary>
internal static string StrCmdMsgPrintInfo {
internal static string StrCmdMsgPrintAppInfo {
get {
return ResourceManager.GetString("StrCmdMsgPrintInfo", resourceCulture);
return ResourceManager.GetString("StrCmdMsgPrintAppInfo", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Print boot code information.
/// </summary>
internal static string StrCmdMsgPrintBootInfo {
get {
return ResourceManager.GetString("StrCmdMsgPrintBootInfo", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Readout lifetime in hours.
/// </summary>
internal static string StrCmdMsgPrintStatistics {
get {
@ -277,6 +295,15 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
}
/// <summary>
/// Looks up a localized string similar to Read regulation measurement setup.
/// </summary>
internal static string StrCmdMsgReadDefMeasSetup {
get {
return ResourceManager.GetString("StrCmdMsgReadDefMeasSetup", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Backup REF and DUT pulse counter synchronized.
/// </summary>
@ -323,7 +350,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Get REF timer ticks (334 us).
/// </summary>
internal static string StrCmdMsgRefGetTmr {
get {
@ -377,7 +404,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Serial number.
/// </summary>
internal static string StrCmdMsgSerial {
get {
@ -395,7 +422,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Set value to virtual EEPROM address.
/// </summary>
internal static string StrCmdMsgSetVirtualAddress {
get {
@ -404,7 +431,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Set tolerance display to maximum.
/// </summary>
internal static string StrCmdMsgSetXtrMax {
get {
@ -413,7 +440,7 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Set tolerance display to minimum.
/// </summary>
internal static string StrCmdMsgSetXtrMin {
get {
@ -422,11 +449,20 @@ namespace Sensus.Common.Hardware.WaterMeter.MechanicalMeter.FM2014.FM2014Core.Pr
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Store actual regulation measurement as default.
/// </summary>
internal static string StrCmdMsgUnlockErase {
internal static string StrCmdMsgStoreDefMeasSetup {
get {
return ResourceManager.GetString("StrCmdMsgUnlockErase", resourceCulture);
return ResourceManager.GetString("StrCmdMsgStoreDefMeasSetup", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Unlock erase critical settings.
/// </summary>
internal static string StrCmdMsgUnlock {
get {
return ResourceManager.GetString("StrCmdMsgUnlock", resourceCulture);
}
}

View File

@ -195,71 +195,82 @@
<data name="StrCmdRespErrorCmdNotSupported" xml:space="preserve">
<value>Kommando nicht unterstützt</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="StrCmdMsgDutGetTmr" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgDutGetTmr" xml:space="preserve">
<value>Gezählte DUT Zeitticks (334 us)</value>
</data>
<data name="StrCmdMsgRefGetTmr" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgRefGetTmr" xml:space="preserve">
<value>Gezählte REF Zeitticks (334 us)</value>
</data>
<data name="StrCmdMsgGetUdtlc" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgGetUdtlc" xml:space="preserve">
<value>Gemessene ungedämpfte Toleranz DUT zu REF in Prozent</value>
</data>
<data name="StrCmdMsgGetDtlc" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgGetDtlc" xml:space="preserve">
<value>Gemessene gedämpfte Toleranz DUT zu REF in Prozent</value>
</data>
<data name="StrCmdMsgGetRefPeriod" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgGetRefPeriod" xml:space="preserve">
<value>Gemessene REF Periodendauer in Ticks (334 us)</value>
</data>
<data name="StrCmdMsgGetDutPeriod" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgGetDutPeriod" xml:space="preserve">
<value>Gemessene DUT Periode in Ticks (334 us)</value>
</data>
<data name="StrCmdMsgGetRefFrequ" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgGetRefFrequ" xml:space="preserve">
<value>Gemessene REF Frequenz in Hz</value>
</data>
<data name="StrCmdMsgCorCurrent" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgCorCurrent" xml:space="preserve">
<value>Starte Stromnullpunktkalibrierung</value>
</data>
<data name="StrCmdMsgSetXtrMax" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgSetXtrMax" xml:space="preserve">
<value>Toleranzanzeige auf Maximum stellen</value>
</data>
<data name="StrCmdMsgSetXtrMin" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgSetXtrMin" xml:space="preserve">
<value>Toleranzanzeige auf Miniimum stellen</value>
</data>
<data name="StrCmdMsgAddrPc" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgAddrPc" xml:space="preserve">
<value>Adresse</value>
</data>
<data name="StrCmdMsgUnlockErase" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgUnlock" xml:space="preserve">
<value>Löschverriegelung aufheben</value>
</data>
<data name="StrCmdMsgDefMeasSetup" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgReadDefMeasSetup" xml:space="preserve">
<value>Auslesen Regulierungsmessungseinstellungen</value>
</data>
<data name="StrCmdMsgBootMode" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgBootMode" xml:space="preserve">
<value>Starte Bootcode</value>
</data>
<data name="StrCmdMsgPrintInfo" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgPrintAppInfo" xml:space="preserve">
<value>Auslesen Applikationscodeinformation</value>
</data>
<data name="StrCmdMsgBaudrateAll" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgBaudrateAll" xml:space="preserve">
<value>Baudrate</value>
</data>
<data name="StrCmdMsgGetVirtualAddress" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgGetVirtualAddress" xml:space="preserve">
<value>Wert von virtuelle EEPROM Adresse auslesen</value>
</data>
<data name="StrCmdMsgSerial" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgSerial" xml:space="preserve">
<value>Seriennummer</value>
</data>
<data name="StrCmdMsgGetStatus" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgGetStatus" xml:space="preserve">
<value>Statuscode</value>
</data>
<data name="StrCmdMsgSetVirtualAddress" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgSetVirtualAddress" xml:space="preserve">
<value>Wert an virtuelle EEPROM Adresse schreiben</value>
</data>
<data name="StrCmdMsgPrintStatistics" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
<data name="StrCmdMsgPrintStatistics" xml:space="preserve">
<value>Ermittelte Laufzeit in Stunden</value>
</data>
<data name="StrError" xml:space="preserve">
<value>FEHLER</value>
</data>
<data name="StrCmdMsgErase" xml:space="preserve">
<value>Löschen von Einstellungen</value>
</data>
<data name="StrCmdMsgActualDefMeasSetup" xml:space="preserve">
<value>Aktuelle Regulierungsmessung</value>
</data>
<data name="StrCmdMsgStoreDefMeasSetup" xml:space="preserve">
<value>Aktuelle Regulierungsmessung als Standard speichern</value>
</data>
<data name="StrCmdMsgPrintBootInfo" xml:space="preserve">
<value>Auslesen Bootcodeinformation</value>
</data>
</root>

View File

@ -196,69 +196,81 @@
<value>Command not supported</value>
</data>
<data name="StrCmdMsgDutGetTmr" xml:space="preserve">
<value />
<value>Counted DUT timer ticks (334 us)</value>
</data>
<data name="StrCmdMsgRefGetTmr" xml:space="preserve">
<value />
<value>Get REF timer ticks (334 us)</value>
</data>
<data name="StrCmdMsgGetUdtlc" xml:space="preserve">
<value />
<value>Measured undamped tolerance DUT to REF in percent</value>
</data>
<data name="StrCmdMsgGetDtlc" xml:space="preserve">
<value />
<value>Measured damped tolerance DUT to REF in percent</value>
</data>
<data name="StrCmdMsgGetRefPeriod" xml:space="preserve">
<value />
<value>Measured REF period in ticks (334 us)</value>
</data>
<data name="StrCmdMsgGetDutPeriod" xml:space="preserve">
<value />
<value>Measured DUT period in ticks (334 us)</value>
</data>
<data name="StrCmdMsgGetRefFrequ" xml:space="preserve">
<value />
<value>Measured REF frequency in Hz</value>
</data>
<data name="StrCmdMsgCorCurrent" xml:space="preserve">
<value />
<value>Start current offset correction</value>
</data>
<data name="StrCmdMsgSetXtrMax" xml:space="preserve">
<value />
<value>Set tolerance display to maximum</value>
</data>
<data name="StrCmdMsgSetXtrMin" xml:space="preserve">
<value />
<value>Set tolerance display to minimum</value>
</data>
<data name="StrCmdMsgAddrPc" xml:space="preserve">
<value />
<value>Address</value>
</data>
<data name="StrCmdMsgUnlockErase" xml:space="preserve">
<value />
<data name="StrCmdMsgUnlock" xml:space="preserve">
<value>Unlock erase critical settings</value>
</data>
<data name="StrCmdMsgDefMeasSetup" xml:space="preserve">
<value />
<data name="StrCmdMsgReadDefMeasSetup" xml:space="preserve">
<value>Read regulation measurement setup</value>
</data>
<data name="StrCmdMsgBootMode" xml:space="preserve">
<value />
<value>Start boot code</value>
</data>
<data name="StrCmdMsgPrintInfo" xml:space="preserve">
<value />
<data name="StrCmdMsgPrintAppInfo" xml:space="preserve">
<value>Print application code information</value>
</data>
<data name="StrCmdMsgBaudrateAll" xml:space="preserve">
<value />
<value>Baudrate</value>
</data>
<data name="StrCmdMsgGetVirtualAddress" xml:space="preserve">
<value />
<value>Read value from virtual EEPROM address</value>
</data>
<data name="StrCmdMsgSerial" xml:space="preserve">
<value />
<value>Serial number</value>
</data>
<data name="StrCmdMsgGetStatus" xml:space="preserve">
<value />
<value>Status code</value>
</data>
<data name="StrCmdMsgSetVirtualAddress" xml:space="preserve">
<value />
<value>Set value to virtual EEPROM address</value>
</data>
<data name="StrCmdMsgPrintStatistics" xml:space="preserve">
<value />
<value>Readout lifetime in hours</value>
</data>
<data name="StrError" xml:space="preserve">
<value>ERROR</value>
</data>
<data name="StrCmdMsgErase" xml:space="preserve">
<value>Erase critical settings</value>
</data>
<data name="StrCmdMsgActualDefMeasSetup" xml:space="preserve">
<value>Actuel regulation measurement</value>
</data>
<data name="StrCmdMsgStoreDefMeasSetup" xml:space="preserve">
<value>Store actual regulation measurement as default</value>
</data>
<data name="StrCmdMsgPrintBootInfo" xml:space="preserve">
<value>Print boot code information</value>
</data>
</root>