Modbus ASCII Fix
This commit is contained in:
@@ -24,7 +24,7 @@ namespace Modbus.Net.Modbus
|
|||||||
public ModbusAsciiInTcpProtocolLinker(string ip, int port)
|
public ModbusAsciiInTcpProtocolLinker(string ip, int port)
|
||||||
: base(ip, port)
|
: base(ip, port)
|
||||||
{
|
{
|
||||||
((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));
|
((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { if (content[0] != 0x3a) return -1; for (int i = 1; i < content.Length; i++) { if (content[i - 1] == 0x0D && content[i] == 0x0A) return i + 1; } return -1; }, waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace Modbus.Net.Modbus
|
|||||||
public ModbusAsciiInUdpProtocolLinker(string ip, int port)
|
public ModbusAsciiInUdpProtocolLinker(string ip, int port)
|
||||||
: base(ip, port)
|
: base(ip, port)
|
||||||
{
|
{
|
||||||
((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));
|
((BaseConnector)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { if (content[0] != 0x3a) return -1; for (int i = 1; i < content.Length; i++) { if (content[i - 1] == 0x0D && content[i] == 0x0A) return i + 1; } return -1; }, waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace Modbus.Net.Modbus
|
|||||||
public ModbusAsciiProtocolLinker(string com, int slaveAddress)
|
public ModbusAsciiProtocolLinker(string com, int slaveAddress)
|
||||||
: base(com, 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")), 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));
|
((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 => { if (content[0] != 0x3a) return -1; for (int i = 1; i < content.Length; i++) { if (content[i - 1] == 0x0D && content[i] == 0x0A) return i + 1; } return -1; }, waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ namespace Modbus.Net
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 缓冲的字节流
|
/// 缓冲的字节流
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private List<byte> cachedBytes = new List<byte>();
|
private List<byte> _cachedBytes = new List<byte>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 构造器
|
/// 构造器
|
||||||
@@ -488,23 +488,32 @@ namespace Modbus.Net
|
|||||||
logger.LogDebug(
|
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")))}");
|
||||||
|
|
||||||
cachedBytes.AddRange(returnBytes);
|
lock (_cachedBytes)
|
||||||
var isMessageConfirmed = Controller.ConfirmMessage(cachedBytes.ToArray());
|
{
|
||||||
|
_cachedBytes.AddRange(returnBytes);
|
||||||
|
}
|
||||||
|
var isMessageConfirmed = Controller.ConfirmMessage(_cachedBytes.ToArray());
|
||||||
foreach (var confirmed in isMessageConfirmed)
|
foreach (var confirmed in isMessageConfirmed)
|
||||||
{
|
{
|
||||||
if (confirmed.Item2 == false)
|
if (confirmed.Item2 == false)
|
||||||
{
|
{
|
||||||
//主动传输事件
|
//主动传输事件
|
||||||
}
|
}
|
||||||
cachedBytes.RemoveRange(0, confirmed.Item1.Length);
|
lock (_cachedBytes)
|
||||||
|
{
|
||||||
|
_cachedBytes.RemoveRange(0, confirmed.Item1.Length);
|
||||||
}
|
}
|
||||||
if (isMessageConfirmed.Count > 0 && cachedBytes.Count > 0)
|
}
|
||||||
|
if (isMessageConfirmed.Count > 0 && _cachedBytes.Count > 0)
|
||||||
{
|
{
|
||||||
logger.LogError("Com client {ConnectionToken} cached msg error: {Length}", ConnectionToken,
|
logger.LogError("Com client {ConnectionToken} cached msg error: {Length}", ConnectionToken,
|
||||||
cachedBytes.Count);
|
_cachedBytes.Count);
|
||||||
logger.LogError(
|
logger.LogError(
|
||||||
$"Com client {ConnectionToken} cached msg: {string.Concat(cachedBytes.Select(p => " " + p.ToString("X2")))}");
|
$"Com client {ConnectionToken} cached msg: {string.Concat(_cachedBytes.Select(p => " " + p.ToString("X2")))}");
|
||||||
cachedBytes.Clear();
|
lock (_cachedBytes)
|
||||||
|
{
|
||||||
|
_cachedBytes.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
RefreshReceiveCount();
|
RefreshReceiveCount();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ namespace Modbus.Net
|
|||||||
Array.Copy(receiveMessage, receiveMessageCopy, receiveMessage.Length);
|
Array.Copy(receiveMessage, receiveMessageCopy, receiveMessage.Length);
|
||||||
var length = LengthCalc?.Invoke(receiveMessageCopy);
|
var length = LengthCalc?.Invoke(receiveMessageCopy);
|
||||||
List<byte[]> duplicatedMessages;
|
List<byte[]> duplicatedMessages;
|
||||||
if (length == null) return ans;
|
if (length == null || length == -1) return ans;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
duplicatedMessages = new List<byte[]>();
|
duplicatedMessages = new List<byte[]>();
|
||||||
@@ -119,6 +119,7 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
duplicatedMessages.Add(receiveMessageCopy.Take(length.Value).ToArray());
|
duplicatedMessages.Add(receiveMessageCopy.Take(length.Value).ToArray());
|
||||||
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessage.Length - length.Value).ToArray();
|
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessage.Length - length.Value).ToArray();
|
||||||
|
if (receiveMessageCopy.Length == 0) break;
|
||||||
length = LengthCalc?.Invoke(receiveMessageCopy);
|
length = LengthCalc?.Invoke(receiveMessageCopy);
|
||||||
if (length == -1) break;
|
if (length == -1) break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user