Problemi con modbus rtu

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
}
`

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

ciao...puoi mettere un link alla libreria che stai usando?

Ciao Andrea e grazie per l’interessamento! Ho provato con include <ModbusRtu.h>

Scusami dalla fretta di risponderti ho omesso la fonte ….comunque l’ho scaricata qui: Modbus-Master-Slave-for-Arduino/ModbusRtu.h at master · smarmengol/Modbus-Master-Slave-for-Arduino · GitHub

Non conosco quella libreria (piuttosto vecchia)

Ma al link della libreria, se vedi il codice della libreria stessa, riga 129
"Modbus-Master-Slave-for-Arduino/ModbusRtu.cpp at master · smarmengol/Modbus-Master-Slave-for-Arduino · GitHub"

c'e' scritto: "Call this AFTER calling begin() on the serial port, typically within setup()."
e si riferisce al comando void Modbus::start() che tu non chiami nel tuo codice.

e nel codice della libreria (il file .h) c'e' scritto per la begin():

// Deprecated: Use "start()" instead.
void begin(long u32speed = 19200) __attribute__((deprecated));

Non riesco a risolvere il problema continuo ad avere problemi di comunicazione mi da errore modbus… io ho un Arduino R4 wifi conRs485 e multimetro Siemens Pac2200 con modbus Rtu 485 non so proprio cosa fare….help!!!

Io mi sono trovato bene con le librerie di questo utente:

In particolare è molto utile lo sketch di esempio ModbusRTUMasterProbe.ino che ti consente di testare rapidamente il tuo setup con l'uso di un menu a scelta basato sull'input da seriale.

hai provato ad interrogare il multimetro con un altro master modbus...un PC con un convertitore USB-RS485?
altresì...hai provato ad interrogare qualche altro dispositivo con arduino?