crc and lrc check move to controller

This commit is contained in:
luosheng
2023-04-12 12:02:39 +08:00
parent 4a0ce47653
commit df39357406
17 changed files with 212 additions and 54 deletions

View File

@@ -24,7 +24,21 @@ namespace Modbus.Net.Modbus
public ModbusAsciiInTcpProtocolLinker(string ip, int port)
: base(ip, port)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { if (content[0] != 0x3a) return 0; 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));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")),
lengthCalc: content =>
{
if (content[0] != 0x3a) return 0;
for (int i = 1; i < content.Length; i++)
{
if (content[i - 1] == 0x0D && content[i] == 0x0A) return i + 1;
}
return -1;
},
checkRightFunc: ContentCheck.LrcCheckRight,
waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null
? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount"))
: null
));
}
/// <summary>
@@ -36,11 +50,8 @@ namespace Modbus.Net.Modbus
{
//ProtocolLinker不会返回null
if (base.CheckRight(content) != true) return false;
//CRC校验失败
var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString))
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
var contentString = Encoding.ASCII.GetString(content);
if (byte.Parse(contentString.Substring(3, 2)) > 127)
throw new ModbusProtocolErrorException(byte.Parse(contentString.Substring(5, 2)));
return true;

View File

@@ -24,7 +24,22 @@ namespace Modbus.Net.Modbus
public ModbusAsciiInUdpProtocolLinker(string ip, int port)
: base(ip, port)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { if (content[0] != 0x3a) return 0; 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));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")),
lengthCalc: content =>
{
if (content[0] != 0x3a) return 0;
for (int i = 1; i < content.Length; i++)
{
if (content[i - 1] == 0x0D && content[i] == 0x0A)
return i + 1;
}
return -1;
},
checkRightFunc: ContentCheck.LrcCheckRight,
waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null
? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount"))
: null
));
}
/// <summary>
@@ -36,11 +51,8 @@ namespace Modbus.Net.Modbus
{
//ProtocolLinker不会返回null
if (base.CheckRight(content) != true) return false;
//CRC校验失败
var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString))
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
var contentString = Encoding.ASCII.GetString(content);
if (byte.Parse(contentString.Substring(3, 2)) > 127)
throw new ModbusProtocolErrorException(byte.Parse(contentString.Substring(5, 2)));
return true;

View File

@@ -16,7 +16,24 @@ namespace Modbus.Net.Modbus
public ModbusAsciiProtocolLinker(string com, int slaveAddress)
: base(com, slaveAddress)
{
((IConnectorWithController<byte[], byte[]>)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 0; 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));
((IConnectorWithController<byte[], byte[]>)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 0;
for (int i = 1; i < content.Length; i++)
{
if (content[i - 1] == 0x0D && content[i] == 0x0A) return i + 1;
}
return -1;
},
checkRightFunc: ContentCheck.LrcCheckRight,
waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) :
null
));
}
/// <summary>
@@ -28,11 +45,8 @@ namespace Modbus.Net.Modbus
{
//ProtocolLinker不会返回null
if (base.CheckRight(content) != true) return false;
//CRC校验失败
var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString))
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
var contentString = Encoding.ASCII.GetString(content);
if (byte.Parse(contentString.Substring(3, 2)) > 127)
throw new ModbusProtocolErrorException(byte.Parse(contentString.Substring(5, 2)));
return true;

View File

@@ -559,9 +559,7 @@ namespace Modbus.Net.Modbus
{6, "SLAVE_DEVICE_BUSY"},
{8, "MEMORY_PARITY_ERROR" },
{10, "GATEWAY_PATH_UNAVAILABLE"},
{11, "GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND"},
{500, "TCP_ILLEGAL_LENGTH"},
{501, "RTU_ILLEGAL_CRC"}
{11, "GATEWAY_TARGET_DEVICE_FAILED_TO_RESPOND"}
};
/// <summary>

View File

@@ -24,7 +24,18 @@ namespace Modbus.Net.Modbus
public ModbusRtuInTcpProtocolLinker(string ip, int port)
: base(ip, port)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content); }, waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(
int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")),
lengthCalc: content =>
{
if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8;
else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content);
},
checkRightFunc: ContentCheck.Crc16CheckRight,
waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) :
null
));
}
/// <summary>
@@ -36,9 +47,6 @@ namespace Modbus.Net.Modbus
{
//ProtocolLinker的CheckRight不会返回null
if (base.CheckRight(content) != true) return false;
//CRC校验失败
if (!Crc16.GetInstance().CrcEfficacy(content))
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
if (content[1] > 127)
throw new ModbusProtocolErrorException(content[2]);

View File

@@ -24,7 +24,18 @@ namespace Modbus.Net.Modbus
public ModbusRtuInUdpProtocolLinker(string ip, int port)
: base(ip, port)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content); }, waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(
int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")),
lengthCalc: content =>
{
if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8;
else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content);
},
checkRightFunc: ContentCheck.Crc16CheckRight,
waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) :
null
));
}
/// <summary>
@@ -36,9 +47,6 @@ namespace Modbus.Net.Modbus
{
//ProtocolLinker的CheckRight不会返回null
if (base.CheckRight(content) != true) return false;
//CRC校验失败
if (!Crc16.GetInstance().CrcEfficacy(content))
throw new ModbusProtocolErrorException(501);
//Modbus协议错误
if (content[1] > 127)
throw new ModbusProtocolErrorException(content[2]);

View File

@@ -15,7 +15,19 @@ namespace Modbus.Net.Modbus
public ModbusRtuProtocolLinker(string com, int slaveAddress)
: base(com, slaveAddress)
{
((IConnectorWithController<byte[], byte[]>)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: content => { if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content); }, waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null));
((IConnectorWithController<byte[], byte[]>)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: content =>
{
if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8;
else return DuplicateWithCount.GetDuplcateFunc(new List<int> { 2 }, 5).Invoke(content);
},
checkRightFunc: ContentCheck.Crc16CheckRight,
waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) :
null
));
}
/// <summary>

View File

@@ -11,8 +11,8 @@ namespace Modbus.Net
{
/// <inheritdoc />
public ModbusTcpMatchDirectlySendController(ICollection<(int, int)>[] keyMatches,
Func<byte[], int> lengthCalc = null, int? waitingListMaxCount = null) : base(keyMatches,
lengthCalc, waitingListMaxCount)
Func<byte[], int> lengthCalc = null, Func<byte[], bool?> checkRightFunc = null, int? waitingListMaxCount = null) : base(keyMatches,
lengthCalc, checkRightFunc, waitingListMaxCount)
{
}

View File

@@ -23,7 +23,13 @@ namespace Modbus.Net.Modbus
/// <param name="port">端口</param>
public ModbusTcpProtocolLinker(string ip, int port) : base(ip, port)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new ModbusTcpMatchDirectlySendController(new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0), (1, 1) } }, lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 4, 5 }, 6), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new ModbusTcpMatchDirectlySendController(
new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0), (1, 1) } },
lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 4, 5 }, 6),
waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) :
null
));
}
/// <summary>
@@ -35,9 +41,6 @@ namespace Modbus.Net.Modbus
{
//ProtocolLinker的CheckRight不会返回null
if (base.CheckRight(content) != true) return false;
//长度校验失败
if (content[5] != content.Length - 6)
throw new ModbusProtocolErrorException(500);
//Modbus协议错误
if (content[7] > 127)
throw new ModbusProtocolErrorException(content[2] > 0 ? content[2] : content[8]);

View File

@@ -23,7 +23,13 @@ namespace Modbus.Net.Modbus
/// <param name="port">端口</param>
public ModbusUdpProtocolLinker(string ip, int port) : base(ip, port)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 4, 5 }, 6), waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(
int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")),
lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 4, 5 }, 6),
waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) :
null
));
}
/// <summary>
@@ -35,9 +41,6 @@ namespace Modbus.Net.Modbus
{
//ProtocolLinker的CheckRight不会返回null
if (base.CheckRight(content) != true) return false;
//长度校验失败
if (content[5] != content.Length - 6)
throw new ModbusProtocolErrorException(500);
//Modbus协议错误
if (content[7] > 127)
throw new ModbusProtocolErrorException(content[2] > 0 ? content[2] : content[8]);

View File

@@ -18,7 +18,14 @@ namespace Modbus.Net.Siemens
public SiemensPpiProtocolLinker(string com, int slaveAddress)
: base(com, slaveAddress)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 1 }, 6), waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new FifoController(
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")),
lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 1 }, 6),
checkRightFunc: ContentCheck.FcsCheckRight,
waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) :
null
));
}
/// <summary>
@@ -86,14 +93,9 @@ namespace Modbus.Net.Siemens
public override bool? CheckRight(byte[] content)
{
if (base.CheckRight(content) != true) return false;
var fcsCheck = 0;
if (content.Length == 1 && content[0] == 0xe5)
return true;
if (content.Length == 6 && content[3] == 0) return true;
for (var i = 4; i < content.Length - 2; i++)
fcsCheck += content[i];
fcsCheck = fcsCheck % 256;
if (fcsCheck != content[content.Length - 2]) return false;
if (content[content.Length - 1] != 0x16) return false;
if (content[1] != content.Length - 6) return false;
return true;

View File

@@ -25,7 +25,13 @@ namespace Modbus.Net.Siemens
public SiemensTcpProtocolLinker(string ip, int port)
: base(ip, port)
{
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new MatchDirectlySendController(new ICollection<(int, int)>[] { new List<(int, int)> { (11, 11), (12, 12) } }, DuplicateWithCount.GetDuplcateFunc(new List<int> { 2, 3 }, 0), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null));
((IConnectorWithController<byte[], byte[]>)BaseConnector).AddController(new MatchDirectlySendController(
new ICollection<(int, int)>[] { new List<(int, int)> { (11, 11), (12, 12) } },
lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List<int> { 2, 3 }, 0),
waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ?
int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) :
null
));
}
/// <summary>

View File

@@ -22,18 +22,25 @@ namespace Modbus.Net
protected Task SendingThread { get; set; }
/// <summary>
/// 包切分位置
/// 包切分位置函数
/// </summary>
protected Func<byte[], int> LengthCalc { get; }
/// <summary>
/// 包校验函数
/// </summary>
protected Func<byte[], bool?> CheckRightFunc { get; }
/// <summary>
/// 构造器
/// </summary>
/// <param name="lengthCalc">包长度计算函数</param>
protected BaseController(Func<byte[], int> lengthCalc = null)
/// <param name="checkRightFunc">包校验函数</param>
protected BaseController(Func<byte[], int> lengthCalc = null, Func<byte[], bool?> checkRightFunc = null)
{
WaitingMessages = new List<MessageWaitingDef>();
LengthCalc = lengthCalc;
CheckRightFunc = checkRightFunc;
}
/// <inheritdoc />
@@ -118,7 +125,13 @@ namespace Modbus.Net
duplicatedMessages = new List<byte[]>();
while (receiveMessageCopy.Length >= length)
{
duplicatedMessages.Add(receiveMessageCopy.Take(length.Value).ToArray());
var duplicateMessage = receiveMessageCopy.Take(length.Value).ToArray();
if (CheckRightFunc != null && CheckRightFunc(duplicateMessage) == false)
{
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessage.Length - 1).ToArray();
continue;
}
duplicatedMessages.Add(duplicateMessage);
receiveMessageCopy = receiveMessageCopy.TakeLast(receiveMessage.Length - length.Value).ToArray();
if (receiveMessageCopy.Length == 0) break;
length = LengthCalc?.Invoke(receiveMessageCopy);
@@ -147,8 +160,6 @@ namespace Modbus.Net
return ans;
}
/// <summary>
/// 从等待队列中匹配信息
/// </summary>

View File

@@ -0,0 +1,68 @@
using System.Text;
namespace Modbus.Net
{
/// <summary>
/// 数据检查类
/// </summary>
public static class ContentCheck
{
/// <summary>
/// 检查接收的数据是否正确
/// </summary>
/// <param name="content">接收协议的内容</param>
/// <returns>协议是否是正确的</returns>
public static bool? CheckRight(byte[] content)
{
if (content == null || content.Length == 0)
{
return null;
}
return true;
}
/// <summary>
/// Lrc校验
/// </summary>
/// <param name="content">接收协议的内容</param>
/// <returns>协议是否是正确的</returns>
public static bool? LrcCheckRight(byte[] content)
{
var baseCheck = CheckRight(content);
if (baseCheck != true) return baseCheck;
var contentString = Encoding.ASCII.GetString(content);
if (!Crc16.GetInstance().LrcEfficacy(contentString))
return false;
return true;
}
/// <summary>
/// Crc16校验
/// </summary>
/// <param name="content">接收协议的内容</param>
/// <returns>协议是否是正确的</returns>
public static bool? Crc16CheckRight(byte[] content)
{
var baseCheck = CheckRight(content);
if (baseCheck != true) return baseCheck;
if (!Crc16.GetInstance().CrcEfficacy(content))
return false;
return true;
}
/// <summary>
/// Fcs校验
/// </summary>
/// <param name="content">接收协议的内容</param>
/// <returns>协议是否是正确的</returns>
public static bool? FcsCheckRight(byte[] content)
{
var fcsCheck = 0;
for (var i = 4; i < content.Length - 2; i++)
fcsCheck += content[i];
fcsCheck = fcsCheck % 256;
if (fcsCheck != content[content.Length - 2]) return false;
return true;
}
}
}

View File

@@ -31,9 +31,10 @@ namespace Modbus.Net
/// <param name="acquireTime">间隔时间</param>
/// <param name="activateSema">是否开启信号量</param>
/// <param name="lengthCalc">包切分长度函数</param>
/// <param name="checkRightFunc">包校验函数</param>
/// <param name="waitingListMaxCount">包等待队列长度</param>
public FifoController(int acquireTime, bool activateSema = true, Func<byte[], int> lengthCalc = null, int? waitingListMaxCount = null)
: base(lengthCalc)
public FifoController(int acquireTime, bool activateSema = true, Func<byte[], int> lengthCalc = null, Func<byte[], bool?> checkRightFunc = null, int? waitingListMaxCount = null)
: base(lengthCalc, checkRightFunc)
{
_waitingListMaxCount = int.Parse(waitingListMaxCount != null ? waitingListMaxCount.ToString() : null ?? ConfigurationReader.GetValueDirect("Controller", "WaitingListCount"));
if (activateSema)

View File

@@ -21,9 +21,10 @@ namespace Modbus.Net
/// <param name="acquireTime">获取间隔</param>
/// <param name="activateSema">是否开启信号量</param>
/// <param name="lengthCalc">包长度计算</param>
/// <param name="checkRightFunc">包校验函数</param>
/// <param name="waitingListMaxCount">包等待队列长度</param>
public MatchController(ICollection<(int, int)>[] keyMatches, int acquireTime, bool activateSema = true,
Func<byte[], int> lengthCalc = null, int? waitingListMaxCount = null) : base(acquireTime, activateSema, lengthCalc, waitingListMaxCount)
Func<byte[], int> lengthCalc = null, Func<byte[], bool?> checkRightFunc = null, int? waitingListMaxCount = null) : base(acquireTime, activateSema, lengthCalc, checkRightFunc, waitingListMaxCount)
{
KeyMatches = keyMatches;
}

View File

@@ -10,8 +10,8 @@ namespace Modbus.Net
{
/// <inheritdoc />
public MatchDirectlySendController(ICollection<(int, int)>[] keyMatches,
Func<byte[], int> lengthCalc = null, int? waitingListMaxCount = null) : base(keyMatches,
0, false, lengthCalc, waitingListMaxCount)
Func<byte[], int> lengthCalc = null, Func<byte[], bool?> checkRightFunc = null, int? waitingListMaxCount = null) : base(keyMatches,
0, false, lengthCalc, checkRightFunc, waitingListMaxCount)
{
}