From 6270e0c417b30a814e163ad7921dea7ecc3b1181 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Thu, 29 Sep 2022 16:59:25 +0200 Subject: [PATCH] UltrasoundLevelMeter is displayed on the schematic drawing. --- .../Modbus/UltrasoundLevelMeter/LevelMeter.cs | 16 +- .../UltrasoundLevelMeter/LevelMeterCfg.cs | 157 +++++++++++++----- 2 files changed, 133 insertions(+), 40 deletions(-) diff --git a/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeter.cs b/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeter.cs index fc570d8ff..f06fb53c7 100644 --- a/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeter.cs +++ b/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeter.cs @@ -1,22 +1,24 @@ /// -/// Copyright (c) 2018 Sensus Slovensko a.s. +/// Copyright (c) 2018-2022 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using System.Diagnostics; using log4net; using Common; +using SchematicDrawing; using TBF.Boxes; using TBF.Rig.Generic; namespace TBF.Rig.Modbus.UltrasoundLevelMeter { - public class LevelMeter : ComponentBase, GenericDevices.ILevelMeter, IDevice + public class LevelMeter : ComponentBase, GenericDevices.ILevelMeter, IDevice, IDrawingItCmpntWithMeasuredVal { private static readonly ILog log = LogManager.GetLogger(typeof(LevelMeter)); public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } readonly LevelMeterCfg myCfg; + public IDrawingItem DrawingItem { get { return myCfg as IDrawingItem; } } Common.Modbus modbus; @@ -31,6 +33,14 @@ namespace TBF.Rig.Modbus.UltrasoundLevelMeter public double Level { get { return level; } } + public bool MsrmntAvailable { get { return true; } } + public double MeasuredVal { get { return level; } } + public double MsrdValLimLo { get { return Units.ConvertFrom(MsrdUnit, myCfg.MsrdValLimLo); } } + public double MsrdValLimHi { get { return Units.ConvertFrom(MsrdUnit, myCfg.MsrdValLimHi); } } + public string MsrdFormat { get { return myCfg.MsrdFormat; } } + public Unit MsrdUnit { get { return myCfg.MsrdUnit; } } + public string AltString { get { return string.Empty; } } + /// Measurement time stamp when MsrmntState == MsrmntState.Valid int msrmntTimeStamp; @@ -133,7 +143,7 @@ namespace TBF.Rig.Modbus.UltrasoundLevelMeter /// Prepare data to be sent byte[] msg = new byte[8]; /// Buffer for data to send - msg[0] = myCfg.ModbusAddress; + msg[0] = (byte)myCfg.ModbusAddress; msg[1] = 3; /// CMD = msg[2] = (byte)(regAddr >> 8); /// Control Word Hi msg[3] = (byte)(regAddr & 0xFF); /// Control Word Lo diff --git a/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeterCfg.cs b/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeterCfg.cs index 543a6c408..f60af8ebd 100644 --- a/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeterCfg.cs +++ b/TBF/Rig/Modbus/UltrasoundLevelMeter/LevelMeterCfg.cs @@ -1,18 +1,16 @@ /// -/// Copyright (c) 2018 Sensus Slovensko a.s. +/// Copyright (c) 2018-2022 Sensus Slovensko a.s. /// -using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Xml.Serialization; using Common; -using Config.Entities; +using SchematicDrawing; using TBF.Rig.Generic; namespace TBF.Rig.Modbus.UltrasoundLevelMeter { - public class LevelMeterCfg : ComponentCfgBase, Generic.IChildComponentCfg, IParamsProvider + public class LevelMeterCfg : ComponentCfgBase, IChildComponentCfg, IParamsProvider, IDrawingItemWithMeasuredVal { public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(LevelMeterCfg) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } @@ -26,14 +24,42 @@ namespace TBF.Rig.Modbus.UltrasoundLevelMeter /// /// Serialized parameters /// - public byte ModbusAddress; /// 1..247 + public int ModbusAddress; /// 0 (1..247) + public double DefaultLevel; /// 1 + + /// Schematic drawing info + public Shape Shape { get; set; } + public int X { get; set; } + public int Y { get; set; } + public Sz Sz { get; set; } + public Orient Orient { get; set; } + public bool Flip { get; set; } + public int LblX { get; set; } + public int LblY { get; set; } + public Orient LblOrient { get; set; } + public int MsrdX { get; set; } + public int MsrdY { get; set; } + public Orient MsrdOrient { get; set; } + + public string MsrdFormat { get; set; } /// 2 + public Unit MsrdUnit { get; set; } /// 3 + public double MsrdValLimLo { get; set; } /// 4 + public double MsrdValLimHi { get; set; } /// 5 + + [XmlIgnore] + public IList GNodes { get; set; } /// Private parameterless constructor invoked by all other (public) constructors - LevelMeterCfg() {} + LevelMeterCfg() + { + GNodes = new List(); + } public LevelMeterCfg(IComponentFactory factory) : this() { + Shape = Shape.TempM; + Sz = Sz.M; Factory = factory; Name = "ULM"; ParentName = "Modbus"; @@ -45,74 +71,131 @@ namespace TBF.Rig.Modbus.UltrasoundLevelMeter public void InitializeAll() { ModbusAddress = 1; + DefaultLevel = 1000.0; + MsrdFormat = "{0:F0} mm"; + MsrdUnit = Unit.mm; + MsrdValLimLo = 0; + MsrdValLimHi = 5000; + MsrdY = 22; } string[] paramNames = new string[] { - "Modbus address", + "Modbus address", /// 0 + "Default water level", /// 1 + "Display format", /// 2 + "Unit of water level", /// 3 + "Water level limit Lo", /// 4 + "Water level limit Hi", /// 5 }; public string ParamName(int i) { return paramNames[i]; } public int ParamsCount() { return paramNames.Length; } - public ICollection ParamValues(int i) { return null; } + + public ICollection ParamValues(int i) + { + switch (i) + { + case 3: + return new string[] { Unit.mm.ToDescription(), + Unit.cm.ToDescription(), + Unit.inch.ToDescription(), + Unit.dm.ToDescription(), + Unit.foot.ToDescription(), + Unit.yard.ToDescription(), + Unit.m.ToDescription() }; + default: + return null; + } + } public string ToString(int i) { - if (i == -1) - { - return string.Format("ModbusAddr={0}", ModbusAddress); - } - switch (i) { - case 0: return ModbusAddress.ToString(); - default: return string.Empty; + case 0: return ModbusAddress.ToString(); + case 1: return DefaultLevel.ToString(); + case 2: return MsrdFormat; + case 3: return MsrdUnit.ToDescription(); + case 4: return MsrdValLimLo.ToString(); + case 5: return MsrdValLimHi.ToString(); + default: + return string.Format("ModbusAddr={0}", ModbusAddress); } } - public CfgUpdateFlags UpdateParam(int i, string strValue) + public CfgUpdateFlags UpdateParam(int i, string str) { switch (i) { - case 0: - byte addr = byte.Parse(strValue); - if (ModbusAddress != addr) - { - ModbusAddress = addr; - return CfgUpdateFlags.RestartRqrd; - } - else - { - return CfgUpdateFlags.None; - } - - default: - return CfgUpdateFlags.None; + case 0: ModbusAddress = int.Parse(str); return CfgUpdateFlags.RestartRqrd; + case 1: DefaultLevel = Utils.ParseSDouble(str); return CfgUpdateFlags.RestartRqrd; + case 2: MsrdFormat = str; return CfgUpdateFlags.RestartRqrd; + case 3: MsrdUnit = (str == Unit.m.ToDescription()) ? Unit.m + : (str == Unit.cm.ToDescription()) ? Unit.cm + : (str == Unit.inch.ToDescription()) ? Unit.inch + : (str == Unit.dm.ToDescription()) ? Unit.dm + : (str == Unit.foot.ToDescription()) ? Unit.foot + : (str == Unit.yard.ToDescription()) ? Unit.yard + : Unit.mm; + return CfgUpdateFlags.RestartRqrd; + case 4: MsrdValLimLo = Utils.ParseSDouble(str); return CfgUpdateFlags.RestartRqrd; + case 5: MsrdValLimHi = Utils.ParseSDouble(str); return CfgUpdateFlags.RestartRqrd; + default: return CfgUpdateFlags.None; } } - public bool ValidateParam(int i, string strValue, out string message) + public bool ValidateParam(int i, string str, out string message) { message = string.Empty; - int dummy; + int idummy; + double dummy; switch (i) { case 0: - if (int.TryParse(strValue, out dummy) && dummy >= 1 && dummy <= 247) return true; - message = ParamName(i) + " is invalid. Address range is 1 .. 247"; - return false; + if (int.TryParse(str, out idummy) && idummy >= 1 && idummy <= 254) return true; + break; + case 1: + case 4: + case 5: + if (TBF.Utils.TryParseSDouble(str, out dummy)) return true; + break; + case 2: + return true; + case 3: + if (ParamValues(i).Contains(str)) return true; + break; default: message = "Invalid index"; return false; } + + message = ParamName(i) + " is invalid"; + return false; } void CopyContentTo(LevelMeterCfg prms) { - prms.ParentName = this.ParentName; prms.ModbusAddress = this.ModbusAddress; + prms.DefaultLevel = this.DefaultLevel; + prms.MsrdFormat = this.MsrdFormat; + prms.MsrdUnit = this.MsrdUnit; + prms.MsrdValLimLo = this.MsrdValLimLo; + prms.MsrdValLimHi = this.MsrdValLimHi; + + prms.ParentName = this.ParentName; + prms.Shape = this.Shape; + prms.Sz = this.Sz; + prms.Orient = this.Orient; + prms.Flip = this.Flip; + prms.LblX = this.LblX; + prms.LblY = this.LblY; + prms.LblOrient = this.LblOrient; + prms.MsrdX = this.MsrdX; + prms.MsrdY = this.MsrdY; + prms.MsrdOrient = this.MsrdOrient; }