Ok perfetto, ora funziona.
L'unica cosa è quella che riesco a leggere o scrivere solo nove registri.
Ad esempio, se devo leggere o scrivere circa 50 registri cosa dovrei fare ?
Dovrei utilizzare la 0X01 ?
Grazie
per registri cosa intendi?...int...coil?
in pratica tu sai quante cose devi scambiare...ti crei un array sufficientemente lunga da contenere tutto...e tieni presente che un int contiene 16 bit quindi 16 coil.
Buongiorno Orso sto cominciano piano piano a capire il funzionamento.
Per quanto riguarda la parte del vettore ci siamo, ad esempio utilizzando il software seguente:
#include <ModbusRtu.h>
#define ID 1
Modbus slave(ID, 1, 53);
unsigned int registri[40];
void setup() {
delay(1000);
slave.begin( 9600 );
for(byte i=0; i<40; i++){
registri[i] = i;
}
}
void loop() {
slave.poll( registri, 39 );
}
riesco a leggere fino al numero 29.
Dopo ricevo l'errore di "invalid CRC".
ciao...come interroghi lo slave?...registro per registro o a gruppi?
se il CRC è sbagliato vuol dire che i dati arrivati non sono coerenti, od il CRC non è coerente con quello che è arrivato.
una cosa...nello slave.pool...come quantità, se hai un array di 40, non mettere 39 ma metti 40.
fammi sapere
Per quanto riguarda lo slave.pool, avevo fatto diverse prove, successivamente ho fatto una prova con 39 e ho lasciato quello.
Di seguito trovi la foto:
l'errore del CRC te lo da se interroghi da 30 registri in poi giusto?...fino a 29 tutto ok...giusto?
se è così sia per il risultat giusto che per quello sbagliato inviamo copia intera del messaggio che leggi in alto a destra...la serie di doppi numeri
Di seguito il link con le foto da te richieste:
Foto
se mi fai un copia ed incolla dei valori è meglio...tutta la stringa che ricevi
Ecco la risposta funzionante:
01 03 3a 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 00 0b 00 0c 00 0d 00 0e 00 0f 00 10 00 11 00 12 00 13 00 14 00 15 00 16 00 17 00 18 00 19 00 1a 00 1b 00 1c 4f 1f
Di seguito trovi la risposta di quando leggo tutti e 40 registri:
01 03 3a 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 00 0b 00 0c 00 0d 00 0e 00 0f 00 10 00 11 00 12 00 13 00 14 00 15 00 16 00 17 00 18 00 19 00 1a 00 1b 00 1c 4f 1f
01 03 4e 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0a 00 0b 00 0c 00 0d 00 0e 00 0f 00 10 00 11 00 12 00 13 00 14 00 15 00 16 00 17 00 18 00 19 00 1a 00 1b 00 1c 00 1d 00 53 00 1f 00 20 00 21 00 22 00 23 00 24 00 25 00 26 49 07
Inoltre ho eseguito un'altra prova, prima ho letto i registri che vanno dallo 0 fino al 29 e successivamente dal 29 fino al 39.
Con due richieste ho letto tutti i registri.
Non vorrei che posso leggere soltanto 30 registri per volta ?
ciao...allora c'è un #define MAX_BUFFER 64 che limita il buffer ...penso sia per la UNO...l'ho modificato con 255 e riesco a leggere fino a 120 registri...dovrebbe essere il massimo possibile
Ciao ORSO,
il buffer l'ho messo a 128 byte e penso che mi potrà bastare.
Per quanto riguarda l'ID dello slave, visto che può essere dinamico, non lo posso lasciare fuori dal void setup ma lo dovrò dichiarare al suo interno.
Ho provato diverse funzioni, come ad esempio "slave.getID", ma purtroppo non ci sono riuscito.
hmm..."get" = avere...."set" = impostare...prova con setID(uint8_t ID).
Ok perfetto.
Ti ringrazio
Sintassi:
slave.setID(IDslave);