예제 #1
0
        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);
            }
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
 public ReadRegistersMessage(MBAP appHeader, ProtocolDataUnit pdu)
     : base(appHeader, pdu)
 {
 }
예제 #4
0
 protected ModbusTCPMessage(IEnumerable <byte> messageBuffer)
 {
     ApplicationHeader = MBAP.ParseFromMessage(messageBuffer);
     PDU = new ProtocolDataUnit(messageBuffer);
 }
예제 #5
0
 protected ModbusTCPMessage(MBAP appHeader, ProtocolDataUnit pdu)
 {
     ApplicationHeader = appHeader;
     PDU = pdu;
 }
 public WriteHoldingRegistersMessage(MBAP appHeader, ProtocolDataUnit pdu)
     : base(appHeader, pdu)
 {
 }