/// /// Copyright (c) 2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using log4net; using SchematicDrawing; using TBF.Rig.Generic; using TBF.Boxes; namespace TBF.Rig.Modbus.TempMeter.Meret { public class TempMeter : ComponentBase, GenericDevices.ITempMeter, IDevice, IDrawingItCmpntWithMeasuredVal { 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; public IDrawingItem DrawingItem { get { return tempMtrCfg as IDrawingItem; } } readonly GenericDevices.IModbus modbus; double receivedTemp; public bool MsrmntAvailable { get { return true; } } public double MeasuredVal { get { return receivedTemp; } } public string AltString { get { return string.Empty; } } public TempMeter() { } public TempMeter(Generic.IComponentCfg cfg, IList 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.Warn(this.ToString()); } /// /// IDevice interface /// public void Initialize() { } /// Run this device 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((byte)tempMtrCfg.ModbusAddress, Function, Address, 2); } } public void RunDeviceAfter() { } public void StopDevice() { } public void StopDevice2() { } /// /// Returns the water pressure /// /// Temperature in °C 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; } } /// /// Events: PressureDone, Error /// /// Reference to a variable for the pressure in Bar /// ReadPressureOp instance reference casted to IOperaton public IOperation ReadTempOp(ref DoubleBox tempBox) { return new ReadTempOp(this, ref tempBox); } /// /// Events: pressureDone, Error /// /// Reference to a variable for the pressure in Bar /// Event returned when measurement done /// ReadPressureOp instance reference casted to IOperaton public IOperation ReadTempOp(ref DoubleBox tempBox, Event tempDone) { return new ReadTempOp(this, ref tempBox, tempDone); } } }