Autor Thema: Modbus Verbindung PC -> easy-E4  (Gelesen 3850 mal)

Offline jbrommund

  • Newbie
  • *
  • Beiträge: 10
Modbus Verbindung PC -> easy-E4
« am: August 20, 2020, 12:29:45 Nachmittag »
#include <stdio.h>
#include <errno.h>
#include <modbus.h>

int main(void) {
  modbus_t *mb;
  int rc;

  mb = modbus_new_tcp("192.168.80.11", 502);
  modbus_connect(mb);
  if (mb == NULL) {
    fprintf(stderr, "Unable to allocate libmodbus context\n");
    return -1; }

  rc = modbus_write_register(mb, 2, 1);
  printf ("rc= %d \n", rc);
if (rc == -1) {
    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
    return -1; }
           
  modbus_close(mb);
  modbus_free(mb);
}

Mit diesem Programm bekomme ich die Fehlermeldung "Illegal data address".
Was ist falsch?

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Modbus Verbindung PC -> easy-E4
« Antwort #1 am: August 20, 2020, 13:45:46 Nachmittag »
hallo,
könnte es sein dass du im falschen Forum bist?
Falls nicht, bitte um nähere Informationen  :o
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline jbrommund

  • Newbie
  • *
  • Beiträge: 10
Antw:Modbus Verbindung PC -> easy-E4
« Antwort #2 am: August 20, 2020, 16:32:48 Nachmittag »
Im easyE4-Handbuch ist Modbus-TCP beschrieben. modbus_read_bits, modbus_read_input_bits und modbus_read_registers funktioniert auch. Aber modbus_write_... leider bei mir nicht.

Offline jbrommund

  • Newbie
  • *
  • Beiträge: 10
Antw:Modbus Verbindung PC -> easy-E4
« Antwort #3 am: August 21, 2020, 11:43:38 Vormittag »
Das modbus-Programm läuft auf Linux-Ubuntu 16.04.
libmodbus wurde installiert:  sudo apt-get install libmodbus-dev
Es wird compiliert:  gcc -Wall $1.c -o $1 `pkg-config --cflags --libs libmodbus`
Dieses Programm funktioniert:
#include <stdio.h>
#include <modbus.h>

int main(void) {
modbus_t *ctx;
uint16_t tab_reg[64];
int rc;
int i;

ctx = modbus_new_tcp("192.168.80.11", 502);
if (modbus_connect(ctx) == -1) {
    fprintf(stderr, "Connection failed: \n");
    modbus_free(ctx);
    return -1;
}

rc = modbus_read_registers(ctx, 1, 5, tab_reg);

   printf ("rc= %i \n",rc);

for (i=0; i < 5; i++) {
    printf("reg[%d]=%d \n", i, tab_reg);
}

modbus_close(ctx);
modbus_free(ctx);

}

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:Modbus Verbindung PC -> easy-E4
« Antwort #4 am: August 21, 2020, 11:49:58 Vormittag »
... danke für die Info, evtl. kann hier jemand mehr dazu sagen (schreiben) ...
ich klinke mich an dieser Stelle aus da alle Ideen meinerseits höchst spekulativ wären, sorry  :'(
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline jbrommund

  • Newbie
  • *
  • Beiträge: 10
Antw:Modbus Verbindung PC -> easy-E4
« Antwort #5 am: August 21, 2020, 19:05:38 Nachmittag »
Der Fehler liegt in der Adressierung. Mit modbus_write_register(s) werden die Wort-Merker gesetzt, deren Adressen mit 1001 beginnen. Die nachfolgenden Programme setzen einen einzelnen Wort-Merker oder eine Gruppe derer.

#include <stdio.h>
#include <modbus.h>
#include <errno.h>

int main(void) {
modbus_t *ctx;

int rc;

ctx = modbus_new_tcp("192.168.80.11", 502);
if (modbus_connect(ctx) == -1) {
    fprintf(stderr, "Connection failed: \n");
    modbus_free(ctx);
    return -1;
}

rc = modbus_write_register(ctx, 1001, 4711);

   printf ("rc= %i \n",rc);
if (rc == -1) {
    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
    return -1; }

modbus_close(ctx);
modbus_free(ctx);
}
// int modbus_write_register(modbus_t *ctx, int addr, int value);

#include <stdio.h>
#include <modbus.h>
#include <errno.h>

int main(void) {
modbus_t *ctx;
uint16_t mwreg[] = {4411,5522,6633,7744,8855,9966};

int rc;

ctx = modbus_new_tcp("192.168.80.11", 502);
if (modbus_connect(ctx) == -1) {
    fprintf(stderr, "Connection failed: \n");
    modbus_free(ctx);
    return -1;
}

rc = modbus_write_registers (ctx, 1001, 6, mwreg);

   printf ("rc= %i \n",rc);
if (rc == -1) {
    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
    return -1; }

modbus_close(ctx);
modbus_free(ctx);
}
// *int modbus_write_registers(modbus_t *'ctx', int 'addr', int 'nb', const uint16_t *'src');*