Go Down

Topic: aiuto modbus rtu (Read 550 times) previous topic - next topic

vinaruino

Jul 17, 2018, 12:11 pm Last Edit: Jul 17, 2018, 12:19 pm by vinaruino
ciao a tutti,
 vorrei usare il mio Arduino Mega per leggere/scrivere mediante Modbus RTU la mia periferica Slave.
Usando un Modbus Scan su Windows, leggo correttamente il registro 8 (valore 128, atteso).
Qui sotto domanda/risposta
[RTU]>Tx >  01  03  00  0A  00  01  A4  08
[RTU]>Rx >  01  03  02  00  80  B9  E4

Se utilizzo la libreria SimpleModbusMaster (ne ho usate altre, ma senza successo), non ottengo nessuna lettura.
L'immagine con l'oscilloscopio mostra un bitstream completamente diverso (e ovviamente il mio Slave non risponde).
https://ibb.co/hQLTzJ

Il modbus è 19200, 8 bit, no parità, 2 bit stop
Sto usando la porta Serial1, i segnali ed il controllo e' correttamente settato.
Qui sotto il codice, modificato dall'esempio della libreria.

grazie per ogni suggerimento.



Code: [Select]

#include <SimpleModbusMaster.h>

/*
   The example will use packet1 to read a register from address 0 (the adc ch0 value)
   from the arduino slave (id=1). It will then use this value to adjust the brightness
   of an led on pin 9 using PWM.
   It will then use packet2 to write a register (its own adc ch0 value) to address 1
   on the arduino slave (id=1) adjusting the brightness of an led on pin 9 using PWM.
*/

//////////////////// Port information ///////////////////
#define baud 19200
#define timeout 1000
#define polling 200 // the scan rate
#define retry_count 10

// used to toggle the receive/transmit pin on the driver
#define TxEnablePin 3

// The total amount of available memory on the master to store data
#define TOTAL_NO_OF_REGISTERS 1

// This is the easiest way to create new packets
// Add as many as you want. TOTAL_NO_OF_PACKETS
// is automatically updated.
enum
{
  PACKET1,
  //PACKET2,
  TOTAL_NO_OF_PACKETS // leave this last entry
};

// Create an array of Packets to be configured
Packet packets[TOTAL_NO_OF_PACKETS];

// Masters register array
unsigned int regs[TOTAL_NO_OF_REGISTERS];

String stringRead;


void setup()
{
  // Initialize each packet
  modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS, 8,TOTAL_NO_OF_REGISTERS , 0);
  //modbus_construct(&packets[PACKET2], 1, PRESET_MULTIPLE_REGISTERS, 1, 1, 0);
 
  // Initialize the Modbus Finite State Machine
  modbus_configure(&Serial1, baud, SERIAL_8N2, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
 
  Serial.begin(19200);
  Serial.println("pronto");
}

void loop()
{
   while (Serial.available() > 0) {
    stringRead = Serial.readString();
    stringRead.toUpperCase();  // converts the input string to upper case

    if(stringRead=="S"){
    modbus_update();

    for(int i=0;i<TOTAL_NO_OF_REGISTERS;i++){
          Serial.print(i);Serial.print(" ");Serial.println(regs[i]);//Or do something else!
        }
    }
   } //while
}

ORSO2001

ciao vinaruino,

tralasciando che ti consiglio la libreria ModbusRTU...tralasciando che ti consiglio di evitare di usare le Stringhe per leggere un carattere (char) dalla seriale di arduino per il comando...secondo me il problema sta nei cablaggi...che modulo stai utilizzando per la connessione? posta un link del trasmettitore ed uno schema di come hai collegato.

vinaruino

grazie Orso,
 per le connessioni ho utilizzato un'interfaccia con MAX485, stesso schema (tranne le 2 resistenze da 680 che non ho in casa) del topic
https://forum.arduino.cc/index.php?topic=176142.660 (attach https://forum.arduino.cc/index.php?action=dlattach;topic=176142.0;attach=181197).

Per le prove con Windows (QModMaster) ho invece usato un adattatore 485-USB.

Mi sai dare un link per la libreria che mi consigli? Ce ne sono diverse, vorrei uniformarmi.

Comunque dalla mia immagine con oscilloscopio sembra che Arduino trasmetta un bit in meno e con i bit invertiti.

grazie

ORSO2001

hai prorpio usato il componente MAX485 o una di quelle schedine già "assemblate"?
ad ogni modo, parlo da profano in elettronica, però io ho avuto il tuo stesso problema in quanto i due device (arduino e PLC) usavano alimentazioni diverse e quindi non avevano gli stessi riferimenti sulla tensione...le resistenze sono un "must"... e posso garantirti che anche con i modulini già assemblati, che ho usato, devi comunque assicurarti che i riferimenti siano corretti "aggiungendo" altre resistenze...in altri post qui nel forum ho allegato uno schemino di cosa faccio io...prova a cercare.

vinaruino

alcune novità. Mi sono accorto di una saldatura mal fatta, ora riesco a vedere domande e risposte ed anche a decodificare qualche simbolo.
Il sistema però non è ancora molto stabile, infatti a volte non leggo nulla, a volte devo ripetere l'invio delle stringhe per avere il dato "corretto".

Continuo a fare prove.
Nel frattempo mi sembra che la ModbusMaster.h funzioni meglio...
grazie


p.s. sto usando il componente MAX485 e ho filato una board.

Go Up