Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Не тянет E 14-140 на заявленную частоту

Вы не вошли.

 Поиск | Регистрация | Вход 

Dimon
14.11.2008 21:26:24
#1

Гость

Не тянет E 14-140 на заявленную частоту

У меня выбра не было кроме как использовать ADC_SAMPLE для E 14-140. Тянет на 20 Гц вместо заявленных 100000.
Вот код, может что не так
library TermoConect;

uses
  LUSBAPI,
  SysUtils,
  Windows,
  Dialogs,
  Registry,
  Unit1;

{$R *.RES}

const
  OptPath : String = 'Options';

const
    // ìàêñèìàëüíî âîçìîæíîå êîë-âî îïðàøèâàåìûõ
    // âèðòóàëüíûõ ñëîòîâ (ïðè ïîèñêå ìîäóëÿ)
    MaxVirtualSoltsQuantity : WORD = 127;
    // ÷àñòîòà ââîäà äàííûõ
    AdcRate : double  = 100.0;

var
  //Óñèëåíèå
  GAIN : integer;
  //Äèôôåðåíöèàëüíûé ðåæèì
  DiffMode : boolean;
    // èíòåðôåéñ ìîäóëÿ E14-140
    pModule : ILE140;
    // âåðñèÿ áèáëèîòåêè Rtusbapi.dll
    DllVersion : DWORD;
    // íàçâàíèå ìîäóëÿ
    ModuleName: String;
    // ñòðóêòóðà ñ ïîëíîé èíôîðìàöèåé î ìîäóëå
    ModuleDescription : MODULE_DESCRIPTION_E140;
    // ñòðóêòóðà ïàðàìåòðîâ ðàáîòû ÀÖÏ
    ap : ADC_PARS_E140;

function InitConect : boolean; stdcall;
var
  i : integer;
  RegFile : TRegIniFile;
begin
//Ïîèñê èíôîðìàöèè â ðååñòðå
  RegFile := TRegIniFile.Create('Termo');
  GAIN := RegFile.ReadInteger(OptPath, 'GAIN', 1);
  DiffMode := RegFile.ReadBool(OptPath, 'DiffMode', False);
  RegFile.Free;
  Result := True;
    // ïðîâåðèì âåðñèþ èñïîëüçóåìîé DLL áèáëèîòåêè
    DllVersion := GetDllVersion;
    if DllVersion <> CURRENT_VERSION_LUSBAPI then
        begin
            ShowMessage('&#205;&#229;&#226;&#229;&#240;&#237;&#224;&#255; &#226;&#229;&#240;&#241;&#232;&#255; DLL &#225;&#232;&#225;&#235;&#232;&#238;&#242;&#229;&#234;&#232; Lusbapi.dll! ' + #10#13 +
                        '           &#210;&#229;&#234;&#243;&#249;&#224;&#255;: ' + IntToStr(DllVersion shr 16) +  '.' + IntToStr(DllVersion and $FFFF) + '.' +
                        ' &#210;&#240;&#229;&#225;&#243;&#229;&#242;&#241;&#255;: ' + IntToStr(CURRENT_VERSION_LUSBAPI shr 16) + '.' + IntToStr(CURRENT_VERSION_LUSBAPI and $FFFF) + '.');
      Result := False;
      Exit
        end;
    // &#239;&#238;&#239;&#240;&#238;&#225;&#243;&#229;&#236; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#243;&#234;&#224;&#231;&#224;&#242;&#229;&#235;&#252; &#237;&#224; &#232;&#237;&#242;&#229;&#240;&#244;&#229;&#233;&#241; &#228;&#235;&#255; &#236;&#238;&#228;&#243;&#235;&#255; E14-140
    pModule := CreateLInstance(pCHAR('e140'));
    if pModule = nil then
  begin
    ShowMessage('&#205;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238; &#237;&#224;&#233;&#242;&#232; &#232;&#237;&#242;&#229;&#240;&#244;&#229;&#233;&#241; &#236;&#238;&#228;&#243;&#235;&#255; E14-140!');
    Result := False;
    Exit
  end;
    // &#239;&#238;&#239;&#240;&#238;&#225;&#243;&#229;&#236; &#238;&#225;&#237;&#224;&#240;&#243;&#230;&#232;&#242;&#252; &#236;&#238;&#228;&#243;&#235;&#252; E14-140 &#226; &#239;&#229;&#240;&#226;&#251;&#245; 127 &#226;&#232;&#240;&#242;&#243;&#224;&#235;&#252;&#237;&#251;&#245; &#241;&#235;&#238;&#242;&#224;&#245;
    for i := 0 to (MaxVirtualSoltsQuantity-1) do if pModule.OpenLDevice(i) then break;
    // &#247;&#242;&#238;-&#237;&#232;&#225;&#243;&#228;&#252; &#238;&#225;&#237;&#224;&#240;&#243;&#230;&#232;&#235;&#232;?
    if i = MaxVirtualSoltsQuantity then
  begin
    ShowMessage('&#205;&#229; &#243;&#228;&#224;&#235;&#238;&#241;&#252; &#238;&#225;&#237;&#224;&#240;&#243;&#230;&#232;&#242;&#252; &#236;&#238;&#228;&#243;&#235;&#252; E14-140 &#226; &#239;&#229;&#240;&#226;&#251;&#245; 127 &#226;&#232;&#240;&#242;&#243;&#224;&#235;&#252;&#237;&#251;&#245; &#241;&#235;&#238;&#242;&#224;&#245;!');
    Result := False;
    Exit
  end;
    // &#239;&#240;&#238;&#247;&#232;&#242;&#224;&#229;&#236; &#237;&#224;&#231;&#226;&#224;&#237;&#232;&#229; &#236;&#238;&#228;&#243;&#235;&#255; &#226; &#242;&#229;&#234;&#243;&#249;&#229;&#236; &#226;&#232;&#240;&#242;&#243;&#224;&#235;&#252;&#237;&#238;&#236; &#241;&#235;&#238;&#242;&#229;
    ModuleName := '0123456';
    if not pModule.GetModuleName(pCHAR(ModuleName)) then
  begin
    ShowMessage('&#205;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238; &#239;&#240;&#238;&#247;&#232;&#242;&#224;&#242;&#252; &#237;&#224;&#231;&#226;&#224;&#237;&#232;&#229; &#236;&#238;&#228;&#243;&#235;&#255;!');
    Result := False;
    Exit
  end;
    // &#239;&#240;&#238;&#226;&#229;&#240;&#232;&#236;, &#247;&#242;&#238; &#253;&#242;&#238; &#236;&#238;&#228;&#243;&#235;&#252; E14-140
    if Boolean(AnsiCompareStr(ModuleName, 'E140')) then
  begin
    ShowMessage('&#206;&#225;&#237;&#224;&#240;&#243;&#230;&#229;&#237;&#237;&#251;&#233; &#236;&#238;&#228;&#243;&#235;&#252; &#237;&#229; &#255;&#226;&#235;&#255;&#229;&#242;&#241;&#255; E14-140!');
    Result := False;
    Exit
  end;
    // &#242;&#229;&#239;&#229;&#240;&#252; &#239;&#238;&#235;&#243;&#247;&#232;&#236; &#237;&#238;&#236;&#229;&#240; &#226;&#229;&#240;&#241;&#232;&#232; &#231;&#224;&#227;&#240;&#243;&#230;&#229;&#237;&#237;&#238;&#227;&#238; &#228;&#240;&#224;&#233;&#226;&#229;&#240;&#224; DSP
    if not pModule.GET_MODULE_DESCRIPTION(@ModuleDescription) then
  begin
    ShowMessage('&#205;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#232;&#237;&#244;&#238;&#240;&#236;&#224;&#246;&#232;&#254; &#238; &#236;&#238;&#228;&#243;&#235;&#229;!');
    Result := False;
    Exit
  end;
    // &#239;&#238;&#235;&#243;&#247;&#232;&#236; &#242;&#229;&#234;&#243;&#249;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251; &#240;&#224;&#225;&#238;&#242;&#251; &#226;&#226;&#238;&#228;&#224; &#228;&#224;&#237;&#237;&#251;&#245;
    if not pModule.GET_ADC_PARS(@ap) then
  begin
    ShowMessage('&#205;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#242;&#229;&#234;&#243;&#249;&#232;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251; &#226;&#226;&#238;&#228;&#224; &#228;&#224;&#237;&#237;&#251;&#245;!');
    Result := False;
    Exit
  end;
  ap.ClkSource := INT_ADC_CLOCK_E140;
  ap.EnableClkOutput := ADC_CLOCK_TRANS_DISABLED_E140;
  ap.InputMode := NO_SYNC_E140;
  ap.AdcRate := AdcRate;
  ap.InterKadrDelay := 0.0;
    // &#239;&#229;&#240;&#229;&#228;&#224;&#229;&#236; &#226; &#236;&#238;&#228;&#243;&#235;&#252; &#242;&#240;&#229;&#225;&#243;&#229;&#236;&#251;&#229; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251; &#239;&#238; &#226;&#226;&#238;&#228;&#243; &#228;&#224;&#237;&#237;&#251;&#245;
  if not pModule.SET_ADC_PARS(@ap) then
  begin
    ShowMessage('&#205;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#232;&#242;&#252; &#239;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251; &#226;&#226;&#238;&#228;&#224; &#228;&#224;&#237;&#237;&#251;&#245;!');
    Result := False;
    Exit
  end
end;

function GetRes(Chan : Integer) : integer; stdcall;
var
  LogChan : word;
  Data : short;
begin
//&#194;&#251;&#247;&#232;&#241;&#235;&#255;&#229;&#236; &#235;&#238;&#227;&#232;&#247;&#229;&#241;&#234;&#232;&#233; &#237;&#238;&#236;&#229;&#240; &#234;&#224;&#237;&#224;&#235;&#224;
  LogChan := Chan;
  if not DiffMode then Inc(LogChan, 32);
  if GAIN = 4     then Inc(LogChan, 64);
  if GAIN = 16    then Inc(LogChan, 128);
  if GAIN = 64    then Inc(LogChan, 192);
//&#206;&#241;&#243;&#249;&#229;&#241;&#242;&#226;&#235;&#255;&#229;&#236; &#239;&#240;&#229;&#238;&#225;&#240;&#224;&#231;&#238;&#226;&#224;&#237;&#232;&#229;
  if not pModule.ADC_SAMPLE(@Data, LogChan) then Result := -1 else Result := Data
end;

procedure DoneConect; stdcall;
begin
  pModule.CloseLDevice;
  pModule.ReleaseLInstance
end;

procedure Setup; stdcall;
var
  RegFile : TRegIniFile;
  SetupDlg: TSetupDlg;
begin
  RegFile := TRegIniFile.Create('Termo');
  GAIN := RegFile.ReadInteger(OptPath, 'GAIN', 1);
  DiffMode := RegFile.ReadBool(OptPath, 'DiffMode', False);
  SetupDlg := TSetupDlg.Create(Nil);
  SetupDlg.ComboBox1.Text := IntToStr(GAIN);
  SetupDlg.CheckBox1.Checked := DiffMode;
  SetupDlg.ShowModal;
  GAIN := StrToInt(SetupDlg.ComboBox1.Text);
  DiffMode := SetupDlg.CheckBox1.Checked;
  SetupDlg.Destroy;
  RegFile.WriteInteger(OptPath, 'GAIN', GAIN);
  RegFile.WriteBool(OptPath, 'DiffMode', DiffMode);
  RegFile.Free
end;

exports
  InitConect,
  GetRes,
  DoneConect,
  Setup;

begin
end.

15.11.2008 23:04:28
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 674

Re: Не тянет E 14-140 на заявленную частоту

Большие скорости ввода по USB возможны только при потоковом вводе. Однократный опрос АЦП осуществляется через медленный USB канал (Control Pipe), в этом режиме больше 20 Гц получить невозможно.
Так что если Вам нужно оцифровывать данные с большой частотой, используйте функции синхронного ввода.

Dimon
17.11.2008 13:57:14
#3

Гость

Re: Не тянет E 14-140 на заявленную частоту

А у меня по другому не получится. У меня каналы опрашиваются произвольно, но определенному алгоритму. Наверное если для каждого канала задавать параметры и делать старт-стоп это будет еще медленнее?
Что делать то?

17.11.2008 14:08:04
#4

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Не тянет E 14-140 на заявленную частоту

там табличка есть для опроса каналов. Можно поробовать в ней задать хитрый порядок типа  1 1 2 3 1 1 2 3 итп если получится...

Dimon
17.11.2008 14:49:36
#5

Гость

Re: Не тянет E 14-140 на заявленную частоту

Нашел я выход с помощью lcomp.
Все работает очень быстро.
library TermoConect;

uses
  ifc_ldev,
  ioctl,
  create,
  PCICMD,
  Windows,
  Dialogs,
  SysUtils,
  Classes;

var
  pLDev : IDaqLDevice;
  pIUnknown : LUnknown;
  hr : Integer;
  dev: THandle;
  ap : ADC_PAR;

{$R *.RES}

function InitConect : boolean; stdcall;
begin
   Result := True;
   if CallCreateInstance('lcomp.dll') <> 1  then
   begin
     ShowMessage('Cannot load library!');
     Result := False;
     Exit
   end;
   pIUnknown:=CreateInstance(0);
   hr := pIUnknown.QueryInterface(IID_ILDEV,pLDev);
   if not Succeeded(hr) then
   begin
     ShowMessage('Get interface failed!');
     Result := False;
     Exit
   end;
   pIUnknown.Release;
   dev:=pLDev.OpenLDevice;
   if dev = INVALID_HANDLE_VALUE then
   begin
     ShowMessage('Cannot open device!');
     Result := False;
     Exit
   end;
   if pLDev.PlataTest  = L_ERROR then
   begin
     ShowMessage('Plata test failed!');
     Result := False;
     Exit
   end;
   pLDev.PutWord_DM(L_ADC_ENABLE_PLX, 0)
end;

function GetRes(Chan : Integer) : integer; stdcall;
var
  pp : ASYNC_PAR;
begin
  pp.S_TYPE := L_ASYNC_ADC_INP;
  pp.Chn[0] := Chan;
  pLDev.IoAsync(pp);
  Result := MAXWORD - pp.Data[0];
end;

procedure DoneConect;
begin
  pLDev.CloseLDevice;
  pLDev.Release
end;

procedure Setup; stdcall;
begin
end;

exports
  InitConect,
  GetRes,
  DoneConect,
  Setup;

begin
end.

17.11.2008 14:49:40
#6

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 674

Re: Не тянет E 14-140 на заявленную частоту

Единственная возможность обеспечить частоты сбора выше 20 Гц через USB - это применение потоковых функций ввода данных, при этом в устройстве (E14-140) включается механизм FIFO буфера, который гарантирует отсутствие пропусков в вводимых данных. При асинхронном сборе сама винда может самопроизвольно вставлять задержки при выполнении программы в 10-30 мс.