Bene, ORSO2001, grazie per la risposta.
Seconda giornata di prove su quacosa che fino a tre giorni fa era SCONOSCIUTO e stavo benissimo così! 
Sto usando un clone FX3u di cui ho piena fiducia e mi ha dato TANTE SODDISFAZIONI.
La porta RS-485 (due semplici morsetti A e B) FUNZIONA.
Su Arduino, grazie ai video di Aliverti, ho realizzato un programma che SCRIVE i relè ausiliari (tipo M) e le variabili (tipo D) SENZA PROBLEMI.
E già sono al settimo cielo perché mi si apre un mondo che io non conoscevo e che adesso conosco.
Ho problemi a leggere.
Il semplice programma di Aliverti su Arduino:
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
SoftwareSerial RS485Serial(10, 11);
#define MAX485_DE_RE 13
ModbusMaster node;
int ret = 0;
void preTransmission () {
digitalWrite (MAX485_DE_RE, HIGH);
}
void postTransmission () {
digitalWrite (MAX485_DE_RE, LOW);
}
void setup() {
pinMode (MAX485_DE_RE, OUTPUT);
digitalWrite (MAX485_DE_RE, LOW);
Serial.begin (9600);
RS485Serial.begin (9600);
node.begin (1, RS485Serial);
node.preTransmission (preTransmission);
node.postTransmission (postTransmission);
}
void loop() {
ret = node.readDiscreteInputs (0x0, 16);
if (ret == node.ku8MBSuccess) {
unsigned int nn = node.getResponseBuffer (0);
Serial.println (nn);
}
else Serial.println ("Errore");
delay (10);
}
mi ritorna errore. E questo succede anche se leggo i COILS.
Allora ho cercato QUALE errore con questo programma:
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
SoftwareSerial RS485Serial(10, 11);
#define MAX485_DE_RE 13
ModbusMaster node;
int i = 0;
int ret = 0;
bool M1 = LOW;
bool M100 = HIGH;
bool M1000 = LOW;
void preTransmission () {
digitalWrite (MAX485_DE_RE, HIGH);
}
void postTransmission () {
digitalWrite (MAX485_DE_RE, LOW);
}
void setup() {
pinMode (MAX485_DE_RE, OUTPUT);
digitalWrite (MAX485_DE_RE, LOW);
Serial.begin (9600);
RS485Serial.begin (9600);
node.begin (1, RS485Serial);
node.preTransmission (preTransmission);
node.postTransmission (postTransmission);
}
void loop() {
ret = node.readCoils (0x0, 8); // read M
delay (10);
if (ret == node.ku8MBSuccess) {
unsigned int nn = node.getResponseBuffer (0);
Serial.println (nn);
}
if (ret == node.ku8MBIllegalFunction) Serial.println ("IllegalFunction");
if (ret == node.ku8MBIllegalDataAddress) Serial.println ("IllegalDataAddress");
if (ret == node.ku8MBIllegalDataValue) Serial.println ("IllegalDataValue");
if (ret == node.ku8MBSlaveDeviceFailure) Serial.println ("SlaveDeviceFailure");
if (ret == node.ku8MBInvalidSlaveID) Serial.println ("InvalidSlaveID");
if (ret == node.ku8MBInvalidFunction) Serial.println ("InvalidFunction");
if (ret == node.ku8MBResponseTimedOut) Serial.println ("ResponseTimedOut");
if (ret == node.ku8MBInvalidCRC) Serial.println ("InvalidCRC");
/*
ret = node.writeSingleCoil (0x1, M1); // set M1
M1 = !M1;
delay (10);
ret = node.writeSingleCoil (0x64, M100); // set M1
M100 = !M100;
delay (10);
ret = node.writeSingleCoil (0x3e8, M100); // set M1
M1000 = !M1000;
delay (10);
*/
}
e la risposta è InvalidSlaveID
Ma la cosa non ha senso perché col pezzo di programma sotto, in SCRITTURA, l'errore non c'è e i coils vengono regolarmente scritti (ho visto che i delay sono molto importanti).
Hai qualche idea?