readWriteMultipleRegistersBytes method

  1. @override
Future<Uint8List> readWriteMultipleRegistersBytes(
  1. int slaveId,
  2. int readAddress,
  3. int readQuantity,
  4. int writeAddress,
  5. int writeQuantity,
  6. Uint8List value,
)
override

Read and write multiple registers, returning bytes (FC 23).

Performs a combined read/write operation in a single transaction.

Parameters:

  • slaveId: The slave device ID (1-247)
  • readAddress: Starting address for read
  • readQuantity: Number of registers to read (1-125)
  • writeAddress: Starting address for write
  • writeQuantity: Number of registers to write (1-121)
  • value: Bytes to write (must be writeQuantity × 2 bytes)

Returns: Read register bytes

Implementation

@override
Future<Uint8List> readWriteMultipleRegistersBytes(
    int slaveId,
    int readAddress,
    int readQuantity,
    int writeAddress,
    int writeQuantity,
    Uint8List value) async {
  if (slaveId < _addressMin || slaveId > _addressMax) {
    throw ArgumentError(
        'modbus: slaveId \'$slaveId\' must be between \'$_addressMin\' and \'$_addressMax\'');
  }
  if (readQuantity < readWriteOnReadRegQuantityMin ||
      readQuantity > readWriteOnReadRegQuantityMax) {
    throw ArgumentError(
        'modbus: quantity to read \'$readQuantity\' must be between \'$readWriteOnReadRegQuantityMin\' and \'$readWriteOnReadRegQuantityMax\'');
  }
  if (writeQuantity < readWriteOnWriteRegQuantityMin ||
      writeQuantity > readWriteOnWriteRegQuantityMax) {
    throw ArgumentError(
        'modbus: quantity to write \'$writeQuantity\' must be between \'$readWriteOnWriteRegQuantityMin\' and \'$readWriteOnWriteRegQuantityMax\'');
  }
  if (value.length != writeQuantity * 2) {
    throw ArgumentError(
        'modbus: value length \'${value.length}\' does not twice as write quantity \'$writeQuantity\'');
  }

  final response = await send(
    slaveId,
    ProtocolDataUnit(
      funcCodeReadWriteMultipleRegisters,
      pduDataBlockSuffix(
          value, [readAddress, readQuantity, writeAddress, writeQuantity]),
    ),
  );

  if (response.data[0] != response.data.length - 1) {
    throw Exception(
        'modbus: response data size \'${response.data.length - 1}\' does not match count \'${response.data[0]}\'');
  }

  return Uint8List.fromList(response.data.sublist(1));
}