private void Read(ModbusDevice device, ModbusFunctionCode functionCode, int zeroBasedOffset, int count, Action <MessageBufferSpan> actionWithReturnedBuffer) { var requestContext = new ModbusTransportContext() { TransactionIdentifier = GetTransactionIdentifier() }; ModbusTransport.SendMessage(requestContext, (writer) => { writer.Push(device.Address); writer.Push((byte)functionCode); writer.Push((byte)((zeroBasedOffset >> 8) & 0xFF)); writer.Push((byte)((zeroBasedOffset >> 0) & 0xFF)); writer.Push((byte)((count >> 8) & 0xFF)); writer.Push((byte)((count >> 0) & 0xFF)); }); MessageBufferSpan?receivedBuffer = null; var responseContext = ModbusTransport.ReceiveMessage( (reader) => { if (reader.PushByteFromStream() != device.Address) { throw new InvalidOperationException(); } byte receivedFunctionCode = reader.PushByteFromStream(); if (receivedFunctionCode == ((byte)functionCode | 0x80)) { var exceptionCode = (ModbusExceptionCode)reader.PushByteFromStream(); throw new ModbusException(exceptionCode); } if (receivedFunctionCode != (byte)functionCode) { throw new InvalidOperationException(); } var byteCount = reader.PushByteFromStream(); reader.PushFromStream(byteCount); receivedBuffer = new MessageBufferSpan(reader.Buffer, (ushort)(reader.Buffer.Length - byteCount), byteCount); }); if (responseContext.TransactionIdentifier != requestContext.TransactionIdentifier) { throw new InvalidOperationException(); } actionWithReturnedBuffer(receivedBuffer !); }
private T Write <T>(ModbusDevice device, ModbusFunctionCode functionCode, int zeroBasedOffset, Action <IMessageBufferWriter> writeAction, Func <IMessageBufferReader, T> readValueFunc) { var requestContext = new ModbusTransportContext() { TransactionIdentifier = GetTransactionIdentifier() }; ModbusTransport.SendMessage(requestContext, (writer) => { writer.Push(device.Address); writer.Push((byte)functionCode); writer.Push((byte)((zeroBasedOffset >> 8) & 0xFF)); writer.Push((byte)((zeroBasedOffset >> 0) & 0xFF)); writeAction(writer); }); T returnedValue = default; var responseContext = ModbusTransport.ReceiveMessage( (reader) => { if (reader.PushByteFromStream() != device.Address) { throw new InvalidOperationException(); } byte receivedFunctionCode = reader.PushByteFromStream(); if (receivedFunctionCode == ((byte)functionCode | 0x80)) { var exceptionCode = (ModbusExceptionCode)reader.PushByteFromStream(); throw new ModbusException(exceptionCode); } if (receivedFunctionCode != (byte)functionCode) { throw new InvalidOperationException(); } if ((ushort)((reader.PushByteFromStream() << 8) + (reader.PushByteFromStream() << 0)) != zeroBasedOffset) { throw new InvalidOperationException(); } returnedValue = readValueFunc(reader); }); if (requestContext.TransactionIdentifier != responseContext.TransactionIdentifier) { throw new InvalidOperationException(); } return(returnedValue !); }