From 63b4004d8584afa6b008222b6c92e6930575b5a0 Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Fri, 17 Apr 2015 15:05:44 +0200 Subject: [PATCH] Comet Ambient modbus protocol implemented. --- .../BenchControl/Ambient/Comet/Ambient.cs | 86 +++++++++---------- .../BenchControl/Ambient/Greco/Ambient.cs | 6 +- .../BenchControl/Danfoss/VLT2800/Pump.cs | 6 +- 3 files changed, 45 insertions(+), 53 deletions(-) diff --git a/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs b/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs index 178e47fe5..21607f905 100644 --- a/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs +++ b/TestBenchFramework/BenchControl/Ambient/Comet/Ambient.cs @@ -25,7 +25,6 @@ namespace TBF.BenchControl.Ambient.Comet /// Private fields SerialPort serialPort; - StringBuilder measurementBuilder; /// The state of the measurement MsrmntState msrmntState; @@ -69,7 +68,6 @@ namespace TBF.BenchControl.Ambient.Comet serialPort = new SerialPort(comPortName, ambientCfg.BaudRate, ambientCfg.Parity, ambientCfg.DataBits, ambientCfg.StopBits); serialPort.Handshake = ambientCfg.Handshake; serialPort.Open(); - measurementBuilder = new StringBuilder(40); msrmntState = MsrmntState.Busy; log.FatalFormat("Successfully initialized device {0}", ToString()); @@ -84,60 +82,56 @@ namespace TBF.BenchControl.Ambient.Comet return; } - measurementBuilder.Append(serialPort.ReadExisting()); - int len = measurementBuilder.Length; + int receivedBytes = serialPort.BytesToRead; - /// - /// 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) + if (receivedBytes >= 13) { - string measurement = measurementBuilder.ToString(); - measurementBuilder.Clear(); + byte[] byteArr = new byte[receivedBytes]; + for (int i = 0; i < receivedBytes; i++) byteArr[i] = (byte)serialPort.ReadByte(); + log.Debug( Telegram.LogTelegram("Received ", byteArr)); - 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; + 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; - log.InfoFormat("Msrmnt OK: time = {0}, temp={1}, humi={2}, pres={3}", msrmntTimeStamp, t, h, p); - } - else - { - log.Warn("Invalid string received: " + measurement); - } + value = (int)byteArr[5] * 256 + (int)byteArr[6]; + humidity = (float)value / 10.0f; + + 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")); + } } } /// Run this device public void RunDeviceAfter() { - } + /// 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; + + /// 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); + } + } /// Stop this device public void StopDevice() diff --git a/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs b/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs index 2f2f44671..858c4f1f7 100644 --- a/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs +++ b/TestBenchFramework/BenchControl/Ambient/Greco/Ambient.cs @@ -59,7 +59,7 @@ namespace TBF.BenchControl.Ambient.Greco { temperature = 20.0f; humidity = 40.0f; - pressure = 1.0f; + pressure = 1000.0f; msrmntTimeStamp = StateMachine.Time; msrmntState = MsrmntState.Valid; return; @@ -125,8 +125,8 @@ namespace TBF.BenchControl.Ambient.Greco msrmntTimeStamp = StateMachine.Time; msrmntState = MsrmntState.Valid; - log.InfoFormat("Msrmnt OK: time = {0}, temp={1}, humi={2}, pres={3}", msrmntTimeStamp, t, h, p); - } + 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); diff --git a/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs b/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs index f56f04425..973d7df6f 100644 --- a/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs +++ b/TestBenchFramework/BenchControl/Danfoss/VLT2800/Pump.cs @@ -64,10 +64,8 @@ namespace TBF.BenchControl.Danfoss.VLT2800 PresetSingleRegister = 0x06, PresetMultipleRegisters = 0x10, } - /// - /// Ambient temperature / humidity / pressure meter 'Greco' connected via serial interface (RS232) - /// Connection settings: 19200 Bd 8-bits No-parity 1-stop-bit Flow control: none or hardware. - /// + + public class Pump : ComponentBase, IDevice, IOperation, GenericDevices.IPumpFM, GenericDevices.IValve { private static readonly ILog log = LogManager.GetLogger(typeof(Pump));