included SDK folder and included it to the git three

This commit is contained in:
2025-10-30 21:53:19 +03:00
parent bf25bed9aa
commit 77005d7863
151 changed files with 20347 additions and 0 deletions
@@ -0,0 +1,18 @@
Данный пример демонстрирует работу с модулеми L502 и E502 из среды "Borland C++ Builder".
Пример содержит файл проекта для среды "Borland C++ Builder 6" (x502_example.dpr) и для
среды "Embarcadero C++ Builder XE" (x502_example.cbproj)
Для того чтобы собрать проект, необходимо изменить путь к заголовочным файлам,
на путь где находится на Вашем компьютере файлы x502api.h, e502api.h, l502api.h и lcard_pstdint.h и заменить добавленые
в проект файлы x502api.lib, e5l502api.lib и l502api.lib на те, которые находится на Вашем компьютере (ставятся в SDK_DIR/lib/borland).
Проект демонстрирует в первую очередь как можно работать с модулями L502 и E502, а не как нужно программировать
в среде C++ Builder.
Пример демонстрирует синхронный потоковый ввод с АЦП для трех логических каналов
с возможностью запуска синхронного ввода с цифроых линий, а так же
асинхронный ввод/вывод для цифровых линий, ЦАП и асинхронный ввод одного кадра АЦП.
Синхронный ввод осуществляется в отдельном потоке (X502_ProcessThread), который создается
и запускается по нажатию кнопки. В потоке осуществляется прием, обработка данных и вывод их
на индикаторы (указатели на элементы индикаторов сохраняются в объекте потока перед его запуском).
@@ -0,0 +1,526 @@
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "unit.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
/* ìåòîä îïðåäåëÿåò êàêèå óïðàâëÿþùèå ýëåìåíòû ðàçðåøåíû, à êàêèå çàïðåùåíû */
void TForm1::updateControls() {
/* êíîïêà îáíîâèòü ñïèñîê äîñòóïíà ïîêà íå îòêðûëè óñòðîéñòâî */
btnRefreshDeviceList->Enabled = (hnd==NULL);
cbbDevList->Enabled = (hnd==NULL);
btnOpen->Caption = hnd == NULL ? "Óñòàíîâèòü ñâÿçü ñ ìîäóëåì" :
"Ðàçîðâàòü ñâÿçü ñ ìîäóëåì";
btnOpen->Enabled = (hnd!=NULL) || (cbbDevList->ItemIndex >= 0);
btnOpenByIP->Enabled = (hnd==NULL);
edtIpAddr->Enabled = (hnd==NULL);
chkSyncDin->Enabled = (hnd!=NULL) && !threadRunning;
btnStart->Enabled = (hnd!=NULL) && !threadRunning;
btnStop->Enabled = (hnd!=NULL) && threadRunning;
btnSetAdcFreq->Enabled = (hnd!=NULL) && !threadRunning;
btnAsyncDigOut->Enabled = (hnd!=NULL);
btnAsyncDigIn->Enabled = (hnd!=NULL);
btnAsyncDac1->Enabled = (hnd!=NULL) && chkDacPresent->Checked;
btnAsyncDac2->Enabled = (hnd!=NULL) && chkDacPresent->Checked;
btnAsyncAdcFrame->Enabled = (hnd!=NULL) && !threadRunning;
}
void TForm1::freeDevList() {
if (devrecList.Length != 0) {
X502_FreeDevRecordList(&devrecList[0], devrecList.Length);
devrecList.Length = 0;
}
cbbDevList->Items->Clear();
}
/* îáíîâëåíèå ñïèñêà ïîäêëþ÷åííûõ ïëàò L502 è E502*/
void TForm1::refreshDeviceList(void) {
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
int32_t fnd_devcnt = 0;
int old_index = cbbDevList->ItemIndex;
/* î÷èùàåì ðåñóðñû çàïèñåé, åñëè áûëè âûäåëåíû */
freeDevList();
/* ïîëó÷àåì êîëè÷åñòâî ïîäêëþ÷åííûõ óñòðîéñòâ ïî èíòåðôåéñàì PCI è USB */
L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
if ((pci_devcnt+usb_devcnt) != 0) {
/* âûäåëÿåì ïàìÿòü äëÿ ìàññèâà äëÿ ñîõðàíåíèÿ íàéäåííîãî
êîëè÷åñòâà çàïèñåé */
devrecList.Length = pci_devcnt + usb_devcnt;
/* ïîëó÷àåì çàïèñè î ìîäóëÿõ L502, íî íå áîëüøå pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&devrecList[fnd_devcnt],
pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* äîáàâëÿåì çàïèñè î ìîäóëÿõ E502, ïîäêëþ÷åííûõ ïî USB, â êîíåö ìàññèâà */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&devrecList[fnd_devcnt],
usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
devrecList.Length = fnd_devcnt;
if (fnd_devcnt > 0) {
/* äîáàâëÿåì âñå íàéäåííûå çàïèñè â ñïèñîê ComboBox'à äëÿ âûáîðà */
for (int32_t i=0; i < fnd_devcnt; i++) {
cbbDevList->Items->Add(AnsiString(devrecList[i].devname) + ", " + AnsiString(devrecList[i].serial));
}
/* åñëè äî îáíîâëåíèÿ ñïèñêà áûë âûáðàí äåéñòâèòåëüíûé èíäåêñ - âîññòàíàâëèâàåì åãî */
cbbDevList->ItemIndex = (old_index >= 0) && (old_index < fnd_devcnt) ? old_index : 0;
}
}
updateControls();
}
/* Óñòàíîâêà ïåðàìåòðîâ ñáîðà ìîäóëÿ â ñîîòâåòñòâèè ñ ýëåìåíòàìè GUI */
int32_t TForm1::setupParams() {
int32_t err = 0;
uint32_t lch_cnt = cbbLChCnt->ItemIndex+1;
/* òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ ðåæèìà èçìåðåíèÿ */
static uint32_t f_mode_tbl[] = {X502_LCH_MODE_COMM, X502_LCH_MODE_DIFF, X502_LCH_MODE_ZERO};
/* òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ äèàïàçîíîâ ÀÖÏ */
static uint32_t f_range_tbl[] = {X502_ADC_RANGE_10, X502_ADC_RANGE_5, X502_ADC_RANGE_2,
X502_ADC_RANGE_1, X502_ADC_RANGE_05, X502_ADC_RANGE_02};
/* òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ èñòî÷íèêà ñèíõðîíèçàöèè */
static uint32_t f_sync_tbl[] = {X502_SYNC_INTERNAL, X502_SYNC_EXTERNAL_MASTER,
X502_SYNC_DI_SYN1_RISE, X502_SYNC_DI_SYN2_RISE,
X502_SYNC_DI_SYN1_FALL, X502_SYNC_DI_SYN2_FALL};
/* Óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ */
err = X502_SetLChannelCount(hnd, lch_cnt);
if (err == X502_ERR_OK) {
err = X502_SetLChannel(hnd, 0, cbbLCh1_Channel->ItemIndex,
f_mode_tbl[cbbLCh1_Mode->ItemIndex], f_range_tbl[cbbLCh1_Range->ItemIndex],0);
}
if ((err == X502_ERR_OK) && (lch_cnt>=2)) {
err = X502_SetLChannel(hnd, 1, cbbLCh2_Channel->ItemIndex,
f_mode_tbl[cbbLCh2_Mode->ItemIndex], f_range_tbl[cbbLCh2_Range->ItemIndex],0);
}
if ((err == X502_ERR_OK) && (lch_cnt>=3)) {
err = X502_SetLChannel(hnd, 2, cbbLCh3_Channel->ItemIndex,
f_mode_tbl[cbbLCh3_Mode->ItemIndex], f_range_tbl[cbbLCh3_Range->ItemIndex],0);
}
/* Íàñòðàèâàåì èñòî÷íèê ÷àñòîòû ñèíõðîíèçàöèè è çàïóñêà ñáîðà */
if (err == X502_ERR_OK)
err = X502_SetSyncMode(hnd, f_sync_tbl[cbbSyncMode->ItemIndex]);
if (err == X502_ERR_OK)
err = X502_SetSyncStartMode(hnd, f_sync_tbl[cbbSyncStartMode->ItemIndex]);
/* íàñòðàèâàåì ÷àñòîòó ñáîðà ñ ÀÖÏ */
if (err == X502_ERR_OK)
err = setAdcFreq();
/* Çàïèñûâàåì íàñòðîéêè â ìîäóëü */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
return err;
}
int32_t TForm1::setAdcFreq() {
double f_acq = StrToFloat(edtAdcFreq->Text);
double f_lch = StrToFloat(edtAdcFreqLch->Text);
double f_din = StrToFloat(edtDinFreq->Text);
/* óñòàíàâëèâàåì òðåáóåìóþ ÷àñòîòó ñáîðà. */
int32_t err = X502_SetAdcFreq(hnd, &f_acq, &f_lch);
if (err == X502_ERR_OK) {
/* îáíîâëÿåì çíà÷åíèå èíäèêàòîðà, äëÿ îòîáðàæåíèÿ
ðåàëüíî óñòàíîâèâøåéñÿ ÷àñòîòû */
edtAdcFreq->Text = FloatToStr(f_acq);
edtAdcFreqLch->Text = FloatToStr(f_lch);
/* Óñòàíàâëèâàåì ÷àñòîòó ñèíõðîííîãî ñáîðà */
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK)
edtDinFreq->Text = FloatToStr(f_din);
}
return err;
}
int32_t TForm1::setSyncDinStream() {
int32_t err;
/* ðàçðåøàåì èëè çàïðåùàåì ïîòîê ñèíõðîííîãî ââîäà
â çàâèñèìîñòè îò ñîñòîÿíèÿ ïåðåêëþ÷àòåëÿ */
if (chkSyncDin->Checked) {
err = X502_StreamsEnable(hnd, X502_STREAM_DIN);
} else {
err = X502_StreamsDisable(hnd, X502_STREAM_DIN);
}
return err;
}
void __fastcall TForm1::OnThreadTerminate(TObject *obj) {
if (thread->err != X502_ERR_OK) {
MessageDlg("Ñáîð äàííûõ çàâåðøåí ñ îøèáêîé: " + String(X502_GetErrorString(thread->err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
threadRunning = false;
updateControls();
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner), hnd(NULL) {
refreshDeviceList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnRefreshDeviceListClick(TObject *Sender) {
refreshDeviceList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStartClick(TObject *Sender) {
/* íàñòðàèâàåì âñå ïàðàìåòðû â ñîîòâåòñòâèè ñ ýëåìåíòàìè óïðàâëåíèÿ */
int32_t err = setupParams();
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà íàñòðîéêè ïàðàìåòðîâ ïëàòû: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
/* ðàçðåøàåì ñèíõðîííûé ââîä ÀÖÏ */
if (err == X502_ERR_OK)
err = X502_StreamsEnable(hnd, X502_STREAM_ADC);
/* ðàçðåøàåì ñèíõðîííûé ââîä ñ öèôðîâûõ ëèíèé â çàâèñèìîñòè îò ïåðåêëþ÷àòåëÿ */
if (err == X502_ERR_OK)
err = setSyncDinStream();
if (err == X502_ERR_OK) {
/* åñëè îñòàëñÿ íå óäàëåííûé îáúåêò ïîòîêà - óäàëÿåì */
if (thread) {
delete thread;
thread = NULL;
}
//ñîçäàíèå êëàññà ïîòîêà
thread = new X502_ProcessThread(true);
thread->hnd = hnd;
//ïåðåäà÷à ïîòîêó ýëåìåíòîâ óïðàâëåíèÿ äëÿ îòîáðàæåíèÿ ðåçóëüòàòîâ ñáîðà
thread->lchResEdits[0] = edtLCh1_Result;
thread->lchResEdits[1] = edtLCh2_Result;
thread->lchResEdits[2] = edtLCh3_Result;
thread->dinResEdit = edtDin_Result;
edtLCh1_Result->Text="";
edtLCh2_Result->Text="";
edtLCh3_Result->Text="";
edtDin_Result->Text="";
/* óñòàíàâëèâàåì ôóíêöèþ íà ñîáûòèå çàâåðøåíèÿ ïîòîêà (â ÷àñòíîñòè
÷òîáû îòñëåäèòü, åñëè ïîòîê çàâåðøèëñÿ ñàì èç-çà îøèáêè ïðè ñáîðå
äàííûõ) */
thread->OnTerminate = OnThreadTerminate;
thread->Resume(); //çàïóñê ïîòîêà
threadRunning = true;
updateControls();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnStopClick(TObject *Sender) {
/* óñòàíàâëèâàåì çàïðîñ íà çàâåðøåíèå ïîòîêà */
if (threadRunning)
thread->stop = true;
btnStop->Enabled = false;
}
void TForm1::showDevInfo(void) {
t_x502_info info;
int32_t err = X502_GetDevInfo(hnd, &info);
if (err == X502_ERR_OK) {
chkDacPresent->Checked = info.devflags & X502_DEVFLAGS_DAC_PRESENT;
chkGalPresent->Checked = info.devflags & X502_DEVFLAGS_GAL_PRESENT;
chkDspPresent->Checked = info.devflags & X502_DEVFLAGS_BF_PRESENT;
chkEthPresent->Checked = info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH;
edtPldaVer->Text = IntToStr(info.plda_ver);
edtFpgaVer->Text = IntToStr((info.fpga_ver>>8)&0xFF) + "."
+ IntToStr(info.fpga_ver & 0xFF);
if (info.mcu_firmware_ver != 0) {
edtMcuVer->Text = IntToStr((int)(info.mcu_firmware_ver>>24)&0xFF) + "." +
IntToStr((int)(info.mcu_firmware_ver>>16)&0xFF) + "." +
IntToStr((int)(info.mcu_firmware_ver>>8)&0xFF) + "." +
IntToStr((int)info.mcu_firmware_ver & 0xFF);
} else {
edtMcuVer->Text = "";
}
} else {
MessageDlg("Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè î ìîäóëå: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Close(hnd);
X502_Free(hnd);
hnd = NULL;
}
}
/* ôóíêöèÿ îòêðûòèÿ óñòðîéñòâà ñ âûáðàííûì ñåðèéíûì íîìåðîì èëè çàêðûòèÿ åãî,
åñëè îíî óæå áûëî îòêðûòî */
void __fastcall TForm1::btnOpenClick(TObject *Sender) {
/* åñëè óñòðîéñòâî áûëî çàêðûòî - ñîçäàåì íîâûé îïèñàòåëü è îòêðûâàåì åãî */
if (hnd==NULL) {
int idx = cbbDevList->ItemIndex;
if ((idx >= 0) && (idx < devrecList.Length)) {
hnd = X502_Create();
if (hnd==NULL) {
MessageDlg("Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ", mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
/* îòêðûâàåì ìîäóëü, ñîîòâåòñòâóþùèé çàïèñè ñ âûáðàííûì èíäåêñîì */
int32_t err = X502_OpenByDevRecord(hnd, &devrecList[idx]);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà îòêðûòèÿ ìîäóëÿ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Free(hnd);
hnd = NULL;
} else {
showDevInfo();
}
}
}
} else {
/* åñëè óñòðîéñòâî áûëî îòêðûòî - çàêðûâàåì */
closeDevice();
}
updateControls();
}
uint32_t TForm1::parseIpAddr(AnsiString addr) {
int a[4],i;
if (sscanf(addr.c_str(), "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])!=4) {
throw new Exception("Íåâåðíûé ôîðìàò IP-àäðåñà!!");
}
for (i=0; i < 4; i++) {
if ((a[i]<0) || (a[i] > 255)) {
throw new Exception("Íåäåéñòâèòåëüíûé IP-àäðåñ!!");
}
}
return (a[0] << 24) | (a[1]<<16) | (a[2]<<8) | a[3];
}
void __fastcall TForm1::btnOpenByIPClick(TObject *Sender) {
t_x502_devrec devrec;
int32_t err = E502_MakeDevRecordByIpAddr(&devrec, parseIpAddr(edtIpAddr->Text), 0, 5000);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà ñîçäàíèÿ çàïèñè: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
hnd = X502_Create();
if (hnd==NULL) {
MessageDlg("Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ", mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
/* óñòàíàâëèâàåì ñâÿçü ïî ñîçäàííîé çàïèñè */
int32_t err = X502_OpenByDevRecord(hnd, &devrec);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà îòêðûòèÿ ìîäóëÿ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
X502_Free(hnd);
hnd = NULL;
} else {
showDevInfo();
}
}
}
updateControls();
}
//---------------------------------------------------------------------------
void TForm1::closeDevice() {
if (hnd != NULL) {
/* åñëè çàïóùåí ïîòîê ñáîðà äàííûõ - òî îñòàíàâëèâàåì åãî */
if (threadRunning) {
thread->stop=1;
thread->WaitFor();
}
/* çàêðûòèå ñâÿçè ñ ìîäóëåì */
X502_Close(hnd);
/* îñâîáîæäåíèå îïèñàòåëÿ */
X502_Free(hnd);
hnd = NULL;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) {
closeDevice();
freeDevList();
if (thread)
delete thread;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDigOutClick(TObject *Sender) {
if (hnd!=NULL) {
uint32_t val = StrToInt(edtAsyncDigOut->Text);
int32_t err = X502_AsyncOutDig(hnd, val, 0);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà àñèíõðîííîãî âûâîäà íà öèôðîâûå ëèíèè: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::adcFreqEditChange(TObject *Sender) {
if (hnd != NULL) {
/* óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ, ÷òîáû ïðàâèëüíî
ðàñ÷èòàòü ÷àñòîòó íà êàíàë */
int32_t err = X502_SetLChannelCount(hnd, cbbLChCnt->ItemIndex+1);
if (err == X502_ERR_OK)
err = setAdcFreq();
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà óñòàíîâêè ÷àñòîòû ñáîðà: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::chkSyncDinClick(TObject *Sender) {
if (hnd != NULL) {
int32_t err = setSyncDinStream();
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà ðàçðåøåíèÿ/çàïðåòà ñèíõðîííîãî ââîäà: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDigInClick(TObject *Sender) {
if (hnd != NULL) {
uint32_t din;
int32_t err = X502_AsyncInDig(hnd, &din);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà àñèíõðîííîãî ââîäà ñ öèôðîâûõ ëèíèé: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
edtAsyncDigIn->Text = IntToHex((int)din&0x3FFFF, 5);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDac1Click(TObject *Sender) {
if (hnd != NULL) {
double val = StrToFloat(edtAsyncDac1->Text);;
int32_t err;
err = X502_AsyncOutDac(hnd, X502_DAC_CH1, val, X502_DAC_FLAGS_CALIBR |
X502_DAC_FLAGS_VOLT);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà âûâîäà íà ÖÀÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncDac2Click(TObject *Sender) {
if (hnd != NULL) {
double val = StrToFloat(edtAsyncDac2->Text);;
int32_t err;
err = X502_AsyncOutDac(hnd, X502_DAC_CH2, val, X502_DAC_FLAGS_CALIBR |
X502_DAC_FLAGS_VOLT);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà âûâîäà íà ÖÀÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnAsyncAdcFrameClick(TObject *Sender) {
if (hnd != NULL) {
uint32_t lch_cnt;
/* íàñòðàèâàåì ëîãè÷åñêóþ òàáëèöó ÀÖÏ */
int32_t err = setupParams();
if (err == X502_ERR_OK)
err = X502_GetLChannelCount(hnd, &lch_cnt);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà íàñòðîéêè ïàðàìåòðîâ ÀÖÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
}
if (err == X502_ERR_OK) {
/* â ïðèìåðå èñïîëüçóåì 3 êàíàëà - ñîçäàåì ìàññèâ äëÿ ïðèåìà
îòñ÷åòà íà êàæäûé êàíàë */
double adc_data[3];
err = X502_AsyncGetAdcFrame(hnd, X502_PROC_FLAGS_VOLT, 1000, adc_data);
if (err != X502_ERR_OK) {
MessageDlg("Îøèáêà ïðèåìà êàäðà ÀÖÏ: " + String(X502_GetErrorString(err)),
mtError, TMsgDlgButtons() << mbOK,NULL);
} else {
edtLCh1_Result->Text = FloatToStrF(adc_data[0], ffFixed, 4, 8);
if (lch_cnt>=2) {
edtLCh2_Result->Text = FloatToStrF(adc_data[1], ffFixed, 4, 8);
} else {
edtLCh2_Result->Text ="";
}
if (lch_cnt>=3) {
edtLCh3_Result->Text = FloatToStrF(adc_data[2], ffFixed, 4, 8);
} else {
edtLCh3_Result->Text = "";
}
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbbDevListChange(TObject *Sender) {
//refreshDeviceList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cbbLChCntChange(TObject *Sender) {
if (cbbLChCnt->ItemIndex < 0)
cbbLChCnt->ItemIndex = 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
@@ -0,0 +1,669 @@
object Form1: TForm1
Left = 599
Top = 94
Caption = 'L502/E502 test'
ClientHeight = 702
ClientWidth = 577
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
PixelsPerInch = 96
TextHeight = 13
object btnRefreshDeviceList: TButton
Left = 16
Top = 8
Width = 217
Height = 25
Caption = #1054#1073#1085#1086#1074#1080#1090#1100' '#1089#1087#1080#1089#1082#1086' '#1091#1089#1090#1088#1086#1081#1089#1090#1074
TabOrder = 0
OnClick = btnRefreshDeviceListClick
end
object cbbDevList: TComboBox
Left = 264
Top = 8
Width = 225
Height = 21
TabOrder = 1
OnChange = cbbDevListChange
end
object btnStart: TButton
Left = 16
Top = 88
Width = 217
Height = 25
Caption = #1047#1072#1087#1091#1089#1082' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 2
OnClick = btnStartClick
end
object GroupBox1: TGroupBox
Left = 16
Top = 376
Width = 513
Height = 153
Caption = #1050#1072#1085#1072#1083#1099
TabOrder = 3
object Label2: TLabel
Left = 8
Top = 40
Width = 31
Height = 13
Caption = #1050#1072#1085#1072#1083
end
object Label1: TLabel
Left = 64
Top = 40
Width = 51
Height = 13
Caption = #1044#1080#1072#1087#1072#1079#1086#1085
end
object Label3: TLabel
Left = 152
Top = 40
Width = 94
Height = 13
Caption = #1056#1077#1078#1080#1084' '#1080#1079#1084#1077#1088#1077#1085#1080#1103
end
object Label4: TLabel
Left = 336
Top = 40
Width = 52
Height = 13
Caption = #1056#1077#1079#1091#1083#1100#1090#1072#1090
end
object Label9: TLabel
Left = 16
Top = 16
Width = 164
Height = 13
Caption = #1050#1086#1083#1080#1095#1077#1089#1090#1074#1086' '#1083#1086#1075#1080#1095#1077#1089#1082#1080#1093' '#1082#1072#1085#1072#1083#1086#1074
end
object cbbLCh1_Channel: TComboBox
Left = 8
Top = 56
Width = 41
Height = 21
ItemIndex = 0
TabOrder = 0
Text = '1'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh1_Range: TComboBox
Left = 64
Top = 56
Width = 57
Height = 21
ItemIndex = 0
TabOrder = 1
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh1_Mode: TComboBox
Left = 136
Top = 56
Width = 169
Height = 21
ItemIndex = 1
TabOrder = 2
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh1_Result: TEdit
Left = 328
Top = 56
Width = 121
Height = 21
TabOrder = 3
end
object cbbLCh2_Channel: TComboBox
Left = 8
Top = 80
Width = 41
Height = 21
ItemIndex = 1
TabOrder = 4
Text = '2'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh2_Range: TComboBox
Left = 64
Top = 80
Width = 57
Height = 21
ItemIndex = 0
TabOrder = 5
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh2_Mode: TComboBox
Left = 136
Top = 80
Width = 169
Height = 21
ItemIndex = 1
TabOrder = 6
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh2_Result: TEdit
Left = 328
Top = 80
Width = 121
Height = 21
TabOrder = 7
end
object cbbLCh3_Channel: TComboBox
Left = 8
Top = 104
Width = 41
Height = 21
ItemIndex = 2
TabOrder = 8
Text = '3'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh3_Range: TComboBox
Left = 64
Top = 104
Width = 57
Height = 21
ItemIndex = 0
TabOrder = 9
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh3_Mode: TComboBox
Left = 136
Top = 104
Width = 169
Height = 21
ItemIndex = 1
TabOrder = 10
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh3_Result: TEdit
Left = 328
Top = 104
Width = 121
Height = 21
TabOrder = 11
end
object chkSyncDin: TCheckBox
Left = 120
Top = 128
Width = 185
Height = 17
Caption = #1056#1072#1079#1088#1072#1096#1077#1085#1080#1077' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072
TabOrder = 12
OnClick = chkSyncDinClick
end
object edtDin_Result: TEdit
Left = 328
Top = 128
Width = 121
Height = 21
TabOrder = 13
end
object cbbLChCnt: TComboBox
Left = 192
Top = 16
Width = 73
Height = 21
ItemIndex = 2
TabOrder = 14
Text = '3'
OnChange = cbbLChCntChange
Items.Strings = (
'1'
'2'
'3')
end
end
object btnStop: TButton
Left = 16
Top = 120
Width = 217
Height = 25
Caption = #1054#1089#1090#1072#1085#1086#1074' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
Enabled = False
TabOrder = 4
OnClick = btnStopClick
end
object btnOpen: TButton
Left = 16
Top = 56
Width = 217
Height = 25
Caption = #1054#1090#1082#1088#1099#1090#1100' '#1091#1089#1090#1088#1086#1081#1089#1090#1074#1086
TabOrder = 5
OnClick = btnOpenClick
end
object btnAsyncDigOut: TButton
Left = 16
Top = 600
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1094#1080#1092#1088#1086#1074#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 6
OnClick = btnAsyncDigOutClick
end
object edtAsyncDigOut: TEdit
Left = 248
Top = 600
Width = 121
Height = 21
TabOrder = 7
Text = '0x0000'
end
object edtAsyncDigIn: TEdit
Left = 248
Top = 568
Width = 121
Height = 21
Enabled = False
TabOrder = 8
Text = '0x0000'
end
object btnAsyncDigIn: TButton
Left = 16
Top = 568
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1094#1080#1092#1088#1086#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 9
OnClick = btnAsyncDigInClick
end
object GroupBox2: TGroupBox
Left = 264
Top = 40
Width = 257
Height = 169
Caption = #1048#1085#1092#1086#1088#1084#1072#1094#1080#1103' '#1086' '#1084#1086#1076#1091#1083#1077
TabOrder = 10
object Label6: TLabel
Left = 112
Top = 93
Width = 124
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' '#1055#1051#1048#1057
end
object labelPldaVer: TLabel
Left = 112
Top = 117
Width = 121
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' PLDA'
end
object lbl11: TLabel
Left = 112
Top = 144
Width = 117
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' ARM'
end
object chkDacPresent: TCheckBox
Left = 16
Top = 24
Width = 97
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1062#1040#1055
Enabled = False
TabOrder = 0
end
object edtFpgaVer: TEdit
Left = 16
Top = 93
Width = 89
Height = 21
ReadOnly = True
TabOrder = 1
end
object edtPldaVer: TEdit
Left = 16
Top = 117
Width = 89
Height = 21
ReadOnly = True
TabOrder = 2
end
object edtMcuVer: TEdit
Left = 16
Top = 144
Width = 89
Height = 21
ReadOnly = True
TabOrder = 3
end
object chkEthPresent: TCheckBox
Left = 16
Top = 72
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1077#1090#1077#1074#1086#1075#1086' '#1080#1085#1090#1077#1088#1092#1077#1081#1089#1072
Enabled = False
TabOrder = 4
end
end
object chkGalPresent: TCheckBox
Left = 280
Top = 80
Width = 169
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1075#1072#1083#1100#1074#1072#1085#1086#1088#1072#1079#1074#1103#1079#1082#1080
Enabled = False
TabOrder = 11
end
object chkDspPresent: TCheckBox
Left = 280
Top = 96
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1080#1075#1085#1072#1083#1100#1085#1086#1075#1086' '#1087#1088#1086#1094#1077#1089#1089#1086#1088#1072
Enabled = False
TabOrder = 12
end
object edtAsyncDac1: TEdit
Left = 248
Top = 640
Width = 81
Height = 21
TabOrder = 13
Text = '5'
end
object btnAsyncDac1: TButton
Left = 16
Top = 640
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'1 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 14
OnClick = btnAsyncDac1Click
end
object btnAsyncDac2: TButton
Left = 16
Top = 672
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'2 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 15
OnClick = btnAsyncDac2Click
end
object edtAsyncDac2: TEdit
Left = 248
Top = 672
Width = 81
Height = 21
TabOrder = 16
Text = '5'
end
object btnAsyncAdcFrame: TButton
Left = 16
Top = 536
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1082#1072#1076#1088#1072' '#1040#1062#1055
TabOrder = 17
OnClick = btnAsyncAdcFrameClick
end
object GroupBox3: TGroupBox
Left = 16
Top = 240
Width = 513
Height = 65
Caption = #1063#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 18
object Label5: TLabel
Left = 16
Top = 20
Width = 136
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093' ('#1043#1094')'
end
object Label7: TLabel
Left = 168
Top = 20
Width = 111
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1085#1072' '#1082#1072#1085#1072#1083' ('#1043#1094')'
end
object Label8: TLabel
Left = 296
Top = 20
Width = 163
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072' ('#1043#1094')'
end
object btnSetAdcFreq: TButton
Left = 432
Top = 32
Width = 73
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100
TabOrder = 0
OnClick = adcFreqEditChange
end
object edtAdcFreq: TEdit
Left = 16
Top = 36
Width = 105
Height = 21
TabOrder = 1
Text = '2000000'
end
object edtAdcFreqLch: TEdit
Left = 176
Top = 36
Width = 105
Height = 21
TabOrder = 2
Text = '2000000'
end
object edtDinFreq: TEdit
Left = 296
Top = 36
Width = 105
Height = 21
TabOrder = 3
Text = '2000000'
end
end
object GroupBox4: TGroupBox
Left = 16
Top = 311
Width = 513
Height = 65
Caption = #1057#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1103
TabOrder = 19
object Label10: TLabel
Left = 16
Top = 20
Width = 172
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1095#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1080
end
object Label11: TLabel
Left = 264
Top = 20
Width = 238
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1079#1072#1087#1091#1089#1082#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072'/'#1074#1099#1074#1086#1076#1072
end
object cbbSyncMode: TComboBox
Left = 16
Top = 38
Width = 169
Height = 21
ItemIndex = 0
TabOrder = 0
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
object cbbSyncStartMode: TComboBox
Left = 264
Top = 38
Width = 169
Height = 21
ItemIndex = 0
TabOrder = 1
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
end
object btnOpenByIP: TButton
Left = 16
Top = 168
Width = 217
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100' '#1089#1086#1077#1076#1080#1085#1077#1085#1080#1077' '#1087#1086' IP-'#1072#1076#1088#1077#1089#1091
TabOrder = 20
OnClick = btnOpenByIPClick
end
object edtIpAddr: TEdit
Left = 16
Top = 200
Width = 217
Height = 21
TabOrder = 21
Text = '192.168.0.1'
end
end
+122
View File
@@ -0,0 +1,122 @@
//---------------------------------------------------------------------------
#ifndef unitH
#define unitH
#include "l502api.h"
#include "e502api.h"
#include "x502_thread.h"
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *btnRefreshDeviceList;
TComboBox *cbbDevList;
TButton *btnStart;
TGroupBox *GroupBox1;
TLabel *Label2;
TLabel *Label1;
TComboBox *cbbLCh1_Channel;
TComboBox *cbbLCh1_Range;
TComboBox *cbbLCh1_Mode;
TEdit *edtLCh1_Result;
TComboBox *cbbLCh2_Channel;
TComboBox *cbbLCh2_Range;
TComboBox *cbbLCh2_Mode;
TEdit *edtLCh2_Result;
TComboBox *cbbLCh3_Channel;
TComboBox *cbbLCh3_Range;
TComboBox *cbbLCh3_Mode;
TComboBox *cbbSyncMode;
TComboBox *cbbSyncStartMode;
TEdit *edtLCh3_Result;
TButton *btnStop;
TLabel *Label3;
TLabel *Label4;
TCheckBox *chkSyncDin;
TEdit *edtDin_Result;
TButton *btnOpen;
TButton *btnAsyncDigOut;
TEdit *edtAsyncDigOut;
TEdit *edtAsyncDigIn;
TButton *btnAsyncDigIn;
TGroupBox *GroupBox2;
TCheckBox *chkDacPresent;
TCheckBox *chkGalPresent;
TCheckBox *chkDspPresent;
TEdit *edtFpgaVer;
TLabel *Label6;
TEdit *edtPldaVer;
TLabel *labelPldaVer;
TEdit *edtAsyncDac1;
TButton *btnAsyncDac1;
TButton *btnAsyncDac2;
TEdit *edtAsyncDac2;
TButton *btnAsyncAdcFrame;
TGroupBox *GroupBox3;
TButton *btnSetAdcFreq;
TLabel *Label5;
TEdit *edtAdcFreq;
TEdit *edtAdcFreqLch;
TEdit *edtDinFreq;
TLabel *Label7;
TLabel *Label8;
TComboBox *cbbLChCnt;
TLabel *Label9;
TLabel *lbl11;
TEdit *edtMcuVer;
TCheckBox *chkEthPresent;
TButton *btnOpenByIP;
TEdit *edtIpAddr;
void __fastcall btnRefreshDeviceListClick(TObject *Sender);
void __fastcall btnStartClick(TObject *Sender);
void __fastcall btnStopClick(TObject *Sender);
void __fastcall btnOpenClick(TObject *Sender);
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
void __fastcall btnAsyncDigOutClick(TObject *Sender);
void __fastcall adcFreqEditChange(TObject *Sender);
void __fastcall chkSyncDinClick(TObject *Sender);
void __fastcall btnAsyncDigInClick(TObject *Sender);
void __fastcall btnAsyncDac1Click(TObject *Sender);
void __fastcall btnAsyncDac2Click(TObject *Sender);
void __fastcall btnAsyncAdcFrameClick(TObject *Sender);
void __fastcall cbbDevListChange(TObject *Sender);
void __fastcall cbbLChCntChange(TObject *Sender);
void __fastcall btnOpenByIPClick(TObject *Sender);
private: // User declarations
t_x502_hnd hnd; //îïèñàòåëü ìîäóëÿ
bool threadRunning; //ïðèçíàê, çàïóùåí ëè ïîòîê ñáîðà äàííûõ
X502_ProcessThread *thread; //ïîòîê äëÿ ñèíõðîííîãî ââîäà
DynamicArray<t_x502_devrec> devrecList;
void freeDevList();
void refreshDeviceList();
void closeDevice();
void showDevInfo();
uint32_t parseIpAddr(AnsiString addr);
int32_t setSyncDinStream();
int32_t setAdcFreq();
int32_t setupParams();
void updateControls();
__fastcall void OnThreadTerminate(TObject *obj);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
@@ -0,0 +1,146 @@
<?xml version='1.0' encoding='utf-8' ?>
<!-- C++Builder XML Project -->
<PROJECT>
<MACROS>
<VERSION value="BCB.06.00"/>
<PROJECT value="x502_example.exe"/>
<OBJFILES value="x502_example.obj unit.obj x502_thread.obj"/>
<RESFILES value="x502_example.res"/>
<IDLFILES value=""/>
<IDLGENFILES value=""/>
<DEFFILE value=""/>
<RESDEPEN value="$(RESFILES) unit.dfm"/>
<LIBFILES value="&quot;C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib&quot;
&quot;C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib&quot; &quot;C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib&quot;"/>
<LIBRARIES value=""/>
<SPARELIBS value="vcl.lib rtl.lib"/>
<PACKAGES value="vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
indy.bpi bcb2kaxserver.bpi"/>
<PATHCPP value=".;"/>
<PATHPAS value=".;"/>
<PATHRC value=".;"/>
<PATHASM value=".;"/>
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="ilink32"/>
<USERDEFINES value="_DEBUG"/>
<SYSDEFINES value="_RTLDLL;NO_STRICT;USEPACKAGES"/>
<MAINSOURCE value="x502_example.cpp"/>
<INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl;&quot;C:\Program Files (x86)\L-Card\lpcie\include&quot;"/>
<LIBPATH value="&quot;C:\Program Files (x86)\Borland\CBuilder6\Projects&quot;;$(BCB)\lib\obj;$(BCB)\lib"/>
<WARNINGS value="-w-par"/>
<OTHERFILES value=""/>
</MACROS>
<OPTIONS>
<IDLCFLAGS value="-I$(BCB)\include -I$(BCB)\include\vcl
-I&quot;C:\Program Files (x86)\L-Card\lpcie\include&quot; -src_suffix cpp -D_DEBUG
-boa"/>
<CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c
-tW -tWM"/>
<PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/>
<RFLAGS value=""/>
<AFLAGS value="/mx /w2 /zd"/>
<LFLAGS value="-D&quot;&quot; -aa -Tpe -x -Gn -v"/>
<OTHERFILES value=""/>
</OPTIONS>
<LINKER>
<ALLOBJ value="c0w32.obj $(PACKAGES) Memmgr.Lib sysinit.obj $(OBJFILES)"/>
<ALLRES value="$(RESFILES)"/>
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mti.lib"/>
<OTHERFILES value=""/>
</LINKER>
<FILELIST>
<FILE FILENAME="x502_example.res" FORMNAME="" UNITNAME="x502_example.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="x502_example.cpp" FORMNAME="" UNITNAME="x502_example" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="unit.cpp" FORMNAME="Form1" UNITNAME="unit" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="x502_thread.cpp" FORMNAME="" UNITNAME="x502_thread" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib" FORMNAME="" UNITNAME="e502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" FORMNAME="" UNITNAME="l502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib" FORMNAME="" UNITNAME="x502api.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
</FILELIST>
<BUILDTOOLS>
</BUILDTOOLS>
<IDEOPTIONS>
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1049
CodePage=1251
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[Excluded Packages]
c:\program files (x86)\borland\cbuilder6\Bin\dclite60.bpl=Borland Integrated Translation Environment
[HistoryLists\hlIncludePath]
Count=5
Item0=$(BCB)\include;$(BCB)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include
Item1=C:\Program Files (x86)\Borland\CBuilder6\Projects;C:\Program Files (x86)\L-Card\lpcie\include
Item2=C:\Program Files (x86)\Borland\CBuilder6\Projects;
Item3=$(BCB)\include;$(BCB)\include\vcl;
Item4=$(BCB)\include;$(BCB)\include\vcl
[HistoryLists\hlLibraryPath]
Count=2
Item0=C:\Program Files (x86)\Borland\CBuilder6\Projects
Item1=$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[HistoryLists\hlConditionals]
Count=1
Item0=_DEBUG
[Debugging]
DebugSourceDirs=$(BCB)\source\vcl
[Parameters]
RunParams=
Launcher=
UseLauncher=0
DebugCWD=
HostApplication=
RemoteHost=
RemotePath=
RemoteLauncher=
RemoteCWD=
RemoteDebug=0
[Compiler]
ShowInfoMsgs=0
LinkDebugVcl=0
LinkCGLIB=0
[CORBA]
AddServerUnit=1
AddClientUnit=1
PrecompiledHeaders=1
</IDEOPTIONS>
</PROJECT>
@@ -0,0 +1,294 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{52F5121E-CB05-4B98-8B26-2A5FA28782E4}</ProjectGuid>
<ProjectType>CppVCLApplication</ProjectType>
<MainSource>x502_example.cpp</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Application</AppType>
<FrameworkType>VCL</FrameworkType>
<ProjectVersion>15.4</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
<Cfg_1_Win64>true</Cfg_1_Win64>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
<Cfg_2_Win64>true</Cfg_2_Win64>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<SanitizedProjectName>x502_example</SanitizedProjectName>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_Locale>1049</VerInfo_Locale>
<AllPackageLibs>vcl.lib;rtl.lib</AllPackageLibs>
<DCC_UnitSearchPath>.\;$(BDS)\lib;$(BDS)\lib\obj;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<FinalOutputDir>.</FinalOutputDir>
<TASM_AdditionalSwitches> /w2</TASM_AdditionalSwitches>
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
<BRCC_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(BRCC_IncludePath)</BRCC_IncludePath>
<BCC_DisableOptimizations>true</BCC_DisableOptimizations>
<DCC_AdditionalSwitches> -M</DCC_AdditionalSwitches>
<BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
<UsePackages>true</UsePackages>
<ILINK_AppType>Windows</ILINK_AppType>
<DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
<DCC_IncludePath>.\;$(BDS)\lib;$(BDS)\lib\obj;$(DCC_IncludePath)</DCC_IncludePath>
<BCC_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(BCC_IncludePath)</BCC_IncludePath>
<TASM_IncludePath>$(BDS)\include;$(BDS)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include;$(TASM_IncludePath)</TASM_IncludePath>
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
<DynamicRTL>true</DynamicRTL>
<ILINK_LibraryPath>C:\Program Files (x86)\Borland\CBuilder6\Projects;$(BDS)\lib\obj;$(BDS)\lib;$(BDS)\lib\psdk;$(ILINK_LibraryPath)</ILINK_LibraryPath>
<BCC_GenerateWindowsApp>true</BCC_GenerateWindowsApp>
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
<BCC_PCHCache>true</BCC_PCHCache>
<PackageImports>vcl.bpi;rtl.bpi;dbrtl.bpi;adortl.bpi;vcldb.bpi;vclx.bpi;bdertl.bpi;vcldbx.bpi;ibxpress.bpi;dsnap.bpi;dsnap.bpi;dsnapcon.bpi;teeui.bpi;teedb.bpi;tee.bpi;dss.bpi;dsnapcon.bpi;bcbsmp.bpi;vclie.bpi;xmlrtl.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;inetdb.bpi;webdsnap.bpi;bcbie.bpi;websnap.bpi;soaprtl.bpi;dbexpress.bpi;dbxcds.bpi;indycore.bpi;indysystem.bpi;bcboffice2k.bpi;$(PackageImports)</PackageImports>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve</BCC_UserSuppliedOptions>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<OutputExt>.exe</OutputExt>
<BRCC_Defines>_DEBUG;$(BRCC_Defines)</BRCC_Defines>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<TASM_Defines>_DEBUG;$(TASM_Defines)</TASM_Defines>
<ILINK_LibraryPath>C:\Program Files (x86)\L-Card\lpcie\lib\borland\;$(ILINK_LibraryPath)</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<IncludePath>$(BDSINCLUDE)\windows\vcl;$(IncludePath)</IncludePath>
<TASM_Defines>_DEBUG;$(TASM_Defines)</TASM_Defines>
<BRCC_Defines>_DEBUG;$(BRCC_Defines)</BRCC_Defines>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<IntermediateOutputDir>Debug_Build</IntermediateOutputDir>
<DCC_AdditionalSwitches> -M -V</DCC_AdditionalSwitches>
<TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
<TASM_Debugging>Full</TASM_Debugging>
<DCC_Define>DEBUG;$(DCC_Define);$(DCC_Define)</DCC_Define>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
<ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath);$(ILINK_LibraryPath)</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<VerInfo_Locale>1033</VerInfo_Locale>
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve -k</BCC_UserSuppliedOptions>
<BCC_Defines>_DEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
<LinkPackageImports>vcl.bpi;rtl.bpi</LinkPackageImports>
<OutputExt>exe</OutputExt>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<ILINK_LibraryPath>$(BDS)\lib\win32\release\;$(ILINK_LibraryPath)</ILINK_LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<BCC_Defines>_DEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<BCC_OptimizationLevel>Level2</BCC_OptimizationLevel>
<DCC_AdditionalSwitches> -M -$O+</DCC_AdditionalSwitches>
<ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath);$(ILINK_LibraryPath)</ILINK_LibraryPath>
<TASM_Debugging>None</TASM_Debugging>
<IntermediateOutputDir>Release_Build</IntermediateOutputDir>
<BCC_InlineFunctionExpansion>true</BCC_InlineFunctionExpansion>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<BCC_Defines>NDEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
<BCC_UserSuppliedOptions> -tWM -Vx -r- -k -Ve -r</BCC_UserSuppliedOptions>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<BCC_Defines>NDEBUG;$(BCC_Defines);$(BCC_Defines)</BCC_Defines>
</PropertyGroup>
<ItemGroup>
<CppCompile Include="unit.cpp">
<BuildOrder>8</BuildOrder>
<Form>Form1</Form>
<DependentOn>unit.h</DependentOn>
<BuildOrder>6</BuildOrder>
</CppCompile>
<CppCompile Include="x502_example.cpp">
<BuildOrder>5</BuildOrder>
<BuildOrder>5</BuildOrder>
</CppCompile>
<ResFiles Include="x502_example.res">
<BuildOrder>2</BuildOrder>
<BuildOrder>4</BuildOrder>
</ResFiles>
<CppCompile Include="x502_thread.cpp">
<BuildOrder>11</BuildOrder>
<BuildOrder>3</BuildOrder>
</CppCompile>
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\e502api.lib" Condition="'$(Platform)'=='Win32'">
<BuildOrder>4</BuildOrder>
<IgnorePath>true</IgnorePath>
</LibFiles>
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\l502api.lib" Condition="'$(Platform)'=='Win32'">
<BuildOrder>5</BuildOrder>
<IgnorePath>true</IgnorePath>
</LibFiles>
<LibFiles Include="C:\Program Files (x86)\L-Card\lpcie\lib\borland\x502api.lib" Condition="'$(Platform)'=='Win32'">
<BuildOrder>6</BuildOrder>
<IgnorePath>true</IgnorePath>
</LibFiles>
<FormResources Include="unit.dfm"/>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets"/>
<ProjectExtensions>
<Borland.Personality>CPlusPlusBuilder.Personality.12</Borland.Personality>
<Borland.ProjectType>CppVCLApplication</Borland.ProjectType>
<BorlandProject>
<CPlusPlusBuilder.Personality>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">0</VersionInfo>
<VersionInfo Name="AutoIncBuild">0</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">0</VersionInfo>
<VersionInfo Name="PreRelease">0</VersionInfo>
<VersionInfo Name="Special">0</VersionInfo>
<VersionInfo Name="Private">0</VersionInfo>
<VersionInfo Name="DLL">0</VersionInfo>
<VersionInfo Name="Locale">1049</VersionInfo>
<VersionInfo Name="CodePage">1251</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName"/>
<VersionInfoKeys Name="FileDescription"/>
<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName"/>
<VersionInfoKeys Name="LegalCopyright"/>
<VersionInfoKeys Name="LegalTrademarks"/>
<VersionInfoKeys Name="OriginalFilename"/>
<VersionInfoKeys Name="ProductName"/>
<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"/>
</VersionInfoKeys>
<ExcludedPackages>
<ExcludedPackages Name="c:\program files (x86)\borland\cbuilder6\Bin\dclite60.bpl">Borland Integrated Translation Environment</ExcludedPackages>
</ExcludedPackages>
<HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Count">5</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item0">$(BCB)\include;$(BCB)\include\vcl;C:\Program Files (x86)\L-Card\lpcie\include</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item1">C:\Program Files (x86)\Borland\CBuilder6\Projects;C:\Program Files (x86)\L-Card\lpcie\include</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item2">C:\Program Files (x86)\Borland\CBuilder6\Projects;</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item3">$(BCB)\include;$(BCB)\include\vcl;</HistoryLists_hlIncludePath>
<HistoryLists_hlIncludePath Name="Item4">$(BCB)\include;$(BCB)\include\vcl</HistoryLists_hlIncludePath>
</HistoryLists_hlIncludePath>
<HistoryLists_hlLibraryPath>
<HistoryLists_hlLibraryPath Name="Count">2</HistoryLists_hlLibraryPath>
<HistoryLists_hlLibraryPath Name="Item0">C:\Program Files (x86)\Borland\CBuilder6\Projects</HistoryLists_hlLibraryPath>
<HistoryLists_hlLibraryPath Name="Item1">$(BCB)\lib\obj;$(BCB)\lib</HistoryLists_hlLibraryPath>
</HistoryLists_hlLibraryPath>
<HistoryLists_hlDebugSourcePath>
<HistoryLists_hlDebugSourcePath Name="Count">1</HistoryLists_hlDebugSourcePath>
<HistoryLists_hlDebugSourcePath Name="Item0">$(BCB)\source\vcl</HistoryLists_hlDebugSourcePath>
</HistoryLists_hlDebugSourcePath>
<HistoryLists_hlConditionals>
<HistoryLists_hlConditionals Name="Count">1</HistoryLists_hlConditionals>
<HistoryLists_hlConditionals Name="Item0">_DEBUG</HistoryLists_hlConditionals>
</HistoryLists_hlConditionals>
<Debugging>
<Debugging Name="DebugSourceDirs">$(BCB)\source\vcl</Debugging>
</Debugging>
<Parameters>
<Parameters Name="RunParams"/>
<Parameters Name="Launcher"/>
<Parameters Name="UseLauncher">0</Parameters>
<Parameters Name="DebugCWD"/>
<Parameters Name="HostApplication"/>
<Parameters Name="RemoteHost"/>
<Parameters Name="RemotePath"/>
<Parameters Name="RemoteLauncher"/>
<Parameters Name="RemoteCWD"/>
<Parameters Name="RemoteDebug">0</Parameters>
</Parameters>
<Compiler>
<Compiler Name="ShowInfoMsgs">0</Compiler>
<Compiler Name="LinkDebugVcl">0</Compiler>
<Compiler Name="LinkCGLIB">0</Compiler>
</Compiler>
<CORBA>
<CORBA Name="AddServerUnit">1</CORBA>
<CORBA Name="AddClientUnit">1</CORBA>
<CORBA Name="PrecompiledHeaders">1</CORBA>
</CORBA>
<ProjectProperties>
<ProjectProperties Name="AutoShowDeps">False</ProjectProperties>
<ProjectProperties Name="ManagePaths">True</ProjectProperties>
<ProjectProperties Name="VerifyPackages">True</ProjectProperties>
<ProjectProperties Name="IndexFiles">False</ProjectProperties>
</ProjectProperties>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k200.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp200.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k200.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp200.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
<Source>
<Source Name="MainSource">x502_example.cpp</Source>
</Source>
</CPlusPlusBuilder.Personality>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Cpp.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Cpp.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>
@@ -0,0 +1,40 @@
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("unit.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
@@ -0,0 +1,100 @@
//---------------------------------------------------------------------------
#pragma hdrstop
#include "x502_thread.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#define RECV_BUF_SIZE 8*1024*1024
#define RECV_TOUT 250
__fastcall X502_ProcessThread::X502_ProcessThread(bool CreateSuspended)
: TThread(CreateSuspended), stop(false), err (X502_ERR_OK) {
}
/* обновление индикаторов формы результатами последнего измерения.
Метод должен выполняться только через Syncronize, который нужен
для доступа к элементам VCL не из основного потока */
void __fastcall X502_ProcessThread::updateData() {
uint32_t lch_cnt;
err = X502_GetLChannelCount(hnd, &lch_cnt);
if (err == X502_ERR_OK) {
/* устанавливаем в индикаторах значение первого отсчета из массива */
for (uint32_t i=0; (i < lch_cnt) && (i < adcSize); i++)
lchResEdits[(firstLch + i)%lch_cnt]->Text = FloatToStrF(adcData[i], ffFixed, 4, 8);
/* если есть данные цифрового выхода, то устанавливаем индикатор
в соответствии с первым значением */
if (dinSize) {
dinResEdit->Text = IntToHex((int)dinData[0]&0x3FFFF, 5);
} else {
dinResEdit->Text = "";
}
}
}
void __fastcall X502_ProcessThread::Execute() {
/* выделяем буферы под принимаемые данные */
uint32_t *rcv_buf = new uint32_t[RECV_BUF_SIZE];
dinData = new uint32_t[RECV_BUF_SIZE];
adcData = new double[RECV_BUF_SIZE];
if (!rcv_buf || !dinData || !adcData) {
err = X502_ERR_MEMORY_ALLOC;
} else {
/* запускаем синхронные потоки */
err = X502_StreamsStart(hnd);
if (err == X502_ERR_OK) {
/* выполняем прием пока не произойдет ошибка или
не будет запроса на останов от основного приложения */
while (!stop && (err == X502_ERR_OK)) {
/* принимаем данные синхронного ввода */
int32_t rcv_size = X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
/* значение меньше нуля означает ошибку... */
if (rcv_size < 0) {
err = rcv_size;
} else if (rcv_size>0) {
/* если больше нуля - значит приняли новые данные */
dinSize=RECV_BUF_SIZE;
adcSize=RECV_BUF_SIZE;
/* получаем номер лог. какнала, соответствующий первому
отсчету АЦП, так как до этого могли обработать
некратное количество кадров */
err = X502_GetNextExpectedLchNum(hnd, &firstLch);
if (err == X502_ERR_OK) {
/* разбираем данные на синхронный ввод и отсчеты АЦП и
переводим АЦП в Вольты */
err = X502_ProcessData(hnd, rcv_buf, rcv_size, L502_PROC_FLAGS_VOLT,
adcData, &adcSize, dinData, &dinSize);
}
if (err == X502_ERR_OK) {
/* обновляем значения элементов управления */
Synchronize(updateData);
}
}
}
/* по выходу из цикла отсанавливаем поток.
Чтобы не сбросить код ошибки (если вышли по ошибке)
результат останова сохраняем в отдельную переменную */
int32_t stop_err = X502_StreamsStop(hnd);
if (err == X502_ERR_OK)
err = stop_err;
}
}
/* освобождаем выделенную память */
delete rcv_buf;
delete dinData;
delete adcData;
}
@@ -0,0 +1,41 @@
//---------------------------------------------------------------------------
#ifndef X502_THREAD_H
#define X502_THREAD_H
#include "l502api.h"
#include "e502api.h"
#include <vcl.h>
class X502_ProcessThread : public TThread {
protected:
void __fastcall Execute();
public:
bool stop; //çàïðîñ íà îñòàíîâ (óñòàíàâëèâàåòñÿ èç îñíîâíîãî ïîòîêà)
int err; //êîä îøèáêè ïðè âûïîëíåíèè ïîòîêà ñáîðà
t_x502_hnd hnd; //îïèñàòåëü ìîäóëÿ
TEdit* lchResEdits[X502_LTABLE_MAX_CH_CNT];
TEdit* dinResEdit;
__fastcall X502_ProcessThread(bool CreateSuspended);
private:
void __fastcall updateData() ;
double* adcData;
uint32_t firstLch; /* íîìåð ïåðâîãî ëîãè÷åñêîãî êàíàëà â áóôåðå ÀÖÏ */
uint32_t adcSize;
uint32_t* dinData;
uint32_t dinSize;
};
//---------------------------------------------------------------------------
#endif
@@ -0,0 +1,681 @@
object MainForm: TMainForm
Left = 630
Top = 162
Width = 585
Height = 774
Caption = 'X502 Example'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object btnRefreshDeviceList: TButton
Left = 8
Top = 8
Width = 217
Height = 25
Caption = #1054#1073#1085#1086#1074#1080#1090#1100' '#1089#1087#1080#1089#1086#1082' '#1091#1089#1090#1088#1086#1081#1089#1090#1074
TabOrder = 0
OnClick = btnRefreshDeviceListClick
end
object cbbDevList: TComboBox
Left = 256
Top = 8
Width = 241
Height = 21
ItemHeight = 13
TabOrder = 1
end
object btnOpen: TButton
Left = 8
Top = 48
Width = 217
Height = 25
Caption = #1054#1090#1082#1088#1099#1090#1100' '#1091#1089#1090#1088#1086#1081#1089#1090#1074#1086
TabOrder = 2
OnClick = btnOpenClick
end
object grpDevInfo: TGroupBox
Left = 256
Top = 40
Width = 241
Height = 169
Caption = #1048#1085#1092#1086#1088#1084#1072#1094#1080#1103' '#1086' '#1084#1086#1076#1091#1083#1077
TabOrder = 3
object lbl1: TLabel
Left = 104
Top = 96
Width = 119
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' '#1055#1051#1048#1057
end
object lbl2: TLabel
Left = 104
Top = 120
Width = 116
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' PLDA'
end
object lbl11: TLabel
Left = 104
Top = 144
Width = 113
Height = 13
Caption = #1042#1077#1088#1089#1080#1103' '#1087#1088#1086#1096#1080#1074#1082#1080' ARM'
end
object chkDacPresent: TCheckBox
Left = 8
Top = 24
Width = 97
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1062#1040#1055
Enabled = False
TabOrder = 0
end
object chkGalPresent: TCheckBox
Left = 8
Top = 40
Width = 177
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1075#1072#1083#1100#1074#1072#1085#1086#1088#1072#1079#1074#1103#1079#1082#1080
Enabled = False
TabOrder = 1
end
object chkDspPresent: TCheckBox
Left = 8
Top = 56
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1080#1075#1085#1072#1083#1100#1085#1086#1075#1086' '#1087#1088#1086#1094#1077#1089#1089#1086#1088#1072
Enabled = False
TabOrder = 2
end
object edtFpgaVer: TEdit
Left = 8
Top = 96
Width = 89
Height = 21
ReadOnly = True
TabOrder = 3
end
object edtPldaVer: TEdit
Left = 8
Top = 120
Width = 89
Height = 21
ReadOnly = True
TabOrder = 4
end
object chkEthPresent: TCheckBox
Left = 8
Top = 72
Width = 209
Height = 17
Caption = #1053#1072#1083#1080#1095#1080#1077' '#1089#1077#1090#1077#1074#1086#1075#1086' '#1080#1085#1090#1077#1088#1092#1077#1081#1089#1072
Enabled = False
TabOrder = 5
end
object edtMcuVer: TEdit
Left = 8
Top = 144
Width = 89
Height = 21
ReadOnly = True
TabOrder = 6
end
end
object btnAsyncDigIn: TButton
Left = 8
Top = 560
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1094#1080#1092#1088#1086#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 4
OnClick = btnAsyncDigInClick
end
object edtAsyncDigIn: TEdit
Left = 248
Top = 560
Width = 121
Height = 21
Enabled = False
TabOrder = 5
Text = '0x0000'
end
object btnAsyncDigOut: TButton
Left = 8
Top = 592
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1094#1080#1092#1088#1086#1074#1099#1093' '#1083#1080#1085#1080#1081
TabOrder = 6
OnClick = btnAsyncDigOutClick
end
object edtAsyncDigOut: TEdit
Left = 248
Top = 592
Width = 121
Height = 21
TabOrder = 7
Text = '0x0000'
end
object grp1: TGroupBox
Left = 8
Top = 224
Width = 513
Height = 65
Caption = #1063#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 8
object lbl3: TLabel
Left = 16
Top = 20
Width = 139
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093' ('#1043#1094')'
end
object lbl4: TLabel
Left = 168
Top = 20
Width = 113
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1085#1072' '#1082#1072#1085#1072#1083' ('#1043#1094')'
end
object lbl5: TLabel
Left = 296
Top = 20
Width = 166
Height = 13
Caption = #1063#1072#1089#1090#1086#1090#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072' ('#1043#1094')'
end
object btnSetAdcFreq: TButton
Left = 432
Top = 32
Width = 73
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100
TabOrder = 0
OnClick = btnSetAdcFreqClick
end
object edtAdcFreq: TEdit
Left = 16
Top = 36
Width = 105
Height = 21
TabOrder = 1
Text = '2000000'
end
object edtAdcFreqLch: TEdit
Left = 176
Top = 36
Width = 105
Height = 21
TabOrder = 2
Text = '2000000'
end
object edtDinFreq: TEdit
Left = 296
Top = 36
Width = 105
Height = 21
TabOrder = 3
Text = '2000000'
end
end
object grp2: TGroupBox
Left = 8
Top = 368
Width = 513
Height = 153
Caption = #1050#1072#1085#1072#1083#1099
TabOrder = 9
object lbl6: TLabel
Left = 8
Top = 40
Width = 31
Height = 13
Caption = #1050#1072#1085#1072#1083
end
object lbl7: TLabel
Left = 64
Top = 40
Width = 49
Height = 13
Caption = #1044#1080#1072#1087#1072#1079#1086#1085
end
object lbl8: TLabel
Left = 152
Top = 40
Width = 88
Height = 13
Caption = #1056#1077#1078#1080#1084' '#1080#1079#1084#1077#1088#1077#1085#1080#1103
end
object lbl9: TLabel
Left = 336
Top = 40
Width = 53
Height = 13
Caption = #1056#1077#1079#1091#1083#1100#1090#1072#1090
end
object lbl10: TLabel
Left = 16
Top = 16
Width = 166
Height = 13
Caption = #1050#1086#1083#1080#1095#1077#1089#1090#1074#1086' '#1083#1086#1075#1080#1095#1077#1089#1082#1080#1093' '#1082#1072#1085#1072#1083#1086#1074
end
object cbbLCh1_Channel: TComboBox
Left = 8
Top = 56
Width = 41
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 0
Text = '1'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh1_Range: TComboBox
Left = 64
Top = 56
Width = 57
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 1
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh1_Mode: TComboBox
Left = 136
Top = 56
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 2
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh1_Result: TEdit
Left = 328
Top = 56
Width = 121
Height = 21
TabOrder = 3
end
object cbbLCh2_Channel: TComboBox
Left = 8
Top = 80
Width = 41
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 4
Text = '2'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh2_Range: TComboBox
Left = 64
Top = 80
Width = 57
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 5
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh2_Mode: TComboBox
Left = 136
Top = 80
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 6
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh2_Result: TEdit
Left = 328
Top = 80
Width = 121
Height = 21
TabOrder = 7
end
object cbbLCh3_Channel: TComboBox
Left = 8
Top = 104
Width = 41
Height = 21
ItemHeight = 13
ItemIndex = 2
TabOrder = 8
Text = '3'
Items.Strings = (
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
'10'
'11'
'12'
'13'
'14'
'15'
'16'
'17'
'18'
'19'
'20'
'21'
'22'
'23'
'24'
'25'
'26'
'27'
'28'
'29'
'30'
'31'
'32')
end
object cbbLCh3_Range: TComboBox
Left = 64
Top = 104
Width = 57
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 9
Text = '10 '#1042
Items.Strings = (
'10 '#1042
'5 '#1042
'2 '#1042
'1 '#1042
'0.5 '#1042
'0.2 '#1042)
end
object cbbLCh3_Mode: TComboBox
Left = 136
Top = 104
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 1
TabOrder = 10
Text = #1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
Items.Strings = (
#1057' '#1086#1073#1097#1077#1081' '#1079#1077#1084#1083#1077#1081
#1044#1080#1092#1092#1077#1088#1077#1085#1094#1080#1072#1083#1100#1085#1099#1081
#1048#1079#1084#1077#1088#1077#1085#1080#1077' '#1085#1091#1083#1103)
end
object edtLCh3_Result: TEdit
Left = 328
Top = 104
Width = 121
Height = 21
TabOrder = 11
end
object chkSyncDin: TCheckBox
Left = 120
Top = 128
Width = 185
Height = 17
Caption = #1056#1072#1079#1088#1072#1096#1077#1085#1080#1077' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072
TabOrder = 12
OnClick = chkSyncDinClick
end
object edtDin_Result: TEdit
Left = 328
Top = 128
Width = 121
Height = 21
TabOrder = 13
end
object cbbLChCnt: TComboBox
Left = 192
Top = 16
Width = 73
Height = 21
ItemHeight = 13
ItemIndex = 2
TabOrder = 14
Text = '3'
Items.Strings = (
'1'
'2'
'3')
end
end
object btnAsyncAdcFrame: TButton
Left = 8
Top = 528
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1074#1086#1076' '#1082#1072#1076#1088#1072' '#1040#1062#1055
TabOrder = 10
OnClick = btnAsyncAdcFrameClick
end
object btnStop: TButton
Left = 8
Top = 112
Width = 217
Height = 25
Caption = #1054#1089#1090#1072#1085#1086#1074' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
Enabled = False
TabOrder = 11
OnClick = btnStopClick
end
object btnStart: TButton
Left = 8
Top = 80
Width = 217
Height = 25
Caption = #1047#1072#1087#1091#1089#1082' '#1089#1073#1086#1088#1072' '#1076#1072#1085#1085#1099#1093
TabOrder = 12
OnClick = btnStartClick
end
object btnAsyncDac1: TButton
Left = 8
Top = 624
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'1 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 13
OnClick = btnAsyncDac1Click
end
object edtAsyncDac1: TEdit
Left = 248
Top = 624
Width = 81
Height = 21
TabOrder = 14
Text = '5'
end
object edtAsyncDac2: TEdit
Left = 248
Top = 656
Width = 81
Height = 21
TabOrder = 15
Text = '5'
end
object btnAsyncDac2: TButton
Left = 8
Top = 656
Width = 217
Height = 25
Caption = #1040#1089#1080#1085#1093#1088#1086#1085#1085#1099#1081' '#1074#1099#1074#1086#1076' '#1085#1072' '#1062#1040#1055'2 ('#1042#1086#1083#1100#1090#1099')'
TabOrder = 16
OnClick = btnAsyncDac2Click
end
object GroupBox4: TGroupBox
Left = 8
Top = 295
Width = 513
Height = 65
Caption = #1057#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1103
TabOrder = 17
object Label10: TLabel
Left = 16
Top = 20
Width = 173
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1095#1072#1089#1090#1086#1090#1099' '#1089#1080#1085#1093#1088#1086#1085#1080#1079#1072#1094#1080#1080
end
object Label11: TLabel
Left = 264
Top = 20
Width = 238
Height = 13
Caption = #1048#1089#1090#1086#1095#1085#1080#1082' '#1079#1072#1087#1091#1089#1082#1072' '#1089#1080#1085#1093#1088#1086#1085#1085#1086#1075#1086' '#1074#1074#1086#1076#1072'/'#1074#1099#1074#1086#1076#1072
end
object cbbSyncMode: TComboBox
Left = 16
Top = 38
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 0
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
object cbbSyncStartMode: TComboBox
Left = 264
Top = 38
Width = 169
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 1
Text = #1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
Items.Strings = (
#1042#1085#1091#1090#1088#1077#1085#1085#1080#1081
#1054#1090' '#1074#1085#1077#1096#1085#1077#1075#1086' '#1084#1072#1089#1090#1077#1088#1072
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1060#1088#1086#1085#1090' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN1'
#1057#1087#1072#1076' '#1089#1080#1075#1085#1072#1083#1072' DI_SYN2')
end
end
object btnOpenByIP: TButton
Left = 8
Top = 160
Width = 217
Height = 25
Caption = #1059#1089#1090#1072#1085#1086#1074#1080#1090#1100' '#1089#1086#1077#1076#1080#1085#1077#1085#1080#1077' '#1087#1086' IP-'#1072#1076#1088#1077#1089#1091
TabOrder = 18
OnClick = btnOpenByIPClick
end
object edtIpAddr: TEdit
Left = 8
Top = 192
Width = 217
Height = 21
TabOrder = 19
Text = '192.168.0.1'
end
end
@@ -0,0 +1,712 @@
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,
l502api, x502api, e502api, X502_ProcessThread;
type
TMainForm = class(TForm)
btnRefreshDeviceList: TButton;
cbbDevList: TComboBox;
btnOpen: TButton;
grpDevInfo: TGroupBox;
chkDacPresent: TCheckBox;
chkGalPresent: TCheckBox;
chkDspPresent: TCheckBox;
edtFpgaVer: TEdit;
edtPldaVer: TEdit;
lbl1: TLabel;
lbl2: TLabel;
btnAsyncDigIn: TButton;
edtAsyncDigIn: TEdit;
btnAsyncDigOut: TButton;
edtAsyncDigOut: TEdit;
grp1: TGroupBox;
lbl3: TLabel;
lbl4: TLabel;
lbl5: TLabel;
btnSetAdcFreq: TButton;
edtAdcFreq: TEdit;
edtAdcFreqLch: TEdit;
edtDinFreq: TEdit;
grp2: TGroupBox;
lbl6: TLabel;
lbl7: TLabel;
lbl8: TLabel;
lbl9: TLabel;
lbl10: TLabel;
cbbLCh1_Channel: TComboBox;
cbbLCh1_Range: TComboBox;
cbbLCh1_Mode: TComboBox;
edtLCh1_Result: TEdit;
cbbLCh2_Channel: TComboBox;
cbbLCh2_Range: TComboBox;
cbbLCh2_Mode: TComboBox;
edtLCh2_Result: TEdit;
cbbLCh3_Channel: TComboBox;
cbbLCh3_Range: TComboBox;
cbbLCh3_Mode: TComboBox;
edtLCh3_Result: TEdit;
chkSyncDin: TCheckBox;
edtDin_Result: TEdit;
cbbLChCnt: TComboBox;
btnAsyncAdcFrame: TButton;
btnStop: TButton;
btnStart: TButton;
btnAsyncDac1: TButton;
edtAsyncDac1: TEdit;
edtAsyncDac2: TEdit;
btnAsyncDac2: TButton;
GroupBox4: TGroupBox;
Label10: TLabel;
Label11: TLabel;
cbbSyncMode: TComboBox;
cbbSyncStartMode: TComboBox;
chkEthPresent: TCheckBox;
edtMcuVer: TEdit;
lbl11: TLabel;
btnOpenByIP: TButton;
edtIpAddr: TEdit;
procedure btnRefreshDeviceListClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure btnAsyncDigInClick(Sender: TObject);
procedure btnAsyncDigOutClick(Sender: TObject);
procedure btnSetAdcFreqClick(Sender: TObject);
procedure btnAsyncAdcFrameClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure btnAsyncDac1Click(Sender: TObject);
procedure btnAsyncDac2Click(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure chkSyncDinClick(Sender: TObject);
procedure btnOpenByIPClick(Sender: TObject);
private
hnd : t_x502_hnd; //îïèñàòåëü ìîäóëÿ
devrecList : array of t_x502_devrec;
threadRunning : Boolean; //ïðèçíàê, çàïóùåí ëè ïîòîê ñáîðà äàííûõ
thread: TX502_ProcessThread; //ïîòîê äëÿ ñèíõðîííîãî ââîäà
procedure updateControls();
procedure freeDevList();
procedure refreshDeviceList();
procedure showDevInfo();
procedure closeDevice();
procedure OnThreadTerminate(par : TObject);
function setAdcFreq() : LongInt;
function setupParams() : LongInt;
function setSyncDinStream() : LongInt;
function parseIpAddr(addr : string) : LongWord;
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.updateControls();
begin
//êíîïêà îáíîâèòü ñïèñîê äîñòóïíà ïîêà íå îòêðûëè óñòðîéñòâî
btnRefreshDeviceList.Enabled := hnd=nil;
cbbDevList.Enabled:= hnd=nil;
if hnd = nil then
btnOpen.Caption := 'Óñòàíîâèòü ñâÿçü ñ ìîäóëåì'
else
btnOpen.Caption := 'Ðàçîðâàòü ñâÿçü ñ ìîäóëåì';
btnOpen.Enabled := (hnd<>nil) or (cbbDevList.ItemIndex >= 0);
btnOpenByIP.Enabled := hnd=nil;
edtIpAddr.Enabled := hnd=nil;
chkSyncDin.Enabled := (hnd<>nil) and not threadRunning;
btnStart.Enabled := (hnd<>nil) and not threadRunning;
btnStop.Enabled := (hnd<>nil) and threadRunning;
btnSetAdcFreq.Enabled := (hnd<>nil) and not threadRunning;
btnAsyncDigOut.Enabled := (hnd<>nil);
btnAsyncDigIn.Enabled := (hnd<>nil);
btnAsyncDac1.Enabled := (hnd<>nil) and chkDacPresent.Checked;
btnAsyncDac2.Enabled := (hnd<>nil) and chkDacPresent.Checked;
btnAsyncAdcFrame.Enabled := (hnd<>nil) and not threadRunning;
end;
procedure TMainForm.freeDevList();
begin
if Length(devrecList) <> 0 then
begin
X502_FreeDevRecordList(devrecList, Length(devrecList));
SetLength(devrecList, 0);
end;
cbbDevList.Items.Clear;
end;
{ Ôóíêöèÿ îáíîâëÿåò ñïèñîê ñåðèéíûõ íîìåðîâ ïîäêëþ÷åííûõ óñòðîéñòâ }
procedure TMainForm.refreshDeviceList();
var
//óêàçàòåëü íà ìàññèâ ñåðèéíûõ íîìåðîâ, êîòîðûé âûäåëèì äèíàìè÷åñêè
res,i, old_index : LongInt;
devcnt : LongWord;
pci_devrecs, usb_devrecs : array of t_x502_devrec;
begin
old_index := cbbDevList.ItemIndex;
freeDevList;
L502_GetDevRecordsList(pci_devrecs, 0, devcnt);
if devcnt > 0 then
begin
//óñòàíàâëèâàåì ðàçìåð ìàññèâà, ÷òîáû åãî õâàòàëî äëÿ íóæíîãî êîë-âà íîìåðîâ
SetLength(pci_devrecs, devcnt);
//ïîëó÷àåì ñåðèéíûå íîìåðà ìîäóëåé
res := L502_GetDevRecordsList(pci_devrecs, 0);
if res > 0 then
SetLength(pci_devrecs, res)
else
SetLength(pci_devrecs, 0);
end;
E502_UsbGetDevRecordsList(usb_devrecs, 0, devcnt);
if devcnt > 0 then
begin
//óñòàíàâëèâàåì ðàçìåð ìàññèâà, ÷òîáû åãî õâàòàëî äëÿ íóæíîãî êîë-âà íîìåðîâ
SetLength(usb_devrecs, devcnt);
//ïîëó÷àåì ñåðèéíûå íîìåðà ìîäóëåé
res := E502_UsbGetDevRecordsList(usb_devrecs, 0);
if res > 0 then
SetLength(usb_devrecs, res)
else
SetLength(usb_devrecs, 0);
end;
// Â devrecList ñîõðàíÿåì îáà ìàññèâà çàïèñåé
SetLength(devrecList, Length(pci_devrecs) + Length(usb_devrecs));
if Length(devrecList) > 0 then
begin
for i:=0 to Length(pci_devrecs)-1 do
devrecList[i] := pci_devrecs[i];
for i:=0 to Length(usb_devrecs)-1 do
devrecList[i+Length(pci_devrecs)] := usb_devrecs[i];
// äîáàâëÿåì âñå íàéäåííûå çàïèñè â ñïèñîê ComboBox'à äëÿ âûáîðà
for i:=0 to Length(devrecList)-1 do
cbbDevList.Items.Add(AnsiString(devrecList[i].devname) + ', ' + AnsiString(devrecList[i].serial));
//åñëè äî îáíîâëåíèÿ ñïèñêà áûë âûáðàí äåéñòâèòåëüíûé èíäåêñ - âîññòàíàâëèâàåì åãî
if (old_index >= 0) and (old_index < Length(pci_devrecs)) then
cbbDevList.ItemIndex := old_index
else
cbbDevList.ItemIndex := 0;
end;
updateControls;
end;
// Óñòàíîâêà ïåðàìåòðîâ ñáîðà ìîäóëÿ â ñîîòâåòñòâèè ñ ýëåìåíòàìè GUI
function TMainForm.setupParams() : Integer;
var
err : Integer;
lch_cnt : LongWord;
const
{ òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ ðåæèìà èçìåðåíèÿ }
mode_tbl: array[0..2] of LongWord = (X502_LCH_MODE_COMM, X502_LCH_MODE_DIFF, X502_LCH_MODE_ZERO);
{ òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ äèàïàçîíîâ ÀÖÏ }
range_tbl: array[0..5] of LongWord = (X502_ADC_RANGE_10, X502_ADC_RANGE_5, X502_ADC_RANGE_2,
X502_ADC_RANGE_1, X502_ADC_RANGE_05, X502_ADC_RANGE_02);
{ òàáëèöà ñîîòâåòñòâèÿ èíäåêñîâ â ComboBox è êîäîâ èñòî÷íèêà ñèíõðîíèçàöèè }
f_sync_tbl: array[0..5] of LongWord = (X502_SYNC_INTERNAL, X502_SYNC_EXTERNAL_MASTER,
X502_SYNC_DI_SYN1_RISE, X502_SYNC_DI_SYN2_RISE,
X502_SYNC_DI_SYN1_FALL, X502_SYNC_DI_SYN2_FALL);
begin
lch_cnt := cbbLChCnt.ItemIndex + 1;
// Óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ
err := X502_SetLChannelCount(hnd, lch_cnt);
// Íàñòðàíèâàåì òàáëèöó ëîãè÷åñêèõ êàíàëîâ
if err = X502_ERR_OK then
begin
err := X502_SetLChannel(hnd,0, cbbLCh1_Channel.ItemIndex,
mode_tbl[cbbLCh1_Mode.ItemIndex], range_tbl[cbbLCh1_Range.ItemIndex],0);
end;
if (err = X502_ERR_OK) and (lch_cnt>=2) then
begin
err := X502_SetLChannel(hnd,1, cbbLCh2_Channel.ItemIndex,
mode_tbl[cbbLCh2_Mode.ItemIndex], range_tbl[cbbLCh2_Range.ItemIndex],0);
end;
if (err = X502_ERR_OK) and (lch_cnt>=3) then
begin
err := X502_SetLChannel(hnd,2, cbbLCh3_Channel.ItemIndex,
mode_tbl[cbbLCh3_Mode.ItemIndex], range_tbl[cbbLCh3_Range.ItemIndex],0);
end;
// Íàñòðàèâàåì èñòî÷íèê ÷àñòîòû ñèíõðîíèçàöèè è çàïóñêà ñáîðà
if err = X502_ERR_OK then
err := X502_SetSyncMode(hnd, f_sync_tbl[cbbSyncMode.ItemIndex]);
if err = X502_ERR_OK then
err := X502_SetSyncStartMode(hnd, f_sync_tbl[cbbSyncStartMode.ItemIndex]);
// íàñòðàèâàåì ÷àñòîòó ñáîðà ñ ÀÖÏ
if err = X502_ERR_OK then
err := setAdcFreq();
// Çàïèñûâàåì íàñòðîéêè â ìîäóëü
if err = X502_ERR_OK then
err := X502_Configure(hnd, 0);
setupParams:= err;
end;
procedure TMainForm.closeDevice();
begin
if hnd<>nil then
begin
//åñëè çàïóùåí ïîòîê ñáîðà äàííûõ - òî îñòàíàâëèâàåì åãî
if threadRunning then
begin
thread.stop:=True;
thread.WaitFor;
end;
// çàêðûòèå ñâÿçè ñ ìîäóëåì
X502_Close(hnd);
// îñâîáîæäåíèå îïèñàòåëÿ
X502_Free(hnd);
hnd := nil;
end;
end;
//óñòàíîâêà ÷àñòîòû ÀÖÏ â ñîîòâåòñòâèè ñî çíà÷åíèÿìè
//ýëåìåíòîâ óïðàâëåíèÿ, è îáíîâëåíèå èõ â ñîîòâåòñòâèè
//ñ ðåàëüíî óñòàíîâëåííûìè
function TMainForm.setAdcFreq() : Integer;
var f_acq, f_lch, f_din: Double;
err : Integer;
begin
f_acq := StrToFloat(edtAdcFreq.Text);
f_lch := StrToFloat(edtAdcFreqLch.Text);
f_din := StrToFloat(edtDinFreq.Text);
// óñòàíàâëèâàåì òðåáóåìóþ ÷àñòîòó ñáîðà.
err := X502_SetAdcFreq(hnd, f_acq, f_lch);
if err = X502_ERR_OK then
begin
// îáíîâëÿåì çíà÷åíèå èíäèêàòîðà, äëÿ îòîáðàæåíèÿ
// ðåàëüíî óñòàíîâèâøåéñÿ ÷àñòîòû
edtAdcFreq.Text := FloatToStr(f_acq);
edtAdcFreqLch.Text := FloatToStr(f_lch);
// Óñòàíàâëèâàåì ÷àñòîòó ñèíõðîííîãî ñáîðà
err := X502_SetDinFreq(hnd, f_din);
if err = X502_ERR_OK then
edtDinFreq.Text := FloatToStr(f_din);
end;
setAdcFreq:= err;
end;
function TMainForm.setSyncDinStream : LongInt;
var err : LongInt;
begin
{ ðàçðåøàåì èëè çàïðåùàåì ïîòîê ñèíõðîííîãî ââîäà
â çàâèñèìîñòè îò ñîñòîÿíèÿ ïåðåêëþ÷àòåëÿ }
if chkSyncDin.Checked then
err := X502_StreamsEnable(hnd, X502_STREAM_DIN)
else
err := X502_StreamsDisable(hnd, X502_STREAM_DIN);
setSyncDinStream:= err;
end;
procedure TMainForm.btnRefreshDeviceListClick(Sender: TObject);
begin
refreshDeviceList;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
hnd := nil;
refreshDeviceList;
end;
procedure TMainForm.showDevInfo();
var
err : LongInt;
info : t_x502_info;
begin
//ïîëó÷àåì èíôîðìàöèþ î óñòðîéñòâå
err := X502_GetDevInfo(hnd,info);
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà ïîëó÷åíèÿ èíôîðìàöèè î óñòðîéñòâå: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
//ïðè îøèáêå çàêðûâàåì ñâÿçü ñ óñòðîéñòâîì
X502_Close(hnd);
X502_Free(hnd);
hnd := nil;
end
else
begin
//âûâîäèì ïðîè÷èòàííóþ èíôîðìàöèþ íà èíäèêàòîðû
chkDacPresent.Checked := (info.devflags and X502_DEVFLAGS_DAC_PRESENT) <> 0;
chkGalPresent.Checked := (info.devflags and X502_DEVFLAGS_GAL_PRESENT) <> 0;
chkDspPresent.Checked := (info.devflags and X502_DEVFLAGS_BF_PRESENT) <> 0;
chkEthPresent.Checked := (info.devflags and X502_DEVFLAGS_IFACE_SUPPORT_ETH) <> 0;
edtPldaVer.Text := IntToStr(info.plda_ver);
edtFpgaVer.Text := IntToStr((info.fpga_ver shr 8) and $FF) + '.' +
IntToStr(info.fpga_ver and $FF);
if info.mcu_firmware_ver <> 0 then
begin
edtMcuVer.Text := IntToStr((info.mcu_firmware_ver shr 24) and $FF) + '.' +
IntToStr((info.mcu_firmware_ver shr 16) and $FF) + '.' +
IntToStr((info.mcu_firmware_ver shr 8) and $FF) + '.' +
IntToStr((info.mcu_firmware_ver) and $FF);
end
else
begin
edtMcuVer.Text := '';
end;
end;
end;
procedure TMainForm.btnOpenClick(Sender: TObject);
var
idx : integer;
err : LongInt;
begin
if hnd=nil then
begin
// ïîëó÷àåì èíäåêñ âûáðàííîãî ìîäóëÿ
idx := cbbDevList.ItemIndex;
if (idx >= 0) and (idx < Length(devrecList)) then
begin
//ñîçäàåì îïèñàòåëü
hnd := X502_Create();
if hnd=nil then
MessageDlg('Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ',mtError, [mbOK], 0)
else
begin
// îòêðûâàåì ìîäóëü, ñîîòâåòñòâóþùèé çàïèñè ñ âûáðàííûì èíäåêñîì
err := X502_OpenByDevRecord(hnd, devrecList[idx]);
if err <> X502_ERR_OK then
begin
// Íå ñìîãëè îòêðûòü => îñâîáîæäàåì îïèñàòåëü
MessageDlg('Îøèáêà îòêðûòèÿ ìîäóëÿ: ' + X502_GetErrorString(err),mtError, [mbOK], 0);
X502_Free(hnd);
hnd := nil;
end
else
begin
showDevInfo;
end;
end;
end;
end
else
begin
//åñëè óñòðîéñòâî áûëî îòêðûòî - çàêðûâàåì
closeDevice;
end;
updateControls;
end;
{ ïðåîáðàçîâàíèå ñòðîêè ñ ip-àäðåñîì â DWORD }
function TMainForm.parseIpAddr(addr : string) : LongWord;
var
S: TStrings;
begin
S := TStringList.Create;
S.Delimiter := '.';
S.DelimitedText := addr;
// do preeliminary check. The IP4 Address string must consists of 4 parts. Less or more than that would be invalid values
if S.Count<>4 then
begin
S.Free;
raise Exception.Create('Invalid IP4 Address string');
end;
Result := (StrToInt(S[0]) shl 24) + (StrToInt(S[1]) shl 16) +
(StrToInt(S[2]) shl 8) + (StrToInt(S[3]));
S.Free;
end;
procedure TMainForm.btnOpenByIPClick(Sender: TObject);
var
devrec : t_x502_devrec;
err : LongInt;
begin
// Ñîçäàåì çàïèñü, ñîîòâåòñòâóþùóþ çàäàííîìó àäðåñó
err := E502_MakeDevRecordByIpAddr(devrec, parseIpAddr(edtIpAddr.Text), 0, 5000);
if err <> X502_ERR_OK then
MessageDlg('Îøèáêà ñîçäàíèÿ çàïèñè: ' + X502_GetErrorString(err),mtError, [mbOK], 0)
else
begin
// Ñîçäàíèå îïèñàòåëÿ ìîäóëÿ
hnd := X502_Create;
if hnd=nil then
MessageDlg('Îøèáêà ñîçäàíèÿ îïèñàòåëÿ ìîäóëÿ',mtError, [mbOK], 0)
else
begin
// óñòàíàâëèâàåì ñâÿçü ïî ñîçäàííîé çàïèñè
err := X502_OpenByDevRecord(hnd, devrec);
if err <> X502_ERR_OK then
begin
// Íå ñìîãëè îòêðûòü => îñâîáîæäàåì îïèñàòåëü
MessageDlg('Îøèáêà îòêðûòèÿ ìîäóëÿ: ' + X502_GetErrorString(err),mtError, [mbOK], 0);
X502_Free(hnd);
hnd := nil;
end
else
begin
showDevInfo;
end;
end;
X502_FreeDevRecordList(devrec);
end;
updateControls();
end;
procedure TMainForm.btnAsyncDigInClick(Sender: TObject);
var din: Cardinal;
var err: Integer;
begin
if hnd<>nil then
begin
err := X502_AsyncInDig(hnd, din);
if err<>X502_ERR_OK then
MessageDlg('Îøèáêà àñèíõðîííîãî ââîäà ñ öèôðîâûõ ëèíèé: ' + X502_GetErrorString(err),
mtError, [mbOK], 0)
else
edtAsyncDigIn.Text := IntToHex(din and $3FFFF, 5);
end;
end;
procedure TMainForm.btnAsyncDigOutClick(Sender: TObject);
var dout: Cardinal;
var err: Integer;
begin
if hnd<>nil then
begin
dout:= StrToInt(edtAsyncDigOut.Text);
err := X502_AsyncOutDig(hnd, dout, 0);
if err <> X502_ERR_OK then
MessageDlg('Îøèáêà àñèíõðîííîãî âûâîäà öèôðîâûõ ëèíèé: ' + X502_GetErrorString(err),
mtError, [mbOK], 0)
end;
end;
procedure TMainForm.btnSetAdcFreqClick(Sender: TObject);
var err : Integer;
begin
{ óñòàíàâëèâàåì êîë-âî ëîãè÷åñêèõ êàíàëîâ, ÷òîáû ïðàâèëüíî
ðàñ÷èòàòü ÷àñòîòó íà êàíàë }
err := X502_SetLChannelCount(hnd, cbbLChCnt.ItemIndex+1);
if err = X502_ERR_OK then
err := setAdcFreq();
if err <> X502_ERR_OK then
MessageDlg('Îøèáêà óñòàíîâêè ÷àñòîòû: ' + X502_GetErrorString(err),
mtError, [mbOK], 0)
end;
procedure TMainForm.btnAsyncAdcFrameClick(Sender: TObject);
var err : Integer;
adc_data : array of double;
lch_cnt : LongWord;
begin
if hnd <> nil then
begin
// óñòàíàâëèâàåì ïàðàìåòðû ìîäóëÿ
err := setupParams();
if err = X502_ERR_OK then
err := X502_GetLChannelCount(hnd, lch_cnt);
if err = X502_ERR_OK then
begin
// óñòàíàâëèâàåì ðàçìåð ìàññèâà ðàâíûì êîëè÷åñòâó ëîãè÷åñêèõ êàíàëîâ
SetLength(adc_data, lch_cnt);
err := X502_AsyncGetAdcFrame(hnd, X502_PROC_FLAGS_VOLT, 1000, adc_data);
if err = X502_ERR_OK then
begin
//âûâîäèì ðåçóëüòàò
edtLCh1_Result.Text := FloatToStrF(adc_data[0], ffFixed, 4, 8);
if lch_cnt >= 2 then
edtLCh2_Result.Text := FloatToStrF(adc_data[1], ffFixed, 4, 8)
else
edtLCh2_Result.Text := '';
if lch_cnt >= 3 then
edtLCh3_Result.Text := FloatToStrF(adc_data[2], ffFixed, 4, 8)
else
edtLCh3_Result.Text := '';
end
else
begin
MessageDlg('Îøèáêà ïðèåìà êàäðà ÀÖÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end
end
else
begin
MessageDlg('Îøèáêà íàñòðîéêè ïàðàìåòðîâ ÀÖÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnStartClick(Sender: TObject);
var
err : LongInt;
begin
//íàñòðàèâàåì âñå ïàðàìåòðû â ñîîòâåòñòâèè ñ ýëåìåíòàìè óïðàâëåíèÿ
err := setupParams();
//ðàçðåøàåì ñèíõðîííûé ââîä ÀÖÏ
if err = X502_ERR_OK then
err := X502_StreamsEnable(hnd, X502_STREAM_ADC);
// ðàçðåøàåì ñèíõðîííûé ââîä ñ öèôðîâûõ ëèíèé â çàâèñèìîñòè îò ïåðåêëþ÷àòåëÿ
if err = X502_ERR_OK then
err := setSyncDinStream();
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà íàñòðîéêè ïàðàìåòðîâ ìîäóëÿ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end
else
begin
if thread <> nil then
begin
FreeAndNil(thread);
end;
thread := TX502_ProcessThread.Create(True);
thread.hnd := hnd;
SetLength(thread.LChEdits, 3);
thread.LChEdits[0] := edtLCh1_Result;
thread.LChEdits[1] := edtLCh2_Result;
thread.LChEdits[2] := edtLCh3_Result;
thread.dinResEdit := edtDin_Result;
edtLCh1_Result.Text:= '';
edtLCh2_Result.Text:= '';
edtLCh3_Result.Text:= '';
edtDin_Result.Text:= '';
{ óñòàíàâëèâàåì ôóíêöèþ íà ñîáûòèå çàâåðøåíèÿ ïîòîêà (â ÷àñòíîñòè
÷òîáû îòñëåäèòü, åñëè ïîòîê çàâåðøèëñÿ ñàì èç-çà îøèáêè ïðè ñáîðå
äàííûõ) }
thread.OnTerminate := OnThreadTerminate;
thread.Resume; //äëÿ Delphi 2010 è âûøå ðåêîìåíäóåòñÿ èñïîëüçîâàòü Start
threadRunning := True;
updateControls;
end;
end;
//ôóíêöèÿ, âûçûâàåìàÿ ïî çàâåðøåíèþ ïîòîêà ñáîðà äàííûõ
//ðàçðåøàåò ñòàðò íîâîãî, óñòàíàâëèâàåò thread_run
procedure TMainForm.OnThreadTerminate(par : TObject);
begin
if thread.err <> X502_ERR_OK then
begin
MessageDlg('Ñáîð äàííûõ çàâåðøåí ñ îøèáêîé: ' + X502_GetErrorString(thread.err),
mtError, [mbOK], 0);
end;
threadRunning := false;
updateControls();
end;
procedure TMainForm.btnAsyncDac1Click(Sender: TObject);
var
err : LongInt;
val : Double;
begin
if hnd<>nil then
begin
val := StrToFloat(edtAsyncDac1.Text);;
err := X502_AsyncOutDac(hnd, X502_DAC_CH1, val, X502_DAC_FLAGS_CALIBR or
X502_DAC_FLAGS_VOLT);
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà âûâîäà íà ÖÀÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnAsyncDac2Click(Sender: TObject);
var
err : LongInt;
val : Double;
begin
if hnd<>nil then
begin
val := StrToFloat(edtAsyncDac2.Text);;
err := X502_AsyncOutDac(hnd, X502_DAC_CH2, val, X502_DAC_FLAGS_CALIBR or
X502_DAC_FLAGS_VOLT);
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà âûâîäà íà ÖÀÏ: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
procedure TMainForm.btnStopClick(Sender: TObject);
begin
// óñòàíàâëèâàåì çàïðîñ íà çàâåðøåíèå ïîòîêà
if threadRunning then
thread.stop:=True;
btnStop.Enabled:= False;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
closeDevice;
freeDevList;
if thread <> nil then
FreeAndNil(thread);
end;
procedure TMainForm.chkSyncDinClick(Sender: TObject);
var err : LongInt;
begin
if hnd<>nil then
begin
err := setSyncDinStream();
if err <> X502_ERR_OK then
begin
MessageDlg('Îøèáêà ðàçðåøåíèÿ/çàïðåòà ñèíõðîííîãî ââîäà: ' + X502_GetErrorString(err),
mtError, [mbOK], 0);
end;
end;
end;
end.
@@ -0,0 +1,123 @@
unit X502_ProcessThread;
interface
uses Classes, Math, SyncObjs,StdCtrls,SysUtils, x502api;
const RECV_BUF_SIZE = 8*1024*1024;
const RECV_TOUT = 250;
type TX502_ProcessThread = class(TThread)
public
LChEdits : array of TEdit;
dinResEdit : TEdit;
hnd: t_x502_hnd; //îïèñàòåëü ìîäóëÿ
err : LongInt; //êîä îøèáêè ïðè âûïîëíåíèè ïîòîêà ñáîðà
stop : Boolean; //çàïðîñ íà îñòàíîâ (óñòàíàâëèâàåòñÿ èç îñíîâíîãî ïîòîêà)
constructor Create(SuspendCreate : Boolean);
destructor Free();
private
{ Private declarations }
adcData : array [0..RECV_BUF_SIZE-1] of double;
dinData : array [0..RECV_BUF_SIZE-1] of LongWord;
adcSize, dinSize, firstLch : LongWord;
procedure updateData;
protected
procedure Execute; override;
end;
implementation
constructor TX502_ProcessThread.Create(SuspendCreate : Boolean);
begin
Inherited Create(SuspendCreate);
stop:=False;
hnd:=Nil;
err:=X502_ERR_OK;
end;
destructor TX502_ProcessThread.Free();
begin
Inherited Free();
end;
{ îáíîâëåíèå èíäèêàòîðîâ ôîðìû ðåçóëüòàòàìè ïîñëåäíåãî èçìåðåíèÿ.
Ìåòîä äîëæåí âûïîëíÿòüñÿ òîëüêî ÷åðåç Syncronize, êîòîðûé íóæåí
äëÿ äîñòóïà ê ýëåìåíòàì VCL íå èç îñíîâíîãî ïîòîêà }
procedure TX502_ProcessThread.updateData;
var
lch_cnt, i : LongWord;
err : LongInt;
begin
err := X502_GetLChannelCount(hnd, lch_cnt);
if err=X502_ERR_OK then
begin
// óñòàíàâëèâàåì â èíäèêàòîðàõ çíà÷åíèå ïåðâîãî îòñ÷åòà èç ìàññèâà
for i:=0 to Min(lch_cnt, adcSize) do
LChEdits[(firstLch + i) mod lch_cnt].Text := FloatToStrF(adcData[i], ffFixed, 4, 8);
{ åñëè åñòü äàííûå öèôðîâîãî âûõîäà, òî óñòàíàâëèâàåì èíäèêàòîð
â ñîîòâåòñòâèè ñ ïåðâûì çíà÷åíèåì }
if dinSize <> 0 then
dinResEdit.Text := IntToHex(dinData[0] and $3FFFF, 5)
else
dinResEdit.Text := '';
end;
end;
procedure TX502_ProcessThread.Execute;
var
stoperr, rcv_size : LongInt;
rcv_buf : array of LongWord;
begin
setlength(rcv_buf, RECV_BUF_SIZE);
// çàïóñêàåì ñèíõðîííûå ïîòîêè
err:= X502_StreamsStart(hnd);
if err = X502_ERR_OK then
begin
{ âûïîëíÿåì ïðèåì ïîêà íå ïðîèçîéäåò îøèáêà èëè
íå áóäåò çàïðîñà íà îñòàíîâ îò îñíîâíîãî ïðèëîæåíèÿ }
while not stop and (err = X502_ERR_OK) do
begin
//ïðèíèìàåì äàííûå ñèíõðîííîãî ââîäà
rcv_size := X502_Recv(hnd, rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
// çíà÷åíèå ìåíüøå íóëÿ îçíà÷àåò îøèáêó...
if rcv_size < 0 then
err := rcv_size
else if rcv_size>0 then
begin
//åñëè áîëüøå íóëÿ - çíà÷èò ïðèíÿëè íîâûå äàííûå
dinSize:=RECV_BUF_SIZE;
adcSize:=RECV_BUF_SIZE;
{ ïîëó÷àåì íîìåð ëîã. êàêíàëà, ñîîòâåòñòâóþùèé ïåðâîìó
îòñ÷åòó ÀÖÏ, òàê êàê äî ýòîãî ìîãëè îáðàáîòàòü
íåêðàòíîå êîëè÷åñòâî êàäðîâ }
err:=X502_GetNextExpectedLchNum(hnd, firstLch);
if err = X502_ERR_OK then
begin
{ ðàçáèðàåì äàííûå íà ñèíõðîííûé ââîä è îòñ÷åòû ÀÖÏ è
ïåðåâîäèì ÀÖÏ â Âîëüòû }
err := X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adcData, adcSize, dinData, dinSize);
if err = X502_ERR_OK then
begin
// îáíîâëÿåì çíà÷åíèÿ ýëåìåíòîâ óïðàâëåíèÿ
Synchronize(updateData);
end;
end;
end
end;
{ Ïî âûõîäó èç öèêëà îòñàíàâëèâàåì ïîòîê.
×òîáû íå ñáðîñèòü êîä îøèáêè (åñëè âûøëè ïî îøèáêå)
ðåçóëüòàò îñòàíîâà ñîõðàíÿåì â îòäåëüíóþ ïåðåìåííóþ }
stoperr:= X502_StreamsStop(hnd);
if err = X502_ERR_OK then
err:= stoperr;
end;
end;
end.
@@ -0,0 +1,24 @@
Данный пример демонстрирует работу с модулеми L502 и E502 из среды Delphi.
Пример содержит файл проекта для среды "Delphi 7" (x502_example.dpr) и для
среды "Embarcadero Delphi XE" (x502_example.dproj).
В последнем проекте также добавлена платформа Win64, для сборки 64-битных приложений.
В проекте необходимо указать путь к файлам x502api.pas, l502api.pas и e502api.pas,
которые устанавливаются вместе с SDK в SDK_DIR/pas
Путь можно задать следующим образом:
Delphi 7 - "Project->Options->Directories/Conditionals->Search path",
Delphi XE - "Project->Options->Delphi Compiler->Search path"
Проект демонстрирует в первую очередь как можно работать с модулями L502 и E502, а не как нужно программировать
в среде Delphi.
Пример аналогичен примеру для "Borland C++ Builder" и демонстрирует синхронный потоковый
ввод с АЦП для трех логических каналов с возможностью запуска синхронного ввода с цифроых линий, а так же
асинхронный ввод/вывод для цифровых линий, ЦАП и асинхронный ввод одного кадра АЦП.
Синхронный ввод осуществляется в отдельном потоке (TX502_ProcessThread), который создается
и запускается по нажатию кнопки. В потоке осуществляется прием, обработка данных и вывод их
на индикаторы (указатели на элементы индикаторов сохраняются в объекте потока перед его запуском).
@@ -0,0 +1,141 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=1
UnsafeCode=1
UnsafeCast=1
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=c:\Program Files (x86)\L-Card\lpcie\pas\
Packages=vcl;rtl;dbrtl;inet;inetdb;dsnap;bdertl;vclx;vcldb;vcldbx;visualclx;visualdbclx;vclactnband;vclshlctrls;vclie;xmlrtl;inetdbbde;inetdbxpress;webdsnap;soaprtl;websnap;adortl;dbexpress;dsnapcon;dbxcds;ibxpress;teeui;teedb;tee;dss;indy;VclSmp;qrpt;teeqr;Rave50CLX;Rave50VCL;IntrawebDB_50_70;Intraweb_50_70;VclNewlyext
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=
[Version Info]
IncludeVerInfo=1
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1033
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=1
Item0=c:\Program Files (x86)\L-Card\lpcie\pas\
@@ -0,0 +1,14 @@
program x502_example;
uses
Forms,
MainUnit in 'MainUnit.pas' {MainForm},
X502_ProcessThread in 'X502_ProcessThread.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
@@ -0,0 +1,119 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{7C3D1E6C-FE9D-4A33-89CC-FFA83DED1261}</ProjectGuid>
<MainSource>x502_example.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>
<FrameworkType>VCL</FrameworkType>
<ProjectVersion>15.4</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<SanitizedProjectName>x502_example</SanitizedProjectName>
<DCC_K>false</DCC_K>
<DCC_UsePackage>vcl;rtl;dbrtl;inet;inetdb;dsnap;bdertl;vclx;vcldb;vcldbx;visualclx;visualdbclx;vclactnband;vclshlctrls;vclie;xmlrtl;inetdbbde;inetdbxpress;webdsnap;soaprtl;websnap;adortl;dbexpress;dsnapcon;dbxcds;ibxpress;teeui;teedb;tee;dss;indy;VclSmp;qrpt;teeqr;Rave50CLX;Rave50VCL;IntrawebDB_50_70;Intraweb_50_70;VclNewlyext;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_SymbolReferenceInfo>1</DCC_SymbolReferenceInfo>
<DCC_F>false</DCC_F>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace)</DCC_Namespace>
<DCC_ImageBase>00400000</DCC_ImageBase>
<DCC_E>false</DCC_E>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_UNSAFE_CAST>true</DCC_UNSAFE_CAST>
<DCC_DebugInformation>1</DCC_DebugInformation>
<DCC_N>true</DCC_N>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0</VerInfo_Keys>
<DCC_UNSAFE_CODE>true</DCC_UNSAFE_CODE>
<DCC_UnitSearchPath>c:\Program Files (x86)\L-Card\lpcie\pas\;$(DCC_UnitSearchPath)</DCC_UnitSearchPath>
<DCC_UNSAFE_TYPE>true</DCC_UNSAFE_TYPE>
<DCC_S>false</DCC_S>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<Icon_MainIcon>x502_example_Icon.ico</Icon_MainIcon>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
<Icon_MainIcon>x502_example_Icon.ico</Icon_MainIcon>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_DebugInformation>0</DCC_DebugInformation>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="MainUnit.pas">
<Form>MainForm</Form>
</DCCReference>
<DCCReference Include="X502_ProcessThread.pas"/>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType/>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">x502_example.dpr</Source>
</Source>
</Delphi.Personality>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">True</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,9 @@
Пример демонстрирует вариант написания программы потокового сбора данных с АЦП и DIN на LabView для модулей L502 или E502.
В примере сперва обнаруживаются все модули, подключенные по интерфейсам PCIe и USB и пользователю предоставляется список для выбора модуля.
Также есть опция использовать устройство подключенное по Ethernet с заданным IP-адресом.
По нажатию кнопки СТАРТ устанавливаться связь с выбранным устройством и идет сбор данных.
Пример использует библиотеку lpcieNet.dll, которая должна распространяться с примером (или устанавливаться в GAC),
которая требует наличия в системе билиотек x502api.dll, l502api.dll и e502api.dll (которая ставится в систему вместе с SDK)
Пример сохранен в для LabView 8 и LabView 2010 (так как новые версии LabView могут не совсем корректно открывать проекты от LabView 8)
@@ -0,0 +1,11 @@
Пример демонстрирует вариант написания программы потокового сбора данных с АЦП и DIN с одновременной выдачей
предварительно загруженного циклического сигнала на ЦАП на LabView для модулей L502 или E502.
В примере сперва обнаруживаются все модули, подключенные по интерфейсам PCIe и USB и пользователю предоставляется список для выбора модуля.
Также есть опция использовать устройство подключенное по Ethernet с заданным IP-адресом.
По нажатию кнопки СТАРТ устанавливаться связь с выбранным устройством и идет сбор данных.
Пример использует библиотеку lpcieNet.dll, которая должна распространяться с примером (или устанавливаться в GAC),
которая требует наличия в системе билиотек x502api.dll, l502api.dll и e502api.dll (которая ставится в систему вместе с SDK)
Пример сохранен в для LabView 8 и LabView 2010 (так как новые версии LabView могут не совсем корректно открывать проекты от LabView 8)
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT e502_eth_svc_browse)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR})
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api e502api)
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "e502_eth_svc_browse", "e502_eth_svc_browse.vcproj", "{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.ActiveCfg = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.Build.0 = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.ActiveCfg = Release|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="e502_eth_svc_browse"
ProjectGUID="{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
RootNamespace="e502_eth_svc_browse"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib e502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib e502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
+205
View File
@@ -0,0 +1,205 @@
/* Данный пример представляет из себя консольную программу на языке C,
демонстрирующую, как можно выполнить поиск устройств E502 в локальной сети.
Пример запускается и непрерывно отслеживает появление (или исчезновение)
устройств в локальной сети, выводя информацию на консоль.
Поиск выполняется до нажатия любой клавиши на Windows или CTRL+C на Linux.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "e502api.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#define INST_NAME_PRINT_FMT "%ls"
#else
#define INST_NAME_PRINT_FMT "%s"
#endif
/* признак необходимости завершить сбор данных */
static int f_out = 0;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
int32_t stop_err;
uint32_t ver;
t_e502_eth_svc_browse_hnd browse_hnd;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/* Начинаем процесс поиска устройств в локальной сети */
err = E502_EthSvcBrowseStart(&browse_hnd, 0);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка запуска поиска устройств в сети (%d): %s\n",
err, X502_GetErrorString(err));
} else {
printf("Запущен поиск устройств в локальной сети. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
while (!f_out && (err == X502_ERR_OK)) {
t_e502_eth_svc_record_hnd svc_rec;
uint32_t event;
/* пробуем получить запись, сообщающую о изменении информации о подулюенных
* устройтсвах */
err = E502_EthSvcBrowseGetEvent(browse_hnd, &svc_rec, &event, NULL, 300);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения записи о найденном устройстве (%d): %s\n",
err, X502_GetErrorString(err));
} else if (event != E502_ETH_SVC_EVENT_NONE) {
char inst_name[X502_INSTANCE_NAME_SIZE];
char dev_serial[X502_SERIAL_SIZE];
uint32_t addr;
int32_t cur_err;
#ifdef _WIN32
WCHAR inst_name_w[X502_INSTANCE_NAME_SIZE];
#endif
/* значение события, отличное от E502_ETH_SVC_EVENT_NONE, говорит
* о том, что изменение произошло. Для каждого события мы можем
* получить имя экземпляра и сер. номер устройства, для которого
* произошло событие */
cur_err = E502_EthSvcRecordGetInstanceName(svc_rec, inst_name);
if (cur_err == X502_ERR_OK)
cur_err = E502_EthSvcRecordGetDevSerial(svc_rec, dev_serial);
#ifdef _WIN32
if (cur_err == X502_ERR_OK) {
/* Имя устройства всегда в кодировке UTF-8. В Windows для
* представления юникодных строк используется формат UTF16
* и строка представляется в виде массива WCHAR.
* Для перевода используем функцию преобразования */
if (MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, inst_name,
-1, inst_name_w, X502_INSTANCE_NAME_SIZE)==0) {
cur_err = X502_ERR_INSTANCE_NAME_ENCODING;
}
}
#endif
if (cur_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения параметров устройства (%d): %s\n",
cur_err, X502_GetErrorString(cur_err));
} else {
if ((event == E502_ETH_SVC_EVENT_ADD) ||
(event == E502_ETH_SVC_EVENT_CHANGED)) {
/* События ADD и CHANGE означают, что устройство присутствует,
* и мы можем получить IP-адрес устройства */
cur_err = E502_EthSvcRecordResolveIPv4Addr(svc_rec, &addr, 4000);
if (cur_err == X502_ERR_OK) {
printf("%s: " INST_NAME_PRINT_FMT ", S/N: %s, Адрес = %d.%d.%d.%d\n",
event == E502_ETH_SVC_EVENT_ADD ? "Новое устройтсво" : "Изм. параметров",
#ifdef _WIN32
inst_name_w,
#else
inst_name,
#endif
dev_serial,
(addr >> 24) & 0xFF, (addr >> 16) & 0xFF,
(addr >> 8) & 0xFF, addr & 0xFF
);
fflush(stdout);
} else {
fprintf(stderr, "Ошибка получения адреса устройства (%d): %s\n",
cur_err, X502_GetErrorString(cur_err));
}
} else if (event == E502_ETH_SVC_EVENT_REMOVE) {
printf("Устройство отключено: " INST_NAME_PRINT_FMT ", S/N: %s\n",
#ifdef _WIN32
inst_name_w,
#else
inst_name,
#endif
dev_serial);
}
}
/* Для всех событий, кроме NONE, выделяется запись, которую
* нужно освободить вручную */
E502_EthSvcRecordFree(svc_rec);
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#endif
}
stop_err = E502_EthSvcBrowseStop(browse_hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова поиска сервисов (%d): %s\n",
stop_err, X502_GetErrorString(stop_err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Останов поиска сервисов выполнен успешно!\n");
}
}
return err;
}
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -lx502api -le502api -o e502_eth_svc_browse
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.6)
set(PROJECT e502_timestamp_stream)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR})
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
+681
View File
@@ -0,0 +1,681 @@
/*
Пример работы с модулями E502-P1 поддерживающими механизм синхронизации времени по протоколу PTP.
Данный пример представляет из себя консольную программу на языке C,
демонстрирующую работу синхронного
ввода данных с АЦП и цифровых линий, а также работу с потоком данных включающим в себя метки времени.
Перед сбором в примере идет поиск модулей, подключенных по интерфейсам USB,
и предоставляется список для выбора модуля, с которым нужно работать.
Для подключения по Ethernet нужно указать IP-адреса интересующих модулей
в качестве аргументов командной строки при вызове примера, тогда эти адреса
будут добавлены в конец списка выбора модуля.
Например, если интересуют модули с адресами 192.168.1.5 и 192.168.1.6,
то пример можно вызвать:
x502_stream_read 192.168.1.5 192.168.1.6
и две дополнительные строки с этими адресами появятся в списке выбора.
Настройки частот, количества принимаемых данных и т.д. задаются с помощью макросов в
начале программы.
Настройки логических каналов - с помощью таблиц f_channels/f_ch_modes/f_ch_ranges.
Пример выполняет прием блоков данных заданного размера.
Сбор идет до нажатия любой клавиши на Windows или CTRL+C на Linux.
Пример также показывает как выполнять обработку данных и определять начало кадра,
в случае если в X502_ProcessData() передается не целое число кадров.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h, l502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "l502api.h"
#include "e502api.h"
#include "x502tstp.h"
#include "../../devs/e502/e502_fpga_regs.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <inttypes.h>
#include "x502api_private.h"
#define STREAM_IN_WRD_TYPE(wrd) wrd & 0x80000000 ? STREAM_IN_WRD_ADC : \
(wrd & 0xFF000000) == 0x0 ? STREAM_IN_WRD_DIN : \
(wrd & 0xF0000000) == 0x40000000 ? STREAM_IN_WRD_TSP : \
((wrd & 0xFF000000)>>24) == 0x01 ? STREAM_IN_WRD_MSG : STREAM_IN_WRD_USR
#ifdef _WIN32
#define CLOCK_MONOTONIC 1
int clock_gettime(int a, struct timespec *spec) {
__int64 wintime; GetSystemTimeAsFileTime((FILETIME*)&wintime);
wintime -=116444736000000000i64; //1jan1601 to 1jan1970
spec->tv_sec =wintime / 10000000i64; //seconds
spec->tv_nsec =wintime % 10000000i64 *100; //nano-seconds
return 0;
}
#endif
#define NSEC_PER_SEC 1000000000
void timespec_diff(struct timespec *a, struct timespec *b,
struct timespec *result) {
result->tv_sec = a->tv_sec - b->tv_sec;
result->tv_nsec = a->tv_nsec - b->tv_nsec;
if (result->tv_nsec < 0) {
--result->tv_sec;
result->tv_nsec += NSEC_PER_SEC;
}
}
double timespec_to_double(struct timespec *ts)
{
return ((double)(ts->tv_sec) + ((double)(ts->tv_nsec) / NSEC_PER_SEC));
}
/* признак необходимости завершить сбор данных */
static int f_out = 0;
/* количество используемых логических каналов */
#define ADC_LCH_CNT 1
/* частота сбора АЦП в Гц*/
#define ADC_FREQ 1000000
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIN_FREQ 1000000
#define ENABLE_ADC
#define ENABLE_DIN
// при ADC_FREQ==2000000 и DIN_FREQ==1000000 через Ethernet обязательно будет X502_STREAM_IN_MSG_OVERFLOW
#define TCP_CONNECTION_TOUT 5000
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*66*3
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 2000
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_DIFF};
/* диапазоны измерения для каналов */
static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_10};
t_x502_hnd g_hnd = NULL;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
/* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и
* сохраняет записи о этих устройствах в выделенный массив.
* Также создаются записи по переданным IP-адресам модулей и добавляются в конец
* массива.
* Указатель на выделенный массив, который должен быть потом очищен, сохраняется
* в pdevrec_list, а количество действительных элементов (память которых должна
* быть в дальнейшем освобождена с помощью X502_FreeDevRecordList()) возвращается
* как результат функции */
static uint32_t f_get_all_devrec(t_x502_devrec **pdevrec_list, uint32_t *ip_addr_list, unsigned ip_cnt) {
int32_t fnd_devcnt = 0;
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
t_x502_devrec *rec_list = NULL;
/* получаем количество подключенных устройств по интерфейсам PCI и USB */
//L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
if ((pci_devcnt + usb_devcnt + ip_cnt) != 0) {
/* выделяем память для массива для сохранения найденного количества записей */
rec_list = malloc((pci_devcnt + usb_devcnt + ip_cnt) * sizeof(t_x502_devrec));
if (rec_list != NULL) {
unsigned i;
/* получаем записи о модулях L502, но не больше pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&rec_list[fnd_devcnt], pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E502, подключенных по USB, в конец массива */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&rec_list[fnd_devcnt], usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* создаем записи для переданного массива ip-адресов */
for (i=0; i < ip_cnt; i++) {
if (E502_MakeDevRecordByIpAddr(&rec_list[fnd_devcnt], ip_addr_list[i],0, TCP_CONNECTION_TOUT) == X502_ERR_OK) {
fnd_devcnt++;
}
}
}
}
if (fnd_devcnt != 0) {
/* если создана хотя бы одна запись, то сохраняем указатель на выделенный массив */
*pdevrec_list = rec_list;
} else {
*pdevrec_list = NULL;
free(rec_list);
}
return fnd_devcnt;
}
static t_x502_hnd f_dev_select_open(int argc, char** argv) {
uint32_t fnd_devcnt,i, dev_ind;
t_x502_devrec *devrec_list = NULL;
uint32_t *ip_addr_list = NULL;
uint32_t ip_cnt = 0;
t_x502_hnd hnd = NULL;
/* если есть аргументы командной строки, то предполагаем, что это могут быть
ip-адреса интересующих устройств. */
if (argc > 1) {
ip_addr_list = malloc((argc-1) * sizeof(ip_addr_list[0]));
if (ip_addr_list == NULL) {
fprintf(stderr, "Ошибка выделения памяти!\n");
} else {
for (i=1; (int)i < argc; i++) {
int a[4];
if (sscanf(argv[i], "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_addr_list[ip_cnt++] = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
}
}
}
}
/* получаем список модулей для выбора */
fnd_devcnt = f_get_all_devrec(&devrec_list, ip_addr_list, ip_cnt);
if (fnd_devcnt == 0) {
printf("Не найдено ни одного модуля\n");
} else {
/* выводим информацию по списку модулей */
printf("Доступны следующие модули:\n");
for (i=0; i < fnd_devcnt; i++) {
printf("Модуль № %d: %s, %-9s", i, devrec_list[i].devname,
devrec_list[i].iface == X502_IFACE_PCI ? "PCI/PCIe" :
devrec_list[i].iface == X502_IFACE_USB ? "USB" :
devrec_list[i].iface == X502_IFACE_ETH ? "Ethernet" : "?");
/* при подключении по сети по IP-адресу серийный номер можно узнать
только после открытия соединения. При этом поле location
содержит строку с описанием адреса устройства */
if (devrec_list[i].iface != X502_IFACE_ETH) {
printf("Сер. номер: %s\n", devrec_list[i].serial);
} else {
printf("Адрес: %s\n", devrec_list[i].location);
}
}
/* выбираем нужный по введенному номеру модуля по порядку с клавиатуры */
printf("Введите номер модуля, с которым хотите работать (от 0 до %d)\n", fnd_devcnt-1);
fflush(stdout);
scanf("%d", &dev_ind);
if (dev_ind >= fnd_devcnt) {
printf("Неверно указан номер модуля...\n");
} else {
/* если ввели номер правильно - создаем описатель */
hnd = X502_Create();
if (hnd==NULL) {
fprintf(stderr, "Ошибка создания описателя модуля!");
} else {
/* устанавливаем связь с модулем по записи */
int32_t err = X502_OpenByDevRecord(hnd, &devrec_list[dev_ind]);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка установления связи с модулем: %s!", X502_GetErrorString(err));
X502_Free(hnd);
hnd = NULL;
}
}
}
/* освобождение ресурсов действительных записей из списка */
X502_FreeDevRecordList(devrec_list, fnd_devcnt);
/* очистка памяти самого массива */
free(devrec_list);
}
/* освобождаем выделенный массив под IP-адреса (если был выделен) */
free(ip_addr_list);
return hnd;
}
/* настройка параметров модуля */
int32_t f_setup_params(t_x502_hnd hnd) {
int32_t err = X502_ERR_OK, i;
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(hnd, ADC_LCH_CNT);
for (i=0; (i < ADC_LCH_CNT) && (err == X502_ERR_OK); i++)
err = X502_SetLChannel(hnd, i, f_channels[i], f_ch_modes[i], f_ch_ranges[i], 0);
/* устанавливаем частоты ввода для АЦП и цифровых входов */
if (err == X502_ERR_OK) {
double f_adc = ADC_FREQ, f_frame = ADC_FRAME_FREQ, f_din = DIN_FREQ;
err = X502_SetAdcFreq(hnd, &f_adc, &f_frame);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота на лог. канал = %0.0f\n Частота цифрового ввода = %0.0f\n",
f_adc, f_frame, f_din);
}
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
int streams = 0;
#ifdef ENABLE_ADC
streams |= X502_STREAM_ADC;
#endif
#ifdef ENABLE_DIN
streams |= X502_STREAM_DIN;
#endif
err = X502_StreamsEnable(hnd, streams);
}
return err;
}
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/********** Получение списка устройств и выбор, с каким будем работать ******************/
g_hnd = f_dev_select_open(argc, argv);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (g_hnd != NULL) {
/* получаем информацию */
t_x502_info info;
err = X502_GetDevInfo(g_hnd, &info);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения серийного информации о модуле: %s!", X502_GetErrorString(err));
} else {
/* выводим полученную информацию */
printf("Установлена связь со следующим модулем:\n");
printf(" Серийный номер : %s\n", info.serial);
printf(" Наличие ЦАП : %s\n", info.devflags & X502_DEVFLAGS_DAC_PRESENT ? "Да" : "Нет");
printf(" Наличие BlackFin : %s\n", info.devflags & X502_DEVFLAGS_BF_PRESENT ? "Да" : "Нет");
printf(" Наличие гальваноразвязки: %s\n", info.devflags & X502_DEVFLAGS_GAL_PRESENT ? "Да" : "Нет");
printf(" Индустриальное исп. : %s\n", info.devflags & X502_DEVFLAGS_INDUSTRIAL ? "Да" : "Нет");
printf(" Наличие интерф. PCI/PCIe: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_PCI ? "Да" : "Нет");
printf(" Наличие интерф. USB : %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_USB ? "Да" : "Нет");
printf(" Наличие интерф. Ethernet: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH ? "Да" : "Нет");
printf(" Версия ПЛИС : %d.%d\n", (info.fpga_ver >> 8) & 0xFF, info.fpga_ver & 0xFF);
printf(" Версия PLDA : %d\n", info.plda_ver);
if (info.mcu_firmware_ver != 0) {
printf(" Версия прошивки ARM : %d.%d.%d.%d\n",
(info.mcu_firmware_ver >> 24) & 0xFF,
(info.mcu_firmware_ver >> 16) & 0xFF,
(info.mcu_firmware_ver >> 8) & 0xFF,
info.mcu_firmware_ver & 0xFF);
}
}
if (err == X502_ERR_OK) {
/* настраиваем параметры модуля */
err = f_setup_params(g_hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
}
/*err = X502_FpgaRegRead(g_hnd, E502_REGS_ARM_BLOCK, &val);
if (err) {
printf("X502_FpgaRegRead err=%d\n", err);
} else {
printf("X502_FpgaRegRead(E502_REGS_ARM_BLOCK) = %d\n", val);
} */
// Включаем метки времени в потоке
X502_FpgaRegWrite(g_hnd, E502_REGS_ARM_TIME_CTRL, 1);
X502_FpgaRegWrite(g_hnd, E502_REGS_IOHARD_GO_SYNC_IO, 0);
X502_FpgaRegWrite(g_hnd, E502_REGS_BF_CTL, X502_REGBIT_BF_CTL_BF_RESET_Msk);
X502_SetSyncMode(g_hnd, X502_SYNC_INTERNAL);
/* запуск синхронного ввода-вывода */
if (err == X502_ERR_OK) {
err = X502_StreamsStart(g_hnd);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка запуска сбора данных: %s!\n", X502_GetErrorString(err));
}
}
if (err == X502_ERR_OK) {
int block;
int32_t stop_err;
printf("Сбор данных запущен. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
fflush(stdout);
struct timespec start_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
int32_t g_rcv_cnt = 0;
int cntr = 0;
int rcv_cntr = 0;
t_x502_tstp_state tstp_state;
X502_tstp_init(&tstp_state, ADC_FREQ, DIN_FREQ);
for (block = 0; (err == X502_ERR_OK) && !f_out; block++) {
int32_t rcv_size;
uint32_t adc_size, din_size;
uint32_t adc_wrd_num = 0;
uint32_t din_wrd_num = 0;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
static uint32_t snd_buf[READ_BLOCK_SIZE];
static double adc_data[READ_BLOCK_SIZE];
static uint32_t din_data[READ_BLOCK_SIZE];
int i;
struct timespec cur_time;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(g_hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
if (rcv_size < 0) {
err = rcv_size;
fprintf(stderr, "Ошибка приема данных: %s\n", X502_GetErrorString(err));
continue;
}
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(g_hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
continue;
}
g_rcv_cnt += rcv_size;
int error = 0;
clock_gettime(CLOCK_MONOTONIC, &cur_time);
if (cur_time.tv_sec - start_time.tv_sec >= 5) {
//printf("rcv speed=%lld wrds/sec cntr=%x\n", (g_rcv_cnt) / (cur_time.tv_sec - start_time.tv_sec), rcv_cntr);
start_time.tv_sec = cur_time.tv_sec;
g_rcv_cnt = 0;
}
for (i = 0; i < rcv_size; i++) {
uint32_t cur_wrd = rcv_buf[i];
uint64_t cur_wrd_time;
t_stream_in_wrd_type type = STREAM_IN_WRD_TYPE(cur_wrd);
X502_tstp_process_wrd(&tstp_state, cur_wrd);
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time) ;
/* проверяем - это данные от АЦП или цифровых входов */
if (type == STREAM_IN_WRD_DIN) {
uint16_t din_wrd;
static bool last_din_wrd_initialized = false;
static uint16_t last_din_wrd;
if (!tstp_state.tstp_mark_rcvd) {
fprintf(stderr, "No timestamp received, DIN wrd unexpected!\n");
break;
}
din_wrd = din_data[din_wrd_num];
din_wrd_num++;
#define DIN_PPS_MASK 1
if (!last_din_wrd_initialized) {
last_din_wrd = din_wrd;
last_din_wrd_initialized = true;
} else
if ((din_wrd & DIN_PPS_MASK) != (last_din_wrd & DIN_PPS_MASK) && (din_wrd & DIN_PPS_MASK)) {
// дождались положительный фронт сигнала PPS на ножке DI1
static bool last_pps_edge_time_initialized = false;
static uint64_t last_pps_edge_time = 0;
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time);
{
static uint32_t nsec_max = 0;
static uint32_t nsec_min = -1;
uint64_t sec_time;
uint64_t ns_time;
sec_time = cur_wrd_time - TSTP_SEC_TO_SSEC(TSTP_SECSSEC_TO_SEC(cur_wrd_time));
ns_time = TSTP_SSEC_TO_NSEC(sec_time);
if (ns_time > 500000000) {
ns_time = NSEC_PER_SEC - ns_time;
}
if (ns_time > nsec_max) {
nsec_max = ns_time;
}
if (ns_time < nsec_min) {
nsec_min = ns_time;
}
printf("DIN PPS positive edge: %ld ns (max - min = %d)\n", ns_time, nsec_max - nsec_min);
}
if (last_pps_edge_time_initialized ) {
uint64_t pps_period;
pps_period = cur_wrd_time - last_pps_edge_time;
printf("DIN PPS positive edge pediod = %d.%09d\n", TSTP_SECSSEC_TO_SEC(pps_period), TSTP_SSEC_TO_NSEC(pps_period));
} else {
last_pps_edge_time_initialized = true;
}
last_pps_edge_time = cur_wrd_time;
}
last_din_wrd = din_wrd;
} else
if (type == STREAM_IN_WRD_ADC) {
static uint16_t last_adc_wrd;
register uint32_t wrd = rcv_buf[i];
double adc_val;
static bool adc_wait_for_edge = false;
if (!tstp_state.tstp_mark_rcvd) {
fprintf(stderr, "No timestamp received, ADC wrd unexpected!\n");
break;
}
adc_val = adc_data[adc_wrd_num];
adc_wrd_num++;
X502_tstp_get_curwrd_time(&tstp_state, &cur_wrd_time);
if (adc_wait_for_edge) {
if (adc_val > 2.4) {
// дождались положительный фронт сигнала PPS на 1 канале ADC
static bool last_pps_edge_time_initialized = false;
static uint64_t last_pps_edge_time = 0;
adc_wait_for_edge = false;
{
static uint32_t nsec_max = 0;
static uint32_t nsec_min = -1;
uint64_t sec_time;
uint64_t ns_time;
sec_time = cur_wrd_time - TSTP_SEC_TO_SSEC(TSTP_SECSSEC_TO_SEC(cur_wrd_time));
ns_time = TSTP_SSEC_TO_NSEC(sec_time);
if (ns_time > 500000000) {
ns_time = NSEC_PER_SEC - ns_time;
}
if (ns_time > nsec_max) {
nsec_max = ns_time;
}
if (ns_time < nsec_min) {
nsec_min = ns_time;
}
printf("ADC PPS positive edge: %ld ns (max - min = %d)\n", ns_time, nsec_max - nsec_min);
}
if (last_pps_edge_time_initialized ) {
uint64_t pps_period;
pps_period = cur_wrd_time - last_pps_edge_time;
printf("ADC PPS positive edge period = %d.%09d\n", TSTP_SECSSEC_TO_SEC(pps_period),
TSTP_SSEC_TO_NSEC(pps_period));
} else {
last_pps_edge_time_initialized = true;
}
last_pps_edge_time = cur_wrd_time;
}
} else
if (adc_val < 2.3) {
adc_wait_for_edge = true;
}
}
rcv_cntr++;
}
#if 0
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
int adc_data_num = 0;
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(g_hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
continue;
}
#endif
if ((tstp_state.dinwrds_after_tstp / DIN_FREQ) > 2)
{
printf("Warning: timestamp mark undetected after %d seconds\n", tstp_state.dinwrds_after_tstp / DIN_FREQ);
}
if ((tstp_state.adcwrds_after_tstp / ADC_FREQ) > 2)
{
printf("Warning: timestamp mark undetected after %d seconds\n", tstp_state.adcwrds_after_tstp / ADC_FREQ);
}
continue;
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (_kbhit())
f_out = 1;
#endif
}
/* останавливаем поток сбора данных (независимо от того, была ли ошибка) */
stop_err = X502_StreamsStop(g_hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова сбора данных: %s\n", X502_GetErrorString(err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Сбор данных остановлен успешно\n");
}
// Выключаем метки времени в потоке
X502_FpgaRegWrite(g_hnd, E502_REGS_ARM_TIME_CTRL, 0);
}
/* закрываем связь с модулем */
X502_Close(g_hnd);
/* освобождаем описатель */
X502_Free(g_hnd);
}
return err;
}
@@ -0,0 +1,33 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DL502API_INCLUDE_DIR=<путь к заголовочным файлам l502api> -DL502API_LIBRARIES_DIR=<путь к файлу линкера l502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DL502API_INCLUDE_DIR и -DL502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT x502_cycle_out)
project(${PROJECT} C)
set(SOURCES main.c ../common/dev_funcs.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
if(CMAKE_COMPILER_IS_GNUCC)
target_link_libraries(${PROJECT} m)
endif(CMAKE_COMPILER_IS_GNUCC)
+296
View File
@@ -0,0 +1,296 @@
/* Данный пример демонстрирует возможность установки циклического сигнала на
вывод в модуль E16 / E502 / L502 (ввод не используется вообще).
В примере определена таблица сигналов, которая задает несколько
комбинаций сигналов для примера. Каждый сигнал задается количеством точек
на период (общее значение для всех трех сигналов), амплитудой для ЦАП'ов и
функцией для генерации очередного отсчета по его номеру и полному размеру.
Пользовтель может ввести номер сигнала, которых он хочет выставить и нажать Enter - и этот
сигнал будет выставлен на выходе.
Смена сигнала происходит по концу периода предыдущего.
Надо также помнить, что хотя мы можем загружать новый сигнал на фоне вывода
предыдущего, однако сразу после выполнения L502_OutCycleSetup() до того
времени как реально произойдет смена старого сигнала на новый нельзя
начинать загружать еще один новый сигнал.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в коментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файл l502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Доболнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include "l502api.h"
#include "e502api.h"
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dev_funcs.h"
#define TCP_CONNECTION_TOUT 5000
#define OUT_SIGNAL_SIZE 2000
#define OUT_BLOCK_SIZE 256
#define SEND_TOUT 500
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
typedef double (*f_gen_sig_word)(uint32_t cntr, uint32_t total_size, double amp);
typedef uint32_t (*f_gen_dout_word)(uint32_t cntr, uint32_t total_size);
/* структура, задающая сигналы на 2-х каналах ЦАП и/или1
1на DOUT */
typedef struct {
uint32_t size; /* количество точек в сигнале */
double amp_dac1; /* амплитуда сигнала для ЦАП1 */
f_gen_sig_word gen_func_dac1; /* функция для генерации отсчета для ЦАП1 */
double amp_dac2; /* амплитуда сигнала для ЦАП2 */
f_gen_sig_word gen_func_dac2; /* функция для генерации отсчета для ЦАП2 */
f_gen_dout_word gen_dout; /* функция для генерации слова на цифровой вывод */
} t_sig_struct;
/* генерация пилы на весь период */
static double f_gen_saw(uint32_t cntr, uint32_t total_size, double amp) {
return amp*( (int32_t)(cntr%total_size)-(int32_t)total_size/2)/(total_size/2);
}
/* генерация синуса на весь период */
static double f_gen_sin(uint32_t cntr, uint32_t total_size, double amp) {
return amp*sin(2*M_PI*cntr/total_size);
}
/* генерация тестового честчика */
static double f_gen_cntr(uint32_t cntr, uint32_t total_size, double amp) {
return cntr + 0x123;
}
/* генерация синуса с периодом в два раза меньше периоду определяемому размером буфера */
static double f_gen_sin2(uint32_t cntr, uint32_t total_size, double amp) {
return amp*sin(2*2*M_PI*cntr/total_size);
}
/* генерация меандра на всех выходах путем выдачи в первой половине на выходы 0xAA, а на второй 0x55 */
static uint32_t f_gen_dout_meander(uint32_t cntr, uint32_t total_size) {
return cntr < total_size/2 ? 0xAA : 0x55;
}
/* генерация счетчика на цифроых выхоах*/
static uint32_t f_gen_dout_cntr(uint32_t cntr, uint32_t total_size) {
return cntr;
}
/* таблица, задающая сигналы для выдачи на вход */
/* для модуля E16 частота выходного сигнала будет в 2 раза меньше, т.к. частота ЦАП 500КГц протип 1МГц у E502 */
static t_sig_struct f_sig_tbl[] = {
{100000, X502_DAC_RANGE, f_gen_saw, 0, NULL, NULL}, /* пила на одном канале с частотой 10 Гц */
{2000, X502_DAC_RANGE, f_gen_sin, 0, NULL, NULL}, /* синусоидальный сигнал на одном канале с частотой 500 Гц */
{100, X502_DAC_RANGE/2, f_gen_sin, X502_DAC_RANGE, f_gen_saw, NULL}, /* синус ампл. 2.5 и пила по 10 КГц */
{50, 0, NULL, X502_DAC_RANGE, f_gen_sin, f_gen_dout_cntr}, /* синус только на втором канале с частотой 20 КГц */
{2550, 1.5, f_gen_sin, 2.5, f_gen_sin2, f_gen_dout_meander}, /* на втором канале синус с частотой в 2 раза больше. меандр на цифровых линиях */
};
/* Запись в буфер драйвера блока данных от сигнала
cntr - номер отчета, соответствующего первому отсчету блока
size - количество отсчетов на канал (т.е. записывается ch_cnt*size отсчетов)
sig - номер сигнала
ch_cnt - кол-во используемых каналов (это кол-во можно определить по f_sig_tbl[sig],
но так как мы его уже определили, то передаем сюда, чтобы опять не определять */
static int32_t f_load_block(t_x502_hnd hnd, uint32_t cntr, uint32_t size, uint32_t sig, uint32_t ch_cnt) {
static double dac_data1[OUT_BLOCK_SIZE], dac_data2[OUT_BLOCK_SIZE];
static uint32_t dout_data[OUT_BLOCK_SIZE];
/* массив слов на запись в модуль - содержит смешенные подготовленные данные
для всех каналов (максимум для 3-х - 2 ЦАП + DOUT) */
static uint32_t sbuf[3*OUT_BLOCK_SIZE];
uint32_t i;
int32_t err = 0;
/* заполняем массив на вывод */
for (i=0; i < size; i++) {
if (f_sig_tbl[sig].gen_func_dac1 != NULL) {
dac_data1[i] = f_sig_tbl[sig].gen_func_dac1(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac1);
}
if (f_sig_tbl[sig].gen_func_dac2 != NULL) {
dac_data2[i] = f_sig_tbl[sig].gen_func_dac2(cntr+i, f_sig_tbl[sig].size, f_sig_tbl[sig].amp_dac2);
}
if (f_sig_tbl[sig].gen_dout != NULL) {
dout_data[i] = f_sig_tbl[sig].gen_dout(cntr+i, f_sig_tbl[sig].size);
}
}
/* Если нужная функция определена, значит мы испоьлзуем этот канал, и
* подаем на вход сформированный массив. Иначе - канал не используется
* и передаем на вход NULL */
err = X502_PrepareData(hnd,
f_sig_tbl[sig].gen_func_dac1 ? dac_data1 : NULL,
f_sig_tbl[sig].gen_func_dac2 ? dac_data2 : NULL,
f_sig_tbl[sig].gen_dout ? dout_data : NULL,
size, X502_DAC_FLAGS_VOLT | X502_DAC_FLAGS_CALIBR,
sbuf);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка подкотовки данных на передачу: %s\n",
X502_GetErrorString(err));
} else {
/* посылаем данные */
int32_t snd_cnt = X502_Send(hnd, sbuf, size*ch_cnt, SEND_TOUT);
if (snd_cnt < 0) {
err = snd_cnt;
fprintf(stderr, "Ошибка передачи данных: %s\n", X502_GetErrorString(err));
} else if ((uint32_t)snd_cnt != size*ch_cnt) {
/* так как мы шлем всегда не больше чем готово, то должны
всегда передать все */
fprintf(stderr, "Переданно недостаточно данных: передавали = %d, передано = %d\n",
size*ch_cnt, snd_cnt);
err = X502_ERR_SEND_INSUFFICIENT_WORDS;
}
}
return err;
}
static int32_t f_load_cycle_signal(t_x502_hnd hnd, int sig) {
int32_t err = 0;
uint32_t cntr = 0;
uint32_t ch_cnt=0;
/* определяем, сколько каналов используем */
if (f_sig_tbl[sig].gen_func_dac1)
ch_cnt++;
if (f_sig_tbl[sig].gen_func_dac2)
ch_cnt++;
if (f_sig_tbl[sig].gen_dout)
ch_cnt++;
/* задаем размер буфера под все каналы! */
err = X502_OutCycleLoadStart(hnd, f_sig_tbl[sig].size*ch_cnt);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка старта загрузки данных: %s!", X502_GetErrorString(err));
/* в примере показано, что загружать можно поблочно, чтобы не выделять
* большой размер памяти на весь сигнал в программе. Но можно записать
* весь сигнал и за один L502_Send() */
while ((cntr != f_sig_tbl[sig].size) && (err == X502_ERR_OK)) {
uint32_t block_size = OUT_BLOCK_SIZE;
/* последний блок может быть меньшего размера, если размер буфера не кратен
* блоку */
if (block_size >(f_sig_tbl[sig].size-cntr))
block_size=f_sig_tbl[sig].size-cntr;
err = f_load_block(hnd, cntr, block_size, sig, ch_cnt);
if (!err)
cntr+=block_size;
}
/* делаем активным загруженный сигнал */
if (err == X502_ERR_OK) {
err = X502_OutCycleSetup(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка установки циклического сигнала: %s!", X502_GetErrorString(err));
}
return err;
}
int main(int argc, char **argv) {
int32_t err = 0;
uint32_t ver;
t_x502_hnd hnd = NULL;
#ifdef _WIN32
/* устанавливаем локаль, чтобы можно было выводить по-русски в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = select_dev_from_list(argc, argv, 0);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd != NULL) {
/* Разрешаем все каналы на вывод (в этом примере мы не будем
использовать асинхронный вывод), а какие каналы реально будут
использованы определяем когда подаем данные в L502_PrepareData */
err = X502_StreamsEnable(hnd, X502_STREAM_ALL_OUT);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка разрешения потоков (%d): %s!", err,
X502_GetErrorString(err));
}
if (err == X502_ERR_OK) {
/* если хотим, то можем загрузить синхнал до разрешения
* синхронного ввода. Тогда мы могли бы его запустить, наприемер,
всесте с АЦП по L502_StreamsStart() */
err = f_load_cycle_signal(hnd, 1);
/* разрешаем синхронный ввод. В принципе можно его разрешить только
* после загрузки первого синала в нашем примере. Но данный пример
* показывает что мы можем сделать это и до выставления сигнала,
* например если захотим запустить ввод АЦП до того как будет нужно
* подать циклический сигнал на вывод */
if (err == X502_ERR_OK)
err = X502_StreamsStart(hnd);
if (err == X502_ERR_OK) {
int exit = 0;
printf("Введите одно из следующего:\n");
printf(" число от 1 до %d - установить сигнал с указанным номером\n",
(int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])));
printf(" s или stop - останов генерации сигнала\n");
printf(" e или exit - выход из программы\n");
/* Цикл ввода команд */
while (!err && !exit) {
char cmd[512];
printf(">");
fflush(stdout);
scanf("%s", cmd);
if (!strcmp(cmd, "exit") || !strcmp(cmd,"e")) {
exit=1;
} else if (!strcmp(cmd, "stop")||!strcmp(cmd,"s")) {
err = X502_OutCycleStop(hnd, X502_OUT_CYCLE_FLAGS_WAIT_DONE);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова циклического сигнала (%d): %s\n",
err, X502_GetErrorString(err));
}
} else {
int sig = atoi(cmd);
if ((sig <= 0) || (sig > (int)(sizeof(f_sig_tbl)/sizeof(f_sig_tbl[0])))) {
fprintf(stderr, "Неверный номер сигнала или неизвестная команда\n");
} else {
err = f_load_cycle_signal(hnd, sig-1);
}
}
}
X502_StreamsStop(hnd);
}
}
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
}
return err;
}
+48
View File
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -ll502api -le502api -lx502api -o x502_cycle_out
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x502_cycle_out", "x502_cycle_out.vcproj", "{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Debug|Win32.ActiveCfg = Debug|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Debug|Win32.Build.0 = Debug|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Release|Win32.ActiveCfg = Release|Win32
{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="x502_cycle_out"
ProjectGUID="{CA9882D8-F21E-47DD-87A6-44AD55ED0ED2}"
RootNamespace="x502_cycle_out"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="l502api.lib e502api.lib x502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="l502api.lib e502api.lib x502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@@ -0,0 +1,29 @@
# Данный файл описывает проект для системы сборки cmake.
# С помощью cmake из этого файла можно получить нужный make-файл
# для нужно родной системы сборки или проект для нужной среды.
#
# Для этого, из созданной директории для сборки нужно вызвать:
#
# cmake -DX502API_INCLUDE_DIR=<путь к заголовочным файлам x502api> -DX502API_LIBRARIES_DIR=<путь к файлу линкера x502api (.lib, .a или .so)> -G <имя генератора проекта> <путь к исходникам (данному файлу)>
#
# списко поддерживаемых генераторов можно получить вызвав cmake без аргументов
#
# Если заголовки и библиотека/файл линкера лежат в стандартных директориях,
# то -DX502API_INCLUDE_DIR и -DX502API_LIBRARIES_DIR можно соответственно не указывать
#
cmake_minimum_required(VERSION 2.8.12)
set(PROJECT x502_stream_read)
project(${PROJECT} C)
set(SOURCES main.c)
set(HEADERS )
include_directories(${X502API_INCLUDE_DIR} ../common)
link_directories(${X502API_LIBRARIES_DIR})
add_executable(${PROJECT} ${HEADERS} ${SOURCES})
target_link_libraries(${PROJECT} x502api l502api e502api)
+501
View File
@@ -0,0 +1,501 @@
/* Данный пример представляет из себя консольную программу на языке C,
демонстрирующую работу с модулями E16, L502 и E502 на примере синхронного
ввода данных с АЦП и цифровых линий.
Перед сбором в примере идет поиск модулей, подключенных по интерфейсам PCI-Express и USB,
и предоставляется список для выбора модуля, с которым нужно работать.
Для подключения по Ethernet нужно указать IP-адреса интересующих модулей
в качестве аргументов командной строки при вызове примера, тогда эти адреса
будут добавлены в конец списка выбора модуля.
Например, если интересуют модули с адресами 192.168.1.5 и 192.168.1.6,
то пример можно вызвать:
x502_stream_read 192.168.1.5 E16:192.168.1.6
и две дополнительные строки с этими адресами появятся в списке выбора.
Для указания что ip адрес принадлежит модулю E16, адрес надо указать с префиксом, пример: E16:192.168.1.6
Настройки частот, количества принимаемых данных и т.д. задаются с помощью макросов в
начале программы.
Настройки логических каналов - с помощью таблиц f_channels/f_ch_modes/f_ch_ranges.
Пример выполняет прием блоков данных заданного размера.
Сбор идет до нажатия любой клавиши на Windows или CTRL+C на Linux.
Пример также показывает как выполнять обработку данных и определять начало кадра,
в случае если в X502_ProcessData() передается не целое число кадров.
Данный пример содержит проект для Visual Studio 2008, а также может быть собран
gcc в Linux или mingw в Windows через makefile или с помощью cmake (подробнее
в комментариях в соответствующих файлах).
Для того чтобы собрать проект в Visual Studio, измените путь к заголовочным файлам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties)
-> С/С++ -> Общие (General) -> Дополнительные каталоги включения (Additional Include Directories))
на тот, где у вас лежат заголовочный файлы x502api.h, l502api.h и e502api.h и измените путь к библиотекам
(Проект (Project) -> Свойства (Properties) -> Свойства конфигурации (Configuration Properties) ->
Компановщик (Linker) -> Общие (General) -> Дополнительные катологи библиотек (Additional Library Directories)).
Внимание!!: Если Вы собираете проект под Visual Studio и взяли проект с сайта (а не из SDK),
то для корректного отображения русских букв в программе нужно изменить кодировку
или указать сохранение с сигнатурой кодировки для UTF-8:
выберите Файл (File) -> Дополнительные параметры сохранения (Advanced Save Options)...
и в поле Кодировка (Encoding) выберите Юникод (UTF8, с сигнатурой)/Unicode (UTF-8 with signature)
и сохраните изменения в файле.
*/
#include <l502api.h>
#include "e502api.h"
//#include "dev_funcs.h"
#ifdef _WIN32
#include <locale.h>
#include <conio.h>
#else
#include <signal.h>
#include <unistd.h>
#include <string.h>
#endif
#include <stdio.h>
#include <stdlib.h>
/* количество используемых логических каналов */
#define ADC_LCH_CNT 3
/* частота сбора АЦП в Гц*/
#define ADC_FREQ 500000
/* частота кадров (на логический канал). При ADC_FREQ/ADC_LCH_CNT - межкадровой задержки нет */
#define ADC_FRAME_FREQ (ADC_FREQ/ADC_LCH_CNT)
/* частота синхронного ввода в Гц*/
#define DIN_FREQ 500000
#define TCP_CONNECTION_TOUT 5000
/* сколько отсчетов считываем за блок */
#define READ_BLOCK_SIZE 4096*200
/* таймаут на прием блока (мс) */
#define READ_TIMEOUT 2000
/* номера используемых физических каналов */
static uint32_t f_channels[ADC_LCH_CNT] = {0,4,6};
/* режимы измерения для каналов */
static uint32_t f_ch_modes[ADC_LCH_CNT] = {X502_LCH_MODE_DIFF, X502_LCH_MODE_DIFF, X502_LCH_MODE_DIFF};
/* диапазоны измерения для каналов */
static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_10, X502_ADC_RANGE_10, X502_ADC_RANGE_10};
/* признак необходимости завершить сбор данных */
static int f_out = 0;
#ifndef _WIN32
/* Обработчик сигнала завершения для Linux */
static void f_abort_handler(int sig) {
f_out = 1;
}
#endif
char const *DEV_E502 = "E502";
char const *DEV_E16 = "E16";
typedef struct {
uint32_t ip_addr;
char const *devname;
} ip_dev_list_t;
/* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и
* сохраняет записи о этих устройствах в выделенный массив.
* Также создаются записи по переданным IP-адресам модулей и добавляются в конец
* массива.
* Указатель на выделенный массив, который должен быть потом очищен, сохраняется
* в pdevrec_list, а количество действительных элементов (память которых должна
* быть в дальнейшем освобождена с помощью X502_FreeDevRecordList()) возвращается
* как результат функции */
static uint32_t f_get_all_devrec(t_x502_devrec **pdevrec_list, ip_dev_list_t *ip_dev_list, unsigned ip_cnt) {
int32_t fnd_devcnt = 0;
uint32_t pci_devcnt = 0;
uint32_t usb_devcnt = 0;
uint32_t e16_usb_devcnt = 0;
t_x502_devrec *rec_list = NULL;
/* получаем количество подключенных устройств по интерфейсам PCI и USB */
L502_GetDevRecordsList(NULL, 0, 0, &pci_devcnt);
E502_UsbGetDevRecordsList(NULL, 0, 0, &usb_devcnt);
E16_UsbGetDevRecordsList(NULL, 0, 0, &e16_usb_devcnt);
if ((pci_devcnt+usb_devcnt + e16_usb_devcnt + ip_cnt) != 0) {
/* выделяем память для массива для сохранения найденного количества записей */
rec_list = malloc((pci_devcnt + usb_devcnt +e16_usb_devcnt + ip_cnt) * sizeof(t_x502_devrec));
if (rec_list != NULL) {
unsigned i;
/* получаем записи о модулях L502, но не больше pci_devcnt */
if (pci_devcnt!=0) {
int32_t res = L502_GetDevRecordsList(&rec_list[fnd_devcnt], pci_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E502, подключенных по USB, в конец массива */
if (usb_devcnt!=0) {
int32_t res = E502_UsbGetDevRecordsList(&rec_list[fnd_devcnt], usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* добавляем записи о модулях E16, подключенных по USB, в конец массива */
if (e16_usb_devcnt!=0) {
int32_t res = E16_UsbGetDevRecordsList(&rec_list[fnd_devcnt], e16_usb_devcnt, 0, NULL);
if (res >= 0) {
fnd_devcnt += res;
}
}
/* создаем записи для переданного массива ip-адресов */
for (i=0; i < ip_cnt; i++) {
if (E502_MakeDevRecordByIpAddr2(&rec_list[fnd_devcnt], ip_dev_list[i].ip_addr, 0, TCP_CONNECTION_TOUT, ip_dev_list[i].devname) == X502_ERR_OK) {
fnd_devcnt++;
}
}
}
}
if (fnd_devcnt != 0) {
/* если создана хотя бы одна запись, то сохраняем указатель на выделенный массив */
*pdevrec_list = rec_list;
} else {
*pdevrec_list = NULL;
free(rec_list);
}
return fnd_devcnt;
}
static t_x502_hnd f_dev_select_open(int argc, char** argv) {
t_x502_hnd hnd = NULL;
uint32_t fnd_devcnt,i, dev_ind;
t_x502_devrec *devrec_list = NULL;
ip_dev_list_t *ip_dev_list = NULL;
uint32_t ip_cnt = 0;
/* если есть аргументы командной строки, то предполагаем, что это могут быть
ip-адреса интересующих устройств. */
if (argc > 1) {
ip_dev_list = malloc((argc - 1) * sizeof(ip_dev_list[0]));
if (ip_dev_list == NULL) {
fprintf(stderr, "Ошибка выделения памяти!\n");
} else {
for (i=1; (int)i < argc; i++) {
int a[4];
if (sscanf(argv[i], "%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_dev_list[ip_cnt].devname = DEV_E502;
ip_dev_list[ip_cnt++].ip_addr = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
} else
if (sscanf(argv[i], "E16:%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4) {
ip_dev_list[ip_cnt].devname = DEV_E16;
ip_dev_list[ip_cnt++].ip_addr = ((a[0] & 0xFF) << 24) |
((a[1] & 0xFF) << 16) |
((a[2] & 0xFF) << 8) |
(a[3] & 0xFF);
}
}
}
}
/* получаем список модулей для выбора */
fnd_devcnt = f_get_all_devrec(&devrec_list, ip_dev_list, ip_cnt);
if (fnd_devcnt == 0) {
printf("Не найдено ни одного модуля\n");
} else {
/* выводим информацию по списку модулей */
printf("Доступны следующие модули:\n");
for (i=0; i < fnd_devcnt; i++) {
printf("Модуль № %d: %s, %-9s", i, devrec_list[i].devname,
devrec_list[i].iface == X502_IFACE_PCI ? "PCI/PCIe" :
devrec_list[i].iface == X502_IFACE_USB ? "USB" :
devrec_list[i].iface == X502_IFACE_ETH ? "Ethernet" : "?");
/* при подключении по сети по IP-адресу серийный номер можно узнать
только после открытия соединения. При этом поле location
содержит строку с описанием адреса устройства */
if (devrec_list[i].iface != X502_IFACE_ETH) {
printf("Сер. номер: %s\n", devrec_list[i].serial);
} else {
printf("Адрес: %s\n", devrec_list[i].location);
}
}
/* выбираем нужный по введенному номеру модуля по порядку с клавиатуры */
printf("Введите номер модуля, с которым хотите работать (от 0 до %d)\n", fnd_devcnt-1);
fflush(stdout);
scanf("%d", &dev_ind);
if (dev_ind >= fnd_devcnt) {
printf("Неверно указан номер модуля...\n");
} else {
/* если ввели номер правильно - создаем описатель */
hnd = X502_Create();
if (hnd==NULL) {
fprintf(stderr, "Ошибка создания описателя модуля!");
} else {
/* устанавливаем связь с модулем по записи */
int32_t err = X502_OpenByDevRecord(hnd, &devrec_list[dev_ind]);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка установления связи с модулем: %s!", X502_GetErrorString(err));
X502_Free(hnd);
hnd = NULL;
}
}
}
/* освобождение ресурсов действительных записей из списка */
X502_FreeDevRecordList(devrec_list, fnd_devcnt);
/* очистка памяти самого массива */
free(devrec_list);
}
/* освобождаем выделенный массив под IP-адреса (если был выделен) */
free(ip_dev_list);
return hnd;
}
/* настройка параметров модуля */
int32_t f_setup_params(t_x502_hnd hnd) {
int32_t err = X502_ERR_OK, i;
/* устанавливаем параметры логической таблицы АЦП */
err = X502_SetLChannelCount(hnd, ADC_LCH_CNT);
for (i=0; (i < ADC_LCH_CNT) && (err == X502_ERR_OK); i++)
err = X502_SetLChannel(hnd, i, f_channels[i], f_ch_modes[i], f_ch_ranges[i], 0);
/* устанавливаем частоты ввода для АЦП и цифровых входов */
if (err == X502_ERR_OK) {
double f_adc = ADC_FREQ, f_frame = ADC_FRAME_FREQ, f_din = DIN_FREQ;
err = X502_SetAdcFreq(hnd, &f_adc, &f_frame);
if (err == X502_ERR_OK)
err = X502_SetDinFreq(hnd, &f_din);
if (err == X502_ERR_OK) {
/* выводим реально установленные значения - те что вернули функции */
printf("Установлены частоты:\n Частота сбора АЦП = %0.0f\n"
" Частота на лог. канал = %0.0f\n Частота цифрового ввода = %0.0f\n",
f_adc, f_frame, f_din);
}
}
/* записываем настройки в модуль */
if (err == X502_ERR_OK)
err = X502_Configure(hnd, 0);
/* разрешаем синхронные потоки */
if (err == X502_ERR_OK) {
err = X502_StreamsEnable(hnd, X502_STREAM_ADC | X502_STREAM_DIN);
}
return err;
}
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
t_x502_hnd hnd = NULL;
#ifndef _WIN32
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
/* В ОС Linux устанавливаем свой обработчик на сигнал закрытия,
чтобы завершить сбор корректно */
sa.sa_handler = f_abort_handler;
sigaction(SIGTERM, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGABRT, &sa, NULL);
#endif
#ifdef _WIN32
/* для вывода русских букв в консоль для ОС Windows в CP1251 без перевода в OEM */
setlocale(LC_CTYPE, "");
#endif
/* получаем версию библиотеки */
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
/********** Получение списка устройств и выбор, с каким будем работать ******************/
hnd = f_dev_select_open(argc, argv);
/********************************** Работа с модулем **************************/
/* если успешно выбрали модуль и установили с ним связь - продолжаем работу */
if (hnd != NULL) {
/* получаем информацию */
t_x502_info info;
err = X502_GetDevInfo(hnd, &info);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка получения серийного информации о модуле: %s!", X502_GetErrorString(err));
} else {
/* выводим полученную информацию */
printf("Установлена связь со следующим модулем:\n");
printf(" Серийный номер : %s\n", info.serial);
printf(" Наличие ЦАП : %s\n", info.devflags & X502_DEVFLAGS_DAC_PRESENT ? "Да" : "Нет");
printf(" Наличие BlackFin : %s\n", info.devflags & X502_DEVFLAGS_BF_PRESENT ? "Да" : "Нет");
printf(" Наличие гальваноразвязки: %s\n", info.devflags & X502_DEVFLAGS_GAL_PRESENT ? "Да" : "Нет");
printf(" Индустриальное исп. : %s\n", info.devflags & X502_DEVFLAGS_INDUSTRIAL ? "Да" : "Нет");
printf(" Наличие интерф. PCI/PCIe: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_PCI ? "Да" : "Нет");
printf(" Наличие интерф. USB : %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_USB ? "Да" : "Нет");
printf(" Наличие интерф. Ethernet: %s\n", info.devflags & X502_DEVFLAGS_IFACE_SUPPORT_ETH ? "Да" : "Нет");
printf(" Версия ПЛИС : %d.%d\n", (info.fpga_ver >> 8) & 0xFF, info.fpga_ver & 0xFF);
printf(" Версия PLDA : %d\n", info.plda_ver);
if (info.mcu_firmware_ver != 0) {
printf(" Версия прошивки ARM : %d.%d.%d.%d\n",
(info.mcu_firmware_ver >> 24) & 0xFF,
(info.mcu_firmware_ver >> 16) & 0xFF,
(info.mcu_firmware_ver >> 8) & 0xFF,
info.mcu_firmware_ver & 0xFF);
}
}
if (err == X502_ERR_OK) {
/* настраиваем параметры модуля */
err = f_setup_params(hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка настройки модуля: %s!", X502_GetErrorString(err));
}
/* запуск синхронного ввода-вывода */
if (err == X502_ERR_OK) {
err = X502_StreamsStart(hnd);
if (err != X502_ERR_OK)
fprintf(stderr, "Ошибка запуска сбора данных: %s!\n", X502_GetErrorString(err));
}
if (err == X502_ERR_OK) {
int block;
int32_t stop_err;
printf("Сбор данных запущен. Для останова нажмите %s\n",
#ifdef _WIN32
"любую клавишу"
#else
"CTRL+C"
#endif
);
fflush(stdout);
for (block = 0; (err == X502_ERR_OK) && !f_out; block++) {
int32_t rcv_size;
uint32_t adc_size, din_size;
/* массив для приема необработанных данных */
static uint32_t rcv_buf[READ_BLOCK_SIZE];
static double adc_data[READ_BLOCK_SIZE];
static uint32_t din_data[READ_BLOCK_SIZE];
/* принимаем данные (по таймауту) */
rcv_size = X502_Recv(hnd, rcv_buf, READ_BLOCK_SIZE, READ_TIMEOUT);
/* результат меньше нуля означает ошибку */
if (rcv_size < 0) {
err = rcv_size;
fprintf(stderr, "Ошибка приема данных: %s\n", X502_GetErrorString(err));
} else if (rcv_size > 0) {
uint32_t first_lch;
/* получаем номер логического канала, которому соответствует первый отсчет АЦП в массиве */
X502_GetNextExpectedLchNum(hnd, &first_lch);
adc_size = sizeof(adc_data)/sizeof(adc_data[0]);
din_size = sizeof(din_data)/sizeof(din_data[0]);
/* обрабатываем принятые данные, распределяя их на данные АЦП и цифровых входов */
err = X502_ProcessData(hnd, rcv_buf, rcv_size, X502_PROC_FLAGS_VOLT,
adc_data, &adc_size, din_data, &din_size);
if (err != X502_ERR_OK) {
fprintf(stderr, "Ошибка обработки данных: %s\n", X502_GetErrorString(err));
} else {
uint32_t lch;
printf("Блок %3d. Обработано данных АЦП = %d, цифровых входов = %d\n",
block, adc_size, din_size);
/* если приняли цифровые данные - выводим первый отсчет */
if (din_size != 0)
printf(" din_data = 0x%05X\n", din_data[0]);
/* выводим по одному отсчету на канал. если обработанный блок
начинается не с начала кадра, то в данном примере для
вывода берем конец неполного кадра и начало следующего */
for (lch=0; lch < ADC_LCH_CNT; lch++) {
/* определяем позицию первого отсчета, соответствующего заданному логическому каналу:
либо с конца не полного кадра, либо из начала следующего */
uint32_t pos = lch >= first_lch ? lch - first_lch : ADC_LCH_CNT-first_lch + lch;
if (pos <= adc_size) {
printf(" lch[%d]=%6.4f\n", lch, adc_data[pos]);
} else {
printf(" lch[%d]= ---- \n", lch);
}
}
printf("\n");
fflush(stdout);
}
}
#ifdef _WIN32
/* проверка нажатия клавиши для выхода */
if (err == X502_ERR_OK) {
if (_kbhit())
f_out = 1;
}
#else
{
// по нажатию Enter включаем/выключаем поток ADC
fd_set fds;
struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
if (select(1, &fds, NULL, NULL, &tv) == 1) {
int x;
static int adc_disabled = 0;
int ch;
if (adc_disabled) {
X502_StreamsEnable(hnd, X502_STREAM_ADC);
} else {
X502_StreamsDisable(hnd, X502_STREAM_ADC);
}
adc_disabled = !adc_disabled;
while(select(1, &fds, NULL, NULL, &tv) == 1) {
read(STDIN_FILENO, &ch, 1);
}
}
}
#endif
}
/* останавливаем поток сбора данных (независимо от того, была ли ошибка) */
stop_err = X502_StreamsStop(hnd);
if (stop_err != X502_ERR_OK) {
fprintf(stderr, "Ошибка останова сбора данных: %s\n", X502_GetErrorString(err));
if (err == X502_ERR_OK)
err = stop_err;
} else {
printf("Сбор данных остановлен успешно\n");
}
}
/* закрываем связь с модулем */
X502_Close(hnd);
/* освобождаем описатель */
X502_Free(hnd);
}
return err;
}
+48
View File
@@ -0,0 +1,48 @@
# makefile для сборки примера с помощью компиляторов mingw (под Windows)
# или GCC (под Linux). Необходимо определить 3 переменные:
#
# CC - имя команды для вызова компилятора
# X502API_LIBRARIES_DIR - путь к файлм .a или .so библиотек l502api, e502api, x502api (если не стандартный)
# X502API_INCLUDE_DIR - путь к заголовочным файлам l502api.h, e502api.h, x502api.h
#
# Ниже приведено несколько примеров в закоментированном виде
#--- Linux с заголовками и библиотекой в стандартных директориях: компилятор GCC
#CC = gcc
#--- Вариант запуска из MSYS со стандартным 32-битным mingw
#CC = gcc
#X502API_LIBRARIES_DIR = "/c/Program Files/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/c/Program Files/L-Card/lpcie/include"
#--- 64-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = x86_64-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw64"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw w64, идущий вместе с cygwin --------
#CC = i686-w64-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
#--- 32-битный вариант mingw, идущий вместе с cygwin --------
#CC = i686-pc-mingw32-gcc
#X502API_LIBRARIES_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/lib/mingw"
#X502API_INCLUDE_DIR = "/cygdrive/c/Program Files (x86)/L-Card/lpcie/include"
FLAGS =
ifdef X502API_LIBRARIES_DIR
FLAGS += -L $(X502API_LIBRARIES_DIR)
endif
ifdef X502API_INCLUDE_DIR
FLAGS += -I $(X502API_INCLUDE_DIR)
endif
all:
$(CC) main.c $(FLAGS) -ll502api -le502api -lx502api -o x502_stream_read
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "x502_stream_read", "x502_stream_read.vcproj", "{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.ActiveCfg = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Debug|Win32.Build.0 = Debug|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.ActiveCfg = Release|Win32
{D9460CE1-B571-4A69-A4C1-0676BF57EB04}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="windows-1251"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="x502_stream_read"
ProjectGUID="{D9460CE1-B571-4A69-A4C1-0676BF57EB04}"
RootNamespace="x502_stream_read"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib l502api.lib e502api.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="c:\Program Files (x86)\L-Card\lpcie\include\"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="x502api.lib l502api.lib e502api.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="c:\Program Files (x86)\L-Card\lpcie\lib\msvc"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Ôàéëû èñõîäíîãî êîäà"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\main.c"
>
</File>
</Filter>
<Filter
Name="Çàãîëîâî÷íûå ôàéëû"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
</Filter>
<Filter
Name="Ôàéëû ðåñóðñîâ"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
@@ -0,0 +1,84 @@
using System;
using System.Net;
using lpcieapi;
using x502api;
/* Данный пример представляет из себя консольную программу на языке C#,
демонстрирующую, как можно выполнить поиск устройств E502 в локальной сети.
Пример запускается и непрерывно отслеживает появление (или исчезновение)
устройств в локальной сети, выводя информацию на консоль.
Поиск выполняется до нажатия любой клавиши. */
namespace e502_eth_svc_browse
{
class Program
{
static void Main(string[] args)
{
/* функции для поиска представлены в виде методов отдельного класса EthSvcBrowser */
E502.EthSvcBrowser sb = new E502.EthSvcBrowser();
/* запуск поиска сервисов */
lpcie.Errs err = sb.Start();
if (err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка запуска поиска устройств в сети {0}: {1}", err, X502.GetErrorString(err));
}
else
{
bool end = false;
Console.WriteLine("Запущен поиск устройств в локальной сети. Для останова нажмите любую клавишу");
while (!end && (err == lpcie.Errs.OK))
{
E502.EthSvcEvent svc_evt;
/* Метод EthSvcRecord предоставляет доступ ко функциям для работы с описателем сервиса.
* В отличие от С не нужно освобождать память вручную, т.к. освобождение выполняется
* в деструкторе */
E502.EthSvcRecord svc_rec;
err = sb.GetEvent(out svc_rec, out svc_evt, 300);
if (err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка получения записи о найденном устройстве {0}: {1}", err, X502.GetErrorString(err));
}
else if (svc_evt != E502.EthSvcEvent.NONE)
{
/* Адрес мы можем получить только для присутствующего устройства */
if ((svc_evt == E502.EthSvcEvent.ADD) || (svc_evt == E502.EthSvcEvent.CHANGED))
{
IPAddress addr;
lpcie.Errs cur_err = svc_rec.ResolveIPv4Addr(out addr, 2000);
if (cur_err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка получения IP-адреса устройтсва {0}: {1}", cur_err, X502.GetErrorString(cur_err));
}
else
{
Console.WriteLine("{0}: {1}, S/N: {2}, Адрес = {3}", svc_evt == E502.EthSvcEvent.ADD ?
"Новое устройтсво" : "Изм. параметров", svc_rec.InstanceName, svc_rec.DevSerial, addr.ToString());
}
}
else if (svc_evt == E502.EthSvcEvent.REMOVE)
{
Console.WriteLine("Устройство отключено: {0}, S/N: {1}", svc_rec.InstanceName, svc_rec.DevSerial);
}
}
/* вход по нажатию клавиши */
if (Console.KeyAvailable)
end = true;
}
lpcie.Errs stop_err = sb.Stop();
if (stop_err != lpcie.Errs.OK)
{
Console.WriteLine("Ошибка останова поиска сервисов {0}: {1}", stop_err, X502.GetErrorString(stop_err));
}
else
{
Console.WriteLine("Останов поиска сервисов выполнен успешно!\n");
}
}
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("e502_eth_svc_browse")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("e502_eth_svc_browse")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c7548c80-fc0f-4cb6-a4ed-355b7e40c86d")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{714093CB-3EAA-464F-9D27-8E91381E0651}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>e502_eth_svc_browse</RootNamespace>
<AssemblyName>e502_eth_svc_browse</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="lpcieNet, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lpcieNet\bin\Release\lpcieNet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
+955
View File
@@ -0,0 +1,955 @@
namespace x502_example
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.btnRefreshDeviceList = new System.Windows.Forms.Button();
this.cbbSerialList = new System.Windows.Forms.ComboBox();
this.btnOpen = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label();
this.edtPldaVer = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.edtFpgaVer = new System.Windows.Forms.TextBox();
this.chkBfPresent = new System.Windows.Forms.CheckBox();
this.chkGalPresent = new System.Windows.Forms.CheckBox();
this.chkDacPresent = new System.Windows.Forms.CheckBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.btnSetAdcFreq = new System.Windows.Forms.Button();
this.label5 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.edtDinFreq = new System.Windows.Forms.TextBox();
this.edtAdcFreqLch = new System.Windows.Forms.TextBox();
this.edtAdcFreq = new System.Windows.Forms.TextBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.chkSyncDin = new System.Windows.Forms.CheckBox();
this.edtDin_Result = new System.Windows.Forms.TextBox();
this.edtLCh3_Result = new System.Windows.Forms.TextBox();
this.edtLCh2_Result = new System.Windows.Forms.TextBox();
this.cbbLCh3_Mode = new System.Windows.Forms.ComboBox();
this.label10 = new System.Windows.Forms.Label();
this.cbbLCh3_Range = new System.Windows.Forms.ComboBox();
this.cbbLCh2_Mode = new System.Windows.Forms.ComboBox();
this.cbbLCh3_Channel = new System.Windows.Forms.ComboBox();
this.label9 = new System.Windows.Forms.Label();
this.cbbLCh2_Range = new System.Windows.Forms.ComboBox();
this.label8 = new System.Windows.Forms.Label();
this.cbbLCh2_Channel = new System.Windows.Forms.ComboBox();
this.edtLCh1_Result = new System.Windows.Forms.TextBox();
this.cbbLCh1_Mode = new System.Windows.Forms.ComboBox();
this.cbbLCh1_Range = new System.Windows.Forms.ComboBox();
this.label7 = new System.Windows.Forms.Label();
this.cbbLCh1_Channel = new System.Windows.Forms.ComboBox();
this.label6 = new System.Windows.Forms.Label();
this.cbbLChCnt = new System.Windows.Forms.ComboBox();
this.btnStart = new System.Windows.Forms.Button();
this.btnStop = new System.Windows.Forms.Button();
this.btnAsyncAdcFrame = new System.Windows.Forms.Button();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.cbbSyncStartMode = new System.Windows.Forms.ComboBox();
this.label12 = new System.Windows.Forms.Label();
this.cbbSyncMode = new System.Windows.Forms.ComboBox();
this.label11 = new System.Windows.Forms.Label();
this.btnAsyncDigIn = new System.Windows.Forms.Button();
this.btnAsyncDigOut = new System.Windows.Forms.Button();
this.btnAsyncDac1 = new System.Windows.Forms.Button();
this.btnAsyncDac2 = new System.Windows.Forms.Button();
this.edtAsyncDigIn = new System.Windows.Forms.TextBox();
this.edtAsyncDigOut = new System.Windows.Forms.TextBox();
this.edtAsyncDac1 = new System.Windows.Forms.TextBox();
this.edtAsyncDac2 = new System.Windows.Forms.TextBox();
this.chkEthSupport = new System.Windows.Forms.CheckBox();
this.label13 = new System.Windows.Forms.Label();
this.edtMcuVer = new System.Windows.Forms.TextBox();
this.edtIpAddr = new System.Windows.Forms.TextBox();
this.btnOpenByIP = new System.Windows.Forms.Button();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox4.SuspendLayout();
this.SuspendLayout();
//
// btnRefreshDeviceList
//
this.btnRefreshDeviceList.Location = new System.Drawing.Point(27, 12);
this.btnRefreshDeviceList.Name = "btnRefreshDeviceList";
this.btnRefreshDeviceList.Size = new System.Drawing.Size(212, 23);
this.btnRefreshDeviceList.TabIndex = 0;
this.btnRefreshDeviceList.Text = "Обновить список модулей";
this.btnRefreshDeviceList.UseVisualStyleBackColor = true;
this.btnRefreshDeviceList.Click += new System.EventHandler(this.btnRefreshDeviceList_Click);
//
// cbbSerialList
//
this.cbbSerialList.FormattingEnabled = true;
this.cbbSerialList.Location = new System.Drawing.Point(258, 14);
this.cbbSerialList.Name = "cbbSerialList";
this.cbbSerialList.Size = new System.Drawing.Size(139, 21);
this.cbbSerialList.TabIndex = 1;
//
// btnOpen
//
this.btnOpen.Location = new System.Drawing.Point(27, 55);
this.btnOpen.Name = "btnOpen";
this.btnOpen.Size = new System.Drawing.Size(212, 23);
this.btnOpen.TabIndex = 2;
this.btnOpen.Text = "Установить связь с модулем";
this.btnOpen.UseVisualStyleBackColor = true;
this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.label13);
this.groupBox1.Controls.Add(this.edtMcuVer);
this.groupBox1.Controls.Add(this.chkEthSupport);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.edtPldaVer);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.edtFpgaVer);
this.groupBox1.Controls.Add(this.chkBfPresent);
this.groupBox1.Controls.Add(this.chkGalPresent);
this.groupBox1.Controls.Add(this.chkDacPresent);
this.groupBox1.Location = new System.Drawing.Point(258, 40);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(230, 183);
this.groupBox1.TabIndex = 3;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Информация о модуле";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(74, 131);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(128, 13);
this.label2.TabIndex = 8;
this.label2.Text = "Версия прошивки PLDA";
//
// edtPldaVer
//
this.edtPldaVer.Enabled = false;
this.edtPldaVer.Location = new System.Drawing.Point(6, 128);
this.edtPldaVer.Name = "edtPldaVer";
this.edtPldaVer.Size = new System.Drawing.Size(62, 20);
this.edtPldaVer.TabIndex = 7;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(74, 105);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(131, 13);
this.label1.TabIndex = 6;
this.label1.Text = "Версия прошивки ПЛИС";
//
// edtFpgaVer
//
this.edtFpgaVer.Enabled = false;
this.edtFpgaVer.Location = new System.Drawing.Point(6, 102);
this.edtFpgaVer.Name = "edtFpgaVer";
this.edtFpgaVer.Size = new System.Drawing.Size(62, 20);
this.edtFpgaVer.TabIndex = 5;
//
// chkBfPresent
//
this.chkBfPresent.AutoSize = true;
this.chkBfPresent.Enabled = false;
this.chkBfPresent.Location = new System.Drawing.Point(6, 65);
this.chkBfPresent.Name = "chkBfPresent";
this.chkBfPresent.Size = new System.Drawing.Size(199, 17);
this.chkBfPresent.TabIndex = 4;
this.chkBfPresent.Text = "Наличие сигнального процессора";
this.chkBfPresent.UseVisualStyleBackColor = true;
//
// chkGalPresent
//
this.chkGalPresent.AutoSize = true;
this.chkGalPresent.Enabled = false;
this.chkGalPresent.Location = new System.Drawing.Point(6, 42);
this.chkGalPresent.Name = "chkGalPresent";
this.chkGalPresent.Size = new System.Drawing.Size(167, 17);
this.chkGalPresent.TabIndex = 1;
this.chkGalPresent.Text = "Наличие гальваноразвязки";
this.chkGalPresent.UseVisualStyleBackColor = true;
//
// chkDacPresent
//
this.chkDacPresent.AutoSize = true;
this.chkDacPresent.Enabled = false;
this.chkDacPresent.Location = new System.Drawing.Point(6, 19);
this.chkDacPresent.Name = "chkDacPresent";
this.chkDacPresent.Size = new System.Drawing.Size(95, 17);
this.chkDacPresent.TabIndex = 0;
this.chkDacPresent.Text = "Наличие ЦАП";
this.chkDacPresent.UseVisualStyleBackColor = true;
//
// groupBox2
//
this.groupBox2.Controls.Add(this.btnSetAdcFreq);
this.groupBox2.Controls.Add(this.label5);
this.groupBox2.Controls.Add(this.label4);
this.groupBox2.Controls.Add(this.label3);
this.groupBox2.Controls.Add(this.edtDinFreq);
this.groupBox2.Controls.Add(this.edtAdcFreqLch);
this.groupBox2.Controls.Add(this.edtAdcFreq);
this.groupBox2.Location = new System.Drawing.Point(27, 247);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(518, 60);
this.groupBox2.TabIndex = 4;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Частоты синхронного сбора";
//
// btnSetAdcFreq
//
this.btnSetAdcFreq.Location = new System.Drawing.Point(437, 32);
this.btnSetAdcFreq.Name = "btnSetAdcFreq";
this.btnSetAdcFreq.Size = new System.Drawing.Size(75, 23);
this.btnSetAdcFreq.TabIndex = 10;
this.btnSetAdcFreq.Text = "Установить";
this.btnSetAdcFreq.UseVisualStyleBackColor = true;
this.btnSetAdcFreq.Click += new System.EventHandler(this.btnSetAdcFreq_Click);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(291, 16);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(170, 13);
this.label5.TabIndex = 9;
this.label5.Text = "Частота синхронного ввода (Гц)";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(159, 15);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(118, 13);
this.label4.TabIndex = 8;
this.label4.Text = "Частота на канал (Гц)";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(7, 15);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(143, 13);
this.label3.TabIndex = 7;
this.label3.Text = "Частота сбора данных (Гц)";
//
// edtDinFreq
//
this.edtDinFreq.Location = new System.Drawing.Point(294, 34);
this.edtDinFreq.Name = "edtDinFreq";
this.edtDinFreq.Size = new System.Drawing.Size(126, 20);
this.edtDinFreq.TabIndex = 6;
this.edtDinFreq.Text = "2000000";
//
// edtAdcFreqLch
//
this.edtAdcFreqLch.Location = new System.Drawing.Point(162, 34);
this.edtAdcFreqLch.Name = "edtAdcFreqLch";
this.edtAdcFreqLch.Size = new System.Drawing.Size(126, 20);
this.edtAdcFreqLch.TabIndex = 5;
this.edtAdcFreqLch.Text = "2000000";
//
// edtAdcFreq
//
this.edtAdcFreq.Location = new System.Drawing.Point(6, 34);
this.edtAdcFreq.Name = "edtAdcFreq";
this.edtAdcFreq.Size = new System.Drawing.Size(126, 20);
this.edtAdcFreq.TabIndex = 0;
this.edtAdcFreq.Text = "2000000";
//
// groupBox3
//
this.groupBox3.Controls.Add(this.chkSyncDin);
this.groupBox3.Controls.Add(this.edtDin_Result);
this.groupBox3.Controls.Add(this.edtLCh3_Result);
this.groupBox3.Controls.Add(this.edtLCh2_Result);
this.groupBox3.Controls.Add(this.cbbLCh3_Mode);
this.groupBox3.Controls.Add(this.label10);
this.groupBox3.Controls.Add(this.cbbLCh3_Range);
this.groupBox3.Controls.Add(this.cbbLCh2_Mode);
this.groupBox3.Controls.Add(this.cbbLCh3_Channel);
this.groupBox3.Controls.Add(this.label9);
this.groupBox3.Controls.Add(this.cbbLCh2_Range);
this.groupBox3.Controls.Add(this.label8);
this.groupBox3.Controls.Add(this.cbbLCh2_Channel);
this.groupBox3.Controls.Add(this.edtLCh1_Result);
this.groupBox3.Controls.Add(this.cbbLCh1_Mode);
this.groupBox3.Controls.Add(this.cbbLCh1_Range);
this.groupBox3.Controls.Add(this.label7);
this.groupBox3.Controls.Add(this.cbbLCh1_Channel);
this.groupBox3.Controls.Add(this.label6);
this.groupBox3.Controls.Add(this.cbbLChCnt);
this.groupBox3.Location = new System.Drawing.Point(27, 377);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(518, 166);
this.groupBox3.TabIndex = 5;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Каналы АЦП";
//
// chkSyncDin
//
this.chkSyncDin.AutoSize = true;
this.chkSyncDin.Location = new System.Drawing.Point(182, 140);
this.chkSyncDin.Name = "chkSyncDin";
this.chkSyncDin.Size = new System.Drawing.Size(189, 17);
this.chkSyncDin.TabIndex = 17;
this.chkSyncDin.Text = "Разрешение синхронного ввода";
this.chkSyncDin.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.chkSyncDin.UseVisualStyleBackColor = true;
//
// edtDin_Result
//
this.edtDin_Result.Location = new System.Drawing.Point(380, 138);
this.edtDin_Result.Name = "edtDin_Result";
this.edtDin_Result.Size = new System.Drawing.Size(107, 20);
this.edtDin_Result.TabIndex = 16;
//
// edtLCh3_Result
//
this.edtLCh3_Result.Location = new System.Drawing.Point(380, 112);
this.edtLCh3_Result.Name = "edtLCh3_Result";
this.edtLCh3_Result.Size = new System.Drawing.Size(107, 20);
this.edtLCh3_Result.TabIndex = 15;
//
// edtLCh2_Result
//
this.edtLCh2_Result.Location = new System.Drawing.Point(380, 85);
this.edtLCh2_Result.Name = "edtLCh2_Result";
this.edtLCh2_Result.Size = new System.Drawing.Size(107, 20);
this.edtLCh2_Result.TabIndex = 11;
//
// cbbLCh3_Mode
//
this.cbbLCh3_Mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh3_Mode.FormattingEnabled = true;
this.cbbLCh3_Mode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh3_Mode.Items.AddRange(new object[] {
"С общей землей",
"Дифференциальный",
"Измерение нуля"});
this.cbbLCh3_Mode.Location = new System.Drawing.Point(182, 111);
this.cbbLCh3_Mode.Name = "cbbLCh3_Mode";
this.cbbLCh3_Mode.Size = new System.Drawing.Size(175, 21);
this.cbbLCh3_Mode.TabIndex = 14;
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(386, 41);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(59, 13);
this.label10.TabIndex = 10;
this.label10.Text = "Результат";
//
// cbbLCh3_Range
//
this.cbbLCh3_Range.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh3_Range.FormattingEnabled = true;
this.cbbLCh3_Range.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh3_Range.Items.AddRange(new object[] {
"10 В",
"5 В",
"2 В",
"1 В",
"0.5 В",
"0.2 В"});
this.cbbLCh3_Range.Location = new System.Drawing.Point(73, 111);
this.cbbLCh3_Range.Name = "cbbLCh3_Range";
this.cbbLCh3_Range.Size = new System.Drawing.Size(75, 21);
this.cbbLCh3_Range.TabIndex = 13;
//
// cbbLCh2_Mode
//
this.cbbLCh2_Mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh2_Mode.FormattingEnabled = true;
this.cbbLCh2_Mode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh2_Mode.Items.AddRange(new object[] {
"С общей землей",
"Дифференциальный",
"Измерение нуля"});
this.cbbLCh2_Mode.Location = new System.Drawing.Point(182, 84);
this.cbbLCh2_Mode.Name = "cbbLCh2_Mode";
this.cbbLCh2_Mode.Size = new System.Drawing.Size(175, 21);
this.cbbLCh2_Mode.TabIndex = 10;
//
// cbbLCh3_Channel
//
this.cbbLCh3_Channel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh3_Channel.FormattingEnabled = true;
this.cbbLCh3_Channel.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh3_Channel.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32"});
this.cbbLCh3_Channel.Location = new System.Drawing.Point(8, 111);
this.cbbLCh3_Channel.Name = "cbbLCh3_Channel";
this.cbbLCh3_Channel.Size = new System.Drawing.Size(46, 21);
this.cbbLCh3_Channel.TabIndex = 12;
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(185, 41);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(101, 13);
this.label9.TabIndex = 9;
this.label9.Text = "Режим измерения";
//
// cbbLCh2_Range
//
this.cbbLCh2_Range.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh2_Range.FormattingEnabled = true;
this.cbbLCh2_Range.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh2_Range.Items.AddRange(new object[] {
"10 В",
"5 В",
"2 В",
"1 В",
"0.5 В",
"0.2 В"});
this.cbbLCh2_Range.Location = new System.Drawing.Point(73, 84);
this.cbbLCh2_Range.Name = "cbbLCh2_Range";
this.cbbLCh2_Range.Size = new System.Drawing.Size(75, 21);
this.cbbLCh2_Range.TabIndex = 9;
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(72, 41);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(58, 13);
this.label8.TabIndex = 8;
this.label8.Text = "Диапазон";
//
// cbbLCh2_Channel
//
this.cbbLCh2_Channel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh2_Channel.FormattingEnabled = true;
this.cbbLCh2_Channel.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh2_Channel.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32"});
this.cbbLCh2_Channel.Location = new System.Drawing.Point(8, 84);
this.cbbLCh2_Channel.Name = "cbbLCh2_Channel";
this.cbbLCh2_Channel.Size = new System.Drawing.Size(46, 21);
this.cbbLCh2_Channel.TabIndex = 8;
//
// edtLCh1_Result
//
this.edtLCh1_Result.Location = new System.Drawing.Point(380, 58);
this.edtLCh1_Result.Name = "edtLCh1_Result";
this.edtLCh1_Result.Size = new System.Drawing.Size(107, 20);
this.edtLCh1_Result.TabIndex = 7;
//
// cbbLCh1_Mode
//
this.cbbLCh1_Mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh1_Mode.FormattingEnabled = true;
this.cbbLCh1_Mode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh1_Mode.Items.AddRange(new object[] {
"С общей землей",
"Дифференциальный",
"Измерение нуля"});
this.cbbLCh1_Mode.Location = new System.Drawing.Point(182, 57);
this.cbbLCh1_Mode.Name = "cbbLCh1_Mode";
this.cbbLCh1_Mode.Size = new System.Drawing.Size(175, 21);
this.cbbLCh1_Mode.TabIndex = 6;
//
// cbbLCh1_Range
//
this.cbbLCh1_Range.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh1_Range.FormattingEnabled = true;
this.cbbLCh1_Range.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh1_Range.Items.AddRange(new object[] {
"10 В",
"5 В",
"2 В",
"1 В",
"0.5 В",
"0.2 В"});
this.cbbLCh1_Range.Location = new System.Drawing.Point(73, 57);
this.cbbLCh1_Range.Name = "cbbLCh1_Range";
this.cbbLCh1_Range.Size = new System.Drawing.Size(75, 21);
this.cbbLCh1_Range.TabIndex = 5;
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(6, 41);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(38, 13);
this.label7.TabIndex = 4;
this.label7.Text = "Канал";
//
// cbbLCh1_Channel
//
this.cbbLCh1_Channel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLCh1_Channel.FormattingEnabled = true;
this.cbbLCh1_Channel.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbLCh1_Channel.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32"});
this.cbbLCh1_Channel.Location = new System.Drawing.Point(8, 57);
this.cbbLCh1_Channel.Name = "cbbLCh1_Channel";
this.cbbLCh1_Channel.Size = new System.Drawing.Size(46, 21);
this.cbbLCh1_Channel.TabIndex = 2;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(25, 22);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(171, 13);
this.label6.TabIndex = 1;
this.label6.Text = "Количество логических каналов";
//
// cbbLChCnt
//
this.cbbLChCnt.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbLChCnt.FormattingEnabled = true;
this.cbbLChCnt.Items.AddRange(new object[] {
"1",
"2",
"3"});
this.cbbLChCnt.Location = new System.Drawing.Point(211, 14);
this.cbbLChCnt.Name = "cbbLChCnt";
this.cbbLChCnt.Size = new System.Drawing.Size(49, 21);
this.cbbLChCnt.TabIndex = 0;
//
// btnStart
//
this.btnStart.Location = new System.Drawing.Point(27, 92);
this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(212, 23);
this.btnStart.TabIndex = 6;
this.btnStart.Text = "Запуск сбора данных";
this.btnStart.UseVisualStyleBackColor = true;
this.btnStart.Click += new System.EventHandler(this.btnStart_Click);
//
// btnStop
//
this.btnStop.Location = new System.Drawing.Point(27, 121);
this.btnStop.Name = "btnStop";
this.btnStop.Size = new System.Drawing.Size(212, 23);
this.btnStop.TabIndex = 7;
this.btnStop.Text = "Останов сбора данных";
this.btnStop.UseVisualStyleBackColor = true;
this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
//
// btnAsyncAdcFrame
//
this.btnAsyncAdcFrame.Location = new System.Drawing.Point(27, 549);
this.btnAsyncAdcFrame.Name = "btnAsyncAdcFrame";
this.btnAsyncAdcFrame.Size = new System.Drawing.Size(212, 23);
this.btnAsyncAdcFrame.TabIndex = 8;
this.btnAsyncAdcFrame.Text = "Асинхронный ввод кадра АЦП";
this.btnAsyncAdcFrame.UseVisualStyleBackColor = true;
this.btnAsyncAdcFrame.Click += new System.EventHandler(this.btnAsyncAdcFrame_Click);
//
// groupBox4
//
this.groupBox4.Controls.Add(this.cbbSyncStartMode);
this.groupBox4.Controls.Add(this.label12);
this.groupBox4.Controls.Add(this.cbbSyncMode);
this.groupBox4.Controls.Add(this.label11);
this.groupBox4.Location = new System.Drawing.Point(27, 307);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(518, 64);
this.groupBox4.TabIndex = 9;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Синхронизация";
//
// cbbSyncStartMode
//
this.cbbSyncStartMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbSyncStartMode.FormattingEnabled = true;
this.cbbSyncStartMode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbSyncStartMode.Items.AddRange(new object[] {
"Внутренний",
"От внешнего мастера",
"Фронт сигнала DI_SYN1",
"Фронт сигнала DI_SYN2",
"Спад сигнала DI_SYN1",
"Спад сигнала DI_SYN2"});
this.cbbSyncStartMode.Location = new System.Drawing.Point(228, 37);
this.cbbSyncStartMode.Name = "cbbSyncStartMode";
this.cbbSyncStartMode.Size = new System.Drawing.Size(176, 21);
this.cbbSyncStartMode.TabIndex = 11;
//
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(228, 16);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(242, 13);
this.label12.TabIndex = 10;
this.label12.Text = "Источник запуска синхронного ввода/вывода";
//
// cbbSyncMode
//
this.cbbSyncMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbbSyncMode.FormattingEnabled = true;
this.cbbSyncMode.ImeMode = System.Windows.Forms.ImeMode.Hiragana;
this.cbbSyncMode.Items.AddRange(new object[] {
"Внутренний",
"От внешнего мастера",
"Фронт сигнала DI_SYN1",
"Фронт сигнала DI_SYN2",
"Спад сигнала DI_SYN1",
"Спад сигнала DI_SYN2"});
this.cbbSyncMode.Location = new System.Drawing.Point(10, 37);
this.cbbSyncMode.Name = "cbbSyncMode";
this.cbbSyncMode.Size = new System.Drawing.Size(176, 21);
this.cbbSyncMode.TabIndex = 9;
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(7, 16);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(179, 13);
this.label11.TabIndex = 8;
this.label11.Text = "Источник частоты синхронизации";
//
// btnAsyncDigIn
//
this.btnAsyncDigIn.Location = new System.Drawing.Point(27, 578);
this.btnAsyncDigIn.Name = "btnAsyncDigIn";
this.btnAsyncDigIn.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDigIn.TabIndex = 10;
this.btnAsyncDigIn.Text = "Асинхронный ввод цифровых линий";
this.btnAsyncDigIn.UseVisualStyleBackColor = true;
this.btnAsyncDigIn.Click += new System.EventHandler(this.btnAsyncDigIn_Click);
//
// btnAsyncDigOut
//
this.btnAsyncDigOut.Location = new System.Drawing.Point(27, 607);
this.btnAsyncDigOut.Name = "btnAsyncDigOut";
this.btnAsyncDigOut.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDigOut.TabIndex = 11;
this.btnAsyncDigOut.Text = "Асинхронный вывод цифровых линий";
this.btnAsyncDigOut.UseVisualStyleBackColor = true;
this.btnAsyncDigOut.Click += new System.EventHandler(this.btnAsyncDigOut_Click);
//
// btnAsyncDac1
//
this.btnAsyncDac1.Location = new System.Drawing.Point(27, 636);
this.btnAsyncDac1.Name = "btnAsyncDac1";
this.btnAsyncDac1.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDac1.TabIndex = 12;
this.btnAsyncDac1.Text = "Асинхронный вывод на ЦАП1 (Вольты)";
this.btnAsyncDac1.UseVisualStyleBackColor = true;
this.btnAsyncDac1.Click += new System.EventHandler(this.btnAsyncDac1_Click);
//
// btnAsyncDac2
//
this.btnAsyncDac2.Location = new System.Drawing.Point(27, 665);
this.btnAsyncDac2.Name = "btnAsyncDac2";
this.btnAsyncDac2.Size = new System.Drawing.Size(212, 23);
this.btnAsyncDac2.TabIndex = 13;
this.btnAsyncDac2.Text = "Асинхронный вывод на ЦАП2 (Вольты)";
this.btnAsyncDac2.UseVisualStyleBackColor = true;
this.btnAsyncDac2.Click += new System.EventHandler(this.btnAsyncDac2_Click);
//
// edtAsyncDigIn
//
this.edtAsyncDigIn.Location = new System.Drawing.Point(255, 580);
this.edtAsyncDigIn.Name = "edtAsyncDigIn";
this.edtAsyncDigIn.Size = new System.Drawing.Size(101, 20);
this.edtAsyncDigIn.TabIndex = 14;
//
// edtAsyncDigOut
//
this.edtAsyncDigOut.Location = new System.Drawing.Point(255, 610);
this.edtAsyncDigOut.Name = "edtAsyncDigOut";
this.edtAsyncDigOut.Size = new System.Drawing.Size(101, 20);
this.edtAsyncDigOut.TabIndex = 15;
this.edtAsyncDigOut.Text = "0x0000";
//
// edtAsyncDac1
//
this.edtAsyncDac1.Location = new System.Drawing.Point(255, 639);
this.edtAsyncDac1.Name = "edtAsyncDac1";
this.edtAsyncDac1.Size = new System.Drawing.Size(58, 20);
this.edtAsyncDac1.TabIndex = 16;
this.edtAsyncDac1.Text = "5";
//
// edtAsyncDac2
//
this.edtAsyncDac2.Location = new System.Drawing.Point(255, 665);
this.edtAsyncDac2.Name = "edtAsyncDac2";
this.edtAsyncDac2.Size = new System.Drawing.Size(58, 20);
this.edtAsyncDac2.TabIndex = 17;
this.edtAsyncDac2.Text = "5";
//
// chkEthSupport
//
this.chkEthSupport.AutoSize = true;
this.chkEthSupport.Enabled = false;
this.chkEthSupport.Location = new System.Drawing.Point(6, 85);
this.chkEthSupport.Name = "chkEthSupport";
this.chkEthSupport.Size = new System.Drawing.Size(182, 17);
this.chkEthSupport.TabIndex = 9;
this.chkEthSupport.Text = "Наличие сетевого интерфейса";
this.chkEthSupport.UseVisualStyleBackColor = true;
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(74, 157);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(124, 13);
this.label13.TabIndex = 11;
this.label13.Text = "Версия прошивки ARM";
//
// edtMcuVer
//
this.edtMcuVer.Enabled = false;
this.edtMcuVer.Location = new System.Drawing.Point(6, 154);
this.edtMcuVer.Name = "edtMcuVer";
this.edtMcuVer.Size = new System.Drawing.Size(62, 20);
this.edtMcuVer.TabIndex = 10;
//
// edtIpAddr
//
this.edtIpAddr.Location = new System.Drawing.Point(27, 203);
this.edtIpAddr.Name = "edtIpAddr";
this.edtIpAddr.Size = new System.Drawing.Size(212, 20);
this.edtIpAddr.TabIndex = 18;
this.edtIpAddr.Text = "192.168.0.1";
//
// btnOpenByIP
//
this.btnOpenByIP.Location = new System.Drawing.Point(27, 174);
this.btnOpenByIP.Name = "btnOpenByIP";
this.btnOpenByIP.Size = new System.Drawing.Size(212, 23);
this.btnOpenByIP.TabIndex = 19;
this.btnOpenByIP.Text = "Установить соединение по IP-адресу";
this.btnOpenByIP.UseVisualStyleBackColor = true;
this.btnOpenByIP.Click += new System.EventHandler(this.btnOpenByIP_Click);
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(553, 736);
this.Controls.Add(this.btnOpenByIP);
this.Controls.Add(this.edtIpAddr);
this.Controls.Add(this.edtAsyncDac2);
this.Controls.Add(this.edtAsyncDac1);
this.Controls.Add(this.edtAsyncDigOut);
this.Controls.Add(this.edtAsyncDigIn);
this.Controls.Add(this.btnAsyncDac2);
this.Controls.Add(this.btnAsyncDac1);
this.Controls.Add(this.btnAsyncDigOut);
this.Controls.Add(this.btnAsyncDigIn);
this.Controls.Add(this.groupBox4);
this.Controls.Add(this.btnAsyncAdcFrame);
this.Controls.Add(this.btnStop);
this.Controls.Add(this.btnStart);
this.Controls.Add(this.groupBox3);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.btnOpen);
this.Controls.Add(this.cbbSerialList);
this.Controls.Add(this.btnRefreshDeviceList);
this.Name = "MainForm";
this.Text = "L502/E502 example";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button btnRefreshDeviceList;
private System.Windows.Forms.ComboBox cbbSerialList;
private System.Windows.Forms.Button btnOpen;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.CheckBox chkBfPresent;
private System.Windows.Forms.CheckBox chkGalPresent;
private System.Windows.Forms.CheckBox chkDacPresent;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox edtPldaVer;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox edtFpgaVer;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Button btnSetAdcFreq;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox edtDinFreq;
private System.Windows.Forms.TextBox edtAdcFreqLch;
private System.Windows.Forms.TextBox edtAdcFreq;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.ComboBox cbbLChCnt;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.ComboBox cbbLCh1_Channel;
private System.Windows.Forms.ComboBox cbbLCh1_Mode;
private System.Windows.Forms.ComboBox cbbLCh1_Range;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.CheckBox chkSyncDin;
private System.Windows.Forms.TextBox edtDin_Result;
private System.Windows.Forms.TextBox edtLCh3_Result;
private System.Windows.Forms.TextBox edtLCh2_Result;
private System.Windows.Forms.ComboBox cbbLCh3_Mode;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.ComboBox cbbLCh3_Range;
private System.Windows.Forms.ComboBox cbbLCh2_Mode;
private System.Windows.Forms.ComboBox cbbLCh3_Channel;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.ComboBox cbbLCh2_Range;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.ComboBox cbbLCh2_Channel;
private System.Windows.Forms.TextBox edtLCh1_Result;
private System.Windows.Forms.Button btnStart;
private System.Windows.Forms.Button btnStop;
private System.Windows.Forms.Button btnAsyncAdcFrame;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.ComboBox cbbSyncStartMode;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.ComboBox cbbSyncMode;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Button btnAsyncDigIn;
private System.Windows.Forms.Button btnAsyncDigOut;
private System.Windows.Forms.Button btnAsyncDac1;
private System.Windows.Forms.Button btnAsyncDac2;
private System.Windows.Forms.TextBox edtAsyncDigIn;
private System.Windows.Forms.TextBox edtAsyncDigOut;
private System.Windows.Forms.TextBox edtAsyncDac1;
private System.Windows.Forms.TextBox edtAsyncDac2;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox edtMcuVer;
private System.Windows.Forms.CheckBox chkEthSupport;
private System.Windows.Forms.TextBox edtIpAddr;
private System.Windows.Forms.Button btnOpenByIP;
}
}
+592
View File
@@ -0,0 +1,592 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using x502api;
using lpcieapi;
namespace x502_example
{
public partial class MainForm : Form
{
const uint RECV_BUF_SIZE = 8*1024*1024;
const uint RECV_TOUT = 250;
X502.DevRec[] devrecs;
X502 hnd; /* Описатель модуля с которым работаем (null, если связи нет) */
Thread thread; /* Объект потока для синхронного сбора */
bool reqStop; /* Запрос на останов потока сбора данных */
bool threadRunning; /* Признак, идет ли сбор данных в отдельном потоке */
UInt32[] rcv_buf; /* буфер для приема сырых данных */
double[] adcData; /* буфер для данных АЦП */
UInt32[] dinData; /* буфер для отсчетов цифровых входов */
UInt32 adcSize, dinSize; /* размер действительных данных в adcData и dinData */
UInt32 firstLch; /* номер логического канала, которому соответствует отсчет в adcData[0] */
private delegate void finishThreadDelegate(lpcie.Errs err);
private delegate void updateDateDelegate();
/* Обновление элементов управления, значениями, снятыми при синхронном вводе.
* Так работа с интерфейсом может быть только из основного потока, а
* фунция вызывается из потока сбора данных, то если мы находимся
* в потоке сбора данных, планируем ее выполнение в основном потоке */
private void UpdateData()
{
if (this.InvokeRequired)
{
this.Invoke(new updateDateDelegate(this.UpdateData));
}
else
{
TextBox[] lchResEdits = {edtLCh1_Result, edtLCh2_Result, edtLCh3_Result};
UInt32 lch_cnt = hnd.LChannelCount;
/* устанавливаем в индикаторах значение первого отсчета из массива */
for (uint i = 0; (i < lch_cnt) && (i < adcSize); i++)
lchResEdits[(firstLch + i) % lch_cnt].Text = adcData[i].ToString("F7");
/* если есть данные цифрового выхода, то устанавливаем индикатор
в соответствии с первым значением */
if (dinSize>0)
edtDin_Result.Text = dinData[0].ToString("X5");
else
edtDin_Result.Text = "";
}
}
/* Функция, вызываемая по завершению потока сбора данных.
* Так как она работает с интерфейсом, то при вызове из другого потока,
* она планируется на выполнения в основном потоке, как и UpdateData */
private void finishThread(lpcie.Errs err)
{
if (this.InvokeRequired)
this.Invoke(new finishThreadDelegate(this.finishThread), err);
else
{
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Сбор данных завершен с ошибкой",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
threadRunning = false;
updateControls();
}
}
/* Функция синхронного сбора данных. Выполняется в отдельном потоке */
private void threadFunc()
{
reqStop = false;
/* запускаем синхронные потоки ввода-вывода*/
lpcie.Errs err = hnd.StreamsStart();
if (err == lpcie.Errs.OK)
{
/* выполняем прием пока не произойдет ошибка или
не будет запроса на останов от основного приложения */
while (!reqStop && (err == lpcie.Errs.OK))
{
/* принимаем данные синхронного ввода */
Int32 rcv_size = hnd.Recv(rcv_buf, RECV_BUF_SIZE, RECV_TOUT);
/* значение меньше нуля означает ошибку... */
if (rcv_size < 0)
err = (lpcie.Errs)rcv_size;
else if (rcv_size > 0)
{
/* если больше нуля - значит приняли новые данные */
dinSize = RECV_BUF_SIZE;
adcSize = RECV_BUF_SIZE;
/* получаем номер лог. какнала, соответствующий первому
отсчету АЦП, так как до этого могли обработать
некратное количество кадров */
firstLch = hnd.NextExpectedLchNum;
/* разбираем данные на синхронный ввод и отсчеты АЦП и
переводим АЦП в Вольты */
err = hnd.ProcessData(rcv_buf, (uint)rcv_size, X502.ProcFlags.VOLT,
adcData, ref adcSize, dinData, ref dinSize);
if (err == lpcie.Errs.OK)
{
/* обновляем значения элементов управления */
UpdateData();
}
}
}
/* по выходу из цикла отсанавливаем поток.
Чтобы не сбросить код ошибки (если вышли по ошибке)
результат останова сохраняем в отдельную переменную */
lpcie.Errs stop_err = hnd.StreamsStop();
if (err == lpcie.Errs.OK)
err = stop_err;
}
/* завершаем поток */
finishThread(err);
}
/* обновление состояния элементов управления (какие разрешены, какие нет) */
private void updateControls()
{
btnRefreshDeviceList.Enabled = hnd==null;
cbbSerialList.Enabled = hnd==null;
btnOpen.Text = hnd==null ? "Установить связь с устройством" :
"Разорвать связь с устройством";
btnOpen.Enabled = (hnd!=null) || (cbbSerialList.SelectedItem != null);
btnOpenByIP.Enabled = (hnd == null);
edtIpAddr.Enabled = (hnd == null);
chkSyncDin.Enabled = (hnd != null) && !threadRunning;
btnStart.Enabled = (hnd != null) && !threadRunning;
btnStop.Enabled = (hnd != null) && threadRunning;
btnSetAdcFreq.Enabled = (hnd != null) && !threadRunning;
btnAsyncDigOut.Enabled = (hnd != null);
btnAsyncDigIn.Enabled = (hnd != null);
btnAsyncDac1.Enabled = (hnd != null) && chkDacPresent.Checked;
btnAsyncDac2.Enabled = (hnd != null) && chkDacPresent.Checked;
btnAsyncAdcFrame.Enabled = (hnd != null) && !threadRunning;
}
private void deviceClose()
{
if (hnd != null)
{
//останов сбора данных
if (threadRunning)
{
reqStop = true;
/* ожидаем завершения потока. Так как
* поток работает с GUI и планирует выполнение части
* функций в основном потоке, то мы не можем сдесь просто
* сделать Join, вызываем Application.DoEvents(), чтобы
* в нем обработать запланированные UpdateData()/finishThread() */
while (threadRunning)
{
Application.DoEvents();
}
}
// закрытие связи с модулем
hnd.Close();
// память освободится диспетчером мусора, т.к. нет больше ссылок
hnd = null;
}
}
private void refreshDevList()
{
cbbSerialList.Items.Clear();
//получаем список серийных номеров
X502.DevRec[] pci_devrecs;
X502.DevRec[] usb_devrecs;
Int32 res = L502.GetDevRecordsList(out pci_devrecs, 0);
res = E502.UsbGetDevRecordsList(out usb_devrecs, 0);
devrecs = new X502.DevRec[pci_devrecs.Length + usb_devrecs.Length];
pci_devrecs.CopyTo(devrecs, 0);
usb_devrecs.CopyTo(devrecs, pci_devrecs.Length);
/* заполняем полученные серийные номера в ComboBox */
for (int i = 0; i < devrecs.Length; i++)
cbbSerialList.Items.Add(devrecs[i].DevName + ", " + devrecs[i].Serial);
if (devrecs.Length > 0)
cbbSerialList.SelectedIndex = 0;
updateControls();
}
/* установка частот сбора данных из элементов управления и обновление их реально
* установленными значениями */
lpcie.Errs setAdcFreq()
{
lpcie.Errs err = lpcie.Errs.OK;
double f_acq, f_lch, f_din;
f_acq = Convert.ToDouble(edtAdcFreq.Text);
f_lch = Convert.ToDouble(edtAdcFreqLch.Text);
f_din = Convert.ToDouble(edtDinFreq.Text);
// устанавливаем требуемую частоту сбора.
err = hnd.SetAdcFreq(ref f_acq, ref f_lch);
if (err == lpcie.Errs.OK)
{
// обновляем значение индикатора, для отображения
// реально установившейся частоты
edtAdcFreq.Text = f_acq.ToString();
edtAdcFreqLch.Text = f_lch.ToString();
// Устанавливаем частоту синхронного сбора
err = hnd.SetDinFreq(ref f_din);
if (err == lpcie.Errs.OK)
edtDinFreq.Text = f_din.ToString();
}
return err;
}
/* настройка параметров модуля значениями из элементов управления */
lpcie.Errs setupParams()
{
lpcie.Errs err = lpcie.Errs.OK;
/* таблица соответствия индексов в ComboBox и кодов режима измерения */
X502.LchMode[] f_mode_tbl = {X502.LchMode.COMM, X502.LchMode.DIFF, X502.LchMode.ZERO};
/* таблица соответствия индексов в ComboBox и кодов диапазонов АЦП */
X502.AdcRange[] f_range_tbl = {X502.AdcRange.RANGE_10, X502.AdcRange.RANGE_5, X502.AdcRange.RANGE_2,
X502.AdcRange.RANGE_1, X502.AdcRange.RANGE_05, X502.AdcRange.RANGE_02};
/* таблица соответствия индексов в ComboBox и кодов источника синхронизации */
X502.Sync[] f_sync_tbl = {X502.Sync.INTERNAL, X502.Sync.EXTERNAL_MASTER,
X502.Sync.DI_SYN1_RISE, X502.Sync.DI_SYN2_RISE,
X502.Sync.DI_SYN1_FALL, X502.Sync.DI_SYN2_FALL};
UInt32 lch_cnt = Convert.ToUInt32(cbbLChCnt.Text);
/* Устанавливаем кол-во логических каналов */
hnd.LChannelCount = lch_cnt;
/* Настраниваем таблицу логических каналов */
err = hnd.SetLChannel(0, Convert.ToUInt32(cbbLCh1_Channel.Text) - 1,
f_mode_tbl[cbbLCh1_Mode.SelectedIndex], f_range_tbl[cbbLCh1_Range.SelectedIndex], 0);
if ((err == lpcie.Errs.OK) && (lch_cnt >= 2))
{
err = hnd.SetLChannel(1, Convert.ToUInt32(cbbLCh2_Channel.Text) - 1,
f_mode_tbl[cbbLCh2_Mode.SelectedIndex], f_range_tbl[cbbLCh2_Range.SelectedIndex], 0);
}
if ((err == lpcie.Errs.OK) && (lch_cnt >= 3))
{
err = hnd.SetLChannel(2, Convert.ToUInt32(cbbLCh3_Channel.Text) - 1,
f_mode_tbl[cbbLCh3_Mode.SelectedIndex], f_range_tbl[cbbLCh3_Range.SelectedIndex], 0);
}
/* Настраиваем источник частоты синхронизации и запуска сбора */
if (err == lpcie.Errs.OK)
{
hnd.SyncMode = f_sync_tbl[cbbSyncMode.SelectedIndex];
hnd.SyncStartMode = f_sync_tbl[cbbSyncStartMode.SelectedIndex];
}
/* настраиваем частоту сбора с АЦП */
if (err == lpcie.Errs.OK)
err = setAdcFreq();
/* Записываем настройки в модуль */
if (err == lpcie.Errs.OK)
err = hnd.Configure(0);
return err;
}
lpcie.Errs setSyncDinStream()
{
lpcie.Errs err;
/* разрешаем или запрещаем поток синхронного ввода
с цифровых линий в зависимости от состояния переключателя */
if (chkSyncDin.Checked)
err = hnd.StreamsEnable(X502.Streams.DIN);
else
err = hnd.StreamsDisable(X502.Streams.DIN);
return err;
}
public MainForm()
{
InitializeComponent();
cbbLChCnt.SelectedIndex = 2;
cbbLCh1_Channel.SelectedIndex = 0;
cbbLCh2_Channel.SelectedIndex = 1;
cbbLCh3_Channel.SelectedIndex = 2;
cbbLCh1_Range.SelectedIndex = 0;
cbbLCh2_Range.SelectedIndex = 0;
cbbLCh3_Range.SelectedIndex = 0;
cbbLCh1_Mode.SelectedIndex = 1;
cbbLCh2_Mode.SelectedIndex = 1;
cbbLCh3_Mode.SelectedIndex = 1;
cbbSyncMode.SelectedIndex = 0;
cbbSyncStartMode.SelectedIndex = 0;
rcv_buf = new UInt32[RECV_BUF_SIZE];
dinData = new UInt32[RECV_BUF_SIZE];
adcData = new double[RECV_BUF_SIZE];
threadRunning = false;
refreshDevList();
}
private void btnRefreshDeviceList_Click(object sender, EventArgs e)
{
refreshDevList();
}
private void showDevInfo()
{
/* получаем информацию о модуле */
X502.Info devinfo = hnd.DevInfo;
/* отображаем ее на панели */
chkBfPresent.Checked = (devinfo.DevFlags & X502.DevFlags.BF_PRESENT) != 0;
chkDacPresent.Checked = (devinfo.DevFlags & X502.DevFlags.DAC_PRESENT) != 0;
chkGalPresent.Checked = (devinfo.DevFlags & X502.DevFlags.GAL_PRESENT) != 0;
chkEthSupport.Checked = (devinfo.DevFlags & X502.DevFlags.IFACE_SUPPORT_ETH) != 0;
edtFpgaVer.Text = devinfo.FpgaVerString;
edtPldaVer.Text = string.Format("{0}", devinfo.PldaVer);
edtMcuVer.Text = devinfo.McuFirmwareVerString;
}
private void btnOpen_Click(object sender, EventArgs e)
{
if (hnd == null)
{
lpcie.Errs res;
int idx = cbbSerialList.SelectedIndex;
if (idx >= 0)
{
/* создаем описатель модуля */
hnd = X502.Create(devrecs[idx].DevName);
/* устанавливаем связь по выбранному серийному номеру */
res = hnd.Open(devrecs[idx]);
if (res == lpcie.Errs.OK)
{
showDevInfo();
}
else
{
MessageBox.Show(X502.GetErrorString(res), "Ошибка открытия модуля", MessageBoxButtons.OK,
MessageBoxIcon.Error);
hnd = null;
}
}
}
else
{
deviceClose();
}
updateControls();
}
private void btnOpenByIP_Click(object sender, EventArgs e)
{
/* создаем запись, соответствующую заданному адресу */
X502.DevRec rec = E502.MakeDevRecordByIpAddr(IPAddress.Parse(edtIpAddr.Text), 0, 5000);
if (rec != null)
{
/* создание объекта */
hnd = X502.Create(rec.DevName);
/* станавливаем связь устанавливаем связь по созданной записи */
lpcie.Errs res = hnd.Open(rec);
if (res == lpcie.Errs.OK)
{
showDevInfo();
}
else
{
MessageBox.Show(X502.GetErrorString(res), "Ошибка открытия модуля", MessageBoxButtons.OK,
MessageBoxIcon.Error);
hnd = null;
}
}
updateControls();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
deviceClose();
}
private void btnSetAdcFreq_Click(object sender, EventArgs e)
{
if (hnd != null)
{
hnd.LChannelCount = Convert.ToUInt32(cbbLChCnt.Text);
lpcie.Errs err = setAdcFreq();
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка установки частоты сбора",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnAsyncAdcFrame_Click(object sender, EventArgs e)
{
if (hnd != null)
{
/* устанавливаем параметры модуля */
lpcie.Errs err = setupParams();
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка настройки параметров АЦП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (err == lpcie.Errs.OK)
{
UInt32 lch_cnt = hnd.LChannelCount;
/* Создаем массив для приема количества отсчетов, равному количеству
* логических каналов */
double[] adc_data = new double[lch_cnt];
err = hnd.AsyncGetAdcFrame(X502.ProcFlags.VOLT, 1000, adc_data);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка приема кадра АЦП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
/* выводим результат */
edtLCh1_Result.Text = adc_data[0].ToString("F7");
if (lch_cnt >= 2)
edtLCh2_Result.Text = adc_data[1].ToString("F7");
else
edtLCh2_Result.Text = "";
if (lch_cnt >= 3)
edtLCh3_Result.Text = adc_data[2].ToString("F7");
else
edtLCh3_Result.Text = "";
}
}
}
}
private void btnAsyncDigIn_Click(object sender, EventArgs e)
{
if (hnd != null)
{
UInt32 din;
lpcie.Errs err = hnd.AsyncInDig(out din);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного ввода с цифровых линий",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
edtAsyncDigIn.Text = din.ToString("X5");
}
}
}
private void btnAsyncDigOut_Click(object sender, EventArgs e)
{
if (hnd != null)
{
UInt32 val = Convert.ToUInt32(edtAsyncDigOut.Text, 16);
lpcie.Errs err = hnd.AsyncOutDig(val, 0);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка асинхронного вывода на цифровые линии",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnAsyncDac1_Click(object sender, EventArgs e)
{
if (hnd != null)
{
double val = Convert.ToDouble(edtAsyncDac1.Text); ;
lpcie.Errs err = hnd.AsyncOutDac(X502.DacCh.CH1, val, X502.DacOutFlags.CALIBR |
X502.DacOutFlags.VOLT);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка вывода на ЦАП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnAsyncDac2_Click(object sender, EventArgs e)
{
if (hnd != null)
{
double val = Convert.ToDouble(edtAsyncDac2.Text); ;
lpcie.Errs err = hnd.AsyncOutDac(X502.DacCh.CH2, val, X502.DacOutFlags.CALIBR |
X502.DacOutFlags.VOLT);
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка вывода на ЦАП",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnStart_Click(object sender, EventArgs e)
{
/* настраиваем все параметры в соответствии с элементами управления */
lpcie.Errs err = setupParams();
/* разрешаем синхронный ввод АЦП */
if (err == lpcie.Errs.OK)
err = hnd.StreamsEnable(X502.Streams.ADC);
/* разрешаем синхронный ввод с цифровых линий в зависимости от переключателя */
if (err == lpcie.Errs.OK)
err = setSyncDinStream();
if (err != lpcie.Errs.OK)
{
MessageBox.Show(X502.GetErrorString(err), "Ошибка настройки параметров модуля",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
/* создаем новый поток для сбора в нем данных */
thread = new Thread(this.threadFunc);
threadRunning = true;
thread.Start();
updateControls();
}
}
private void btnStop_Click(object sender, EventArgs e)
{
if (threadRunning)
reqStop = true;
btnStop.Enabled = false;
}
}
}
+120
View File
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
+20
View File
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace x502_example
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("l502_example")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("l502_example")]
[assembly: AssemblyCopyright("Copyright © 2012")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("d011dc13-469b-4bd3-9597-97af3ea785db")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.269
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace l502_example.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("l502_example.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.269
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace l502_example.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}
@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>x502_example</RootNamespace>
<AssemblyName>x502_example</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
</PropertyGroup>
<ItemGroup>
<Reference Include="lpcieNet, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\lpcieNet\bin\Debug\lpcieNet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -0,0 +1,26 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C# Express 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "x502_general", "x502_general.csproj", "{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Debug|x86.ActiveCfg = Debug|x86
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Debug|x86.Build.0 = Debug|x86
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Release|Any CPU.Build.0 = Release|Any CPU
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Release|x86.ActiveCfg = Release|x86
{491BEE22-2D65-4112-B6A8-90FE8F15E5AE}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
+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
+30
View File
@@ -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
+2
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
Данный пример демонстрирует работу с модулем L502 на Visual Basic.
Данный пример не включает новые описания типов, добавленные для поддержки модуля E502,
а использует срарые версии функций.
Рекомендуется использовать пример x502_general, который использует обновленные описания и
позволяет работать как с модулями L502, так и с E502
+200
View File
@@ -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
+94
View File
@@ -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
+10
View File
@@ -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,
+789
View File
@@ -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