moved libs to the lib directory

This commit is contained in:
2025-11-13 18:40:06 +03:00
parent 4d1f7fdbe9
commit b80ad585da
634 changed files with 3 additions and 2 deletions
+225
View File
@@ -0,0 +1,225 @@
VERSION 5.00
Begin VB.Form MainForm
Caption = "L502. Ïðèìåð"
ClientHeight = 3240
ClientLeft = 120
ClientTop = 450
ClientWidth = 6810
LinkTopic = "Ôîðìà1"
ScaleHeight = 3240
ScaleWidth = 6810
StartUpPosition = 3 'Windows Default
Begin VB.ListBox ResultList
Height = 1425
ItemData = "MainForm.frx":0000
Left = 3720
List = "MainForm.frx":0002
TabIndex = 3
Top = 1440
Width = 2775
End
Begin VB.CommandButton GetDevlistBtn
Caption = "Ïîëó÷èòü ñïèñîê óñòðîéñòâ"
Height = 375
Left = 480
TabIndex = 2
Top = 480
Width = 2775
End
Begin VB.ComboBox DevListBox
Height = 315
Left = 3720
TabIndex = 1
Text = "DevListBox"
Top = 480
Width = 2655
End
Begin VB.CommandButton GetSamples
Caption = "Ïðèåì äàííûõ"
Height = 375
Left = 480
TabIndex = 0
Top = 1080
Width = 2775
End
Begin VB.Label Ìåòêà2
Caption = "Ðåçóëüòàò (ñðåäíåå ïî êàíàëàì)"
Height = 255
Left = 3720
TabIndex = 5
Top = 1080
Width = 2775
End
Begin VB.Label Ìåòêà1
Caption = "Ñïèñîê óñòðîéñòâ"
Height = 255
Left = 3720
TabIndex = 4
Top = 120
Width = 2775
End
End
Attribute VB_Name = "MainForm"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Form_Load()
GetDevlistBtn_Click
End Sub
Private Sub GetDevlistBtn_Click()
Dim ret As Long
Dim serials() As String
ret = TEST_SERIAL_SIZE
DevListBox.Clear
'Ïîëó÷àåì ñïèñîê ñåðèéíûõ íîìåðîâ óñòðîéñòâ.
'ðàçìåð ìàññèâà óñòàíàâëèâàåòñÿ âíóòðè ôóíêöèè
'âîçâðàùàåìîå çíà÷åíèå åñëè < 0 - êîä îøèáêè, èíà÷å - êîë-âî íàéäåííûõ óñòðîéñòâ
ret = L502_GetSerialList(serials, 0)
If ret < 0 Then
MsgBox ("Îøèáêà ïîëó÷åíèÿ ñïèñêà óñòðîéòâ: " + L502_GetErrorString(ret))
Else
If ret > 0 Then
For i = 0 To ret - 1
DevListBox.AddItem (serials(i))
Next
DevListBox.ListIndex = 0
End If
End If
End Sub
Private Sub GetSamples_Click()
Dim err As Long
Dim hnd As Long
Dim adc_freq, frame_freq As Double
'êîëè÷åñòâî òî÷åê äëÿ ïðèåìà ïî êàæäîìó êàíàëó
Const ch_points = 1000
'êîëè÷åñòâî îïðàøèâàåìûõ êàíàëîâ
Const ch_cnt = 3
ResultList.Clear
'ñîçäàíèå îïèñàòåëÿ ìîäóëÿ äëÿ ðàáîòó
hnd = L502_Create()
'óñòàíàâëèâàåì ñâÿçü ñ ìîäóëåì ïî åãî ñåðèéíîìó íîìåðó (áåðåòñÿ èç DevListBox)
'åñëè íóæíî ïðîñòî óñòàíîâèòü ñâÿçü ñ ïåðâûì ìîäóëåì, òî äîñòàòî÷íî â êà÷åñòâå íîìåðà ïåðåäàòü ""
err = L502_Open(hnd, DevListBox.Text)
If err <> L502_ERR_OK Then
MsgBox ("Îøèáêà îòêðûòèÿ ìîäóëÿ: " + L502_GetErrorString(err))
Else
'óñòàíàâëèâàåì êîë-âî îïðàøèâàåìûõ êàíàëîâ
err = L502_SetLChannelCount(hnd, ch_cnt)
'äëÿ êàæäîãî èç îïðàøèâàåìûõ êàíàëîâ çàäàåì íîìåð êàíàëà, ðåæèì, äèàïàçîí
'äëÿ ïðèìåðà èñïîëüçóåì ïåðâûé êàíàë â äèô. 10Â, 3-èé ñ îáùåé çåìëåé ïîääèàïàçîí 1 Â, è 32-îé ñ îáùåé çåìëåé ïîääèàïàçîí 0.2 Â
If err = L502_ERR_OK Then
err = L502_SetLChannel(hnd, 0, 0, L502_LCH_MODE_DIFF, L502_ADC_RANGE_10, 0)
End If
If err = L502_ERR_OK Then
err = L502_SetLChannel(hnd, 1, 2, L502_LCH_MODE_COMM, L502_ADC_RANGE_1, 0)
End If
If err = L502_ERR_OK Then
err = L502_SetLChannel(hnd, 2, 31, L502_LCH_MODE_COMM, L502_ADC_RANGE_02, 0)
End If
If err = L502_ERR_OK Then
'íàñòðîéêà ÷àñòîòû. Çàäàåì ÷àñòîòó ÀÖÏ = 2 ÌÃö, ñ ìàêñ. ïîëó÷èâøåéñÿ ÷àñòîòîé íà êàíàë (2 ÌÃö/lch_cnt)
f_adc = 2000000
f_frame = 0
err = L502_SetAdcFreq(hnd, f_adc, f_frame)
End If
If err = L502_ERR_OK Then
'ïåðåäàåì óñòàíîâëåííóþ êîíôèãóðàöèþ â ìîäóëü
err = L502_Configure(hnd, 0)
End If
If err = L502_ERR_OK Then
'èç ñèíõðîííûõ ïîòîêîâ ðàçðåøàåì òîëüêî ïîòîê ÀÖÏ
err = L502_StreamsEnable(hnd, L502_STREAM_ADC)
End If
If err <> L502_ERR_OK Then
MsgBox ("Îøèáêà íàñòðîéêè ìîäóëÿ: " + L502_GetErrorString(err))
Else
Dim recv_size As Long
'ïðèíèìàåì äëÿ ïðèìåðà ïî êàæäîìó êàíàëó ch_points îòñ÷åòîâ,
'ò.å. îáùåå ÷èñëî ñëîâ ch_cnt * ch_points
'Èñïîëüçóåì CLng äëÿ ïåðåâîäà â Long - èíà÷å vb èñïîëüçóåò
'àðèôìåòèêó ñ Integer è áóäåò ïåðåïîëíåíèå ïðè êîë-âå òî÷åê
'áîëüøå 32*1024
recv_size = CLng(ch_cnt) * ch_points
'çàïóñê ñáîðà äàííûõ
err = L502_StreamsStart(hnd)
If err <> L502_ERR_OK Then
MsgBox ("Îøèáêà çàïóñêà ñáîðà: " + L502_GetErrorString(err))
Else
Dim recv_wrds() As Long
Dim recv_vals() As Double
Dim recvd_cnt As Long
ReDim recv_wrds(0 To recv_size - 1)
ReDim recv_vals(0 To recv_size - 1)
'ïðèåì ñëîâ â ôîðìàòå ìîäóëÿ
recvd_cnt = L502_Recv(hnd, recv_wrds, recv_size, 5000)
'çíà÷åíèå ìåíüøå íóëÿ ñîîòâåòñòâóåò îøèáêå
If recvd_cnt < 0 Then
err = recvd_cnt
MsgBox ("Îøèáêà íàñòðîéêè ìîäóëÿ: " + L502_GetErrorString(err))
Else
'ïðèíÿëè ìåíüøå ÷åì çàïðàøèâàëè
If recvd_cnt < recv_size Then
err = L502_ERR_RECV_INSUFFICIENT_WORDS
MsgBox ("Ïðèíÿòî íåäîñòàòî÷íî äàííûõ")
End If
End If
If err = L502_ERR_OK Then
'îáðàáîòêà äàííûõ - ïåðåâîä â Âîëüòû
err = L502_ProcessAdcData(hnd, recv_wrds, recv_vals, recvd_cnt, L502_PROC_FLAGS_VOLT)
If err <> L502_ERR_OK Then
MsgBox ("Îøèáêà îáðàáîòêè äàííûõ: " + L502_GetErrorString(err))
Else
'äëÿ ïðèìåðà äëÿ êàæäîãî êàíàëà ðàññ÷èòûâàåì ñðåäíåå ïî ïðèíÿòûì òî÷êàì
For ch = 0 To ch_cnt - 1
Dim avg As Double
avg = 0
'îòñ÷åòû â ïîëó÷åííîì ìàññèâå èäóò ïî ïîðÿäêó óçìåðåíèÿ, ò.å. ñïåðâà
'ïåðâûé îòñ÷åò ïåðâîãî êàíàëà, ïåðâûé îñò÷åò âòîðîãî .... âòîðîé îòñ÷åò ïåðâîãî ...
'ò.å. èíäåêñ i-ãî îòñ÷åòà êàíàëà ñð îïðåäåëÿåòñÿ êàê i*ch_cnt + ch
For i = 0 To recvd_cnt / ch_cnt - 1
avg = avg + recv_vals(i * ch_cnt + ch)
Next
avg = avg / (recvd_cnt / ch_cnt)
'äîáàâëÿåì ðåçóëüòàò â ñïèñîê
ResultList.AddItem (FormatNumber(avg, 6) + " Â")
Next
End If
End If
'îñòàíîâ ïîòîêà ñáîðà
L502_StreamsStop (hnd)
End If
End If
'çàêðûâàåì ñîåäèíåíèå ñ ìîäóëåì
err = L502_Close(hnd)
End If
'îñâîáîæäàåì ïàìÿòü âûäåëåííóþ L502_Create()
L502_Free (hnd)
End Sub
@@ -0,0 +1,30 @@
Type=Exe
Form=MainForm.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=l502api; l502api.bas
IconForm="MainForm"
Startup="MainForm"
Command32=""
Name="l502_recv_example"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
@@ -0,0 +1,2 @@
MainForm = 81, -9, 1373, 638, , 25, 25, 1317, 672, C
l502api = -98, 78, 1194, 725, Z
+613
View File
@@ -0,0 +1,613 @@
Attribute VB_Name = "l502api"
' модуль для объявления констант, структур и функций для управления модулем L502 от Л Кард
'Максимальное количество логических каналов в таблице
Const L502_LTABLE_MAX_CH_CNT = 256
'Количество диапазонов для измерения напряжений
Const L502_ADC_RANGE_CNT = 6
'Максимальное значение для аппаратного усреднения по логическому каналу
Const L502_LCH_AVG_SIZE_MAX = 128
'Максимальное значения делителя частоты АЦП
Const L502_ADC_FREQ_DIV_MAX = 1024& * 1024&
'Максимальное значение делителя частоты синхронного цифрового ввода
Const L502_DIN_FREQ_DIV_MAX = 1024& * 1024&
'Максимальное значение межкадровой задержки для АЦП
Const L502_ADC_INTERFRAME_DELAY_MAX = &H1FFFFF
'Таймаут по умолчанию для выполнения команды к BlackFin
Const L502_BF_CMD_DEFAULT_TOUT = 500
'Код АЦП, соответствующий максимальному значению шкалы
Const L502_ADC_SCALE_CODE_MAX = 6000000
'Код ЦАП, соответствующий максимальному значению шкалы
Const L502_DAC_SCALE_CODE_MAX = 30000
'Максимальное количество символов в строке с названием устройства
Const L502_DEVNAME_SIZE = 32
'Максимальное количество символов в строке с серийным номером
Const L502_SERIAL_SIZE = 32
'Максимально возможное значение внешней опорной частоты
Const L502_EXT_REF_FREQ_MAX = 2000000
'Размер пользовательской области Flash-памяти
Const L502_FLASH_USER_SIZE = &H100000
'Cтандартный таймаут на выполнение запроса к BlackFin в мс
Const L502_BF_REQ_TOUT = 500
'Диапазон ЦАП в вольтах
Const L502_DAC_RANGE = 5#
'Количество каналов ЦАП
Const L502_DAC_CH_CNT = 2
'слово в потоке, означающее, что произошло переполнение
Const L502_STREAM_IN_MSG_OVERFLOW = &H1010000
Public Enum t_lpcie_errs
L502_ERR_OK = 0
'В функцию передан недействительный описатель модуля
L502_ERR_INVALID_HANDLE = -1
'Ошибка выделения памяти
L502_ERR_MEMORY_ALLOC = -2
'Попытка открыть уже открытое устройство
L502_ERR_ALREADY_OPENED = -3
'Устройство с заданными параметрами не найдено в системе
L502_ERR_DEVICE_NOT_FOUND = -4
'Доступ к устройству запрещен (Как правило из-за того, что устройство уже открыто в другой программе)
L502_ERR_DEVICE_ACCESS_DENIED = -5
'Ошибка открытия устройства
L502_ERR_DEVICE_OPEN = -6
'В функцию передан недействительный указатель
L502_ERR_INVALID_POINTER = -7
'Функция не может быть выполнена при запущенном потоке сбора данных
L502_ERR_STREAM_IS_RUNNING = -8
'Ошибка чтения данных синхронного ввода
L502_ERR_RECV = -9
'Ошибка записи данных для синхронного вывода
L502_ERR_SEND = -10
'Произошло переполнение внутреннего буфера для потока синхронного ввода
L502_ERR_STREAM_OVERFLOW = -11
'Неизвестное сообщение в потоке синхронного ввода
L502_ERR_UNSUP_STREAM_MSG = -12
'Ошибка создания системного мьютекса
L502_ERR_MUTEX_CREATE = -13
'Неверный описатель мьютекса
L502_ERR_MUTEX_INVALID_HANDLE = -14
'Истекло время ожидания освобождения мьютекса
L502_ERR_MUTEX_LOCK_TOUT = -15
'Ошибка освобождения мьютекса
L502_ERR_MUTEX_RELEASE = -16
'Недостаточно системных ресурсов
L502_ERR_INSUFFICIENT_SYSTEM_RESOURCES = -17
'Данная возможность еще не реализована
L502_ERR_NOT_IMPLEMENTED = -18
'Недостаточный размер массива
L502_ERR_INSUFFICIENT_ARRAY_SIZE = -19
'Ошибка чтения регистра FPGA
L502_ERR_FPGA_REG_READ = -20
'Ошибка записи регистра FPGA
L502_ERR_FPGA_REG_WRITE = -21
'Сбор данных уже остановлен
L502_ERR_STREAM_IS_NOT_RUNNING = -22
'Задан неверный размер логической таблицы
L502_ERR_INVALID_LTABLE_SIZE = -102
'Задан неверный номер логического канала
L502_ERR_INVALID_LCH_NUMBER = -103
'Неверно задано значение диапазона АЦП
L502_ERR_INVALID_LCH_RANGE = -104
'Неверно задан режим измерения для логического канала
L502_ERR_INVALID_LCH_MODE = -105
'Неверно задан номер физического канала при настройке логического
L502_ERR_INVALID_LCH_PHY_NUMBER = -106
'Неверно задан размер усреднения для логического канала
L502_ERR_INVALID_LCH_AVG_SIZE = -107
'Неверно задан делитель частоты сбора данных АЦП
L502_ERR_INVALID_ADC_FREQ_DIV = -108
'Неверно задан делитель частоты синхронного ввода цифровых линий
L502_ERR_INVALID_DIN_FREQ_DIV = -108
'Неверно задан режим работы модуля L502
L502_ERR_INVALID_MODE = -109
'Неверный номер канала ЦАП
L502_ERR_INVALID_DAC_CHANNEL = -110
'Неверный код выбора опорной частоты синхронизации
L502_ERR_INVALID_REF_FREQ = -111
'Неверно задано значение межкадровой задержки
L502_ERR_INVALID_INTERFRAME_DELAY = -112
'Неверно задан режим синхронизации
L502_ERR_INVALID_SYNC_MODE = -113
'Неверно задан номер канала DMA
L502_ERR_INVALID_DMA_CH = -114
'Ошибка захвата опорной частоты синхронизации
L502_ERR_REF_FREQ_NOT_LOCKED = -131
'Управляющий запрос к драйверу завершен с ошибкой
L502_ERR_IOCTL_FAILD = -132
'Истек таймаут ожидания завершения выполнения управляющего запроса к драйверу
L502_ERR_IOCTL_TIMEOUT = -133
'Ошибка получения информации о устройстве от драйвера
L502_ERR_GET_INFO = -134
'За время ожидания не было считано новое слово с цифровых линий
L502_ERR_DIG_IN_NOT_RDY = -135
'Принято недостаточно слов от модуля
L502_ERR_RECV_INSUFFICIENT_WORDS = -136
'Попытка выполнить операцию, требующую наличие ЦАП, при его отсутствии
L502_ERR_DAC_NOT_PRESENT = -137
'Неверный номер канала в обрабатываемом потоке синхронного ввода
L502_ERR_PROC_INVALID_CH_NUM = -140
'Неверный код диапазона в обрабатываемом потоке синхронного ввода
L502_ERR_PROC_INVALID_CH_RANGE = -141
'Задан неверный адрес во Flash-памяти
L502_ERR_FLASH_INVALID_ADDR = -142
'Задан неверный размер блока данных при работе с Flash-памятью
L502_ERR_FLASH_INVALID_SIZE = -143
'Истек таймаут ожидания завершения записи во Flash-память
L502_ERR_FLASH_WRITE_TOUT = -144
'Истек таймаут ожидания завершения стирания блока Flash-памяти
L502_ERR_FLASH_ERASE_TOUT = -145
'Заданная область для стирания Flash-памяти нарушает границу блока в 4 Кбайт
L502_ERR_FLASH_SECTOR_BOUNDARY = -146
'Не удалось открыть файл прошивки BlackFin
L502_ERR_LDR_FILE_OPEN = -180
'Ошибка чтения из фала прошивки BlackFin
L502_ERR_LDR_FILE_READ = -181
'Неверный формат файла прошивки BlackFin
L502_ERR_LDR_FILE_FORMAT = -182
'Используются возможность LDR-файла, недоступные при записи прошивки BlackFin по HDMA
L502_ERR_LDR_FILE_UNSUP_FEATURE = -183
'Неверный стартовый адрес программы в прошивке BlackFin
L502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR = -184
'Истек таймаут выполнения запроса на чтения/запись памяти BlackFin
L502_ERR_BF_REQ_TIMEOUT = -185
'Команда для BlackFin все еще находится в процессе обработки
L502_ERR_BF_CMD_IN_PROGRESS = -186
'Истекло время выполнения управляющей команды процессором BlackFin
L502_ERR_BF_CMD_TIMEOUT = -187
'Возвращено недостаточно данных в ответ на команду к BlackFin
L502_ERR_BF_CMD_RETURN_INSUF_DATA = -188
'Истек таймаут ожидания готовности процессора BlackFin к записи прошивки
L502_ERR_BF_LOAD_RDY_TOUT = -189
'Попытка выполнить операцию для которой нужен сигнальный процессор при
'отсутствии сигнального процессора в модуле
L502_ERR_BF_NOT_PRESENT = -190
'Неверный адрес памяти BlackFin при записи или чтении по HDMA
L502_ERR_BF_INVALID_ADDR = -191
'Неверный размер данных, передаваемых с управляющей командой в BlackFin
L502_ERR_BF_INVALID_CMD_DATA_SIZE = -192
End Enum
'Флаги, управляющие поиском присутствующих модулей
Public Enum t_l502_getdevs_flags
' Признак, что нужно вернуть серийные номера только тех устройств, которые еще не открыты
L502_GETDEVS_FLAGS_ONLY_NOT_OPENED = &H1&
End Enum
'Флаги для управления цифровыми выходами.
Public Enum t_l502_digout_word_flags
L502_DIGOUT_WORD_DIS_H = &H20000 'Запрещение (перевод в третье состояние) старшей половины цифровых выходов
L502_DIGOUT_WORD_DIS_L = &H10000 'Запрещение младшей половины цифровых выходов
End Enum
'Константы для выбора опорной частоты
Public Enum t_l502_ref_freq
L502_REF_FREQ_2000KHZ = 2000000 'Частота 2МГц
L502_REF_FREQ_1500KHZ = 1500000 'Частота 1.5МГц
End Enum
'Диапазоны измерения для канала АЦП
Public Enum t_l502_adc_range
L502_ADC_RANGE_10 = 0 'Диапазон +/-10V
L502_ADC_RANGE_5 = 1 'Диапазон +/-5V
L502_ADC_RANGE_2 = 2 'Диапазон +/-2V
L502_ADC_RANGE_1 = 3 'Диапазон +/-1V
L502_ADC_RANGE_05 = 4 'Диапазон +/-0.5V
L502_ADC_RANGE_02 = 5 'Диапазон +/-0.2V
End Enum
'Режим измерения для логического канала
Public Enum t_l502_lch_mode
L502_LCH_MODE_COMM = 0 'Измерение напряжения относительно общей земли
L502_LCH_MODE_DIFF = 1 'Дифференциальное измерение напряжения
L502_LCH_MODE_ZERO = 2 'Измерение собственного нуля
End Enum
'Режимы синхронизации.
Public Enum t_l502_sync_mode
L502_SYNC_INTERNAL = 0 'Внутренний сигнал
L502_SYNC_EXTERNAL_MASTER = 1 'От внешнего мастера по разъему синхронизации
L502_SYNC_DI_SYN1_RISE = 2 'По фронту сигнала DI_SYN1
L502_SYNC_DI_SYN2_RISE = 3 'По фронту сигнала DI_SYN2
L502_SYNC_DI_SYN1_FALL = 6 'По спаду сигнала DI_SYN1
L502_SYNC_DI_SYN2_FALL = 7 'По спаду сигнала DI_SYN2
End Enum
'Флаги, управляющие обработкой принятых данных
Public Enum t_l502_proc_flags
'Признак, что нужно преобразовать значения АЦП в вольты
L502_PROC_FLAGS_VOLT = &H1&
' Признак, что не нужно проверять совпадение номеров каналов
' в принятых данных с каналами из логической таблицы.
' Может использоваться при нестандартной прошивке BlackFin
' при передаче в ПК не всех данных.
L502_PROC_FLAGS_DONT_CHECK_CH = &H10000
End Enum
'Флаги для обозначения синхронных потоков данных
Public Enum t_l502_streams
L502_STREAM_ADC = &H1& 'Поток данных от АЦП
L502_STREAM_DIN = &H2& 'Поток данных с цифровых входов
L502_STREAM_DAC1 = &H10& 'Поток данных первого канала ЦАП
L502_STREAM_DAC2 = &H20& 'Поток данных второго канала ЦАП
L502_STREAM_DOUT = &H40& 'Поток данных на цифровые выводы
'Объединение всех флагов, обозначающих потоки данных на ввод
L502_STREAM_ALL_IN = L502_STREAM_ADC Or L502_STREAM_DIN
'Объединение всех флагов, обозначающих потоки данных на вывод
L502_STREAM_ALL_OUT = L502_STREAM_DAC1 Or L502_STREAM_DAC2 Or L502_STREAM_DOUT
End Enum
'Константы, определяющие тип передаваемого отсчета из ПК в модуль
Public Enum t_stream_out_wrd_type
L502_STREAM_OUT_WORD_TYPE_DOUT = &H0& 'Цифровой вывод
L502_STREAM_OUT_WORD_TYPE_DAC1 = &H40000000 'Код для 1-го канала ЦАП
L502_STREAM_OUT_WORD_TYPE_DAC2 = &H80000000 'Код для 2-го канала ЦАП
End Enum
'Режим работы модуля L502
Public Enum t_l502_mode
L502_MODE_FPGA = 0 'Все потоки данных передаются через ПЛИС минуя
'сигнальный процессор BlackFin
L502_MODE_DSP = 1 'Все потоки данных передаются через сигнальный
'процессор, который должен быть загружен
'прошивкой для обработки этих потоков
L502_MODE_DEBUG = 2 'Отладочный режим
End Enum
'Номера каналов ЦАП.
Public Enum t_l502_dac_ch
L502_DAC_CH1 = 0 'Первый канал ЦАП
L502_DAC_CH2 = 1 'Второй канал ЦАП
End Enum
'Флаги, используемые при выводе данных на ЦАП.
Public Enum t_l502_dacout_flags
'Указывает, что значение задано в Вольтах и при выводе его нужно
' перевести его в коды ЦАП. Если флаг не указан, то считается, что значение
' изначально в кодах
L502_DAC_FLAGS_VOLT = &H1&
'Указывает, что нужно применить калибровочные коэффициенты перед
' выводом значения на ЦАП.
L502_DAC_FLAGS_CALIBR = &H2&
End Enum
'Номера каналов DMA
Public Enum t_l502_dma_ch
L502_DMA_CH_IN = 0 'Общий канал DMA на ввод
L502_DMA_CH_OUT = 1 'Общий канал DMA на вывод
End Enum
'Цифровые линии, на которых можно включить подтягивающие резисторы
Public Enum t_l502_pullups
L502_PULLUPS_DI_H = &H1& 'Старшая половина цифровых входов
L502_PULLUPS_DI_L = &H2& 'Младшая половина цифровых входов
L502_PULLUPS_DI_SYN1 = &H4& 'Линия SYN1
L502_PULLUPS_DI_SYN2 = &H8& 'Линия SYN2
End Enum
'Флаги, определяющие наличие опций в модуле
Public Enum t_l502_dev_flags
'Признак наличия двухканального канального ЦАП
L502_DEVFLAGS_DAC_PRESENT = &H1&
'Признак наличия гальваноразвязки
L502_DEVFLAGS_GAL_PRESENT = &H2&
'Признак наличия сигнального процессора BlackFin
L502_DEVFLAGS_BF_PRESENT = &H4&
'Признак, что во Flash-памяти присутствует информация о модуле
L502_DEVFLAGS_FLASH_DATA_VALID = &H10000
'Признак, что во Flash-памяти присутствуют действительные калибровочные
' коэффициенты АЦП
L502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = &H20000
'Признак, что во Flash-памяти присутствуют действительные калибровочные
' коэффициенты ЦАП
L502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = &H40000
End Enum
'Флаги для режима циклического вывода
Public Enum t_l502_out_cycle_flags
L502_OUT_CYCLE_FLAGS_FORCE = &H1&
End Enum
' Калибровочные коэффициенты диапазона
Public Type t_l502_cbr_coef
offs As Double 'смещение нуля
k As Double 'коэффициент шкалы
End Type
'Калибровочные коэффициенты модуля
Public Type t_l502_cbr
adc(0 To L502_ADC_RANGE_CNT - 1) As t_l502_cbr_coef 'Калибровочные коэффициенты АЦП
res1(0 To 64 - 1) As Long 'Резерв
dac(0 To L502_DAC_CH_CNT - 1) As t_l502_cbr_coef 'Калибровочные коэффициенты ЦАП
res2(0 To 20 - 1) As Long
End Type
Public Type t_l502_info
DevName(0 To L502_DEVNAME_SIZE - 1) As Byte
Serial(0 To L502_SERIAL_SIZE - 1) As Byte 'Серийный номер
devflags As Long 'Флаги из #t_l502_dev_flags, описывающие наличие в модуле определенных опций
fpga_ver As Integer 'Версия ПЛИС (старший байт - мажорная, младший - минорная)
plda_ver As Byte 'Версия ПЛИС, управляющего аналоговой частью
board_rev As Byte 'Ревизия платы
res(0 To 120 - 1) As Byte 'Резерв
cbr As t_l502_cbr 'Заводские калибровочные коэффициенты (из Flash-памяти)
End Type
Private Declare Function tmp_L502_GetSerialList Lib "l502api" Alias "L502_GetSerialList" (ByVal serials As Long, ByVal size As Long, ByVal flags As Long, ByRef devcnt As Long) As Long
Public Declare Function L502_Create Lib "l502api" () As Long
Public Declare Function L502_Free Lib "l502api" (ByVal hnd As Long) As Long
Public Declare Function L502_Open Lib "l502api" (ByVal hnd As Long, ByVal Serial As String) As Long
Public Declare Function L502_Close Lib "l502api" (ByVal hnd As Long) As Long
Public Declare Function L502_GetDevInfo Lib "l502api" (ByVal hnd As Long, ByRef info As t_l502_info) As Long
Public Declare Function L502_Configure Lib "l502api" (ByVal hnd As Long, ByVal flags As Long) As Long
Public Declare Function L502_SetLChannel Lib "l502api" (ByVal hnd As Long, ByVal lch As Long, ByVal phy_ch As Long, ByVal mode As Long, ByVal range As Long, ByVal avg As Long) As Long
'Установка количества логических каналов.
Public Declare Function L502_SetLChannelCount Lib "l502api" (ByVal hnd As Long, ByVal lch_cnt As Long) As Long
'Получение количества логических каналов.
Public Declare Function L502_GetLChannelCount Lib "l502api" (ByVal hnd As Long, ByRef lch_cnt As Long) As Long
'Установка делителя частоты сбора для АЦП
Public Declare Function L502_SetAdcFreqDivider Lib "l502api" (ByVal hnd As Long, ByVal adc_freq_div As Long) As Long
'Установка значения межкадровой задержки для АЦП.
Public Declare Function L502_SetAdcInterframeDelay Lib "l502api" (ByVal hnd As Long, ByVal delay As Long) As Long
'Установка делителя частоты синхронного ввода с цифровых линий.
Public Declare Function L502_SetDinFreqDivider Lib "l502api" (ByVal hnd As Long, ByVal din_freq_div As Long) As Long
'Установка частоты сбора АЦП.
Public Declare Function L502_SetAdcFreq Lib "l502api" (ByVal hnd As Long, ByRef f_acq As Double, ByRef f_frame As Double) As Long
'Установка частоты синхронного ввода с цифровых входов.
Public Declare Function L502_SetDinFreq Lib "l502api" (ByVal hnd As Long, ByRef f_din As Double) As Long
'Получить текущие значения частот сбора АЦП
Public Declare Function L502_GetAdcFreq Lib "l502api" (ByVal hnd As Long, ByRef f_acq As Double, ByRef f_frame As Double) As Long
'Установка значения опорной частоты синхронизации.
Public Declare Function L502_SetRefFreq Lib "l502api" (ByVal hnd As Long, ByVal freq As Long) As Long
'Установка режима генерации частоты синхронизации.
Public Declare Function L502_SetSyncMode Lib "l502api" (ByVal hnd As Long, ByVal sync_mode As Long) As Long
'Установка режима запуска частоты синхронизации
Public Declare Function L502_SetSyncStartMode Lib "l502api" (ByVal hnd As Long, ByVal sync_start_mode As Long) As Long
'Установить режим работы модуля.
Public Declare Function L502_SetMode Lib "l502api" (ByVal hnd As Long, ByVal mode As Long) As Long
'Получение текущего режима работы модуля.
Public Declare Function L502_GetMode Lib "l502api" (ByVal hnd As Long, ByRef mode As Long) As Long
'Установить коэффициенты для калибровки значений АЦП
Public Declare Function L502_SetAdcCoef Lib "l502api" (ByVal hnd As Long, ByVal range As Long, ByVal k As Double, ByVal offs As Double) As Long
'Получение текущих калибровочных коэффициентов АЦП.
Public Declare Function L502_GetAdcCoef Lib "l502api" (ByVal hnd As Long, ByVal range As Long, ByRef k As Double, ByRef offs As Double) As Long
'Установить коэффициенты для калибровки значений ЦАП.
Public Declare Function L502_SetDacCoef Lib "l502api" (ByVal hnd As Long, ByVal ch As Long, ByVal k As Double, ByVal offs As Double) As Long
'Получение текущих калибровочных коэффициентов ЦАП
Public Declare Function L502_GetDacCoef Lib "l502api" (ByVal hnd As Long, ByVal ch As Long, ByRef k As Double, ByRef offs As Double) As Long
'Асинхронный вывод данных на канал ЦАП.
Public Declare Function L502_AsyncOutDac Lib "l502api" (ByVal hnd As Long, ByVal ch As Long, ByVal data As Double, ByVal flags As Long) As Long
'Асинхронный вывод данных на цифровые выходы.
Public Declare Function L502_AsyncOutDig Lib "l502api" (ByVal hnd As Long, ByVal val As Long, ByVal msk As Long) As Long
'Асинхронный ввод значений с цифровых входов.
Public Declare Function L502_AsyncInDig Lib "l502api" (ByVal hnd As Long, ByRef din As Long) As Long
Private Declare Function tmp_L502_AsyncGetAdcFrame Lib "l502api" Alias "L502_AsyncGetAdcFrame" (ByVal hnd As Long, ByVal flags As Long, ByVal tout As Long, ByRef data As Double) As Long
'Разрешение синхронных потоков на ввод/вывод.
Public Declare Function L502_StreamsEnable Lib "l502api" (ByVal hnd As Long, ByVal streams As Long) As Long
'Запрещение синхронных потоков на ввод/вывод.
Public Declare Function L502_StreamsDisable Lib "l502api" (ByVal hnd As Long, ByVal streams As Long) As Long
'Запуск синхронных потоков ввода/вывода.
Public Declare Function L502_StreamsStart Lib "l502api" (ByVal hnd As Long) As Long
'Останов синхронных потоков ввода/вывода.
Public Declare Function L502_StreamsStop Lib "l502api" (ByVal hnd As Long) As Long
'Проверка, запущен ли синхронный ввод/вывод
Public Declare Function L502_IsRunning Lib "l502api" (ByVal hnd As Long) As Long
'Чтение данных АЦП и цивровых входов из модуля.
Private Declare Function tmp_L502_Recv Lib "l502api" Alias "L502_Recv" (ByVal hnd As Long, ByRef buf As Long, ByVal size As Long, ByVal tout As Long) As Long
'Передача потоковых данных ЦАП и цифровых выходов в модуль.
Private Declare Function tmp_L502_Send Lib "l502api" Alias "L502_Send" (ByVal hnd As Long, ByRef buf As Long, ByVal size As Long, ByVal tout As Long) As Long
'Обработка принятых отсчетов АЦП от модуля.
Private Declare Function tmp_L502_ProcessAdcData Lib "l502api" Alias "L502_ProcessAdcData" (ByVal hnd As Long, ByRef src As Long, ByRef dest As Double, ByRef size As Long, ByVal flags As Long) As Long
'Обработка принятых от модуля данных.
Private Declare Function tmp_L502_ProcessData Lib "l502api" Alias "L502_ProcessData" (ByVal hnd As Long, ByRef src As Long, ByVal flags As Long, ByRef adc_data As Double, ByRef adc_data_size As Long, ByRef din_data As Long, ByRef din_data_size As Long) As Long
'Обработка принятых от модуля данных с пользовательскими данными.
Private Declare Function tmp_L502_ProcessDataWithUserExt Lib "l502api" Alias "L502_ProcessDataWithUserExt" (ByVal hnd As Long, ByRef src As Long, ByVal size As Long, ByVal flags As Long, ByRef adc_data As Double, ByRef adc_data_size As Long, ByRef din_data As Long, ByRef din_data_size As Long, ByRef usr_data As Long, ByRef usr_data_size As Long) As Long
'Подготовка данных для вывода в модуль.
Private Declare Function tmp_L502_PrepareData Lib "l502api" Alias "L502_PrepareData" (ByVal hnd As Long, ByRef dac1 As Double, ByRef dac2 As Double, ByRef digout As Long, ByVal size As Long, ByVal flags As Long, ByRef out_buf As Long) As Long
'Получить количество отсчетов в буфере потока на ввод.
Public Declare Function L502_GetRecvReadyCountLib Lib "l502api" (ByVal hnd As Long, ByRef rdy_cnt As Long) As Long
'Получить размер свободного места в буфере потока на вывод.
Public Declare Function L502_GetSendReadyCount Lib "l502api" (ByVal hnd As Long, ByRef rdy_cnt As Long) As Long
'Получить номер следующего ожидаемого логического канала АЦП для обработки.
Public Declare Function L502_GetNextExpectedLchNum Lib "l502api" (ByVal hnd As Long, ByRef lch As Long) As Long
'Начало подготовки вывода синхронных данных
Public Declare Function L502_PreloadStart Lib "l502api" (ByVal hnd As Long) As Long
'Начало загрузки циклического сигнала на вывод
Public Declare Function L502_OutCycleLoadStart Lib "l502api" (ByVal hnd As Long, ByVal size As Long) As Long
'Установка ранее загруженного циклического сигнала на вывод
Public Declare Function L502_OutCycleSetup Lib "l502api" (ByVal hnd As Long, ByVal flags As Long) As Long
'Останов вывода циклического сигнала
Public Declare Function L502_OutCycleStop Lib "l502api" (ByVal hnd As Long, ByVal flags As Long) As Long
'Установка размера буфера в драйвере для синхронного ввода или вывода.
Public Declare Function L502_SetDmaBufSize Lib "l502api" (ByVal hnd As Long, ByVal dma_ch As Long, ByVal size As Long) As Long
'Установка шага прерывания при передаче потока по DMA.
Public Declare Function L502_SetDmaIrqStep Lib "l502api" (ByVal hnd As Long, ByVal dma_ch As Long, ByVal step As Long) As Long
'Загрузка прошивки сигнального процессора BlackFin.
Public Declare Function L502_BfLoadFirmware Lib "l502api" (ByVal hnd As Long, ByVal filename As String) As Long
'Проверка, загружена ли прошивка BlackFIn.
Public Declare Function L502_BfCheckFirmwareIsLoaded Lib "l502api" (ByVal hnd As Long, ByRef version As Long) As Long
'Чтение блока данных из памяти сигнального процессора.
Private Declare Function tmp_L502_BfMemRead Lib "l502api" Alias "L502_BfMemRead" (ByVal hnd As Long, ByVal addr As Long, ByRef regs As Long, ByVal size As Long) As Long
'Запись блока данных в память сигнального процессора.
Private Declare Function tmp_L502_BfMemWrite Lib "l502api" Alias "L502_BfMemWrite" (ByVal hnd As Long, ByVal addr As Long, ByRef regs As Long, ByVal size As Long) As Long
'Передача управляющей команды сигнальному процессору.
Private Declare Function tmp_L502_BfExecCmd Lib "l502api" Alias "L502_BfExecCmd" (ByVal hnd As Long, ByVal cmd_code As Integer, ByVal par As Long, ByRef snd_data As Long, ByVal snd_size As Long, ByRef rcv_data As Long, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long
'Чтение блока данных из Flash-памяти.
Private Declare Function tmp_L502_FlashRead Lib "l502api" Alias "L502_FlashRead" (ByVal hnd As Long, ByVal addr As Long, ByRef data As Byte, ByVal size As Long) As Long
'Запись блока данных во Flash-память модуля.
Private Declare Function tmp_L502_FlashWrite Lib "l502api" Alias "L502_FlashWrite" (ByVal hnd As Long, ByVal addr As Long, ByRef data As Byte, ByVal size As Long) As Long
'Стирание блока во Flash-памяти.
Public Declare Function L502_FlashErase Lib "l502api" (ByVal hnd As Long, ByVal addr As Long, ByVal size As Long) As Long
'Разрешение записи в пользовательскую область Flash-памяти.
Public Declare Function L502_FlashWriteEnable Lib "l502api" (ByVal hnd As Long) As Long
'Запрет записи в пользовательскую область Flash-памяти.
Public Declare Function L502_FlashWriteDisable Lib "l502api" (ByVal hnd As Long) As Long
'Получить версию библиотеки.
Public Declare Function L502_GetDllVersion Lib "l502api" () As Long
'Получить версию драйвера устройства.
Public Declare Function L502_GetDriverVersion Lib "l502api" (ByVal hnd As Long, ByRef ver As Long) As Long
'Моргание светодиодом на передней панели.
Public Declare Function L502_LedBlink Lib "l502api" (ByVal hnd As Long) As Long
'Установка подтягивающих резисторов на входных линиях.
Public Declare Function L502_SetDigInPullup Lib "l502api" (ByVal hnd As Long, ByVal pullups As Long) As Long
Private Declare Function tmp_L502_GetErrorString Lib "l502api" Alias "L502_GetErrorString" (ByVal Error_Code As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Public Function L502_AsyncGetAdcFrame(ByVal hnd As Long, ByVal flags As Long, ByVal tout As Long, ByRef data() As Double) As Long
L502_AsyncGetAdcFrame = tmp_L502_AsyncGetAdcFrame(hnd, flags, tout, data(0))
End Function
Public Function L502_Recv(ByVal hnd As Long, ByRef buf() As Long, ByVal size As Long, ByVal tout As Long) As Long
L502_Recv = tmp_L502_Recv(hnd, buf(0), size, tout)
End Function
Public Function L502_Send(ByVal hnd As Long, ByRef buf() As Long, ByVal size As Long, ByVal tout As Long) As Long
L502_Send = tmp_L502_Send(hnd, buf(0), size, tout)
End Function
Public Function L502_ProcessAdcData(ByVal hnd As Long, ByRef src() As Long, ByRef dest() As Double, ByRef size As Long, ByVal flags As Long) As Long
L502_ProcessAdcData = tmp_L502_ProcessAdcData(hnd, src(0), dest(0), size, flags)
End Function
Public Function L502_ProcessData(ByVal hnd As Long, ByRef src() As Long, ByVal flags As Long, ByRef adc_data() As Double, ByRef adc_data_size As Long, ByRef din_data() As Long, ByRef din_data_size As Long) As Long
L502_ProcessData = tmp_L502_ProcessData(hnd, src(0), flags, adc_data(0), adc_data_size, din_data(0), din_data_size)
End Function
Public Function L502_ProcessDataWithUserExt(ByVal hnd As Long, ByRef src() As Long, ByVal size As Long, ByVal flags As Long, ByRef adc_data() As Double, ByRef adc_data_size As Long, ByRef din_data() As Long, ByRef din_data_size As Long, ByRef usr_data() As Long, ByRef usr_data_size As Long) As Long
L502_ProcessDataWithUserExt = tmp_L502_ProcessDataWithUserExt(hnd, src(0), size, flags, adc_data(0), adc_data_size, din_data(0), din_data_size, usr_data(0), usr_data_size)
End Function
Public Function L502_PrepareData(ByVal hnd As Long, ByRef dac1() As Double, ByRef dac2() As Double, ByRef digout() As Long, ByVal size As Long, ByVal flags As Long, ByRef out_buf() As Long) As Long
L502_PrepareData = tmp_L502_PrepareData(hnd, dac1(0), dac2(0), digout(0), size, flags, out_buf(0))
End Function
Public Function L502_BfMemRead(ByVal hnd As Long, ByVal addr As Long, ByRef regs() As Long, ByVal size As Long) As Long
L502_BfMemRead = tmp_L502_BfMemRead(hnd, addr, regs(0), size)
End Function
Public Function L502_BfMemWrite(ByVal hnd As Long, ByVal addr As Long, ByRef regs() As Long, ByVal size As Long) As Long
L502_BfMemWrite = tmp_L502_BfMemWrite(hnd, addr, regs(0), size)
End Function
Public Function L502_BfExecCmd(ByVal hnd As Long, ByVal cmd_code As Integer, ByVal par As Long, ByRef snd_data() As Long, ByVal snd_size As Long, ByRef rcv_data() As Long, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long
L502_BfExecCmd = tmp_L502_BfExecCmd(hnd, cmd_code, par, snd_data(0), snd_size, rcv_data(0), rcv_size, tout, recvd_size)
End Function
Public Function L502_FlashRead(ByVal hnd As Long, ByVal addr As Long, ByRef data() As Byte, ByVal size As Long) As Long
L502_FlashRead = tmp_L502_FlashRead(hnd, addr, data(0), size)
End Function
Public Function L502_FlashWrite(ByVal hnd As Long, ByVal addr As Long, ByRef data() As Byte, ByVal size As Long) As Long
L502_FlashWrite = tmp_L502_FlashWrite(hnd, addr, data(0), size)
End Function
Public Function StrFromPtr(ByVal lpStr As Long) As String
Dim bStr() As Byte
Dim cChars As Long
On Error Resume Next
' Get the number of characters in the buffer
cChars = lstrlen(lpStr)
If cChars Then
' Resize the byte array
ReDim bStr(0 To cChars - 1) As Byte
' Grab the ANSI buffer
Call CopyMemory(bStr(0), ByVal lpStr, cChars)
End If
' Now convert to a VB Unicode string
StrFromPtr = StrConv(bStr, vbUnicode)
End Function
Public Function L502_GetErrorString(ByVal Error_Code As Long) As String
Dim Ptr As Long
Ptr = tmp_L502_GetErrorString(Error_Code)
L502_GetErrorString = StrFromPtr(Ptr)
End Function
Public Function L502_GetSerialList(ByRef serials() As String, ByVal flags As Long) As Long
Dim tmp As Long
Dim cnt As Long
Dim ret_cnt As Long
Dim dummy As Long
Dim err As Long
ret_cnt = 0
tmp = 0
ret_cnt = tmp_L502_GetSerialList(tmp, 0, flags, cnt)
If ret_cnt < 0 Then
err = ret_cnt
ReDim serials(0)
Else
If cnt = 0 Then
ReDim serials(0)
Else
tmp = GlobalAlloc(0, L502_SERIAL_SIZE * cnt)
If tmp = 0 Then
err = L502_ERR_MEMORY_ALLOC
Else
ret_cnt = tmp_L502_GetSerialList(tmp, cnt, flags, dummy)
If ret_cnt < 0 Then
err = ret_cnt
ReDim serials(0)
Else
If ret_cnt = 0 Then
ReDim serials(0)
Else
ReDim serials(0 To ret_cnt - 1)
For i = 0 To ret_cnt - 1
serials(i) = StrFromPtr(tmp)
Next
End If
End If
GlobalFree (tmp)
End If
End If
End If
If err = L502_ERR_OK Then
err = ret_cnt
End If
L502_GetSerialList = err
End Function
@@ -0,0 +1,5 @@
Данный пример демонстрирует работу с модулем L502 на Visual Basic.
Данный пример не включает новые описания типов, добавленные для поддержки модуля E502,
а использует срарые версии функций.
Рекомендуется использовать пример x502_general, который использует обновленные описания и
позволяет работать как с модулями L502, так и с E502
@@ -0,0 +1,200 @@
Attribute VB_Name = "e502api"
' ìîäóëü äëÿ îáúÿâëåíèÿ êîíñòàíò, ñòðóêòóð è ôóíêöèé, ñïåöèôè÷íûõ äëÿ ìîäóëÿ E502
'Ñîáûòèÿ ïîèñêà ñåòåâûõ ñåðâèñîâ
Public Enum t_e502_eth_svc_event
E502_ETH_SVC_EVENT_NONE = 0 'Íè îäíîãî ñîáûòèÿ íå ïðîèçîøëî
E502_ETH_SVC_EVENT_ADD = 1 'Îáíàðóæåíî ïîÿâëåíèå íîâîãî ñåòåâîãî ñåðâèñà
E502_ETH_SVC_EVENT_REMOVE = 2 'Îáíàðóæåíî èñ÷åçíîâåíèå ðàíåå äîñòóïíîãî ñåòåâîãî ñåðâèñà
E502_ETH_SVC_EVENT_CHANGED = 3 'Èçìåíåíèå ïàðàìåòðîâ ðàíåå îáíàðóæåííîãî ñåòåâîãî ñåðâèñà
End Enum
Private Declare Function tmp_E502_UsbGetSerialList Lib "e502api" Alias "E502_UsbGetSerialList" (ByVal serials As Long, ByVal size As Long, ByVal flags As Long, ByRef devcnt As Long) As Long
Public Declare Function E502_OpenUsb Lib "e502api" (ByVal hnd As Long, ByVal serial As String) As Long
Public Declare Function E502_OpenByIpAddr Lib "e502api" (ByVal hnd As Long, ByVal ip_addr As Long, ByVal flags As Long, ByVal tout As Long) As Long
Private Declare Function tmp_E502_UsbGetDevRecordsList Lib "e502api" Alias "E502_UsbGetDevRecordsList" (ByRef list As t_x502_devrec, ByVal size As Long, ByVal flags As Long, ByRef devcnt As Long) As Long
Public Declare Function E502_MakeDevRecordByIpAddr Lib "e502api" (ByRef devrec As t_x502_devrec, ByVal ip_addr As Long, ByVal flags As Long, ByVal tout As Long) As Long
Public Declare Function E502_EthDevRecordSetCmdPort Lib "e502api" (ByRef devrec As t_x502_devrec, ByVal cmd_port As Integer) As Long
Public Declare Function E502_EthDevRecordSetDataPort Lib "e502api" (ByRef devrec As t_x502_devrec, ByVal data_port As Integer) As Long
Public Declare Function E502_MakeDevRecordByEthSvc Lib "e502api" (ByRef devrec As t_x502_devrec, ByVal svc As Long, ByVal flags As Long, ByVal tout As Long) As Long
Public Declare Function E502_GetIpAddr Lib "e502api" (ByVal hnd As Long, ByRef ip_addr As Long) As Long
Public Declare Function E502_EthConfigCreate Lib "e502api" () As Long
Public Declare Function E502_EthConfigFree Lib "e502api" (ByVal cfg As Long) As Long
Public Declare Function E502_EthConfigRead Lib "e502api" (ByVal hnd As Long, ByVal cfg As Long) As Long
Public Declare Function E502_EthConfigWrite Lib "e502api" (ByVal hnd As Long, ByVal cfg As Long, ByVal passwd As String) As Long
Public Declare Function E502_EthConfigCopy Lib "e502api" (ByVal src_cfg As Long, ByVal dst_cfg As Long) As Long
Public Declare Function E502_EthConfigGetEnabled Lib "e502api" (ByVal cfg As Long, ByRef en As Long) As Long
Public Declare Function E502_EthConfigSetEnabled Lib "e502api" (ByVal cfg As Long, ByVal en As Long) As Long
Public Declare Function E502_EthConfigGetAutoIPEnabled Lib "e502api" (ByVal cfg As Long, ByRef en As Long) As Long
Public Declare Function E502_EthConfigSetAutoIPEnabled Lib "e502api" (ByVal cfg As Long, ByVal en As Long) As Long
Public Declare Function E502_EthConfigGetUserMACEnabled Lib "e502api" (ByVal cfg As Long, ByRef en As Long) As Long
Public Declare Function E502_EthConfigSetUserMACEnabled Lib "e502api" (ByVal cfg As Long, ByVal en As Long) As Long
Public Declare Function E502_EthConfigGetIPv4Addr Lib "e502api" (ByVal cfg As Long, ByRef ip_addr As Long) As Long
Public Declare Function E502_EthConfigSetIPv4Addr Lib "e502api" (ByVal cfg As Long, ByVal ip_addr As Long) As Long
Public Declare Function E502_EthConfigGetIPv4Mask Lib "e502api" (ByVal cfg As Long, ByRef mask As Long) As Long
Public Declare Function E502_EthConfigSetIPv4Mask Lib "e502api" (ByVal cfg As Long, ByVal mask As Long) As Long
Public Declare Function E502_EthConfigGetIPv4Gate Lib "e502api" (ByVal cfg As Long, ByRef gate As Long) As Long
Public Declare Function E502_EthConfigSetIPv4Gate Lib "e502api" (ByVal cfg As Long, ByVal gate As Long) As Long
Private Declare Function tmp_E502_EthConfigGetUserMac Lib "e502api" Alias "EthConfigGetUserMac" (ByVal cfg As Long, ByRef mac As Byte) As Long
Private Declare Function tmp_E502_EthConfigSetUserMac Lib "e502api" Alias "E502_EthConfigSetUserMac" (ByVal cfg As Long, ByRef mac As Byte) As Long
Private Declare Function tmp_E502_EthConfigGetFactoryMac Lib "e502api" Alias "E502_EthConfigGetFactoryMac" (ByVal cfg As Long, ByRef mac As Byte) As Long
Public Declare Function tmp_E502_EthConfigGetInstanceName Lib "e502api" Alias "E502_EthConfigGetInstanceName" (ByVal cfg As Long, ByRef name As Byte) As Long
Public Declare Function E502_EthConfigSetInstanceName Lib "e502api" (ByVal cfg As Long, ByVal name As String) As Long
Public Declare Function E502_EthConfigSetNewPassword Lib "e502api" (ByVal cfg As Long, ByVal new_passwd As String) As Long
Public Declare Function E502_SwitchToBootloader Lib "e502api" (ByVal hnd As Long) As Long
Public Declare Function E502_ReloadFPGA Lib "e502api" (ByVal hnd As Long) As Long
Private Declare Function tmp_E502_CortexExecCmd Lib "e502api" Alias "E502_CortexExecCmd" (ByVal hnd As Long, ByVal cmd_code As Long, ByVal par As Long, ByRef snd_data As Byte, ByVal snd_size As Long, ByRef rcv_data As Byte, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long
Public Declare Function E502_EthSvcBrowseStart Lib "e502api" (ByVal pcontext As Long, ByVal flags As Long) As Long
Public Declare Function E502_EthSvcBrowseGetEvent Lib "e502api" (ByVal context As Long, ByVal svc As Long, ByRef svcevent As Long, ByRef flags As Long, ByVal tout As Long) As Long
Public Declare Function E502_EthSvcBrowseStop Lib "e502api" (ByVal context As Long) As Long
Public Declare Function E502_EthSvcRecordFree Lib "e502api" (ByVal svc As Long) As Long
Private Declare Function tmp_E502_EthSvcRecordGetInstanceName Lib "e502api" Alias "E502_EthSvcRecordGetInstanceName" (ByVal svc As Long, ByRef name As Byte) As Long
Public Declare Function E502_EthSvcRecordGetDevSerial Lib "e502api" (ByVal svc As Long, ByVal serial As String) As Long
Public Declare Function E502_EthSvcRecordResolveIPv4Addr Lib "e502api" (ByVal svc As Long, ByRef addr As Long, ByVal tout As Long) As Long
Public Declare Function E502_EthSvcRecordIsSameInstance Lib "e502api" (ByVal svc1 As Long, ByVal svc2 As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Function E502_EthConfigGetUserMac(ByVal cfg As Long, ByRef mac() As Byte) As Long
E502_EthConfigGetUserMac = tmp_E502_EthConfigGetUserMac(cfg, mac(0))
End Function
Public Function E502_EthConfigSetUserMac(ByVal cfg As Long, ByRef mac() As Byte) As Long
E502_EthConfigSetUserMac = tmp_E502_EthConfigSetUserMac(cfg, mac(0))
End Function
Public Function E502_EthConfigGetFactoryMac(ByVal cfg As Long, ByRef mac() As Byte) As Long
E502_EthConfigGetFactoryMac = tmp_E502_EthConfigGetFactoryMac(cfg, mac(0))
End Function
Public Function E502_EthConfigGetInstanceName(ByVal cfg As Long, ByRef name As String) As Long
Dim str_arr(0 To X502_INSTANCE_NAME_SIZE) As Byte
Dim err As Long
err = tmp_E502_EthConfigGetInstanceName(cfg, str_arr(0))
'òåêóùàÿ ðåàëèçàöèÿ îáðàáàòûâàåò òîëüêî ASCII ñèìâîëû
'êîððåêòíî ñäåëàòü ïðåîáðàçîâàíèå èç UTF-8 ÷åðåç MultiByteToWideChar
If err = X502_ERR_OK Then
name = StrConv(str_arr, vbUnicode)
End If
E502_EthConfigGetInstanceName = err
End Function
Public Function E502_EthSvcRecordGetInstanceName(ByVal svc As Long, ByRef name As String) As Long
Dim str_arr(0 To X502_INSTANCE_NAME_SIZE) As Byte
Dim err As Long
err = tmp_E502_EthSvcRecordGetInstanceName(svc, str_arr(0))
'òåêóùàÿ ðåàëèçàöèÿ îáðàáàòûâàåò òîëüêî ASCII ñèìâîëû
'êîððåêòíî ñäåëàòü ïðåîáðàçîâàíèå èç UTF-8 ÷åðåç MultiByteToWideChar
If err = X502_ERR_OK Then
name = StrConv(str_arr, vbUnicode)
End If
E502_EthConfigGetInstanceName = err
End Function
Public Function E502_CortexExecCmd(ByVal hnd As Long, ByVal cmd_code As Long, ByVal par As Long, ByRef snd_data() As Byte, ByVal snd_size As Long, ByRef rcv_data() As Byte, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long
E502_CortexExecCmd = tmp_E502_CortexExecCmd(hnd, cmd_code, par, snd_data(0), snd_size, rcv_data(0), rcv_size, tout, recvd_size)
End Function
Public Function E502_UsbGetSerialList(ByRef serials() As String, ByVal flags As Long) As Long
Dim tmp As Long
Dim cnt As Long
Dim ret_cnt As Long
Dim dummy As Long
Dim err As Long
ret_cnt = 0
tmp = 0
ret_cnt = tmp_E502_UsbGetSerialList(tmp, 0, flags, cnt)
If ret_cnt < 0 Then
err = ret_cnt
ReDim serials(0)
Else
If cnt = 0 Then
ReDim serials(0)
Else
tmp = GlobalAlloc(0, X502_SERIAL_SIZE * cnt)
If tmp = 0 Then
err = X502_ERR_MEMORY_ALLOC
Else
ret_cnt = tmp_E502_UsbGetSerialList(tmp, cnt, flags, dummy)
If ret_cnt < 0 Then
err = ret_cnt
ReDim serials(0)
Else
If ret_cnt = 0 Then
ReDim serials(0)
Else
ReDim serials(0 To ret_cnt - 1)
For i = 0 To ret_cnt - 1
serials(i) = X502_StrFromPtr(tmp + i * X502_SERIAL_SIZE)
Next
End If
End If
GlobalFree (tmp)
End If
End If
End If
If err = L502_ERR_OK Then
err = ret_cnt
End If
E502_UsbGetSerialList = err
End Function
Public Function E502_UsbGetDevRecordsList(ByRef list() As t_x502_devrec, ByVal flags As Long) As Long
Dim ret_cnt As Long
Dim err As Long
Dim devcnt As Long
Dim tmp As t_x502_devrec
Dim dummy As Long
ret_cnt = tmp_E502_UsbGetDevRecordsList(tmp, 0, flags, devcnt)
If ret_cnt < 0 Then
err = ret_cnt
ReDim list(0)
Else
If devcnt = 0 Then
ReDim list(0)
Else
ReDim list(0 To devcnt - 1)
ret_cnt = tmp_E502_UsbGetDevRecordsList(list(0), devcnt, flags, dummy)
If ret_cnt < 0 Then
err = ret_cnt
ReDim list(0)
Else
If ret_cnt = 0 Then
ReDim list(0)
ElseIf ret_cnt <> devcnt Then
ReDim Preserve list(0 To ret_cnt - 1)
End If
End If
End If
End If
If err = L502_ERR_OK Then
err = ret_cnt
End If
E502_UsbGetDevRecordsList = err
End Function
@@ -0,0 +1,94 @@
Attribute VB_Name = "l502api"
' ìîäóëü äëÿ îáúÿâëåíèÿ êîíñòàíò, ñòðóêòóð è ôóíêöèé, ñïåöèôè÷íûõ äëÿ ìîäóëÿ L502
Private Declare Function tmp_L502_GetSerialList Lib "l502api" Alias "L502_GetSerialList" (ByVal serials As Long, ByVal size As Long, ByVal flags As Long, ByRef devcnt As Long) As Long
Public Declare Function L502_Open Lib "l502api" (ByVal hnd As Long, ByVal serial As String) As Long
Private Declare Function tmp_L502_GetDevRecordsList Lib "l502api" Alias "L502_GetDevRecordsList" (ByRef list As t_x502_devrec, ByVal size As Long, ByVal flags As Long, ByRef devcnt As Long) As Long
Public Declare Function L502_GetDriverVersion Lib "l502api" (ByVal hnd As Long, ByRef ver As Long) As Long
Public Function L502_GetSerialList(ByRef serials() As String, ByVal flags As Long) As Long
Dim tmp As Long
Dim cnt As Long
Dim ret_cnt As Long
Dim dummy As Long
Dim err As Long
ret_cnt = 0
tmp = 0
ret_cnt = tmp_L502_GetSerialList(tmp, 0, flags, cnt)
If ret_cnt < 0 Then
err = ret_cnt
ReDim serials(0)
Else
If cnt = 0 Then
ReDim serials(0)
Else
tmp = GlobalAlloc(0, X502_SERIAL_SIZE * cnt)
If tmp = 0 Then
err = X502_ERR_MEMORY_ALLOC
Else
ret_cnt = tmp_L502_GetSerialList(tmp, cnt, flags, dummy)
If ret_cnt < 0 Then
err = ret_cnt
ReDim serials(0)
Else
If ret_cnt = 0 Then
ReDim serials(0)
Else
ReDim serials(0 To ret_cnt - 1)
For i = 0 To ret_cnt - 1
serials(i) = X502_StrFromPtr(tmp + i * X502_SERIAL_SIZE)
Next
End If
End If
GlobalFree (tmp)
End If
End If
End If
If err = L502_ERR_OK Then
err = ret_cnt
End If
L502_GetSerialList = err
End Function
Public Function L502_GetDevRecordsList(ByRef list() As t_x502_devrec, ByVal flags As Long) As Long
Dim ret_cnt As Long
Dim err As Long
Dim devcnt As Long
Dim tmp As t_x502_devrec
Dim dummy As Long
ret_cnt = tmp_L502_GetDevRecordsList(tmp, 0, flags, devcnt)
If ret_cnt < 0 Then
err = ret_cnt
ReDim list(0)
Else
If devcnt = 0 Then
ReDim list(0)
Else
ReDim list(0 To devcnt - 1)
ret_cnt = tmp_L502_GetDevRecordsList(list(0), devcnt, flags, dummy)
If ret_cnt < 0 Then
err = ret_cnt
ReDim list(0)
Else
If ret_cnt = 0 Then
ReDim list(0)
ElseIf ret_cnt <> devcnt Then
ReDim Preserve list(0 To ret_cnt - 1)
End If
End If
End If
End If
If err = L502_ERR_OK Then
err = ret_cnt
End If
L502_GetDevRecordsList = err
End Function
@@ -0,0 +1,10 @@
Данный пример демонстрирует работу с модулями L502 и E502 из среды Visual Basic 6.
Модули x502api.bas, e502api.bas и l502api.bas включают необходимые объявления типов
и функций из библиотеки x502api и могут использоваться без изменений в пользовательском проекте
(об отличиях в описании функций написано в руководстве программиста).
Пример по нажатию кнопки устанавливает соединение с выбранным устройством, настраивает его (параметры задаются в коде),
выполняет сбор блока данных с расчетом среднего и закрывает соединение.
Для простоты все операции выполняются в обработчике кнопки в основном потоке (т.к. данный пример предназначен
в первую очередь для демонстрации работы именно с самим модулем, а не работу с потоками и другими средствами).
@@ -0,0 +1,355 @@
VERSION 5.00
Begin VB.Form MainForm
Caption = "X502 Example"
ClientHeight = 3405
ClientLeft = 120
ClientTop = 450
ClientWidth = 7395
LinkTopic = "Form1"
ScaleHeight = 3405
ScaleWidth = 7395
StartUpPosition = 3 'Windows Default
Begin VB.CheckBox checkUseIP
Caption = "Ïîäêëþ÷åíèå ïî IP àäðåñó"
Height = 375
Left = 3480
TabIndex = 6
Top = 840
Width = 2775
End
Begin VB.TextBox edtIpAddr
Height = 375
Left = 3480
TabIndex = 5
Text = "192.168.12.233"
Top = 1200
Width = 2775
End
Begin VB.ListBox ResultList
Height = 1425
ItemData = "x502_example.frx":0000
Left = 240
List = "x502_example.frx":0002
TabIndex = 3
Top = 1800
Width = 2775
End
Begin VB.CommandButton btnRecvData
Caption = "Ïðèíÿòü áëîê äàííûõ"
Height = 375
Left = 240
TabIndex = 2
Top = 960
Width = 2655
End
Begin VB.ComboBox cbbDevList
Height = 315
Left = 3480
TabIndex = 1
Top = 360
Width = 2895
End
Begin VB.CommandButton btnRefreshDeviceList
Caption = "Îáíîâèòü ñïèñîê óñòðîéñòâ"
Height = 375
Left = 240
TabIndex = 0
Top = 360
Width = 2655
End
Begin VB.Label Ìåòêà2
Caption = "Ðåçóëüòàò (ñðåäíåå ïî êàíàëàì)"
Height = 255
Left = 240
TabIndex = 4
Top = 1440
Width = 2775
End
End
Attribute VB_Name = "MainForm"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'çàïèñè, ñîîòâåòñòâóþùèå íàéäåííûì óñòðîéñòâàì ïî USB è PCI
Dim devlist() As t_x502_devrec
'ïðèçíàê, ÷òî ñïèñîê devlist äåéñòâèòåëåí
Dim devlist_valid As Boolean
Private Type ipBytes
B1 As Byte
B2 As Byte
B3 As Byte
B4 As Byte
End Type
Private Type ipLong
Val As Long
End Type
' Convert a dotted quad IP string to a Long.
Public Function IP2Long(IP As String) As Long
ReDim parse(0 To 3) As String
Dim B As ipBytes
Dim L As ipLong
parse = Split(IP, ".")
B.B4 = Val(parse(0))
B.B3 = Val(parse(1))
B.B2 = Val(parse(2))
B.B1 = Val(parse(3))
LSet L = B
IP2Long = L.Val
End Function
'óäàëåíèå çàïèñåé î óñòðîéñòâàõ ñ î÷èñòêîé ðåñóðñîâ
Private Sub freeDevlist()
If devlist_valid Then
Dim devcnt As Long
devcnt = UBound(devlist) + 1
If devcnt <> 0 Then
Call X502_FreeDevRecordList(devlist, devcnt)
End If
ReDim devlist(0)
cbbDevList.Clear
devlist_valid = False
End If
End Sub
Private Sub refreshDeviceList()
Dim usbrec_cnt As Long, pcirec_cnt As Long
Dim usbreclist() As t_x502_devrec
Dim pcireclist() As t_x502_devrec
Dim devcnt As Long
Dim old_idx As Long
old_idx = cbbDevList.ListIndex
Call freeDevlist
'Ïîëó÷àåì ñïèñîêè çàïèñåé î íàéäåííûõ óñòðîéñòâàõ äëÿ USB è PCI
usbrec_cnt = E502_UsbGetDevRecordsList(usbreclist, 0)
If usbrec_cnt < 0 Then
MsgBox ("Îøèáêà ïîëó÷åíèÿ ñïèñêà USB-óñòðîéòâ: " + X502_GetErrorString(usbrec_cnt))
usbrec_cnt = 0
End If
pcirec_cnt = L502_GetDevRecordsList(pcireclist, 0)
If (pcirec_cnt < 0) Then
MsgBox ("Îøèáêà ïîëó÷åíèÿ ñïèñêà PCI-óñòðîéòâ: " + X502_GetErrorString(pcirec_cnt))
pcirec_cnt = 0
End If
'ñîçäàåì îáùèé ñïèñîê íà îñíîâå ýòèõ äâóõ
devcnt = usbrec_cnt + pcirec_cnt
If devcnt > 0 Then
ReDim devlist(0 To devcnt - 1)
For i = 0 To usbrec_cnt - 1
devlist(i) = usbreclist(i)
Next
For i = 0 To pcirec_cnt - 1
devlist(i + usbrec_cnt) = pcireclist(i)
Next
'äîáàâëÿåì âñå óñòðîéñòâà â combobox
For i = 0 To devcnt - 1
cbbDevList.AddItem (X502_StrConvert(devlist(i).DevName) + ", " + X502_StrConvert(devlist(i).serial))
Next
devlist_valid = True
'âîññòàíàâëèâàåì âûáðàííûé ïî íîìåðó ýëåìåíò â ñïèñêå, åñëè òàêîé íîìåð ñîõðàíèëñÿ,
'èíà÷å âûáèðàåì ïåðâîå óñòðîéñòâî
If old_idx >= devcnt Or old_idx < 0 Then
old_idx = 0
End If
cbbDevList.ListIndex = old_idx
End If
End Sub
Private Sub adcSampleBlock(ByRef devrec As t_x502_devrec)
Dim err As Long
Dim hnd As Long
Dim adc_freq, frame_freq As Double
'êîëè÷åñòâî òî÷åê äëÿ ïðèåìà ïî êàæäîìó êàíàëó
Const ch_points = 1000
'êîëè÷åñòâî îïðàøèâàåìûõ êàíàëîâ
Const ch_cnt = 3
ResultList.Clear
'ñîçäàíèå îïèñàòåëÿ ìîäóëÿ äëÿ ðàáîòó
hnd = X502_Create()
'óñòàíàâëèâàåì ñâÿçü ñ ìîäóëåì, èñïîëüçóÿ ïåðåäàííóþ çàïèñü î ìîäóëå
err = X502_OpenByDevRecord(hnd, devrec)
If err <> X502_ERR_OK Then
MsgBox ("Îøèáêà îòêðûòèÿ ìîäóëÿ: " + X502_GetErrorString(err))
Else
'óñòàíàâëèâàåì êîë-âî îïðàøèâàåìûõ êàíàëîâ
err = X502_SetLChannelCount(hnd, ch_cnt)
'äëÿ êàæäîãî èç îïðàøèâàåìûõ êàíàëîâ çàäàåì íîìåð êàíàëà, ðåæèì, äèàïàçîí
'äëÿ ïðèìåðà èñïîëüçóåì ïåðâûé êàíàë â äèô. 10Â, 3-èé ñ îáùåé çåìëåé ïîääèàïàçîí 1 Â, è 32-îé ñ îáùåé çåìëåé ïîääèàïàçîí 0.2 Â
If err = X502_ERR_OK Then
err = X502_SetLChannel(hnd, 0, 0, X502_LCH_MODE_DIFF, X502_ADC_RANGE_10, 0)
End If
If err = X502_ERR_OK Then
err = X502_SetLChannel(hnd, 1, 2, X502_LCH_MODE_COMM, X502_ADC_RANGE_1, 0)
End If
If err = X502_ERR_OK Then
err = X502_SetLChannel(hnd, 2, 31, X502_LCH_MODE_COMM, X502_ADC_RANGE_02, 0)
End If
If err = X502_ERR_OK Then
'íàñòðîéêà ÷àñòîòû. Çàäàåì ÷àñòîòó ÀÖÏ = 2 ÌÃö, ñ ìàêñ. ïîëó÷èâøåéñÿ ÷àñòîòîé íà êàíàë (2 ÌÃö/lch_cnt)
f_adc = 2000000
f_frame = 0
err = X502_SetAdcFreq(hnd, f_adc, f_frame)
End If
If err = X502_ERR_OK Then
'ïåðåäàåì óñòàíîâëåííóþ êîíôèãóðàöèþ â ìîäóëü
err = X502_Configure(hnd, 0)
End If
If err = X502_ERR_OK Then
'èç ñèíõðîííûõ ïîòîêîâ ðàçðåøàåì òîëüêî ïîòîê ÀÖÏ
err = X502_StreamsEnable(hnd, X502_STREAM_ADC)
End If
If err <> X502_ERR_OK Then
MsgBox ("Îøèáêà íàñòðîéêè ìîäóëÿ: " + X502_GetErrorString(err))
Else
Dim recv_size As Long
'ïðèíèìàåì äëÿ ïðèìåðà ïî êàæäîìó êàíàëó ch_points îòñ÷åòîâ,
'ò.å. îáùåå ÷èñëî ñëîâ ch_cnt * ch_points
'Èñïîëüçóåì CLng äëÿ ïåðåâîäà â Long - èíà÷å vb èñïîëüçóåò
'àðèôìåòèêó ñ Integer è áóäåò ïåðåïîëíåíèå ïðè êîë-âå òî÷åê
'áîëüøå 32*1024
recv_size = CLng(ch_cnt) * ch_points
'çàïóñê ñáîðà äàííûõ
err = X502_StreamsStart(hnd)
If err <> X502_ERR_OK Then
MsgBox ("Îøèáêà çàïóñêà ñáîðà: " + X502_GetErrorString(err))
Else
Dim recv_wrds() As Long
Dim recv_vals() As Double
Dim recvd_cnt As Long
ReDim recv_wrds(0 To recv_size - 1)
ReDim recv_vals(0 To recv_size - 1)
'ïðèåì ñëîâ â ôîðìàòå ìîäóëÿ
recvd_cnt = X502_Recv(hnd, recv_wrds, recv_size, 5000)
'çíà÷åíèå ìåíüøå íóëÿ ñîîòâåòñòâóåò îøèáêå
If recvd_cnt < 0 Then
err = recvd_cnt
MsgBox ("Îøèáêà ïðèåìà äàííûõ îò ìîäóëÿ: " + X502_GetErrorString(err))
Else
'ïðèíÿëè ìåíüøå ÷åì çàïðàøèâàëè
If recvd_cnt < recv_size Then
err = X502_ERR_RECV_INSUFFICIENT_WORDS
MsgBox ("Ïðèíÿòî íåäîñòàòî÷íî äàííûõ")
End If
End If
If err = X502_ERR_OK Then
'îáðàáîòêà äàííûõ - ïåðåâîä â Âîëüòû
err = X502_ProcessAdcData(hnd, recv_wrds, recv_vals, recvd_cnt, X502_PROC_FLAGS_VOLT)
If err <> X502_ERR_OK Then
MsgBox ("Îøèáêà îáðàáîòêè äàííûõ: " + X502_GetErrorString(err))
Else
'äëÿ ïðèìåðà äëÿ êàæäîãî êàíàëà ðàññ÷èòûâàåì ñðåäíåå ïî ïðèíÿòûì òî÷êàì
For ch = 0 To ch_cnt - 1
Dim avg As Double
avg = 0
'îòñ÷åòû â ïîëó÷åííîì ìàññèâå èäóò ïî ïîðÿäêó óçìåðåíèÿ, ò.å. ñïåðâà
'ïåðâûé îòñ÷åò ïåðâîãî êàíàëà, ïåðâûé îñò÷åò âòîðîãî .... âòîðîé îòñ÷åò ïåðâîãî ...
'ò.å. èíäåêñ i-ãî îòñ÷åòà êàíàëà ñð îïðåäåëÿåòñÿ êàê i*ch_cnt + ch
For i = 0 To recvd_cnt / ch_cnt - 1
avg = avg + recv_vals(i * ch_cnt + ch)
Next
avg = avg / (recvd_cnt / ch_cnt)
'äîáàâëÿåì ðåçóëüòàò â ñïèñîê
ResultList.AddItem (FormatNumber(avg, 6) + " Â")
Next
End If
End If
'îñòàíîâ ïîòîêà ñáîðà
X502_StreamsStop (hnd)
End If
End If
X502_Close (hnd)
End If
X502_Free (hnd)
End Sub
Private Sub btnRecvData_Click()
'åñëè âûáðàíî, òî óñòàíàâëèâàåì ñîåäèíåíèå ïî Ethernet ïî IP-àäðåñó
If checkUseIP.Value = vbChecked Then
Dim ip_addr As Long
Dim devrec As t_x502_devrec
Dim err As Long
ip_addr = IP2Long(edtIpAddr.Text)
err = E502_MakeDevRecordByIpAddr(devrec, ip_addr, 0, 5000)
If err = X502_ERR_OK Then
Call adcSampleBlock(devrec)
'îñâîáîæäàåì ðåñóðñû çàïèñè
'äàííàÿ ôóêíöèÿ - îáåðòêà íàä X502_FreeDevRecordList äëÿ îäíîãî ýëåìåíòà
Call X502_FreeDevRecord(devrec)
End If
Else
'èíà÷å èñïîëüçóåì âûáðàííîå óñòîéñòâî èç àâòîîïðåäåëåííûõ
Dim devidx As Long
devidx = cbbDevList.ListIndex
If devlist_valid Then
If devidx >= 0 And devidx <= UBound(devlist) Then
Call adcSampleBlock(devlist(devidx))
Else
MsgBox ("Íå âûáðàíî óñòîéñòâî")
End If
Else
MsgBox ("Íå íàéäåííî íè îäíîãî óñòîéñòâà")
End If
End If
End Sub
Private Sub btnRefreshDeviceList_Click()
Call refreshDeviceList
End Sub
Private Sub Form_Load()
devlist_valid = False
Call refreshDeviceList
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call freeDevlist
End Sub
Binary file not shown.
@@ -0,0 +1,33 @@
Type=Exe
Form=x502_example.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Module=e502api; e502api.bas
Module=x502api; x502api.bas
Module=l502api; l502api.bas
IconForm="MainForm"
Startup="MainForm"
HelpFile=""
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
@@ -0,0 +1,4 @@
MainForm = 50, 50, 768, 666, , 25, 25, 743, 641, C
e502api = 125, 125, 935, 679,
x502api = 200, 200, 918, 816,
l502api = 75, 75, 871, 691,
@@ -0,0 +1,789 @@
Attribute VB_Name = "x502api"
' модуль для объявления констант, структур и функций, общих для модулей L502 и E502 от Л Кард
'Максимальное количество логических каналов в таблице
Public Const X502_LTABLE_MAX_CH_CNT = 256
'Количество диапазонов для измерения напряжений
Public Const X502_ADC_RANGE_CNT = 6
'Количество каналов АЦП в режиме с общей землей
Public Const X502_ADC_COMM_CH_CNT = 32
'Количество каналов АЦП в дифференциальном режиме
Public Const X502_ADC_DIFF_CH_CNT = 16
'Максимальное значение для аппаратного усреднения по логическому каналу
Public Const X502_LCH_AVG_SIZE_MAX = 128
'Максимальное значения делителя частоты АЦП
Public Const X502_ADC_FREQ_DIV_MAX = 1024& * 1024&
'Максимальное значение делителя частоты синхронного цифрового ввода
Public Const X502_DIN_FREQ_DIV_MAX = 1024& * 1024&
'Минимальное значение делителя частоты синхронного вывода
Public Const X502_OUT_FREQ_DIV_MIN = 2
'Максимальное значение делителя частоты синхронного вывода
Public Const X502_OUT_FREQ_DIV_MAX = 1024
'Значение делителя частоты вывода по умолчанию (которое также всегда
'используется в L502 с версией прошивки ПЛИС ниже 0.5)
Public Const X502_OUT_FREQ_DIV_DEFAULT = 2
'Максимальное значение межкадровой задержки для АЦП
Public Const X502_ADC_INTERFRAME_DELAY_MAX = &H1FFFFF
'Таймаут по умолчанию для выполнения команды к BlackFin
Public Const X502_BF_CMD_DEFAULT_TOUT = 500
'Код АЦП, соответствующий максимальному значению шкалы
Public Const X502_ADC_SCALE_CODE_MAX = 6000000
'Код ЦАП, соответствующий максимальному значению шкалы
Public Const X502_DAC_SCALE_CODE_MAX = 30000
'Максимальное количество символов в строке с названием устройства
Public Const X502_DEVNAME_SIZE = 32
'Максимальное количество символов в строке с серийным номером
Public Const X502_SERIAL_SIZE = 32
'Максимальное количество символов в строке с описанием подключения
Public Const X502_LOCATION_STR_SIZE = 64
'Размер MAC-адреса для Ethernet интерфейса
Public Const X502_MAC_ADDR_SIZE = 6
'Размер строки с описанием экземпляра устройства
Public Const X502_INSTANCE_NAME_SIZE = 64
'Максимальный размер строки с паролем на настройки
Public Const X502_PASSWORD_SIZE = 32
'Максимально возможное значение внешней опорной частоты
Public Const X502_EXT_REF_FREQ_MAX = 1500000
'Размер пользовательской области Flash-памяти
Public Const X502_FLASH_USER_SIZE = &H100000
'Cтандартный таймаут на выполнение запроса к BlackFin в мс
Public Const X502_BF_REQ_TOUT = 500
'Диапазон ЦАП в вольтах
Public Const X502_DAC_RANGE = 5#
'Количество каналов ЦАП
Public Const X502_DAC_CH_CNT = 2
'Количество цифровых выходов у модуля
Public Const X502_DOUT_LINES_CNT = 16
'слово в потоке, означающее, что произошло переполнение
Public Const X502_STREAM_IN_MSG_OVERFLOW = &H1010000
'Значение поля сигнатуры в записи о устройстве #t_x502_devrec.
Public Const X502_DEVREC_SIGN = &H4C524543
'Коды ошибок библиотеки
Public Enum t_lpcie_errs
'Функция выполнена без ошибок
X502_ERR_OK = 0
'В функцию передан недействительный описатель модуля
X502_ERR_INVALID_HANDLE = -1
'Ошибка выделения памяти
X502_ERR_MEMORY_ALLOC = -2
'Попытка открыть уже открытое устройство
X502_ERR_ALREADY_OPENED = -3
'Устройство с заданными параметрами не найдено в системе
X502_ERR_DEVICE_NOT_FOUND = -4
'Доступ к устройству запрещен (Как правило из-за того, что устройство уже открыто в другой программе)
X502_ERR_DEVICE_ACCESS_DENIED = -5
'Ошибка открытия устройства
X502_ERR_DEVICE_OPEN = -6
'В функцию передан недействительный указатель
X502_ERR_INVALID_POINTER = -7
'Функция не может быть выполнена при запущенном потоке сбора данных
X502_ERR_STREAM_IS_RUNNING = -8
'Ошибка чтения данных синхронного ввода
X502_ERR_RECV = -9
'Ошибка записи данных для синхронного вывода
X502_ERR_SEND = -10
'Произошло переполнение внутреннего буфера для потока синхронного ввода
X502_ERR_STREAM_OVERFLOW = -11
'Неизвестное сообщение в потоке синхронного ввода
X502_ERR_UNSUP_STREAM_MSG = -12
'Ошибка создания системного мьютекса
X502_ERR_MUTEX_CREATE = -13
'Неверный описатель мьютекса
X502_ERR_MUTEX_INVALID_HANDLE = -14
'Истекло время ожидания освобождения мьютекса
X502_ERR_MUTEX_LOCK_TOUT = -15
'Ошибка освобождения мьютекса
X502_ERR_MUTEX_RELEASE = -16
'Недостаточно системных ресурсов
X502_ERR_INSUFFICIENT_SYSTEM_RESOURCES = -17
'Данная возможность еще не реализована
X502_ERR_NOT_IMPLEMENTED = -18
'Недостаточный размер массива
X502_ERR_INSUFFICIENT_ARRAY_SIZE = -19
'Ошибка чтения регистра FPGA
X502_ERR_FPGA_REG_READ = -20
'Ошибка записи регистра FPGA
X502_ERR_FPGA_REG_WRITE = -21
'Сбор данных уже остановлен
X502_ERR_STREAM_IS_NOT_RUNNING = -22
'Ошибка освобождения интерфейса
X502_ERR_INTERFACE_RELEASE = -23
'Ошибка запуска потока
X502_ERR_THREAD_START = -24
'Ошибка останова потока
X502_ERR_THREAD_STOP = -25
'Устройство было отключено
X502_ERR_DEVICE_DISCONNECTED = -26
'Неверный размер ответа на управляющий запрос
X502_ERR_IOCTL_INVALID_RESP_SIZE = -27
'Неверный тип устройства
X502_ERR_INVALID_DEVICE = -28
'Недействительная запись о устройстве
X502_ERR_INVALID_DEVICE_RECORD = -29
'Неверный описатель конфигурации модуля
X502_ERR_INVALID_CONFIG_HANDLE = -30
'Связь с устройством закрыта или не была установлена
X502_ERR_DEVICE_NOT_OPENED = -31
'Данная операция не доступна для текущего интерфейса связи с устройством
X502_ERR_INVALID_OP_FOR_IFACE = -32
'Не загружен ПЛИС модуля
X502_ERR_FPGA_NOT_LOADED = -33
'Неверная конфигурация USB-устройства
X502_ERR_INVALID_USB_CONFIGURATION = -34
'Неверный описатель контекста поиска устройств в сети
X502_ERR_INVALID_SVC_BROWSE_HANDLE = -35
'Неверный описатель записи о сервисе
X502_ERR_INVALID_SVC_RECORD_HANDLE = -36
'Не запущена программа обнаружения устройств в локальной сети
X502_ERR_DNSSD_NOT_RUNNING = -37
'Ошибка при обращении к программе обнаружения устройств в локальной сети
X502_ERR_DNSSD_COMMUNICATION = -38
'Превышен таймаут запроса параметров автообнаруженного сетевого устройства
X502_ERR_SVC_RESOLVE_TIMEOUT = -39
'Ошибка в кодировке имени экземпляра устройства
X502_ERR_INSTANCE_NAME_ENCODING = -40
'Экземпляры модулей не совпадают
X502_ERR_INSTANCE_MISMATCH = -41
'Возможность не поддерживается текущей версией прошивки устройства
X502_ERR_NOT_SUP_BY_FIRMWARE = -42
'Возможность не поддерживается текущей версией драйвера устройства
X502_ERR_NOT_SUP_BY_DRIVER = -43
'Превышено время ожидания установления циклического сигнала на вывод
X502_ERR_OUT_CYCLE_SETUP_TOUT = -44
'Неизвестный код поддерживаемой возможности
X502_ERR_UNKNOWN_FEATURE_CODE = -45
'Задан неверный размер логической таблицы
X502_ERR_INVALID_LTABLE_SIZE = -102
'Задан неверный номер логического канала
X502_ERR_INVALID_LCH_NUMBER = -103
'Неверно задано значение диапазона АЦП
X502_ERR_INVALID_LCH_RANGE = -104
'Неверно задан режим измерения для логического канала
X502_ERR_INVALID_LCH_MODE = -105
'Неверно задан номер физического канала при настройке логического
X502_ERR_INVALID_LCH_PHY_NUMBER = -106
'Неверно задан размер усреднения для логического канала
X502_ERR_INVALID_LCH_AVG_SIZE = -107
'Неверно задан делитель частоты сбора данных АЦП
X502_ERR_INVALID_ADC_FREQ_DIV = -108
'Неверно задан делитель частоты синхронного ввода цифровых линий
X502_ERR_INVALID_DIN_FREQ_DIV = -109
'Неверно задан режим работы модуля X502
X502_ERR_INVALID_MODE = -110
'Неверный номер канала ЦАП
X502_ERR_INVALID_DAC_CHANNEL = -111
'Неверный код выбора опорной частоты синхронизации
X502_ERR_INVALID_REF_FREQ = -112
'Неверно задано значение межкадровой задержки
X502_ERR_INVALID_INTERFRAME_DELAY = -113
'Неверно задан режим синхронизации
X502_ERR_INVALID_SYNC_MODE = -114
'Неверно задан номер потока данных
X502_ERR_INVALID_STREAM_CH = -115
'Неверно задан делитель частоты синхронного вывода
X502_ERR_INVALID_OUT_FREQ_DIV = -116
'Ошибка захвата опорной частоты синхронизации
X502_ERR_REF_FREQ_NOT_LOCKED = -131
'Управляющий запрос к драйверу завершен с ошибкой
X502_ERR_IOCTL_FAILD = -132
'Истек таймаут ожидания завершения выполнения управляющего запроса к драйверу
X502_ERR_IOCTL_TIMEOUT = -133
'Ошибка получения информации о устройстве от драйвера
X502_ERR_GET_INFO = -134
'За время ожидания не было считано новое слово с цифровых линий
X502_ERR_DIG_IN_NOT_RDY = -135
'Принято недостаточно слов от модуля
X502_ERR_RECV_INSUFFICIENT_WORDS = -136
'Попытка выполнить операцию, требующую наличие ЦАП, при его отсутствии
X502_ERR_DAC_NOT_PRESENT = -137
'Передано недостаточно слов в модуль
X502_ERR_SEND_INSUFFICIENT_WORDS = -138
'Не пришло ответа на переданную команду
X502_ERR_NO_CMD_RESPONSE = -139
'Неверный номер канала в обрабатываемом потоке синхронного ввода
X502_ERR_PROC_INVALID_CH_NUM = -140
'Неверный код диапазона в обрабатываемом потоке синхронного ввода
X502_ERR_PROC_INVALID_CH_RANGE = -141
'Задан неверный адрес во Flash-памяти
X502_ERR_FLASH_INVALID_ADDR = -142
'Задан неверный размер блока данных при работе с Flash-памятью
X502_ERR_FLASH_INVALID_SIZE = -143
'Истек таймаут ожидания завершения записи во Flash-память
X502_ERR_FLASH_WRITE_TOUT = -144
'Истек таймаут ожидания завершения стирания блока Flash-памяти
X502_ERR_FLASH_ERASE_TOUT = -145
'Заданная область для стирания Flash-памяти нарушает границу блока в 4 Кбайт
X502_ERR_FLASH_SECTOR_BOUNDARY = -146
'Не удалось открыть сокет для соединения
X502_ERR_SOCKET_OPEN = -147
'Превышено время подключения
X502_ERR_CONNECTION_TOUT = -148
'Соединение закрыто другой устройством
X502_ERR_CONNECTION_CLOSED_BY_DEV = -149
'Не удалось установить заданный размер буфера сокета
X502_ERR_SOCKET_SET_BUF_SIZE = -150
'Соединение для передачи данных не установлено
X502_ERR_NO_DATA_CONNECTION = -151
'Не удалось дождаться сообщения о завершении потока
X502_ERR_NO_STREAM_END_MSG = -152
'Соединение было сброшено другой стороной
X502_ERR_CONNECTION_RESET = -153
'Не удалось найти хост с указанным адресом
X502_ERR_HOST_UNREACHABLE = -154
'Ошибка установления TCP-соединения
X502_ERR_TCP_CONNECTION_ERROR = -155
'Не удалось открыть файл прошивки BlackFin
X502_ERR_LDR_FILE_OPEN = -180
'Ошибка чтения из фала прошивки BlackFin
X502_ERR_LDR_FILE_READ = -181
'Неверный формат файла прошивки BlackFin
X502_ERR_LDR_FILE_FORMAT = -182
'Используются возможность LDR-файла, недоступные при записи прошивки BlackFin по HDMA
X502_ERR_LDR_FILE_UNSUP_FEATURE = -183
'Неверный стартовый адрес программы в прошивке BlackFin
X502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR = -184
'Истек таймаут выполнения запроса на чтения/запись памяти BlackFin
X502_ERR_BF_REQ_TIMEOUT = -185
'Команда для BlackFin все еще находится в процессе обработки
X502_ERR_BF_CMD_IN_PROGRESS = -186
'Истекло время выполнения управляющей команды процессором BlackFin
X502_ERR_BF_CMD_TIMEOUT = -187
'Возвращено недостаточно данных в ответ на команду к BlackFin
X502_ERR_BF_CMD_RETURN_INSUF_DATA = -188
'Истек таймаут ожидания готовности процессора BlackFin к записи прошивки
X502_ERR_BF_LOAD_RDY_TOUT = -189
'Попытка выполнить операцию для которой нужен сигнальный процессор при отсутствии сигнального процессора в модуле
X502_ERR_BF_NOT_PRESENT = -190
'Неверный адрес памяти BlackFin при записи или чтении по HDMA
X502_ERR_BF_INVALID_ADDR = -191
'Неверный размер данных, передаваемых с управляющей командой в BlackFin
X502_ERR_BF_INVALID_CMD_DATA_SIZE = -192
End Enum
'Интерфейс соединения с модулем
Public Enum t_x502_iface
X502_IFACE_UNKNOWN = 0 'Неизвестный интерфейс
X502_IFACE_USB = 1 'Устройство подключено по USB
X502_IFACE_ETH = 2 'Устройство подключено по Ethernet через TCP/IP
X502_IFACE_PCI = 3 'Устройство подключено по PCI/PCIe
End Enum
'Флаги, управляющие поиском присутствующих модулей
Public Enum t_x502_getdevs_flags
' Признак, что нужно вернуть серийные номера только тех устройств, которые еще не открыты
X502_GETDEVS_FLAGS_ONLY_NOT_OPENED = &H1&
End Enum
'Флаги для управления цифровыми выходами.
Public Enum t_x502_digout_word_flags
X502_DIGOUT_WORD_DIS_H = &H20000 'Запрещение (перевод в третье состояние) старшей половины цифровых выходов
X502_DIGOUT_WORD_DIS_L = &H10000 'Запрещение младшей половины цифровых выходов
End Enum
'Константы для выбора опорной частоты
Public Enum t_x502_ref_freq
X502_REF_FREQ_2000KHZ = 2000000 'Частота 2МГц
X502_REF_FREQ_1500KHZ = 1500000 'Частота 1.5МГц
End Enum
'Диапазоны измерения для канала АЦП
Public Enum t_x502_adc_range
X502_ADC_RANGE_10 = 0 'Диапазон +/-10V
X502_ADC_RANGE_5 = 1 'Диапазон +/-5V
X502_ADC_RANGE_2 = 2 'Диапазон +/-2V
X502_ADC_RANGE_1 = 3 'Диапазон +/-1V
X502_ADC_RANGE_05 = 4 'Диапазон +/-0.5V
X502_ADC_RANGE_02 = 5 'Диапазон +/-0.2V
End Enum
'Режим измерения для логического канала
Public Enum t_x502_lch_mode
X502_LCH_MODE_COMM = 0 'Измерение напряжения относительно общей земли
X502_LCH_MODE_DIFF = 1 'Дифференциальное измерение напряжения
X502_LCH_MODE_ZERO = 2 'Измерение собственного нуля
End Enum
'Режимы синхронизации.
Public Enum t_x502_sync_mode
X502_SYNC_INTERNAL = 0 'Внутренний сигнал
X502_SYNC_EXTERNAL_MASTER = 1 'От внешнего мастера по разъему межмодульной синхронизации
X502_SYNC_DI_SYN1_RISE = 2 'По фронту сигнала DI_SYN1
X502_SYNC_DI_SYN1_FALL = 3 'По фронту сигнала DI_SYN2
X502_SYNC_DI_SYN2_RISE = 6 'По спаду сигнала DI_SYN1
X502_SYNC_DI_SYN2_FALL = 7 'По спаду сигнала DI_SYN2
End Enum
'Флаги, управляющие обработкой принятых данных
Public Enum t_x502_proc_flags
'Признак, что нужно преобразовать значения АЦП в вольты
X502_PROC_FLAGS_VOLT = &H1&
' Признак, что не нужно проверять совпадение номеров каналов
' в принятых данных с каналами из логической таблицы.
' Может использоваться при нестандартной прошивке BlackFin
' при передаче в ПК не всех данных.
X502_PROC_FLAGS_DONT_CHECK_CH = &H10000
End Enum
'Флаги для обозначения синхронных потоков данных
Public Enum t_x502_streams
X502_STREAM_ADC = &H1& 'Поток данных от АЦП
X502_STREAM_DIN = &H2& 'Поток данных с цифровых входов
X502_STREAM_DAC1 = &H10& 'Поток данных первого канала ЦАП
X502_STREAM_DAC2 = &H20& 'Поток данных второго канала ЦАП
X502_STREAM_DOUT = &H40& 'Поток данных на цифровые выводы
'Объединение всех флагов, обозначающих потоки данных на ввод
X502_STREAM_ALL_IN = X502_STREAM_ADC Or X502_STREAM_DIN
'Объединение всех флагов, обозначающих потоки данных на вывод
X502_STREAM_ALL_OUT = X502_STREAM_DAC1 Or X502_STREAM_DAC2 Or X502_STREAM_DOUT
End Enum
'Константы, определяющие тип передаваемого отсчета из ПК в модуль
Public Enum t_x502_stream_out_wrd_type
X502_STREAM_OUT_WORD_TYPE_DOUT = &H0& 'Цифровой вывод
X502_STREAM_OUT_WORD_TYPE_DAC1 = &H40000000 'Код для 1-го канала ЦАП
X502_STREAM_OUT_WORD_TYPE_DAC2 = &H80000000 'Код для 2-го канала ЦАП
End Enum
'Режим работы модуля
Public Enum t_x502_mode
X502_MODE_FPGA = 0 'Все потоки данных передаются через ПЛИС минуя
'сигнальный процессор BlackFin
X502_MODE_DSP = 1 'Все потоки данных передаются через сигнальный
'процессор, который должен быть загружен
'прошивкой для обработки этих потоков
X502_MODE_DEBUG = 2 'Отладочный режим
End Enum
'Номера каналов ЦАП.
Public Enum t_x502_dac_ch
X502_DAC_CH1 = 0 'Первый канал ЦАП
X502_DAC_CH2 = 1 'Второй канал ЦАП
End Enum
'Флаги, используемые при выводе данных на ЦАП.
Public Enum t_x502_dacout_flags
'Указывает, что значение задано в Вольтах и при выводе его нужно
' перевести его в коды ЦАП. Если флаг не указан, то считается, что значение
' изначально в кодах
X502_DAC_FLAGS_VOLT = &H1&
'Указывает, что нужно применить калибровочные коэффициенты перед
' выводом значения на ЦАП.
X502_DAC_FLAGS_CALIBR = &H2&
End Enum
'Номера каналов для передачи потоков данных
Public Enum t_x502_stream_ch
X502_STREAM_CH_IN = 0 'Общий канал на ввод
X502_STREAM_CH_OUT = 1 'Общий канал на вывод
End Enum
'Цифровые линии, на которых можно включить подтягивающие резисторы
Public Enum t_x502_pullups
X502_PULLUPS_DI_H = &H1 'Старшая половина цифровых входов (только для L502)
X502_PULLUPS_DI_L = &H2 'Младшая половина цифровых входов (только для L502)
X502_PULLUPS_DI_SYN1 = &H4 'Линия SYN1
X502_PULLUPS_DI_SYN2 = &H8 'Линия SYN2
X502_PULLDOWN_CONV_IN = &H10 'Подтяжка к 0 линии межмодульной
' синхронизации CONV_IN (только для E502)
X502_PULLDOWN_START_IN = &H20 'Подтяжка к 0 линии межмодульной
' синхронизации START_IN (только для E502)
End Enum
'Флаги, определяющие наличие опций в модуле
Public Enum t_x502_dev_flags
'Признак наличия двухканального канального ЦАП
X502_DEVFLAGS_DAC_PRESENT = &H1&
'Признак наличия гальваноразвязки
X502_DEVFLAGS_GAL_PRESENT = &H2&
'Признак наличия сигнального процессора BlackFin
X502_DEVFLAGS_BF_PRESENT = &H4&
'Признак, что устройство поддерживает интерфейс USB
X502_DEVFLAGS_IFACE_SUPPORT_USB = &H100&
'Признак, что устройство поддерживает Ethernet
X502_DEVFLAGS_IFACE_SUPPORT_ETH = &H200&
'Признак, что устройство поддерживает интерфейс PCI/PCI-Express
X502_DEVFLAGS_IFACE_SUPPORT_PCI = &H400&
'Признак, что устройство выполнено в индустриалном исполнении
X502_DEVFLAGS_INDUSTRIAL = &H8000&
'Признак, что во Flash-памяти присутствует информация о модуле
X502_DEVFLAGS_FLASH_DATA_VALID = &H10000
'Признак, что во Flash-памяти присутствуют действительные калибровочные коэффициенты АЦП
X502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = &H20000
'Признак, что во Flash-памяти присутствуют действительные калибровочные коэффициенты ЦАП
X502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = &H40000
'Признак, что присутствует прошивка ПЛИС и она успешно была загружена
X502_DEVFLAGS_FPGA_LOADED = &H800000
'Признак, что устройство уже открыто (действителен только внутри t_x502_devrec)
X502_DEVFLAGS_DEVREC_OPENED = &H1000000
End Enum
Public Enum t_x502_location_type
'В поле расположения устройства не содержится информации
X502_LOCATION_TYPE_NONE = 0
'В поле расположения устройства содержится строка с адресом устройства
X502_LOCATION_TYPE_ADDR = 1
'В поле расположения устройства содержится строка с именем экземпляра
X502_LOCATION_TYPE_INSTANCE_NAME = 2
End Enum
'Флаги для режима циклического вывода
Public Enum t_x502_out_cycle_flags
'останов или смена сигнала могут произойти без ожидания конца цикла предыдущего сигнала
X502_OUT_CYCLE_FLAGS_FORCE = &H1&
'функция должна дождаться полной загрузки сигнала
' и установки сигнала на вывод (для X502_OutCycleSetup()) или завершения
' генерации циклического сигнала (для X502_OutCycleStop())
X502_OUT_CYCLE_FLAGS_WAIT_DONE = &H2&
End Enum
'Коды возможностей модуля, которые могут поддерживаться или нет в зависимости от типа модуля, версий прошивок и т.п
Public Enum t_x502_features
'Поддержка установки делителя частоты вывода, отличного от X502_OUT_FREQ_DIV_DEFAULT
X502_FEATURE_OUT_FREQ_DIV = 1
'Возможность чтения флагов состояния вывода с помощью X502_OutGetStatusFlags()
X502_FEATURE_OUT_STATUS_FLAGS = 2
End Enum
'Флаги состояния для синхронного вывода
Public Enum t_x502_out_status_flags
'Флаг указывает, что в настоящее время буфер в модуле на передачу пуст
X502_OUT_STATUS_FLAG_BUF_IS_EMPTY = &H1&
'Флаг указывает, что было опустошение буфера на вывод с начала старта синхронного
' ввода-вывода или с момента последнего чтения статуса с помощью
' X502_OutGetStatusFlags() (в зависимости от того, что было последним)
X502_OUT_STATUS_FLAG_BUF_WAS_EMPTY = &H2&
End Enum
'--------------- Типы данных ---------------
'Запись о устройстве
Public Type t_x502_devrec
sign As Long 'Признак действительной структуры
DevName(0 To X502_DEVNAME_SIZE - 1) As Byte 'Название устройства
serial(0 To X502_SERIAL_SIZE - 1) As Byte 'Серийный номер
location(0 To X502_LOCATION_STR_SIZE - 1) As Byte 'Описание подключения (если есть)
flags As Long 'Флаги из #t_x502_dev_flags, описывающие устройство
iface As Byte 'Интерфейс, по которому подключено устройство
location_type As Byte 'Определяет, что именно сохранено в поле location (одно значение из #t_x502_location_type)
res(0 To 122 - 1) As Byte 'Резерв
internal As Long 'Непрозрачный указатель на структуру с дополнительной информацией
End Type
' Калибровочные коэффициенты диапазона
Public Type t_x502_cbr_coef
offs As Double 'смещение нуля
k As Double 'коэффициент шкалы
End Type
'Калибровочные коэффициенты модуля
Public Type t_x502_cbr
adc(0 To X502_ADC_RANGE_CNT - 1) As t_x502_cbr_coef 'Калибровочные коэффициенты АЦП
res1(0 To 64 - 1) As Long 'Резерв
dac(0 To X502_DAC_CH_CNT - 1) As t_x502_cbr_coef 'Калибровочные коэффициенты ЦАП
res2(0 To 20 - 1) As Long
End Type
' Информация о модуле L502/E502
Public Type t_x502_info
DevName(0 To X502_DEVNAME_SIZE - 1) As Byte 'Название устройства ("L502" или "E502")
serial(0 To X502_SERIAL_SIZE - 1) As Byte 'Серийный номер
devflags As Long 'Флаги из #t_x502_dev_flags, описывающие наличие в модуле определенных опций
fpga_ver As Integer 'Версия ПЛИС (старший байт - мажорная, младший - минорная)
plda_ver As Byte 'Версия ПЛИС, управляющего аналоговой частью
board_rev As Byte 'Ревизия платы
mcu_firmware_ver As Long 'Версия прошивки контроллера Cortex-M4. Действительна только для E502
factory_mac(0 To X502_MAC_ADDR_SIZE - 1) As Byte 'Заводской MAC-адрес --- действителен только для
'устройств с Ethernet-интерфейсом */
res(0 To 110 - 1) As Byte 'Резерв
cbr As t_x502_cbr 'Заводские калибровочные коэффициенты (из Flash-памяти)
End Type
Public Declare Function X502_Create Lib "x502api" () As Long
Public Declare Function X502_Free Lib "x502api" (ByVal hnd As Long) As Long
Public Declare Function X502_OpenByDevRecord Lib "x502api" (ByVal hnd As Long, ByRef devrec As t_x502_devrec) As Long
Private Declare Function tmp_X502_FreeDevRecordList Lib "x502api" Alias "X502_FreeDevRecordList" (ByRef list As t_x502_devrec, ByVal size As Long) As Long
Public Declare Function X502_Close Lib "x502api" (ByVal hnd As Long) As Long
Public Declare Function X502_GetDevInfo Lib "x502api" (ByVal hnd As Long, ByRef info As t_x502_info) As Long
Public Declare Function X502_Configure Lib "x502api" (ByVal hnd As Long, ByVal flags As Long) As Long
Public Declare Function X502_SetLChannel Lib "x502api" (ByVal hnd As Long, ByVal lch As Long, ByVal phy_ch As Long, ByVal mode As Long, ByVal range As Long, ByVal avg As Long) As Long
'Установка количества логических каналов.
Public Declare Function X502_SetLChannelCount Lib "x502api" (ByVal hnd As Long, ByVal lch_cnt As Long) As Long
'Получение количества логических каналов.
Public Declare Function X502_GetLChannelCount Lib "x502api" (ByVal hnd As Long, ByRef lch_cnt As Long) As Long
'Установка делителя частоты сбора для АЦП
Public Declare Function X502_SetAdcFreqDivider Lib "x502api" (ByVal hnd As Long, ByVal adc_freq_div As Long) As Long
'Установка значения межкадровой задержки для АЦП.
Public Declare Function X502_SetAdcInterframeDelay Lib "x502api" (ByVal hnd As Long, ByVal delay As Long) As Long
'Установка делителя частоты синхронного ввода с цифровых линий.
Public Declare Function X502_SetDinFreqDivider Lib "x502api" (ByVal hnd As Long, ByVal din_freq_div As Long) As Long
'Установка делителя частоты синхронного вывода
Public Declare Function X502_SetOutFreqDivider Lib "x502api" (ByVal hnd As Long, ByVal out_freq_div As Long) As Long
'Установка частоты сбора АЦП.
Public Declare Function X502_SetAdcFreq Lib "x502api" (ByVal hnd As Long, ByRef f_acq As Double, ByRef f_frame As Double) As Long
'Установка частоты синхронного ввода с цифровых входов.
Public Declare Function X502_SetDinFreq Lib "x502api" (ByVal hnd As Long, ByRef f_din As Double) As Long
'Установка частоты синхронного вывода.
Public Declare Function X502_SetOutFreq Lib "x502api" (ByVal hnd As Long, ByRef f_dout As Double) As Long
'Получить текущие значения частот сбора АЦП
Public Declare Function X502_GetAdcFreq Lib "x502api" (ByVal hnd As Long, ByRef f_acq As Double, ByRef f_frame As Double) As Long
'Установка значения опорной частоты синхронизации.
Public Declare Function X502_SetRefFreq Lib "x502api" (ByVal hnd As Long, ByVal freq As Long) As Long
'Установка значения внешней опорной частоты синхронизации
Public Declare Function X502_SetExtRefFreqValue Lib "x502api" (ByVal hnd As Long, ByVal freq As Double) As Long
'Получение значения опорной частоты синхронизации
Public Declare Function X502_GetRefFreqValue Lib "x502api" (ByVal hnd As Long, ByRef freq As Double) As Long
'Установка режима генерации частоты синхронизации.
Public Declare Function X502_SetSyncMode Lib "x502api" (ByVal hnd As Long, ByVal sync_mode As Long) As Long
'Установка режима запуска частоты синхронизации
Public Declare Function X502_SetSyncStartMode Lib "x502api" (ByVal hnd As Long, ByVal sync_start_mode As Long) As Long
'Установить режим работы модуля.
Public Declare Function X502_SetMode Lib "x502api" (ByVal hnd As Long, ByVal mode As Long) As Long
'Получение текущего режима работы модуля.
Public Declare Function X502_GetMode Lib "x502api" (ByVal hnd As Long, ByRef mode As Long) As Long
'Установить коэффициенты для калибровки значений АЦП
Public Declare Function X502_SetAdcCoef Lib "x502api" (ByVal hnd As Long, ByVal range As Long, ByVal k As Double, ByVal offs As Double) As Long
'Получение текущих калибровочных коэффициентов АЦП.
Public Declare Function X502_GetAdcCoef Lib "x502api" (ByVal hnd As Long, ByVal range As Long, ByRef k As Double, ByRef offs As Double) As Long
'Установить коэффициенты для калибровки значений ЦАП.
Public Declare Function X502_SetDacCoef Lib "x502api" (ByVal hnd As Long, ByVal ch As Long, ByVal k As Double, ByVal offs As Double) As Long
'Получение текущих калибровочных коэффициентов ЦАП
Public Declare Function X502_GetDacCoef Lib "x502api" (ByVal hnd As Long, ByVal ch As Long, ByRef k As Double, ByRef offs As Double) As Long
'Асинхронный вывод данных на канал ЦАП.
Public Declare Function X502_AsyncOutDac Lib "x502api" (ByVal hnd As Long, ByVal ch As Long, ByVal data As Double, ByVal flags As Long) As Long
'Асинхронный вывод данных на цифровые выходы.
Public Declare Function X502_AsyncOutDig Lib "x502api" (ByVal hnd As Long, ByVal Val As Long, ByVal msk As Long) As Long
'Асинхронный ввод значений с цифровых входов.
Public Declare Function X502_AsyncInDig Lib "x502api" (ByVal hnd As Long, ByRef din As Long) As Long
Private Declare Function tmp_X502_AsyncGetAdcFrame Lib "x502api" Alias "X502_AsyncGetAdcFrame" (ByVal hnd As Long, ByVal flags As Long, ByVal tout As Long, ByRef data As Double) As Long
'Разрешение синхронных потоков на ввод/вывод.
Public Declare Function X502_StreamsEnable Lib "x502api" (ByVal hnd As Long, ByVal streams As Long) As Long
'Запрещение синхронных потоков на ввод/вывод.
Public Declare Function X502_StreamsDisable Lib "x502api" (ByVal hnd As Long, ByVal streams As Long) As Long
'Получить значение, какие синхронные потоки разрешены
Public Declare Function X502_GetEnabledStreams Lib "x502api" (ByVal hnd As Long, ByRef streams As Long) As Long
'Запуск синхронных потоков ввода/вывода.
Public Declare Function X502_StreamsStart Lib "x502api" (ByVal hnd As Long) As Long
'Останов синхронных потоков ввода/вывода.
Public Declare Function X502_StreamsStop Lib "x502api" (ByVal hnd As Long) As Long
'Проверка, запущен ли синхронный ввод/вывод
Public Declare Function X502_IsRunning Lib "x502api" (ByVal hnd As Long) As Long
'Чтение данных АЦП и цивровых входов из модуля.
Private Declare Function tmp_X502_Recv Lib "x502api" Alias "X502_Recv" (ByVal hnd As Long, ByRef buf As Long, ByVal size As Long, ByVal tout As Long) As Long
'Передача потоковых данных ЦАП и цифровых выходов в модуль.
Private Declare Function tmp_X502_Send Lib "x502api" Alias "X502_Send" (ByVal hnd As Long, ByRef buf As Long, ByVal size As Long, ByVal tout As Long) As Long
'Обработка принятых отсчетов АЦП от модуля.
Private Declare Function tmp_X502_ProcessAdcData Lib "x502api" Alias "X502_ProcessAdcData" (ByVal hnd As Long, ByRef src As Long, ByRef dest As Double, ByRef size As Long, ByVal flags As Long) As Long
'Обработка принятых от модуля данных.
Private Declare Function tmp_X502_ProcessData Lib "x502api" Alias "X502_ProcessData" (ByVal hnd As Long, ByRef src As Long, ByVal flags As Long, ByRef adc_data As Double, ByRef adc_data_size As Long, ByRef din_data As Long, ByRef din_data_size As Long) As Long
'Обработка принятых от модуля данных с пользовательскими данными.
Private Declare Function tmp_X502_ProcessDataWithUserExt Lib "x502api" Alias "X502_ProcessDataWithUserExt" (ByVal hnd As Long, ByRef src As Long, ByVal size As Long, ByVal flags As Long, ByRef adc_data As Double, ByRef adc_data_size As Long, ByRef din_data As Long, ByRef din_data_size As Long, ByRef usr_data As Long, ByRef usr_data_size As Long) As Long
'Подготовка данных для вывода в модуль.
Private Declare Function tmp_X502_PrepareData Lib "x502api" Alias "X502_PrepareData" (ByVal hnd As Long, ByRef dac1 As Double, ByRef dac2 As Double, ByRef digout As Long, ByVal size As Long, ByVal flags As Long, ByRef out_buf As Long) As Long
'Получить количество отсчетов в буфере потока на ввод.
Public Declare Function X502_GetRecvReadyCount Lib "x502api" (ByVal hnd As Long, ByRef rdy_cnt As Long) As Long
'Получить размер свободного места в буфере потока на вывод.
Public Declare Function X502_GetSendReadyCount Lib "x502api" (ByVal hnd As Long, ByRef rdy_cnt As Long) As Long
'Получить номер следующего ожидаемого логического канала АЦП для обработки.
Public Declare Function X502_GetNextExpectedLchNum Lib "x502api" (ByVal hnd As Long, ByRef lch As Long) As Long
'Начало подготовки вывода синхронных данных
Public Declare Function X502_PreloadStart Lib "x502api" (ByVal hnd As Long) As Long
'Начало загрузки циклического сигнала на вывод
Public Declare Function X502_OutCycleLoadStart Lib "x502api" (ByVal hnd As Long, ByVal size As Long) As Long
'Установка ранее загруженного циклического сигнала на вывод
Public Declare Function X502_OutCycleSetup Lib "x502api" (ByVal hnd As Long, ByVal flags As Long) As Long
'Останов вывода циклического сигнала
Public Declare Function X502_OutCycleStop Lib "x502api" (ByVal hnd As Long, ByVal flags As Long) As Long
'Проверка, завершена ли установка или останов циклического сигнала
Public Declare Function X502_OutCycleCheckSetupDone Lib "x502api" (ByVal hnd As Long, ByRef done As Long) As Long
'Чтение флагов статуса вывода
Public Declare Function X502_OutGetStatusFlags Lib "x502api" (ByVal hnd As Long, ByRef status As Long) As Long
'Установка размера буфера в драйвере для синхронного ввода или вывода.
Public Declare Function X502_SetStreamBufSize Lib "x502api" (ByVal hnd As Long, ByVal dma_ch As Long, ByVal size As Long) As Long
'Установка шага прерывания при передаче потока по DMA.
Public Declare Function X502_SetStreamStep Lib "x502api" (ByVal hnd As Long, ByVal dma_ch As Long, ByVal step As Long) As Long
'Загрузка прошивки сигнального процессора BlackFin.
Public Declare Function X502_BfLoadFirmware Lib "x502api" (ByVal hnd As Long, ByVal filename As String) As Long
'Проверка, загружена ли прошивка BlackFIn.
Public Declare Function X502_BfCheckFirmwareIsLoaded Lib "x502api" (ByVal hnd As Long, ByRef version As Long) As Long
'Чтение блока данных из памяти сигнального процессора.
Private Declare Function tmp_X502_BfMemRead Lib "x502api" Alias "X502_BfMemRead" (ByVal hnd As Long, ByVal addr As Long, ByRef regs As Long, ByVal size As Long) As Long
'Запись блока данных в память сигнального процессора.
Private Declare Function tmp_X502_BfMemWrite Lib "x502api" Alias "X502_BfMemWrite" (ByVal hnd As Long, ByVal addr As Long, ByRef regs As Long, ByVal size As Long) As Long
'Передача управляющей команды сигнальному процессору.
Private Declare Function tmp_X502_BfExecCmd Lib "x502api" Alias "X502_BfExecCmd" (ByVal hnd As Long, ByVal cmd_code As Integer, ByVal par As Long, ByRef snd_data As Long, ByVal snd_size As Long, ByRef rcv_data As Long, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long
'Чтение блока данных из Flash-памяти.
Private Declare Function tmp_X502_FlashRead Lib "x502api" Alias "X502_FlashRead" (ByVal hnd As Long, ByVal addr As Long, ByRef data As Byte, ByVal size As Long) As Long
'Запись блока данных во Flash-память модуля.
Private Declare Function tmp_X502_FlashWrite Lib "x502api" Alias "X502_FlashWrite" (ByVal hnd As Long, ByVal addr As Long, ByRef data As Byte, ByVal size As Long) As Long
'Стирание блока во Flash-памяти.
Public Declare Function X502_FlashErase Lib "x502api" (ByVal hnd As Long, ByVal addr As Long, ByVal size As Long) As Long
'Разрешение записи в пользовательскую область Flash-памяти.
Public Declare Function X502_FlashWriteEnable Lib "x502api" (ByVal hnd As Long) As Long
'Запрет записи в пользовательскую область Flash-памяти.
Public Declare Function X502_FlashWriteDisable Lib "x502api" (ByVal hnd As Long) As Long
'Получить версию библиотеки.
Public Declare Function X502_GetLibraryVersion Lib "x502api" () As Long
'Моргание светодиодом на передней панели.
Public Declare Function X502_LedBlink Lib "x502api" (ByVal hnd As Long) As Long
'Установка подтягивающих резисторов на входных линиях.
Public Declare Function X502_SetDigInPullup Lib "x502api" (ByVal hnd As Long, ByVal pullups As Long) As Long
'Проверка поддержки модулем заданной возможности
Public Declare Function X502_CheckFeature Lib "x502api" (ByVal hnd As Long, ByVal feature As Long) As Long
Private Declare Function tmp_X502_GetErrorString Lib "x502api" Alias "X502_GetErrorString" (ByVal Error_Code As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Public Function X502_FreeDevRecordList(ByRef list() As t_x502_devrec, ByVal size As Long) As Long
X502_FreeDevRecordList = tmp_X502_FreeDevRecordList(list(0), size)
End Function
Public Function X502_FreeDevRecord(ByRef rec As t_x502_devrec) As Long
Dim list(0 To 0) As t_x502_devrec
list(0) = rec
X502_FreeDevRecord = X502_FreeDevRecordList(list, 1)
End Function
Public Function X502_AsyncGetAdcFrame(ByVal hnd As Long, ByVal flags As Long, ByVal tout As Long, ByRef data() As Double) As Long
X502_AsyncGetAdcFrame = tmp_X502_AsyncGetAdcFrame(hnd, flags, tout, data(0))
End Function
Public Function X502_Recv(ByVal hnd As Long, ByRef buf() As Long, ByVal size As Long, ByVal tout As Long) As Long
X502_Recv = tmp_X502_Recv(hnd, buf(0), size, tout)
End Function
Public Function X502_Send(ByVal hnd As Long, ByRef buf() As Long, ByVal size As Long, ByVal tout As Long) As Long
X502_Send = tmp_X502_Send(hnd, buf(0), size, tout)
End Function
Public Function X502_ProcessAdcData(ByVal hnd As Long, ByRef src() As Long, ByRef dest() As Double, ByRef size As Long, ByVal flags As Long) As Long
X502_ProcessAdcData = tmp_X502_ProcessAdcData(hnd, src(0), dest(0), size, flags)
End Function
Public Function X502_ProcessData(ByVal hnd As Long, ByRef src() As Long, ByVal flags As Long, ByRef adc_data() As Double, ByRef adc_data_size As Long, ByRef din_data() As Long, ByRef din_data_size As Long) As Long
X502_ProcessData = tmp_X502_ProcessData(hnd, src(0), flags, adc_data(0), adc_data_size, din_data(0), din_data_size)
End Function
Public Function X502_ProcessDataWithUserExt(ByVal hnd As Long, ByRef src() As Long, ByVal size As Long, ByVal flags As Long, ByRef adc_data() As Double, ByRef adc_data_size As Long, ByRef din_data() As Long, ByRef din_data_size As Long, ByRef usr_data() As Long, ByRef usr_data_size As Long) As Long
X502_ProcessDataWithUserExt = tmp_X502_ProcessDataWithUserExt(hnd, src(0), size, flags, adc_data(0), adc_data_size, din_data(0), din_data_size, usr_data(0), usr_data_size)
End Function
Public Function X502_PrepareData(ByVal hnd As Long, ByRef dac1() As Double, ByRef dac2() As Double, ByRef digout() As Long, ByVal size As Long, ByVal flags As Long, ByRef out_buf() As Long) As Long
X502_PrepareData = tmp_X502_PrepareData(hnd, dac1(0), dac2(0), digout(0), size, flags, out_buf(0))
End Function
Public Function X502_BfMemRead(ByVal hnd As Long, ByVal addr As Long, ByRef regs() As Long, ByVal size As Long) As Long
X502_BfMemRead = tmp_X502_BfMemRead(hnd, addr, regs(0), size)
End Function
Public Function X502_BfMemWrite(ByVal hnd As Long, ByVal addr As Long, ByRef regs() As Long, ByVal size As Long) As Long
X502_BfMemWrite = tmp_X502_BfMemWrite(hnd, addr, regs(0), size)
End Function
Public Function X502_BfExecCmd(ByVal hnd As Long, ByVal cmd_code As Integer, ByVal par As Long, ByRef snd_data() As Long, ByVal snd_size As Long, ByRef rcv_data() As Long, ByVal rcv_size As Long, ByVal tout As Long, ByRef recvd_size As Long) As Long
X502_BfExecCmd = tmp_X502_BfExecCmd(hnd, cmd_code, par, snd_data(0), snd_size, rcv_data(0), rcv_size, tout, recvd_size)
End Function
Public Function X502_FlashRead(ByVal hnd As Long, ByVal addr As Long, ByRef data() As Byte, ByVal size As Long) As Long
X502_FlashRead = tmp_X502_FlashRead(hnd, addr, data(0), size)
End Function
Public Function X502_FlashWrite(ByVal hnd As Long, ByVal addr As Long, ByRef data() As Byte, ByVal size As Long) As Long
X502_FlashWrite = tmp_X502_FlashWrite(hnd, addr, data(0), size)
End Function
Public Function X502_StrConvert(ByRef str_arr() As Byte) As String
Dim psCString As String
Dim sReturn As String
Dim iNullCharPos As Integer
psCString = StrConv(str_arr, vbUnicode)
iNullCharPos = InStr(psCString, vbNullChar)
If iNullCharPos > 0 Then
sReturn = Left(psCString, iNullCharPos - 1)
Else
sReturn = psCString
End If
X502_StrConvert = sReturn
End Function
Public Function X502_StrFromPtr(ByVal lpStr As Long) As String
Dim bStr() As Byte
Dim cChars As Long
On Error Resume Next
' Get the number of characters in the buffer
cChars = lstrlen(lpStr)
If cChars Then
' Resize the byte array
ReDim bStr(0 To cChars - 1) As Byte
' Grab the ANSI buffer
Call CopyMemory(bStr(0), ByVal lpStr, cChars)
End If
' Now convert to a VB Unicode string
X502_StrFromPtr = StrConv(bStr, vbUnicode)
End Function
Public Function X502_GetErrorString(ByVal Error_Code As Long) As String
Dim Ptr As Long
Ptr = tmp_X502_GetErrorString(Error_Code)
X502_GetErrorString = X502_StrFromPtr(Ptr)
End Function