Forum: Mikrocontroller und Digitale Elektronik Hilfe bezüglich Modbus


von LaserLuca (Gast)


Lesenswert?

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 Pin2

Der Ausbilder ist Leider nicht da, weshalb ich nicht fragen kann...

folgenden Code hab ich:
1
/**
2
    Modbus master example 1:
3
    The purpose of this example is to query an array of data
4
    from an external Modbus slave device.
5
    The link media can be USB or RS232.
6
7
    Recommended Modbus slave:
8
    diagslave http://www.modbusdriver.com/diagslave.html
9
10
    In a Linux box, run
11
    "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1"
12
    This is:
13
      serial port /dev/ttyUSB0 at 19200 baud 8N1
14
     RTU mode and address @1
15
*/
16
17
#include <ModbusRtu.h>
18
19
// data array for modbus network sharing
20
uint16_t au16data[16];
21
uint8_t u8state;
22
23
/**
24
    Modbus object declaration
25
    u8id : node id = 0 for master, = 1..247 for slave
26
    port : serial port
27
    u8txenpin : 0 for RS-232 and USB-FTDI
28
                 or any pin number > 1 for RS-485
29
*/
30
Modbus master(0, Serial, 2); // this is master and RS-232 or USB-FTDI
31
32
/**
33
   This is an structe which contains a query to an slave device
34
*/
35
modbus_t telegram;
36
37
unsigned long u32wait;
38
39
void setup() {
40
  Serial.begin( 9600 ); // baud-rate at 9600
41
  Serial.println("start");
42
  master.start();
43
  master.setTimeOut( 1000 ); // if there is no answer in 2000 ms, roll over
44
  u32wait = millis() + 1000;
45
  u8state = 0;
46
}
47
48
void loop() {
49
  switch ( u8state ) {
50
    case 0:
51
      if (millis() > u32wait) u8state++; // wait state
52
      break;
53
    case 1:
54
      telegram.u8id = 240; // slave address
55
      telegram.u8fct = 4; // function code (this one is registers read)
56
      telegram.u16RegAdd = 30061; // start address in slave
57
      telegram.u16CoilsNo = 7; // number of elements (coils or registers) to read
58
      telegram.au16reg = au16data; // pointer to a memory array in the Arduino
59
60
      master.query( telegram ); // send query (only once)
61
      u8state++;
62
      break;
63
    case 2:
64
      master.poll(); // check incoming messages
65
      if (master.getState() == COM_IDLE) {
66
        u8state = 0;
67
        u32wait = millis() + 100;
68
      }
69
      break;
70
  }
71
}

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 sowas "8⸮um". Weß jemand was ich falsch mache ?

danke schonmal

Mfg Luca

von (Gast)


Lesenswert?

Ohne das spezielle Gerät oder die verwendeten Arduino-Libs zu kennen 
fällt auf: Adresse 30061 bis 30068 (jeweils inklusive) sind 8 Register, 
nicht 7.

In diesen 8 16 bit Zahlen kann das Datum dann auf verschiedene Arten 
kodiert sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.