public void ModbusFrameReader_ReadFrame_CorrectlyReadsAFrameSplitOverMultipleSegments()
        {
            // Given
            var arrayOne   = new byte[] { 0x00, 0x01, };
            var arrayTwo   = new byte[] { 0x00, 0x00, };
            var arrayThree = new byte[] { 0x00, 0x04, };
            var arrayFour  = new byte[] { 0x09 };
            var arrayFive  = new byte[] { 0x01 };
            var arraySix   = new byte[] { 0x01, 0x01, };

            var first = new MemorySegment <byte>(arrayOne);
            var last  = first.Append(arrayTwo).Append(arrayThree).Append(arrayFour).Append(arrayFive).Append(arraySix);

            var sequence = new ReadOnlySequence <byte>(first, 0, last, 2);

            // When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            // Then
            Assert.Equal(1, frame.Header.TransactionID);
            Assert.Equal(9, frame.Header.UnitID);

            var read = Assert.IsType <ResponseReadCoils>(frame.Pdu);

            Assert.Equal(new byte[] { 1 }, read.Coils);
        }
        public void ModbusFrameReader_ReadFrame_ReturnsAnErrorResponseForEachFunctionWhenTheErrorBitIsSet(byte function)
        {
            // Given
            var errorFunction = (byte)(function | 0x80);
            var header        = new byte[]
            {
                0x00, 0x01, // TransactionID
                0x00, 0x00, // Protocol ID
                0x00, 0x03, // Message length
                0x20,       // Device address
            };
            var data = new byte[]
            {
                errorFunction,  // Functional code with changed bit
                0x01            // Error Code
            };

            var first    = new MemorySegment <byte>(header);
            var last     = first.Append(data);
            var sequence = new ReadOnlySequence <byte>(first, 0, last, data.Length);

            // When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            // Then
            var read = Assert.IsType <ResponseError>(frame.Pdu);

            Assert.Equal(ModbusErrorCode.UnknownFunction, read.ErrorCode);
        }
Exemple #3
0
        private SequencePosition ReadFrame(ReadOnlySequence <byte> buffer)
        {
            var reader   = new ModbusFrameReader(buffer);
            var position = reader.ReadFrame(out var frame);

            if (!frame.Equals(ResponseAdu.Empty) &&
                _transactions.TryRemove(frame.Header.TransactionID, out var source) && frame.Header.UnitID == UNIT_ID)
            {
                source.SetResult(frame);
            }

            return(position);
        }
        public void ModbusFrameReader_ReadFrame_StopsReadingWhenBodyIsTooShortAndGoesBackToStart()
        {
            //Given
            var data     = new byte[] { 0x00, 0x01, };
            var sequence = new ReadOnlySequence <byte>(data, 0, data.Length);

            //When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            //Then
            Assert.Equal(ResponseAdu.Empty, frame);
            Assert.Equal(sequence.Start, position);
        }
        public void ModbusFrameReader_ReadFrame_CorrectlyReadsAFrameThatsASingleSegment()
        {
            // Given
            var header   = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x09, 0x01, 0x01, 0x01, };
            var sequence = new ReadOnlySequence <byte>(header, 0, header.Length);

            // When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            // Then
            Assert.Equal(1, frame.Header.TransactionID);
            Assert.Equal(9, frame.Header.UnitID);

            var read = Assert.IsType <ResponseReadCoils>(frame.Pdu);

            Assert.Equal(new byte[] { 1 }, read.Coils);
        }
        public void ModbusFrameReader_ReadFrame_ParsesAReadInputRegistersResponse()
        {
            // Given
            var header = new byte[]
            {
                0x00, 0xCE, // Transaction ID
                0x00, 0x00, // Protocol ID
                0x00, 0x09, // Message length
                0x12,       // Device id / Unit id
            };
            var data = new byte[]
            {
                0x04,       // Function code
                0x06,       // Number of bytes more
                0xAA, 0x00, // Register value Hi and Li (AI0)
                0xCC, 0xBB, // Register value Hi and Li (AI1)
                0xEE, 0xDD, // Register value Hi and Li (AI2)
            };

            var first    = new MemorySegment <byte>(header);
            var last     = first.Append(data);
            var sequence = new ReadOnlySequence <byte>(first, 0, last, data.Length);

            // When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            // Then
            Assert.Equal(206, frame.Header.TransactionID);
            Assert.Equal(18, frame.Header.UnitID);

            var response = Assert.IsType <ResponseReadInputRegisters>(frame.Pdu);

            Assert.Equal(
                new ushort[] { 43520, 52411, 61149, },
                response.Results
                );

            Assert.Equal(sequence.End, position);
        }
        public void ModbusFrameReader_ReadFrame_ParsesAWriteSingleCoilResponseTurnedOff()
        {
            // Given
            var header = new byte[]
            {
                0x00, 0x01, // Transaction ID
                0x00, 0x00, // Protocol ID
                0x00, 0x06, // Message length
                0x09,       // Device id / Unit id
            };
            var data = new byte[]
            {
                0x05,       // Function code
                0x00,       // Hi Register Address byte
                0x04,       // Lo Register Address byte
                0x00,       // Hi Byte Meaning
                0x00,       // Lo Byte Meaning
            };

            var first    = new MemorySegment <byte>(header);
            var last     = first.Append(data);
            var sequence = new ReadOnlySequence <byte>(first, 0, last, 5);

            // When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            // Then
            Assert.Equal(1, frame.Header.TransactionID);
            Assert.Equal(9, frame.Header.UnitID);

            var response = Assert.IsType <ResponseWriteSingleCoil>(frame.Pdu);

            Assert.False(response.Result);

            Assert.Equal(sequence.End, position);
        }
        public void ModbusFrameReader_ReadFrame_ParsesAReadDiscreteInputsResponse()
        {
            // Given
            var header = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x09, };
            var data   = new byte[] { 0x02, 0x01, 0x01, };

            var first    = new MemorySegment <byte>(header);
            var last     = first.Append(data);
            var sequence = new ReadOnlySequence <byte>(first, 0, last, 3);

            // When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            // Then
            Assert.Equal(1, frame.Header.TransactionID);
            Assert.Equal(9, frame.Header.UnitID);

            var read = Assert.IsType <ResponseReadDiscreteInputs>(frame.Pdu);

            Assert.Equal(new byte[] { 1 }, read.Coils);

            Assert.Equal(sequence.End, position);
        }
        public void ModbusFrameReader_ReadFrame_ParsesAWriteMultipleCoilsResponse()
        {
            // Given
            var header = new byte[]
            {
                0x00, 0x01, // Transaction ID
                0x00, 0x00, // Protocol ID
                0x00, 0x06, // Message length
                0x20,       // Device id / Unit id
            };
            var data = new byte[]
            {
                0x0F,       // Function code
                0x00,       // Address of the first byte of register Hi
                0x12,       // Address of the first byte of register Lo
                0x00,       // Number of recorded reg. Hi byte
                0x04,       // Number of recorded reg. Lo bytes
            };

            var first    = new MemorySegment <byte>(header);
            var last     = first.Append(data);
            var sequence = new ReadOnlySequence <byte>(first, 0, last, data.Length);

            // When
            var reader   = new ModbusFrameReader(sequence);
            var position = reader.ReadFrame(out var frame);

            // Then
            Assert.Equal(1, frame.Header.TransactionID);
            Assert.Equal(32, frame.Header.UnitID);

            var response = Assert.IsType <ResponseWriteMultipleCoils>(frame.Pdu);

            Assert.Equal(18, response.Address);
            Assert.Equal(4, response.Quantity);
        }