Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
1) Правильно ли мы поняли, что если подаем сигнал напряжения, пропорционльный виброускорению, то встроенное ПО модуля L-VIMS можно сконфигурировать для пересчета гарморники с выбранным номером в виброскорость?
Да, все правильно
Понятно. Хотя на всякий случай обращу внимание, что утверждением типа средств измерений для всей системы под заказ мы тоже занимаемся, включая вариант системы из оборудование + ПО верхнего уровня: www.lcard.ru/metrology.
Если под L-ViMS имеется ввиду модули модификаций L-ViMS-ICP-10 / L-ViMS-ICP-4 / L-ViMS-NPS, а под L-ViMS-1 - модификации L-ViMS-ICP-10-1 / L-ViMS-ICP-4-1 / L-ViMS-NPS-1, то обращу внимание, что модификации с суффиксом -1 пока не входят в список модификаций, по которым получен сертификат средства измерения, и поверка по ним не доступна (см. комментарий про поверку www.lcard.ru/products/l-vims/icp?qt-ltab=2#qt-ltab), поэтому видимо раз вам требуется аттестация, то логично ориентироваться на модификации без -1, по крайней мере в ближайшем будущем. Частота дискретизации АЦП для модификаций -1 составляет 128 кГц, для модификаций без -1 она в 3 раза меньше - 42.666 кГц. Для Вас это может влиять на точность определения частоты вращения вала, т.к. момент пересечения порога сигналом фазоотметчика будет определяться при большей частоте дискретизации более точно. Это влияет на частоты выборки, если используете сырой сигнал, плюс у модулей -1 есть вариант измерения на высоких частотах (до 40 кГц). Для остальных Ваших же измерений для вашей полосы сигналов разница не должна быть значительной.
По поводу цен напишите запрос в офис: sale@lcard.ru
По поводу зависимости времени измерения амплитуды гармоники от ее частоты (частота от, Гц ... частота до, Гц - время измерения, мс):
Для модификаций без -1
833 ... 1333 - 22.5 мс
666 ... 833 - 36 мс
416 ... 666 - 45 мс
333 ... 416 - 72 мс
308 ... 333 - 90 мс
166 ... 308 - 144 мс
104 ... 166 - 180 мс
83 ... 104 - 288 мс
52 ... 83 - 360 мс
41.6... 52 - 575 мс
26 ... 41.6 - 720 мс
13 ... 26 - 1150 мс
Для модификаций с -1 отличаются две последние строки:
20.8 ... 41.6 - 720 мс
10.4 ... 20.8 - 1430 мс
Конфигурация модулей L-ViMS сохраняется в энергонезависимой памяти и используется модулем после записи до ее перезаписи/сброса в том числе и в случае выключения и включения питания.
Доработка встроенного ПО L-ViMS под заданную задачу вряд ли реализуема, по крайней мере на текущий момент.
Доработка ПО верхнего уровня (LMS), в виде добавления в него программных модулей для расчета перечисленных Вами параметров, выглядит более реальной задачей, при этом настройка времени вычисления каждого параметра может быть задана тогда явно. В случае использования LMS в качестве оборудования возможно использовать крейт LTR-EU-2 с модулем LTR25 (до 8 ICP датчиков) + модулем для подключения датчиков оборотов, в зависимости от используемых датчиков (например LTR24 если диапазон выходного сигнала датчиков в пределах +/-10 В). Текущие возможности ПО см. https://www.lcard.ru/download/lms_users_guide.pdf. Принцип работы ПО: сперва настраивается сценарий эксперимента со всем используемым оборудованием, рассчитываемыми параметрами и способом отображения, затем по сценарию можно запустить ограниченный по времени эксперимент, с сохранением результатов для дальнейшего просмотра. Вопрос насколько это подходит под Вашу задачу?
С точки зрения метрологической аттестации, следует учитывать, что в системе Виброприбора насколько я понял, используются свои датчики и погрешность определяется для финальных рассчитываемых параметров. В случае L-ViMS погрешность нормируется для измерения входных сигналов напряжения, погрешность рассчитываемых параметров, хоть они и вычисляются самим модулем, явно не нормируется и не поверятся. Тут Вам нужно оценить, насколько в Вашем случае использование L-ViMS потребует отдельной метрологической аттестации всего комплекса и насколько тут большая разница с случаем использования варианта с расчетом в ПО верхнего уровня.
"Ethernet/MODBUS TCP или RS485/MODBUS RTU" - этот пункт не совсем понятен. В случае L-ViMS используются Ethernet/MODBUS TCP. В случае использования ПО верхнего уровня, какое значение имеет протокол передачи между модулем и этим ПО? или Вам нужно передавать результаты расчетов в какое-то свое ПО и в случае использования LMS требуется, чтобы это ПО передавало стороннему софту вычисленные данные по Modbus TCP?
Время обновления значений параметров и интервал измерения (по данным за который рассчитываются параметры) - не одно и то же. Т.е. вычисляются параметры каждые 50 мс, но при расчете используются данные за последний Tи, который не обязательно 50 мс. В случае L-ViMS при измерении амплитуды гармоники Tи зависит от частоты гармоники, в случае частоты 500 Гц он около 45 мс, в случае 20 Гц - около 1.4 c.
Окно в данном случае - 4-х термовое Блэкмана-Харриса.
А в Вашей задаче необходим расчет параметров именно на уровне модуля? Или допустим вариант расчета на уровне ПК по переданным сырым данным? Если последнее допустимо, не рассматривали вариант LTR (LTR24/LTR25) + ПО LMS, которое может быть проще доработать с гибкой настройкой под нужную задачу под заказ (в том числе и с уходом от двух каналов на один датчик), если подробно опишите задачу?
Да, если при пропаже сети произойдет переполнение буфера в крейте, то это тоже может привести к нарушению данных.
По поводу инициализации модулей, можете написать, какая версия прошивки крейта у Вас? Можно посмотреть в LTR Manger в параметрах крейта.
1. Да, разъёмы и распиновка сохранились такими же
2. Только отсутствием корпуса и разъёмом питания. Также обратите внимание на дополнительные рекомендации по использованию цепи CHASSIS для данной модификации в руководстве пользователя (см. п.4.2 и п.4.3). В остальном всё также, и разъёмы и экраны.
3. Были заменены некоторые микросхемы (микроконтроллеры, ПЛИС) на более доступные в нынешних условиях. Аналоговый тракт остался практически таким же. Функционал весь сохранен (если не разрабатываете свою прошивку под Blackfin) + добавлена возможность синхронизации времени по PTP при работе через Ethernet. На стабильность работы влиять не должно, по крайней мере какие-то проблемы не выявлены и жалоб на работу этих модификаций от клиентов не поступало. Если какие-то проблемы возникнут, пишите... Спасибо за оценку работы E-502-P!
ProcessData обрабатывает данные покадрово, т.е. каждый обрабатываемый блок данных должен состоять из числа слов, кратного N (для 20-битного формата) или 2*N (длф 24-битный формата), где N - число разрешенных каналов. Т.е. если у Вас 4 канала и 20-битный режим, то необходимо не просто обрабатывать слова в очереди "когда в очереди набирается 4 или больше слов", но обрабатывать кратное 4 словам кол-во слов, после чего оставшиеся слова сдвигать в начало очереди и следующий принятый блок добавлять к ним. Данные ошибки как раз могут возникать, если склейка данных по кадрам и обработка строго целыми кадрами выполнена не корректно.
Следует также учитывать, что Windows не система реального времени, да и при передаче данных вносятся задержки передачи, поэтому обработка с таймаутом 5 мс будет приводить к тому, что хотя сбор на уровне модуля выполняется строго с заданной частотой (с учетом погрешности опорного генератора крейта), размеры принятых данных за 5 мс на стороне Windos будут сильно меняться от приема к приему и не соответствовать исходному интервалу сигнала 5 мс на уровне модуля. Если требуется обрабатывать по 5 мс исходя из времени синхронного ввода на уровне модуля, то может быть более корректно вычисление числа точек, которое модуль собирает за 5 мс исходя из установленной частоты и выполнять прием и обработку этого числа отсчетов с большим таймаутом (для учета времени передачи и задержек Windows), чтобы при штатной работе функция возвращалась по приему нужного количества отсчетов, а не таймауту, тогда хоть время на стороне ПК может варьироваться, но обкатываемые данные будет соответствовать интервалу снятых данных за 5 мс, и ручное разбиение на кадры не нужно (т.к. прием уже будет выравненным).
На этот пост уже задавал доп.вопросы в этой теме https://www.lcard.ru/forums/viewtopic.php?id=10810
Отлично! Спасибо за информацию. Если будут вопросы, обращайтесь!
По поводу скачивания, если зайти по прямой ссылке: https://download.opensuse.org/repositor … Debian_12/ (или конкретно для ltrd: https://download.opensuse.org/repositor … _amd64.deb), ссылка у Вас открывается? скачивание запускается? У меня все работает, иногда правда с задержкой, возможно временные какие-то проблемы с доступом на страницу. Если не скачивается все равно, то еще можно взять все эти пакеты из состава версии под Linux программы LMS (https://www.lcard.ru/download/lms_linux_distr.tar.gz), там в директории astra1.8se_deb12_x64/lms есть все нужные пакеты для ltr).
По поводу сборки из исходников, то скорее всего вы скопировали без входящих субмодулей. Нужно выполнить
git clone --recurse-submodules https://gitlab.com/l-card/acq/devices/ltr/shared/sdk/ltrd.git
или можно аналогично склонировать весь SDK - проект верхнего уровня:
git clone --recurse-submodules https://gitlab.com/l-card/acq/devices/ltr/shared/sdk/ltr_cross_sdk.gitТ.к. в составе модулей есть LTR43, если я правильно поняла, с его помощью можно одновременно запустить чтение данных на модулях?
В LTR43 есть возможности генерации синхрометок, но это нужно было главным образом в первых вариантах крейта (LTR-U-1/8/16), тогда требовалось по модулю LTR41, LTR42 или LTR43 в каждом из синхроизируемых крейтов. В LTR-EU-2/8/16 и LTR-CEU-1 эти возможности уже включены в крейт, там есть отдельный разъем синхронизации SYNC на задней панали крейта с линиями для трансляции сигнала генерации меток одним крейтом и приема другим, о котором я писал выше.
Синхросигналы должны быть периодическими или одного сигнала "старт" достаточно, для дальнейшего сопоставления данных с модулей?
Смотря сколько длится у Вас эксперимент и какого уровня точность синхронизации требуется. С помощью одной метки Вы можете синхронизировать момент старта, что если эксперимент относительно не длительный, может быть достаточно. Но в случае длительного эксперимента будет постепенный уход меду двумя крейтами с течением времени из-за того, что каждый крейт работает от своего генератора, расхождение которых может составлять ±50 ppm (до ~4.3 сек в сутки). Соответственно при длительном эксперименте нужны еще и периодические метки и подстройка времени отсчетов во время сбора.
Сам принцип подключения и программной настройки описан в руководстве ltrapi на главу в котором давал ссылку выше, есть еще глава 2.8.4 в руководства по программе LMS (https://www.lcard.ru/download/lms_users_guide.pdf), с учетом интерфейса этой программы, но и общий принцип изложен. Если будет непонятно, пишите.
Настройку на уровне крейта (из ltrapi) можно делать также из программы LTR Manager.
Из примеров LabView есть пример начала сбора по метке СТАРТ для модуля LTR24 (https://www.lcard.ru/download/examples/ … _start.zip), для других модулей принцип такой же. Есть пример настройки выходов разъема SYNC (https://www.lcard.ru/download/examples/ … ut-cfg.zip), правда для другого случая, но общий принцип переноса API из ltrapi на LabView можно понять.
Здравствуйте.
Если требуется сопоставить данные разных модулей по времени между собой, то это возможно сделать с точностью до одного периода дискретизации с помощью механизма синхрометок.
Программная настройка и использование меток описаны в главе 4.6 документа https://www.lcard.ru/download/ltrapi.pdf (необходимо использовать функции ltrapi для настройки крейтов, а сами счетчики меток получаются в Recv api каждого модуля), а в главе 4.7 из https://www.lcard.ru/download/ltr.pdf описаны принципы с точки зрения аппаратной части.
Если крейты расположены не далеко друг от друга, то возможно их соединить через разъем синхронизации крейта SYNC выходы DIGOUT одного крейта с входами DIGIN другого (стр. 53 в https://www.lcard.ru/download/ltr.pdf + глава 4.4.2) . Если крейты расположены удаленно друг от друга, то можно использовать генерацию меток от внешнего сигнала, поданного на входы DIGIN разъема синхронизации SYNC, например PPS сервера времени/GPS (правда тут нужно реализовать старт, чтобы начальная привязка была к одному и тому же импульсу PPS без сдвига на секунду, например запустить сбор сперва с одного модуля, дождаться метки PPS, после чего в течение секунды запустить сбор с остальных и привязаться к следующей метки).
Если подразумевается привязки отсчетов также к абсолютному времени, то этой возможности на уровне крейта нет. Только если использовать последний способ и получать время напрямую из сервера времени/GPS.
Здравствуйте. До этого не было запросов о возможности подключения инфракрасного приемопередатчика к крейту LTR, поэтому этот вопрос не рассматривался и не проверялся. Принципиально должно быть возможно подключить такой приемопередатчиком, если он может работать от 3.3В, к разъему SYNC крейта, запитав от 3.3 В с этого разъема и подключив TX и RX к DIGIN/DIGOUT разъема SYNC выведя на них TX/RX с UART аналогично случаю RS. Судя по описанию IrDA сигналы обмена с приемопередатчиком однонаправленные и в принципе прохождение сигналов через ПЛИС не должно препятствовать. Но чтобы использовать данную возможность, также придется модифицировать прошивку крейта, чтобы добавить в нее подобный функционал.
Какое полное название модификации модуля у Вас?
Если менять сигнал на тот же с тем же размером считывания то фаза остается корректной (чтобы отличить это сигнал сменяется не в конце буфера или сигнал сменяется корректно, но проблема что смена размера чтения не совпадает со сменой размера сигнала).
При повторном запуске с одинаковой сменой размера сигнала, нарушения фазы идет всегда на вторую смену и всегда на одно и то же число точек? Если поменять размеры в первой смене и второй, то ошибка фазы все равно останется только во второй?
Как именно идет синхронизацию смены сигнала и смены размер чтения? Загрузка сигнала идет в том же потоке после приема блока или из другого? Загрузка и переключение идут подряд? Потом блок считываете со старым размером?
Здравствуйте.
Для начала просьба уточнить, правильно ли я понял, что:
1. Используется именно циклический режим вывода (функции X502_OutCycleLoadStart/X502_OutCycleSetup)
2. Смена сигнала у Вас идет без остановки сбора/генерации (т.е. StreamsStart выполняется только один раз, а смена идет на лету через какое-то время через те же X502_OutCycleLoadStart/X502_OutCycleSetup)
3. На последней картинке сама частота сменилась корректно и Вас не устраивает именно фаза (соответствие первой точки сигнала и начала собранного блока АЦП). При этом этот сдвиг фазы фиксированный, т.е. сигнал до следующей смены сигнала сигнал не дергается, просто начало некорректно.
Также уточните, какой интерфейс используется (USB или Ethernet) и модификацию модуля.
"АЦП при этом считывает за раз 819200 байт, что соответствует 102400 отсчётам для 2 каналов" - тут наверное все же опечатка, размер отсчета АЦП 1 слово = 4 байта, т.е. с учетом что DIN не включен, то 102400 отчета это 409600 байт.
Если Blackfin не используете, то никакой разницы в работе модификаций c P от без P нет (по сути эта часть не используется и все данные идут в обход Blackfin если его не включать). В модификациях P1 или A (бескорпусной вариант) несколько по другому сделана цифровая часть, но все возможности работы E-502 без Blackfin сохранены, тоже разницы не должно быть с точки зрения ПО верхнего уровня. По ценам тех модификаций, для которых цены не указаны в разделе "Цены и модификации" страницы модуля (https://www.lcard.ru/products/external/ … =2#qt-ltab), напишите лучше письмо в отдел продаж. Но если переходить на более оптимальный по цене вариант без Blackfin, то лучше рассматривать новые модификации P1 или A, т.к. на старые варианты без Blackfin могут быть ограничения на минимальное количество для покупки и в будущем разница в цене будет скорее всего расти.
Да, для разработки своего приложения (по крайней мере на C) требуется установка заголовочных файлов (с описаниями типов, функций и т.п.), для этого нужно установить пакет libltrapi1-dev (общий для всех библиотек, он не делится по модулям), к которому как зависимости будут также установленные уже отдельные пакеты libltrXXXapi1 под каждый модуль, в которых сами соответствующие библиотеки. А для работы уже собранного приложения -dev не обязателен, достаточны только используемые libltrXXXapi1.
Также для работы программы требуется установка пакета ltrd, т.к. ltrapi работают через эту службу с крейтами.
Пакет ltrmanger - GUI программа для просмотра подключенных крейтов, с возможностью настройки крейтов на Ethernet, подключения по Ethernet, обновления прошивки крейта и т.п.. Не обязательна для работы/сборки своей программы, но полезная отдельная программа.
Подробнее в https://www.lcard.ru/download/ltr_soft_ … tarted.pdf и https://www.lcard.ru/download/ltr_cross_sdk.pdf.
Вроде данный пакет есть в репозитории (https://www.lcard.ru/download/lcard_lin … utions.pdf).
Напрямую ссылка на страницу для установки/скачивания ltrmanager: https://software.opensuse.org//download … ltrmanager
Где можно выбрать Ubuntu, а дальше:
- Если есть возможность лучше подключить сам репозиторий как в пункте "Добавить репозиторий и установить вручную", тогда можно установить сразу с зависимостью и получать потом автоматом обновления.
- Если нужен сам .deb, то можно скачать из "Получить бинарные пакеты напрямую", но тогда и те пакеты, от чего зависит нужно скачивать или должны стоять на целевой системе.
Добрый день!
Существует одно важное отличие между обменом с модулями из крейта и из ltrapi.
Сам обмен идет с помощью 32-битных слов, общий формат которых описан в разделе 4.6 документа https://www.lcard.ru/download/ltr.pdf. При этом через процессор идет один поток со словами всех модулей крейта, и задать, какому модулю предназначено слово на передачу, или узнать, от какого модуля пришло слово, можно узнать по битам MMMM (биты с 8 по 11), 0 - первый слот, 15 - последний в 16-местном крейте.
В ltrXXXapi работа идет с одним модулем в конкретном слоте и поле MMMM не заполняется и не анализируется в самой библиотеке, это делается в службе ltrd, которая объединяет передаваемые потоки от клиентов api в один крейту заполняя поля MMMM и разбивает приходящий поток слов по полю MMMM на потоки каждому клиенту.
В остальном же эти слова передаются в крейт без изменений, т.е. как их формирует библиотека и отправляет через LTR_Send/принимает через LTR_Recv, так их и нужно передавать в крейте, только добавив заполнение поля MMMM на передачу и анализ на прием.
В крейте для передачи слов модулям используется baybustx_put() или baybustx_put_array(), которая кладет слово/несколько слов в буфер на передачу в модули и уже дальше они отправляются в фоне. Проверить наличие места в буфере на передачу можно через baybustx_is_buf_full()/baybustx_free_size_byte(). Единственное, если Вы это делаете в параллель с штатной передачей из ПК, то нужно сделать какую-то защиту от выполнения этих функций в параллель из разных потоков.
Прием же выполняется функцией baybusrx_get_data(). Т.к. поток общий, то она получает слова принятые от всех модулей, а дальше по полю MMMM уже можно понять, от какого модуля каждое слово. Если хотите это делать в параллель с штатным приемом и передачей в ПК слов, то тогда нужно там, где эта функция вызывается (отдельно для каждого интерфейса usb/ethernet) после ее вызова перед тем как они будут поставлены на передачу в ПК сделать вызов своей обработки с фильтрацией по слоту модуля.
По сути вся работа с модулем и состоит из посылки нужных слов модулю и ожидания нужных слов в ответ. В первую очередь нужно проверить работу штатной последовательности посылки команд STOP-STOP-RESET-STOP общей для всех модулей, которая описана в том же разделе 4.6 (для некоторых модулей при запущенном сборе одного STOP может быть не достаточно, при этом второй STOP ничему не мешает, поэтому рекомендуется все же слать два STOP перед RESET). Эта посылка реализована в ltr_module_open в lib/ltrmodule/ltrmodule.c в исходных кодах ltrapi, и получить в ответ на это слово с идентификатором модуля.Если это получится, то дальше уже по аналогии обмен словами из всех функций ltr11api.
Если я правильно понял, то в этом устройстве АЦП всегда "молотит" данные с частотой 2 МГц.
Т.е., если я задал запись 2-х каналов с частотой 100 кГц каждый, то у меня АЦП за 1 мкс снимает 10 отсчетов с первого канала, потом так же со второго.
Если усреднение выставлено 1 - в каждом микросекундном окне берется последний отсчет.
Да, тут все корректно понимаете с точки зрения работы E-502, если речь идет о случае, когда частота 100 кГц на канал получается заданием общей частоты опроса каналов АЦП равной 200 КГц для 2 каналов без межкадровой задержки (т.е. в X502_SetAdcFreq параметр f_acq = 200000), т.к. частоту можно еще понижать за счет межкадровой задержки (параметр f_frame).
Вопрос такой. Какова длительность этих процессов. Сколько отсчетов выкидывать?
Ведь если коммутатор рассчитан на работу в режиме 2 канала по 1 МГц, то переходные процессы по любому должны быть значительно меньше 1 мкс.
Будет ли корректно, если я при работе в режиме "2 канала, 100 кГц на канал" буду ставить усреднение 9 - т.е. выкидывать только 1-й отсчет и усреднять оставшиеся 9?
Время переходного процесса зависит от параметров конкретного источника сигнала (его импеданса и т.д.), именно поэтому эта возможность и дана пользователю для ручной настройки. Сам коммутатор E-502 рассчитан на частоту 2 МГц и в случае идеального источника сигнала можно было бы использовать хоть все отсчеты для усреднения. Можете посмотреть статью https://www.lcard.ru/download/articles/distortions.pdf по этому поводу. Экспериментально можете проверить без усреднения, на какой максимальной частоте опроса каналов АЦП влияния не будет (для случая максимальной разницы сигналов на двух каналах), и исходя из этого понять, какое время переходных процессов для вашего источника, и исходя из этого уже выбрать усреднение.
Опорная частота 24.576 МГц делится на 5 и получается тактовая частота АЦП = 4.9152 МГц. Частота отсчетов на выходе АЦП для настроек режима высокой точности получается делением: 4.9152 / (3 * 16 * 682) = 150.146627566 Гц.
Для модулей LTR212M-1 и LTR212M-2 исходная частота получается из частоты опорного генератора крейта и одинакова в рамках одного крейта, для остальных модификаций - от генератора на самом модуле. Реальная частота может отличаться от номинальной, но в пределах ±50 ppm в рабочих условиях. Соответственно такой же будет максимальный разброс частот между модулями разных крейтов или модулями c модификациями не M1/M2 в одном крейте.
Как и для других модулей ввода данные можно привязать друг к другу с помощью синхрометок с точностью до периода преобразования. Для этого нужно настроить генерацию меток, для синхронизации модулей в разных крейтах также потребуется соединение сигналов разъема синхронизации. С точки зрения ПО это описано в разделе 4.6 руководства программиста, а с точки зрения аппаратуры в разделе 4.7 руководства руководства пользователя, там же на Рис. 3-6. и в таблице 3-3 описан разъем синхронизации.
Здравствуйте.
Термодатчик устанавливается только в крейтах LTR-EU-8/16 и его показания используются для управления вентиляторами.
В крейте LTR-EU-2 нет управления вентиляторами и не установлен термодатчик, поэтому и данная функция всегда возвращает нулевое значение.
Добрый день.
Попробуйте взять последнюю версию исходных кодов прошивки (https://www.lcard.ru/download/user/ltr/ … master.zip, версия 3.0.0.17, номер соответствующей версии прошивки можно посмотреть номер в init.c). В ней там как раз были правки по поводу перезагрузки в process_sd_test() из-за того, что не всегда успевал выполняться сброс сторожевого таймера. Попробуйте будет ли у Вас работать. При этом process_sd_test() тоже использует функции из efsl (функции if_xxxx). Возможно и в Вашем случая сходная проблема, что если функция долго выполняется без возврата управления, то можно не успеть сбросить сторожевой таймер и процессор перезагрузится.
По поводу флага g_sdtest_result, то запуск теста sd в штатной прошивке выполняется только по внешнему запросу (ltr030_CC_StartSDTest в ven_requests.c), который устанавливает g_sdtest_result в 0xFFFF, если Вы хотите при старте ее выполнять, то нужно либо при старте устанавливать эту переменную, либо поменять логику функции.
Приведенная картина с задержками объясняется как раз одиночными потерями пакетов при передаче. Исходя из слова "практически" в вашем сообщении я так понимаю полностью потери не исчезли, просто их процент стал значительно меньше по сравнению с огромным числом (>5%) до этого.
В случае потери пакета при передаче в сети передающая сторона (крейт) должна обнаружить эту потерю по отсутствию подтверждения от ПК и только после обнаружения (по таймауту при отсутствии подтверждения или другим способом) пакет будет послан повторно. Соответственно, у Вас и будет задержка в приеме последовательных данных в случае такой потери на время обнаружения потери и время повторной передачи. После задержки в блоке, где была потеря пакета, у Вас следующий блок принимается на сопоставимое время быстрее, т.к. за время повторной передачи последующие за потерянным пакеты принимались в ПК и они будут возвращены сразу после завершения повторной передачи потерянного пакета.
Вначале в требованиях у Вас ничего не было про необходимость обеспечения минимального времени задержки принимаемых данных, соответственно речь шла о только о передаче непрерывного потока данных без потерь, что как раз выполняется. Обеспечения строго минимального времени задержки требует, чтобы задержки в канале были всегда меньше и по сути отсутствовали вообще любые потери пакетов, т.к. даже одиночная потеря пакета влечет за собой увеличение задержки из-за необходимости переповтора (даже без учета, что строго говоря в системах с ОС общего назначения говорить о минимальном времени задержки можно только условно).
Правда не совсем понятно, как требование минимальной задержки связано с наличием нескольких модулей и крейтов в системе. Сопоставлять данные разных модулей по времени приема данных на стороне ПК в принципе выглядит не очень корректно даже в локальной сети в связи с теми же задержками передачи в сети, задержками реакции ОС и программы, а уж вне локальной сети тем более. У Вас сами модули собирают данные с фиксированной строго определенной частотой и Вы по номеру отсчета в потоке знаете смещение отсчета от начала сбора данных точнее, чем по времени прихода блока данных. Для синхронизации старта модулей и/или учета расхождения частот опорных генераторов разных крейтов при длительном сборе могут использоваться синхрометки. Если требуется для длительного сбора синхронизировать частоту крейта с частотой часов ПК или разных крейтов без меток, то можно конечно использовать время прихода блоков данных, но тогда они должны быть усреднены за большое время, как раз для избежания влияния отдельных задержек из-за потерь.
С точки зрения отображения в реальном времени, при потере пакета конечно будет соответствующий лаг на время переповтора, что при потерях пакетов в сети неизбежно, но на привязку отсчетов разных модулей к времени это не должно влиять.
MTU 1500 стандартное значение, такое используется и в прошивке крейта, кроме того судя по записи т.к. скорость небольшая, то пакеты реально передаются значительно меньшего размера, за исключением разве что преповторов уже после потерь пакетов.
А по поводу большого процента потерь пакетов (там где 5.5% на скриншоте), если такой тест произвести не с крейтом, а с пк, который вовне (i3), проверить путь до ПК который в той же сети, что с крейтами (i5), то также будет большой процент потерь (чтобы понять, такие потери только при обмене с крейтом или в канале до той точки где крейт)?
Ну по поводу вашей программы, то так достаточно сложно не зная точной логики понять что значит ее аварийное завершение, с каким таймаутом там принимаются данные, как обрабатывается вариант когда Recv завершился по таймауту и вернул не все данные и т.п. А нет возможности проверить на штатном консольном примере, как он будет вести себя если запустить его на неправильном ПК (можно запустить несколько в параллель для сбора с нескольких модулей)?
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4
Многоканальный телефон: +7 (495) 785-95-25
Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Мы работаем с юридическими и физическими лицами, пожалуйста, прикладывайте реквизиты при оформлении заказа
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск