Novus : Setpoint incr/decr from UI, comm. latency removed, isHeating/isCooling evaluation modified, clean-up

This commit is contained in:
Milan Hanajik
2022-04-26 16:53:10 +02:00
parent c5db2c0138
commit 95fb7ab9cc
2 changed files with 95 additions and 66 deletions
@@ -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;
/// <summary>
/// Events: PressureInDone, PressureOutDone or Error
/// </summary>
/// <param name="easytherm">Pressure meter reference</param>
/// <param name="tempControl">Pressure meter reference</param>
/// <param name="pressure">Reference to the measured pressure variable, value is in bar</param>
/// <param name="eventDone">Event to be returned by Run() when completed OK</param>
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)
{
}
/// <summary>Start this operation</summary>
public void Start()
{
easytherm.SetTemperatureSetpoint();
tempControl.SetTemperatureSetpoint();
}
/// <summary>Run this operation</summary>
+87 -58
View File
@@ -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
/// <summary>Run this device</summary>
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
/// <summary>Run this device</summary>
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;
}
}
}
}