-
АвторТема
-
15.09.2016 в 12:57 #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 -
АвторТема
-
АвторОтветы
-
15.09.2016 в 12:59 #50326
Здравствуйте, Михаил.
Библиотека Zadc.dll является основной библиотекой, используемой при взаимном обмене данными ПК и устройства, подключенного, например по USB. Именно этой библиотекой пользуются абсолютно все виртуальные приборы ZETLab, начиная от вольтметров, заканчивая спектральным анализом.
Если программы ZETLab работают, сигнал со временем изменяется (можно проследить в программе многоканальный осц. вкладки отображение ZETPanel), время по каналам идет (можно отследить в программе время ZETServer вкладки сервисные), то это говорит о том, что Zadc.dll работает. А поскольку вы проверили работоспособность прибора в ZETLab, то и Zadc.dll тоже работает.Причины появления подобных ошибок могут быт разные. Наиболее распространенная ошибка — неправильная последовательность вызова функции. Демонстрационный пример на языке С++ можно посмотреть на Вашем CD, последовательность вызова функций можно взять именно из этого примера.
Спасибо за вопрос.
15.09.2016 в 12:59 #50327Спасибо. Будем считать, что ошибка в драйвере для среды LabVIEV. Тем не менее…
Вы утверждаете что пример, скачанный с официального сайта Вашей фирмы, не работает потому, что в нем «неправильная последовательность вызова функции». Вообще же, обычно ожидаешь, что в примере от разработчика используется правильная последовательность вызова функции. Может быть стоит это исправить?
Поскольку более ранняя версия Zadc.dll, внезапно, является более работоспособной в вашем примере для LabVIEW, мне стало интересно чем же отличаются различные версии Zadc.dll? Где можно посмотреть chandgelog? Хотя я и не очень понимаю, какой в данной операции (старт накопления данных — ожидание заполнения буфера — останов накопления данных — забор данных из буфера) может быть неверный порядок вызова функций, и как это может в отдельных случаях давать положительный результат.
15.09.2016 в 13:00 #50328Очередной раз проверил библиотеку 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++
Удачи!
15.09.2016 в 13:00 #50329Добрый день! Подскажите есть ли хоть какая-нибудь справочная информация по работе с виртуальными приборами из библиотеки в архиве Z210 ver097.zip. Либо что-нибудь аналогичное как у производителя LCARD Е14-140М вот ссылка:
https://zetlab.ru/support/images/newforum/labview_e154_e140_e440_e2010.pdfЗаранее спасибо!
Иван.15.09.2016 в 13:01 #50330Мы не разрабатываем и не поддерживаем библиотек для работы с ПО сторонних производителей. Но если с этими библиотеками делятся наши потребители, которые они разрабатывают сами, то мы с удовольствием размещаем их у себя на сайте. Для выполнения Ваших задач, скорее всего подойдет наша SCADA система ZETView.
15.09.2016 в 13:01 #50331Значит, я зря купил,на пробу продукт Вашей компании? И в дальнейшем не стоит обращать внимания на Вашу продукцию, т.к. с ней не возможно работать под более универсальной и распространенной SCADA-системой LabView чем Ваша? тем более, что тот пример, который выложен у Вас на сайте в полном объёме не работает!!!!!(((
Извините за резкое сообщение, но я думаю, что большинство пользователей согласится со мной.
Иван.15.09.2016 в 13:01 #50332Иван, добрый день!
Ответила на Ваши вопросы по электронной почте. Мы обязательно поможем Вам в решении насущных вопросов с использованием нашей продукции.С уважением, Мария Стазаева
15.09.2016 в 13:01 #50333В общем, не дождался я работающего драйвера, разобрался и сделал свой. Кто хочет подружить Zet210 с LabVIEW — качаем с гитхаба: https://github.com/mishavolkin/zet_210_LabVIEW_drivers
15.09.2016 в 13:02 #50334Добрый день!
С вашего разрешения мы можем разместить на сайте информацию в разделе
https://zetlab.ru/catalog/adc_dacs/driver_labview.php -
АвторОтветы
Для ответа в этой теме необходимо авторизоваться.