Buongiorno a tutti ho collegato un Arduino Uno R4 WIFI ad un convertitore RS485 DSD TEch (non ha necessita del comando) per comunicare con un multimetro Siemens PAC2200 di cui ho il manuale dove leggere i registri. ho eseguito i collegamenti elettrici inserendo le resistenze richieste dallo schema siemens ma mi da sempre errore modbus FF, allego sketch di test. `
#include <ModbusRtu.h>
// Array di dati per la comunicazione Modbus
uint16_t au16data[2];
// Creazione di un'istanza per il Modbus
Modbus master(0, Serial); // ID 0 per il master; uso della seriale per comunicare
uint8_t slaveID = 10; // ID dello slave, PAC2200
// Struttura per il telegramma Modbus
modbus_t telegram;
void setup() {
Serial.begin(9600); // Inizializza la comunicazione seriale a 9600 baud
master.begin(9600); // Configura Modbus con baud rate 9600
Serial.println("Modbus master inizializzato.");
// Configura il telegramma per leggere i registri holding
telegram.u8id = slaveID; // Indirizzo dello slave
telegram.u8fct = 3; // Codice funzione (3: Read Holding Registers)
telegram.u16RegAdd = 1; // Indirizzo del registro (offset) per UL1-N
telegram.u16CoilsNo = 2; // Numero di registri da leggere (2 per Float)
telegram.au16reg = au16data; // Puntatore all'array dei dati
}
void loop() {
uint8_t result;
// Invia il telegramma
result = master.query(telegram);
// Attendi la risposta e imposta un timeout di 250 ms
unsigned long startTime = millis();
while (millis() - startTime < 250) {
master.poll();
}
// Analizza la risposta Modbus
if (result == 0) { // 0 indica successo
// Converti il valore FLOAT32 della tensione UL1-N
float voltage = *((float*)au16data); // Conversione da 2 registri a FLOAT32
Serial.print("Tensione UL1-N: ");
Serial.print(voltage);
Serial.println(" V");
} else {
// Stampa il codice di errore
Serial.print("Errore Modbus: ");
Serial.println(result, HEX);
Serial.print("ID dello Slave: ");
Serial.println(telegram.u8id);
Serial.print("Codice Funzione: ");
Serial.println(telegram.u8fct);
Serial.print("Indirizzo Registro: ");
Serial.println(telegram.u16RegAdd);
Serial.print("Numero di Registri: ");
Serial.println(telegram.u16CoilsNo);
Serial.print("Dati Ricevuti: ");
for (int i = 0; i < 2; i++) {
Serial.print(au16data[i], HEX);
Serial.print(" ");
}
Serial.println();
}
delay(1000); // Attesa di 1 secondo prima della prossima lettura
}
`