Modbus: Data receive improved, Meret.TempMeter, Meret.PressureMeter, Danfoss.VLT added, QuidoRS modified.

This commit is contained in:
Milan Hanajik
2020-05-21 18:32:21 +02:00
parent 767796662e
commit c007bca797
34 changed files with 1686 additions and 224 deletions
+37 -23
View File
@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using Config.Entities;
@@ -23,6 +24,8 @@ namespace TBF.BenchControl.Modbus.Common
private static readonly ILog log = LogManager.GetLogger(typeof(Modbus));
public override string ToString() { return string.Format("Modbus({0})", Cfg.ToString(1)); }
const int MinTelegramLen = 4;
private readonly ModbusCfg modbusCommonCfg;
/// Private fields
@@ -158,32 +161,43 @@ namespace TBF.BenchControl.Modbus.Common
/// <summary>Run this device</summary>
public void RunDeviceBefore()
{
if (serialPort == null) return;
/// Create 'dataToProcess' buffer with all received bytes
int nrBytes;
if (serialPort == null || (nrBytes = serialPort.BytesToRead) < MinTelegramLen) return;
byte[] dataToProcess = new byte[nrBytes];
serialPort.Read(dataToProcess, 0, nrBytes);
int nrBytes = serialPort.BytesToRead;
if (nrBytes > 0)
{
byte[] buffer = new byte[nrBytes];
serialPort.Read(buffer, 0, nrBytes);
int deviceAddress = (nrBytes >= 1) ? buffer[0] : 0;
int function = (nrBytes >= 2) ? buffer[1] : 0;
if ((nrBytes >= 4) && Telegram.VerifyTelegramCRC(buffer))
{
receivedTelegrams[deviceAddress].Enqueue(buffer);
string s = string.Format("{0} - {1} address={2} count={3}", Name, Telegram.LogTelegram("Telegram received: ", buffer), deviceAddress, receivedTelegrams[deviceAddress].Count);
Debug.WriteLine(s);
log.Debug(s);
}
else
while (dataToProcess.Length >= MinTelegramLen)
{
for (int candidateLen = MinTelegramLen; candidateLen <= dataToProcess.Length; candidateLen++)
{
string s = Telegram.LogTelegram(string.Format("{0} - Invalid data received ", Name), buffer);
Debug.WriteLine(s);
log.Debug(s);
if (Telegram.VerifyTelegramCRC(dataToProcess, candidateLen))
{
/// A valid telegram found in dataToProcess buffer
/// Split data in dataToProcess buffer into the verified telegram and newly created dataToProcess
byte[] receivedTelegram = dataToProcess.Take<byte>(candidateLen).ToArray<byte>();
dataToProcess = dataToProcess.Skip<byte>(candidateLen).ToArray<byte>();
/// Enqueue
int deviceAddress = receivedTelegram[0];
receivedTelegrams[deviceAddress].Enqueue(receivedTelegram);
string s = string.Format("{0} - {1} queue size={2}", Name, Telegram.LogTelegram("Received message ", receivedTelegram), receivedTelegrams[deviceAddress].Count);
Debug.WriteLine(s);
log.Debug(s);
break; /// Quit for loop
}
else if (candidateLen == dataToProcess.Length)
{
/// All bytes considered but no valid telegram found
string s = Telegram.LogTelegram(string.Format("{0} - Invalid data received ", Name), dataToProcess);
Debug.WriteLine(s);
log.Debug(s);
return;
}
}
}
}
}
/// <summary>Run this device</summary>