readWriteMultipleRegistersBytes method
Future<Uint8List>
readWriteMultipleRegistersBytes(
- int slaveId,
- int readAddress,
- int readQuantity,
- int writeAddress,
- int writeQuantity,
- 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 readreadQuantity: Number of registers to read (1-125)writeAddress: Starting address for writewriteQuantity: 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));
}