|
|
Е-154 вместо E-440
Здравствуйте! Помогите разобраться. У меня проблемы с платой (модулем) Е-154.
В нашей лаборатории используется устройство, в состав которого входит модуль Е440. Мы хотим заменить его на Е154. Подключаем также как и е440,ставим драйвера, операционная система вроде бы видит его в диспетчере устройств. Но наша программа (написана на С++ Билдер 2009)не видит его. Помогите разобраться пожалуйста. С уважением , Дмитрий.
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: Е-154 вместо E-440
<<...Подключаем также как и е440>>
- Не могу пройти мимо этого заявления, поскольку ТАКЖЕ его подключать нельзя.
|
|
- Сотрудник "Л Кард"
- Здесь с 17.04.2014
- Сообщений: 674
|
Re: Е-154 вместо E-440
А в программу Вы соответствующие изменения внесли?
|
|
- Сотрудник "Л Кард"
- Здесь с 18.04.2014
- Сообщений: 810
|
Re: Е-154 вместо E-440
Дмитрий 1985: это модули из одного семейства, но совсем не прямая замена друг другу - и с точки зрения подключения сигналов (см. руководство по эксплуатации), и со стороны программного интерфейса (см. руководство программиста).
То есть вашу программу придется адаптировать - либо просто переделать с E-440 на E-154, либо сделать поддержку обоих типов модулей.
|
|
|
Re: Е-154 вместо E-440
Как управлять E154 на VB могу дать пример, к сожалению пока не все получилось.
|
|
|
Re: Е-154 вместо E-440
скачал мануал для е-154. Сейчас у нас установлен е-440. Сигналы от датчиков подключены к внешнему аналоговому разъему DRB-37M на входы 32-37(соот-но Х6-Х1), также использованы вход 21 и 3(GND32 и AGND). Как теперь все это перенести в E-154?
куда подключать аналог.землю? их там 6 штук. А сам сигнал видимо на ADC1-ADC8(входы 16-19 и 34-37)?
|
|
- Инженер-электронщик
- Откуда: "Л Кард"
- Здесь с 21.04.2014
- Сообщений: 4,597
|
Re: Е-154 вместо E-440
Дмитрий, подключение вслепую может привести к материальным потерям, поэтому важно не столько само скачивание мануала, сколько его изучение.
Предлагаю начать решать задачу в естественном порядке, ответив сначала на следующие вопросы:
1. Используемые датчики подразумевают их подключение <<с общей землёй>>? По косвенным данным - да, поскольку Вы перечислили те входы E-440, которые там обычно используют при таком подключении. Особенность здесь в том, что E-440 позволяет подключиться не только к ближней к E-440 точке соединения общих проводов датчиков, но и к дальней. В последнем случае провода GND32 и AGND соединяются не на разъёме E-440, а на дальней стороне датчиков (что является более качественным вариантом подключения <<с общей землёй>>).
2. Другие диапазоны по напряжению входов АЦП E-154 устраивают (здесь и далее: по сравнению с E-440)?
3. Меньшая разрядность АЦП E-154 устраивает?
4. Меньшая максимально возможная частота АЦП и другая сетка частот АЦП устраивает?
5. Режимы запуска/синхронизации в E-154 устраивают?
6. Готовы провести адаптацию собственного ПО под E-154, если, конечно, не используетcя LGraph2?
|
|
|
Re: Е-154 вместо E-440
и еще: какие изменения потребуются в исходный код программы на С++ 2009?
|
|
|
Re: Е-154 вместо E-440
Спасибо, что отвечаете на мои вопросы. Когда писал посл-ее сообщение не заметил ответ Александра(по-моему сообщения вообще не было).
По всем параметрам Е-154 нас устраивает. В моем lusbapi.h всего 4 структуры или это у всех так? Какие изменения вносить в программный код для поддержки обоих модулей?
|
|
|
Re: Е-154 вместо E-440
#include <stdlib.h>
#include <stdio.h>
#include "Lusbapi.h"
ILE154 *pModule;
MODULE_DESCRIPTION_E154 md;
char ModuleName[7];
BYTE UsbSpeed;
int main(void)
{if(GetDllVersion() != CURRENT_VERSION_LUSBAPI)
{
printf("неправильная версия Dll!");
return 1;
}
pModule = static_cast<ILE154 *>(CreateLInstance("e154"));
if(!pModule)
{
printf("Не могу получить указатель на интерфейс");
return 1; //
}
if(!pModule->OpenLDevice(0))
{
printf("Не могу получить доступ к модулю!");
return 1; //
}
if(!pModule->GetUsbSpeed(&UsbSpeed))
{
printf(" Не могу узнать скор.работы USB!//n");
return 1; //
}
//
if(!pModule->GetModuleName(ModuleName))
{
printf(" Не могу прочитать название модуля!//n");
return 1; //
}
if(strcmp(ModuleName, "E154"))
{
printf(" В нулевом вирт.слоте не//'E-154//'//n");
return 1; //
}
if(!pModule->GET_MODULE_DESCRIPTION(&md))
{
printf(" Не выполнена ф-я GET_MODULE_DESCRIPTION ()!");
return 1; //
}
printf("модуль E-154 ( серийный номер %s)полностью готов к // работе!", md.Module.SerialNumber);
//
//
if(!pModule->ReleaseLInstance())
{
printf("Не выполнена ф-я ReleaseLInstance()!");
return 1; //
}
return 0;
}
при компиляции выдает ряд сообщений/ошибок:
[ILINK32 Error] Error: Unresolved external //'__InitVCL//' referenced from C://PROGRAM FILES//CODEGEAR//RAD STUDIO//6.0//LIB//CP32MTI.LIB|crtlvcl
[ILINK32 Error] Error: Unresolved external //'__ExitVCL//' referenced from C://PROGRAM FILES//CODEGEAR//RAD STUDIO//6.0//LIB//CP32MTI.LIB|crtlvcl
[ILINK32 Error] Error: Unresolved external //'GetDllVersion//' referenced from C://TEST//DEBUG//FILE1.OBJ
[ILINK32 Error] Error: Unresolved external //'CreateLInstance//' referenced from C://TEST//DEBUG//FILE1.OBJ
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
1. __InitVCL и __ExitVCL ...
Смотри, например, http://forum.codeby.net/topic12886.html
2. GetDllVersion и CreateLInstance ...
Следует в Ваш проект подключить нашу библиотеку импорта Lusbapi.lib из директории DLL//Lib//Borland
|
|
|
Re: Е-154 вместо E-440
У меня накопилось много вопросов по поводу изменений в программу на С++2009.
Дело обстоит так: версия у нас lusbapi была наверное 1.0 (судя по lusbapi.dll, и в lusbapi.h всего 202 строчки по сравнению с другой где 665 строк).
Я беру старую лусбапи и вношу изменения из новой, не всё, а только то,что будет использоваться в программе.
// структура, содержащая информацию о плате, которая хранится в поль. ППЗУ
struct MODULE_DESCR_E440
{
WORD size; // размер структуры
char SerialNumber[9]; // серийный номер
char Name[7]; // название платы
char Revision; // ревизия платы
char Dsp_Type[5]; // тип установленного DSP
char IsDacPresented; // флажок наличия ЦАП
long QuartzFrequency; // частота кварца в Гц
char ReservedWord[13]; // зарезервировано
WORD CalibrKoefAdc[8]; // корректировочные коэф. для АЦП
WORD CalibrKoefDac[4]; // корректировочные коэф. для ЦАП
};
struct MODULE_DESCRIPTION_E154
{
MODULE_INFO_LUSBAPI Module; // общая информация о модуле
INTERFACE_INFO_LUSBAPI Interface; // информация об используемом интерфейсе
MCU_INFO_LUSBAPI<VERSION_INFO_LUSBAPI> Mcu; // информация о микроконтроллере
ADC_INFO_LUSBAPI Adc; // информация о АЦП
DAC_INFO_LUSBAPI Dac; // информация о ЦАП
DIGITAL_IO_INFO_LUSBAPI DigitalIo; // информация о цифровом вводе-выводе
};
В структуре е440 было поле size я к нему обращался, теперь же у стр-ры е154 такого поля нет. Можно внаглую его там прописать? много таких нестыковок есть
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
Я бы посоветовал не трогать собственно саму библиотеку Lusbpai.
Попробуйте запользовать новый заголовочный файл lusbpai.h и подрихтовать Ваши исходные тексты под его требования, исправляя ошибки и предупреждения компилятора и линковщика.
|
|
|
Re: Е-154 вместо E-440
Вопрос по ф-ии ReadData (ее разные версии).
Вот пошел ассинхронный сбор данных: (внизу есть описание переменных)
while(!Terminated)
{
ThreadLoop++;
if(!pE440->ReadData(MainForm->ReadBuffer, &PointsToRead, &ReadBytesTransferred, &ReadOv))
if(GetLastError() != ERROR_IO_PENDING)
{ CloseHandle(ReadEvent);
mbstowcs(str1, "Не могу собрать данные с платы!", 40);
mbstowcs(str2, "Сообщение TSynchroThread()!", 40);
Application->MessageBox(str1, str2, MB_OK + MB_ICONINFORMATION);
while(!Terminated) { Sleep(10); };
return; }
Вот небольшое описание кто есть кто:
extern ILE154 *pE440;
SHORT *ReadBuffer;
DWORD PointsToRead;
DWORD ReadBytesTransferred;
OVERLAPPED ReadOv;
А в lusbapi.h ф-я выглядит так:
virtual BOOL WINAPI ReadData(IO_REQUEST_LUSBAPI * const ReadRequest) = 0;
И ошибки:
[BCC32 Error] SynchroThread.cpp(87): E2034 Cannot convert //'short *//' to //'IO_REQUEST_LUSBAPI *//'
[BCC32 Error] SynchroThread.cpp(87): E2342 Type mismatch in parameter //'ReadRequest//' (wanted //'IO_REQUEST_LUSBAPI * const//', got //'short *//')
[BCC32 Error] SynchroThread.cpp(87): E2227 Extra parameter in call to __stdcall ILE154::ReadData(IO_REQUEST_LUSBAPI * const)
Как мне адаптировать участок кода описанный выше? уже почти неделю маюсь рез-т мизерный
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
Следует дополнительно объявить структуру IO_REQUEST_LUSBAPI и заполнить ее поля в соответствии с Вашим требованиями. Например, для асинхронного запроса можно написать так:
OVERLAPPED ReadOv;
IO_REQUEST_LUSBAPI IoReq;
// инициализация структуры типа OVERLAPPED
ZeroMemory(&ReadOv], sizeof(OVERLAPPED));
// создаём событие для асинхронного запроса
ReadOv.hEvent = CreateEvent(NULL, FALSE , FALSE, NULL);
// формируем структуру IoReq
IoReq.Buffer = new SHORT[DataStep];
IoReq.NumberOfWordsToPass = DataStep;
IoReq.NumberOfWordsPassed = 0x0;
IoReq.Overlapped = &ReadOv;
IoReq.TimeOut = DataStep/ap.AdcRate + 1000;
// делаем запрос
if(!pModule->ReadData(&IoReq)) { ... }
P.S. Вообще-то всю эту процедуру можно было бы посмотреть как в документации, так и в многочисленных прилагаемых примерах программирования.
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
Просто уберите из Вашей программы любые упоминания о поле size.
|
|
|
Re: Е-154 вместо E-440
В структуре ILE154 теперь нет функций LOAD_LBIOS и MODULE_TEST. Раньше как обращался:
// теперь можно попытаться загрузить штатный LBIOS в модуль E-440
else if(!pE440->LOAD_LBIOS(biofname))
{ String str1="Не могу загрузить LBIOS в модуль E-440!";
String str2="Ошибка инициализации";
UsbLoadingLed->Brush->Color = clRed;
Application->MessageBox(str1.w_str(), str2.w_str(), MB_OK + MB_ICONINFORMATION);
Close();
return;
}
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
Модулю Е-154 не требуется загрузка. Поэтому функции LOAD_LBIOS() и MODULE_TEST() вполне можно исключить из программы.
|
|
|
Re: Е-154 вместо E-440
В структуре MODULE_DESCRIPTION_E154 исчезло поле NAME
MODULE_DESCRIPTION_E154 md; //описание
...
if(strcmp(md.Name, "E440"))
{ String str1="В ППЗУ не прописано назв.платы!";
String str2= "Ошибка инициализации";
Application->MessageBox(str1.w_str(), str2.w_str(), MB_OK + MB_ICONINFORMATION);
Close();
return;
}
Хотя до этого кода есть вот такой участок кода:
if(!pE440->GetModuleName(ModuleName))
{
String str1="Не могу прочит.назв.модуля в нулевом вирт.слоте!";
String str2="Ошибка инициализации";
Application->MessageBox(str1.w_str(), str2.w_str(), MB_OK + MB_ICONINFORMATION);
Close();
return;
}
Можно удалить 1 участок кода безболезненно? если md.name больше нигде не засвечено в проекте.
|
|
|
Re: Е-154 вместо E-440
Спасибо большое за быстрые ответы.
Как я понял флаг корректировки у Е154 тоже отсут-ет?
am.CorrectionEnabled = true; // разрешим корректировку данных
А на этот код ругается, мол, CalibrKoefAdc не член стр-ры adc_pars_e154.
// будем использовать фирменные калибровочные коэффициенты, которые хранятся в ППЗУ модуля
for(WORD i=0; i < 8; i++) am.CalibrKoefAdc[i] = md.CalibrKoefAdc[i];
Нашел "константы для работы с модулем" ADC_CALIBR_COEFS_QUANTITY_E154 = ADC_INPUT_RANGES_QUANTITY_E154 но как их использовать и вообще правильно ли будет заменив этими константами calibrKoefAdc[i]?
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
На модуле E14-440 установлен DSP, который умеет "на лету" производить корректировку получаемых с АЦП данных. Именно для этого в DSP модуля передавались все необходимые корректировочные коэффициенты.
Модуль E-154 собственно саму корректировку данных АЦП производить не умеет. Поэтому и корректировочные коэффициенты передавать ему не надо. В этом случае вся корректировка должна быть реализована на уровне Вашего приложения (см. пример использования функции ProcessArray() из директории Lusbapi//E-154//Examples//Borland C++ 5.02//AdcKadr)
Итого, поля типа CorrectionEnabled и CalibrKoefAdc убираем из Вашей программы.
|
|
|
Re: Е-154 вместо E-440
ОТЛИЧНО! Шаг за шагом продвигаемся)
А что скажете по поводу моего сообщения выше
Dmitrii 15.06.11 17:09
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
Структура типа MODULE_DESCRIPTION_xxx подверглась большим изменениям. Теперь вместо md.Name следует использовать md.Module.DeviceName. Для модуля E154 там должна быть строка "E-154".
|
|
|
Re: Е-154 вместо E-440
Вот по-старому как происходит(1.При асинхр.режиме поле TimeOut игнорируется в ф-ии ReadData?
2.Отсутствует ф-я ZeroMemory, видимо вместо нее memset?):
void __fastcall TSynchroThread::Execute()
{
...
MainForm->ReadBuffer = new SHORT[MainForm->ChannelPoint*MainForm->ChannelsQuantity];
ReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
//Readevent типа HANDLE
memset(&ReadOv, 0, sizeof(OVERLAPPED));
ReadOv.hEvent=ReadEvent;
PointsToRead = MainForm->ChannelPoint * MainForm->ChannelsQuantity;
TimeOut = MainForm->am.ChannelsQuantity * MainForm->ChannelPoint / 1 + 1000; //здесь вместо единички была переменная(поле am.Channelrate,оно теперь отсут-ет в стр-ре). Поставил частоту,кот. мы используем на 1-м канале. 6кГц/6каналов =1
// стартанем сбор данных
if(!pE440->START_ADC())
{
CloseHandle(ReadEvent);
Application->MessageBox(str1, str2, MB_OK + MB_ICONINFORMATION);
while(!Terminated) { Sleep(10); };
return;
}
while(!Terminated)
{
// запустим асинхронный сбор данных
ThreadLoop++;
if(!pE440->ReadData(MainForm->ReadBuffer, &PointsToRead, &ReadBytesTransferred, &ReadOv))
if(GetLastError() != ERROR_IO_PENDING)
{
CloseHandle(ReadEvent);
mbstowcs(str1, "Не могу собрать данные с платы!", 40);
mbstowcs(str2, "Сообщение TSynchroThread()!", 40);
Application->MessageBox(str1, str2, MB_OK + MB_ICONINFORMATION);
while(!Terminated) { Sleep(10); };
return;
}
Непонятно почему здесь такое присвоение IoReq.NumberOfWordsToPass= DataStep; (вы приводили пример кода. Сергей 09.06.11 11:44) Это же кол-во отсчетов, кот.требуется передать. А реальное кол-во отсчетов почему зануляется?
|
|
- Сотрудник "Л Кард"
- Здесь с 24.04.2014
- Сообщений: 1,495
|
Re: Е-154 вместо E-440
1. В первом приближении разницы между ZeroMemory и memset нет. Единственное - memset входит в стандарт C.
2. Вместо поля am.ChannelRate теперь следует использовать am.KadrRate.
3. Вы наверное перепутали два разный поля NumberOfWordsToPass и NumberOfWordsPassed.
4. В Ваш проект следует подключить библиотеку импорта Lusbapi.lib.
|