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()