Modbus.TempControl.Novus works OK, TODO: T and SP display on Elde component.

This commit is contained in:
Milan Hanajik 2022-05-27 14:29:29 +02:00
parent 1b14954a6d
commit 0fa621bd6a
3 changed files with 55 additions and 30 deletions

View File

@ -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)
{

View File

@ -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;
}

View File

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