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

E14-440 & LComp

Вы не вошли.

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

11.10.2021 13:33:10
#1

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

E14-440 & LComp

Используем Е14-440 уже больше 15 лет. До настоящего момента использовалась библиотека lusbapi. Потребовался переход на Вин64, естественно, все развалилось. Нужно использовать LComp.
Помогите переползти, плз. Задачи:
1. Задать СВОИ коэффициенты коррекции для АЦП. Раньше они лежали в параметрах АЦП, теперь там нет. Вижу их в дескрипторе платы, но не пойму, можно ли их там править, имея в виду:
2. Нужно иметь возможность восстанавливать коэффициенты коррекции, записанные производителем, в случае каких-либо проблем с новыми. То есть, затирать их (коэффициенты коррекции, записанные производителем) нельзя.

11.10.2021 14:14:47
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,487

Re: E14-440 & LComp

А в чём собственно проблема с использованием Lusbapi под Windows-x64?
Так текущая  32-битная библиотека Lusbapi , а также  приложения созданные на её базе, могут без проблем работать на 64-битных ОС типа Win'7-x64 или Win'10-x64.  Или же есть какие-то особые условия, требующие исключительно 64-битность от Вашего приложения?

11.10.2021 20:25:57
#3

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

Re: E14-440 & LComp

Тихомиров Сергей пишет:

Или же есть какие-то особые условия, требующие исключительно 64-битность от Вашего приложения?

Да, есть. Требования Заказчика.
Большая просьба не обсуждать зачем мне это нужно. Помогите просто решить проблему.

12.10.2021 17:10:18
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,487

Re: E14-440 & LComp

Тогда мне видится два варианта:
1. В библиотеке LComp нет штатной функции для прямой передачи в модуль пользовательских корректировочных коэффициентов. Библиотека использует только те, что хранятся в ППЗУ модуля. Но процедуру корректировки данных можно выполнять и чисто программным образом в Вашем приложении. Т.е. можно запретить модулю выполнять аппаратную корректировку данных через EnableCorrection(0), а всю корректировку поступающих с модуля данных делать вручную на уровне Вашего приложения по формуле Y = (X + A) * B, где: X – некорректированные входные данные АЦП [в отсчѐтах АЦП], Y – скорректированные данные АЦП [в отсчѐтах АЦП], A – коэффициент смещения нуля [в отсчѐтах АЦП], B – коэффициент масштаба [безразмерный].
2. В принципе можно попробовать сделать 64-битную сборку библиотеки Lusbapi. Но на это  потребуется примерно 1.5 недели (с учётом моего наступающего  недельного отпуска).

12.10.2021 21:42:24
#5

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

Re: E14-440 & LComp

Тихомиров Сергей пишет:

В библиотеке LComp нет возможности напрямую передать в модуль пользовательские корректировочные коэффициенты.

А почему, собственно? Трудно было приписать?
Я не могу корректировать в моем приложении. Я дописывал БИОС для работы нашего оборудования с вашим АЦП. Прямо там у вас с большой скоростью складываются 4 отсчета и сумма сравнивается с неким порогом. При превышении порога на цифровой выход выводится 0 (запрещая генерацию лазера). Это подгонка резисторов, там надо все очень быстро (и как можно более точно). Мне в верхней программе показания АЦП практически не нужны, так, для тестовых вещей.
Как-то странно это с LComp выглядит. Я понимаю, что делали одну библиотеку на все устройства. Но почему при этом часть функций потеряли? И с примерами, кстати, ну просто ТБМ.
lusbapi на 64 бита - это было бы прекрасно. Все же работало под 32, а теперь масса проблем. Готов пару недель и подождать, не страшно.

12.10.2021 23:38:09
#6

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

Re: E14-440 & LComp

#define LBIOS_OUTVAR(v) ((unsigned int)v<<8)

ULONG EnableCorrection(USHORT Ena)
{
   for(int i = 0; i < 4; i++)
   {
      if(pI->PutWord_PM(L_ZERO_E440+i, LBIOS_OUTVAR(pd.t4.KoefADC[ i ]))) return L_ERROR;
      if(pI->PutWord_PM(L_SCALE_E440+i, LBIOS_OUTVAR(pd.t4.KoefADC[4+i]))) return L_ERROR;
   }
// enable or disable
   if(pI->PutWord_PM(L_CORRECTION_ENABLED_E440, LBIOS_OUTVAR(Ena))) return L_ERROR;
   return L_SUCCESS;
}
просто реализуйте ее у себя на верху и передавайте свои коэф. сколько угодно. ну и вызывайте ее вместо встроенной

13.10.2021 09:35:22
#7

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

Re: E14-440 & LComp

PoulCh пишет:

#define LBIOS_OUTVAR(v) ((unsigned int)v<<8)

ULONG EnableCorrection(USHORT Ena)
{
   for(int i = 0; i < 4; i++)
   {
      if(pI->PutWord_PM(L_ZERO_E440+i, LBIOS_OUTVAR(pd.t4.KoefADC[ i ]))) return L_ERROR;
      if(pI->PutWord_PM(L_SCALE_E440+i, LBIOS_OUTVAR(pd.t4.KoefADC[4+i]))) return L_ERROR;
   }
// enable or disable
   if(pI->PutWord_PM(L_CORRECTION_ENABLED_E440, LBIOS_OUTVAR(Ena))) return L_ERROR;
   return L_SUCCESS;
}
просто реализуйте ее у себя на верху и передавайте свои коэф. сколько угодно. ну и вызывайте ее вместо встроенной

Это я видел, но навскидку не разобрался.
Просто PutWord_PM(L_ZERO_E440+i, свой коэф);
Спасибо.

Остается риторический вопрос, почему в библиотеке было не сделать?

13.10.2021 10:30:53
#8

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

Re: E14-440 & LComp

это первый такой запрос за все время как я написал эту библиотеку. а сейчас это уже не моя печаль...

13.10.2021 10:52:59
#9

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

Re: E14-440 & LComp

PoulCh пишет:

это первый такой запрос за все время как я написал эту библиотеку. а сейчас это уже не моя печаль...

Понятно...
За совет спасибо. Воспользуюсь.

Довольный юзер
15.10.2021 07:17:45
#10

Гость

Re: E14-440 & LComp

PoulCh пишет:

это первый такой запрос за все время как я написал эту библиотеку. а сейчас это уже не моя печаль...

Хочется отметить сплочённость остального коллектива "Л_Кард", который поддержал товарища и дружно забил на поддержку одного из самых распространённых продуктов фирмы !!! lol  lol  lol  !!!

Тихомиров Сергей пишет:

В принципе можно попробовать сделать 64-битную сборку библиотеки Lusbapi.

Серьёзно? А стоит ли?? Неужели 64-битные платформы настолько популярны у пользователей, чтоб на них тратить время???
Не заморачивайтесь. Дождитесь 128 бит и вот тогда...
Клиенты подождут, не беспокойтесь, они уже привыкли к такому отношению)))

10.11.2021 12:20:45
#11

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

Re: E14-440 & LComp

Как там с обещанием сделать 64-битную версию iusbapi.dll?

05.10.2022 10:21:13
#12

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

Re: E14-440 & LComp

Приходится возвращаться к вопросу поддержки Е14-440 под 64 битами. Пользовали 502, там с этим вопросов нет. Но вот вернулись к 440, а там таки засада.
1. Библиотеку Lusbapi под 64 бита так и не переписали?
2. Есть исходники биоса, соответствующие библиотеке LCOMP? В поставке только файл .bio, а мне нужно править. Со старым биосом не хочет правильно работать, причин понять не могу.

05.10.2022 13:55:54
#13

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

Re: E14-440 & LComp

Добрый день.
Сейчас программист, поддерживающий это устройство, в отпуске, по возвращению он сможет ответить по официальной 64-битной версии lusbapi и исходникам.
В принципе когда-то давно по запросу клиента я собирал 64-битную версию lusbapi, она выложена тут https://www.lcard.ru/download/lusbapi-64.zip, тогда у клиента она работала с E20-10. Можете пока попробовать использовать ее.

05.10.2022 15:47:05
#14

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

Re: E14-440 & LComp

Спасибо. Буду пробовать.
И все-таки, еще бы исходники биоса, соответствующего работе с LCOMP - по размеру файла они отличаются от 3.4

06.10.2022 12:50:20
#15

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,487

Re: E14-440 & LComp

1. Да, библиотека Lusbapi уже давно нуждается в самой серьёзной модернизации. Но, помимо 64-х битной версии библиотеки, там необходимо реализовать целый комплекс работ по программной поддержке 'железа' и различных сред разработки. Последняя попытка выделить на всё это время была запланирована на май текущего года. К сожалению .....
2. Насколько я помню (всё-таки 12 лет прошло), последняя модернизация LBIOS'а была связана исключительно с добавлением различных служебных наладочных плюшек и к, собственно, самой работе модуля не имело никакого отношения. Т.е. исходные тексты, относящиеся к основной работе модуля, не изменялись. Но если нужно я могу выслать самую последнюю версию LBIOS'а, как только вернусь из отпуска.

06.10.2022 14:42:43
#16

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

Re: E14-440 & LComp

Спасибо. Переделанная под 64 бита LUSBAPI задышала нормально. Будем проверять подробнее, но пока работает. Если там нет подводных камней, то это устроит.
Проблема с LCOMP мне не понятна. Я тут сверху писал - я складываю (суммирую)4 последних отсчета АЦП в ячейку памяти и сравниваю значение с соседней ячейкой. Так вот, при том же биосе при использовании LUSBAPI в первой ячейке (читая ее из верхней программы) я вижу прекрасные правильные значения АЦП, а при чтении через LCOMP какую-то хрень, как будто в эту ячейку ИНОГДА попадает правильное значение АЦП, а остальное время, в основном, там складываются значения близкие к 0. Как вариант, что-то не так при инициализации работы АЦП, но что - понять я не могу, параметры вроде одни и те же. Пробовал менять настройки - ничего не меняется в результате.

11.10.2022 11:50:21
#17

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,487

Re: E14-440 & LComp

Т.о. на данном этапе проблема заключается в том, что модернизированный Вами LBIOS по-разному проявляет себя в приложениях, написанных с использованием библиотек LСomp и Lusbapi.
Тогда присылайте исходные исходные тексты изменённого LBIOS'а с указанием мест внесения правок. А также вырезки из исходных текстов приложений, где происходит конфигурация работы сбора данных с АЦП модуля.

11.10.2022 17:13:01
#18

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

Re: E14-440 & LComp

Файл ADC.H

GetAdData:
{ ЇҐаҐ©¤Ґ¬ ­  ўв®а®© Ў ­Є ॣЁбва®ў                                                    }
    ENA SEC_REG;

{ гбв ­®ўЄ  б«Ґ¤го饣® Є ­ «  Ђ–Џ                                                    }
    AR = PM(I5, M5); IO(SET_ADC_CHANNEL) = AR;

{ з⥭ЁҐ ¤ ­­ле б Ђ–Џ                                                                    }
    AR = IO(READ_ADC);
    AR = AR + AY1, AY1 = PM(I6, M6);
    MR = AR * MY1(SU), MY1 = PM(I6, M6);
    MR = MR(RND); DM(I3, M3) = MR1;
{ Тут моя вставка }
    AY0 = I4;
{ Усредняем несколько последних значений }
    M3 = -1;
    MODIFY (I3,M3);
    AY1=DM(I3, M3);
    AR = 0;
    CNTR=4;
    DO MyL2 UNTIL CE;
    AR=AR+AY1,AY1=DM(I3, M3);
MyL2:         NOP;
    M3 = 6;
    MODIFY (I3, M3);
    M3=0x1;



   
{ записываем в ячейку "текущее данное с АЦП" и сравниваем с порогом }


    PutPm(AR,CurrADRESAddr);
    AY1=AR;
    GetPm(AR,ThresholdAddr);
    AR=AY1-AR;
    IF LT JUMP MyL1;
    GetPm(AR,TtlOutAddr);
    {AR = TSTBIT 0 OF AR;
    IF EQ JUMP MyL1;
    GetPm(AR,TtlOutAddr);}
    AR= CLRBIT 0 OF AR;   
    IO(TTL_OUT)=AR;
MyL1:   
    AY1=PM(I6,M6);
    MY1=PM(I6,M6);
    M3 = 0x1;
    I4 = AY0;

{ Ґб«Ё ­г¦­®, в® ¤ҐЄаҐ¬Ґ­вЁа㥬 бзҐвзЁЄ ®вбзҐв®ў ў Є ¤аҐ, Ё­ зҐ RTI        }
.................................

Файл CONST.H
.const    ScaleFactorAddr                =    VariableBaseAddress + 0x30;
.const    ZeroOffsetAddr                    =    VariableBaseAddress + 0x34;
// След 2 строки
.const    CurrADRESAddr                    =    VariableBaseAddress + 0x3A;
.const    ThresholdAddr                    =    VariableBaseAddress + 0x3B;

.const    NaladkaTestNumberAddr        =    VariableBaseAddress + 0x38;
.const    NaladkaIrq0CounterAddr        =    VariableBaseAddress + 0x39;
....................

Файл VAR.H
{ ZeroOffset array for all gains                                                   }
.VAR/SEG=INT_PM_USER/ABS=ZeroOffsetAddr/PM/RAM ZeroOffset[4];
.INIT ZeroOffset:          M(0x0), M(0x0), M(0x0), M(0x0);

{-----------------------------------------------------------------------}
{ Текущее значение с АЦП - будем читать }
.VAR/SEG=INT_PM_USER/ABS=CurrADRESAddr/PM/RAM CurrADRES;
.INIT CurrADRES: M(0x0);
{ Пороговое значение АЦП - будем сравнивать }
.VAR/SEG=INT_PM_USER/ABS=ThresholdAddr/PM/RAM Threshold;
.INIT Threshold: M(0x0);
{-----------------------------------------------------------------------}

По биосу все

ПРограмма для РС

  // Сразу заполним структуры с параметрами АЦП и ЦАП
  With ap.t1 do
    begin
      s_Type := L_ADC_PARAM;
      AutoInit := 1;
      dRate := 400.0;
      dKadr := 0.01;
      dScale := 0;
      SynchroType := 0;
      SynchroSensitivity := 0;
      SynchroMode := 0;
      AdChannel := 0;
      AdPorog := 0;
      NCh := 1;
      Chn [ 0 ] := $0;
      FIFO := 64;
      IrqStep := 4096;
      Pages := 1;
      IrqEna := 0;
      AdcEna := 0;
    end;

{---------------------------------}
// Получить текущие показания АЦП в Вольтах
function TE440_Res.GetADCResult : extended;
var
  i : integer;
begin
  i := ReadLBIOSWord ( $6A );
  FADCOverLoad := ( i >= ( 8 * 1024 - 2 ) * E440_Res_QuantAver );
  Result := i / 800 / FADCScaleCoef / E440_Res_QuantAver;
end; // TE440_Res.GetADCResult

{---------------------------------}
// Установка параметров работы AЦП
procedure TE440_Res.SetADCPars;
begin
  With ap.t1 do
    begin
      Chn [ 0 ] := 0 or ( FADCScale * $40 );
    end;
  inherited SetADCPars;
  StartADC;
end; // TE440_Res.SetADCPars

{---------------------------------}
// Установка параметров работы АЦП
procedure TE440_Base.SetADCPars;
type
  WA = array [ 0..1023 ] of SHORT;
  PWA = ^WA;
var
  i : integer;
  Res : ULONG;
begin
  // Передадим требуемые параметры работы АЦП в модуль
  If FExists
  then begin
         FADCStarted := false;
         While FBusy do Application.ProcessMessages;
         FBusy := true;
         try
           For i := 1 to Rep do
             begin
               Res := pLDev.FillDAQparameters ( ap.t1 );
               If Res = L_SUCCESS
               then break;
               If ( i < Rep )
               then Sleep ( 50 );
             end;
           If Res <> L_SUCCESS
           then begin
                  ShowInfo ( Inttostr ( Res ) );
                  raise Exception.Create ( E440FillADCParsError );
                 end;
         finally
           FBusy := false;
         end;
       end;
end; // TE440_Base.SetADCPars

{---------------------------------}
// Запустить АЦП
procedure TE440_Base.StartADC;
var
  i : byte;
  Res : ULONG;
begin
//  EXIT;
  If FADCStarted
  then EXIT;
  If FExists
  then begin
         While FBusy do Application.ProcessMessages;
         FBusy := true;
         try
           For i := 1 to 3 do
             begin
               Res := pLDev.SendCommand ( cmSTOP_ADC_E440 );
               If Res = L_SUCCESS
               then break;
               If ( i < Rep )
               then Sleep ( 50 );
             end;
           If Res <> L_SUCCESS
           then raise Exception.Create ( E440StopADCError );
           For i := 1 to 3 do
             begin
               Res := pLDev.SendCommand ( cmSTART_ADC_E440 );
               If Res = L_SUCCESS
               then break;
               If ( i < Rep )
               then Sleep ( 50 );
             end;
           If Res <> L_SUCCESS
           then raise Exception.Create ( E440StartADCError );
           FADCStarted := true;
         finally
           FBusy := false;
         end;
       end;

end; // TE440_Base.StartADC

12.10.2022 10:18:14
#19

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

Re: E14-440 & LComp

Оно так работать не будет. FillADCparameters в драйвер передаст, а в модуль их передаст StarLdevice.

12.10.2022 15:56:24
#20

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

Re: E14-440 & LComp

PoulCh пишет:

Оно так работать не будет. FillADCparameters в драйвер передаст, а в модуль их передаст StarLdevice.

А....
   pLDev.InitStartLDevice;
   pLDev.StartLDevice;
Вот это?
И обе строчки?

12.10.2022 19:22:31
#21

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

Re: E14-440 & LComp

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

12.10.2022 20:51:45
#22

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

Re: E14-440 & LComp

PoulCh пишет:

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

Не понимаю. В LUSBAPI нужно было задать параметры и запустить АЦП.
Здесь я делаю так же. Но оказывается, что нужно еще что-то плюс.
Разве в моих текстах нет выделения буфера и запуска сбора? Судя по поведению устройства, я только не до конца задавал параметры, и АЦП работало с параметрами по умолчанию.

12.10.2022 20:52:43
#23

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

Re: E14-440 & LComp

Разве вот это не задание буфера?
  // Сразу заполним структуры с параметрами АЦП и ЦАП
  With ap.t1 do
    begin
      s_Type := L_ADC_PARAM;
      AutoInit := 1;
      dRate := 400.0;
      dKadr := 0.01;
      dScale := 0;
      SynchroType := 0;
      SynchroSensitivity := 0;
      SynchroMode := 0;
      AdChannel := 0;
      AdPorog := 0;
      NCh := 1;
      Chn [ 0 ] := $0;
      FIFO := 64;
      IrqStep := 4096;
      Pages := 1;
      IrqEna := 0;
      AdcEna := 0;
    end;

13.10.2022 14:48:38
#24

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

Re: E14-440 & LComp

нет это  не задание буфера, это только желание задать буфер в плате. буферов 2 - в плате и в PC. в примере L7XX.TST из lcomp есть комментарии. в хелпе есть описание принципа сбора данных с модуля. такой вот некий автономный режим сбора и обработки не был предусмотрен. вернее его ручками придется задавать записывая нужные данные в нужные ячейки памяти через put/get. или запустить потоковый сбор и просто не забирать данные, а читать что нужно.

13.10.2022 15:14:16
#25

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

Re: E14-440 & LComp

PoulCh пишет:

нет это  не задание буфера, это только желание задать буфер в плате. буферов 2 - в плате и в PC. в примере L7XX.TST из lcomp есть комментарии. в хелпе есть описание принципа сбора данных с модуля. такой вот некий автономный режим сбора и обработки не был предусмотрен. вернее его ручками придется задавать записывая нужные данные в нужные ячейки памяти через put/get. или запустить потоковый сбор и просто не забирать данные, а читать что нужно.

Товарищи... Ну вот совершенно нет желания разбираться в тонкостях работы библиотеки.
Вот в LUSBAPI все удалось сделать не залезая в дебри ваших сложных построений. С вашей (сотрудников фирмы, спасибо им) помощью дописали в биос несколько строк... и вуаля.
А тут я про"""бался """ знает сколько времени, а Вы мне рассказываете о буферах. Оно мне зачем?  Если можете помочь - напишите, плз, для меня, тупого, последовательность вызовов функций для реализации моей задачи - запуска сбора данных с требуемыми параметрами. Вставки в биос у меня есть - если АЦП будет ацпировать, то дальше я уж как-нибудь...

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск