From 0fa621bd6a1c6cdedbb5e91a781e953c3cf2299e Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 27 May 2022 14:29:29 +0200 Subject: [PATCH] Modbus.TempControl.Novus works OK, TODO: T and SP display on Elde component. --- TBF/Rig/Modbus/Common/Modbus.cs | 32 ++++++++++++-- TBF/Rig/Modbus/TempControl/Novus/TControl.cs | 44 ++++++++----------- .../Modbus/TempControl/Novus/TControlCfg.cs | 9 ++++ 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/TBF/Rig/Modbus/Common/Modbus.cs b/TBF/Rig/Modbus/Common/Modbus.cs index 95675fe80..e56b258ad 100644 --- a/TBF/Rig/Modbus/Common/Modbus.cs +++ b/TBF/Rig/Modbus/Common/Modbus.cs @@ -23,6 +23,17 @@ namespace TBF.Rig.Modbus.Common private static readonly ILog log = LogManager.GetLogger(typeof(Modbus)); public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } + + /// + /// Enumeration of modbus components via static fields and methods + /// + static int nextIdx = 0; + static int modbusComponentsCount { get { return nextIdx; } } + static Modbus[] modbusComponents; + /// + int modbusComponentIx; /// 0-based modbus component index assigned in Initialize() + + private readonly ModbusCfg modbusCommonCfg; /// Private fields @@ -53,13 +64,26 @@ namespace TBF.Rig.Modbus.Common public override void Initialize() { + modbusComponentIx = nextIdx++; + /// + if (modbusComponents == null || modbusComponents.Length < nextIdx) + { + Modbus[] componentsSoFar = modbusComponents; + modbusComponents = new Modbus[modbusComponentsCount]; + if (componentsSoFar != null) + { + for (int i = 0; i < componentsSoFar.Length; i++) modbusComponents[i] = componentsSoFar[i]; + } + modbusComponents[modbusComponentsCount - 1] = this; + } + telegramsToSend = new Queue(); receivedTelegrams = new Queue[256]; - for (int i = 0; i < receivedTelegrams.Length; i++) - { - receivedTelegrams[i] = new Queue(); - } + for (int i = 0; i < receivedTelegrams.Length; i++) receivedTelegrams[i] = new Queue(); + + componentNames = new string[256]; + for (int i = 0; i < componentNames.Length; i++) componentNames[i] = "?"; if (modbusCommonCfg.DebugLevel == DebugMode.Normal) { diff --git a/TBF/Rig/Modbus/TempControl/Novus/TControl.cs b/TBF/Rig/Modbus/TempControl/Novus/TControl.cs index 5a04364af..dfe1154e9 100644 --- a/TBF/Rig/Modbus/TempControl/Novus/TControl.cs +++ b/TBF/Rig/Modbus/TempControl/Novus/TControl.cs @@ -40,7 +40,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus public double SetpointVal { - get { return temperatureSetPoint; } + get { return temperatureSetpoint; } set { SetTemperatureSetpoint(value); } } /// @@ -51,12 +51,12 @@ namespace TBF.Rig.Modbus.TempControl.Novus double newSetpoint; if (novusCfg.RoundToSetpStep) { - double roundedSetpoint = tempStepC * Math.Round(temperatureSetPoint / tempStepC); - newSetpoint = (roundedSetpoint <= temperatureSetPoint) ? (roundedSetpoint + tempStepC) : roundedSetpoint; + double roundedSetpoint = tempStepC * Math.Round(temperatureSetpoint / tempStepC); + newSetpoint = (roundedSetpoint <= temperatureSetpoint) ? (roundedSetpoint + tempStepC) : roundedSetpoint; } else { - newSetpoint = temperatureSetPoint + tempStepC; + newSetpoint = temperatureSetpoint + tempStepC; } SetTemperatureSetpoint(Math.Min(newSetpoint, 95.0)); @@ -69,12 +69,12 @@ namespace TBF.Rig.Modbus.TempControl.Novus double newSetpoint; if (novusCfg.RoundToSetpStep) { - double roundedSetpoint = tempStepC * Math.Round(temperatureSetPoint / tempStepC); - newSetpoint = (roundedSetpoint >= temperatureSetPoint) ? (roundedSetpoint - tempStepC) : roundedSetpoint; + double roundedSetpoint = tempStepC * Math.Round(temperatureSetpoint / tempStepC); + newSetpoint = (roundedSetpoint >= temperatureSetpoint) ? (roundedSetpoint - tempStepC) : roundedSetpoint; } else { - newSetpoint = temperatureSetPoint - tempStepC; + newSetpoint = temperatureSetpoint - tempStepC; } SetTemperatureSetpoint(Math.Max(newSetpoint, 5.0)); @@ -89,7 +89,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus Int16 status3; Int16 fwVersion; Int16 controllerId; - double temperatureSetPoint; + double temperatureSetpoint; double actualTemperature; bool isHeating { get { return (status2 & (1 << 11)) != 0; } } /// Output 1: Heating @@ -115,7 +115,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus if (novusCfg.DebugLevel == DebugMode.Simulate) { actualTemperature = 22; - temperatureSetPoint = 18; + temperatureSetpoint = 18; log.FatalFormat("{0} simulated: {1}", Name, this); } else @@ -126,14 +126,6 @@ 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); } } @@ -168,14 +160,16 @@ namespace TBF.Rig.Modbus.TempControl.Novus controllerId = values[ControllerIdAddress]; double setpointCorF = (double)values[SetpointAddress] * 0.1; - temperatureSetPoint = isFahrenheit ? Units.ConvertFrom(Unit.F, setpointCorF) : setpointCorF; + temperatureSetpoint = isFahrenheit ? Units.ConvertFrom(Unit.F, setpointCorF) : setpointCorF; + string setpointStr = string.Format(novusCfg.SetpFormat, Units.ConvertTo(novusCfg.SetpUnit, temperatureSetpoint)); double temperatureCorF = (double)values[ProcessValueAddress] * 0.1; actualTemperature = isFahrenheit ? Units.ConvertFrom(Unit.F, temperatureCorF) : temperatureCorF; + string temperatureStr = string.Format(novusCfg.MsrdFormat, Units.ConvertTo(novusCfg.MsrdUnit, actualTemperature)); novusDataValid = true; - log.InfoFormat("[{0}] setpoint = {1} temperature = {2}", Name, temperatureSetPoint, actualTemperature); + 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"); @@ -201,12 +195,10 @@ namespace TBF.Rig.Modbus.TempControl.Novus public void RunDeviceAfter() { if (DebugLevel != DebugMode.Simulate && DebugLevel != DebugMode.FailureDuringOperation - //&& modbus.IsMyTurn(ticketNumber) - ) + && (StateMachine.Time % 3 == novusCfg.ReservoirNr - 1)) { - 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. + /// Read setpoint, PV (actual temperature), status1, status2, status3, FW version etc. + SendValueToNovus(Function.ReadHoldingRegisters, 0, 11); } } @@ -226,7 +218,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus return false; /// required temperature out of range } - if (novusDataValid && (temperatureC == temperatureSetPoint)) + if (novusDataValid && (temperatureC == temperatureSetpoint)) { return true; /// already set to the required temperature } @@ -240,7 +232,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus SendValueToNovus(Function.PresetSingleRegister, destAddress, tempSetpointInt16); } - temperatureSetPoint = temperatureC; + temperatureSetpoint = temperatureC; return true; } diff --git a/TBF/Rig/Modbus/TempControl/Novus/TControlCfg.cs b/TBF/Rig/Modbus/TempControl/Novus/TControlCfg.cs index 098229513..8cc1745eb 100644 --- a/TBF/Rig/Modbus/TempControl/Novus/TControlCfg.cs +++ b/TBF/Rig/Modbus/TempControl/Novus/TControlCfg.cs @@ -36,6 +36,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus public Unit SetpUnit { get; set; } /// 4 public double SetpStep { get; set; } /// 5 public bool RoundToSetpStep { get; set; } /// 6 + public int ReservoirNr { get; set; } /// 7 /// Procedure parameters @@ -73,6 +74,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus SetpUnit = Unit.C; SetpStep = 1.0; RoundToSetpStep = true; + ReservoirNr = 1; } string[] paramNames = new string[] @@ -84,6 +86,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus "Unit of temperature setpoint", /// 4 "Setpoint step", /// 5 "Round to setpoint step", /// 6 + "Reservoir nr. (1-based)", /// 7 }; public string ParamName(int i) { return paramNames[i]; } public int ParamsCount() { return paramNames.Length; } @@ -114,6 +117,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus case 4: return (SetpUnit == Unit.K) ? "K" : (SetpUnit == Unit.F) ? "°F" : "°C"; case 5: return SetpStep.ToString(); case 6: return RoundToSetpStep ? Strings.yes : Strings.no; + case 7: return ReservoirNr.ToString(); default: return string.Format("{0}({1}) address={2}", Name, string.IsNullOrEmpty(ParentName) ? "-" : ParentName, ModbusAddress); } @@ -136,6 +140,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus return CfgUpdateFlags.RestartRqrd; case 5: SetpStep = Utils.ParseUDouble(str); return CfgUpdateFlags.RestartRqrd; case 6: RoundToSetpStep = (str == Strings.yes); return CfgUpdateFlags.RestartRqrd; + case 7: ReservoirNr = int.Parse(str); return CfgUpdateFlags.RestartRqrd; default: return CfgUpdateFlags.None; } } @@ -164,6 +169,9 @@ namespace TBF.Rig.Modbus.TempControl.Novus case 6: if (str == Strings.yes || str == Strings.no) return true; break; + case 7: + if (int.TryParse(str, out idummy) && idummy >= 1 && idummy <= 10) return true; + break; default: message = "Invalid index"; return false; @@ -185,6 +193,7 @@ namespace TBF.Rig.Modbus.TempControl.Novus prms.SetpUnit = SetpUnit; prms.SetpStep = SetpStep; prms.RoundToSetpStep = RoundToSetpStep; + prms.ReservoirNr = ReservoirNr; } public IParamsProvider Clone()