Форум: Техническая поддержка

Тема: E-502. Cинхронный цифровой вывод

Вы не вошли.

 Поиск | Регистрация | Вход 

26.11.2021 15:48:50
#1

Участник
Здесь с 29.10.2021
Сообщений: 25

E-502. Cинхронный цифровой вывод

Это тема является продолжением темы
https://www.lcard.ru/forums/viewtopic.php?id=10446

Поскольку программное обеспечение платы L-502 в настоящее время
не позволяет осуществить синхронный цифровой вывод DO по внешнему
синхроимпульсу, мы решили попробовать реализовать нужный нам режим
при помощи устройства E-502.
Используем E-502 со следующими параметрами:
ПЛИС 2
PLDA 0.15
ARM 1.0.21.0

SDK от 01.11.21     Версия 1.1.21

Нам нужно, чтобы по каждому синхроимпульсу DI_SYN2 на
цифровой выход выдавался один отсчет из буфера.
Код инициализации синхронного цифрового вывода (кратко, без обработки ошибок):
  X502_SetSyncMode(hnd,X502_SYNC_DI_SYN2_FALL);
  X502_SetSyncStartMode(hnd,X502_SYNC_INTERNAL);
  X502_SetExtRefFreqValue(hnd,131072);
  X502_SetOutFreqDivider (hnd,1);
  X502_StreamsEnable(hnd,X502_STREAM_DOUT);
  X502_Configure(hnd, 0);
  X502_StreamsStart(hnd);

По таймеру формируем буфер из 1024 байт, в котором
следующий байт на 1 больше предыдущего.
Код на вывод:
Вывод данных делается по таймеру:
    uint32_t    BufToSend[65535];
    uint32_t    out_buf[65535];
// Заполняем BufToSend
          ....
      X502_PrepareData(hnd, NULL,NULL, BufToSend,m_SendSize , 0, out_buf);
      X502_Send (hnd, out_buf,m_SendSize, 0);

При работе через USB получаем:
периодически ровно через 128 отсчетов от начала передаваемого буфера
(что соответствует длительности примерно 1 млсек от начала буфера)
происходят пропуски синхроимпульсов длиной от 1 до 50 отсчетов.
См. рисунок.
Rabota-po-USB.jpg
При работе через Ethernet картина другая. Сбои происходят намного
реже - с  периодом несколько секунд. Пропуск синхроимпульса происходит
через 1-2 отсчета от начала буфера, длительность сбоя - 3 отсчета.
Чтобы игнорировать пропусти первых синхроимпульсов
мы сделали 4 первых отсчета пустыми (заполнили нулем).

Можно ли как то доработать ПО E-502, чтобы режим передачи по USB
заработал?

01.12.2021 14:16:27
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,259

Re: E-502. Cинхронный цифровой вывод

Вообще сама логика вывода в модуле не должна зависеть от интерфейса (USB/Ethernet), поток данных передается на вывод одинаковым способом. По описанию больше похоже на проблему передачи данных в модуль, что вовремя они не передаются, т.к. если на момент синхроимпульса данных в буфере модуля нет, то соответственно и будет повторено последнее значение, что будет выглядеть как пропуск синхроимпульса. И так будет повторяться до тех пор, пока при приходе синхроимпульса не будет слова данных на вывод в буфере самого модуля.
Была ли такая ситуация, можно проверить, вызывая при выводе X502_OutGetStatusFlags() с проверкой флага X502_OUT_STATUS_FLAG_BUF_WAS_EMPTY (если будут случаи, когда он установлен, значит проблема как раз в своевременной подкачке данных).
Также не очень понял, что значит периодически начиная от начала буфера, о каком буфере идет речь? Вашем на верхнем уровне? Если так, то скорее опять же вопрос к своевременной передачи этого буфера, т.к. с точки зрения потокового вывода в модуле данные выводятся общим потоком, данные новой передачи помещаются в очередь вслед за оставшемися от предыдущей и этого деления на буферы для модуля уже нет.
Есть этот пропуск при выводе самых первых данных, которые выводились до Prepare?
Про передачу буферов по таймеру, как при этом обеспечивается соответствие времени этого таймера внешним событиям и  что буфер в модуле не опустошается . я из предыдущей темы не понял.

01.12.2021 19:50:13
#3

Участник
Здесь с 29.10.2021
Сообщений: 25

Re: E-502. Cинхронный цифровой вывод

Мы передаем данные на вывод с частотой, значительно меньшей, чем они выводятся.
В пересчете на период синхроимпульсов длина буфера составляем 7.8 миллисекунд,
а таймер вывода буфера работает с интервалом 50 миллисекунд.  Так что речи о переполнении
быть не может.
Код вывода для Ethernet и USB интерфейсов одинаков. Весь буфер выводится одной командой
X502_Send.
При работе по Ethernet теряются первые байты передаваемых  данных.
Также выяснилось, что каждые 11-12 минут непрерывной работы по Ethernet бывают потери
синхроимпульсов различной длительности через несколько миллисекунд от начала буфера.
Картинку сбоев постараюсь сделать завтра.

При работе по USB следует обратить внимание, что время начала сбоя (пропуска синхроимпульсов)
фиксировано!

02.12.2021 09:55:50
#4

Участник
Здесь с 29.10.2021
Сообщений: 25

Re: E-502. Cинхронный цифровой вывод

При работе по Ethernet время начала сбоя тоже фиксировано - 359 отсчетов от
начала кадра, что составляет примерно 2.73 миллисекунды
mini_Rabota-po-Ethernet.jpg

02.12.2021 09:56:51
#5

Участник
Здесь с 29.10.2021
Сообщений: 25

Re: E-502. Cинхронный цифровой вывод

Rabota-po-Ethernet.jpg

03.12.2021 21:02:47
#6

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,259

Re: E-502. Cинхронный цифровой вывод

Так вопрос как раз не про переполнение, а про опустошение.
Синхроимпульсы у Вас идут постоянно? Т.е. после того, как предыдущий блок вывелся, а новый не поступил, синхроимпульсы продолжают идти? Если импульсы идут всегда, то может быть проблема, что буфер пустой, Вы посылаете потом следующий буфер, который до модуля доходит за несколько передач. Т.к. вывод запущен, то как первая передача попадет в модуль, так она начнет выводится, при этом остальные еще не дошли и вполне может быть разрыв данных, если предыдущая передача вывелась, а новая еще не дошла. Это нужно тогда постоянно передавать  поток, заполняя пробелы повторными данными, чтобы буфер не опустошался, либо вообще перезапускать вывод на каждый буфер, чтобы данные загружались каждый раз между Prepare и Start, когда вывод запрещен.

03.12.2021 21:49:16
#7

Участник
Здесь с 29.10.2021
Сообщений: 25

Re: E-502. Cинхронный цифровой вывод

Синхроимпульсы идут постоянно.
В буфере мы передаем 1024 байта. Начало и конец
каждого буфера заполнены нулями.
Задержки происходят, когда весь буфер еще не передан.
Это видно из картинок. Сбои происходят во время передачи!
Правильно, после передачи 1024 байт буфер опустошается и,
поскольку импульсы продолжаются, выводится последний отсчет -
нуль.

22.12.2021 12:22:36
#8

Участник
Здесь с 29.10.2021
Сообщений: 25

Re: E-502. Cинхронный цифровой вывод

Выяснил одну особенность передачи данных по USB:
если перед вызовом X502_Send вызвать функцию X502_OutGetStatusFlags,
то периодическая задержка через 128 отсчетов пропадает.
Таким образом, код передачи у меня выглядит так:
      X502_PrepareData(hnd, NULL,NULL, BufToSend,m_SendSize , 0, out_buf);
      X502_OutGetStatusFlags(hnd,&status);
      X502_Send (hnd, out_buf,m_SendSize, 0);

Однако, редкие задержки (через 10-12 минут), как при передаче по Ethernet,
остаются.
Прошу объяснить эту особенность

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск