|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
E14-440 & LComp
Используем Е14-440 уже больше 15 лет. До настоящего момента использовалась библиотека lusbapi. Потребовался переход на Вин64, естественно, все развалилось. Нужно использовать LComp. Помогите переползти, плз. Задачи: 1. Задать СВОИ коэффициенты коррекции для АЦП. Раньше они лежали в параметрах АЦП, теперь там нет. Вижу их в дескрипторе платы, но не пойму, можно ли их там править, имея в виду: 2. Нужно иметь возможность восстанавливать коэффициенты коррекции, записанные производителем, в случае каких-либо проблем с новыми. То есть, затирать их (коэффициенты коррекции, записанные производителем) нельзя.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,486
|
Re: E14-440 & LComp
А в чём собственно проблема с использованием Lusbapi под Windows-x64? Так текущая 32-битная библиотека Lusbapi , а также приложения созданные на её базе, могут без проблем работать на 64-битных ОС типа Win'7-x64 или Win'10-x64. Или же есть какие-то особые условия, требующие исключительно 64-битность от Вашего приложения?
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
Тихомиров Сергей пишет:Или же есть какие-то особые условия, требующие исключительно 64-битность от Вашего приложения?
Да, есть. Требования Заказчика. Большая просьба не обсуждать зачем мне это нужно. Помогите просто решить проблему.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,486
|
Re: E14-440 & LComp
Тогда мне видится два варианта: 1. В библиотеке LComp нет штатной функции для прямой передачи в модуль пользовательских корректировочных коэффициентов. Библиотека использует только те, что хранятся в ППЗУ модуля. Но процедуру корректировки данных можно выполнять и чисто программным образом в Вашем приложении. Т.е. можно запретить модулю выполнять аппаратную корректировку данных через EnableCorrection(0), а всю корректировку поступающих с модуля данных делать вручную на уровне Вашего приложения по формуле Y = (X + A) * B, где: X – некорректированные входные данные АЦП [в отсчѐтах АЦП], Y – скорректированные данные АЦП [в отсчѐтах АЦП], A – коэффициент смещения нуля [в отсчѐтах АЦП], B – коэффициент масштаба [безразмерный]. 2. В принципе можно попробовать сделать 64-битную сборку библиотеки Lusbapi. Но на это потребуется примерно 1.5 недели (с учётом моего наступающего недельного отпуска).
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
Тихомиров Сергей пишет:В библиотеке LComp нет возможности напрямую передать в модуль пользовательские корректировочные коэффициенты.
А почему, собственно? Трудно было приписать? Я не могу корректировать в моем приложении. Я дописывал БИОС для работы нашего оборудования с вашим АЦП. Прямо там у вас с большой скоростью складываются 4 отсчета и сумма сравнивается с неким порогом. При превышении порога на цифровой выход выводится 0 (запрещая генерацию лазера). Это подгонка резисторов, там надо все очень быстро (и как можно более точно). Мне в верхней программе показания АЦП практически не нужны, так, для тестовых вещей. Как-то странно это с LComp выглядит. Я понимаю, что делали одну библиотеку на все устройства. Но почему при этом часть функций потеряли? И с примерами, кстати, ну просто ТБМ. lusbapi на 64 бита - это было бы прекрасно. Все же работало под 32, а теперь масса проблем. Готов пару недель и подождать, не страшно.
|
|
- Участник
- Здесь с 20.10.2020
- Сообщений: 38
|
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; } просто реализуйте ее у себя на верху и передавайте свои коэф. сколько угодно. ну и вызывайте ее вместо встроенной
|
|
- Участник
- Здесь с 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, свой коэф); Спасибо. Остается риторический вопрос, почему в библиотеке было не сделать?
|
|
- Участник
- Здесь с 20.10.2020
- Сообщений: 38
|
Re: E14-440 & LComp
это первый такой запрос за все время как я написал эту библиотеку. а сейчас это уже не моя печаль...
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
PoulCh пишет:это первый такой запрос за все время как я написал эту библиотеку. а сейчас это уже не моя печаль...
Понятно... За совет спасибо. Воспользуюсь.
|
|
|
Re: E14-440 & LComp
PoulCh пишет:это первый такой запрос за все время как я написал эту библиотеку. а сейчас это уже не моя печаль...
Хочется отметить сплочённость остального коллектива "Л_Кард", который поддержал товарища и дружно забил на поддержку одного из самых распространённых продуктов фирмы !!! !!! Тихомиров Сергей пишет:В принципе можно попробовать сделать 64-битную сборку библиотеки Lusbapi.
Серьёзно? А стоит ли?? Неужели 64-битные платформы настолько популярны у пользователей, чтоб на них тратить время??? Не заморачивайтесь. Дождитесь 128 бит и вот тогда... Клиенты подождут, не беспокойтесь, они уже привыкли к такому отношению)))
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
Как там с обещанием сделать 64-битную версию iusbapi.dll?
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
Приходится возвращаться к вопросу поддержки Е14-440 под 64 битами. Пользовали 502, там с этим вопросов нет. Но вот вернулись к 440, а там таки засада. 1. Библиотеку Lusbapi под 64 бита так и не переписали? 2. Есть исходники биоса, соответствующие библиотеке LCOMP? В поставке только файл .bio, а мне нужно править. Со старым биосом не хочет правильно работать, причин понять не могу.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 1,291
|
Re: E14-440 & LComp
Добрый день. Сейчас программист, поддерживающий это устройство, в отпуске, по возвращению он сможет ответить по официальной 64-битной версии lusbapi и исходникам. В принципе когда-то давно по запросу клиента я собирал 64-битную версию lusbapi, она выложена тут https://www.lcard.ru/download/lusbapi-64.zip, тогда у клиента она работала с E20-10. Можете пока попробовать использовать ее.
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
Спасибо. Буду пробовать. И все-таки, еще бы исходники биоса, соответствующего работе с LCOMP - по размеру файла они отличаются от 3.4
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,486
|
Re: E14-440 & LComp
1. Да, библиотека Lusbapi уже давно нуждается в самой серьёзной модернизации. Но, помимо 64-х битной версии библиотеки, там необходимо реализовать целый комплекс работ по программной поддержке 'железа' и различных сред разработки. Последняя попытка выделить на всё это время была запланирована на май текущего года. К сожалению ..... 2. Насколько я помню (всё-таки 12 лет прошло), последняя модернизация LBIOS'а была связана исключительно с добавлением различных служебных наладочных плюшек и к, собственно, самой работе модуля не имело никакого отношения. Т.е. исходные тексты, относящиеся к основной работе модуля, не изменялись. Но если нужно я могу выслать самую последнюю версию LBIOS'а, как только вернусь из отпуска.
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
Спасибо. Переделанная под 64 бита LUSBAPI задышала нормально. Будем проверять подробнее, но пока работает. Если там нет подводных камней, то это устроит. Проблема с LCOMP мне не понятна. Я тут сверху писал - я складываю (суммирую)4 последних отсчета АЦП в ячейку памяти и сравниваю значение с соседней ячейкой. Так вот, при том же биосе при использовании LUSBAPI в первой ячейке (читая ее из верхней программы) я вижу прекрасные правильные значения АЦП, а при чтении через LCOMP какую-то хрень, как будто в эту ячейку ИНОГДА попадает правильное значение АЦП, а остальное время, в основном, там складываются значения близкие к 0. Как вариант, что-то не так при инициализации работы АЦП, но что - понять я не могу, параметры вроде одни и те же. Пробовал менять настройки - ничего не меняется в результате.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,486
|
Re: E14-440 & LComp
Т.о. на данном этапе проблема заключается в том, что модернизированный Вами LBIOS по-разному проявляет себя в приложениях, написанных с использованием библиотек LСomp и Lusbapi. Тогда присылайте исходные исходные тексты изменённого LBIOS'а с указанием мест внесения правок. А также вырезки из исходных текстов приложений, где происходит конфигурация работы сбора данных с АЦП модуля.
|
|
- Участник
- Здесь с 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
|
|
- Участник
- Здесь с 20.10.2020
- Сообщений: 38
|
Re: E14-440 & LComp
Оно так работать не будет. FillADCparameters в драйвер передаст, а в модуль их передаст StarLdevice.
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
PoulCh пишет:Оно так работать не будет. FillADCparameters в драйвер передаст, а в модуль их передаст StarLdevice.
А.... pLDev.InitStartLDevice; pLDev.StartLDevice; Вот это? И обе строчки?
|
|
- Участник
- Здесь с 20.10.2020
- Сообщений: 38
|
Re: E14-440 & LComp
не только. нужен полный запуск потокового сбора как в примере. с выделением хоть небольшого буфера и дальше по порядку.
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
PoulCh пишет:не только. нужен полный запуск потокового сбора как в примере. с выделением хоть небольшого буфера и дальше по порядку.
Не понимаю. В LUSBAPI нужно было задать параметры и запустить АЦП. Здесь я делаю так же. Но оказывается, что нужно еще что-то плюс. Разве в моих текстах нет выделения буфера и запуска сбора? Судя по поведению устройства, я только не до конца задавал параметры, и АЦП работало с параметрами по умолчанию.
|
|
- Участник
- Здесь с 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;
|
|
- Участник
- Здесь с 20.10.2020
- Сообщений: 38
|
Re: E14-440 & LComp
нет это не задание буфера, это только желание задать буфер в плате. буферов 2 - в плате и в PC. в примере L7XX.TST из lcomp есть комментарии. в хелпе есть описание принципа сбора данных с модуля. такой вот некий автономный режим сбора и обработки не был предусмотрен. вернее его ручками придется задавать записывая нужные данные в нужные ячейки памяти через put/get. или запустить потоковый сбор и просто не забирать данные, а читать что нужно.
|
|
- Участник
- Здесь с 14.11.2017
- Сообщений: 26
|
Re: E14-440 & LComp
PoulCh пишет:нет это не задание буфера, это только желание задать буфер в плате. буферов 2 - в плате и в PC. в примере L7XX.TST из lcomp есть комментарии. в хелпе есть описание принципа сбора данных с модуля. такой вот некий автономный режим сбора и обработки не был предусмотрен. вернее его ручками придется задавать записывая нужные данные в нужные ячейки памяти через put/get. или запустить потоковый сбор и просто не забирать данные, а читать что нужно.
Товарищи... Ну вот совершенно нет желания разбираться в тонкостях работы библиотеки. Вот в LUSBAPI все удалось сделать не залезая в дебри ваших сложных построений. С вашей (сотрудников фирмы, спасибо им) помощью дописали в биос несколько строк... и вуаля. А тут я про"""бался """ знает сколько времени, а Вы мне рассказываете о буферах. Оно мне зачем? Если можете помочь - напишите, плз, для меня, тупого, последовательность вызовов функций для реализации моей задачи - запуска сбора данных с требуемыми параметрами. Вставки в биос у меня есть - если АЦП будет ацпировать, то дальше я уж как-нибудь...
|