Тайм-аут чтения данных из RS485 Modbus с использованием библиотеки libmodbus - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в протоколе Modbus. Я хочу читать данные с RS485.Я написал код c для использования библиотеки Libmodbus, но не смог прочитать данные, истекло время ожидания ошибки соединения.Я здесь, используя Modbus Slave, работающий на Windows-машине отсюда, я подключаюсь от USB к последовательному кабелю от COM-порта Windows-машины.На порт RS485 Linux-машины, где я запускаю приведенный ниже код c.

`

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <stdbool.h>

#include <modbus.h>


int main()
{
  modbus_t *ctx = 0;

  //
  // create a libmodbus context for RTU
  // doesn't check if the serial is really there
  //
  ctx = modbus_new_rtu("/dev/ttyS2", 115200, 'N', 8, 1);

  if (ctx == 0) {

    fprintf(stderr, "Unable to create the libmodbus context\n");
    return -1;

  } else {
    struct timeval old_response_timeout;
    struct timeval response_timeout;

    // enable debug
    modbus_set_debug(ctx, true);

    // initialize timeouts with default
    modbus_get_response_timeout(ctx, &old_response_timeout);
    response_timeout = old_response_timeout;

    // set the message and charcater timeout to 2 seconds
    response_timeout.tv_sec = 2;
    modbus_set_response_timeout(ctx, &response_timeout);
    modbus_set_byte_timeout(ctx, &response_timeout);

  }

  // try to connet to the first DZT on the line
  // assume that line address is 1, the default
  // send nothing on the line, just set the address in the context
  if(modbus_set_slave(ctx, 1) == -1) {
    fprintf(stderr, "Didn't connect to slave/n");
    return -1;
  }

  // establish a Modbus connection
  // in a RS-485 context that means the serial interface is opened
  // but nothing is yet sent on the line
  if(modbus_connect(ctx) == -1) {

    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
    modbus_free(ctx);
    return -1;

  } else {

    int nreg = 0;
    uint16_t tab_reg[32];
   // uint16_t
    fprintf(stderr, "Connected\n");

    //
    // read all registers in DVT 6001
    // the function uses the Modbus function code 0x03 (read holding registers).
    //
    nreg = modbus_read_registers(ctx,0,5,tab_reg);

    //printf(tab_reg);
    if (nreg == -1) {

       fprintf(stderr, "Error reading registers: %s\n", modbus_strerror(errno));
       modbus_close(ctx);
       modbus_free(ctx);

       return -1;

    } else {
       int i;

       // dump all registers content

       fprintf (stderr, "Register dump:\n");
       for(i=0; i < nreg; i++)
         printf("reg #%d: %d\n", i, tab_reg[i]);


       modbus_close(ctx);
       modbus_free(ctx);

       return 0;
    }
  }
}

`

Ошибка выглядит следующим образом

Opening /dev/ttyS2 at 115200 bauds (N, 8, 1)
Connected
[01][03][00][00][00][05][85][C9]
Waiting for a confirmation...
ERROR Connection timed out: select
Error reading registers: Connection timed out

1 Ответ

0 голосов
/ 24 октября 2018

Первое, что я хотел бы проверить, это оборудование для последовательной связи.Есть ли какое-либо другое устройство, которое вы можете попробовать подключить к обоим компьютерам, чтобы убедиться, что последовательный порт каждого компьютера работает?Это поможет убедиться, что последовательный порт правильно установлен и настроен на каждом компьютере.Преобразование USB в последовательное соединение общеизвестно привередливо и его трудно заставить работать.

Следующее, что я хотел бы проверить, - это скорость передачи и настройки последовательного порта на каждой машине.Протоколы последовательной связи RS-232 и RS-485 не выполняют автоматическое согласование / автоматическое определение скорости соединения, поэтому оба устройства должны иметь одинаковые параметры подключения.

Возможно, вы также захотите попробовать медленнееСкорость передачи данных выше, чем 115200. В то время как более высокие скорости передачи данных обеспечивают большую пропускную способность и пропускную способность, существует большая вероятность ошибок.Я бы начал с 19200 бод и начинал оттуда, как только он заработал.

Кроме того, под каким пользователем вы запускаете эту программу?Вам может потребоваться выполнить программу через sudo или как пользователь с повышенными правами доступа.

...