Hi Forum,
ich habe ein Projekt bekommen wo ich etwas mit einem Modbus rumprobieren soll. Ich habe ein Arduino nano, einen RS-485 Adapter und das Gerät wo der A und B Anschluss vom Modbus rausgeführt ist.
A und B vom RS-485 Adapter hängen an dem Gerät, R0 ist RX, D1 ist an TX und DE+RE ist an Pin7
Der Ausbilder ist Leider nicht da, weshalb ich nicht fragen kann...
folgenden Code hab ich:
/**
Modbus master example 2:
The purpose of this example is to query several sets of data
from an external Modbus slave device.
The link media can be USB or RS232.
Recommended Modbus slave:
diagslave http://www.modbusdriver.com/diagslave.html
In a Linux box, run
"./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1"
This is:
serial port /dev/ttyUSB0 at 19200 baud 8N1
RTU mode and address @1
*/
//// http://pdacontrol.blogspot.com.co/2016/03/pruebas-libreria-modbus-rtu-maestro-con.html
#include <ModbusRtu.h>
uint16_t au16data[32]; //!< data array for modbus network sharing Array
uint8_t u8state; //!< machine state
uint8_t u8query; //!< pointer to message query
/**
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, 0, 7); // this is master and RS-232 or USB-FTDI /// 7 = PIN ENEABLE rs485
/**
This is an structe which contains a query to an slave device
*/
modbus_t telegram[2];
unsigned long u32wait;
void setup() {
Serial.begin(9600);
//////////////////////////////
// telegram 0: read registers
telegram[0].u8id = 240; // slave address
telegram[0].u8fct = 4; // function code (registers read multiple 3)
telegram[0].u16RegAdd = 30061; // start address in slave - direccion de Inicio 0
telegram[0].u16CoilsNo = 7; // number of elements (coils or registers) to read 0 - 16
telegram[0].au16reg = au16data; // pointer to a memory array in the Arduino - Almacenamiento en Array de memoria de arduino
// telegram 1: write a multiple register = function 16
telegram[1].u8id = 1; // slave address
telegram[1].u8fct = 16; // function code (write multiple registers 16 )
telegram[1].u16RegAdd = 10; // start address in slave - direccion de Inicio 10
telegram[1].u16CoilsNo = 10; // number of elements (coils or registers) to read
telegram[1].au16reg = au16data + 10; // pointer to a memory array in the Arduino - Almacenamiento en Array de memoria de arduino 10 posiciones despues
master.begin( 9600 ); // baud-rate at 19200
master.setTimeOut( 5000 ); // if there is no answer in 5000 ms, roll over
u32wait = millis() + 1000;
u8state = u8query = 0;
}
void loop() {
switch ( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // wait state
break;
case 1:
master.query( telegram[u8query] ); // send query (only once)
u8state++;
u8query++;
if (u8query > 2) u8query = 0;
break;
case 2:
master.poll(); // check incoming messages
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 1000;
}
break;
}
//Read Multiple Holding Register - Lectura de multiples registros
Serial.print(au16data[0]); // Read Holding Register [0]
Serial.print(au16data[1]); // Read Holding Register [1]
Serial.print(au16data[2]); // Read Holding Register [2]
Serial.print(au16data[3]); // Read Holding Register [3]
Serial.println(au16data[4]); // Read Holding Register [4]
Serial.print(au16data[5]); // Read Holding Register [5]
Serial.print(au16data[6]); // Read Holding Register [6]
Serial.print(au16data[7]); // Read Holding Register [7]
Serial.print(au16data[8]); // Read Holding Register [8]
Serial.println(au16data[9]); // Read Holding Register [9]
//Write Multiple Holding Register - Escritura de multiples registros
au16data[10] = analogRead( 0 ); // Write Holding Register [10]
au16data[11] = analogRead( 0 ); // Write Holding Register [11]
au16data[12] = analogRead( 0 ); // Write Holding Register [12]
au16data[13] = analogRead( 0 ); // Write Holding Register [13]
au16data[14] = analogRead( 0 ); // Write Holding Register [14]
au16data[15] = analogRead( 0 ); // Write Holding Register [15]
au16data[16] = analogRead( 0 ); // Write Holding Register [16]
au16data[17] = analogRead( 0 ); // Write Holding Register [17]
au16data[18] = analogRead( 0 ); // Write Holding Register [18]
au16data[19] = analogRead( 0 ); // Write Holding Register [19]
Serial.print(au16data[10]);
Serial.print(au16data[11]);
Serial.print(au16data[12]);
Serial.print(au16data[13]);
Serial.print(au16data[14]);
Serial.print(au16data[15]);
Serial.print(au16data[16]);
Serial.print(au16data[17]);
Serial.print(au16data[18]);
Serial.println(au16data[19]);
delay(1000);
}
außerdem hab ich diese Daten für den Code bekommen:
"
9600 baud
8 Datenbits
1 Stoppbit
Keine Parität
Slave (Gerät) ID: 240
Adresse 30061 bis 30068
Funktionscode: 4
"
Die Rückantwort soll dann ein datum. Z.B. 16.07.2020 sein jedoch bekomme ich nur eine ellenlange Zahl. Weß jemand was ich falsch mache ?
Ich habe auch schon statt Pin7 den Pin A0 genommen weil im Code analogRead steht, was ich nicht verstehe, hat aber auch nichts gebracht.
danke schonmal
Mfg Luca