• Автор
    Тема
  • #50324

    Михаил
    Участник

    Я хочу использовать модуль ЦАП/АЦП Zet210 в среде LabVIEW. В процессе «прикручивания» я столкнулся с затруднениями.

    Симптомы: тестовый пример завершается с кодом ошибки 0, причем в зависимости от версии библиотеки Zadc.dll таким исходом завершаются некоторые или все режимы работы (DAC -ADC).

    1. Ошибка 0. Причина: а) пропущена одна из опций в case-структуре формирующей кластер (код ошибки, описание ошибки) по коду завершения функции из Zadc.dll. б) статус (OK — ERR) меняется в отдельной case-структуре. В результате при генерации ошибки 0xFF00, (например функцией «ZGetLastDataADC» в виртуальном подприборе «Z210 DATA ADC Get Last Data.vi»), статус потока ошибки меняется на ERR, а код ошибки остается 0.
    Прошу это исправить.

    2. Мне были доступны библиотеки Zadc.dll версий: 5.1 (та что идет в комплекте с архивом) и 5.3.5 (та что была на CD с драйвером и отстальным ПО). При использовании версии 5.1 работает режим «ADC only». Остальные режимы приводят к Ошибке. Версия 5.3.5 вызывает ошибку в любом режиме.
    Хотелось бы получить полностью работоспособную версию Zadc.dll

    Предвосхищая вопросы:
    работоспособность прибора проверил в ZetLAB.
    версия LabVIEW 7.1.1

Просмотр 9 ответов - с 1 по 9 (всего 9)
  • Автор
    Ответы
  • #50326

    Менеджер ZETLab
    Хранитель

    Здравствуйте, Михаил.

    Библиотека Zadc.dll является основной библиотекой, используемой при взаимном обмене данными ПК и устройства, подключенного, например по USB. Именно этой библиотекой пользуются абсолютно все виртуальные приборы ZETLab, начиная от вольтметров, заканчивая спектральным анализом.
    Если программы ZETLab работают, сигнал со временем изменяется (можно проследить в программе многоканальный осц. вкладки отображение ZETPanel), время по каналам идет (можно отследить в программе время ZETServer вкладки сервисные), то это говорит о том, что Zadc.dll работает. А поскольку вы проверили работоспособность прибора в ZETLab, то и Zadc.dll тоже работает.

    Причины появления подобных ошибок могут быт разные. Наиболее распространенная ошибка — неправильная последовательность вызова функции. Демонстрационный пример на языке С++ можно посмотреть на Вашем CD, последовательность вызова функций можно взять именно из этого примера.

    Спасибо за вопрос.

    #50327

    Михаил
    Участник

    Спасибо. Будем считать, что ошибка в драйвере для среды LabVIEV. Тем не менее…

    Вы утверждаете что пример, скачанный с официального сайта Вашей фирмы, не работает потому, что в нем «неправильная последовательность вызова функции». Вообще же, обычно ожидаешь, что в примере от разработчика используется правильная последовательность вызова функции. Может быть стоит это исправить?

    Поскольку более ранняя версия Zadc.dll, внезапно, является более работоспособной в вашем примере для LabVIEW, мне стало интересно чем же отличаются различные версии Zadc.dll? Где можно посмотреть chandgelog? Хотя я и не очень понимаю, какой в данной операции (старт накопления данных — ожидание заполнения буфера — останов накопления данных — забор данных из буфера) может быть неверный порядок вызова функций, и как это может в отдельных случаях давать положительный результат.

    #50328

    Менеджер ZETLab
    Хранитель

    Очередной раз проверил библиотеку zadc.dll и список изменений (changelist) изменения не коснулись ранее объявленных интерфейсов, а именно функций и функциональности библиотеки с точки зрения работы с приборами. В новой версии добавлены только функции поддержки нового устройства — ZET240.

    В качестве шаблона предлагаю вам воспользоваться следующим рабочим примером.

    #include «stdafx.h»
    #include
    #include
    #include
    #include «zadc_int.h» // Интерфейс библиотеки Zadc.dll

    // Программа включающая два канала АЦП и отображающая мгновенное амплитудное значение
    // по двум каналам 2 раза в секунду

    int main(int argc, char* argv[])
    {
    HINSTANCE dllHandle = NULL;
    long typeDevice; // Тип устройства
    long numberDSP; // Порядковый номер устройства
    long err; // Код ошибки
    long numChannelsADC; // Кол-во включенных каналов АЦП
    long numWordsADC; // Кол-во слов (по два байта) в одном отсчете АЦП
    void *pBuffer; // Указатель на начало буфера драйвера типа void
    short *pBuffer16ADC; // Указатель на начало буфера драйвера для АЦП с разрядностью не более 16 бит
    long *pBuffer32ADC; // Указатель на начало буфера драйвера для АЦП с разрядностью более 16 бит
    long sizeBufferADC; // Размер буфера драйвера в словах
    long pointerADC; // Указатель на текущий элемент заполнения буфера драйвера (кратен 2)
    long pointerADC_old; // Предыдущее значение указателя на буфер драйвера
    double amplifyADC0, amplifyADC1; // Коэф. усиления по первым двум каналам
    double resolutionADC; // Вес младшего разряда АЦП
    double volt0, volt1; // Мгновенное текущее значение АЦП (в Вольтах)

    typeDevice = KDU1616; // Здесь для примера выбрано устройство ADC 1616 Sigma USB
    numberDSP = 0; // Порядковый номер DSP

    // Подключиться к библиотеке для работы с АЦП/ЦАП
    dllHandle = LoadLibrary(«zadc.dll»);

    // Если подключиться не удалось — выйти
    if (dllHandle == NULL)
    {
    printf(» Not find zadc.dll!/n/r»);
    getch();
    return 0;
    }

    // подключиться к драйверу (обязательно)
    err = ZOpen(typeDevice, numberDSP);
    if(err != 0)
    {
    printf(«Device not found! Error = 0x%X\n\r», err);
    getch();
    return 0;
    }
    else
    printf(«Device found…\n\r»);

    // включить первый канал АЦП
    err = ZSetInputADC(typeDevice, numberDSP, 0, 1);
    if(err != 0)
    {
    printf(«ZSetInputADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // включить второй канал АЦП
    err = ZSetInputADC(typeDevice, numberDSP, 1, 1);
    if(err != 0)
    {
    printf(«ZSetInputADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // опросить коэф. усиления по первому каналу АЦП
    err = ZGetAmplifyADC(typeDevice, numberDSP, 0, &lifyADC0);
    if(err != 0)
    {
    printf(«ZGetAmplifyADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // опросить коэф. усиления по второму каналу АЦП
    err = ZGetAmplifyADC(typeDevice, numberDSP, 1, &lifyADC1);
    if(err != 0)
    {
    printf(«ZGetAmplifyADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // опросить вес младшего разряда АЦП
    err = ZGetDigitalResolutionADC(typeDevice, 0, &resolutionADC);
    if(err != 0)
    {
    printf(«ZGetDigitalResolutionADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // опросить кол-во включенных каналов АЦП
    err = ZGetNumberInputADC(typeDevice, numberDSP, &numChannelsADC);
    if(err != 0)
    {
    printf(«Function ZGetNumberInputADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // опросить кол-во слов в одном отсчете АЦП
    err = ZGetWordsADC(typeDevice, 0, &numWordsADC);
    if(err != 0)
    {
    printf(«ZGetWordsADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // Проверка переменных, чтобы избежать деления на 0
    if(numWordsADC == 0 || amplifyADC0 == 0 || amplifyADC1 == 0)
    {
    printf(«Ошибочные значения параметров АЦП\n\r»);
    getch();
    return 0;
    }

    // запросить буфер АЦП
    err = ZGetBufferADC(typeDevice, numberDSP, &pBuffer, &sizeBufferADC);
    if(err != 0)
    {
    printf(«Function ZGetBufferADC() return Error = 0x%X\n\r», err);
    getch();
    return 0;
    }

    // Проинициализировать локальные указатели для конкретных типов данных
    pBuffer16ADC = (short*) pBuffer;
    pBuffer32ADC = (long*) pBuffer;

    // запуск АЦП
    err = ZStartADC(typeDevice, numberDSP);
    if(err != 0)
    printf(«Function ZStartADC() return Error = 0x%X\n\r», err);

    // Цикл чтения данных АЦП
    pointerADC_old = 0;
    while(!kbhit())
    {
    // Задержка обновления данных АЦП для отображения
    Sleep(500);

    // запросить указатель на текущий элемент буфера
    err = ZGetPointerADC(typeDevice, numberDSP, &pointerADC);
    if(err != 0)
    {
    printf(«Function ZGetPointerADC() return Error = 0x%X\n\r», err);
    break;
    }

    // Если новые данные в буфер от АЦП не поступили, то продождать
    if(pointerADC == pointerADC_old)
    continue;

    // обновить предыдущее значение указателя
    pointerADC_old = pointerADC;

    // перейти на отсчет первого включенного канала последнего кадра АЦП
    if(pointerADC — numWordsADC * numChannelsADC < 0) pointerADC = sizeBufferADC + pointerADC - numWordsADC * numChannelsADC; else pointerADC = pointerADC - numWordsADC * numChannelsADC; // вычислить из целого значения отсчета АЦП вещественное значение отсчета (в Вольтах) if(numWordsADC == 1) volt0 = resolutionADC * (pBuffer16ADC[pointerADC]) / amplifyADC0; else volt0 = resolutionADC * (pBuffer32ADC[pointerADC/numWordsADC]) / amplifyADC0; // отобразить мгновенное значение напряжения для первого канала printf("%+8.4f", volt0); // если включено более одного канала АЦП, то сделать то же самое для второго канала if(numChannelsADC > 1)
    {
    // перейти на следующий отсчет АЦП
    pointerADC += numWordsADC;

    // если вышли за границу буфера, то перейти в начало
    if(pointerADC >= sizeBufferADC)
    pointerADC = pointerADC — sizeBufferADC;

    if(numWordsADC == 1)
    volt1 = resolutionADC * (pBuffer16ADC[pointerADC]) / amplifyADC1;
    else
    volt1 = resolutionADC * (pBuffer32ADC[pointerADC/numWordsADC]) / amplifyADC1;

    // отобразить мгновенное значение напряжения для второго канала
    printf(» %+8.4f», volt1);
    }
    printf(«\n\r»);
    }

    // останов АЦП
    err = ZStopADC(typeDevice, numberDSP);
    if(err != 0)
    printf(«Function ZStopADC() return Error = 0x%X\n\r», err);

    // освободить буфер АЦП
    err = ZRemBufferADC(typeDevice, numberDSP, &pBuffer);
    if(err != 0)
    printf(«Function ZRemBufferADC() return Error = 0x%X\n\r», err);

    // отключиться от драйвера (обязательно)
    err = ZClose(typeDevice, numberDSP);
    if(err != 0)
    printf(«Function ZClose() return Error = 0x%X\n\r», err);

    // Отключиться от библиотеки для работы с АЦП/ЦАП
    FreeLibrary(dllHandle);

    if(!kbhit())
    getch();
    printf(«Press any key for exit…»);
    getch();

    return 0;
    }

    Test_Zadc_C++

    Удачи!

    #50329

    Иван
    Участник

    Добрый день! Подскажите есть ли хоть какая-нибудь справочная информация по работе с виртуальными приборами из библиотеки в архиве Z210 ver097.zip. Либо что-нибудь аналогичное как у производителя LCARD Е14-140М вот ссылка:
    https://zetlab.ru/support/images/newforum/labview_e154_e140_e440_e2010.pdf

    Заранее спасибо!
    Иван.

    #50330

    Менеджер ZETLab
    Хранитель

    Мы не разрабатываем и не поддерживаем библиотек для работы с ПО сторонних производителей. Но если с этими библиотеками делятся наши потребители, которые они разрабатывают сами, то мы с удовольствием размещаем их у себя на сайте. Для выполнения Ваших задач, скорее всего подойдет наша SCADA система ZETView.

    #50331

    Иван
    Участник

    Значит, я зря купил,на пробу продукт Вашей компании? И в дальнейшем не стоит обращать внимания на Вашу продукцию, т.к. с ней не возможно работать под более универсальной и распространенной SCADA-системой LabView чем Ваша? тем более, что тот пример, который выложен у Вас на сайте в полном объёме не работает!!!!!(((

    Извините за резкое сообщение, но я думаю, что большинство пользователей согласится со мной.
    Иван.

    #50332

    Менеджер ZETLab
    Хранитель

    Иван, добрый день!
    Ответила на Ваши вопросы по электронной почте. Мы обязательно поможем Вам в решении насущных вопросов с использованием нашей продукции.

    С уважением, Мария Стазаева

    #50333

    Михаил
    Участник

    В общем, не дождался я работающего драйвера, разобрался и сделал свой. Кто хочет подружить Zet210 с LabVIEW — качаем с гитхаба: https://github.com/mishavolkin/zet_210_LabVIEW_drivers

    #50334

    Менеджер ZETLab
    Хранитель

    Добрый день!

    С вашего разрешения мы можем разместить на сайте информацию в разделе
    https://zetlab.ru/catalog/adc_dacs/driver_labview.php

Просмотр 9 ответов - с 1 по 9 (всего 9)

Для ответа в этой теме необходимо авторизоваться.