Данная программа предназначена для создания измерительных систем в рамках пакета
CRW-DAQ с использованием измерительной карты
E14-140 производства L CARD.
Преобразователь напряжения измерительный E14-140 подключается к компьютеру через шину USB-1.1.
Он имеет 14-битный АЦП с мультиплексором, позволяя выполнять измерения
в 16 дифференциальных каналах или в 32 каналах с общей землей с общей частотой опроса до 100 кГц.
В каждом канале доступно 4 диапазона измерения: ±10000 mV, ±2500 mV, ±625 mV, ±156.25 mV.
При работе в дифференциальном режиме доступно также измерение "смещения нуля", при котором вход АЦП закорачивается
(закоротка выполняется схемой внутри устройства и не требует закоротки внешних входов АЦП).
Кроме того, E14-140 имеет 16 цифровых вводов и 16 цифровых выводов, а также 2 канала ЦАП.
Следует отметить, что ЦАП устанавливается как опция, которая по в базовой комплектации отсутствует.
Устройство выполняет измерения произвольной длительности в непрерывном режиме, в отличие от цифровых осциллографов,
которые могут выполнять лишь "фотоснимок" конечной длины.
При этом программное обеспечение позволяет с помощью программных цифровых фильтров мгновенно менять частоту сбора данных
в широких пределах, позволяя регистрировать как медленно изменяющиеся, зашумленные сигналы, так и быстро протекающие процессы.
Возможность динамически изменять степень сглаживания и частоту сбора данных дает уникальные возможности для реализации
самых разнообразных систем на одной и той же аппаратуре, не требуя отдельных устройств для регистрации "быстрых" и "медленных" процессов.
При работе с устройством и программой сбора данных следует учитывать следующие обстоятельства и ограничения.
Во-первых, в силу особенностей USB данные поступают блоками размером от 32 до нескольких тысяч измерений,
в зависимости от заданной частоты АЦП. Программа сбора данных реализована таким образом, что независимо от частоты АЦП
блоки данных поступают с частотой около 20 Гц, то есть примерно каждые 50 миллисекунд.
Это несколько ограничивает применение данного устройства в системах управления реального времени, так как данные,
хотя и измеряются с высокой частотой, но поступают в компьютер с задержкой 50 миллисекунд и более.
Во-вторых, поскольку для тактирования АЦП используется кварцевый генератор,
частота которого может слегка отличаться от кварца, установленного в компьютере,
то время кривых АЦП может "уходить" по отношению к системным часам компьютера.
Уход часов составляет порядка секунды в сутки.
Кроме того, начальная синхронизация, то есть определение момента старта АЦП,
выполняется с точностью порядка 10-20 миллисукунд и более.
Таким образом, прикладное программное обеспечение должно учитывать возможность
смещения и ухода времени часов АЦП, особенно при длительных измерениях.
Для коррекции "ухода" часов АЦП есть процедура автокоррекции,
которая пытается программно "выправить" часы АЦП, рассчетно корректируя их частоту - так, чтобы
разница временн по часам компьютера и АЦП не увеличивалась, а оставалась близкой к нулю.
При этом расчетная частота АЦП будет слегка "гулять" из-за регулировки.
Эта коррекция может быть отключена указанием нулевого параметра коррекции,
если для данной задачи предпочтительнее иметь фиксированную частоту.
Далее, при работе АЦП с частотой регистрации выше 10 кГц использование цифровых вводов и цифровых выводов,
а также ЦАП не рекомендуется, так как из-за ограниченной пропускной способности шины USB-1.1 команды
цифрового ввода-вывода и ЦАП начинают мешать сбору данных АЦП, что приводит к аварийной остановке измерений по ошибке ввода-вывода.
Специальные флаги в программе позволяют отключать работу цифрового ввода-вывода и ЦАП, чтобы гарантировать безотказную работу АЦП.
К началу
Состав и конфигурирование программы сбора данных
С формальной точки зрения программа сбора данных является устройством, имеющим:
32 аналоговых выхода, в которые записываются измеренные данные АЦП.
В дифференциальном режиме на выходы 16..31 пишутся данные по "смещению нулей" АЦП.
Данные выдаются в милливольтах.
16 цифровых входов, из которых формируется 16-битное слово для записи в цифровые выходы E140.
3 цифровых выхода.
В Digital Output 0 записывается состояние 16 цифровых входов E140.
В Digital Output 1 записывается разница времени по часам E140 и системного времени компьютера.
Эта разница определяется следующим образом.
При поступлении первой порции данных программа определяет и запоминает момент старта АЦП,
отняв от текущего времени по часам компьютера время заполнения первого буфера, определяемое по размеру буфера и частоте опроса АЦП.
При поступлении следующих порций данных разница времени находится как разность текущего времени по часам компьютера и времени
по часам АЦП, определяемого как сумма запомненного начального времени и времени текущего измерения, рассчитанную по частоте опроса АЦП.
На практике видно, что смещение (момент старта АЦП) определяется с точностью порядка 20 миллисекунд,
а "уход" часов составляет порядка секунды в сутки. Кривая разницы времен позволяет контролировать этот "уход" часов
и корректировать шкалу времени измеренных данных с учетом этой разницы.
При использовании автокоррекции при помощи изменения (подстройки) используемой для расчетов частоты АЦП
делается попытка удержать разницу времен по часам АЦП и компьютера в ограниченных пределах. Поэтому при режиме автокоррекции частоты
разница времен должна колебаться в пределах секунды около нуля.
В Digital Output 2 записывается текущая расчетная частота опроса E140.
Изначально желаемая частота опроса АЦП задается при указании параметровАЦП.
После старта АЦП устройство возвращает реально установленную номинальную частоту АЦП,
рассчитанную по номинальной частоте кварцевого генератора и коэффициенту деления в схеме тактового генератора.
Однако, из-за отличия реальной частоты кварца от номинальной, время, рассчитанное по этой номинальной частоте,
будет "дрейфовать" относительно часов компьютера. Для того, чтобы устранить этот эффект, есть процедура
автокоррекции часов, которая пытается скорректировать расчетную
частоту АЦП так, чтобы разница времен не возрастала. Эта расчетная частота и пишется в кривую.
2 аналоговых входа, через которые подаются данные для записи в каналы ЦАП-ов.
Записываемые данные надо задавать в милливольтах.
PAS - прикладная программа, исполняемая в виртуальной машине DAQ Pascal, в контексте процесса CRW-DAQ.
DLL - динамическая библиотека, загружаемая и вызываемая из программы PAS и работающая в рамках процесса CRW-DAQ.
EXE - автономная программа, исполняемая в отдельном процессе, взаимодействующем с процессом CRW-DAQ с помощью
общей памяти (shared memory) и анонимных каналов (anonymous pipe).
При этом программа PAS является ведущей, она отвечает за загрузку и освобождение библиотеки DLL, а также за запуск и завершение процесса EXE.
Программа PAS взаимодействует с EXE через анонимные каналы ввода-вывода (с помощью переназначения потоков стандартного ввода-вывода
StdIn, StdOut в анонимные каналы).
При старте измерений она посылает в StdIn программы EXE команду старта, после чего EXE начинает сбор данных.
При этом по мере поступления данных EXE через свой StdOut посылает программе PAS сообщения, уведомляющие о поступлении измеренных данных.
Уведомления не содержат самих данных, они дают лишь ссылку на буфер в общей памяти, где эти данные можно прочитать.
При поступлении сообщения с уведомлением программа PAS вызывает библиотеку DLL, которая считывает измеренные данные
из общей памяти с помощью ссылки, содержащейся в полученном сообщении. Использование DLL и общей памяти обеспечивает максимально
возможную скорость сбора данных. В то же время использование автономного процесса EXE для сбора данных обеспечивает отказоустойчивость,
так как при сбое в программе сбора данных "падает" только процесс EXE, в то время как программа PAS продолжает работу.
Увидев, что процесс EXE аварийно завершился, программа PAS перезапускает его и измерения продолжаются.
Таким образом, сочетание хорошо защищенной виртуальной машины DAQ Pascal, загружаемой библиотеки DLL,
автономнного процесса EXE, общей памяти и анонимных каналов обеспечивает все требуемые свойства - отказоустойчивость,
высокую скорость сбора данных и адаптивность (возможность легко модифицировать прикладную программу без потери надежности).
Конечно, это достигается усложнением структуры программы, однако в данном случае это оправдано резким повышением надежности
при сохранении высокой скорости сбора данных.
На следующем рисунке отображается структура программы:
На рисунке показано, что прикладная программа E140_DRV.PAS работает в контексте процесса CRW-DAQ,
но при этом защищена средствами виртуальной машины DAQ Pascal, которая обеспечивает изоляцию адресного пространства и перехват ошибок
прикладной программы, что гарантирует отказоустойчивость системы по отношению к ошибкам и сбоям в коде прикладной программы E140_DRV.PAS.
Автономная программа E140_DRV.EXE защищена средствами MMU и операционной системы.
Memory Management Unit - это аппаратная защита памяти на физическом уровне, встроенная в процессор x86,
которую поддерживают все современные операционные системы, включая Windows. Эта защита обеспечивает отказоустойчивость системы
по отношению к ошибкам и сбоям в коде программы E140_DRV.EXE. При аварийном завершении
программы E140_DRV.EXE система продолжает работу, а прикладная программа
E140_DRV.PAS перезапускает "упавший" процесс и система восстанавливает нормальную работу.
Единственным критическим с точки зрения защиты компонентом остается динамическая библиотека E140_DLL.DLL,
которая работает в адресном пространстве процесса CRW-DAQ и ничем не защищена. Однако размер кода этой библиотеки и его функции сведены до
минимального уровня, что резко снижает вероятность ошибок.
На рисунке также показано, как взаимодействуют компоненты программы.
Связь прикладной программы E140_DRV.PAS,
динамической библиотеки E140_DLL.DLL и ядра пакета CRW-DAQ осуществляется
через программный интерфейс CRW API, который обеспечивает высокую скорость передачи и обработки данных.
Прикладная программа E140_DRV.PAS посылает управляющие команды в поток StdIn
процесса E140_DRV.EXE, а в ответ получает сообщения, которые передаются через поток StdOut.
Объем передаваемых через каналы команд и сообщений невелики (порядка нескольких килоБайт в секунду), а частота сообщений при работе АЦП
составляет порядка 20 Герц (50 миллисекунд).
Сообщения содержат лишь ссылки на блоки данных, которые фактически передаются через общую память. При этом передатчиком данных служит
процесс E140_DRV.EXE, который записывает данные в общую память, а приемником, читающим данные,
служит код динамически загружаемой библиотеки E140_DLL.DLL. Использование общей памяти позволяет
вообще избежать операции копирования данных, программа E140_DLL.DLL использует измеренные
данные для расчетов непосредственно из той же памяти, куда они были записаны драйвером аппаратуры Lusbapi.dll,
работающим в контексте процессса E140_DRV.EXE. Данные после обработки поступают из кода библиотеки
E140_DLL.DLL в ядро пакета CRW-DAQ напрямую через программный интерфейс CRW API,
минуя прикладную программу E140_DRV.PAS, что обеспечивает высокую скорость записи данных в кривые.
При этом для синхронизации передатчика и приемника данных используются сообщения, передаваемые по каналу связи.
Это гарантирует неразрушающее использование общей памяти передатчиком и приемником.
В целом получается система, обладающая свойствами отказоустойчивости и высокой скорости обмена данными, оставаясь при этом
достаточно высоко адаптивной, так как прикладные прогаммисты сравнительно легко могут менять код прикладной программы,
не подвергая систему серьезному риску из-за программных ошибок (за счет защиты, которую дает виртуальная машина DAQ Pascal).
Такова, вкратце, концепция измерительной программы и ее состав. Теперь перейдем к подробностям её конфигурации.
Конфигурационный файл !DEMO_E140.CFG является "заголовочным" и содержит ссылку на
основной конфигурационный файл E140_CTRL.CFG, в котором описано устройство &E140.CTRL,
в контексте которого исполняется PAS программа драйвера E140_DRV.PAS на языке Daq Pascal.
Эта программа запускает на исполнение автономную измерительную EXE программу E140_DRV.EXE,
исполняемую в отдельном процессе,
а также загружает динамическую DLL библиотеку E140_DLL.DLL, которая служит для связи этой программы с пакетом CRW-DAQ.
Связь DLL библиотеки и EXE программы осуществляется через общую память.
Связь PAS программы и EXE программы осуществляется через анонимные каналы.
Собственно сбором данных занята программа драйвера E140_DRV.EXE, код которой находится в файлах
E140_DRV.DPR - основной текст программы драйвера, представляющей из себя отдельное консольное приложение,
управляемое командами, поступающими из консоли стандартного ввода и выдающее в консоль стандартного вывода некоторые ответные сообщения.
Программа драйвера всегда запускается из программы E140_DRV.PAS, написанной на DaqPascal,
которая с помощью переназначения стандартных потоков ввода-вывода посылает нужные команды и перехватывает ответные сообщения.
Консольная программа также использует общую память для высокоскоростного обмена данными с пакетом CRW-DAQ
через библиотеку E140_DLL.DPR.
При этом выделение измерительной программы в отдельный процесс обеспечивает отказоустойчивость системы,
а обмен данными через общую память обеспечивает высокую скорость сбора данных.
E140_API.PAS - вспомогательная библиотека, содержащая класс TE140,
облегчающий работу с устройством. Этот класс содержит внутри себя все специфические для данного АЦП вызовы,
позволяя в основной программе сосредоточиться на логике работы, а не на деталях реализации работы с АЦП.
E140_SHM.PAS - вспомогательная библиотека, содержащая описание буфера общей памяти TE140_SHARED_BUFFER,
который используется для обмена данными. Выделение описания общей памяти в отдельный модуль, который используется
как в программе E140_DRV.DPR, так и в библиотеке E140_DLL.DPR
гарантирует, что при внесении изменений в программу буферы приемника и передатчика будут одинаковы.
Lusbapi.pas - интерфейсная библиотека к DLL файлу Lusbapi.dll,
обеспечивающая доступ к драйверамE14-140 и поставляемая с устройством (слегка модифицирована мной).
Интерфейсная DLL библиотека E140_DLL.DPR обеспечивает высокоскоростное считываение измеренных данных
из общей памяти и запись этих данных в кривые CRW-DAQ. Эта библиотека загружается\освобождается PAS программой при старте\завершении
с помощью функций DAQ_DLL_INIT, DAQ_DLL_FREE. При измерении очередной порции данных EXE программа посылает (через канал)
сообщение в консоль PAS программы, содержащее ссылку на буфер в общей памяти, где содержатся измеренные данные. При обработке этого
сообщения PAS программа записывает эти ссылки в тег E140.OnReadout и с помощью функции DAQ_DLL_CALL вызывает DLL программу.
Код DLL программы, используя тег E140.OnReadout, дешифрует сообщение и считывает из общей памяти измеренные данные, на которые ссылается сообщение.
Затем с помошью интерфейса CrwApi программа DLL преобразует измеренные данные в нужные единицы и записывает их в кривые CRW-DAQ.
Надо заметить, что использование промежуточного тега E140.OnReadout для передачи сообщения в DLL программу необходими потому, что
DLL программа не имеет прямого доступа к переменным PAS программы и ее консоли. Поэтому консольные команды считываются в тег
и только потом делается вызов DLL программы. Надо также заметить, что передаваемое в теге сообщение имеет примерно такой формат:
@E140.OnReadout=E140_DRV.EXE/2440,64,24448,4032,63,191,12224
@E140.OnReadout - идентификатор сообщения
E140_DRV.EXE/2440 - имя буфера общей памяти (здесь 2440 - идентификатор процесса E140_DRV.EXE)
64 - размер измеренного блока данных в общей памяти, в 2-байтовых словах
24448 - смещение блока данных относительно начала общей памяти в байтах
4032 - индекс блока данных в массиве данных в общей памяти
63 - номер запроса, меняется циклически от 0 до 63
191 - счетчик общего числа прочитанных блоков данных от старта измерений
12224 - счетчик общего числа прочитанных измерений (семплов)
Следует также заметить, что код DLL программы анализирует имя буфера общей памяти.
Если DLL программа еще не подключена к общей памяти или подключена к общей памяти с другим именем,
то предыдущее подключение к общей памяти закрывается и открывается новое.
Это гарантирует, что при неожиданном аварийном перезапуске процесса E140_DRV.EXE программа DLL прочитает
имеющийся до "падения" процесса буфер памяти, корректно его освободит, а затем подключится к новому буферу общей памяти.
Включение идентификатора процесса в имя буфера общей памяти гарантирует уникальность имени и его однозначную связь с EXE процессом.
Прикладная программа E140_DRV.PAS, написанная на DaqPascal, обеспечивает запуск и завершение
измерительной EXE программы E140_DRV.EXE и взаимодействие с ней по анонимному каналу, загрузку и освобождение DLL библиотеки
E140_DLL.DLL и её своевременный вызов для чтения очередной порции данных из общей памяти.
Прикладная программа также обеспечивает работу интерфейса пользователя, включая мнемосхему E140.CTRL.GUI
для управления устройством, диалог &E140.PRESET для настройки параметров АЦП, загрузку и сохранение
этих параметров в INI-файле, отображение кривых в окне E140.PLOT.GUI.
Теперь ряд комментариев к конфигурации устройства &E140.CTRL.
Переменная
Simulation = 1 ; 0:Real work mode, 1:Simulation mode
задает режим симуляции.
При значении Simulation=0 измерения идут в нормальном режиме.
При значении Simulation=1 включается режим программной симуляции.
Программная симуляция позволяет тестировать работу программы, не имея реальной аппаратуры.
При этом происходит запуск измерительной программы, обмен данными через общую память,
в общем практически все, кроме реальных измерений.
Режим симуляции незаменим при отладке измерительных систем, при рабочих измерениях симулятор отключается.
При работе в режиме симуляции можно использовать консольную команду программы E140_DRV.PAS
@E140.SimulateAdc=i,z,a,n
i - номер канала 0..31
z - постоянная, mV
a - амплитуда "пилы" частотой около 50 Гц, mV
n - уровень шума, mV
Эта команда посылается в консоль устройства &E140.CTRL и позволяет динамически
менять параметры симулятора во время отладки.
Переменные
AnalogOutputs = 32 ; Number of analog outputs
AnalogInputs = 2 ; Number of analog inputs
DigitalOutputs = 2 ; Number of digital outputs
DigitalInputs = 16 ; Number of digital inputs
задают число цифровых и аналоговых входов-выходов.
Эти числа фиксированы и не должны меняться, хотя не обязательно подключать кривые к всем входам и выходам.
Следует заметить, что в дифференциальном режиме АЦП в Analog Output 0 .. 15 пишутся измеряемые сигналы с входов,
а в Analog Output 16 .. 31 "смещения нулей". Кроме того, надо заметить, что в кривую Digital Output 1 пишется
разница времен по часам АЦП и компьютера, для контроля "ухода часов".
Переменные
задают размеры FIFO буферов и каналов ввода-вывода, которые используются для связи программы
E140_DRV.PAS с программой E140_DRV.EXE.
Эти буферы должны быть достаточными для "прокачки" сообщений, иначе будут наблюдаться потери данных.
Поток сообщений при работе АЦП сотавляет порядка 4 kB в секунду, при старте и остановке измерений он может быть на порядок больше,
поэтому запас в разумных пределах не помешает. Выбор размера 128 kB выглядит вполне разумным.
Переменные
AnalogFifo = 1000000 ; Analog events - fifo size
DispatcherFilter = -packx,-packy ; Switch off data packing
задают параметры очереди аналоговых событий - длину очереди и параметры фильтра для обработки данных.
Длина очереди событий должна быть достаточной для временного размещения порции данных, которые затем асинхронно записываются в кривые диспетчером событий.
Учитывая высокую частоту АЦП (до 100 kHz) следует брать длину очереди не менее 100000 событий (запас около секунды), иначе может начаться потеря данных.
При этом также надо учитывать, что каждое событие "весит" 32 байта, поэтому длину надо выбирать также исходя из имеющихся ресурсов памяти.
Для исключения потери данных с одной стороны и переполнения памяти с другой необходимио также правильно выбирать параметры истории (history)
при подключении кривых, а также параметр HistoryLimits в секции [DAQ], который позволяет ограничивать историю кривых на уровне всей конфигурации.
Если параметр истории указан неверно, кривые будут "терять" данные по мере накопления, так как параметр "истории" показывает, сколько точек кривая
должна гарантированно "удерживать" в памяти. При поступлении новых данных наиболее "старые" по времени данные будут "отбрасываться", чтобы кривая
не росла до бесконечности. DispatcherFilter задает параметры фильтра событий, чтобы исключить упаковку данных, которая в данном случае отключается,
чтобы данные шли по принципу "как есть", без сжатия.
В других случаях упаковка данных может оказаться полезной для сокращения объема данных хранимых, и тогда надо
использовать DispatcherFilter=+packx,+packy.
Переменные
InquiryPeriod = 1 ; Polling time period, msec
DevicePolling = 1, tpTimeCritical ; Polling thread timing and priority
обеспечивают опрос PAS программы с максимальным приоритетом и частотой.
Это надо для своевременного считывания буферов из общей памяти.
Переменные
ProgramSource = ..\DaqPas\E140_DRV.PAS ; Program source file
DLL_FILE_PATH = ..\DAQPAS\E140_DLL.DLL ; DLL driver
EXE_FILE_PATH = ..\DAQPAS\E140_DRV.EXE ; EXE driver
INI_FILE_PATH = ..\DATA\E140_PARAM.INI ; E140 INI file name
INI_FILE_SECT = [E140.PARAMETERS] ; E140 INI file sect
описывают расположение файлов описанных выше компонентов программы (PAS, EXE и DLL),
а также имя файла и секции инициализационного INI-файла, содержащего настройки АЦП.
Этот INI-файл включается в конфигурацию выражением:
AutoLoadIniFile = 1 ; Auto Load INI file on Start
AutoSaveIniFile = 0 ; Auto Save INI file on Exit
позволяют управлять автоматической загрузкой и сохранением параметров АЦП в INI файле.
Переменные
StartupScript = [&E140.CTRL.OnStartup] ; Script on startup
ScriptOnStart = [&E140.CTRL.OnStart] ; Script on Start pressed
ScriptOnStop = [&E140.CTRL.OnStop] ; Script on Stop pressed
задают имена секций, в которые помещаются командные скрипты, исполняемые при загрузке программы, старте и остановке измерений.
Эти скрипты выглядят примерно так:
[&E140.CTRL.OnStartup]
@WinShow E140.PLOT.GUI
@WinDraw E140.PLOT.GUI|Left=|Top=317|Width=800|Height=400
@WinDraw E140.PLOT.GUI|Options=-Min,-Max,+Close,+VScroll
@WinHide E140.PLOT.GUI
@WinShow E140.CTRL.GUI
@WinDraw E140.CTRL.GUI|Left=167|Top=0|Width=420|Height=360
@WinDraw E140.CTRL.GUI|Options=-Min,-Max,+Close,-VScroll,-HScroll
@WinSelect E140.CTRL.GUI
[]
[&E140.CTRL.OnStart] ; Script to execute on E140_DRV.EXE start
@E140.ThreadPriority=tpTimeCritical ; Set ADC thread priority
@E140.ProcessPriority=RealTime ; Set ADC process priority
@E140.Errors=0 ; Clear error counter
@E140.Memory ; Ask memory usage
@E140.DO=ON ; Enable digital outputs
@E140.DO=0 ; Set value for digital outputs
@E140.AO=0,0 ; Set value for DAC 0
@E140.AO=1,0 ; Set value for DAC 1
@E140.Help ; Show help
[]
[&E140.CTRL.OnStop] ; Script to execute on E140_DRV.EXE stop
@E140.AO=0,0 ; Set value for DAC 0
@E140.AO=1,0 ; Set value for DAC 1
@E140.DO=0 ; Set value for digital outputs
@E140.DO=OFF ; Disable digital outputs
@E140.Stop ; Stop device
@E140.Close ; Close device
[]
В данном случае загрузочный скрипт E140.CTRL.OnStartup задает размеры и свойства окон.
Стартовый скрипт E140.CTRL.OnStart задает высокий приритет измерительному потоку и процессу,
устанавливает некоторый начальный уровень на ЦАП и цифровых выходах.
Завершающий скрипт E140.CTRL.OnStop задает "конечный" уровень аналоговых и цифровых выходов
и завершает работу устройства.
Переменные
задают имена тегов, устройств и окон, используемых программой сбора данных.
Это позволяет легко изменять наименование тегов, не изменяя программного кода.
Остальные параметры не имеют какой-то особенной специфики и используются так же,
как в большинстве других систем CRW-DAQ.
К началу
Инсталляция драйверов от L-CARD
Программа рассчитана на работу с фирменными драйверами,
поставляемыми изготовителем.
Поэтому требуется предварительная инсталяция этих драйверов.
Драйверы включают в себя файлы Lusbapi.inf, Ldevs.sys, Ldevusbu.sys, WdmStub.sys,
а также интерфейсный модуль Lusbapi.dll, служащий для доступа к драйверу из прикладной программы.
Инсталляцию можно сделать, запустив, например, в каталоге www.lcard.ru
командные файлы
Copy_Lusbapi_Dll.bat и
Install_Lusbapi_Inf.bat.
Запуск командных файлов, разумеется, надо делать под Администратором.
К началу
Описание мнемосхемы E140.CTRL.GUI
Эта мнемосхема служит для управления измерительной картой E14-140,
а также для наблюдения её состояния.
В полях 00,
01 и т.д.
отображаются текущие измеренные значения в соответствующих каналах
АЦП, выраженные в миллиВольтах.
В случае использования режима измерения сигналов с общей землей (single ended) все каналы
от 00 до 31 показывают сигнал, подключенный к соответствующим входам АЦП.
В случае дифференциального (differential) режима работы первые 16 каналов (от 00 до 15) содержат значения измеренных
дифференциальных сигналов, подключенных к соответствующим входам АЦП, а остальные 16 каналов (от 16 до 31)
содержат измерения "смещения нулей" АЦП, то есть измерений в тех же 16 каналах, но выполненных с короткозамкнутым входом.
Короткозамкнутый вход организован схемотехнически внутри самой измерительной карты и не требует замыкания входов на разъеме.
Программа чтения устроена так, что при дифференциальном включении каналы 16..31 измеряют "смещение нуля"
каналов 00..15.
В полях AO,
A1 отображаются текущие
значения данных, которые посылаются в ЦАП, выраженные в миллиВольтах.
В полях DI,
dT отображаются данные цифровых входов DI,
а также оценка dT "смещения времени", то есть разницы времени по часам АЦП и компьютера в ms.
В полях IE, TESE, PE
отображаются счетчики ошибок. IE - счетчик ошибок операций ввода-вывода, TE - счетчик "падений" драйвера E140_DRV.EXE,
SE - счетчик ошибок посылки команд в канал связи, PE - счетчик критических сбоев при вызове E140_DLL.DLL.
- кнопка выполняет СТАРТ и СТОП измерений.
Перед измерениями необходимо задать параметры нажатием кнопки PRESET.
Все параметры сбора данных (кроме FIR фильтров) должны задаваться перед стартом, так как после старта,
во время работы карты, их изменить нельзя. После старта также запрещено делать очистку и сохранение данных.
Эти функции доступны только после остановки измерений.
- кнопка вызова диалога настройки свойств карты и параметров сбора данных.
Все настройки делаются до старта измерений, в процессе измерений их менять нельзя, кроме FIR фильтров, которые можно изменять динамически.
- кнопка очистки измеренных кривых.
Очистка делается до старта измерений, чтобы удалить данные предыдущей экспозиции.
Операция очистки необратима и если оператор забыл сохранить данные, они пропадут бесследно.
Поэтому перед очисткой выдается запрос на подтверждение очистки, чтобы случайно не удалить данные, которые не сохранены на диске.
- кнопка сохранения измеренных кривых в CRW файл.
Сохрание измеренных данных делается после остановки измерений, чтобы записать данные этой экспозиции на диск в файл формата *.CRW.
Сохранение во время измерений запрещено. Имя файла генерируется по текущей дате и времени.
При записи файла в консольном окне ГЛАВНАЯ КОНСОЛЬ печатается сообщение о том, в какой файл были сохранены данные.
Поэтому после сохранения файла надо заглянуть в эту консоль убедиться, что запись прошла успешно.
- индикатор прогресса измерений.
При начале измерения начинает циклически изменять состояние на:
К началу
Описание диалога E140.PRESET
Это диалог для задания параметров сбора данных измерительной карты E14-140.
Вызывается только перед стартом или после остановки измерений, во время измерений параметры менять нельзя.
Единственным исключением являются FIR фильтры, которые можно менять всегда.
Но они, строго говоря, к сбору данных не относятся, так как обработка (фильтрация) данных делается независимо от измерений.
Рассмотрим параметры сбора данных подробнее.
- задает режим и частоту АЦП.
Режим (Mode) может принимать два значения: Single[32] и Diff[16].
В режиме Single[32] измерения идут по 32 каналам 00..31, подключенным по схеме с "общей землей".
В режиме Diff[16] измерения идут по 16 каналам 00..15, подключенным по дифференциальной схеме.
При этом в каналах 16..31 в дифференциальном режиме записываются "смещения нулей", то есть измерения с короткозамкнутым входом.
Короткозамкнутый вход организуется схемотехнически прямо на измерительной карте и не требует замыкания на разъемах АЦП.
Дифференциальный режим является более предпочтительным для высокоточных измерений, так как он более устойчив к помехам.
Частота (Frequency,kHz) задает общую частоту опроса АЦП в килоГерцах и меняется в диапазоне от 1 kHz до 100 kHz.
Частота опроса на один канал получается делением общей частоты опроса на число активных каналов, так как АЦП работает в режиме мультиплексирования.
Сбор данных идет в непрерывном режиме, пока не будет нажата кнопка СТОП. Хотя в процессе измерений изменять частоту опроса АЦП нельзя,
но за счет FIR фильтров можно менять "эффективную" частоту опроса, так как FIR фильтр накапливает заданное число измерений АЦП
и записывает в кривые усредненное по этой порции значение, поэтому частота "выдачи" результатов измерений в кривые снижается в число раз, равное числу точек усреднения.
- служит для записи и чтения параметров в INI файле.
INI файл E140_PARAM.INI расположен в каталоге Data.
Он содержит значения параметров сбора данных E140 (которые задаются в окне диалога настройки).
INI файл загружается автоматически при запуске измерительной конфигурации, а также по требованию,
если поставить флажок "Load INI" в окне диалога настройки и нажать OK.
Сохранение параметров в INI делается только по требованию, если поставить флажок "Save INI"
в окне диалога настройки и нажать OK.
При этом текущие настройки сбора данных будут записаны в INI файл, а при следующем запуске системы сбора данных они будут автоматически загружены.
- служит для задания карты опроса каналов АЦП.
Флаг Gate разрешает (или запрещает) опрос данного канала.
В силу особенностей работы устройства (буферизация с выравниванием по 32 слова и очередь асинхронных операций чтения) программа требует,
чтобы число разрешенных каналов было степенью двойки (1,2,4,8,16,32).
Несоблюдение этого условия по числу каналов может привести к неверной работе программы сбора данных.
Поэтому, если задать карту разрешений, в которой разрешено "неправильное" число каналов,
то программа автоматически установит разрешения для каналов таким образом, чтобы удовлетворить указанному условию.
Это обстоятельство надо учитывать при выборе режимов работы, так как число разрешенных каналов опроса влияет на частоту опроса (в расчете на один канал).
Если, например, разрешить опрос 5 каналов, то система автоматически разрешит опрос 8 каналов,
то есть будет дополнительно разрешен опрос 3 "лишних" каналов.
Поэтому при задании карты опроса надо стремиться указывать либо число каналов, равное степени двойки, либо выбирать частоту опроса АЦП
с учетом того, что реальное число опрашиваемых каналов может отличаться от числа первоначально заданных каналов.
Также настоятельно рекомендуется закоротить все неиспользуемые каналы, чтобы "лишние" каналы, включенные в список опроса, не вносили помех.
Параметр Gain задает диапазон АЦП для данного канала опроса.
Он может принимать 4 значения: 10000 mV, 2500 mV, 625 mV, 156.25 mV.
Параметр Filter задает сглаживающий FIR фильтр. FIR-фильтр переводится как "фильтр с конечной импульсной характеристикой" (Finite Impulse Response).
Или, другими словами, это нерекурсивный фильтр, который имеет конечную "память" на воздействия.
В данном случае реализован довольно простой фильтр, работающий следующим образом.
При значении Filter = 0 данные, поступающие при сборе данных АЦП, игнорируются и в кривые не пишутся.
То есть, хотя сбор данных на аппаратном уровне продолжается, в прикладную программу данные не будут поступать.
Это позволяет использовать фильр как программный флаг разрешения сбора данных (подобно Gate).
Достоинство Filter состоит в том, что его значение можно менять мгновенно и в любое время,
в отличие от Gate, которое можно изменять только когда измерения остановлены.
Кроме того, изменение значения Filter не влияет на частоту опроса других каналов, что тоже хорошо.
При значении Filter = 1 данные, поступающие при сборе данных АЦП, пишутся в кривые "как есть", без всякой фильтрации.
Это эквивалентно отключению фильтра и работе на максимальной скорости АЦП, что полезно при регистрации быстрых сигналов.
Важно, что этот режим можно мгновенно включать и отключать, что позволяет регистрировать медленно изменяющиеся сигналы с небольшой частотой,
мгновенно переходя на более высокую частоту регистрации при необходимости записи быстро протекающих процессов.
При значении Filter = N, где N > 1, данные, поступающие при сборе данных АЦП, накапливаются в буфере
длиной N точек и записываются в кривые по заполнению буфера.
Это значит, что "эффективная" частота, то есть частота "выдачи" результатов измерений в кривые, падает в N раз, так как данные
на входе фильтра из N точек дают на выходе фильтра одну точку.
На самом деле в буфере накапливаются статистические суммы
∑Xi, ∑Yi и счетчик точек n.
По достижении числа точек N в качестве результата измерения выдается точка
X=∑Xi/N, Y=∑Yi/N.
Здесь под X понимается время измерения, под Y - значение АЦП в милливольтах.
Таким образом, фильтр обеспечивает как "прореживание", так и "сглаживание" данных, что весьма удобно.
Следует также подчеркнуть, что значение фильтров можно менять мгновенно, что позволяет прямо "на ходу",
не прекращая измерений в других каналах, приостанавливать сбор данных, замедлять его или ускорять,
адаптируясь под характер сигнала.
При использовании параметра Filter следует учитывать, что фильтр применяется к буферу, а не к отдельному измерению.
Это значит, что значение фильтра считывается перед обработкой очередного буфера и не меняется в процессе его обработки.
То есть при изменении параметра Filter это изменение "почувствуется" только начиная со следующего буфера данных.
Надо напомнить, что буферы данных поступают с частотой около 20 Гц (раз в 50 миллисекунд).
Именно с такой задержкой и будет применяться изменение фильтра.
- задает параметры тактовых "часов" АЦП.
Параметр Clock source задает источник тактовых импульсов АЦП и может принимать два значения.
При значении Internal quartz clock для тактирования используется внутренний кварцевый генератор импульсов.
При значении External clock (AI20) для тактирования используется внешний сигнал, поступающий с аналогового разъема INT, пин 20.
В настоящее время настоятельно рекомендуется использовать только внутренний генератор тактовых импульсов, так как при использовании
внешних тактовых импульсов привязка точек по времени может оказаться неверной (шкала времени может быть неверной).
При использовании внутреннего тактирования надо учитывать тот факт, что тактовый генератор на измерительной карте
может иметь слегка отличную частоту от частоты часов компьютера.
Это приведет к постепенному "уходу" часов АЦП от системных часов компьютера, который составляет порядка секунды в сутки.
Это означает, что кривые измерений АЦП могут при длительной работе слегка отставать или опережать по оси X кривые других сигналов,
которые регистрируются по часам компьютера. Это надо учитывать при дальнейшей обработке сигналов, которая должна предусматривать синхронизацию
шкалы времени (по каким-то характерным пикам сигнала, например).
Параметр Clock output позволяет разрешить (Enable) или запретить (Disable) трансляцию внутренних тактовых импульсов
на выход разъема INT, пин 20. Разумеется, трансляция тактовых импульсов работает только если включен режим внутренних тактовых импульсов.
Наличие режима внешнего тактирования и трансляции внутренних тактовых импульсов позволяет организовывать системы синхронного сбора данных
на нескольких картах. При этом одна карта ("ведущая") работает на внутреннем тактировании и транслирует тактовые импульсы, а остальные
карты используют эти тактовые импульсы в режиме внешнего тактирования. При этом несколько АЦП будут иметь одинаковую шкалу времени и
фактически будут работать как одна большая карта с произвольно большим числом каналов (при добавлении новых карт).
Однако в настоящее время такой режим программно не поддерживается и поэтому использовать трансляцию тактовых импульсов нет смысла.
Возможно, в будущем это будет реализовано.
- разрешает или запрещает ЦАП и цифровой ввод-вывод.
Флажок AO-s разрешает использование ЦАП (доступно только при его наличии в карте).
Флажок DO-s разрешает использование цифровых выводов.
Флажок DI-s разрешает использование цифровых вводов.
Надо иметь в виду, что разрешение любого из этих флажков резко снижает надежность сбора данных, особенно при частоте выше 10 kHz.
Дело в том, что АЦП, ЦАП и цифровой ввод-вывод используют одну и ту же шину данных (USB).
При высокоскоростном сборе данных команды ЦАП и цифрового ввода-вывода начинают мешать вовремя скачивать данные АЦП,
что время от времени приводит к аварийной остановке работы программы сбора данных.
Поэтому рекомендуется по возможности либо не использовать ЦАП и цифровой ввод-вывод, либо сократить частоту его использования до минимума.
Для ответственных измерений использовать ЦАП и цифровой ввод-вывод не рекомендуется.
- задает параметры триггера на старт измерений.
Параметр Start synchronization задает способ синхронизации старта измерений АЦП и имеет 4 значения.
"Start immediately, SOFT" - измерения стартуют немедленно после нажатия кнопки СТАРТ,
то есть момент старта не синхронизован с какими-либо внешними сигналами и определяется программным стартом.
"Start on TTL, AI pin 20" старт синхронизуется подачей низкого уровня (замыканием на землю)
на TTL-совместимый вход INT аналогового разъема, пин 20.
То есть после нажатия кнопки СТАРТ карта переходит в режим готовности и ждет сигнала.
При появлении этого сигнала начинается сбор данных.
"Frame on TTL, do'nt use" внешним сигналом синхронизуется каждый кадр.
Этот режим в данной программе не поддерживается и его не надо включать.
При значении "Start on Analog trigger" старт синхронизуется аналоговым сигналом.
Способ синхронизации аналоговым сигналом описывают следующие 4 параметра.
Параметр AI trigger type, имеющий смысл при синхронизации аналоговым сигналом,
задает тип синхронизации - по уровню сигнала "by Level" или по изменению (фронту)
сигнала "by Front".
Параметр "AI trigger mode", имеющий смысл при синхронизации аналоговым сигналом,
задает режим синхронизации. Он имеет два значения - "HI" - синхронизация по
верхнему уровню (при типе "by Level") или фронту возрастания (при типе "by Front"),
или "LO" - синхронизация по нижнему уровню (при типе "by Level")
или фронту убывания (при типе "by Front").
Параметр AI trigger channel - это номер аналогового канала, по которому делается синхронизация,
от 0 до 15 или до 31, в зависимости от режима АЦП.
Параметр AI trigger threshold задает порог аналогового триггера для запуска измерений АЦП в миллиВольтах.
То есть после старта измерений АЦП переходит в режим готовности и ждет, когда в заданом канале
уровень сигнала (или его фронт, в зависимости от типа триггера) превысит заданное пороговое значение,
и только после этого сбор данных начинается.
Это позволяет использовать карту для измерения однократных быстро протекающих процессов, с автоматическим
стартом по появлению сигнала выше заданного порога.
- задает параметры автоматической коррекции шкалы времени.
Автоматическая коррекция времени пытается подстроить расчетную частоту АЦП - так, чтобы
сократить разницу времени по часам компьютера и АЦП.
Надо иметь в виду, что
При отсутствии коррекции частота АЦП постоянна, а разница времен по часам АЦП и компьютера меняется примерно линейно, возможно, со "ступеньками".
При включении коррекции частота АЦП и разница времен могут осциллировать в небольших пределах.
Параметр "Period, sec" задает периодичность коррекции в секундах.
Если задать нулевой период коррекции, то коррекция шкалы времени отключается
и часы АЦП не подвергаются автоматической подстройке.
Рекомендуемое значение периода при коррекции - несколько минут.
Значение по умолчанию = 600 секунд (10 минут).
Параметр "Coefficient" задает коэффициент коррекции в диапазоне [0..1].
Если задать нулевой коэффициент коррекции, то коррекция шкалы времени отключается
и часы АЦП не подвергаются автоматической подстройке.
Рекомендуемое значение коэффициента при коррекции = 0.1.
Значение по умолчанию = 0 (отключено).
- задает время сторожевого таймера в секундах.
Сторожевой таймер включается после начала измерений и следит за поступлением данных АЦП.
Если данные не поступают в течение заданного времени, сторожевой таймер считает,
что драйвер E140_DRV.EXE "повис" и принудительно перезапускает его.
Для отключения сторожевого таймера надо задать нулевое время.
К началу