Написание программы на языке Delphi

с использованием библиотеки ZADC.dll

Поставлена задача написания программы на языке Delphi 7.

В связи с этим у клиентов часто возникают следующие просьбы:

  • скинуть примитив для выше обозначенной среды, где снимался бы сигнал с первого пина аналогового входа-выхода с заданной заранее частотой, чтобы можно было понять, как это делается. То есть самый простой исходник, который можно было бы скомпилировать, подать тестовые данные и дальше уже упражняться в работе с интерфейсом zetlab в Delphi;
  • любые примеры приложений, использующих библиотеки zetlab, а также документации для работы в среде Delphi.

РУКОВОДСТВО ПРОГРАММИСТА с описанием функций есть на диске с дистрибутивами (HELP_ZETLab studio_special.pdf), а также на ftp.
Примеры программирования (в том числе и на Delphi) также есть на диске с дистрибутивами (папка Documentation\Samples), или на ftp.

ИЗ ПРЕДСТАВЛЕННОГО ПРИМЕРА СТАНОВИТСЯ ПОНЯТНО, КАК ОБРАЩАТЬСЯ К РАЗДЕЛЯЕМОЙ БИБЛИОТЕКЕ.
Однако остаются следующие вопросы: изменить частоту сбора/отображения данных, сбора данных с вольтметра, осциллографа. Плюс в PDF описание функций для с++. Как использовать это в Delphi не совсем понятно. Как это применимо в среде Delphi?

То есть как можно это поменять через программу и опросить устройство, какие данные оно получает?

ПОЛУЧЕНИЕ СПИСКА ВОЗМОЖНЫХ ЧАСТОТ ДИСКРЕТИЗАЦИИ АЦП/ЦАП

long ZGetListFreqADC (long typeD

evice, long numberDSP, long n

ext, double *freq) (Zadc.dll)

long ZGetListFreqDAC (long typeDevice, l

ong numberDSP, long next, double *freq)

Эти функции применимы в Delphi, так же, как и, например, функции ZGetNumberInputADC/ZGetNumberInputDAC, используемые в примере на диске. Функции ZGetListFreqADC/ZGetListFreqDAC используются для получения списка возможных частот дискретизации.
В пункте 1.7 руководства ZETLabStudio описано, как с ними работать. Рабочий пример есть на диске с дистрибутивом, а также на ftp-сервере. В нем как раз отражен алгоритм чтения измеренных данных с устройства.

ПОЛУЧЕНИЕ ДАННЫХ ИЗМЕРИТЕЛЬНЫХ КАНАЛОВ НЕ ПРЕДПОЛАГАЕТ РАБОТУ ПО ОДНОМУ ОТСЧЕТУ АЦП
Частота дискретизации, например в ZET210, может достигать 500 кГц, если работать с одним включенным каналом на максимальной частоте, но это не означает, что программа 500000 раз в секунду будет брать по одному отсчету. Данные из устройства пересылаются на компьютер и в драйвере буферизируются. Пересылка осуществляется определенными порциями. В ОС Windows не получится часто забирать данные, даже если они будут приходить по одному отсчету. Обработка данных должна происходить порциями. Точно также придется работать и с цифровым портом. Работа с ним отличается от работы с аналоговыми данными тем, что у каналов цифрового порта нет частоты дискретизации, можно только считывать состояние цифрового порта. А вот как часто это можно делать зависит от параметров компьютера и ОС. Описание функций по работе с цифровым портом представлены в п. 1.14 руководства ZETLabStudio.

ПОЛУЧАТЬ ДАННЫЕ С ТАКОЙ ЧАСТОТОЙ ОТ УСТРОЙСТВА МОЖНО (МАКСИМУМ 500 кГц)
и получается столько отсчетов АЦП, сколько выставлена частота дискретизации. Но все эти отсчеты вы будете получать не по одному, а определенными порциями, то есть, например, при частоте 100 кГц Вы получите N порций по M отсчетов за секунду и N * M = 100000. Передача данных порциями вытекает из особенностей передачи данных по USB, чтобы обеспечить максимальную пропускную способность потоков данных от устройства и к устройству. При работе с цифровым портом вы сможете получить столько отсчетов в секунду, сколько успеете раз опросить цифровой порт программой, потому что для него нет понятия частоты дискретизации.

ДЛЯ РАБОТЫ С ЦИФРОВЫМ ПОРТОМ НЕОБХОДИМО СДЕЛАТЬ СЛЕДУЮЩИЕ МАНИПУЛЯЦИИ:
1) Вызвать ZSetDigOutEnable, где в качестве digitalOutEnableMask задать маску для настройки работы пинов на вход (если все должны работать на вход, то получится 0)
2) В цикле вызывать функцию ZGetDigInput для чтения состояния цифрового порта. В переменной digitalInput будет выдано состояние входа цифрового порта, где каждый бит отвечает за соответствующий пин цифрового порта.

ПРОЦЕСС ПОЛУЧЕНИЯ И ОБРАБОТКИ ДАННЫХ ИМЕЕТ СЛЕДУЮЩИЙ АЛГОРИТМ.
При передаче данных с устройства на компьютер в драйвере происходит буферизация данных в циклическом буфере, указатель на который мы получаем функцией ZGetBufferADC. По мере прихода данных этот буфер заполняется и перезаписывается. Для позиционирования по буферу существует переменная-указатель на текущую позицию заполнения буфера, т.е. это фактически индекс последнего принятого от устройства отсчета в циклическом буфере. Получение текущего значения указателя происходит функцией ZGetPointerADC. Соответственно в цикле постоянно опрашивается значение указателя и если оно изменилось, значит пришли новые данные и их нужно вычитать из буфера драйвера и обработать требуемым алгоритмом. Размер данных это разница между предыдущим значением указателя и текущим. Собственно, это и происходит в примере (только на экран выводится не все отсчеты, а последний из порции).

В случае если не получилось забрать остальные результаты из порции в примере.
В ПРИМЕРЕ ПРОСТО ПРИ ИЗМЕНЕНИИ УКАЗАТЕЛЯ КОПИРУЕТСЯ ОДИН ОТСЧЕТ
( CopyMemory(@sample16ADC[0], pBuffer16ADC, 2);) из буфера, а нужно копировать все от pointerADC_old до pointerADC.

Что касается драйвера, то его задача просто заполнять буфер с данными и не заботиться о том, прочитали из него или нет. Поэтому нужно следить за указателем pointerADC из программы и вовремя забирать из буфера драйвера данные куда-нибудь в буфер в программы. Если долго не копировать данные из буфера драйвера, они могут затереться, так как буфер циклический. Чтобы определить на сколько хватает буфера, можно опросить его размер, количество включенных каналов устройства, частоту дискретизации по каналам, размер одного отсчета и по формуле посчитать на сколько времени хватает буфера.