Введение
Синхронный прием данных программой LabVIEW через линию USB/СОМ работает достаточно хорошо, если принимаемые данные не содержат периодических фрагментов.
При обнаружении таких фрагментов LabVIEW вставляет «шумовые» байты и тем самым искажает принимаемый сигнал.
В этой работе рассмотрена причина появления шумов и вариант обеспечения «бесшумового» приема COM данных.
Состояние проблемы
На Рисунок 1 показана схема LabVIEW интерфейса, который каждый 10 мс такт посылает в СОМ порт запрос (один байт ASCII = 1). На каждый запрос контроллер высылает 6 байт (2 байта от одного датчика и 4 байта от другого). Соответственно, интерфейс должен принимать 6 байт контроллера. В основном, так и происходит, но в отдельные моменты количество принимаемых байт не равно и не кратно 6, в эти же моменты принимаемые сигналы имеют выбросы — искажения, например, как показано на Рисунок 2.

Рисунок 1. Блок схема LabVIEW интерфейса, принимающего данные СОМ порта.

Рисунок 2. Примеры отклонения количества получаемых байт за 1 такт (слева) и искажения принимаемого синусоидального сигнала датчика (в центре и справа).
Вариант разложения амплитуд зашумленного 4-х байтового синусоидального сигнала (Рисунок 3) на байты показан в Таблица 1. Разложение на байты выполнялось командой MATLAB flip(typecast(int32(амплитуда_сигнала),’uint8′)).

Рисунок 3. Зашумленный 4-х байтовый синусоидальный сигнал.
Таблица 1. Разложение амплитуд зашумленного и эталонного 4-х байтного синусоидального сигнала.

Пики появляются в моменты, когда LabVIEW принимает 7 байт вместо шести. Первый пик добавляет в сигнальную последовательность два нулевых байта и заменяет сигнальные байты 0/10 на 13/144, а байты 0/9/197/0 на 3/192. Второй пик также добавляет в сигнальную последовательность два нулевых байта, заменяет сигнальные байты 0/10 на 3/192 и заменяет байты 0/11/56/0 на 13/144.
Результаты тестирования “зашумлений”
В процессе экспериментального тестирования выявлено следующее.
-
LabVIEW добавляет “заголовок” (свои байты) если последовательность данных носит периодический характер, например, передаются два синусоидальных сигнала с одинаковыми периодами в формате int16 (2 байта) и int32 (4 байта).
-
При наличии заголовков теряется часть сигнальных данных.
-
Заголовок устанавливается автоматически вначале повторяющейся цепочки данных.
-
Повторяющиеся цепочки данных не обязательно следуют друг за другом. Они могут идти через промежутки (блоки байт).
-
Для синусоидального сигнала в формате int16 заголовок состоит из двух слов.
-
Содержимое заголовка зависит от периода сигнала.
-
Моменты появления заголовка можно обнаружить по дополнительным байтам в буфере СОМ порта.
-
Заголовок может включать, например, два байта: 10 (перевод строки) и 9 (горизонтальная табуляция) или 10 (перевод строки) и 11 (вертикальная табуляция) или другие байты, как показано в Таблица 1.
-
Замена LabVIEW запроса 1 (ASCII код 49) (см. Рисунок 1) на D (ASCII код 68) не устраняет генерацию заголовков.
-
Применение синхронного или асинхронного режима приема передачи (I/O mode) блоков VISA Write и VISA Read также не устраняет генерацию заголовков.
-
LabVIEW не создает заголовков если не находит повторяющуюся последовательность. Для этого в примере последовательной передачи данных блоками по 6 байт достаточно второй синусоидальный сигнал заменить неизменным уровнем (константой).
Решение проблемы искажения периодических сигналов
LabVIEW не создает заголовки и не «зашумляет» принимаемые через СОМ порт данные, имеющие периодические фрагменты, если данные принимаются через «очередь», образованную блоками Queues LabVIEW (см. Рисунок 4), хотя и в этом случае количество принимаемых байт на каждом такте может изменяться.
Пример блок схемы LabVIEW, принимающей данные контроллера через очередь, приведен на Рисунок 5. Цикл While: Enqueue Loop отправляет запрос (ASCII код 1) в СОМ порт, принимает байты сигнальных данных и передает их в очередь. Цикл While: Dequeue Loop достает сигнальные байты из очереди, формирует из них два int16 сигнала. Цикл While: Queue Status отображает количество байт в очереди. Максимальный размер очереди в этом примере 300 байт.

Рисунок 4. Прием периодических показаний датчиков контроллера по запросу через “очередь — Queue” LabVIEW: количество принимаемых байт (слева) и принимаемый синусоидальный сигнал (справа). Данные не содержат искажений.

Рисунок 5. Пример приема данных контроллера по запросу через очередь LabVIEW.
ссылка на оригинал статьи https://habr.com/ru/articles/769476/
Добавить комментарий