writeMultipleRegistersBytes method
Write multiple registers from bytes (FC 16).
Writes 1 to 123 contiguous holding registers.
Parameters:
slaveId: The slave device ID (0-247, 0 for broadcast)address: Starting address of registersquantity: Number of registers to write (1-123)value: Raw bytes (must be quantity × 2 bytes, big-endian)
Implementation
@override
Future<void> writeMultipleRegistersBytes(
int slaveId, int address, int quantity, Uint8List value) async {
if (slaveId > _addressMax) {
throw ArgumentError(
'modbus: slaveId \'$slaveId\' must be between \'$addressBroadCast\' and \'$_addressMax\'');
}
if (quantity < writeRegQuantityMin || quantity > writeRegQuantityMax) {
throw ArgumentError(
'modbus: quantity \'$quantity\' must be between \'$writeRegQuantityMin\' and \'$writeRegQuantityMax\'');
}
if (value.length != quantity * 2) {
throw ArgumentError(
'modbus: value length \'${value.length}\' does not twice as quantity \'$quantity\'');
}
final response = await send(
slaveId,
ProtocolDataUnit(
funcCodeWriteMultipleRegisters,
pduDataBlockSuffix(value, [address, quantity]),
),
);
if (response.data.length != 4) {
throw Exception(
'modbus: response data size \'${response.data.length}\' does not match expected \'4\'');
}
final rspAddress = bytesToUint16(response.data.sublist(0, 2))[0];
if (rspAddress != address) {
throw Exception(
'modbus: response address \'$rspAddress\' does not match request \'$address\'');
}
final rspQuantity = bytesToUint16(response.data.sublist(2, 4))[0];
if (rspQuantity != quantity) {
throw Exception(
'modbus: response quantity \'$rspQuantity\' does not match request \'$quantity\'');
}
}