From fc81344857f96c9e9862dfd7181f71e6443d2df9 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Sun, 17 Apr 2022 22:13:01 +0200 Subject: [PATCH] Initialization and logging of several TBF.Rig.Modbus components. --- TBF/Rig/Modbus/Common/Modbus.cs | 34 +++-- .../PressureMeter/Meret/PressureMeter.cs | 25 ++-- .../PressureMeter/Meret/PressureMeterCfg.cs | 3 +- TBF/Rig/Modbus/PumpFM/DanfossVLT/Pump.cs | 75 ++++++----- TBF/Rig/Modbus/QuidoRS/QuidoRS.cs | 125 ++++++++++-------- TBF/Rig/Modbus/TempMeter/Groch/TempMeter.cs | 28 ++-- .../Modbus/TempMeter/Meret/TempMeterCfg.cs | 3 +- 7 files changed, 161 insertions(+), 132 deletions(-) diff --git a/TBF/Rig/Modbus/Common/Modbus.cs b/TBF/Rig/Modbus/Common/Modbus.cs index bc618af80..4e4aaace7 100644 --- a/TBF/Rig/Modbus/Common/Modbus.cs +++ b/TBF/Rig/Modbus/Common/Modbus.cs @@ -199,15 +199,15 @@ namespace TBF.Rig.Modbus.Common if (bytesCount > 0) { bytesCount = serialPort.Read(buffer, 0, Math.Min(bytesCount, BUFFER_SIZE)); - } - /// - string st = string.Format("{0}", Name, Telegram.LogTelegram("Received data ", buffer, 0, bytesCount)); - Debug.WriteLine(st); - log.Debug(st); - /// - for (int i = 0; i < bytesCount && rcvdBytesCount < BUFFER_SIZE; i++, rcvdBytesCount++) - { - rcvdData[rcvdBytesCount] = buffer[i]; + /// + for (int i = 0; i < bytesCount && rcvdBytesCount < BUFFER_SIZE; i++, rcvdBytesCount++) + { + rcvdData[rcvdBytesCount] = buffer[i]; + } + /// + string st = string.Format("[{0}] received {1}", Name, Telegram.LogTelegram("", buffer, 0, bytesCount)); + Debug.WriteLine(st); + log.Debug(st); } } @@ -236,8 +236,11 @@ namespace TBF.Rig.Modbus.Common /// Enqueue receivedTelegrams[0].Enqueue(receivedTelegram); - string s = string.Format("{0} queue size={1}", Telegram.LogTelegram(string.Format("Received message from {0} ", componentNames[0]), - receivedTelegram), receivedTelegrams[0].Count); + string s = string.Format("[{0}] received message from [{1}] {2} queue size={3}", + Name, + componentNames[0], + Telegram.LogTelegram("", receivedTelegram), + receivedTelegrams[0].Count); Debug.WriteLine(s); log.Debug(s); offset += 28; @@ -260,8 +263,11 @@ namespace TBF.Rig.Modbus.Common int deviceAddress = receivedTelegram[0]; receivedTelegrams[deviceAddress].Enqueue(receivedTelegram); - string s = string.Format("{0} queue size={1}", Telegram.LogTelegram(string.Format("Received message from {0} ", componentNames[deviceAddress]), - receivedTelegram), receivedTelegrams[deviceAddress].Count); + string s = string.Format("[{0}] received message from [{1}] {2} queue size={3}", + Name, + componentNames[deviceAddress], + Telegram.LogTelegram("", receivedTelegram), + receivedTelegrams[deviceAddress].Count); Debug.WriteLine(s); log.Debug(s); offset += candidateLen; @@ -386,7 +392,7 @@ namespace TBF.Rig.Modbus.Common serialPort.Write(message, 0, message.Length); } - string s = Telegram.LogTelegram(string.Format("{0} - Sending message to {1} ", Name, meno), message); + string s = Telegram.LogTelegram(string.Format("[{0}] sending message to [{1}] ", Name, meno), message); Debug.WriteLine(s); log.Debug(s); } diff --git a/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeter.cs b/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeter.cs index ba2ca8c30..73b1124f4 100644 --- a/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeter.cs +++ b/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeter.cs @@ -44,17 +44,24 @@ namespace TBF.Rig.Modbus.PressureMeter.Meret /// public override void Initialize() { - modbus = TbfComponents.FindComponent(pressureMtrCfg.ParentName) as Common.Modbus; - if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + if (DebugLevel == DebugMode.Normal) + { + modbus = TbfComponents.FindComponent(pressureMtrCfg.ParentName) as Common.Modbus; + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); - modbus.ComponentNames[pressureMtrCfg.ModbusAddress] = Name; - ticketNumber = modbus.RegisterForPolling(); - log.FatalFormat("{0} initialized: {1}", Name, this); + modbus.ComponentNames[pressureMtrCfg.ModbusAddress] = Name; + ticketNumber = modbus.RegisterForPolling(); + log.FatalFormat("{0} initialized: {1}", Name, this); + } + else + { + log.FatalFormat("{0} simulated: {1}", Name, this); + } } public void RunDeviceBefore() { - if (modbus.ReceivedTelegrams[pressureMtrCfg.ModbusAddress].Count > 0) + if (DebugLevel == DebugMode.Normal && modbus.ReceivedTelegrams[pressureMtrCfg.ModbusAddress].Count > 0) { byte[] telegram = modbus.ReceivedTelegrams[pressureMtrCfg.ModbusAddress].Dequeue(); if (telegram.Length == 9 && telegram[1] == 4 && telegram[2] == 4) @@ -77,7 +84,7 @@ namespace TBF.Rig.Modbus.PressureMeter.Meret public void RunDeviceAfter() { - if (modbus.IsMyTurn(ticketNumber)) + if (DebugLevel == DebugMode.Normal && modbus.IsMyTurn(ticketNumber)) { const byte Function = 4; /// Read input registers const ushort Address = 0; /// Pressure @@ -95,11 +102,11 @@ namespace TBF.Rig.Modbus.PressureMeter.Meret /// Pressure in mBar public double ReadPressure() { - if (Cfg.DebugLevel == DebugMode.Normal) + if (DebugLevel == DebugMode.Normal) { return MeasurementCorrection.CorrectedValue(receivedPressure, Corrections); } - else if (Cfg.DebugLevel == DebugMode.Simulate) + else if (DebugLevel == DebugMode.Simulate) { return 1.0; } diff --git a/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeterCfg.cs b/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeterCfg.cs index 41d699fa9..9df230d9b 100644 --- a/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeterCfg.cs +++ b/TBF/Rig/Modbus/PressureMeter/Meret/PressureMeterCfg.cs @@ -121,8 +121,7 @@ namespace TBF.Rig.Modbus.PressureMeter.Meret case 4: return MsrdValLimLo.ToString(); case 5: return MsrdValLimHi.ToString(); default: - return string.Format("{0}(1) {2}[{3},{4}] addr={5}", Name, - (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), Shape, X, Y, ModbusAddress); + return string.Format("{0}({1}) address={2}", Name, string.IsNullOrEmpty(ParentName) ? "-" : ParentName, ModbusAddress); } } diff --git a/TBF/Rig/Modbus/PumpFM/DanfossVLT/Pump.cs b/TBF/Rig/Modbus/PumpFM/DanfossVLT/Pump.cs index 5c061de96..e1b932283 100644 --- a/TBF/Rig/Modbus/PumpFM/DanfossVLT/Pump.cs +++ b/TBF/Rig/Modbus/PumpFM/DanfossVLT/Pump.cs @@ -118,8 +118,8 @@ namespace TBF.Rig.Modbus.PumpFM.DanfossVLT } } - readonly Common.Modbus modbus; - readonly IControlBoard controlBoard; + Common.Modbus modbus; + IControlBoard controlBoard; int bitNr; /// 0 .. 63 public UInt128 Mask; /// derived from bitPosition in the constructor @@ -136,43 +136,48 @@ namespace TBF.Rig.Modbus.PumpFM.DanfossVLT : base(cfg) { pumpCfg = cfg as PumpCfg; - - modbus = TbfComponents.FindComponent(cfg.ParentName, components) as Common.Modbus; - if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); - - controlBoard = null; - foreach (var name in new string[] { "CB", "UniCB" }) - { - if ((controlBoard = TbfComponents.FindComponent(name, components) as IControlBoard) != null) - break; - } - if (controlBoard == null) throw new Exception("Cannot find a control board"); - - log.Warn(this.ToString()); } + public override void Initialize() + { + if (DebugLevel == DebugMode.Normal || DebugLevel == DebugMode.DetectedOn) + { + modbus = TbfComponents.FindComponent(pumpCfg.ParentName) as Common.Modbus; + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + + controlBoard = null; + foreach (var name in new string[] { "CB", "UniCB" }) + { + if ((controlBoard = TbfComponents.FindComponent(name) as IControlBoard) != null) + break; + } + if (controlBoard == null) throw new Exception("Cannot find a control board"); + + bitNr = pumpCfg.BitNr; + Mask = (((UInt128)1) << bitNr); + modbus.ComponentNames[pumpCfg.ModbusAddress] = Name; + + TBF.UiBridge.Bridge.SetpointChangeHandler += delegate(object sndr, TBF.UiBridge.SetpointChangeArgs args) + { + if (args.Name == Name) + { + if (args.Increase) IncreaseSetpoint(); else DecreaseSetpoint(); + } + }; + + log.FatalFormat("{0} initialized: {1}", Name, this); + } + else + { + log.FatalFormat("{0} simulated: {1}", Name, this); + } + } /// /// IDevice interface /// - public override void Initialize() - { - bitNr = pumpCfg.BitNr; - Mask = (((UInt128)1) << bitNr); - modbus.ComponentNames[pumpCfg.ModbusAddress] = Name; - - TBF.UiBridge.Bridge.SetpointChangeHandler += delegate(object sndr, TBF.UiBridge.SetpointChangeArgs args) - { - if (args.Name == Name) - { - if (args.Increase) IncreaseSetpoint(); else DecreaseSetpoint(); - } - }; - } - public void RunDeviceBefore() { - if (pumpCfg.DebugLevel == DebugMode.Normal || - pumpCfg.DebugLevel == DebugMode.DetectedOn) + if (DebugLevel == DebugMode.Normal || DebugLevel == DebugMode.DetectedOn) { if (modbus.ReceivedTelegrams[pumpCfg.ModbusAddress].Count > 0) { @@ -205,8 +210,7 @@ namespace TBF.Rig.Modbus.PumpFM.DanfossVLT this.power = powerArg; UInt16 reference = (UInt16)Math.Round(0x4000 * powerArg / 100.0); - if (pumpCfg.DebugLevel == DebugMode.Normal || - pumpCfg.DebugLevel == DebugMode.DetectedOn) + if (DebugLevel == DebugMode.Normal || DebugLevel == DebugMode.DetectedOn) { byte[] msg = new byte[13]; msg[0] = (byte)pumpCfg.ModbusAddress; @@ -242,8 +246,7 @@ namespace TBF.Rig.Modbus.PumpFM.DanfossVLT this.power = 0; UInt16 reference = 0; - if (pumpCfg.DebugLevel == DebugMode.Normal || - pumpCfg.DebugLevel == DebugMode.DetectedOn) + if (DebugLevel == DebugMode.Normal || DebugLevel == DebugMode.DetectedOn) { byte[] msg = new byte[13]; msg[0] = (byte)pumpCfg.ModbusAddress; diff --git a/TBF/Rig/Modbus/QuidoRS/QuidoRS.cs b/TBF/Rig/Modbus/QuidoRS/QuidoRS.cs index 38a8df645..7cfd13863 100644 --- a/TBF/Rig/Modbus/QuidoRS/QuidoRS.cs +++ b/TBF/Rig/Modbus/QuidoRS/QuidoRS.cs @@ -49,14 +49,21 @@ namespace TBF.Rig.Modbus.QuidoRS public override void Initialize() { - watchdogBitMask = (ushort)(quidoRSCfg.WatchdogEnabled ? (1 << quidoRSCfg.WatchdogBitNr) : 0); + if (DebugLevel == DebugMode.Normal) + { + watchdogBitMask = (ushort)(quidoRSCfg.WatchdogEnabled ? (1 << quidoRSCfg.WatchdogBitNr) : 0); - modbus = TbfComponents.FindComponent(quidoRSCfg.ParentName) as Common.Modbus; - if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + modbus = TbfComponents.FindComponent(quidoRSCfg.ParentName) as Common.Modbus; + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); - modbus.ComponentNames[quidoRSCfg.ModbusAddress] = Name; - if (quidoRSCfg.ReadInputs) ticketNumber = modbus.RegisterForPolling(); - log.FatalFormat("Device initialized: {0}", this); + modbus.ComponentNames[quidoRSCfg.ModbusAddress] = Name; + if (quidoRSCfg.ReadInputs) ticketNumber = modbus.RegisterForPolling(); + log.FatalFormat("{0} initialized: {1}", Name, this); + } + else + { + log.FatalFormat("{0} simulated: {1}", Name, this); + } } /// @@ -64,45 +71,46 @@ namespace TBF.Rig.Modbus.QuidoRS /// public void RunDeviceBefore() { - if (quidoRSCfg.DebugLevel == DebugMode.Simulate) return; - - lock (this) + if (DebugLevel == DebugMode.Normal) { - if (watchdogBitMask != 0 && (DateTime.Now - lastOutputsChange) > new TimeSpan(0, 0, 0, 0, 3000)) /// Toggle after 1.5 sec (resulting in toggle period 2 sec) + lock (this) { - currentOutputs = (UInt16)((Int32)currentOutputs ^ (Int32)watchdogBitMask); - SendOutputs(currentOutputs); - } - } - - if (modbus.ReceivedTelegrams[quidoRSCfg.ModbusAddress].Count > 0) - { - byte[] telegram = modbus.ReceivedTelegrams[quidoRSCfg.ModbusAddress].Dequeue(); - - if ((telegram.Length >= 8) && (telegram[1] == 0x11) && (telegram[2] == telegram.Length - 5)) - { - int msgLen = telegram.Length - 7; - byte modbusAddress = telegram[3]; - string msg = Encoding.ASCII.GetString(telegram, 5, msgLen); - string s = string.Format("Device detected: Address = {0}, Message = {1}", modbusAddress, msg); - Debug.WriteLine(s); - log.Warn(s); + if (watchdogBitMask != 0 && (DateTime.Now - lastOutputsChange) > new TimeSpan(0, 0, 0, 0, 3000)) /// Toggle after 1.5 sec (resulting in toggle period 2 sec) + { + currentOutputs = (UInt16)((Int32)currentOutputs ^ (Int32)watchdogBitMask); + SendOutputs(currentOutputs); + } } - if ((telegram.Length == 6) && (telegram[1] == (byte)Function.ReadSingleInput) && (telegram[2] == telegram.Length - 5)) + if (modbus.ReceivedTelegrams[quidoRSCfg.ModbusAddress].Count > 0) { - byte inputs = telegram[3]; - Inputs = (UInt32)inputs; - string s = string.Format("Inputs = 0x{0}", inputs.ToString("X2")); - Debug.WriteLine(s); - log.Warn(s); + byte[] telegram = modbus.ReceivedTelegrams[quidoRSCfg.ModbusAddress].Dequeue(); + + if ((telegram.Length >= 8) && (telegram[1] == 0x11) && (telegram[2] == telegram.Length - 5)) + { + int msgLen = telegram.Length - 7; + byte modbusAddress = telegram[3]; + string msg = Encoding.ASCII.GetString(telegram, 5, msgLen); + string s = string.Format("Device detected: Address = {0}, Message = {1}", modbusAddress, msg); + Debug.WriteLine(s); + log.Warn(s); + } + + if ((telegram.Length == 6) && (telegram[1] == (byte)Function.ReadSingleInput) && (telegram[2] == telegram.Length - 5)) + { + byte inputs = telegram[3]; + Inputs = (UInt32)inputs; + string s = string.Format("Inputs = 0x{0}", inputs.ToString("X2")); + Debug.WriteLine(s); + log.Warn(s); + } } } } public void RunDeviceAfter() { - if (quidoRSCfg.ReadInputs && modbus.IsMyTurn(ticketNumber)) + if (DebugLevel == DebugMode.Normal && quidoRSCfg.ReadInputs && modbus.IsMyTurn(ticketNumber)) { const ushort Address = 0; /// Discrete inputs modbus.SendMessage((byte)quidoRSCfg.ModbusAddress, (byte)Function.ReadSingleInput, Address, 2, Name); @@ -171,31 +179,34 @@ namespace TBF.Rig.Modbus.QuidoRS private void SendOutputs(UInt32 outputs) { - byte addr = quidoRSCfg.ModbusAddress; - byte cmd = (byte)Function.ForceMultipleCoils; - byte dataLo = (byte)(outputs & 0xFF); - byte data2 = (byte)(outputs >> 8); - byte data3 = (byte)(outputs >> 16); - byte dataHi = (byte)(outputs >> 24); + if (DebugLevel == DebugMode.Normal) + { + byte addr = quidoRSCfg.ModbusAddress; + byte cmd = (byte)Function.ForceMultipleCoils; + byte dataLo = (byte)(outputs & 0xFF); + byte data2 = (byte)(outputs >> 8); + byte data3 = (byte)(outputs >> 16); + byte dataHi = (byte)(outputs >> 24); - if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_4_4) - { - modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 4, 1, dataLo, 0, 0 }, Name); - } - else if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_8_8) - { - modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 8, 1, dataLo, 0, 0 }, Name); - } - else if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_2_16) - { - modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 16, 2, dataLo, data2, 0, 0 }, Name); - } - else if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_2_32) - { - modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 32, 4, dataLo, data2, data3, dataHi, 0, 0 }, Name); - } + if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_4_4) + { + modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 4, 1, dataLo, 0, 0 }, Name); + } + else if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_8_8) + { + modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 8, 1, dataLo, 0, 0 }, Name); + } + else if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_2_16) + { + modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 16, 2, dataLo, data2, 0, 0 }, Name); + } + else if (quidoRSCfg.Variant == QuidoVariant.QuidoRS_2_32) + { + modbus.SendMessage(new byte[] { addr, cmd, 0, 0, 0, 32, 4, dataLo, data2, data3, dataHi, 0, 0 }, Name); + } - lastOutputsChange = DateTime.Now; + lastOutputsChange = DateTime.Now; + } } diff --git a/TBF/Rig/Modbus/TempMeter/Groch/TempMeter.cs b/TBF/Rig/Modbus/TempMeter/Groch/TempMeter.cs index 665723287..4545bc2aa 100644 --- a/TBF/Rig/Modbus/TempMeter/Groch/TempMeter.cs +++ b/TBF/Rig/Modbus/TempMeter/Groch/TempMeter.cs @@ -55,16 +55,23 @@ namespace TBF.Rig.Modbus.TempMeter.Groch public override void Initialize() { - /// Only TempMeter with Channel == 0 communicates via the parent Modbus component - if (Channel == 0) + if (DebugLevel == DebugMode.Normal) { - modbus = TbfComponents.FindComponent(tempMtrCfg.ParentName) as Common.Modbus; - if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); + /// Only TempMeter with Channel == 0 communicates via the parent Modbus component + if (Channel == 0) + { + modbus = TbfComponents.FindComponent(tempMtrCfg.ParentName) as Common.Modbus; + if (modbus == null) throw new Exception("Cannot find " + Name + " parent"); - modbus.ComponentNames[0] = Name; - ticketNumber = modbus.RegisterForPolling(); + modbus.ComponentNames[0] = Name; + ticketNumber = modbus.RegisterForPolling(); + } + log.FatalFormat("{0} initialized: {1}", Name, this); + } + else + { + log.FatalFormat("{0} simulated: {1}", Name, this); } - log.FatalFormat("{0} initialized: {1}", Name, this); } @@ -101,7 +108,7 @@ namespace TBF.Rig.Modbus.TempMeter.Groch public void RunDeviceBefore() { - if (Channel == 0) + if (DebugLevel == DebugMode.Normal && Channel == 0) { /// Only TempMeter with Channel == 0 communicates via the parent Modbus component /// @@ -145,10 +152,7 @@ namespace TBF.Rig.Modbus.TempMeter.Groch { /// Only TempMeter with Channel == 0 communicates via the parent Modbus component - if (Channel == 0 && - tempMtrCfg.DebugLevel != DebugMode.Simulate && - tempMtrCfg.DebugLevel != DebugMode.FailureDuringOperation && - modbus.IsMyTurn(ticketNumber)) + if (DebugLevel == DebugMode.Normal && Channel == 0 && modbus.IsMyTurn(ticketNumber)) { modbus.SendMessageGroch(new byte[] { 0x20, 0x20, 0x20, 0x20, 0x10, 2, 1, 3, 6, 0x16 }, Name); } diff --git a/TBF/Rig/Modbus/TempMeter/Meret/TempMeterCfg.cs b/TBF/Rig/Modbus/TempMeter/Meret/TempMeterCfg.cs index 3b048241e..e3d9d2b3d 100644 --- a/TBF/Rig/Modbus/TempMeter/Meret/TempMeterCfg.cs +++ b/TBF/Rig/Modbus/TempMeter/Meret/TempMeterCfg.cs @@ -123,8 +123,7 @@ namespace TBF.Rig.Modbus.TempMeter.Meret case 4: return MsrdValLimLo.ToString(); case 5: return MsrdValLimHi.ToString(); default: - return string.Format("{0}(1) {2}[{3},{4}] addr={5}", Name, - (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), Shape, X, Y, ModbusAddress); + return string.Format("{0}({1}) address={2}", Name, string.IsNullOrEmpty(ParentName) ? "-" : ParentName, ModbusAddress); } }