Устранение “шумов” LabVIEW при приеме USB/СОМ данных

ВВЕДЕНИЕ

Синхронный прием данных программой LabVIEW через линию USB/СОМ работает достаточно хорошо, если принимаемые данные не содержат периодических фрагментов.

При обнаружении таких фрагментов LabVIEW вставляет «шумовые» байты и тем самым искажает принимаемый сигнал.

В этой работе рассмотрена причина появления шумов и вариант обеспечения «бесшумового» приема COM данных.

Состояние проблемы

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

263ca3313df68dfc1e136824ac06fdca.png

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

9de7c42da1489e8352f5fa0d7321f9a1.png

Рисунок 2. Примеры отклонения количества получаемых байт за 1 такт (слева) и искажения принимаемого синусоидального сигнала датчика (в центре и справа).

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

9c85a4c9ef94a19ec552f51eba5817ba.png

Рисунок 3. Зашумленный 4-х байтовый синусоидальный сигнал.    

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

e73c437cf608961ad998c1d336711da4.png

Пики появляются в моменты, когда LabVIEW принимает 7 байт вместо шести. Первый пик добавляет в сигнальную последовательность два нулевых байта и заменяет сигнальные байты 0/10 на 13/144, а байты 0/9/197/0 на 3/192. Второй пик также добавляет в сигнальную последовательность два нулевых байта, заменяет сигнальные байты 0/10 на 3/192 и заменяет байты 0/11/56/0 на 13/144.

Результаты тестирования «зашумлений»

В процессе экспериментального тестирования выявлено следующее. 

1.        LabVIEW добавляет «заголовок» (свои байты) если последовательность данных носит периодический характер, например, передаются два синусоидальных сигнала с одинаковыми периодами в формате int16 (2 байта) и int32 (4 байта).

2.        При наличии заголовков теряется часть сигнальных данных. 

3.        Заголовок устанавливается автоматически вначале повторяющейся цепочки данных.

4.        Повторяющиеся цепочки данных не обязательно следуют друг за другом. Они могут идти через промежутки (блоки байт).

5.        Для синусоидального сигнала в формате int16 заголовок состоит из двух слов.

6.        Содержимое заголовка зависит от периода сигнала.

7.        Моменты появления заголовка можно обнаружить по дополнительным байтам в буфере СОМ порта.

8.        Заголовок может включать, например, два байта: 10 (перевод строки) и 9 (горизонтальная табуляция) или 10 (перевод строки) и 11 (вертикальная табуляция) или другие байты, как показано в Таблица 1.

9.        Замена LabVIEW запроса 1 (ASCII код 49) (см. Рисунок 1) на D (ASCII код 68) не устраняет генерацию заголовков.

10.    Применение синхронного или асинхронного режима приема передачи (I/O mode) блоков VISA Write и VISA Read также не устраняет генерацию заголовков.

11.    LabVIEW не создает заголовков если не находит повторяющуюся последовательность. Для этого в примере последовательной передачи данных блоками по 6 байт достаточно второй синусоидальный сигнал заменить неизменным уровнем (константой).

Решение проблемы искажения периодических сигналов

LabVIEW не создает заголовки и не «зашумляет» принимаемые через СОМ порт данные, имеющие периодические фрагменты, если данные принимаются через «очередь», образованную блоками Queues LabVIEW (см. Рисунок 4), хотя и в этом случае количество принимаемых байт на каждом такте может изменяться.

Пример блок схемы LabVIEW, принимающей данные контроллера через очередь, приведен на Рисунок 5. Цикл While: Enqueue Loop отправляет запрос (ASCII код 1) в СОМ порт, принимает байты сигнальных данных и передает их в очередь. Цикл While: Dequeue Loop достает сигнальные байты из очереди, формирует из них два int16 сигнала. Цикл While: Queue Status отображает количество байт в очереди. Максимальный размер очереди в этом примере 300 байт.

4308e9c9dd5fb67495c822f03b643947.png

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

1e033cd96519711b2b01be5cb36570a6.png

Рисунок 5. Пример приема данных контроллера по запросу через очередь LabVIEW.

© Habrahabr.ru