Инструкция по работе с библиотекой 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

Есть предопределенные проперти: тип платы, размер отсчета в байтах, адреса буферов и счетчиков.
Как это все задействовано см. пример.



Собственно говоря все....