Forum: PC Hard- und Software MODBUS - CAN -.für Anfänger (inkl. Programmcode in C)


von ACE (Gast)


Lesenswert?

Grüße euch herzlich :)

Rs485 und CAN ist in der Industrie sehr stark vertreten. Beide haben das 
Vorteil, dass die Verkabelung und Kommunikationsprotokoll sehr einfach 
sind (sobald man diese einmal versteht).

Wie die jeweiligen Daten-Frames aussehen werde ich hier in kürze 
ergänzen.

Fangen wir mit MODBUS-RTU (RS485) Programm-Code an. Hierfür kann 
Libmodbus (ist eine open source lib.) verwendet werden.
schaue zu Hilfe: https://libmodbus.org/docs/v3.1.6/:
1
#include <modbus.h>
2
#include <stdbool.h>
3
...
4
// Initializing Modbus-RTU Communication
5
// Pfad: /dev/ttyUSB0      Baudrate: 9600     Parity: N (none)
6
// Databit: 8              Stopbit: 1
7
8
modbus_t *ctx;   
9
ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
10
if (ctx == NULL) 
11
  printf("Unable to create the libmodbus context\n");
12
13
// Slave Adresse bestimmen. <-(Mit wem soll kommuniziert werden?)Bsp. Slave1
14
modbus_set_slave(ctx, 1);
15
16
if (modbus_connect(ctx) == 0) 
17
  printf("Kommunikationsaufbau war erfolgreich :)\n);
18
else
19
  printf("Bitte überprüfen Sie die Verkabelung und die Initializierung.\n);
20
21
modbus_set_debug(ctx, true);     //Die Frames werden dargestellt.
22
23
24
// Register 0x100-0x110 aus Gerät mit der Slaveaddr 1 lesen und ausgeben
25
uint16_t read_data[128];
26
int i;
27
if (modbus_read_registers(ctx, 0x100, 16, read_data) > 0){
28
printf("Lesen war erfolgreich \n");
29
for (i=0; i < 16; i++) 
30
{ printf("read_data[%d] = %d  in Dezimal und     (0x%X) in Hexa\n", i, read_data[i], read_data[i]);}}
31
32
if (modbus_write_register(ctx, 0x200, 5) > 0)
33
prinf("Das Register 0x200 wurde mit dem Wert 5 überschrieben. \n");
34
35
// Verbindung auflösen
36
modbus_close(ctx);
37
modbus_free(ctx);

Die Lese/Schreibe Befehle sind bei der Modbus-TCP Kommunikation gleich.
Die Initzialisierung muss aber angepasst werden.
1
// Initzialisere TCP-Verbindung mit der Geräte-IP 127.0.1.2 auf Port 1234
2
ctx = modbus_new_tcp("127.0.1.2", 1234);

Erweiterungen werden folgen. Bis dahin kann die Community einige 
wichtige Informationen zu Modbus ergänzen und vielleicht auch mit der 
CAN-Bus anfangen.

Mit freundlichen Grüßen.
#NachbarHilftNachbar

von MaWin (Gast)


Lesenswert?

ACE schrieb:
> Erweiterungen werden folgen

Hoffentlich, aber wie wäre es, dazu einen Artikel im Wiki anzulegen, in 
dem nicht nur der Code auf PC Seite, sondern passend zum Forum auch der 
Code des Client auf Microcontrollerseite gezeigt wird.
Modbus ist schön, aber wenn man der Doku folgt implementiert man viel zu 
viel, reale Geräte funktionieren auch mit einem Subset, bloss steht in 
der Doku nicht, was mindestens nötig ist, damit es z.B. unter NI LabView 
funktioniert.

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.