libmodbus problema con la lectura del esclavo

0

Tengo el siguiente código para conectarme a un sensor de temperatura como mi esclavo usando la biblioteca libmodbus en C,

#include <stdio.h>
#include <stdlib.h>
#include <modbus.h>
#include <errno.h>
int main()
{
  struct timeval old_response_timeout;
  struct timeval response_timeout;
  modbus_t *ctx = NULL;
  int rc = 0;
  uint16_t tab_reg[64];
  int i = 0;
  int slave = 0;
  int connected = 0;
  int serial = 0;
  ctx = modbus_new_rtu("/dev/ttyS1", 9600, 'E', 8, 1);
  if (ctx == NULL) {
    fprintf(stderr, "Unable to create the libmodbus context\n");
    return -1;
  }
  modbus_set_debug(ctx, 1);
  modbus_get_response_timeout(ctx, &old_response_timeout);
  response_timeout.tv_sec = 10;
  response_timeout.tv_usec = 0;
  modbus_set_response_timeout(ctx, &response_timeout);
  modbus_set_byte_timeout(ctx, &response_timeout);

  slave = modbus_set_slave(ctx,247);

  if(slave == -1)
    printf("Didn't connect to slave/n");

  connected = modbus_connect(ctx);

  if(connected == -1)
    printf("Connection failed\n");
  if(connected == 0)
    printf("connected\n");
  //serial = modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
  //if(serial == -1)
  //  printf("Didn't set serial mode/n:%s\n",modbus_strerror(errno));
  rc = modbus_read_registers(ctx,0x27,2,tab_reg);

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

  for(i=0;i<rc;i++)
    printf("degrees %d\n", tab_reg[i]);

  return 0;
}

Falla en la siguiente sección de código,

  rc = modbus_read_registers(ctx,0x27,2,tab_reg);

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

con un tiempo de espera de conexión. ¿Podría ser esto debido a que configuré la conexión al dispositivo modbus de manera incorrecta, o hay algún problema en la biblioteca libmodbus que alguien sepa que pueda estar causando esto? Estoy usando este dispositivo enlace en Redhat Linux 6.5.

    
pregunta jgr208

1 respuesta

1

Es extraño que use 9600 bps ... la mayoría de los dispositivos modbus que he visto usan 19200 bps. Podría probarlo con la herramienta MODPOLL para ver si puede comunicarse con él y, si lo hace, publicar los parámetros que demostraron estar funcionando.

Como usted probablemente sepa, hay dos protocolos básicos de modbus, MODBUS / ASCII y MODBUS / RTU. No encontré en la hoja de datos cuál está usando, así que quizás esté usando la otra. Si utiliza 9600bps, entonces podría ser MODBUS / ASCII.

    
respondido por el PkP

Lea otras preguntas en las etiquetas