Hi Leute,
vielen Dank für eure Antworten.
@ArduFE & agmue:
Habe D9_CTRL mal ausprobiert. D2 und D3 auf dem Shield gebrückt, P2 2-3 gebrückt (D9_CTRL) mit folgendem Code und als das nicht funktionierte genau das selbe mit gleichem Code mit P2 1-2 (TX_CTRL) laufen lassen - selbes Resultat:
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
ModbusMaster node;
#define MAX485_DE 9
SoftwareSerial mySerial(2, 3);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
node.begin(1, mySerial);
}
void loop() {
uint8_t result;
digitalWrite(MAX485_DE, HIGH);
result = node.readHoldingRegisters(1, 1);
delay(1000);
digitalWrite(MAX485_DE, LOW);
if (mySerial.available())
{
Serial.print("test_mySerial");
}
if (result == node.ku8MBSuccess)
{
Serial.print("test_node");
}
delay(1000);
}
Ich betrachte hier nun die Fälle mySerial.available() und result == node.ku8MBSuccess seperat um ihr Verhalten zu untersuchen.
if (mySerial.available()) ist nur dann erfüllt, wenn ich D2 und D3 selber vorher High und danach Low schalte. Nur dann springt die Spannung an den TX und RX Ausgängen des Shields auch zwischen 3 V (HIGH) und 0.65 V (LOW) (gemessen mim Multimeter). Sowohl mit TX_CTRL als auch mit D9_CTRL sind weder if (mySerial.available()) noch eine Spannungsänderung an den Ausgängen erfüllt.
An dieser Stelle muss ich mich fragen, was TX_CTRL und D9_CTRL dann überhaupt für einen Sinn haben. Wenn einer der beiden für RE und DE zuständig wäre, warum gibt es dann keine Spannungsänderung?
if (result == node.ku8MBSuccess) ist in keinem der Fälle erfüllt...
Das ist mein derzeitiger Stand.
Übersehe ich irgendetwas?
Ich habe es mal mit der von dir vorgeschlagenen <ModbusRtu.h> Lib probiert. Hier kriege ich alle 2 Sekunden eine 0 ausgegeben bei Serial.println(au16data[0]);. Auch hier habe ich es mit TX_CTRL und D9_CTRL versucht, in beiden Fällen kommen 0er raus. Hier deute ich das ebenso, dass ich den Sensor nicht ansprechen kann.
#include <ModbusRtu.h>
#include <SoftwareSerial.h>
// data array for modbus network sharing
uint16_t au16data[16];
uint8_t u8state;
/**
* Modbus object declaration
* u8id : node id = 0 for master, = 1..247 for slave
* u8serno : serial port (use 0 for Serial)
* u8txenpin : 0 for RS-232 and USB-FTDI
* or any pin number > 1 for RS-485
*/
Modbus master(0); // this is master and RS-232 or USB-FTDI
/**
* This is an structe which contains a query to an slave device
*/
modbus_t telegram;
unsigned long u32wait;
SoftwareSerial mySerial(2, 3); // Pins 4 and 5 for serial communication
void setup() {
Serial.begin(9600);//use the hardware serial if you want to connect to your computer via usb cable, etc.
master.begin( &mySerial, 9600 ); // begin the ModBus object. The first parameter is the address of your SoftwareSerial address. Do not forget the "&". 9600 means baud-rate at 9600
master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
u32wait = millis() + 1000;
u8state = 0;
}
void loop() {
switch( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // wait state
break;
case 1:
telegram.u8id = 1; // slave address
telegram.u8fct = 3; // function code (this one is registers read)
telegram.u16RegAdd = 1; // start address in slave
telegram.u16CoilsNo = 1; // number of elements (coils or registers) to read
telegram.au16reg = au16data; // pointer to a memory array in the Arduino
master.query( telegram ); // send query (only once)
u8state++;
break;
case 2:
master.poll(); // check incoming messages
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 2000;
Serial.println(au16data[0]);//Or do something else!
}
break;
}
}
Viele Gruesse
Winterwurst