public override ModbusTCPMessage Process(IMemoryModel memory) { int address = Int16Extensions.FromBytes(PDU.Data.First(), PDU.Data.Skip(1).First()); int length = Int16Extensions.FromBytes(PDU.Data.Skip(2).First(), PDU.Data.Skip(3).First()); try { var values = memory.Read4x(address, length); ProtocolDataUnit pdu = PDU.ValidResponse( new byte[] { (byte)(values.Count() * 2) } .Concat(values.SelectMany(v => v.GetBytes()))); ModbusTCPMessage reply = Create( MBAP.Create((byte)(pdu.GetBytes().Count() + 1), ApplicationHeader.UnitID), pdu); return(reply); } catch { ProtocolDataUnit pdu = PDU.ErrorResponse(new byte[] { 0x01 }); ModbusTCPMessage reply = Create( MBAP.Create((byte)(pdu.GetBytes().Count() + 1), ApplicationHeader.UnitID), pdu); return(reply); } }
public static ModbusTCPMessage Create(MBAP appHeader, ProtocolDataUnit pdu) { switch (pdu.FunctionCode) { case ModbusFunctionCodes.ReadHoldingRegisters: return(new ReadRegistersMessage(appHeader, pdu)); case ModbusFunctionCodes.PresetMultipleRegisters: return(new WriteHoldingRegistersMessage(appHeader, pdu)); default: return(new ModbusTCPMessage(appHeader, pdu)); } }
public ReadRegistersMessage(MBAP appHeader, ProtocolDataUnit pdu) : base(appHeader, pdu) { }
protected ModbusTCPMessage(IEnumerable <byte> messageBuffer) { ApplicationHeader = MBAP.ParseFromMessage(messageBuffer); PDU = new ProtocolDataUnit(messageBuffer); }
protected ModbusTCPMessage(MBAP appHeader, ProtocolDataUnit pdu) { ApplicationHeader = appHeader; PDU = pdu; }
public WriteHoldingRegistersMessage(MBAP appHeader, ProtocolDataUnit pdu) : base(appHeader, pdu) { }