void IProtocolCodec.ServerEncode(CommDataBase data) { ModbusServer ownerProtocol = (ModbusServer)data.OwnerProtocol; ModbusCommand userData = (ModbusCommand)data.UserData; byte functionCode = userData.FunctionCode; ByteArrayWriter byteArrayWriter1 = new ByteArrayWriter(); ModbusCodecBase.CommandCodecs[(int)functionCode]?.ServerEncode(userData, byteArrayWriter1); int num = userData.ExceptionCode == (byte)0 ? 2 + byteArrayWriter1.Length : 3; ByteArrayWriter byteArrayWriter2 = new ByteArrayWriter(); byteArrayWriter2.WriteUInt16BE((ushort)userData.TransId); byteArrayWriter2.WriteInt16BE((short)0); byteArrayWriter2.WriteInt16BE((short)num); byteArrayWriter2.WriteByte(ownerProtocol.Address); if (userData.ExceptionCode == (byte)0) { byteArrayWriter2.WriteByte(userData.FunctionCode); byteArrayWriter2.WriteBytes(byteArrayWriter1); } else { byteArrayWriter2.WriteByte((byte)((uint)userData.FunctionCode | 128U)); byteArrayWriter2.WriteByte(userData.ExceptionCode); } data.OutgoingData = byteArrayWriter2.ToReader(); }
CommResponse IProtocolCodec.ServerDecode(CommDataBase data) { ModbusServer ownerProtocol = (ModbusServer)data.OwnerProtocol; ByteArrayReader incomingData = data.IncomingData; if (incomingData.Length >= 6) { ushort num1 = incomingData.ReadUInt16BE(); if (incomingData.ReadInt16BE() == (short)0) { short num2 = incomingData.ReadInt16BE(); if (incomingData.Length >= (int)num2 + 6) { if ((int)incomingData.ReadByte() == (int)ownerProtocol.Address) { byte fc = incomingData.ReadByte(); if ((int)fc >= ModbusCodecBase.CommandCodecs.Length) { throw new ApplicationException("Unknown function code"); } ModbusCommand command = new ModbusCommand(fc); data.UserData = (object)command; command.TransId = (int)num1; ByteArrayReader body = new ByteArrayReader(incomingData.ReadToEnd()); ModbusCodecBase.CommandCodecs[(int)fc]?.ServerDecode(command, body); return(new CommResponse(data, 3)); } } else { goto label_10; } } return(new CommResponse(data, 1)); } label_10: return(new CommResponse(data, 0)); }