Форум ZETLAB

Архив обсуждений, технических вопросов и ответов по оборудованию, программному обеспечению и внедрению измерительных систем.

Страницы: 1
RSS
Драйвер для среды LabVIEW, Проблемы с Z210 в LabView проявляющиеся как ошибка 0
 
Я хочу использовать модуль ЦАП/АЦП 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
 
Здравствуйте, Михаил. Библиотека Zadc.dll является основной библиотекой, используемой при взаимном обмене данными ПК и устройства, подключенного, например по USB. Именно этой библиотекой пользуются абсолютно все виртуальные приборы ZETLab, начиная от вольтметров, заканчивая спектральным анализом. Если программы ZETLab работают, сигнал со временем изменяется (можно проследить в программе многоканальный осц. вкладки отображение ZETPanel), время по каналам идет (можно отследить в программе время ZETServer вкладки сервисные), то это говорит о том, что Zadc.dll работает. А поскольку вы проверили работоспособность прибора в ZETLab, то и Zadc.dll тоже работает. Причины появления подобных ошибок могут быт разные. Наиболее распространенная ошибка - неправильная последовательность вызова функции. Демонстрационный пример на языке С++ можно посмотреть на Вашем CD, последовательность вызова функций можно взять именно из этого примера. Спасибо за вопрос.
 
Спасибо. Будем считать, что ошибка в драйвере для среды LabVIEV. Тем не менее... Вы утверждаете что пример, скачанный с официального сайта Вашей фирмы, не работает потому, что в нем "неправильная последовательность вызова функции". Вообще же, обычно ожидаешь, что в примере от разработчика используется правильная последовательность вызова функции. Может быть стоит это исправить? Поскольку более ранняя версия Zadc.dll, внезапно, является более работоспособной в вашем примере для LabVIEW, мне стало интересно чем же отличаются различные версии Zadc.dll? Где можно посмотреть chandgelog? Хотя я и не очень понимаю, какой в данной операции (старт накопления данных — ожидание заполнения буфера — останов накопления данных — забор данных из буфера) может быть неверный порядок вызова функций, и как это может в отдельных случаях давать положительный результат.
 
Очередной раз проверил библиотеку 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++ Удачи!
 
Добрый день! Подскажите есть ли хоть какая-нибудь справочная информация по работе с виртуальными приборами из библиотеки в архиве Z210 ver097.zip. Либо что-нибудь аналогичное как у производителя LCARD Е14-140М вот ссылка: http://zetlab.ru/support/images/newforum/labview_e154_e140_e440_e2010.pdf Заранее спасибо! Иван.
 
Мы не разрабатываем и не поддерживаем библиотек для работы с ПО сторонних производителей. Но если с этими библиотеками делятся наши потребители, которые они разрабатывают сами, то мы с удовольствием размещаем их у себя на сайте. Для выполнения Ваших задач, скорее всего подойдет наша SCADA система ZETView.
 
Значит, я зря купил,на пробу продукт Вашей компании? И в дальнейшем не стоит обращать внимания на Вашу продукцию, т.к. с ней не возможно работать под более универсальной и распространенной SCADA-системой LabView чем Ваша? тем более, что тот пример, который выложен у Вас на сайте в полном объёме не работает!!!!!((( Извините за резкое сообщение, но я думаю, что большинство пользователей согласится со мной. Иван.
 
Иван, добрый день! Ответила на Ваши вопросы по электронной почте. Мы обязательно поможем Вам в решении насущных вопросов с использованием нашей продукции. С уважением, Мария Стазаева
 
В общем, не дождался я работающего драйвера, разобрался и сделал свой. Кто хочет подружить Zet210 с LabVIEW — качаем с гитхаба: https://github.com/mishavolkin/zet_210_LabVIEW_drivers
 
Добрый день! С вашего разрешения мы можем разместить на сайте информацию в разделе http://zetlab.ru/catalog/adc_dacs/driver_labview.php
Страницы: 1
Читают тему