diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs index 08c3c61..23f5ba2 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInTcpProtocolLinker.cs @@ -24,7 +24,21 @@ namespace Modbus.Net.Modbus public ModbusAsciiInTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)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)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 + )); } /// @@ -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; diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs index c295e3d..8324e10 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiInUdpProtocolLinker.cs @@ -24,7 +24,22 @@ namespace Modbus.Net.Modbus public ModbusAsciiInUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)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)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 + )); } /// @@ -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; diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs index 627e0fa..b68256e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs @@ -16,7 +16,24 @@ namespace Modbus.Net.Modbus public ModbusAsciiProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((IConnectorWithController)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)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 + )); } /// @@ -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; diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs index 910af71..f5a0a6e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs @@ -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"} }; /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs index 9e9d13f..c340c6b 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs @@ -24,7 +24,18 @@ namespace Modbus.Net.Modbus public ModbusRtuInTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)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 { 2 }, 5).Invoke(content); }, waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((IConnectorWithController)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 { 2 }, 5).Invoke(content); + }, + checkRightFunc: ContentCheck.Crc16CheckRight, + waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? + int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : + null + )); } /// @@ -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]); diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs index f7b57b0..3a0ef4a 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs @@ -24,7 +24,18 @@ namespace Modbus.Net.Modbus public ModbusRtuInUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)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 { 2 }, 5).Invoke(content); }, waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((IConnectorWithController)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 { 2 }, 5).Invoke(content); + }, + checkRightFunc: ContentCheck.Crc16CheckRight, + waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? + int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : + null + )); } /// @@ -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]); diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs index ba01c45..76fb9a7 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs @@ -15,7 +15,19 @@ namespace Modbus.Net.Modbus public ModbusRtuProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((IConnectorWithController)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 { 2 }, 5).Invoke(content); }, waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : null)); + ((IConnectorWithController)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 { 2 }, 5).Invoke(content); + }, + checkRightFunc: ContentCheck.Crc16CheckRight, + 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/ModbusTcpMatchDirectlySendController.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpMatchDirectlySendController.cs index 9ff030f..3cfd997 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpMatchDirectlySendController.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpMatchDirectlySendController.cs @@ -11,8 +11,8 @@ namespace Modbus.Net { /// public ModbusTcpMatchDirectlySendController(ICollection<(int, int)>[] keyMatches, - Func lengthCalc = null, int? waitingListMaxCount = null) : base(keyMatches, - lengthCalc, waitingListMaxCount) + Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null) : base(keyMatches, + lengthCalc, checkRightFunc, waitingListMaxCount) { } diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs index bf34fcb..949f8b6 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocolLinker.cs @@ -23,7 +23,13 @@ namespace Modbus.Net.Modbus /// 端口 public ModbusTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)BaseConnector).AddController(new ModbusTcpMatchDirectlySendController(new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0), (1, 1) } }, 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)); + ((IConnectorWithController)BaseConnector).AddController(new ModbusTcpMatchDirectlySendController( + new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0), (1, 1) } }, + 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 + )); } /// @@ -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]); diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs index 5bfe3e5..4b7cb2a 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs @@ -23,7 +23,13 @@ namespace Modbus.Net.Modbus /// 端口 public ModbusUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)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)); + ((IConnectorWithController)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 + )); } /// @@ -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]); diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs index 4057c8f..77b3657 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocolLinker.cs @@ -18,7 +18,14 @@ namespace Modbus.Net.Siemens public SiemensPpiProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((IConnectorWithController)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)); + ((IConnectorWithController)BaseConnector).AddController(new FifoController( + int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), + lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 1 }, 6), + checkRightFunc: ContentCheck.FcsCheckRight, + waitingListMaxCount: ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount") != null ? + int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "WaitingListCount")) : + null + )); } /// @@ -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; diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs index e220f21..25234aa 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs @@ -25,7 +25,13 @@ namespace Modbus.Net.Siemens public SiemensTcpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)BaseConnector).AddController(new MatchDirectlySendController(new ICollection<(int, int)>[] { new List<(int, int)> { (11, 11), (12, 12) } }, DuplicateWithCount.GetDuplcateFunc(new List { 2, 3 }, 0), waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null)); + ((IConnectorWithController)BaseConnector).AddController(new MatchDirectlySendController( + new ICollection<(int, int)>[] { new List<(int, int)> { (11, 11), (12, 12) } }, + lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 2, 3 }, 0), + waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? + int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : + null + )); } /// diff --git a/Modbus.Net/Modbus.Net/Controller/BaseController.cs b/Modbus.Net/Modbus.Net/Controller/BaseController.cs index 7b25098..1fc7a19 100644 --- a/Modbus.Net/Modbus.Net/Controller/BaseController.cs +++ b/Modbus.Net/Modbus.Net/Controller/BaseController.cs @@ -22,18 +22,25 @@ namespace Modbus.Net protected Task SendingThread { get; set; } /// - /// зλ + /// зλú /// protected Func LengthCalc { get; } + /// + /// У麯 + /// + protected Func CheckRightFunc { get; } + /// /// /// /// ȼ㺯 - protected BaseController(Func lengthCalc = null) + /// У麯 + protected BaseController(Func lengthCalc = null, Func checkRightFunc = null) { WaitingMessages = new List(); LengthCalc = lengthCalc; + CheckRightFunc = checkRightFunc; } /// @@ -118,7 +125,13 @@ namespace Modbus.Net duplicatedMessages = new List(); 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; } - - /// /// ӵȴƥϢ /// diff --git a/Modbus.Net/Modbus.Net/Controller/ContentCheck.cs b/Modbus.Net/Modbus.Net/Controller/ContentCheck.cs new file mode 100644 index 0000000..3c5a6a7 --- /dev/null +++ b/Modbus.Net/Modbus.Net/Controller/ContentCheck.cs @@ -0,0 +1,68 @@ +using System.Text; + +namespace Modbus.Net +{ + /// + /// 数据检查类 + /// + public static class ContentCheck + { + /// + /// 检查接收的数据是否正确 + /// + /// 接收协议的内容 + /// 协议是否是正确的 + public static bool? CheckRight(byte[] content) + { + if (content == null || content.Length == 0) + { + return null; + } + return true; + } + + /// + /// Lrc校验 + /// + /// 接收协议的内容 + /// 协议是否是正确的 + 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; + } + + /// + /// Crc16校验 + /// + /// 接收协议的内容 + /// 协议是否是正确的 + public static bool? Crc16CheckRight(byte[] content) + { + var baseCheck = CheckRight(content); + if (baseCheck != true) return baseCheck; + if (!Crc16.GetInstance().CrcEfficacy(content)) + return false; + return true; + } + + /// + /// Fcs校验 + /// + /// 接收协议的内容 + /// 协议是否是正确的 + 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; + } + } +} diff --git a/Modbus.Net/Modbus.Net/Controller/FifoController.cs b/Modbus.Net/Modbus.Net/Controller/FifoController.cs index 731c753..28b3bdd 100644 --- a/Modbus.Net/Modbus.Net/Controller/FifoController.cs +++ b/Modbus.Net/Modbus.Net/Controller/FifoController.cs @@ -31,9 +31,10 @@ namespace Modbus.Net /// 间隔时间 /// 是否开启信号量 /// 包切分长度函数 + /// 包校验函数 /// 包等待队列长度 - public FifoController(int acquireTime, bool activateSema = true, Func lengthCalc = null, int? waitingListMaxCount = null) - : base(lengthCalc) + public FifoController(int acquireTime, bool activateSema = true, Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null) + : base(lengthCalc, checkRightFunc) { _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 01eafbd..0ecc4e3 100644 --- a/Modbus.Net/Modbus.Net/Controller/MatchController.cs +++ b/Modbus.Net/Modbus.Net/Controller/MatchController.cs @@ -21,9 +21,10 @@ namespace Modbus.Net /// 获取间隔 /// 是否开启信号量 /// 包长度计算 + /// 包校验函数 /// 包等待队列长度 public MatchController(ICollection<(int, int)>[] keyMatches, int acquireTime, bool activateSema = true, - Func lengthCalc = null, int? waitingListMaxCount = null) : base(acquireTime, activateSema, lengthCalc, waitingListMaxCount) + Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null) : base(acquireTime, activateSema, lengthCalc, checkRightFunc, waitingListMaxCount) { KeyMatches = keyMatches; } diff --git a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs index c15800e..acdc473 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 lengthCalc = null, int? waitingListMaxCount = null) : base(keyMatches, - 0, false, lengthCalc, waitingListMaxCount) + Func lengthCalc = null, Func checkRightFunc = null, int? waitingListMaxCount = null) : base(keyMatches, + 0, false, lengthCalc, checkRightFunc, waitingListMaxCount) { }