using System.Text; namespace Modbus.Net.Modbus { /// /// Modbus/Ascii码协议连接器Tcp透传 /// public class ModbusAsciiInTcpProtocolLinker : TcpProtocolLinker { /// /// 构造函数 /// /// IP地址 public ModbusAsciiInTcpProtocolLinker(string ip) : base(ip, int.Parse(ConfigurationReader.GetValueDirect("TCP:" + ip, "ModbusPort") ?? ConfigurationReader.GetValueDirect("TCP:Modbus", "ModbusPort"))) { } /// /// 构造函数 /// /// ip地址 /// 端口号 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; }, checkRightFunc: ContentCheck.LrcCheckRight, waitingListMaxCount: ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "WaitingListCount")) : null )); } /// /// 校验返回数据是否正确 /// /// 返回的数据 /// 校验是否正确 public override bool? CheckRight(byte[] content) { //ProtocolLinker不会返回null if (base.CheckRight(content) != true) return false; //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; } } }