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


Проблема с программированием E14-140

Вы не вошли.

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

17.04.2015 14:25:33
#1

Участник
Здесь с 18.09.2014
Сообщений: 6

Проблема с программированием E14-140

Уважаемые разработчики, помогите разобрать с проблемой! Модуль E14-140, Windows 8.1, 64 разряда, среда разработки Delphi XE2. При попытке заполнить внутреннюю структуру параметров сбора данных функцией FillDAQparameters(FADCParam.t1) стабильно получаю "синий экран смерти" с сообщением system_thread_exception_not_handled. Ниже текст программы. Descriptor модуля считывается корректно.
Заранее спасибо.

unit SimplTest140Unit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Create, ifc_ldev, ioctl, Vcl.StdCtrls;

type
PData = ^TData;
TData = array[0..4096*10-1] of ULong;
PSyncE140 = ^ULong;
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
   FpLDev: IDaqLDevice;
   FADCParam: ADC_Par;  //параметры работы АЦП модуля
   FData: PData;  //указатель на начало большого буфера
   FSync: PSyncE140;  //указатель на переменную синхронизации
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var FpIUnknown: LUnknown; hr: integer; SizeBuf: ULong; slPar: Slot_Par;
     FPlataDescr: PLATA_DESCR_E140;
begin
if boolean(CallCreateInstance('lcomp.dll')) then
  begin
   FpIUnknown:=CreateInstance(0);
   if FpIUnknown <> nil then
    begin
     hr:=FpIUnknown.QueryInterface(IID_ILDEV,FpLDev);
     FpIUnknown.Release;
     if Succeeded(hr) then
      if FpLDev.OpenLDevice <> Invalid_Handle_value then
       with FplDev do
        begin
         GetSlotParam(slPar);
         ReadPlataDescr(FPlataDescr);
         with FADCParam.t1 do
          begin
           NCh:=2;
           Chn[0]:=$20;
           Chn[1]:=$21;
           s_Type:=L_ADC_Param;
           AutoInit:=0;
           dRate:=10;
           dKadr:=0;
           dScale:=0;
           SynchroType:=0;
     //      SynchroSrc:=0;
           FIFO:=0;
           IrqStep:=2;
           Pages:=4;//FADCMeasuringCount;
           IrqEna:=1;
           AdcEna:=1;
          end;
         SizeBuf:=4096*10;
         RequestBufferStream(SizeBuf,L_Stream_ADC); //выделение памяти под большой кольцевой буфер
         StopLDevice;
         if FillDAQparameters(FADCParam.t1) = L_SUCCESS then //заполним внутреннюю структуру параметров сбора данных
           //настраивает плату на заданные параметры ввода
          if SetParametersStream(FADCParam.t1,SizeBuf,FData,FSync,L_Stream_ADC) = L_SUCCESS then
           if InitStartLDevice = L_SUCCESS then //инициализирует внутренние переменные драйвера перед началом сбора

        end;
    end;
  end;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
if FpLDev <> nil then
  begin
   FpLDev.StopLDevice;
   FpLDev.CloseLDevice;
   FpLDev.Release;
   FpLDev:=nil;
  end;
end;

end.

17.04.2015 15:11:12
#2

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

Re: Проблема с программированием E14-140

а пример из дистрибутива как себя ведет?

17.04.2015 15:51:28
#3

Участник
Здесь с 18.09.2014
Сообщений: 6

Re: Проблема с программированием E14-140

Poul пишет:

а пример из дистрибутива как себя ведет?

Уточнение "синий экран смерти" вызывается не функцией FillDAQparameters, а SetParametersStream! Пример из дистрибутива, действительно, не вылетает, я почему-то не догадался его проанализировать, прошу прощения за поспешность. Спасибо!