Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Без ЦАП: 9D984093
С ЦАП: 7R47416
Доброго времени суток! Подскажите пожалуйста, есть ли разница чтения данных с TTL на Е14-440 с ЦАП и без него.
Возникла некоторая проблема. Написали пример программы, с использованием Е14-440 без ЦАП. Все работает. Ставим в ту же самую схему блок с ЦАП на борту, результат начинает плавать в больших диапазонах.
Делаем так:
// состояния цифровых линий
WORD TtlIn;
ULONG CountDI = 0;
ULONG StartTime = GetTickCount();
for(int i=0; GetTickCount()-StartTime < 1000; i++) // кол-во отчетов за 1 сек.
{
!pModule->TTL_IN(&TtlIn); // Запрос состояния
formMain->DI1 = TtlIn; // Записываем ответ
if (formMain->DI1!=DI_save){ // Если состояние изменилось
DI_save = formMain->DI1; //Запишем последнее состояние
CountDI++; //Счетчик изменения состояний импульса
}
}В результате, этот код работает по разному, с блоками, разница между которыми только в наличии ЦАП'а.
Проблему решил таким образом:
if(!Buffer) {MessageBox(Handle,"Не могу выделить память под буфер данных!", "ОШИБКА!!!", MB_OK|MB_ICONINFORMATION); Close(); return;}
Доброго времени суток! Столкнулся с такой проблемой: Пытаюсь перенести проект из Builder 6 в Rad studio 2010 (для прибора Е14-440). С технической стороны все нормально работает, но есть проблемы с сообщениями об ошибках. К примеру у функции
OnLoadUsbDevice(TMessage& Message) есть такие обработчики:
if(!Buffer) {Application->MessageBox("Не могу выделить память под буфер данных!", "ОШИБКА!!!", MB_OK + MB_ICONINFORMATION); Close(); return;}
В Builder 6 ни каких проблем нет. Но в 2010 версии, компилятор ругается:
[BCC32 Error] formMain_Unit.cpp(82): E2034 Cannot convert 'const char *' to 'const wchar_t *'
Full parser context
formMain_Unit.cpp(78): parsing: void _fastcall TformMain::OnLoadUsbDevice(TMessage &)
Если поставить перед текстом (const wchar_t*), как того просит компилятор, то вместо русского текста выдаются иероглифы.
Подскажите пожалуйста, что можно сделать в таком случае?
Хорошо, Спасибо!
Есть ли возможность заказать готовую прошивку с данной функцией? У нас сроки ограничены, на изучение времени практически нет.
Нашел одну тему на вашем форуме: Счетчики в цифровых линиях внешних модулей
Во втором посте вы написали:
Если речь идёт о цифровых входах, то в Е14-440 потенциально возможно написать "счётчики импульсов" на уровне сигнального процессора ADSP-2185M. Но для этого придётся заняться низкоуровневым программированием Е14-440.
Правильно ли я понимаю, что если реализовать данный счетчик, то на программном уровне не придется ни чего дописывать? Т.е. Е14-440 будет сразу выдавать кол-во импульсов на цифровом входе ?
Ясно. Не подскажите, нет ли каких-то стандартных примеров по подсчету количества импульсов за некоторый промежуток времени (в частности за секунду)?
Опишу немного иначе задачу:
На цифровой вход IN1, который запараллелен с входом синхронизации INT, подается прямоугольный сигнал от тактового генератора. Необходимо посчитать, сколько раз изменится импульс за секунду.
В потоке, в момент сбора/отправки данных делаю запрос :
WORD TtlIn;
!pModule->TTL_IN(&TtlIn);
DI1 = TtlIn;
Если добавить цикл, вида:
CountDI = 0;
ULONG StartTime = GetTickCount();
for(int i=0; GetTickCount()-StartTime < 1000; i++) // кол-во отчетов за 1 сек.
{
!pModule->TTL_IN(&TtlIn); // Запрос состояния
Form1->DI1 = TtlIn; // Записываем ответ
if (Form1->DI1!=DI_save){ // Если состояние изменилось
DI_save = Form1->DI1; //Запишем последнее состояние
CountDI++; //Счетчик изменения состояний импульса
}
} То в таком случае, получаем кол-во отчетов, но при этом программа подвисает, при попадании в данный цикл. Плюс идет привязка к системному счетчику, что может выйти боком в будущем.
Спасибо! То что нужно! 
Примеры которые есть на сайте и на диске для E14-440 (ReadData, WriteData...) написаны для ЦАП. Есть ли подобные примеры для АЦП ? Есть ли вообще разница между АЦП и ЦАП, для задач, когда необходимо записать в устройство данные ?
Если упростить приведенный пример выше, для L791 (lcomp), то получится следующее:
ULONG CountDI = 0;
ULONG DI_countSaved[10];
ULONG TimeN;
ASYNC_PAR DI;
IDaqLDevice* pI;
USHORT DI1;
//--------------------------------------------------------------------------------
CountDI = 0;
ULONG StartTime = GetTickCount();
for(int i=0; GetTickCount()-StartTime < 1000; i++) // кол-во отчетов за 1 сек.
{
TimeN = GetTickCount();
while(GetTickCount() - TimeN < 10) // считываем состояние в т. 10 мс.
{
DI.s_Type = L_ASYNC_TTL_INP; //Для ввода одного отсчета с TTL линий
pI->IoAsync(&DI);
DI1 = DI.Data[0]&0x1; // Записываем введенные данные
if (DI1!=DI_save){ // Если состояние изменилось
DI_save = DI1; //Запишем последнее состояние
CountDI++; //Счетчик изменения состояний импульса (кол-во отчетов)
}
}
}
DI_countSaved[pos] = CountDI; // записываем кол-во отчетов за секунду в массивДалее еще следуют некоторые расчеты, но меня больше интересует, как будет выглядеть данный пример для E14-440 (lusbapi)
Доброго времени суток. Подскажите пожалуйста, где можно посмотреть рабочие примеры по работе с TTL линиями для E14-440 (lusbapi)
Например, как реализовать кнопку Вкл/Выкл сигала на Входе.
Или подскажите, как будет выглядеть следующий пример от L791 (lcomp), для E14-440 (lusbapi):
IDaqLDevice* pI;
ASYNC_PAR DO;
//-----------------------------------
DO.s_Type = L_ASYNC_TTL_OUT;
DO.Data[0]=DO1|DO2|DO4;
pI->IoAsync(&DO);
//---------------------------------Постараюсь описать более подробно задачу:
На некотором оборудовании установлен расходомер (водяной счетчик) СГВ-15 БЕТАР.
Необходимо написать программу, которая показывала бы текущий расход воды.
Для определения расхода, необходимо частоту умножить на вес импульса (константа 8,14).
Амплитуда сигнала примерно 5В.
Минимальная длительность импульса 1/3 периода, это ~8 млс
Диапазон измерения примерно от 8 грамм/сек до 200 грамм/сек
Максимальная частота: 0..40 Гц
Данная задача, решалась с помощью приведенного выше примера, на карте L791 (библиотека lcomp). На данный момент, необходимо изменить данный пример под новое оборудование E14-440 (библиотека lusbapi).
Спасибо за ответ!
Еще такой вопрос:
В старой версии программы для нашего оборудования, с использованием L791 (библиотека lcomp), применялся такой код, для решения выше описанной задачи:
DWORD WINAPI ServiceThread(LPVOID lpParameter)
{
ASYNC_PAR DI;
ASYNC_PAR DO;
USHORT DI_save = 0;
ULONG i,j;
double Value;
ULONG TimeN;
pos = 0;
AnsiString str;
while(true)
{
write_log("TTheard : proceed = true");
::Sleep(1);
DO.s_Type = L_ASYNC_TTL_OUT;
DO.Data[0]=DO1|DO2|DO4;
pI->IoAsync(&DO);
i=0;
try
{
EnterCriticalSection(section_harvest);
CountDI = 0;
ULONG StartTime = GetTickCount();
for(int i=0; GetTickCount()-StartTime < 1000; i++) // кол-во отчетов за 1 сек.
{
TimeN = GetTickCount();
while(GetTickCount() - TimeN < 10) // считываем состояние в т. 10 мс.
{
DI.s_Type = L_ASYNC_TTL_INP;
//DI.Data[0] = 1;
pI->IoAsync(&DI);
DI1 = DI.Data[0]&0x1;
if (DI1!=DI_save){
DI_save = DI1;
CountDI++;
}
}
}
DI_countSaved[pos] = CountDI; // записываем кол-во отчетов за секунду в массивЗадача состоит в том, чтобы выполнить примерно ту же задачу, средствами Е14-440 (библиотека lusbapi).
Не могли бы вы прокомментировать, на сколько он пригоден для решения данной задачи?
Доброго времени суток! Подскажите пожалуйста, каким образом можно измерить период или частоту внешнего сигнала ? Возможно с использованием входа синхронизации
Извиняюсь за глупый вопрос, задача решена ))
Имеется ввиду DRB-37F
Есть какой ни будь пример по сбору информации сразу с нескольких каналов ? Например нужно в массив из 10 элементов, записать данные с 28 по 37 каналы?
Тоже разобрался )) Он был прописан, но видимо как то криво. Добавил заново и все заработало!
Спасибо!
Извиняюсь, с этим тоже разобрался )
Проблемы только вот такого характера остались:
[Linker Error] Unresolved external 'GetDllVersion' referenced from ...
[Linker Error] Unresolved external 'CreateLInstance' referenced from ...
Библиотеки подключены, но компилятор не находит функции
С этим уже разобрался, Спасибо!
Сейчас разбираю пример "SynchroInput" для E14-440. Возникла проблема с подключением библиотеки Lusbapi. Пишу *.h файле проекта:
#include "Lusbapi.h"Но при компиляции все равно пишет, что Lusbapi не найден. Хотя в примере именно так и прописано. При этом пример SynchroInput компилируется без проблем.
Что я мог сделать не так ?
Спасибо! Еще такой вопрос, загрузка управляющей программы выполняется каждый раз при запуске программы или один раз?
Спасибо! А что можете сказать про "I_ADC_PCI_COUNT_L791" ?
Пытался в документации найти описание, но так и не нашел ни чего. Что это ?
Используется вот в таком цикле:
for (j=0;j<Sync[I_ADC_PCI_COUNT_L791];j++)
{
if (i<9)
{
Value = ((double) (Data[j]&0x0000ffff));///8/1024*5*25.74;
Value = ((Value*5000/8192/data->Rizm[i])-data->In[i])/(data->Ik[i]-data->In[i])*(data->Tk[i]-data->Tn[i])+data->Tn[i];
if (Value > data->Tn[i] && Value < data->Tk[i]) T[i] = Value;
else T[i] = 0;
}
i++;
if (i>15) i=0;
}Доброго времени суток! Подскажите пожалуйста, на сколько отличаются принципы общения у данных устройств ?
Плюс забегая вперед, такой вопрос: какой аналог у " I_ADC_PCI_COUNT_L791" , для E14-440 ?
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4
Многоканальный телефон:+7 (495) 785-95-25
Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск