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


Е-154 вместо E-440

Вы не вошли.

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

Дмитрий 1985
03.06.2011 09:47:50
#1

Гость

Е-154 вместо E-440

Здравствуйте! Помогите разобраться. У меня проблемы с платой (модулем) Е-154.
В нашей лаборатории используется устройство, в состав которого входит модуль Е440. Мы хотим заменить его на Е154. Подключаем также как и е440,ставим драйвера, операционная система вроде бы видит его в диспетчере устройств. Но наша программа (написана на С++ Билдер 2009)не видит его. Помогите разобраться пожалуйста. С уважением , Дмитрий.

03.06.2011 10:01:34
#2

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Е-154 вместо E-440

<<...Подключаем также как и е440>>
- Не могу пройти мимо этого заявления, поскольку ТАКЖЕ его подключать нельзя.

03.06.2011 10:05:00
#3

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

Re: Е-154 вместо E-440

А в программу Вы соответствующие изменения внесли?

03.06.2011 10:59:35
#4

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Е-154 вместо E-440

Дмитрий 1985: это модули из одного семейства, но совсем не прямая замена друг другу - и с точки зрения подключения сигналов (см. руководство по эксплуатации), и со стороны программного интерфейса (см. руководство программиста).
То есть вашу программу придется адаптировать - либо просто переделать с E-440 на E-154, либо сделать поддержку обоих типов модулей.

Сергей
03.06.2011 21:18:47
#5

Гость

Re: Е-154 вместо E-440

Как управлять E154 на VB могу дать пример, к сожалению пока не все получилось.

Дмитрий 1985
06.06.2011 06:32:22
#6

Гость

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)?

06.06.2011 09:29:36
#7

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 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?

Дмитрий 1985
06.06.2011 09:32:44
#8

Гость

Re: Е-154 вместо E-440

и еще: какие изменения потребуются в исходный код программы на С++ 2009?

Дмитрий 1985
07.06.2011 04:03:30
#9

Гость

Re: Е-154 вместо E-440

Спасибо, что отвечаете на мои вопросы. Когда писал посл-ее сообщение не заметил ответ Александра(по-моему сообщения вообще не было).
По всем параметрам Е-154 нас устраивает. В моем lusbapi.h всего 4 структуры или это у всех так? Какие изменения вносить в программный код для поддержки обоих модулей?

Дмитрий 1985
07.06.2011 06:27:45
#10

Гость

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

07.06.2011 10:20:47
#11

Сотрудник "Л Кард"
Здесь с 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

Дмитрий 1985
08.06.2011 12:19:50
#12

Гость

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 такого поля нет. Можно внаглую его там прописать? много таких нестыковок есть

08.06.2011 15:09:44
#13

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

Re: Е-154 вместо E-440

Я бы посоветовал не трогать собственно саму библиотеку Lusbpai.
Попробуйте запользовать новый заголовочный файл lusbpai.h и подрихтовать Ваши исходные тексты под его требования, исправляя ошибки и предупреждения компилятора и линковщика.

Дмитрий 1985
09.06.2011 08:23:52
#14

Гость

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)

Как мне адаптировать участок кода описанный выше? уже почти неделю маюсь рез-т мизерный

09.06.2011 10:44:12
#15

Сотрудник "Л Кард"
Здесь с 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. Вообще-то всю эту процедуру можно было бы посмотреть как в документации, так и в многочисленных прилагаемых примерах программирования.

15.06.2011 11:45:49
#16

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

Re: Е-154 вместо E-440

Просто уберите из Вашей программы любые упоминания о поле size.

Dmitrii
15.06.2011 13:45:03
#17

Гость

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;
  }

15.06.2011 14:25:08
#18

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

Re: Е-154 вместо E-440

Модулю Е-154 не требуется загрузка. Поэтому функции LOAD_LBIOS() и MODULE_TEST() вполне можно исключить из программы.

Dmitrii
15.06.2011 16:09:18
#19

Гость

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 больше нигде не засвечено в проекте.

Dmitrii
15.06.2011 16:21:57
#20

Гость

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]?

15.06.2011 18:54:41
#21

Сотрудник "Л Кард"
Здесь с 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 убираем из Вашей программы.

Dmitrii
15.06.2011 20:42:38
#22

Гость

Re: Е-154 вместо E-440

ОТЛИЧНО! Шаг за шагом продвигаемся)
А что скажете по поводу моего сообщения выше
Dmitrii 15.06.11 17:09

15.06.2011 20:56:08
#23

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

Re: Е-154 вместо E-440

Структура типа MODULE_DESCRIPTION_xxx подверглась большим изменениям. Теперь вместо md.Name следует использовать md.Module.DeviceName. Для модуля E154 там должна быть строка "E-154".

Dmitrii
18.06.2011 09:58:30
#24

Гость

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) Это же кол-во отсчетов, кот.требуется передать. А реальное кол-во отсчетов почему зануляется?

18.06.2011 11:11:01
#25

Сотрудник "Л Кард"
Здесь с 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.