/// /// Copyright (c) 2016-2017 Sensus Metering Systems /// using System; using System.Collections.Generic; using log4net; using TBF.BenchControl.Generic; using TBF.Boxes; namespace TBF.BenchControl.Modbus.PressureMeter.Meret { public class PressureMeter : ComponentBase, GenericDevices.IPressureMeter, IDevice { private static readonly ILog log = LogManager.GetLogger(typeof(PressureMeter)); public override string ToString() { return string.Format("PressureMeter({0})", Cfg.ToString(1)); } readonly PressureMeterCfg pressureMtrCfg; readonly GenericDevices.IModbus modbus; private float receivedPressure; const ushort WatchdogBitMask = 0x0010; public PressureMeter() { } public PressureMeter(Generic.IComponentCfg cfg, IList components) : base(cfg) { pressureMtrCfg = cfg as PressureMeterCfg; modbus = (GenericDevices.IModbus)TbfComponents.FindComponent(cfg.ParentName, components); if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); /// Connect to handler //ModbusAddress.MeretRS485Address[Idx0] = ModbusAddress; log.Debug(this.ToString()); } /// Initialize this device public void Initialize() { } /// /// Returns the water pressure /// /// Pressure in mBar public float ReadPressure() { return (float)Config.Units.ConvertFrom(Config.Unit.kPa, receivedPressure); } /// /// Events: PressureDone, Error /// /// Reference to a variable for the pressure in Bar /// ReadPressureOp instance reference casted to IOperaton public IOperation ReadPressureOp(ref FloatBox pressure) { return new ReadPressureOp(this, ref pressure); } /// /// 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 ReadPressureOp(ref FloatBox pressure, Event pressureDone) { return new ReadPressureOp(this, ref pressure, pressureDone); } /// Run this device public void RunDeviceBefore() { if (pressureMtrCfg.DebugLevel == Config.Entities.DebugMode.Simulate || pressureMtrCfg.DebugLevel == Config.Entities.DebugMode.FailureDuringOperation) { return; } if (modbus.ReceivedTelegrams[pressureMtrCfg.ModbusAddress].Count > 0) { byte[] telegram = modbus.ReceivedTelegrams[pressureMtrCfg.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; receivedPressure = System.BitConverter.ToSingle(telegram, 3); } } if ((StateMachine.Time % 3) == (pressureMtrCfg.ModbusAddress % 3)) /// Each 3 seconds { const byte Function = 4; /// Read input registers const ushort Address = 0; /// Pressure modbus.SendMessage(pressureMtrCfg.ModbusAddress, Function, Address, 2); } } /// Run this device public void RunDeviceAfter() { } /// Stop this device public void StopDevice() { } } }