/// /// Copyright (c) 2016-2017 Sensus Metering Systems /// using System; using System.Collections.Generic; using log4net; using Common; using TBF.Rig.Generic; using TBF.Boxes; namespace TBF.Rig.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("{0}({1})", ClassName, 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"); } /// Initialize this device public override void Initialize() { log.FatalFormat("{0} initialized: {1}", Name, this); } /// /// Returns the water pressure /// /// Pressure in mBar public float ReadPressure() { double rawPressure = Units.ConvertFrom(Unit.kPa, receivedPressure); double correctedPressure = Config.Entities.MeasurementCorrection.CorrectedValue(rawPressure, Corrections); return (float)correctedPressure; } /// /// 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 == DebugMode.Simulate || pressureMtrCfg.DebugLevel == 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); } } } /// Run this device public void RunDeviceAfter() { if (pressureMtrCfg.DebugLevel == DebugMode.Simulate || pressureMtrCfg.DebugLevel == DebugMode.FailureDuringOperation) { return; } 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); } } public void StopDevice() { } public void StopDevice2() { } } }