2014-12-19 3 views
0

Я создал приложение C++, и мне нужно было получить некоторую статистику из этого приложения на устройство Modbus через связь Tcp. Связь TCP составляет , сделанная сокетом, и я использую send() для отправки моих данных.Половина модуля modbus по tcp-кадру Я посылаю недействительные

И теперь половина кадров кажется недействительной: первый кадр после конвекции всегда действителен, а второй всегда является ложным ... и так далее. И всякий раз, когда я запускаю новое соединение, первый кадр действителен.

Итак, я проверил Wireshark, и данные по данным Modbus одинаковы (за исключением идентификатора транзакции, который является нормальным). Единственное, что указывает на проблему, - это тот факт, что Wireshark не видит Frame как фрейм Modbus, если я «разрешаю subdissector собирать потоки tcp» в опции Wireshark, у меня появилось новое поле: «2 Повторно собранные сегменты TCP (29 байтов): # 79391 (1), # 79404 (28) " где # 79391 - номер кадра последнего правильного кадра, а # 79404 - номер кадра текущего кадра.

Чтобы избежать этого, я попытался очистить буфер tcp, разрешив TCP_NODELAY, и у меня есть точные результаты. Поэтому, если кто-то знает, как отправить данные таким образом, чтобы избежать кадрирования, я с удовольствием попробую любое решение.

Редактирование: Я решаю свою проблему, TCP не был неправильным, конечно. Но это делало то, чего я не делал, добавляя бесполезные данные буфера к следующему кадру. Короче говоря, я не отправлял нужную сумму данных.

+0

Почему, по вашему мнению, фреймы недействительны? TCP разрешено разбивать поток на пакеты любым способом; вот как это работает. Поэтому Ethereal/Wireshark необходимо собрать TCP-поток, чтобы видеть сообщения Modbus. Это не значит, что с ними что-то не так. –

+0

Мое программное обеспечение masterbus не могло понять один из двух ответов от своих операторов. Поэтому я использовал несколько симуляторов master modbus для тестирования моего подчиненного устройства Modbus, и у меня получился тот же результат. Один из них: QModMaster позволяет видеть рамку Modbus. И на кадре, где Wireshark показывает 2 собранных фрагмента, симулятор говорит: error-> slave исключил исключение, тогда как часть Modbus на кадре TCP правильна и является ожидаемым ответом –

ответ

2

Я решил свою проблему, TCP, конечно, не ошибался. Но это делало то, чего я не делал, добавляя бесполезные данные буфера к следующему кадру. Короче говоря, я не отправлял нужную сумму данных. - Julien Amar

Смежные вопросы