- Инструкция по
работе с библиотекой LComp/WLComp) и платами/модулями L-Card в среде
LabView.
-
- Где лежит:
-
..\Library\WLCOMP – бибблиотека обертка
-
..\Library\WLCOMP_LV – пример и этот файл
-
- Для работы в среде LabView с платами L-Card
написана библиотека-обертка WLCOMP. Она предоставляет простой С
интерфейс к функциям библиотеки LComp. Для управления платами L-Card
в Labview есть несколько инструментов: CallLibraryFunction, CIN.
CallLibraryFunction просто позволяет вызвать любую функцию из
внешней DLL библиотеки. CIN более мощный инструмент т.к. позволяет
написать кусок С кода для вызова функции или выполнения какого-либо
алгоритма. CIN сложнее в использовании т.к. требует наличия
компилятора С и навыков программирования.
-
- Итак для полноценной работы с платами L-Card хорошо
иметь:
-
-LabView 8.0 и
выше
-
-Microsoft Visual C++ (например Express Edition)
-
- Чтобы собирать CIN из исходных тестов надо
прописать в системе переменную CINTOOLSDIR с указанием пути на
каталог \CINTOOLS в папке с установленным LabView. Тогда запуская
nmake из консольного окна VC можно будет собирать CIN.В файле
ntlvsb.mak из папки CINTOOLS можно добавить ключи компилятора по
желанию... Я добавлял /MT для компилятора и /NODEFAULTLIB:MSVCRT для
линкера.
-
- Далее рассмотрим вариант подключения плат L-CARD на
основе примера WLCOMP_LV. Этот пример использует оба
инструмента(CIN, CallLibraryFunction) для работы с библиотекой
WLCOMP. В принципе используя CIN можно работать и напрямую с LComp,
но это неудобно(вызывать С++ функции из С).
-
Пример прост:
- получение информации о слоте и типе платы
-
загрузка платы
-
чтение флеша
-
задание параметров сбора данных
-
выделение памяти под буфер данных
-
запуск сбора данных
-
ожидание нужного количества данных
-
остановка сбора
-
отображение данных и переход опять на запуск
-
по кнопке стоп выгрузка библиотеки и остановка
программы
- Поскольку во многих функциях в качестве параметров
используются структуры данных, то для удобства передачи параметров
как раз и используется CIN. В более простых функциях используется
CallLibraryFunction. Пример расчитан на работу с платами L761 L780
L783 L791 E154 E14-440 E14-140 E20-10.
Перед запуском поэтому необходимо указать специфичные для плат
параметры: слот, имя биоса без расширения, константу синхронизации.
Пример собирает данные с четырех каналов платы (0123) и на
максимальной частоте (на модуле 20-10 на частоте 1Мгц, на остальных
происходит фактически округление в библиотеке).
- Исходные коды всех CIN прилагаются. Внутри каждого
CIN определяется тип платы и происходит ветвление при передаче
структур в функцию библиотеки.
-
- При заполнении кластера с параметрами сбора данных
число 7680 это просто численное значение SIG_0|SIG_1|SIG_2|SIG_3 для
платы E20-10.
-
- При работе с платами которым не нужен биос нужно
указать произвольный файл. Просто функция загрузки вернет статус –
ошибка L_NOTSUPPORTED.
-
- Некоторые пояснения по CIN
-
- CIN GetSlotParam
-
Поскольку структура SLOT_PARAM простая и состоит из
однотипных переменных то тут она передается как массив. В принципе
можно было просто функцию вызвать и без CIN.
-
- CIN ReadPlataDescr
-
Тут все гораздо сложнее т.к. структуры для разных
модулей разные. Поэтому формируется кластер с нужными полями и
передается внутрь CIN где происходит ветвление по типу плат.
Собственно говоря, можно просто флеш прочитать, а данные никакие не
возвращать т.к. все прочитанное храниться внутри объекта и
используется при расчетах.
-
- CIN FillDAQParameters
- Тоже сложный CIN. Внутри выбирает в зависимости от
платы структуру для описания параметров сбора данных. А в структуре
данных еще кодируется ЦАП или АЦП.... Формируется кластер вполне
универсально, а вот внутри трактовка полей различна....Учитывая
универсальность примера параметры сбора заданы специфически, так
чтобы удовлетворять всем платам.
-
Порядок заполнения полей структуры из полей кластера см
исходный код CIN.
-
- Перед началом сбора данных есть большой CASE –
он собственно служит для подстройки цикла сбора данных под разные
платы... В частности задает адрес с которого читать переменную Sync,
размер отсчета в байтах и битовую маску которая накладывается на
данные. Это может понадобиться для платы L791...
-
- Абсолютные значения различных констант нужно
смотреть в файле ioctl.h
-
- В папке WLCOMP_LV_SE добавлен
пример работы с NI SignalExpress 3.0. В
этом примере используется метод вызова LabView VI
файла в проекте SignalExpress. VI
построена на базе примера WLCOMP_LV
плюс заготовка из SignalExpress
UserDefinedStepTemplate.vi. Это все согласно иструкциям NI
упаковано в LLB библиотеку
mystep.llb, которая собственно говоря и
подключается в проект SignalExpress.
Используемые средства — LabView 8.5
и SignalExpress 3.0.
-
- Для упрощения кода LabView
примеров в библиотеку lcomp добавлены
пользовательские переменные (ULONG, 128
штук) которые можно читать-писать посредством вызова
Get|SetParameters (аля проперти).
-
В ioctl.h внесены определения
-
- //defines for GetParemeter/SetParameter common for
all boards
-
#define L_BOARD_TYPE 10000
-
#define L_POINT_SIZE 10001
-
#define L_SYNC_ADDR_LO 10002
-
#define L_SYNC_ADDR_HI 10003
-
#define L_DATA_ADDR_LO 10004
-
#define L_DATA_ADDR_HI 10005
-
#define L_SYNC1_ADDR_LO 10006
-
#define L_SYNC1_ADDR_HI 10007
-
#define L_DATA1_ADDR_LO 10008
-
#define L_DATA1_ADDR_HI 10009
-
- #define L_USER_BASE 10100 // 128 user
prpoperty to store data
-
- Есть предопределенные проперти: тип платы, размер
отсчета в байтах, адреса буферов и счетчиков.
-
Как это все задействовано см. пример.
-
- Собственно говоря все....