Modbus: Data receive improved, Meret.TempMeter, Meret.PressureMeter, Danfoss.VLT added, QuidoRS modified.
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user