Modbus.TempControl.Novus works OK, TODO: T and SP display on Elde component.
This commit is contained in:
parent
1b14954a6d
commit
0fa621bd6a
@ -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)); }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Enumeration of modbus components via static fields and methods
|
||||
/// </summary>
|
||||
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<byte[]>();
|
||||
|
||||
receivedTelegrams = new Queue<byte[]>[256];
|
||||
for (int i = 0; i < receivedTelegrams.Length; i++)
|
||||
{
|
||||
receivedTelegrams[i] = new Queue<byte[]>();
|
||||
}
|
||||
for (int i = 0; i < receivedTelegrams.Length; i++) receivedTelegrams[i] = new Queue<byte[]>();
|
||||
|
||||
componentNames = new string[256];
|
||||
for (int i = 0; i < componentNames.Length; i++) componentNames[i] = "?";
|
||||
|
||||
if (modbusCommonCfg.DebugLevel == DebugMode.Normal)
|
||||
{
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
/// <summary> Procedure parameters </summary>
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user