tbf/TBF/BenchControl/Modbus/Meret/TempMeter/TempMeter.cs

124 lines
4.0 KiB
C#

///
/// Copyright (c) 2020 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using log4net;
using TBF.BenchControl.Generic;
using TBF.Boxes;
namespace TBF.BenchControl.Modbus.Meret.TempMeter
{
public class TempMeter : ComponentBase, GenericDevices.ITempMeter, IDevice
{
private static readonly ILog log = LogManager.GetLogger(typeof(TempMeter));
public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(1)); }
readonly TempMeterCfg tempMtrCfg;
readonly GenericDevices.IModbus modbus;
double receivedTemp;
public TempMeter()
{
}
public TempMeter(Generic.IComponentCfg cfg, IList<Generic.IComponent> components)
: base(cfg)
{
tempMtrCfg = cfg as TempMeterCfg;
modbus = TbfComponents.FindComponent(cfg.ParentName, components) as GenericDevices.IModbus;
if (modbus == null) throw new Exception("Cannot find " + Name + " parent");
log.Debug(this.ToString());
}
///
/// IDevice interface
///
public void Initialize() { }
/// <summary>Run this device</summary>
public void RunDeviceBefore()
{
if (tempMtrCfg.DebugLevel == Config.Entities.DebugMode.Simulate ||
tempMtrCfg.DebugLevel == Config.Entities.DebugMode.FailureDuringOperation)
{
return;
}
if (modbus.ReceivedTelegrams[tempMtrCfg.ModbusAddress].Count > 0)
{
byte[] telegram = modbus.ReceivedTelegrams[tempMtrCfg.ModbusAddress].Dequeue();
if (telegram.Length == 9 && telegram[1] == 4 && telegram[2] == 4)
{
/// Swap byte order
byte t1 = telegram[3];
byte t2 = telegram[4];
byte t3 = telegram[5];
byte t4 = telegram[6];
telegram[3] = t4;
telegram[4] = t3;
telegram[5] = t2;
telegram[6] = t1;
receivedTemp = System.BitConverter.ToSingle(telegram, 3);
log.WarnFormat("Temperature: {0}={1}°C", Name, receivedTemp.ToString("F1"));
}
}
if ((StateMachine.Time % Constants.ModbusPollPeriod) == (tempMtrCfg.ModbusAddress % Constants.ModbusPollPeriod)) /// Each 'ModbusDevices' seconds
{
const byte Function = 4; /// Read input registers
const ushort Address = 0; /// Temperature
modbus.SendMessage(tempMtrCfg.ModbusAddress, Function, Address, 2);
}
}
public void RunDeviceAfter() { }
public void StopDevice() { }
public void StopDevice2() { }
/// <summary>
/// Returns the water pressure
/// </summary>
/// <returns>Temperature in °C</returns>
public double ReadTemperature()
{
if (Cfg.DebugLevel == Config.Entities.DebugMode.Normal)
{
return Config.Formulas.CorrectedValue(receivedTemp, Corrections);
}
else if (Cfg.DebugLevel == Config.Entities.DebugMode.Simulate)
{
return 20.0;
}
else
{
return 0;
}
}
/// <summary>
/// Events: PressureDone, Error
/// </summary>
/// <param name="tempBox">Reference to a variable for the pressure in Bar</param>
/// <returns>ReadPressureOp instance reference casted to IOperaton</returns>
public IOperation ReadTempOp(ref DoubleBox tempBox)
{
return new ReadTempOp(this, ref tempBox);
}
/// <summary>
/// Events: pressureDone, Error
/// </summary>
/// <param name="tempBox">Reference to a variable for the pressure in Bar</param>
/// <param name="tempDone">Event returned when measurement done</param>
/// <returns>ReadPressureOp instance reference casted to IOperaton</returns>
public IOperation ReadTempOp(ref DoubleBox tempBox, Event tempDone)
{
return new ReadTempOp(this, ref tempBox, tempDone);
}
}
}