Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Запуск и чтение потоковых данных с АЦП E-502

Вы не вошли.

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

06.09.2020 15:35:21
#1

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

Запуск и чтение потоковых данных с АЦП E-502

Добрый день!

Пытаюсь следовать по https://www.lcard.ru/download/x502_low_level.pdf. Имею цель запустить периодические измерения через Ethernet. Не вижу в этом документе, как это сделать и что должно произойти. Также невнятно, зачем порт 11115.

Теперь подробнее. С разделе 3.4.4 приведён список действий. Выполняю по нему (псевдокод):

e502_11114.write_LTABLE(settings)  # всё нули для пробы
e502_11114.write_register(IN_STREAM_ENABLE, 0)  # регистр 0x419
e502_11114.get_response()  # пустой ответ, но, вроде, требуется, согласно главе 4.1
e502_11114.start_data_stream()  # 4.4.2.1 — Запуск обмена потоковыми данными
e502_11114.preload_adc()  # две записи в этот регистр
e502_11114.set_GO_SYNC_IO(1)
# тут должно быть получение данных через порт 11115
e502_11114.set_GO_SYNC_IO(0)
e502_11114.stop_data_stream()  # 4.4.2.2 — Останов обмена потоковыми данными

Однако на порту 11115 на третьей снизу строчке меня никакие данные не ждут. Что-то не включил?

Как расположены данные настроек каналов в LTABLE? Если у меня используется один канал, то я пишу с 0x200 по 0x203?

На порту 11114 при этом интересные данные лежат:

CTL1\x00\x00\x00\x00\x01\x00\x00\x00\x01
CTL1\x00\x00\x00\x00\x00\x00\x00\x00
CTL1\x00\x00\x00\x00\x00\x00\x00\x00
CTL1\x00\x00\x00\x00\x00\x00\x00\x00
CTL1\x00\x00\x00\x00\x00\x00\x00\x00

Что бы это значило?

Спасибо форуму за его таймауты.

07.09.2020 21:45:20
#2

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

Re: Запуск и чтение потоковых данных с АЦП E-502

Здравствуйте.

По поводу LTABLE, то при одном канале Вы записываете его настройки в регистр 0x200 (адресуемые регистры в E-502 уже 32-битные и каждый 32-битный регистр занимает только один адрес)

Можете выложить или отправить по почте запись обмена данных сделанную с помощью Wireshark, чтобы увидеть точную временную последовательность передаваемых/принимаемых байт, а не вызовы функций?

08.09.2020 20:40:02
#3

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

Re: Запуск и чтение потоковых данных с АЦП E-502

Спасибо за ответ. Вроде, так и сделал. Проверьте, пожалуйста:

Таблица из Wireshark
No.	Time	Source	Destination	Protocol	Length	Info
1	0.000000000	192.168.1.39	192.168.1.128	TCP	74	45722 → 11114 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2971999113 TSecr=0 WS=128
2	0.000088917	192.168.1.128	192.168.1.39	TCP	78	11114 → 45722 [SYN, ACK] Seq=0 Ack=1 Win=1088 Len=0 MSS=1460 WS=16 TSval=918990 TSecr=2971999113 SACK_PERM=1
3	0.000115280	192.168.1.39	192.168.1.128	TCP	66	45722 → 11114 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=2971999113 TSecr=918990
4	0.000162045	192.168.1.39	192.168.1.128	TCP	74	56560 → 11115 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2971999113 TSecr=0 WS=128
5	0.000241870	192.168.1.128	192.168.1.39	TCP	78	11115 → 56560 [SYN, ACK] Seq=0 Ack=1 Win=0 Len=0 MSS=1460 WS=16 TSval=918990 TSecr=2971999113 SACK_PERM=1
6	0.000256050	192.168.1.39	192.168.1.128	TCP	66	56560 → 11115 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=2971999113 TSecr=918990
7	0.000343777	192.168.1.128	192.168.1.39	TCP	66	11115 → 56560 [FIN, ACK] Seq=1 Ack=1 Win=65520 Len=0 TSval=918990 TSecr=2971999113
8	0.000704452	192.168.1.39	192.168.1.128	TCP	90	45722 → 11114 [PSH, ACK] Seq=1 Ack=1 Win=64256 Len=24 TSval=2971999113 TSecr=918990
9	0.000830041	192.168.1.128	192.168.1.39	TCP	78	11114 → 45722 [PSH, ACK] Seq=1 Ack=25 Win=1056 Len=12 TSval=918990 TSecr=2971999113
10	0.000843674	192.168.1.39	192.168.1.128	TCP	114	45722 → 11114 [PSH, ACK] Seq=25 Ack=13 Win=64256 Len=48 TSval=2971999113 TSecr=918990
11	0.000975028	192.168.1.128	192.168.1.39	TCP	78	11114 → 45722 [PSH, ACK] Seq=13 Ack=73 Win=1008 Len=12 TSval=918991 TSecr=2971999113
12	0.000984697	192.168.1.39	192.168.1.128	TCP	86	45722 → 11114 [PSH, ACK] Seq=73 Ack=25 Win=64256 Len=20 TSval=2971999114 TSecr=918991
13	0.001027884	192.168.1.128	192.168.1.39	TCP	78	11114 → 45722 [PSH, ACK] Seq=25 Ack=73 Win=1008 Len=12 TSval=918991 TSecr=2971999113
14	0.001032091	192.168.1.39	192.168.1.128	TCP	66	45722 → 11114 [ACK] Seq=93 Ack=37 Win=64256 Len=0 TSval=2971999114 TSecr=918991
15	0.001236990	192.168.1.39	192.168.1.128	TCP	66	56560 → 11115 [ACK] Seq=1 Ack=2 Win=64256 Len=0 TSval=2971999114 TSecr=918990
16	0.003610408	192.168.1.39	192.168.1.128	TCP	182	45722 → 11114 [FIN, PSH, ACK] Seq=93 Ack=37 Win=64256 Len=116 TSval=2971999116 TSecr=918991
17	0.003637511	192.168.1.39	192.168.1.128	TCP	66	56560 → 11115 [FIN, ACK] Seq=1 Ack=2 Win=64256 Len=0 TSval=2971999116 TSecr=918990
18	0.009343881	192.168.1.128	192.168.1.39	TCP	78	11114 → 45722 [PSH, ACK] Seq=37 Ack=93 Win=992 Len=12 TSval=918999 TSecr=2971999114
19	0.009379301	192.168.1.39	192.168.1.128	TCP	54	45722 → 11114 [RST] Seq=93 Win=0 Len=0
20	0.009386864	192.168.1.128	192.168.1.39	TCP	66	11115 → 56552 [FIN, ACK] Seq=1 Ack=1 Win=0 Len=0 TSval=918999 TSecr=2971961558
21	0.009393846	192.168.1.39	192.168.1.128	TCP	66	56552 → 11115 [ACK] Seq=1 Ack=2 Win=502 Len=0 TSval=2971999122 TSecr=918999
22	0.017727443	192.168.1.128	192.168.1.39	TCP	66	11114 → 45722 [ACK] Seq=49 Ack=210 Win=880 Len=0 TSval=919007 TSecr=2971999116
23	0.017751349	192.168.1.39	192.168.1.128	TCP	54	45722 → 11114 [RST] Seq=210 Win=0 Len=0
24	0.019082334	192.168.1.128	192.168.1.39	TCP	66	11115 → 56560 [ACK] Seq=2 Ack=2 Win=65520 Len=0 TSval=919009 TSecr=2971999116
25	0.070038314	192.168.1.128	192.168.1.39	TCP	66	[TCP Window Update] 11115 → 56552 [ACK] Seq=2 Ack=1 Win=4095 Len=0 TSval=919060 TSecr=2971961558
26	0.070073915	192.168.1.39	192.168.1.128	TCP	66	56552 → 11115 [FIN, ACK] Seq=1 Ack=2 Win=502 Len=0 TSval=2971999183 TSecr=919060
27	0.070187949	192.168.1.128	192.168.1.39	TCP	66	11115 → 56552 [ACK] Seq=2 Ack=2 Win=4095 Len=0 TSval=919060 TSecr=2971999183

Дамп из Wireshark

09.09.2020 05:54:55
#4

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

Re: Запуск и чтение потоковых данных с АЦП E-502

Простите, забыл указать, что E-502 имеет адрес 192.168.1.128, а компьютер — 192.168.1.39.

09.09.2020 10:23:29
#5

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

Re: Запуск и чтение потоковых данных с АЦП E-502

Посмотрел дамп.
Сами команды формируются правильно, но есть следующие проблемы:
1. В регистр IN_STREAM_ENABLE Вы записываете 0. При этом сам регистр состоит из двух битов, младший - разрешение ввода данных с АЦП (1 - разрешение, 0 - запрет), следующий бит - разрешение данных с цифровых линий. Т.е. могут быть записаны значения: 0 - все источники синхронного ввода запрещены, 1 - разрешение только с АЦП, 2 - разрешение только с DIGIN, 3 - разрешение и АЦП и DIGIN. У Вас 0 - данные при таком значении не будут передаваться.
2. Кроме логической таблицы нужно еще установить частоту сбора - ADC_FREQ_DIV (два регистра — один в IOHARD и один в IOARITH — должно быть записано одно и то же значение)
3. По тому дампу Ваша программа закрывает соединение не дожидаясь пока команды обработает E-502 и пошлет на них ответы. У Вас есть только один вызов get_response, при этом не до конца понятно, сколько ответов он ждет.

На каждую переданную команду модуль возвращает ответ (даже если в нем нет данных - возвращается по крайней мере заголовок 12 байт  с сигнатурой ответа, кодом ошибки и размером данных равным 0). В принципе допустимо посылать новые команды до приема ответа на предыдущие, как делается у Вас, в этом случае модуль в любом случае будет извлекать их последовательно из буфера на прием и в том же порядке выполнять и по выполнению возвращать ответы. Таким образом, если Вы не принимаете ответ после каждой команды, то нужно запоминать сколько было послано команд, на которые еще не приняли ответы, и соответственно после уже принять это количество ответов. Только по факту приема ответов можно сказать, что команды были обработаны модулем. Закрытие соединения в штатном режиме соответственно тоже должно быть только после приема всех ответов, чтобы гарантировать выполнение всех посланных команд.

Пакет

CTL1\x00\x00\x00\x00\x00\x00\x00\x00

это и есть ответ на команду, просто подтверждающий ее успешное выполнение и не содержащий дополнительные данные в ответе (возвращается на команды записи в регистры и запуска потока - в дампе все ответы такие).
Пакет

CTL1\x00\x00\x00\x00\x01\x00\x00\x00\x01

  это ответ с одним байтом данных, со значением 1. Например, так может выглядеть ответ на команду 0x15. В дампе таких ответов не было.

В дампе происходит следующая ситуация:
посылаются команды записи в логическую таблицу (2 команды, кол-во и настройки первого канала), запись в IN_STREAM_ENABLE, команды 0x12 для разрешения ввода. К этому моменту модуль успевает обработать и ответить на 3 из 4-х команд.
Далее следует передача целого набора команд в одном пакете вместе с признаком закрытия соединения (пакет с FIN), т.е. видимо сразу делается close на сокет и передача команд объединены с закрытием.  Модуль после этого успевает обработать команду 4 и послать на это ответ. Но, т.к. соединение закрыто, то компьютер шлет на этот ответ сразу сброс (RST), в результате чего соединение будет сброшено, включая весь буфер с необработанными командами.

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

10.09.2020 20:51:11
#6

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

Re: Запуск и чтение потоковых данных с АЦП E-502

Алексей L Card пишет:

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

Виноват: мой косяк. Я наигрался с изменением кода, забыл добавить получения ответов. Спасибо!

Частоту делителя ставлю теперь, ввод с АЦП разрешаю (в мануале неясно про это написано, спасибо за разъяснение тут).

Вот исправленная версия: дамп из Wireshark. Всё ещё пусто на порту 11115. Чего не хватает?

11.09.2020 09:50:09
#7

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

Re: Запуск и чтение потоковых данных с АЦП E-502

Тут может быть проблема в том, что Вы в качестве настроек канала записываете 0xFE00, т.е. устанавливаете усреднение равное 128 отсчетам, в то время как в делитель опорной частоты записываете 1, т.е. деление на 2.
Усреднение по каналу не может быть больше, чем делитель опорной частоты.
Если кратко, то усреднение работает следующим образом (подробно описано в usersguide):
- само по себе АЦП выполняет всегда преобразования на опорной частоте
- если стоит деление на N, но нет усреднения, то АЦП на каждый канал выполняет N преобразований и передается только последнее.
- если стоит усреднение в K (1  < k <= N), то из этих N измерений для одного канала отбрасываются первые N - k (что определяет требуемое время на коммутацию каналов), по последним k выполняется усреднение и это одно значение передается.

Таким образом, если K > N, то по сути алгоритм получения результирующего отсчета не наберет  K отсчетов для расчета результатов, т.к. каждые N тактов идет переход к следующему каналу.

Попробуйте убрать усреднение в настройках канала, повлияет ли на ситуацию. В остальном вроде все выглядит корректно.

Контакты

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

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

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

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