Novus : Setpoint incr/decr from UI, comm. latency removed, isHeating/isCooling evaluation modified, clean-up
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user