From 95fb7ab9cccf4cc83cbd1b4f57390bb023786899 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Wed, 20 Apr 2022 15:56:09 +0200 Subject: [PATCH] Novus : Setpoint incr/decr from UI, comm. latency removed, isHeating/isCooling evaluation modified, clean-up --- .../Novus/SetRequiredTemperatureOp.cs | 16 +- TBF/Rig/Modbus/TempControl/Novus/TControl.cs | 145 +++++++++++------- 2 files changed, 95 insertions(+), 66 deletions(-) diff --git a/TBF/Rig/Modbus/TempControl/Novus/SetRequiredTemperatureOp.cs b/TBF/Rig/Modbus/TempControl/Novus/SetRequiredTemperatureOp.cs index 455f479b9..6cee43c48 100644 --- a/TBF/Rig/Modbus/TempControl/Novus/SetRequiredTemperatureOp.cs +++ b/TBF/Rig/Modbus/TempControl/Novus/SetRequiredTemperatureOp.cs @@ -13,32 +13,32 @@ namespace TBF.Rig.Modbus.TempControl.Novus public override string ToString() { return string.Format("SetRequiredTemperatureOp({0})", eventDone); } /// Set by the constructor - readonly TControl easytherm; + readonly TControl tempControl; readonly Event eventDone; /// /// Events: PressureInDone, PressureOutDone or Error /// - /// Pressure meter reference + /// Pressure meter reference /// Reference to the measured pressure variable, value is in bar /// Event to be returned by Run() when completed OK - public SetRequiredTemperatureOp(TControl easytherm, Event eventDone) + public SetRequiredTemperatureOp(TControl tempControl, Event eventDone) { - if (easytherm == null) throw new ArgumentNullException("easytherm"); - this.easytherm = easytherm; + if (tempControl == null) throw new ArgumentNullException("tempControl"); + this.tempControl = tempControl; this.eventDone = eventDone; log.Debug(this.ToString()); } - public SetRequiredTemperatureOp(TControl easytherm) - : this(easytherm, Event.ConditionMet) + public SetRequiredTemperatureOp(TControl tempControl) + : this(tempControl, Event.ConditionMet) { } /// Start this operation public void Start() { - easytherm.SetTemperatureSetpoint(); + tempControl.SetTemperatureSetpoint(); } /// Run this operation diff --git a/TBF/Rig/Modbus/TempControl/Novus/TControl.cs b/TBF/Rig/Modbus/TempControl/Novus/TControl.cs index d45d9a61e..5e30d1485 100644 --- a/TBF/Rig/Modbus/TempControl/Novus/TControl.cs +++ b/TBF/Rig/Modbus/TempControl/Novus/TControl.cs @@ -13,8 +13,8 @@ using TBF.Rig.Generic; namespace TBF.Rig.Modbus.TempControl.Novus { - public class TControl : ComponentBase, IDevice, ITempControl, IDrawingItCmpntWithSetpoint, - IDrawingItCmpntWithMeasuredVal, IDrawingItCmpntWithCustomBmp + public class TControl : ComponentBase, IDevice, ITempControl, GenericDevices.ISequenceCondition, + IDrawingItCmpntWithSetpoint, IDrawingItCmpntWithMeasuredVal, IDrawingItCmpntWithCustomBmp { private static readonly ILog log = LogManager.GetLogger(typeof(TControl)); public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } @@ -40,19 +40,21 @@ namespace TBF.Rig.Modbus.TempControl.Novus public double SetpointVal { get { return temperatureSetPoint; } - set { temperatureSetPoint = value; } + set { SetTemperatureSetpoint(value); } } /// public void IncreaseSetpoint() { - temperatureSetPoint += 0.5; - if (temperatureSetPoint > 95.0) temperatureSetPoint = 95.0; + double temperatureStep = isFahrenheit ? Units.ConvertFrom(Unit.F, 0.5) : 0.5; + double newSetpoint = Math.Min(temperatureSetPoint + temperatureStep, 95.0); + SetTemperatureSetpoint(newSetpoint); } /// public void DecreaseSetpoint() { - temperatureSetPoint -= 0.5; - if (temperatureSetPoint <= 5) temperatureSetPoint = 5; + double temperatureStep = isFahrenheit ? Units.ConvertFrom(Unit.F, 0.5) : 0.5; + double newSetpoint = Math.Max(temperatureSetPoint - temperatureStep, 5.0); + SetTemperatureSetpoint(newSetpoint); } @@ -79,7 +81,6 @@ namespace TBF.Rig.Modbus.TempControl.Novus bool novusDataValid; bool temperatureSetPointValid { get { return novusDataValid; } } - bool temperatureSetPointRequested; Int16 status1; Int16 status2; @@ -89,9 +90,8 @@ namespace TBF.Rig.Modbus.TempControl.Novus double temperatureSetPoint; double actualTemperature; - bool isInvOutput { get { return (status2 & (1 << 2)) != 0; } } - bool isHeating { get { return isInvOutput ? ((status2 & (1 << 11)) == 0) : ((status2 & (1 << 11)) != 0); } } /// Output 1 - bool isCooling { get { return isInvOutput ? ((status2 & (1 << 12)) == 0) : ((status2 & (1 << 12)) != 0); } } /// Output 2 + bool isHeating { get { return (status2 & (1 << 11)) != 0; } } /// Output 1: Heating + bool isCooling { get { return (status2 & (1 << 12)) != 0; } } /// Output 2: Cooling bool isFahrenheit { get { return (status2 & (1 << 9)) != 0; } } @@ -117,7 +117,6 @@ namespace TBF.Rig.Modbus.TempControl.Novus public override void Initialize() { novusDataValid = false; - temperatureSetPointRequested = false; if (novusCfg.DebugLevel == DebugMode.Simulate) { @@ -133,6 +132,14 @@ namespace TBF.Rig.Modbus.TempControl.Novus modbus.ComponentNames[novusCfg.ModbusAddress] = Name; ticketNumber = modbus.RegisterForPolling(); + TBF.UiBridge.Bridge.SetpointChangeHandler += delegate(object sndr, TBF.UiBridge.SetpointChangeArgs args) + { + if (args.Name == Name) + { + if (args.Increase) IncreaseSetpoint(); else DecreaseSetpoint(); + } + }; + log.FatalFormat("{0} initialized: {1}", Name, this); } } @@ -141,47 +148,48 @@ namespace TBF.Rig.Modbus.TempControl.Novus /// Run this device public void RunDeviceBefore() { - if (novusCfg.DebugLevel != DebugMode.Simulate && - novusCfg.DebugLevel != DebugMode.FailureDuringOperation && - modbus.ReceivedTelegrams[novusCfg.ModbusAddress].Count > 0) + if (DebugLevel != DebugMode.Simulate && DebugLevel != DebugMode.FailureDuringOperation) { - byte[] telegram = modbus.ReceivedTelegrams[novusCfg.ModbusAddress].Dequeue(); + while (modbus.ReceivedTelegrams[novusCfg.ModbusAddress].Count > 0) + { + byte[] telegram = modbus.ReceivedTelegrams[novusCfg.ModbusAddress].Dequeue(); - if (telegram.Length == 5) - { - log.InfoFormat("[{0}] received 5 bytes", Name); - } - else if (telegram.Length == 27 && telegram[1] == (byte)Function.ReadHoldingRegisters && telegram[2] == 22) - { - Int16[] values = new Int16[11]; - for (int i = 0; i < values.Length; i++) + if (telegram.Length == 5) { - values[i] = (Int16)(256 * telegram[2 * i + 3] + telegram[2 * i + 4] - - ((telegram[2 * i + 3] & 0x80) != 0 ? 65536 : 0)); + log.InfoFormat("[{0}] received 5 bytes", Name); } + else if (telegram.Length == 27 && telegram[1] == (byte)Function.ReadHoldingRegisters && telegram[2] == 22) + { + Int16[] values = new Int16[11]; + for (int i = 0; i < values.Length; i++) + { + values[i] = (Int16)(256 * telegram[2 * i + 3] + telegram[2 * i + 4] + - ((telegram[2 * i + 3] & 0x80) != 0 ? 65536 : 0)); + } - status1 = values[Status1Address]; - status2 = values[Status2Address]; - status3 = values[Status3Address]; - fwVersion = values[FWVersionAddress]; - controllerId = values[ControllerIdAddress]; + status1 = values[Status1Address]; + status2 = values[Status2Address]; + status3 = values[Status3Address]; + fwVersion = values[FWVersionAddress]; + controllerId = values[ControllerIdAddress]; - double setpointCorF = (double)values[SetpointAddress] * 0.1; - temperatureSetPoint = isFahrenheit ? Units.ConvertFrom(Unit.F, setpointCorF) : setpointCorF; + double setpointCorF = (double)values[SetpointAddress] * 0.1; + temperatureSetPoint = isFahrenheit ? Units.ConvertFrom(Unit.F, setpointCorF) : setpointCorF; - double temperatureCorF = (double)values[ProcessValueAddress] * 0.1; - actualTemperature = isFahrenheit ? Units.ConvertFrom(Unit.F, temperatureCorF) : temperatureCorF; + double temperatureCorF = (double)values[ProcessValueAddress] * 0.1; + actualTemperature = isFahrenheit ? Units.ConvertFrom(Unit.F, temperatureCorF) : temperatureCorF; - novusDataValid = true; + novusDataValid = true; - log.InfoFormat("[{0}] setpoint = {1} temperature = {2}", Name, temperatureSetPoint, actualTemperature); - log.InfoFormat("[{0}] s1={1} s2={2} s3={3} fw={4} id={5}", - Name, status1.ToString("X02"), status2.ToString("X02"), status3.ToString("X02"), - fwVersion, controllerId == 18 ? "N1200HC" : controllerId == 48 ? "N1200" : "unknonw"); - } - else - { - log.InfoFormat("[{0}] received soemthing else", Name); + log.InfoFormat("[{0}] setpoint = {1} temperature = {2}", Name, temperatureSetPoint, actualTemperature); + log.InfoFormat("[{0}] s1=0x{1} s2=0x{2} s3=0x{3} fw={4} id={5}", + Name, status1.ToString("X4"), status2.ToString("X4"), status3.ToString("X4"), + fwVersion, controllerId == 18 ? "N1200HC" : controllerId == 48 ? "N1200" : "unknonw"); + } + else + { + log.InfoFormat("[{0}] received soemthing else", Name); + } } } else if (novusCfg.DebugLevel == DebugMode.Simulate) @@ -198,21 +206,12 @@ namespace TBF.Rig.Modbus.TempControl.Novus /// Run this device public void RunDeviceAfter() { - if (novusCfg.DebugLevel != DebugMode.Simulate && - novusCfg.DebugLevel != DebugMode.FailureDuringOperation && + if (DebugLevel != DebugMode.Simulate && DebugLevel != DebugMode.FailureDuringOperation && modbus.IsMyTurn(ticketNumber)) { - if (novusDataValid && (requiredTemp != 0) && (requiredTemp != temperatureSetPoint)) - { - SetTemperatureSetpoint(requiredTemp); - log.InfoFormat("{0} - Set new temperature setpoint = {1}", Name, requiredTemp); - } - else - { - SendValueToNovus(Function.ReadHoldingRegisters, 0, 11); /// Read setpoint, PV (actual temperature), status1, status2, status3, FW version etc. - //SendValueToNovus(Function.ReadHoldingRegisters, 0, 2); /// Read setpoint and PV (actual temperature) - //SendValueToNovus(Function.ReadHoldingRegisters, 6, 5); /// Read status1, status2, status3, FW version etc. - } + SendValueToNovus(Function.ReadHoldingRegisters, 0, 11); /// Read setpoint, PV (actual temperature), status1, status2, status3, FW version etc. + //SendValueToNovus(Function.ReadHoldingRegisters, 0, 2); /// Read setpoint and PV (actual temperature) + //SendValueToNovus(Function.ReadHoldingRegisters, 6, 5); /// Read status1, status2, status3, FW version etc. } } @@ -311,5 +310,35 @@ namespace TBF.Rig.Modbus.TempControl.Novus { return new ReadTempOp(this, ref temp, eventDone); } - } + + + public int ConditionsCount + { + get { return 3; } + } + + /// Strings are added to the combo-box for transition sequence condition selection + public string ConditionName(int i) + { + switch (i) + { + case 0: return string.Format("{0} open_the_drain_valve", Name); + case 1: return string.Format("{0} close_the_drain_valve", Name); + case 2: return string.Format("{0} wait_until_the_tank_is_empty", Name); + default: return string.Empty; + } + } + + /// Operation to be executed as a part of a transition sequence + public IOperation ConditionOp(int i) + { + switch (i) + { + case 0: return null; + case 1: return null; + case 2: return null; + default: return null; + } + } + } }