Según la imagen en la dirección 0x4520 y con tamaño UINT16 (entero sin signo de 16 bits), eso quiere decir que solo usa un registro. Para ello se hace uso de la función writeSingleRegister(dirección, valor)
Por ejemplo:
#include <ModbusMaster.h>
ModbusMaster node;
unsigned int rpm = 1000; // variable de las rpm.
void setup() {
Serial.begin(19200);
node.begin(0x7f, Serial);
}
void loop() {
// Aquí un código para establecer la rpm que queremos
// que tenga, ya sea por un teclado, botones, etc..
// Finalmente escribimos las rpm.
result = node.write(0x4520, rpm);
if ( result == node.ku8MBSuccess )
{
// Se ha hecho correctamente.
}
else
{
// Hay error, mostrar en LCD, por ejemplo.
}
}
En el caso de querer escribir varios registros a la vez si tendremos que usar la funcion writeMultipleRegisters(direccion, numero). En la imagen veo que el siguiente valor de la tabla es la potencia y usa 32 bits (UINT32. Hay que usar entonces el buffer de transmisión para enviar los datos:
#include <ModbusMaster.h>
unsigned long potencia = 100;
void setup() {
Serial.begin(19200);
node.begin(0x7f, Serial);
}
void loop() {
//
// ... manejo de la potencia ...
//
// Escribir la pontencia:
node.setTransmitBuffer(0, highWord(potencia));
node.setTransmitBuffer(1, lowWord(potencia));
result = node.write(0x4521, 2);
if ( result == node.ku8MBSuccess )
{
// Se ha hecho correctamente.
}
else
{
// Hay error, mostrar en LCD, por ejemplo.
}
}
Podrías cambiar varios registros a la vez, por ejemplo las revoluciones y la potencia en una misma petición, pero solo lo puedes hacer si los registros estan seguidos, es decir, direcciones consecutivas:
#include <ModbusMaster.h>
unsigned int rpm = 1000;
unsigned long potencia = 100;
void setup() {
Serial.begin(19200);
node.begin(0x7f, Serial);
}
void loop() {
//...
node.setTransmitBuffer(0, rpm); // Primer registro son las rpm.
node.setTransmitBuffer(1, highWord(potencia)); // Siguiente direccion
node.setTransmitBuffer(2, lowWord(potencia));
result = node.write(0x4520, 3); // Dirección del primer registro y total de 3 a escribir.
//...
}
Yo tendría cuidado con el número de registros a escribir, el UART del Arduino tiene poco tamaño y eso puede afectar a como se envia la trama y, quizás, el receptor no la reciba bien. Aunque una docena de registros no sería mucho problema.
Igualmente cuando haces una llamada readHoldingRegisters, debes especificar la dirección de inicio y leer tantos registros como quieras o sea necesario.
#include <ModbusMaster.h>
ModbusMaster node;
uint16_t rpm;
uint32_t potencia;
void setup() {
Serial.begin(19200);
node.begin(0xF7, Serial);
}
void loop() {
uint8_t result;
result = node.readHoldingRegisters(0x4520,3); // leemos rpm y potencia.
if ( result == node.ku8MBSucess ) {
rpm = node.getResponseBuffer(0); // Primer registro.
uint16_t a, b;
a = node.getResponseBuffer(1);
b = node.getResponseBuffer(2);
potencia = a<<16 | b; // Los unimos para obtener un entero sin signo de 32bits.
}
// ...
}