Max13487 rs485 - tll

Buonasera a tutti,
sono nuovo del forum e alle prime armi, mi chiamo Christian e sto provando a realizzare un progetto ma sto incontrando un problema a cui Google non sa rispondere.

Utilizzo un Arduino Uno Rev3 dotato di Ethernet Shield. E’ mia intenzione utilizzare l’Arduino come Modbus Master per leggere i valori di una sonda industriale utilizzata per misurare un flusso di aria compressa. Questa sonda comunica in Modbus RS485.

Ho acquistato una scheda DSD TECH SH-U12 RS485-TLL 5V con chip MAX13487 e l’ho collegata ai pin 5V / GND per alimentarla e tramite libreria SoftwareSerial.h ho identificato il PIN 2 come pin RX d il pin 3 come pin TX. All’altro capo del modulo ho collegato i due fili Modbus A+ e B- della sonda di portata.

Smanettando su internet ho tagliato, copiato ed utilizzato un po’ di codici cercando di adattarli al mio progetto, ma purtroppo il risultato che ottengo è sempre e solo il fastidiosissimo valore di 226.
Qualcuno è in grado di aiutarmi? Esiste una guida che possa spiegarmi come utilizzare questo modulo RS485? Avete un esempio di codice per leggere un registro Modbus dopo aver creato la seriale?

/*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 2 (connect to TX of other device)
 * TX is digital pin 3 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

 */
#include <SoftwareSerial.h>
#include <ModbusMaster.h>

SoftwareSerial mySerial(2, 3); // RX, TX
ModbusMaster node;

void setup()
{
  delay(500);
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Native USB only
  }


  //Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);  
  node.begin(1, mySerial);
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
    mySerial.println(node.readHoldingRegisters(1008, 2));
    Serial.println(node.readHoldingRegisters(1008, 2));
}

Grazie mille.
Christian

Buonasera e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nel rispetto del suddetto regolamento nessuno ti risponderà, quindi ti consiglio di farla al più presto. :wink:

Porca miseria,
sapevo di aver dimenticato qualcosa… provvedo subito! :slight_smile:

Grazie mille.
Christian

La libreria gestisce le chiamate al dispositivo seriale. Questo è un test e un esempio funzionante, incerto sul registro 1008 specificato. Dovrebbe funzionare se il tuo indirizzo e la tua funzione sono corretti.


#include <SoftwareSerial.h>
#include <ModbusMaster.h>

SoftwareSerial ssSerial(2, 3); // RX, TX
ModbusMaster node;

void setup()
{
  // start console
  Serial.begin(9600);
  // and modbus serial
  ssSerial.begin(9600);

  // Modbus slave ID 1
  node.begin(1, ssSerial);
}

void loop()
{
  uint8_t result;
  uint16_t data[6];

  // slave: read (2) 16-bit registers starting at register 1008 to RX buffer
  //
  result = node.readHoldingRegisters(1008, 2);
  // print data if read is successful
  if (result == node.ku8MBSuccess)
  {
    for (int j = 0; j < 2; j++)
    {
      Serial.println(node.getResponseBuffer(j));
    }
    Serial.println("");
  }
  else
  {
    Serial.print("Fail: ");
    Serial.println(result);
  }
  delay(500);
}

Ma non sarebbe preferibile aggiungere una resistenza di terminazione al bus?

Dalgli "esperimenti" che ho fatto su quelle schedine (tre tipi) la resistenza è addirittura dannosa se i fili sono corti. Ho dovuto dissaldare le R7 da 120 ohm su tutte QUESTE schedine altrimenti non funzionavano. Altri tipi di schedine infatti non le hanno.

Ti consiglio di vedere i video di ALIVERTI su Youtube. A me hanno aperto un mondo sulla RS485 !

Grazie a tutti per le risposte, chiedo scusa se non ho dato riscontro prima ma sono stato in trasferta per lavoro e non ho avuto molto tempo. Proverò quanto consigliato e vi farò sapere!
Grazie ancora

Buonasera,
riprendo l'argomento perché ad oggi non ho trovato soluzioni, non esiste su internet una procedura relativa al modulo seriale RS485 MAX13487 TLL e nemmeno uno sketch di esempio.

Ho provato ad utilizzare la <ModbusMaster.h> e la <SoftwareSerial.h> ma nulla da fare... non riesco proprio a capire come si usa questo modulino con il controllo automatico del flusso.

Qualcuno lo ha già utilizzato?
Ha dei consigli da darmi?

Grazie mille.
Christian

Buonasera community,
scrivo perché sono due mesi che divento matto con questo modulo.

Vorrei creare uno sketch che mi permetta di utilizzare Arduino come ModBus Master per leggere i valori di un sensore industriale dotato di uscita Modbus RS485-RTU.
Ho acquistato il modulo descritto nel titolo ma purtroppo non riesco proprio a capire come funziona. A differenza delle schede con chip MAX485, questa non ha i pin di controllo DE/RE e su internet non ci sono guide o altre informazioni che mi facciano capire come funziona.

Qualcuno di voi ha per caso avuto modo di utilizzare questa scheda?
Se sì, il mio obiettivo è quello di leggere alcuni registri Modbus dal sensore industriale (Modbus slave) trami funzione readHoldingRegisters, ma dopo vari tentativi riesco ad ottenere sempre e solo il risultato 216, chiaramente un errore.

Ho provato anche a settarla come MAX485, in questo caso i Led TX e RX si illuminano. Sembrava un buon passo avanti, ma in realtà non ho ottenuto nulla.

Mi affido alla vostra esperienza.

Grazie mille.
Christian.

@sisero86 : Da REGOLAMENTO NON è permesso aprire più topic per lo stesso argomento (cross-posting) ... per cui ho riunito il nuovo che hai aperto con il vecchio in cui già discutevi della questione.

Guglielmo