readHoldingRegistersBytes method

  1. @override
Future<Uint8List> readHoldingRegistersBytes(
  1. int slaveId,
  2. int address,
  3. int quantity
)
override

Read holding registers as bytes (FC 03).

Reads from 1 to 125 contiguous holding registers.

Parameters:

  • slaveId: The slave device ID (1-247)
  • address: Starting address of holding registers
  • quantity: Number of registers to read (1-125)

Returns: Raw bytes (quantity × 2 bytes, big-endian)

Implementation

@override
Future<Uint8List> readHoldingRegistersBytes(
    int slaveId, int address, int quantity) async {
  if (slaveId < _addressMin || slaveId > _addressMax) {
    throw ArgumentError(
        'modbus: slaveId \'$slaveId\' must be between \'$_addressMin\' and \'$_addressMax\'');
  }
  if (quantity < readRegQuantityMin || quantity > readRegQuantityMax) {
    throw ArgumentError(
        'modbus: quantity \'$quantity\' must be between \'$readRegQuantityMin\' and \'$readRegQuantityMax\'');
  }

  final response = await send(
    slaveId,
    ProtocolDataUnit(
      funcCodeReadHoldingRegisters,
      uint16ToBytes([address, quantity]),
    ),
  );

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

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