easy-forum
Deutsch - Hardware => easyE4 => Thema gestartet von: jbrommund 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?
-
hallo,
könnte es sein dass du im falschen Forum bist?
Falls nicht, bitte um nähere Informationen :o
-
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.
-
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);
}
-
... 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 :'(
-
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');*