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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von ACE (Gast)


Bewertung
0 lesenswert
nicht 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/:
#include <modbus.h>
#include <stdbool.h>
...
// Initializing Modbus-RTU Communication
// Pfad: /dev/ttyUSB0      Baudrate: 9600     Parity: N (none)
// Databit: 8              Stopbit: 1

modbus_t *ctx;   
ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
if (ctx == NULL) 
  printf("Unable to create the libmodbus context\n");

// Slave Adresse bestimmen. <-(Mit wem soll kommuniziert werden?)Bsp. Slave1
modbus_set_slave(ctx, 1);

if (modbus_connect(ctx) == 0) 
  printf("Kommunikationsaufbau war erfolgreich :)\n);
else
  printf("Bitte überprüfen Sie die Verkabelung und die Initializierung.\n);

modbus_set_debug(ctx, true);     //Die Frames werden dargestellt.


// Register 0x100-0x110 aus Gerät mit der Slaveaddr 1 lesen und ausgeben
uint16_t read_data[128];
int i;
if (modbus_read_registers(ctx, 0x100, 16, read_data) > 0){
printf("Lesen war erfolgreich \n");
for (i=0; i < 16; i++) 
{ printf("read_data[%d] = %d  in Dezimal und     (0x%X) in Hexa\n", i, read_data[i], read_data[i]);}}

if (modbus_write_register(ctx, 0x200, 5) > 0)
prinf("Das Register 0x200 wurde mit dem Wert 5 überschrieben. \n");

// Verbindung auflösen
modbus_close(ctx);
modbus_free(ctx);

Die Lese/Schreibe Befehle sind bei der Modbus-TCP Kommunikation gleich.
Die Initzialisierung muss aber angepasst werden.
// Initzialisere TCP-Verbindung mit der Geräte-IP 127.0.1.2 auf Port 1234
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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.