Ciao,
sto cercando di comunicare tramite adattatore TTL/RS485 con un flussimetro con std modbus RTU, di per sè la comunicazione funziona, riscontro però dei problemi nella conversione dei dati e nella velocità di lettura, procedendo con ordine:
-Arduino Mega
-Convertitore TTL/RS485 (half-duplex, con MAX1346)
-Flussimetro nativo full-duplex (un red-y da banco),
-comunicazione con 9600,8 N,2
-cablaggio da half-duplex a full-duplex
Il mio codice è questo:
//riadattamento dell'esempio "basic" della libreria
#include <ModbusMaster.h>
// instantiate ModbusMaster object
ModbusMaster node;
int del=1000;
unsigned long previousMillis = 0;
void setup()
{
// use Serial (port 0); initialize Modbus communication baud rate
Serial1.begin(9600,SERIAL_8N2);
Serial.begin(9600);
// communicate with Modbus slave ID 2 over Serial (port 0)
node.begin(141, Serial1);
}
void loop()
{
static uint32_t i;
uint8_t j, result;
uint16_t data[6];
i++;
// set word 0 of TX buffer to least-significant word of counter (bits 15..0)
//node.setTransmitBuffer(0, lowWord(i));
// set word 1 of TX buffer to most-significant word of counter (bits 31..16)
node.setTransmitBuffer(1, highWord(i));
// slave: write TX buffer to (2) 16-bit registers starting at register 0
//result = node.writeMultipleRegisters(0, 2);
// slave: read (6) 16-bit registers starting at register 2 to RX buffer
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= del){
previousMillis = currentMillis;
result = node.readHoldingRegisters(0, 4);
if (result == node.ku8MBSuccess){
Serial.print(node.getResponseBuffer(0));
Serial.print(" ");
Serial.print(node.getResponseBuffer(1));
Serial.print(" ");
Serial.print(node.getResponseBuffer(2));
Serial.print(" ");
Serial.println(node.getResponseBuffer(3));
}
}
}
Non riesco a capire come convertire il valore ricevuto in decimale (con ModbusPoll converto il valore riportato nella terza colonna,16869,da F32 a big-endian e ottengo il valore corretto di temperatura 26.2 °C)
questo un esempio di output a seriale:
17:39:12.066 -> 0 0 16869 44424
17:39:13.073 -> 0 0 16869 44424
17:39:14.080 -> 0 0 16869 44424
17:39:15.049 -> 0 0 16869 44424
17:39:16.058 -> 0 0 16869 44424
17:39:17.064 -> 0 0 16869 44424
17:39:18.071 -> 0 0 16869 44424
17:39:19.074 -> 0 0 16869 44424
17:39:20.082 -> 0 0 16869 44424
17:39:21.091 -> 0 0 16869 45548
17:39:22.062 -> 0 0 16869 45548
17:39:30.076 -> 0 0 16869 46672
17:39:31.082 -> 0 0 16869 46672
17:39:32.094 -> 0 0 16869 46672
In allegato c'è una spiegazione dei registri, fornita dal produttore.
Vorrei capire come poter fare a trasformare i dati inviati dal flussimetro in valori numerici, purtroppo non sono molto ferrato nel campo, ho letto che la conversione dovrebbe essere fatta secondo lo standard IEEE754 ma non so proprio come iniziare.
Qualcuno può aiutarmi?
una seconda domanda, come potete vedere dal timestamp molto spesso ci sono degli arresti improvvisi di qualche secondo,che si ripetono ad intervalli quasi regolari, non capisco perchè..dove può stare il collo di bottiglia?C'è forse un modo migliore leggere i valori dei registri?
Grazie,
Paolo