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


E14-440 в LabView

Вы не вошли.

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

Murad
16.01.2007 09:04:22
#1

Гость

E14-440 в LabView

Пример, что лежит в lusbapi20.exe (из библиотеки файлов) выдает ошибку на функции WGetModuleName. Кто-нибудь знает, почему?

Murad
16.01.2007 11:22:22
#2

Гость

Re: E14-440 в LabView

Пытался собрать тот же проект в Builder. Добавил в проект E440vi.lib, E440vi.h и E440str.h. Выдает ошибку:
E440vi.lib contains invalid OMF record, type 0x21 (possibly COFF)

Александр
16.01.2007 12:09:01
#3

Гость

Re: E14-440 в LabView

На нашем сайте в библиотеке файлов есть новые примеры для работы с E14-440 в среде LabVIEW. http://www.lcard.ru/download/#8 , файл e440lv.exe (самораспаковывающийся архив).
  Скачайте эти примеры, и все должно заработать.

Murad
16.01.2007 12:37:21
#4

Гость

Re: E14-440 в LabView

Спасибо!

Murad
01.02.2007 11:15:57
#5

Гость

Re: E14-440 в LabView

По данному примеру пытаюсь сделать свой CIN_init. Код практически такой же, но снова появляется ошибка на этом методе (WGetModuleName).
Проект компилируется без проблем (Visual Studio 2003 .NET). init.lsb создается. Ошибка появляется при запуске в LV 7.1. Предъявляю код. Может я что неправильно делаю?

/* CIN source file */

#include <windows.h>
#include "extcode.h"
#include "E440str.h"
#include "E440vi.h"
#include "stdio.h"

MgErr CINRun(uInt32 *hDll, uInt32 *hIfc, uInt8 *ushortSlot,
    uInt16 *uintError, LStrHandle strError);

MgErr CINRun(uInt32 *hDll, uInt32 *hIfc, uInt8 *ushortSlot,
    uInt16 *uintError, LStrHandle strError)
    {

    char str[20],strName[20],dllName[20];
    unsigned char slot;
    MODULE_DESCR_E440 md;
    FILE *stream;
    ADC_PARS_E440 am;
    int i;
   
    stream = fopen("log.txt","w+");
   
    strcpy(dllName,"lusbapi.dll");
    LoadAPIDLL(dllName,hDll);
    if (*hDll==0)
    {
        strcpy(str,"Не загружена библиотека!");
        *uintError = 1;
        goto end;
    }
    else
    {
        fprintf(stream,"Библиотека загружена/n");
    }

    *hIfc = CallCreateInstance(*hDll,"E440");
    if (*hIfc==0)
    {
        strcpy(str,"Не получена ссылка на объект");
        *uintError = 1;
        FreeAPIDLL(*hDll);
        goto end;
    }else fprintf(stream,"Ссылка на объект получена/n");

    for (slot=0;slot<8;slot++)
        if (WInitLDevice(*hIfc, *ushortSlot)) break;
        /*
        {
            strcpy(str,"Устройство не проинициализировано");
            *uintError = 1;
            goto end_all;
        }else fprintf(stream,"Устройство проинициализировано");
        */

    if (slot==8)
    {
        strcpy(str,"Не найдено ни одного подключения платы E14-440");
        *uintError = 1;
        goto end_all;
    }
    else
    {
        *ushortSlot = slot;
        fprintf(stream,"Плата установлена в слоте %i/n",slot);
    }

    if (!WGetModuleName(*hIfc,strName))
    {
        strcpy(str,"Не удалось получить имя устройства");
        *uintError = 1;
        goto end_all;
    }else fprintf(stream,"Имя устройства - %s/n",strName);
   
    if (!strcmp(strName,"E440"))
    {
        strcpy(str,"В данный слот установлена не плата E14-440");
        *uintError = 1;
        goto end_all;           
    }else fprintf(stream,"Подтверждение установки платы/n");
   
    if (!WLOAD_LBIOS(*hIfc,NULL))
    {
        strcpy(str,"Не удается загрузить BIOS");
        *uintError = 1;
        goto end_all;
    }else fprintf(stream,"BIOS загружен/n");

    if (!WMODULE_TEST(*hIfc))
    {
        strcpy(str,"Плата не прошла тестирование");
        *uintError = 1;
        goto end_all;
    }else fprintf(stream,"Плата прошда тестирование/n");
   
    md.size = sizeof(MODULE_DESCR_E440);
    if (!WGET_MODULE_DESCR(*hIfc,&md))
    {
        strcpy(str,"Служебная информация из ППЗУ не считана");
        *uintError = 1;
        goto end_all;
    }else fprintf(stream,"Служебная информация из ППЗУ считана/n");
   
    fprintf(stream,"----- Module description information -------/n");
    fprintf(stream,"Serial number - %s/n",md.SerialNumber);
    fprintf(stream,"DSP type - %s/n",md.Dsp_Type);
    fprintf(stream,"DAC presenetd - %c/n",md.IsDacPresented);
    fprintf(stream,"Name - %s/n",md.Name);
    fprintf(stream,"Quarz frequency - %l/n",md.QuartzFrequency);
    fprintf(stream,"Revision - %c/n",md.Revision);
    fprintf(stream,"Size - %u/n",md.size);
    fprintf(stream,"Calibrate koefficients:/n");
    for (i=0;i<8;i++)
        fprintf(stream,"Koef[%i] - %u/n",i,md.CalibrKoefAdc[i]);
   
    am.InputMode = 0;
    am.CorrectionEnabled = 1;
    for (i=0;i<8;i++) am.CalibrKoefAdc[i] = md.CalibrKoefAdc[i];
    am.ChannelsQuantity = 4;
    am.ControlTable[0] = 0x30;//00100000;
    am.ControlTable[1] = 0x31;
    am.ControlTable[1] = 0x32;
    am.ControlTable[1] = 0x33;
    am.AdcRate = 400;
    am.InterKadrDelay = 0;
    am.AdcFifoLength = 0x3000;
    am.size = sizeof(ADC_PARS_E440);

    if (!WFILL_ADC_PARS(*hIfc,&am))
    {
        strcpy(str,"Параметры АЦП не установлены");
        *uintError = 1;
        goto end_all;
    }else fprintf(stream,"Установлены новые параметры АЦП/n");

    am.size = sizeof(ADC_PARS_E440);
    if (!WGET_CUR_ADC_PARS(*hIfc, &am))
    {
        strcpy(str,"Не получены текущие данные о работе АЦП");
        *uintError = 1;
        goto end_all;
    }else fprintf(stream,"Получены установленные парамтры АЦП/n");

    fprintf(stream,"----- Current ADC parameters ------/n");
    fprintf(stream,"ADC enabled - %i/n",(int)am.AdcEnabled);
    fprintf(stream,"ADC fifo base address - %u/n",am.AdcFifoBaseAddress);
    fprintf(stream,"ADC fifo lenght - %u/n",am.AdcFifoLength);
    fprintf(stream,"ADC rate - %lf/n",am.AdcRate);
    fprintf(stream,"Calibrate koefficients:/n");
    for (i=0;i<8;i++)
        fprintf(stream,"Koef[%i] - %u/n",i,am.CalibrKoefAdc[i]);
    fprintf(stream,"Channel rate - %lf/n",am.ChannelRate);
    fprintf(stream,"Channels quantity - %u/n",am.ChannelsQuantity);
    fprintf(stream,"Correction enableed - %i/n",(int)am.CorrectionEnabled);
    fprintf(stream,"Input mode - %u/n",am.InputMode);
    fprintf(stream,"Inter frame delay - %lf/n",am.InterKadrDelay);
    fprintf(stream,"Size - %u/n",am.size);
    fprintf(stream,"Synchro ADC channel - %u/n",am.SynchroAdChannel);
    fprintf(stream,"Synchro ADC mode - %u/n",am.SynchroAdMode);
    fprintf(stream,"Synchro ADC porog - %i/n",(int)am.SynchroAdPorog);
    fprintf(stream,"Synchro ADC type - %u/n",am.SynchroAdType);

end_all:
    //if (*uintError == 1)
    {
        //CancelIo(WGetModuleHandle(*hIfc));
        WReleaseLDevice(*hIfc);
        FreeAPIDLL(*hDll);
    }
end:
    NumericArrayResize(uB, 1L,(UHandle*)&strError,60);
    strcpy(LStrBuf(*strError),str);
    LStrLen(*strError) = 60;
    fprintf(stream,"Error - %s/n",str);
    fclose(stream);


    return noErr;
    }

Еще вопрос. Если несложно, скажите, пожалуйста, откуда берете функцию NumericArrayResize.

Еще... В последне вашем примере для LV в файле E440vi.h вы пишете:
#define DllExport(type) //extern "C" __declspec( dllexport ) type

А раньше было:
#define DllExport(type) extern "C" __declspec( dllexport ) type

А появляется в LV ошибка: Вызов неверно декларированной функции (Наверное, "C" или "C++").
Вот такая в общем проблема.

Если декларировать функцию "C" как показано ранее, то это вызывает ошибку компилятора.
Как это разрешается?

Александр
02.02.2007 11:39:57
#6

Гость

Re: E14-440 в LabView

А какого рода ошибка появляется? CIN завершается корректно, выводя "Не удалось получить имя устройства" (как следует из кода)? Или на этом CINe вообще программа зависает? А функции, вызываемые до указанной, выполняются успешно? Т.е. библиотека загружается, виртуальный слот находится, инициализация платы проходит?
Что касается функции NumericArrayResize(), то она входит в библиотеку функций LabVIEW. Подробно о ней написано в Руководстве "Using External Code in LabVIEW", прилагаемом к среде.
   Комментарии в объявлении функции - это нормально. Просто при компиляции библиотеки E440VI.dll (она производилась в среде MS Visual C++) необходимо объявление функций с extern "C" __declspec(dllexport), ибо функции должны быть экспортирцемыми. А при компиляции CINa, естественно, никакого экспорта функций быть не может. Файл E440VI.h используется как при компиляции библиотеки, так и при компиляции CINa, но в последнем случае следует убрать спецификатор экспорта функций, что и сделано.

Artem
21.01.2008 12:33:45
#7

Гость

Re: E14-440 в LabView

При использовании прмера E400LV Detector вылезает ошибка "не могу загрусить Bios". Не подскажите почему?

21.01.2008 13:16:28
#8

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

Re: E14-440 в LabView

Попробуйте почитать ветку:
http://www.lcard.ru/forumthreads/2242
Там в самом конце сообщение Александра от 15.04.05 15:58.