/// /// 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; } } Common.Modbus modbus; double receivedTemp; public bool MsrmntAvailable { get { return true; } } public double MeasuredVal { get { return receivedTemp; } } public string AltString { get { return string.Empty; } } int ticketNumber; /// 0 .. number of devices registered for regular polling - 1 public TempMeter() { } public TempMeter(Generic.IComponentCfg cfg, IList components) : base(cfg) { tempMtrCfg = cfg as TempMeterCfg; } public override void Initialize() { modbus = TbfComponents.FindComponent(tempMtrCfg.ParentName) as Common.Modbus; if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); modbus.ComponentNames[tempMtrCfg.ModbusAddress] = Name; ticketNumber = modbus.RegisterForPolling(); log.FatalFormat("{0} initialized: {1}", Name, this); } /// /// IDevice interface /// /// Run this device public void RunDeviceBefore() { 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")); } } } public void RunDeviceAfter() { if (tempMtrCfg.DebugLevel != Config.Entities.DebugMode.Simulate && tempMtrCfg.DebugLevel != Config.Entities.DebugMode.FailureDuringOperation && modbus.IsMyTurn(ticketNumber)) { const byte Function = 4; /// Read input registers const ushort Address = 0; /// Temperature modbus.SendMessage((byte)tempMtrCfg.ModbusAddress, Function, Address, 2, Name); } } 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); } } }