diff --git a/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceCfg.cs b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceCfg.cs index a87f06795..025e9f372 100644 --- a/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceCfg.cs +++ b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceCfg.cs @@ -14,8 +14,9 @@ namespace TBF.BenchControl.MettlerToledo.Standard { public IComponent GetComponent(IList components) { - if (Factory.ClassName.Equals("MettlerToledo Balance")) return new BalanceDev(this); - else return new BalanceNewDev(this); + if (Factory.ClassName.Equals("MettlerToledoBalanceNew")) return new BalanceNewDev(this); + else if (Factory.ClassName.Equals("MettlerToledoBalanceOld")) return new BalanceOld(this); + else return new BalanceDev(this); } public IComponentCfgCtrl GetControl() { return new BalanceCfgCtrl(); } diff --git a/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceDev.cs b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceDev.cs index 1194d7c70..f6f012501 100644 --- a/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceDev.cs +++ b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceDev.cs @@ -136,7 +136,7 @@ namespace TBF.BenchControl.MettlerToledo.Standard serialPort.Write("Z\r\n"); } - public void Taring() + public virtual void Taring() { if (balanceCfg.DebugLevel == DebugMode.Simulate) return; diff --git a/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceOld.cs b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceOld.cs new file mode 100644 index 000000000..89917b7a9 --- /dev/null +++ b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceOld.cs @@ -0,0 +1,243 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.IO.Ports; +using log4net; +using Config.Entities; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + /// + /// Mettler Toledo ICS4_5 Weighting terminal connected via serial interface (RS232) + /// + /// + /// Implemented and tested on 15.10.2013 by Milan Hanajik + /// + public class BalanceOld : BalanceDev, IDevice, GenericDevices.IBalance + { + /// + /// Info: StartMassMeasurement() and "Balnce response = .., Mass = ..." + /// Warn: Start measurement when busy is true + /// + private static readonly ILog log = LogManager.GetLogger(typeof(BalanceOld)); + public override string ToString() { return string.Format("MettlerToledo.Standard.BalanceOld({0})", Cfg.ToString(1)); } + + public BalanceOld() + { + } + + public BalanceOld(BalanceCfg cfg) + : base(cfg) + { + log.Debug(this.ToString()); + } + + public override void Taring() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) return; + + if (msrmntState == MsrmntState.Busy) + { + log.WarnFormat("{0} - Taring() returns without starting taring the scale because measurementState == MeasurementState.Busy", Name); + return; + } + + log.InfoFormat("{0} - Taring()", Name); + + stringBuilder.Clear(); + serialPort.Write("T\r\n"); + + mass = 0; + msrmntState = MsrmntState.Valid; + } + + /// + /// Parse characters received from the serial port + /// + public override void RunDeviceBefore() + { + if (balanceCfg.DebugLevel == DebugMode.Simulate) + { + mass = TestBenchSim.GetSimMass(balanceNr); + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + msrmntTimeStamp = StateMachine.Time; + return; + } + + log.DebugFormat("{0} - RunDevice()", Name); + + if (base.msrmntState != MsrmntState.Busy) return; /// No measurement in progress + + string justReceived = serialPort.ReadExisting(); + if (justReceived != null && justReceived.Length > 0) + { + log.DebugFormat("{0} - RunDevice() received {1}", Name, justReceived); + stringBuilder.Append(justReceived); + + if (stringBuilder.ToString().EndsWith("\r\n")) + { + msrmntTimeStamp = StateMachine.Time; + + string received = stringBuilder.ToString(); + + while (true) + { + string tmp = received.Replace(" ", " "); + if (tmp.Length == received.Length) break; + received = tmp; + } + + string[] fields = received.Substring(0, received.Length - 2).Split(new char[] { ' ' }); + if (fields.Length < 2) + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = {1}, Unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + return; + } + else if (fields[0].Equals("Z")) /// Zero when stable + { + if (fields.Length == 2 && fields[1].Equals("A")) + { + mass = 0; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("S")) /// Stable (field[1] == "S") or dynamic (field[1] == "D") mass measurement + { + if (fields.Length == 4 && fields[1].Equals("S") && + float.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 4 && fields[1].Equals("D") && + float.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 2 && fields[1].Equals("-")) + { + mass = 0; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length == 2 && fields[1].Equals("+")) + { + mass = Capacity; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = balanceCfg.Capacity; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Overload; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("T")) /// Taring + { + if (fields.Length == 4 && fields[1].Equals("S") && + float.TryParse(fields[2], NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out mass)) + { + if (fields[3].Equals("g")) mass /= 1000.0f; + if (fields[3].Equals("t")) mass *= 1000.0f; + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = {1}, Mass = {2}", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = mass = balanceCfg.Capacity; + msrmntState = MsrmntState.Overload; + log.InfoFormat("{0} - Balance response = {1}, Overload", Name, + received.Replace("\r", "").Replace("\n", ""), mass); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload or and unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("U")) + { + if (fields.Length == 2 && fields[1].Equals("A")) + { + msrmntState = MsrmntState.Valid; + log.InfoFormat("{0} - Balance response = \"{1}\"", Name, + received.Replace("\r", "").Replace("\n", "")); + } + else + { + msrmntState = MsrmntState.Failed; + log.WarnFormat("{0} - Balance response = \"{1}\", Unexpected error !!!", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + else if (fields[0].Equals("SI")) /// "SI I" received in case of overload -> empty the tank + { + if (fields.Length >= 2 && fields[1].Equals("I")) + { + mass = balanceCfg.Capacity; + Masses[balanceNr] = mass; + msrmntState = MsrmntState.Valid; + //msrmntState = MsrmntState.Overload; + log.WarnFormat("{0} - Balance response = \"{1}\", Overload.", Name, + received.Replace("\r", "").Replace("\n", "")); + } + } + } + } + } + + /// + /// Events: BalanceDone, Error + /// + /// + /// SetUnitsOp instance reference casted to IOperaton + public IOperation SetUnitsOp(Units units) + { + return new SetUnitsOp(this, units); + } + } +} diff --git a/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceOldFactory.cs b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceOldFactory.cs new file mode 100644 index 000000000..0515bd18c --- /dev/null +++ b/TestBenchFramework/BenchControl/MettlerToledo/Standard/BalanceOldFactory.cs @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2016 Sensus Metering Systems +/// Author: Milan Hanajik +/// +using System.Collections.Generic; +using TBF.BenchControl.Generic; + +namespace TBF.BenchControl.MettlerToledo.Standard +{ + public class BalanceOldFactory : IComponentFactory + { + public string ClassName { get { return "MettlerToledoBalanceOld"; } } + + /// Max. number of components of this class in the system + public int MaxCount { get { return 5; } } + + public IComponent DummyComponent() { return new BalanceOld(); } + + public IComponentCfg DefaultConfig() { return new BalanceCfg(this); } + + public IComponentCfgCtrl CreateCfgCtrl() { return new BalanceCfgCtrl(); } + + public IComponent ComponentFromCmpntCfg(IComponentCfg config, IList components) + { + return new BalanceOld((BalanceCfg)config); + } + + public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component) + { + return ComponentCfgBase.CreateFromDbEntity(typeof(BalanceCfg), component, this); + } + + public void ResetStaticProperties() { BalanceOld.ResetStaticProperties(); } + } +} diff --git a/TestBenchFramework/BenchControl/TbfComponents.cs b/TestBenchFramework/BenchControl/TbfComponents.cs index 28dbfd455..86f2a60c5 100644 --- a/TestBenchFramework/BenchControl/TbfComponents.cs +++ b/TestBenchFramework/BenchControl/TbfComponents.cs @@ -50,7 +50,8 @@ namespace TBF.BenchControl Factories.Add(new ResultsPrinters.LabelPrinter.PrinterFactory()); /// LabelPrinter Factories.Add(new TestMethods.LeakTest.TestMethodFactory()); Factories.Add(new MettlerToledo.Standard.BalanceFactory()); /// MettlerToledo Balance - Factories.Add(new MettlerToledo.Standard.BalanceNewFactory()); /// MettlerToledoBalanceSN + Factories.Add(new MettlerToledo.Standard.BalanceOldFactory()); /// MettlerToledoBalanceOld + Factories.Add(new MettlerToledo.Standard.BalanceNewFactory()); /// MettlerToledoBalanceSN Factories.Add(new MettlerToledo.Multi.BalanceFactory()); /// MettlerToledo-Multi Factories.Add(new Modbus.Common.Factory()); /// Modbus Factories.Add(new TestMethods.PMaxTest.TestMethodFactory()); diff --git a/TestBenchFramework/Properties/AssemblyInfo.cs b/TestBenchFramework/Properties/AssemblyInfo.cs index c6ca15809..364be7024 100644 --- a/TestBenchFramework/Properties/AssemblyInfo.cs +++ b/TestBenchFramework/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("2.5.269.1")] -[assembly: AssemblyFileVersion("2.5.269.1")] +[assembly: AssemblyVersion("2.5.270.1")] +[assembly: AssemblyFileVersion("2.5.270.1")] diff --git a/TestBenchFramework/TBF.csproj b/TestBenchFramework/TBF.csproj index 0c74d6612..78d8d2334 100644 --- a/TestBenchFramework/TBF.csproj +++ b/TestBenchFramework/TBF.csproj @@ -364,6 +364,8 @@ + +