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


Старые и новые версии SDK.

Вы не вошли.

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

Работник.
13.02.2012 15:55:37
#1

Гость

Старые и новые версии SDK.

Есть работающая программа для L783M(работала под XP 32) соответственно использовался старый lcomp.exe lcomp.dll и L783.bio, захотелось использовать под W7 попробовали новый lcomp.exe теперь программа вылетает с BSOD пишет ошибка UNEXPECTED_KERNEL_MODE_TRAP в ldevpci.sys.
видимо старая программа не работает с новым SDK, возможно ли не изменяя программу заставить работать её с новым SDK? если нет, то что необходимо заменить?

Работник.
13.02.2012 15:58:43
#2

Гость

Re: Старые и новые версии SDK.

Да еще дополнение, Lgraph вроде бы работает, пишет состояние платы Ok, драйвера тоже встают нормально.

13.02.2012 16:53:09
#3

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

Re: Старые и новые версии SDK.

если W7 32  бита, то так и пользовать старый SDK. Если нет - то никак...

Работник.
14.02.2012 09:09:43
#4

Гость

Re: Старые и новые версии SDK.

Дело в том, что после установки нового SDK, не удалось вернуться к использованию старого, путем удаления нового(штатными средствами uninstall) и установки заново старого.
видимо драйвер устройства и dll(lcomp.dll lcomp64.dll wlcomp.dll) из папки system32 надо удалять руками? возможно что то еще надо почистить?

Возвращаясь к предыдущему вопросу.
просто перекомпилирование программы не поможет, необходимо вносить измененияв программу, интерфейс существенно поменялся?

14.02.2012 10:52:47
#5

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

Re: Старые и новые версии SDK.

Драйвера удалить руками. Просто перекомпиляция должна помочь(менялась размерность полей в структурах с USHORT на ULONG )...

Работник.
14.02.2012 11:16:47
#6

Гость

Re: Старые и новые версии SDK.

Попробовал на чистой Win7 32, плата определилась, (старый драйвер встал) LGraph работает, но программа всё таки падает c BSOD.
Использовался драйвер ldevpci.sys от 17.04.2008 версия 6.0.0.0 (или 6.0.0.1) и lcomp.exe от 2 июня 2009 и lcomp.dll от 9 января 2008.
Видимо всё таки есть какое то различие между XP и Win7.

Насчет USHORT и ULONG посмотрю, спасибо.

14.02.2012 12:12:37
#7

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

Re: Старые и новые версии SDK.

Тогда это не настолько старый... в readme.txt отражен факт смены размерности...

Работник
15.01.2013 18:24:59
#8

Гость

Re: Старые и новые версии SDK.

Вернулся опять к этой теме.

выяснил что структура ADC_PAR изменилась.

было
DAQ_PAR                   = object
  public
   s_Type                 : USHORT;
   FIFO                   : USHORT;
   IrqStep                : USHORT;
   Pages                  : USHORT;
end;
ADC_PAR = object (DAQ_PAR)
public
   AutoInit           : USHORT;
   dRate              : double;
   dKadr              : double;
   dScale             : double;
   Rate               : USHORT;
   Kadr               : USHORT;
   Scale              : USHORT;
   FPDelay            : USHORT;
   SynchroType        : USHORT;
   SynchroSensitivity : USHORT;
   SynchroMode        : USHORT;
   AdChannel          : USHORT;
   AdPorog            : USHORT;
   NCh                : USHORT;
   Chn                : array [0..127] of USHORT;
   IrqEna             : USHORT;
   AdcEna             : USHORT;
end;

стало

ADC_PAR_0 = object (DAQ_PAR)
public
   AutoInit           : ULONG;
   dRate              : double;
   dKadr              : double;
   dScale             : double;

   Rate               : ULONG;
   Kadr               : ULONG;
   Scale              : ULONG;
   FPDelay            : ULONG;

   SynchroType        : ULONG;
   SynchroSensitivity : ULONG;
   SynchroMode        : ULONG;
   AdChannel          : ULONG;
   AdPorog            : ULONG;
   NCh                : ULONG;
   Chn                : array [0..127] of ULONG;
//   FIFO : USHORT;
//   IrqStep : USHORT;
//   Pages : USHORT;
   IrqEna             : ULONG;
   AdcEna             : ULONG;
end;
PADC_PAR_0 = ^ADC_PAR_0;

ADC_PAR_1 = object (DAQ_PAR)
public
   AutoInit    : ULONG;
   dRate       : double;
   dKadr       : double;
   Reserved1   : ULONG;
   DM_Ena      : ULONG;

   Rate        : ULONG;
   Kadr        : ULONG;
   StartCnt    : ULONG;
   StopCnt     : ULONG;

   SynchroType : ULONG;
   SynchroMode : ULONG;
   AdPorog     : ULONG;
   SynchroSrc  : ULONG;
   AdcIMask    : ULONG;
   NCh         : ULONG;
   Chn         : array [0..127] of ULONG;
//   FIFO : USHORT;
//   IrqStep : USHORT;
//   Pages : USHORT;
   IrqEna      : ULONG;
   AdcEna      : ULONG;
end;
PADC_PAR_1 = ^ADC_PAR_1;

ADC_PAR = record
   case Integer of
      0: (t1:ADC_PAR_0);
      1: (t2:ADC_PAR_1);
end;


т.е. по сути поменялось USHORT на ULONG и ADC_PAR стало ADC_PAR_0.

пока еще не выяснил, что еще изменилось.

еще вопрос сейчас я использую ifc_ldev и ioctl из папки DELPHI, в старом чужом коде я использования этих файлов не нашел(только похожий код), этих файлов раньше не существовало?

16.01.2013 08:35:09
#9

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

Re: Старые и новые версии SDK.

ворде существовали всегда. но можно и по другому их обозвать или переписать...

Работник
16.01.2013 13:24:03
#10

Гость

Re: Старые и новые версии SDK.

остановился на том, что SetParametersStream из ifc_ldev не выдает L_SUCCESS=0 или L_ERROR=2, а L_NOTSUPPORTED =1.

с чем это может быть связано?  плата L-783M использую L783.bio.
все шаги до SetParametersStream проходят успешно.

из документации

Pascal: function SetParametersStream(var sp:DAQ_PAR; var UsedSize:ULONG; out Data;
out Sync; StreamId:ULONG):ULONG;
Параметры:
PDAQ_PAR sp - структура, которая описывает параметры ввода или вывода данных
( ADC_PAR,DAC_PAR или другая в зависимости от типа поля s_Type);
ULONG *UsedSize - переменная, в которой будет возвращено количество реально
используемой памяти (в отсчетах АЦП);
void** Data - переменная, в которой будет возвращен адрес начала большого буфера;
void** Sync - переменная, в которой будет возвращен адрес переменной синхронизации;
ULONG StreamId - дескриптор потока (L_STREAM_ADC, L_STREAM_DAC или другой);

какие параметры передаю я
ADC_PAR_0
ULONG
PUSHORT  -непонятно какой должен быть тип
PULONG   -непонятно какой должен быть тип
L_STREAM_ADC

в примере для делфи тип 3 переменной например PWA
type
  WA = array [0..1048576] of SHORT;
  PWA = ^WA;


полный код

const
  PAGESAMOUNT             = 8192;
  SAMPLESPERCHUNK         = 1024;
  BUFFERSIZE              = SAMPLESPERCHUNK * PAGESAMOUNT;
  ap.s_Type             := L_ADC_PARAM;
  ap.AutoInit           := 1;
  ap.dRate              := 200.0;
  ap.dKadr              := 0.0;
  ap.dScale             := 0;
  ap.SynchroType        := 3;
  ap.SynchroSensitivity := 0;
  ap.SynchroMode        := 0;
  ap.AdChannel          := 0;
  ap.AdPorog            := 0;
  ap.NCh                := 1;
  ap.Chn[0]             := $0;
  ap.Chn[1]             := $1;
  ap.Chn[2]             := $2;
  ap.Chn[3]             := $3;
  ap.FIFO               := SAMPLESPERCHUNK;
  ap.IrqStep            := SAMPLESPERCHUNK;
  ap.Pages              := PAGESAMOUNT;
  ap.IrqEna             := 1;
  ap.AdcEna             := 1;
  Logger              := theLogger;
  halfBuffer          := BUFFERSIZE div 2;
  FreeOnTerminate     := True;
  Cycles              := TSamples.Create;
  Pixels              := TSamples.Create;
  Lines               := TSamples.Create;
  Frames              := TSamples.Create;
  LostedBlocks        := TSamples.Create;
  AcceptedBlocks      := TSamples.Create;
  FrameStartMarkers   := TSamples.Create;
  FrameEndMarkers     := TSamples.Create;
  FrameReverseMarkers := TSamples.Create;
  LineStartMarkers    := TSamples.Create;
  LineEndMarkers      := TSamples.Create;
  LineReverseMarkers  := TSamples.Create;
  WastedTimeMs        := TSamples.Create;
  ProcessingTimeMs    := TSamples.Create;
  Frames.ToAccept     := 1;
  Error               := inf_No_errors_detected.Num;

  hModule := LoadLibrary(/'lcomp.dll/');
  if (hModule = 0) then begin
    FatalError( err_Failed_to_find_lcomdll );
    Exit;
    end;

  @FuncCreateInstance := GetProcAddress ( hModule, /'CreateInstance/' );
  if (@FuncCreateInstance = nil) then  begin
    FatalError( err_Failed_to_find_ci_func );
    Exit;
    end;

  pIUnknown := FuncCreateInstance(0);
  if(pIUnknown = nil) then begin
    FatalError( err_Failed_to_find_slot0 );
    Exit;
    end;

  hr := pIUnknown.QueryInterface(IID_ILDEV,pLDev);
  if( not Succeeded(hr)) then begin
    FatalError( err_Failed_query_interface );
    Exit;
    end;

  pIUnknown.Release;
  dev:=pLDev.OpenLDevice;
  if dev = INVALID_HANDLE_VALUE then begin
    FatalError( err_Failed_to_open_device );
    Exit;
    end;

  if not FileExists (ExtractModulePath + /'L783.bio/') then begin
    FatalError  ( err_Failed_to_find_pgm_L783 );
    Exit;
    end;

  pLDev.LoadBios(/'l783/');
  Sleep(100);
  report := pLDev.PlataTest;
  if report <> L_SUCCESS then begin
    FatalError  ( err_Failed_to_test_L783 );
    Exit;
    end;

  pLDev.ReadPlataDescr(pd);

  pLDev.GetSlotParam(slot);

  pLDev.FillDAQparameters(ap);

  tm := BUFFERSIZE;
  report := pLDev.RequestBufferStream(tm, L_STREAM_ADC);
  if report <> L_SUCCESS then begin
    FatalError( err_Failed_allocate_circbuf );
    Exit;
    end;

  report := pLDev.SetParametersStream (
    ap, tm, StartOfCycleBuffer, sync, L_STREAM_ADC);
  if report <> L_SUCCESS then begin
    FatalError( err_Failed_get_circbuf_adr );
    Exit;
    end;

  end;

16.01.2013 13:45:55
#11

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

Re: Старые и новые версии SDK.

тестовый пример на Delphi нормально работает? такую ошибку эта функция не может вернуть...

Работник
16.01.2013 14:23:49
#12

Гость

Re: Старые и новые версии SDK.

тогда как трактовать, то что функция возвращает 1?

то что лежит в l7xx.dpr не работает нормально постоянно выдает access violation, но какая то исправленная версия того же самого, что я скачал с вашего форума работает. (похоже отсюда http://www.lcard.ru/forumthreads/10136 )

выдает

Testing library
Loading library - success.

Slot parameters
Base - EC00
BaseL - 0080
Mem - FEBE0000
MemL - 00010000
Type - 14
DSPType - 2185
Irq - 4

ReadPlataDescr status 0
LoadBios status 0

Serial Num. 3D360166
Board Name L783
Revision C
DSP Type 2185
Quartz 20000000
PlataTest status 0

IoAsync call
Data[0] - 0
Allocated memory size(word) : 1048576
Buffer size(word): 0
Pages: 128
Rate: 10


возможно ошибка происходит потому, что параметры составлены не корректно? возможно ли такая ситуация и что должна выдавать функция в таком случае?

16.01.2013 16:43:49
#13

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

Re: Старые и новые версии SDK.

buffer size смущает. а так она каунтер печатать должна. попробуйте из полного lcomp.exe

Работник
16.01.2013 17:02:30
#14

Гость

Re: Старые и новые версии SDK.

выяснил что в примере SetParametersStream выдает 2, т.е. ошибку (просто там проверки не было и казалось ,что всё работает).

что значит из "полного lcomp.exe"  ?
я пробовал запускать из C:/Program Files/L-Card/LIBRARY/l7xx.dpr и скомпилированный экзешник и проект при компиляции выдают access violation (в ридми последняя запись от 12.04.2012, так что СДК вроде бы последний)

Работник
16.01.2013 17:07:08
#15

Гость

Re: Старые и новые версии SDK.

впрочем если поменять
pIUnknown:=CreateInstance(1);
на
pIUnknown:=CreateInstance(0);

то работает и из C:/Program Files/L-Card/LIBRARY/l7xx.dpr

SetParametersStream так же выдает 2

16.01.2013 17:08:32
#16

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

Re: Старые и новые версии SDK.

CreateInstance там на какой слот? если плата одна то 0 должен быть.

Работник
16.01.2013 17:38:01
#17

Гость

Re: Старые и новые версии SDK.

там было
pIUnknown:=CreateInstance(1);
я поменял на
pIUnknown:=CreateInstance(0);
и заработало.

а автоматом, нельзя слот платы определять?

попробовал запустить экзешник примера на win7 х32 и похоже он заработал, т.к. размер буфера там был не 0 и потом пошли отсчёты какие то выводится в окно.

так что дело может быть в xp? как можно проверить целостность установки(т.е. какие компоненты должны стоять и как проверить их версию?)

16.01.2013 17:40:29
#18

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

Re: Старые и новые версии SDK.

просто поставить в xp sdk по новой.

Работник
17.01.2013 11:33:15
#19

Гость

Re: Старые и новые версии SDK.

скачал сейчас lcomp.exe отсюда http://www.lcard.ru/support/developer и просто установил поверх теперь всё и на хр заработало.

остался только вопрос

допустим участок кода, определяет сколько времени прошло с использования карты.

minutes     := DataStream.FetchWord( Lcard_Elapsed_minutes );
  ms          := DataStream.FetchWord( Lcard_Elapsed_ms);
  Edit8.Text  :=  IntToStr(minutes)     + txt_Min
                + IntToStr(ms div 1000) + txt_Sec
                + IntToStr(ms mod 1000) + txt_Ms ;

FetchWord это обертка над GetWord_DM, похоже что GetWord_DM изменилось и теперь должно выдавать ULONG

function  TLcardProxy.FetchWord   ( adr : USHORT) : ULONG;
  var
    value : USHORT;
  begin
  Result := $0001;
  if (plDev <> nil) then begin
    plDev.GetWord_DM( Adr, value);
    Result := value;
    end;
  end;


но вопрос не в этом. например Lcard_Elapsed_minutes это просто адрес константа $2E25, но ничего подобного я не нашел поиском в СДК, похоже эти константы были жеcтко заданы предыдущим программистом.
вообщем вопрос как узнать адрес откуда считать например прошедшее время?

17.01.2013 11:39:33
#20

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

Re: Старые и новые версии SDK.

Возвращает она по прежнему USHORT nr это слово и з памяти данных DSP и оно 16бит. Такого функционала в штатном биосе не было. Грузите тот, что был с приложением и код прежний оставляйте.

Работник
17.01.2013 12:28:26
#21

Гость

Re: Старые и новые версии SDK.

но в ifc_ldev она определена как
function GetWord_DM(Addr:USHORT; var Data:USHORT):ULONG; virtual; stdcall; abstract;
т.е. как я понимаю возвращает ULONG.
+еще есть "Пояснения по работе с платой L780M (rev C )." тоже вроде насчёт этого, но я не понял о чём там.

и вообще такое ощущение, что читается не оттуда(или не того размера) потому как по адресам в переменные читается мусор.

в мануале я нашел только что то похожее в разделе
"Список внутренних переменных биос L-761/L-780/L-783"
на всякий случай привожу список констант, может быть они были в старых версиях, но изменились в новых?
  Lcard_Control_Framed_transfer                    =     3;
  Lcard_Control_Analog_simul_enabled        =     4;
  Lcard_Control_Digital_simul_enabled       =     5;
  Lcard_Control_Backtrack_markers_enabled   =     6;
  Lcard_Control_Control_entered             =     7;
  //----------------------------------------------//
  Lcard_Controls                            = $2E00;
  Lcard_ADC_channel_selector                = $2E01;
  Lcard_Frame_signal_mask                   = $2E02;
  Lcard_Frame_start_type                    = $2E03;
  Lcard_Line_signal_mask                    = $2E04;
  Lcard_Line_start_type                     = $2E05;
  Lcard_ADC_clock_divider                   = $2E06;
  Lcard_Pixels_per_line_accept              = $2E07;
  Lcard_Lines_per_frame_accept              = $2E08;
  Lcard_Frames_to_send                      = $2E09;
  Lcard_Dark_tone                           = $2E0A;
  Lcard_Light_tone                          = $2E0B;
  Lcard_Timer_step                          = $2E0C;
  Lcard_Square_side_size                    = $2E0D;
  Lcard_Timer_5_low                         = $2E0E;
  Lcard_Timer_5_high                        = $2E0F;
  Lcard_Timer_1_low                         = $2E10;
  Lcard_Timer_1_high                        = $2E11;
  Lcard_Timer_2_low                         = $2E12;
  Lcard_Timer_2_high                        = $2E13;
  Lcard_Timer_3_low                         = $2E14;
  Lcard_Timer_3_high                        = $2E15;
  Lcard_Timer_4_low                         = $2E16;
  Lcard_Timer_4_high                        = $2E17;
  Lcard_Sequential_number                   = $2E18;
  Lcard_e19unused                           = $2E19;
  Lcard_e1Aunused                           = $2E1A;
  Lcard_e1Bunused                           = $2E1B;
  Lcard_e1Cunused                           = $2E1C;
  Lcard_e1Dunused                           = $2E1D;
  Lcard_e1Eunused                           = $2E1E;
  Lcard_Data_block_tail                     = $2E1F;
  Lcard_Status                              = $2E20;
  Lcard_Frames_accepted                     = $2E21;
  Lcard_Lines_accepted                      = $2E22;
  Lcard_Frames_sent                         = $2E23;
  Lcard_ADC_handler_size                    = $2E24;
  Lcard_Elapsed_minutes                     = $2E25;
  Lcard_Elapsed_ms                          = $2E26;
  Lcard_Lines_per_frame_last                = $2E27;
  Lcard_e28unused                           = $2E28;
  Lcard_e29unused                           = $2E29;
  Lcard_e2Aunused                           = $2E2A;
  Lcard_e2Bunused                           = $2E2B;
  Lcard_e2Cunused                           = $2E2C;
  Lcard_e2Dunused                           = $2E2D;
  Lcard_e2Eunused                           = $2E2E;
  Lcard_e2Funused                           = $2E2F;
  Lcard_Frame_start_marker                  = $2E30;
  Lcard_Frame_end_marker                    = $2E31;
  Lcard_Frame_reverse_marker                = $2E32;
  Lcard_Line_start_marker                   = $2E33;
  Lcard_Line_end_marker                     = $2E34;
  Lcard_Line_reverse_marker                 = $2E35;
  Lcard_Pixels_per_line_count               = $2E36;
  Lcard_Lines_per_frame_count               = $2E37;
  Lcard_Frames_to_send_count                = $2E38;
  Lcard_Detected_lines                      = $2E39;
  Lcard_Simulated_Signals                   = $2E3A;
  Lcard_Fifo_chunk_count                    = $2E3B;
  Lcard_Main_cycle_size                     = $2E3C;
  Lcard_Timer_handler_size                  = $2E3D;
  Lcard_e3Eunused                           = $2E3E;
  Lcard_e3Funused                           = $2E3F;
  Lcard_Down_Count_ms                       = $2E40;
  Lcard_Down_Count_minute                   = $2E41;
  Lcard_Timer_1_count_low                   = $2E42;
  Lcard_Timer_1_count_high                  = $2E43;
  Lcard_Timer_2_count_low                   = $2E44;
  Lcard_Timer_2_count_high                  = $2E45;
  Lcard_Timer_3_count_low                   = $2E46;
  Lcard_Timer_3_count_high                  = $2E47;
  Lcard_Timer_4_count_low                   = $2E48;
  Lcard_Timer_4_count_high                  = $2E49;
  Lcard_Timer_5_count_low                   = $2E4A;
  Lcard_Timer_5_count_high                  = $2E4B;
  Lcard_Frames_count                        = $2E4C;
  Lcard_Lines_count                         = $2E4D;
  Lcard_e4Eunused                           = $2E4E;
  Lcard_e4Funused                           = $2E4F;
  Lcard_SaveI1ax0                           = $2E50;
  Lcard_SaveI1ay0                           = $2E51;
  Lcard_SaveI1ax1                           = $2E52;
  Lcard_SaveI1ay1                           = $2E53;
  Lcard_SaveI1ar                            = $2E54;
  Lcard_SaveI1i7                            = $2E55;
  Lcard_SaveI7ax0                           = $2E56;
  Lcard_SaveI7ay0                           = $2E57;
  Lcard_SaveI7ar                            = $2E58;
  Lcard_SaveI7i7                            = $2E59;
  Lcard_SaveIAax0                           = $2E5A;
  Lcard_SaveIAay0                           = $2E5B;
  Lcard_SaveIAar                            = $2E5C;
  Lcard_e5Dunused                           = $2E5D;
  Lcard_e5Eunused                           = $2E5E;
  Lcard_e5Funused                           = $2E5F;

Работник
17.01.2013 12:37:18
#22

Гость

Re: Старые и новые версии SDK.

похоже все оказалось как вы написали, со кастомным биосом всё работает(по крайней мере на первый взгляд).

17.01.2013 13:16:27
#23

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

Re: Старые и новые версии SDK.

ULONG это ошибку возвращает. оно вроде всегда ULONG было. данные USHORT