Я установил libmodbus и успешно протестировал случайный тестовый клиент и сервер в режиме TCP на одном Pi, используя настройки локального хоста, и между двумя Pi, используя RTU. Однако теперь мне не удается заставить два Pi обмениваться данными через TCP.
Я признаю, что отчасти это может быть связано с моим незнанием Linux и Pis, поскольку я работаю со встроенной прошивкой на платформах на базе ARM.
Мое оборудование установлено следующим образом:
- Промышленные Pi подключены к моей локальной сети через «eth0».
- Оба Pi имеют «eth1», подключенные друг к другу через коммутатор с зеркалированием портов для Wireshark, полностью отделенный от остальной части моей локальной сети.
- Имеет автоматический IP-адрес на «eth0».
- Имеет статический IP-адрес 192.168.0.3 на "eth1".
- Выполняет код на основе случайного тестового сервера, подключенного к порту 502 и прослушивающего порт 192.168.0.3.
- Имеет автоматический 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
Мобильная версия