From f203c56e8b0463484ea1060f7ea72092f8b23d08 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Tue, 22 Sep 2015 11:28:48 +0200 Subject: [PATCH] Program is protected against Ambient sensor serial port failure, version 1.5.120. --- .../BenchControl/Ambient/Comet/Ambient.cs | 113 +++++++++++------- .../BenchControl/Ambient/Greco/Ambient.cs | 99 ++++++++------- .../WaterMeters/iPerl/WaterMeter.cs | 3 +- TestBenchFramework/Properties/AssemblyInfo.cs | 4 +- 4 files changed, 133 insertions(+), 86 deletions(-) diff --git a/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs b/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs index 943212a86..5aac48f86 100644 --- a/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs +++ b/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs @@ -80,63 +80,96 @@ namespace TBF.BenchControl.Ambient.Comet /// Run this device public void RunDeviceBefore() { - if (ambientCfg.DebugLevel == Entities.DebugMode.Simulate) + if (ambientCfg.DebugLevel == Entities.DebugMode.Simulate || + ambientCfg.DebugLevel == Entities.DebugMode.FailureDuringOperation) { msrmntTimeStamp = StateMachine.Time; return; } - int receivedBytes = serialPort.BytesToRead; - - if (receivedBytes >= 13) + try { - byte[] byteArr = new byte[receivedBytes]; - for (int i = 0; i < receivedBytes; i++) byteArr[i] = (byte)serialPort.ReadByte(); - log.Debug( Telegram.LogTelegram("Received ", byteArr)); + int receivedBytes = serialPort.BytesToRead; - if ((receivedBytes == 13) && (byteArr[0] == 1) && (byteArr[1] == 3) && (byteArr[2] == 8) && Telegram.VerifyTelegramCRC(byteArr)) - { - int value = (int)byteArr[3] * 256 + (int)byteArr[4]; - temperature = (float)value / 10.0f; + if (receivedBytes >= 13) + { + byte[] byteArr = new byte[receivedBytes]; + for (int i = 0; i < receivedBytes; i++) byteArr[i] = (byte)serialPort.ReadByte(); + log.Debug(Telegram.LogTelegram("Received ", byteArr)); - value = (int)byteArr[5] * 256 + (int)byteArr[6]; - humidity = (float)value / 10.0f; + if ((receivedBytes == 13) && (byteArr[0] == 1) && (byteArr[1] == 3) && (byteArr[2] == 8) && Telegram.VerifyTelegramCRC(byteArr)) + { + int value = (int)byteArr[3] * 256 + (int)byteArr[4]; + temperature = (float)value / 10.0f; - value = (int)byteArr[9] * 256 + (int)byteArr[10]; - pressure = (float)value / 10.0f; + value = (int)byteArr[5] * 256 + (int)byteArr[6]; + humidity = (float)value / 10.0f; - msrmntTimeStamp = StateMachine.Time; - msrmntState = MsrmntState.Valid; - log.InfoFormat("Ambient: temperature = {0} C, humidity = {1} %, pressure = {2} hPa", temperature.ToString("F1"), humidity.ToString("F1"), pressure.ToString("F0")); - } + value = (int)byteArr[9] * 256 + (int)byteArr[10]; + pressure = (float)value / 10.0f; + + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + log.InfoFormat("Ambient: temperature = {0} C, humidity = {1} %, pressure = {2} hPa", temperature.ToString("F1"), humidity.ToString("F1"), pressure.ToString("F0")); + } + } } - } + catch (Exception e) + { + DebugLevel = Entities.DebugMode.FailureDuringOperation; + serialPort = null; + + log.FatalFormat("Ambient: Serail port read failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } + } /// Run this device public void RunDeviceAfter() { - if (ambientCfg.DebugLevel == Entities.DebugMode.Simulate) return; - - /// Each 10 seconds - if ((StateMachine.Time % 10) == 0) - { - /// Read four registers: 0x31, 0x32, 0x33, 0x34 - UInt16 regAddr = 0x0030; /// register addr. = 0x31 (Modbus!) - UInt16 count = 4; + if (ambientCfg.DebugLevel == Entities.DebugMode.Simulate || + ambientCfg.DebugLevel == Entities.DebugMode.FailureDuringOperation) + { + return; + } - /// Prepare data to be sent - byte[] msg = new byte[8]; - msg[0] = 1; /// (byte)ambientCfg.BusAddress; - msg[1] = 3; /// CMD = Read registers - msg[2] = (byte)(regAddr >> 8); /// Control Word Hi - msg[3] = (byte)(regAddr & 0xFF); /// Control Word Lo - msg[4] = (byte)(count >> 8); /// Serial Com Reference Hi - msg[5] = (byte)(count & 0xFF); /// Serial Com Reference Lo - Telegram.UpdateTelegramCRC(msg); + try + { + /// Each 10 seconds + if ((StateMachine.Time % 10) == 0) + { + /// Read four registers: 0x31, 0x32, 0x33, 0x34 + UInt16 regAddr = 0x0030; /// register addr. = 0x31 (Modbus!) + UInt16 count = 4; - log.Debug(Telegram.LogTelegram("Sending ", msg)); - serialPort.Write(msg, 0, msg.Length); - } + /// Prepare data to be sent + byte[] msg = new byte[8]; + msg[0] = 1; /// (byte)ambientCfg.BusAddress; + msg[1] = 3; /// CMD = Read registers + msg[2] = (byte)(regAddr >> 8); /// Control Word Hi + msg[3] = (byte)(regAddr & 0xFF); /// Control Word Lo + msg[4] = (byte)(count >> 8); /// Serial Com Reference Hi + msg[5] = (byte)(count & 0xFF); /// Serial Com Reference Lo + Telegram.UpdateTelegramCRC(msg); + + log.Debug(Telegram.LogTelegram("Sending ", msg)); + serialPort.Write(msg, 0, msg.Length); + } + } + catch (Exception e) + { + DebugLevel = Entities.DebugMode.FailureDuringOperation; + serialPort = null; + + log.FatalFormat("Ambient: Serail port read failure : {0}", e.Message); + if (e.InnerException != null) + { + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); + } + } } /// Stop this device diff --git a/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs b/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs index 2d6dfbe3a..f3270b836 100644 --- a/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs +++ b/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs @@ -82,58 +82,73 @@ namespace TBF.BenchControl.Ambient.Greco /// Run this device public void RunDeviceBefore() { - if (ambientCfg.DebugLevel == Entities.DebugMode.Simulate) + if (ambientCfg.DebugLevel == Entities.DebugMode.Simulate || + ambientCfg.DebugLevel == Entities.DebugMode.FailureDuringOperation) { msrmntTimeStamp = StateMachine.Time; return; } - measurementBuilder.Append(serialPort.ReadExisting()); - int len = measurementBuilder.Length; - - /// - /// Device sends each 20 sec one line of ASCII text with data in the following format: - /// (temp) 6 characters, two decimal digits, with leading spaces - /// TAB 1 character - /// (humi) 6 characters, two decimal digits, with leading spaces - /// TAB 1 character - /// (pressure) 6 characters, one decimal digits, with leading spaces is LT 1000 - /// CR + LF 2 characters - /// Example: - /// 23.42 38.08 1061.1 - /// 23.39 38.04 1060.8 - /// 23.39 38.08 1061.4 - /// - if (len >= 22) + try { - string measurement = measurementBuilder.ToString(); - measurementBuilder.Clear(); + measurementBuilder.Append(serialPort.ReadExisting()); + int len = measurementBuilder.Length; - float t = 0; - float h = 0; - float p = 0; - if (float.TryParse(measurement.Substring(len - 22, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, - CultureInfo.InvariantCulture, out t) && - measurement[len - 16] == '\t' && - float.TryParse(measurement.Substring(len - 15, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, - CultureInfo.InvariantCulture, out h) && - measurement[len - 9] == '\t' && - float.TryParse(measurement.Substring(len - 8, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, - CultureInfo.InvariantCulture, out p) && - measurement[len - 2] == '\r' && - measurement[len - 1] == '\n') + /// + /// Device sends each 20 sec one line of ASCII text with data in the following format: + /// (temp) 6 characters, two decimal digits, with leading spaces + /// TAB 1 character + /// (humi) 6 characters, two decimal digits, with leading spaces + /// TAB 1 character + /// (pressure) 6 characters, one decimal digits, with leading spaces is LT 1000 + /// CR + LF 2 characters + /// Example: + /// 23.42 38.08 1061.1 + /// 23.39 38.04 1060.8 + /// 23.39 38.08 1061.4 + /// + if (len >= 22) { - temperature = t; - humidity = h; - pressure = p; - msrmntTimeStamp = StateMachine.Time; - msrmntState = MsrmntState.Valid; + string measurement = measurementBuilder.ToString(); + measurementBuilder.Clear(); - log.InfoFormat("Ambient: temperature = {0} C, humidity = {1} %, pressure = {2} hPa", temperature.ToString("F1"), humidity.ToString("F1"), pressure.ToString("F0")); - } - else + float t = 0; + float h = 0; + float p = 0; + if (float.TryParse(measurement.Substring(len - 22, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out t) && + measurement[len - 16] == '\t' && + float.TryParse(measurement.Substring(len - 15, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out h) && + measurement[len - 9] == '\t' && + float.TryParse(measurement.Substring(len - 8, 6), NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingWhite, + CultureInfo.InvariantCulture, out p) && + measurement[len - 2] == '\r' && + measurement[len - 1] == '\n') + { + temperature = t; + humidity = h; + pressure = p; + msrmntTimeStamp = StateMachine.Time; + msrmntState = MsrmntState.Valid; + + log.InfoFormat("Ambient: temperature = {0} C, humidity = {1} %, pressure = {2} hPa", temperature.ToString("F1"), humidity.ToString("F1"), pressure.ToString("F0")); + } + else + { + log.Warn("Invalid string received: " + measurement); + } + } + } + catch (Exception e) + { + DebugLevel = Entities.DebugMode.FailureDuringOperation; + serialPort = null; + + log.FatalFormat("Ambient: Serail port read failure : {0}", e.Message); + if (e.InnerException != null) { - log.Warn("Invalid string received: " + measurement); + log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); } } } diff --git a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs index d77430e6f..359693bac 100644 --- a/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs +++ b/TestBenchFramework/BenchControl/WaterMeters/iPerl/WaterMeter.cs @@ -313,12 +313,11 @@ namespace TBF.BenchControl.WaterMeters.iPerl { DebugLevel = Entities.DebugMode.FailureDuringOperation; - log.FatalFormat("Redrawing results failed : {0}", e.Message); + log.FatalFormat("Opto-data serial port failure : {0}", e.Message); if (e.InnerException != null) { log.FatalFormat("InnerMessage : {0}", e.InnerException.Message); } - log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace); } } else if (DebugLevel == Entities.DebugMode.FailureDuringOperation) diff --git a/TestBenchFramework/Properties/AssemblyInfo.cs b/TestBenchFramework/Properties/AssemblyInfo.cs index 1e206b9fd..73a02ca08 100644 --- a/TestBenchFramework/Properties/AssemblyInfo.cs +++ b/TestBenchFramework/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("1.5.119.1")] -[assembly: AssemblyFileVersion("1.5.119.1")] +[assembly: AssemblyVersion("1.5.120.1")] +[assembly: AssemblyFileVersion("1.5.120.1")]