Libmodbus: сбой TCP-соединения «точка-точка» между двумя промышленными PiLinux

Ответить
Anonymous
 Libmodbus: сбой TCP-соединения «точка-точка» между двумя промышленными Pi

Сообщение Anonymous »

Я использую две промышленные платформы Pi, чтобы узнать больше о встроенном кодировании C в Linux. Я использую Visual Studio для кроссплатформенной компиляции и отладки.
Я установил libmodbus и успешно протестировал случайный тестовый клиент и сервер в режиме TCP на одном Pi, используя настройки локального хоста, и между двумя Pi, используя RTU. Однако теперь мне не удается заставить два Pi обмениваться данными через TCP.
Я признаю, что отчасти это может быть связано с моим незнанием Linux и Pis, поскольку я работаю со встроенной прошивкой на платформах на базе ARM.
Мое оборудование установлено следующим образом:
  • Промышленные Pi подключены к моей локальной сети через «eth0».
  • Оба Pi имеют «eth1», подключенные друг к другу через коммутатор с зеркалированием портов для Wireshark, полностью отделенный от остальной части моей локальной сети.
«Сервер» Pi:
  • Имеет автоматический IP-адрес на «eth0».
  • Имеет статический IP-адрес 192.168.0.3 на "eth1".
  • Выполняет код на основе случайного тестового сервера, подключенного к порту 502 и прослушивающего порт 192.168.0.3.
"Клиент" Pi:
  • Имеет автоматический IP-адрес на "eth0".
  • Имеет статический IP-адрес 192.168.0.4 на "eth1".
  • Выполняет код на основе случайного тестового клиента и не может подключиться к 192.168.0.3 через порт 502 с ошибкой Время ожидания соединения.
Что я пропустил?

Код моего тестового сервера:
#ifdef MB_RTU
/* RTU */
ctx = modbus_new_rtu(i_am->uart, 19200, 'N', 8, 1);
modbus_set_slave(ctx, MY_MODBUS_ID);
#else
/* TCP */
ctx = modbus_new_tcp(TEST_ADDRESS, MODBUS_TCP_DEFAULT_PORT);
#endif

modbus_set_debug(ctx, TRUE);

mb_mapping = modbus_mapping_new(500, 500, 500, 500);
if (mb_mapping == NULL) {
fprintf(stderr, "Failed to allocate the mapping: %s\n", modbus_strerror(errno));
modbus_free(ctx);
}
else {

#ifdef MB_RTU
if (0 > modbus_connect(ctx)) {
printf("modbus_connect failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
}
else {
#else
if (0 > (s = modbus_tcp_listen(ctx, 1))) {
fprintf(stderr, "Failed to connect: %s\n", modbus_strerror(errno));
modbus_free(ctx);
}
else if (0 > (modbus_tcp_accept(ctx, &s))) {
fprintf(stderr, "Failed to accept: %s\n", modbus_strerror(errno));
modbus_free(ctx);
}
else {
#endif
for (;;) {

rc = modbus_receive(ctx, query);
if (rc > 0) {
/* rc is the query size */
modbus_reply(ctx, query, rc, mb_mapping);
}
else if (rc == -1) {
/* Connection closed by the client or error */
break;
}
}

printf("Quit the loop: %s\n", modbus_strerror(errno));

if (s != -1) {
close(s);
}
modbus_mapping_free(mb_mapping);
modbus_close(ctx);
modbus_free(ctx);
}
}

Код моего тестового клиента:
#ifdef MB_RTU
/* RTU */
ctx = modbus_new_rtu(i_am->uart, 19200, 'N', 8, 1);
modbus_set_slave(ctx, MY_MODBUS_ID);
#else

/* TCP */
ctx = modbus_new_tcp(TEST_ADDRESS, MODBUS_TCP_DEFAULT_PORT);
modbus_set_debug(ctx, TRUE);
#endif

if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
}
else {

/* test code here... */

}
/* Close the connection */
modbus_close(ctx);
modbus_free(ctx);
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... ustrial-pi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»