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