public async Task ThrowsOnSlaveExceptionResponse(SlaveExceptionCode exceptionCode) { // Arrange var target = new Mock <ModbusTransport>(new Mock <IPipeResource>().Object, Mock.Of <ITransactionIdProvider>(), Mock.Of <ILogger <IModbusMaster> >()) { CallBase = true }; var request = new ReadHoldingRegistersRequest(1, 1, 1); var response = ModbusResponseFactory.CreateResponse <SlaveExceptionResponse>( new byte[] { 1, 129, (byte)exceptionCode }); target.SetupWriteRequestAsync(request); target.SetupReadResponseAsync <ReadHoldingRegistersResponse>(response); // Act var ex = await Assert.ThrowsAsync <SlaveException>(() => target.Object.SendAsync <ReadHoldingRegistersResponse>(request)); // Assert Assert.Equal(1, ex.SlaveAddress); Assert.Equal(129, ex.FunctionCode); Assert.Equal(exceptionCode, ex.SlaveExceptionCode); target.Protected().As <IModbusTransportMock>() .Verify(x => x.WriteRequestAsync(request, It.IsAny <CancellationToken>()), Times.Once()); target.Protected().As <IModbusTransportMock>() .Verify(x => x.ReadResponseAsync <ReadHoldingRegistersResponse>(It.IsAny <CancellationToken>()), Times.Once()); }
public override void Initialize(ReadOnlySpan <byte> frame) { base.Initialize(frame); if (FunctionCode <= Constants.ExceptionOffset) { throw new FormatException("Invalid function code value for SlaveExceptionResponse."); } SlaveExceptionCode = (SlaveExceptionCode)frame[2]; }