From d8b84f4b5c047257df203fd2fbcae29b1591a000 Mon Sep 17 00:00:00 2001 From: luosheng Date: Tue, 21 Mar 2023 22:02:51 +0800 Subject: [PATCH] Fix a critial bug in serial port receive --- .../ModbusAsciiInTcpProtocolLinker.cs | 2 +- .../ModbusAsciiInUdpProtocolLinker.cs | 2 +- .../ModbusAsciiProtocolLinker.cs | 2 +- .../ModbusRtuInTcpProtocolLinker.cs | 6 +- .../ModbusRtuInUdpProtocolLinker.cs | 6 +- .../ModbusRtuProtocolLinker.cs | 2 +- .../ModbusTcpProtocolLinker.cs | 6 +- .../ModbusUdpProtocolLinker.cs | 6 +- .../SiemensPpiProtocolLinker.cs | 5 +- .../Modbus.Net/Connector/ComConnector.cs | 58 ++++++++++--------- .../Modbus.Net/Controller/BaseController.cs | 31 +++++++--- .../Controller/DuplicateWithCount.cs | 44 ++++---------- .../Modbus.Net/Controller/FifoController.cs | 7 +-- .../Modbus.Net/Controller/MatchController.cs | 5 +- .../Controller/MatchDirectlySendController.cs | 4 +- Samples/MachineJob/Program.cs | 2 +- .../MachineJob/appsettings.Development.json | 7 +-- 17 files changed, 103 insertions(+), 92 deletions(-) diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs index 4ada93c..9796b85 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs @@ -24,7 +24,7 @@ namespace Modbus.Net.Modbus public ModbusAsciiInTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { var ans = 0; for (int i = 9; i < 13; i++) { ans = ans * 10 + (content[i] - 48); } return ans; }, waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs index 539bd5a..1a12d8c 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs @@ -24,7 +24,7 @@ namespace Modbus.Net.Modbus public ModbusAsciiInUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { var ans = 0; for (int i = 9; i < 13; i++) { ans = ans * 10 + (content[i] - 48); } return ans; }, waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs index cc61e5d..8bb9f6c 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs @@ -16,7 +16,7 @@ namespace Modbus.Net.Modbus public ModbusAsciiProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int, int)>[] { new List<(int, int)> { (1, 1), (2, 2) }, new List<(int, int)> { (3, 3), (4, 4) } }, int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int, int)>[] { new List<(int, int)> { (1, 1), (2, 2) }, new List<(int, int)> { (3, 3), (4, 4) } }, int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), lengthCalc: content => { var ans = 0; for (int i = 9; i < 13; i++) { ans = ans * 10 + (content[i] - 48); } return ans; }, waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs index 6edbb94..39206eb 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs @@ -1,4 +1,6 @@ -namespace Modbus.Net.Modbus +using System.Collections.Generic; + +namespace Modbus.Net.Modbus { /// /// Modbus/Rtu协议连接器Tcp透传 @@ -22,7 +24,7 @@ public ModbusRtuInTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 2 }, 5), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs index 6ae0bac..0300faa 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs @@ -1,4 +1,6 @@ -namespace Modbus.Net.Modbus +using System.Collections.Generic; + +namespace Modbus.Net.Modbus { /// /// Modbus/Rtu协议连接器Udp透传 @@ -22,7 +24,7 @@ public ModbusRtuInUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 2 }, 5), waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs index fd52b27..95a315f 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs @@ -15,7 +15,7 @@ namespace Modbus.Net.Modbus public ModbusRtuProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0) }, new List<(int, int)> { (1, 1) } }, int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new MatchController(new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0) }, new List<(int, int)> { (1, 1) } }, int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 2 }, 5), waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs index d788b28..72c408e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs @@ -1,4 +1,6 @@ -namespace Modbus.Net.Modbus +using System.Collections.Generic; + +namespace Modbus.Net.Modbus { /// /// Modbus/Tcp协议连接器 @@ -21,7 +23,7 @@ /// 端口 public ModbusTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 4, 5 }, 6), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs index 077cec6..8d19711 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs @@ -1,4 +1,6 @@ -namespace Modbus.Net.Modbus +using System.Collections.Generic; + +namespace Modbus.Net.Modbus { /// /// Modbus/Udp协议连接器 @@ -21,7 +23,7 @@ /// 端口 public ModbusUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 4, 5 }, 6), waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs index c7bfcb4..b654ada 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; @@ -17,7 +18,7 @@ namespace Modbus.Net.Siemens public SiemensPpiProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null)); + ((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 1 }, 6), waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null)); } /// diff --git a/Modbus.Net/Modbus.Net/Connector/ComConnector.cs b/Modbus.Net/Modbus.Net/Connector/ComConnector.cs index d752069..fc79a17 100644 --- a/Modbus.Net/Modbus.Net/Connector/ComConnector.cs +++ b/Modbus.Net/Modbus.Net/Connector/ComConnector.cs @@ -83,9 +83,9 @@ namespace Modbus.Net private bool _taskCancel = false; /// - /// Dispose是否执行 + /// 缓冲的字节流 /// - private bool m_disposed; + private List cachedBytes = new List(); /// /// 构造器 @@ -251,32 +251,28 @@ namespace Modbus.Net /// protected virtual void Dispose(bool disposing) { - if (!m_disposed) + if (disposing) { - if (disposing) + // Release managed resources + Controller.SendStop(); + } + // Release unmanaged resources + if (SerialPort != null) + { + if (Linkers.Values.Count(p => p == _com) <= 1) { - // Release managed resources - Controller.SendStop(); - } - // Release unmanaged resources - if (SerialPort != null) - { - if (Linkers.Values.Count(p => p == _com) <= 1) + if (SerialPort.IsOpen) { - if (SerialPort.IsOpen) - { - SerialPort.Close(); - } - SerialPort.Dispose(); - logger.LogInformation("Com interface {Com} Disposed", _com); - Connectors[_com] = null; - Connectors.Remove(_com); - ReceiveMsgThreadStop(); + SerialPort.Close(); } - Linkers.Remove(_slave); - logger.LogInformation("Com connector {ConnectionToken} Removed", ConnectionToken); + SerialPort.Dispose(); + logger.LogInformation("Com interface {Com} Disposed", _com); + Connectors[_com] = null; + Connectors.Remove(_com); + ReceiveMsgThreadStop(); } - m_disposed = true; + Linkers.Remove(_slave); + logger.LogInformation("Com connector {ConnectionToken} Removed", ConnectionToken); } } @@ -484,22 +480,32 @@ namespace Modbus.Net { Thread.Sleep(100); var returnBytes = ReadMsg(); + if (returnBytes != null) { logger.LogDebug("Com client {ConnectionToken} receive msg length: {Length}", ConnectionToken, returnBytes.Length); logger.LogDebug( - $"Com client {ConnectionToken} receive msg: {String.Concat(returnBytes.Select(p => " " + p.ToString("X2")))}"); + $"Com client {ConnectionToken} receive msg: {string.Concat(returnBytes.Select(p => " " + p.ToString("X2")))}"); - var isMessageConfirmed = Controller.ConfirmMessage(returnBytes); + cachedBytes.AddRange(returnBytes); + var isMessageConfirmed = Controller.ConfirmMessage(cachedBytes.ToArray()); foreach (var confirmed in isMessageConfirmed) { if (confirmed.Item2 == false) { //主动传输事件 } + cachedBytes.RemoveRange(0, confirmed.Item1.Length); + } + if (isMessageConfirmed.Count > 0 && cachedBytes.Count > 0) + { + logger.LogError("Com client {ConnectionToken} cached msg error: {Length}", ConnectionToken, + cachedBytes.Count); + logger.LogError( + $"Com client {ConnectionToken} cached msg: {string.Concat(cachedBytes.Select(p => " " + p.ToString("X2")))}"); + cachedBytes.Clear(); } - RefreshReceiveCount(); } } diff --git a/Modbus.Net/Modbus.Net/Controller/BaseController.cs b/Modbus.Net/Modbus.Net/Controller/BaseController.cs index 6284192..155c18b 100644 --- a/Modbus.Net/Modbus.Net/Controller/BaseController.cs +++ b/Modbus.Net/Modbus.Net/Controller/BaseController.cs @@ -24,16 +24,16 @@ namespace Modbus.Net /// /// зλ /// - protected Func> DuplicateFunc { get; } + protected Func LengthCalc { get; } /// /// /// - /// зֺ - protected BaseController(Func> duplicateFunc = null) + /// ȼ㺯 + protected BaseController(Func lengthCalc = null) { WaitingMessages = new List(); - DuplicateFunc = duplicateFunc; + LengthCalc = lengthCalc; } /// @@ -107,8 +107,22 @@ namespace Modbus.Net public ICollection<(byte[], bool)> ConfirmMessage(byte[] receiveMessage) { var ans = new List<(byte[], bool)>(); - var duplicatedMessages = DuplicateFunc?.Invoke(receiveMessage); - duplicatedMessages = duplicatedMessages ?? new List { receiveMessage }; + byte[] receiveMessageCopy = new byte[receiveMessage.Length]; + Array.Copy(receiveMessage, receiveMessageCopy, receiveMessage.Length); + var length = LengthCalc?.Invoke(receiveMessageCopy); + List duplicatedMessages; + if (length == null) return ans; + else + { + duplicatedMessages = new List(); + while (receiveMessageCopy.Length >= length) + { + duplicatedMessages.Add(receiveMessageCopy.Take(length.Value).ToArray()); + receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessage.Length - length.Value).ToArray(); + length = LengthCalc?.Invoke(receiveMessageCopy); + if (length == -1) break; + } + } foreach (var message in duplicatedMessages) { var def = GetMessageFromWaitingList(message); @@ -122,7 +136,10 @@ namespace Modbus.Net def.ReceiveMutex.Set(); ans.Add((message, true)); } - ans.Add((message, false)); + else + { + ans.Add((message, false)); + } } return ans; } diff --git a/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs b/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs index 8050aa3..f41f9ac 100644 --- a/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs +++ b/Modbus.Net/Modbus.Net/Controller/DuplicateWithCount.cs @@ -9,52 +9,32 @@ namespace Modbus.Net public static class DuplicateWithCount { /// - /// 切分包 + /// 计算切分包的长度 /// /// 收到的报文信息 /// 收到的断包长度查询位置 - /// 除掉长度查询信息外其它报文的长度 + /// 除指示的长度外其它位置的长度 /// 切分后的报文信息 - private static ICollection DuplicateMessages(byte[] receiveMessage, ICollection packageCountPositions, int otherCount) + private static int CalculateLength(byte[] receiveMessage, ICollection packageCountPositions, int otherCount) { - if (packageCountPositions == null) - return new List { receiveMessage }; - var ans = new List(); - var pos = 0; - while (pos < receiveMessage.Length) + var ans = 0; + foreach (var position in packageCountPositions) { - try - { - var length = 0; - foreach (var countPos in packageCountPositions) - { - length = length * 256 + receiveMessage[pos + countPos]; - } - if (length == 0) { break; } - length += otherCount; - if (pos + length > receiveMessage.Length) break; - byte[] currentPackage = new byte[length]; - Array.Copy(receiveMessage, pos, currentPackage, 0, length); - ans.Add(currentPackage); - pos += length; - } - catch (Exception) - { - break; - } + if (position >= receiveMessage.Length) return -1; + ans = ans * 256 + receiveMessage[position]; } - return ans; + return ans + otherCount; } /// - /// 获取按照长度断包的函数 + /// 获取长度函数 /// /// 断包长度的位置信息 - /// 除掉长度查询信息外其它报文的长度 + /// 除指示的长度外其它位置的长度 /// 断包函数 - public static Func> GetDuplcateFunc(ICollection packageCountPositions, int otherCount) + public static Func GetDuplcateFunc(ICollection packageCountPositions, int otherCount) { - return receiveMessage => DuplicateMessages(receiveMessage, packageCountPositions, otherCount); + return receiveMessage => CalculateLength(receiveMessage, packageCountPositions, otherCount); } } } diff --git a/Modbus.Net/Modbus.Net/Controller/FifoController.cs b/Modbus.Net/Modbus.Net/Controller/FifoController.cs index e7c9e3a..731c753 100644 --- a/Modbus.Net/Modbus.Net/Controller/FifoController.cs +++ b/Modbus.Net/Modbus.Net/Controller/FifoController.cs @@ -1,6 +1,5 @@ using Microsoft.Extensions.Logging; using System; -using System.Collections.Generic; using System.Linq; using System.Threading; @@ -31,10 +30,10 @@ namespace Modbus.Net /// /// 间隔时间 /// 是否开启信号量 - /// 包切分函数 + /// 包切分长度函数 /// 包等待队列长度 - public FifoController(int acquireTime, bool activateSema = true, Func> duplicateFunc = null, int? waitingListMaxCount = null) - : base(duplicateFunc) + public FifoController(int acquireTime, bool activateSema = true, Func lengthCalc = null, int? waitingListMaxCount = null) + : base(lengthCalc) { _waitingListMaxCount = int.Parse(waitingListMaxCount != null ? waitingListMaxCount.ToString() : null ?? ConfigurationReader.GetValueDirect("Controller", "WaitingListCount")); if (activateSema) diff --git a/Modbus.Net/Modbus.Net/Controller/MatchController.cs b/Modbus.Net/Modbus.Net/Controller/MatchController.cs index ceb6909..01eafbd 100644 --- a/Modbus.Net/Modbus.Net/Controller/MatchController.cs +++ b/Modbus.Net/Modbus.Net/Controller/MatchController.cs @@ -20,10 +20,10 @@ namespace Modbus.Net /// 匹配字典,每个Collection代表一个匹配集合,每一个匹配集合中的数字代表需要匹配的位置,最后计算出来的数字是所有位置数字按照集合排序后叠放在一起 /// 获取间隔 /// 是否开启信号量 - /// 包切分函数 + /// 包长度计算 /// 包等待队列长度 public MatchController(ICollection<(int, int)>[] keyMatches, int acquireTime, bool activateSema = true, - Func> duplicateFunc = null, int? waitingListMaxCount = null) : base(acquireTime, activateSema, duplicateFunc, waitingListMaxCount) + Func lengthCalc = null, int? waitingListMaxCount = null) : base(acquireTime, activateSema, lengthCalc, waitingListMaxCount) { KeyMatches = keyMatches; } @@ -38,6 +38,7 @@ namespace Modbus.Net int tmpCount = 0, tmpCount2 = 0; foreach (var matchPos in matchPoses) { + if (matchPos.Item1 >= message.Length || matchPos.Item2 >= message.Length) return null; tmpCount = tmpCount * 256 + message[matchPos.Item1]; tmpCount2 = tmpCount2 * 256 + message[matchPos.Item2]; } diff --git a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs index e71e661..c15800e 100644 --- a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs +++ b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs @@ -10,8 +10,8 @@ namespace Modbus.Net { /// public MatchDirectlySendController(ICollection<(int, int)>[] keyMatches, - Func> duplicateFunc = null, int? waitingListMaxCount = null) : base(keyMatches, - 0, false, duplicateFunc, waitingListMaxCount) + Func lengthCalc = null, int? waitingListMaxCount = null) : base(keyMatches, + 0, false, lengthCalc, waitingListMaxCount) { } diff --git a/Samples/MachineJob/Program.cs b/Samples/MachineJob/Program.cs index 51e8a7a..92780cf 100644 --- a/Samples/MachineJob/Program.cs +++ b/Samples/MachineJob/Program.cs @@ -5,7 +5,7 @@ using Serilog; var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") - .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true) + .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") ?? "Production"}.json", true) .Build(); Log.Logger = new LoggerConfiguration() diff --git a/Samples/MachineJob/appsettings.Development.json b/Samples/MachineJob/appsettings.Development.json index b2dcdb6..ce379e2 100644 --- a/Samples/MachineJob/appsettings.Development.json +++ b/Samples/MachineJob/appsettings.Development.json @@ -1,8 +1,7 @@ { - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" + "Serilog": { + "MinimumLevel": { + "Default": "Information" } } }