Форум:

Вы не вошли.

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

#1 Re: Техническая поддержка » Получение данных с каналов » 20.05.2021 16:42:13

Тихомиров Сергей пишет:

1. Попробуйте задействовать немного переделанный штатный консольный пример  AdcKadr, в котором используется подключение с общей землей для первых 4-х каналов.
2. Не забудьте объединить ножки AGND(3) и GND32(21) на  внешнем аналоговом разъёме модуля. Тогда на ножки X1(37), X2(36), X3(35) и X4(34) можно подавать постоянные сигналы в диапазоне ±2.5 В.

Да все заработало, спасибо вам огромное, я так понимаю что бы задействовать остальные порты нужно всего лишь менять данный показатель в коде:

#define CHANNELS_QUANTITY			(0x4)

#2 Re: Техническая поддержка » Получение данных с каналов » 19.05.2021 16:52:29

Тихомиров Сергей пишет:

1. В штатном примере AdcKadr  сбор данных идёт с первых 4-х каналов АЦП. Все каналы  сконфигурированы по дифференциальной схеме подключения входных сигналов.
2. В штатном примере AdcSample  сбор данных идёт с первых 2-х каналов АЦП. Причём 1-ый канал использует  дифференциальное подключение входных сигналов, а 2-ой канал - просто аппаратно заземлён.
3. Чтобы более тщательно проанализировать Вашу ситуацию, нам необходимо получить от Вас как можно более полную информацию о схеме подключения сигналов к внешнему разъёму модуля E14-140M. Опишите, как можно подробнее, какой именно сигнал приходит на каждую из задействованных ножек внешнего разъёма.

Переговорил с инженером, в общем основываясь на этом документе: https://www.lcard.ru/download/e14-140_conn_examples.pdf страница 2 "Подключение к входу АЦП однофазного источника напряжения" в таблице пункт 1.1. Просто нужен метод чтобы отдельно значение с каждого входа в режиме 1.1 получить. Не инвертирующие входы х1 х2 х3..........

#3 Техническая поддержка » Получение данных с каналов » 19.05.2021 11:23:24

Efim91
Ответов: 5

Добрый день, хочу получить данные с каналов попробовали эти программы: AdcKadr, почему то не считывает и во все, числа со всех каналов, просто уходят в отрицательное значение и все, а вот  AdcSample работает, но правда считывается только один канал, на второй он не реагирует хотя LGraph все видит и нормально анализирует, подключаем прям в соседний, предполагаю что ошибка кроется где то здесь, но не как могу понять:

while(!kbhit())
    {
        if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (0x0 << 4) | (InputRangeIndex << 6)))) { printf("\n\n  ADC_SAMPLE(, 0) --> Bad\n");    break; }
        else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (0x1 << 4) | (InputRangeIndex << 6)))) { printf("\n\n  ADC_SAMPLE(, 1) --> Bad\n");    break; }

        printf(" AdcSample Data (ADC code):     %5d     %5d\r", AdcSample1, AdcSample2);
    }

Модуль E14-140M.

#4 Re: Техническая поддержка » Простой опрос портов » 15.04.2021 14:47:38

Тихомиров Сергей пишет:

1. Штатный пример ReadData осуществляет потоковый сбор данных на частоте 400 кГц. Уверены, что вам необходимо выводить на экран каждую секунду по  400000 отсчётов?
2. Может быть под Вашу задачу больше подойдёт более медленный однократный сбор данных: Borland C++ 5.02\AdcSample или Borland C++ 5.02\AdcKadr.

Добрый день, попробовали эти программы, проблема решилась частично, AdcKadr, почему то не считывает и во все, числа со всех каналов, просто уходят в отрицательное значение и все, а вот  AdcSample работает, но правда считывается только один канал, на второй он не реагирует хотя LGraph все видит и нормально анализирует, подключаем прям в соседний, предполагаю что ошибка кроется где то здесь, но не как могу понять:

while(!kbhit())
	{
		if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (0x0 << 4) | (InputRangeIndex << 6)))) { printf("\n\n  ADC_SAMPLE(, 0) --> Bad\n");	break; }
		else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (0x1 << 4) | (InputRangeIndex << 6)))) { printf("\n\n  ADC_SAMPLE(, 1) --> Bad\n");	break; }

		printf(" AdcSample Data (ADC code):     %5d     %5d\r", AdcSample1, AdcSample2);
	}

#5 Re: Техническая поддержка » Простой опрос портов » 14.03.2021 18:38:27

Ну канал куда поступают данные на АЦП, а с него на компьютер, на примере как это выводит LGraph, только там выдается график,  а нам просто бы числовые значения считать, прошу прощения если не понятно, я бы мог прислать схему подключения и фото в реале, только не понял как у вас на форуме выкладывать картинки. По сути мне нужно то что у вас в одном из примере ReadData:

/ Поток, в котором осуществляется сбор данных
//------------------------------------------------------------------------
DWORD WINAPI ServiceReadThread(PVOID /*Context*/)
{
	WORD i;
	WORD RequestNumber;
	DWORD FileBytesWritten;
	// массив OVERLAPPED структур из двух элементов
	OVERLAPPED ReadOv[2];
	// массив структур с параметрами запроса на ввод/вывод данных
	IO_REQUEST_LUSBAPI IoReq[2];

	// остановим работу АЦП и одновременно сбросим USB-канал чтения данных
	if (!pModule->STOP_ADC()) { ReadThreadErrorNumber = 0x1; IsReadThreadComplete = true; return 0x0; }

	// формируем необходимые для сбора данных структуры
	for (i = 0x0; i < 0x2; i++)
	{
		// инициализация структуры типа OVERLAPPED
		ZeroMemory(&ReadOv[i], sizeof(OVERLAPPED));
		// создаём событие для асинхронного запроса
		ReadOv[i].hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
		// формируем структуру IoReq
		IoReq[i].Buffer = ReadBuffer + i * DataStep;
		IoReq[i].NumberOfWordsToPass = DataStep;
		IoReq[i].NumberOfWordsPassed = 0x0;
		IoReq[i].Overlapped = &ReadOv[i];
		IoReq[i].TimeOut = (DWORD)(DataStep / ap.AdcRate + 1000);
	}

	// делаем предварительный запрос на ввод данных
	RequestNumber = 0x0;
	if (!pModule->ReadData(&IoReq[RequestNumber])) { CloseHandle(ReadOv[0].hEvent); CloseHandle(ReadOv[1].hEvent); ReadThreadErrorNumber = 0x2; IsReadThreadComplete = true; return 0x0; }

	// запустим АЦП
	if (pModule->START_ADC())
	{
		// цикл сбора данных
		for (i = 0x1; i < NDataBlock; i++)
		{
			// сделаем запрос на очередную порцию данных
			RequestNumber ^= 0x1;
			if (!pModule->ReadData(&IoReq[RequestNumber])) { ReadThreadErrorNumber = 0x2; break; }
			if (ReadThreadErrorNumber) break;

			// ждём завершения операции сбора предыдущей порции данных
			if (!WaitingForRequestCompleted(IoReq[RequestNumber ^ 0x1].Overlapped)) break;
			//			if(WaitForSingleObject(ReadOv[RequestNumber^0x1].hEvent, IoReq[RequestNumber^0x1].TimeOut) == WAIT_TIMEOUT) { ReadThreadErrorNumber = 0x3; break; }
			if (ReadThreadErrorNumber) break;

			// запишем полученную порцию данных в файл
			if (!WriteFile(hFile,													// handle to file to write to
				IoReq[RequestNumber ^ 0x1].Buffer,					// pointer to data to write to file
				2 * DataStep,	 											// number of bytes to write
				&FileBytesWritten,									// pointer to number of bytes written
				NULL			  											// pointer to structure needed for overlapped I/O
			)) {
				ReadThreadErrorNumber = 0x4; break;
			}

			if (ReadThreadErrorNumber) break;
			else if (_kbhit()) { ReadThreadErrorNumber = 0x5; break; }
			else Sleep(20);
			Counter++;
		}

		// последняя порция данных
		if (!ReadThreadErrorNumber)
		{
			RequestNumber ^= 0x1;
			// ждём окончания операции сбора последней порции данных
			if (!WaitingForRequestCompleted(IoReq[RequestNumber ^ 0x1].Overlapped)) ReadThreadErrorNumber = 0x3;
			//			if(WaitForSingleObject(ReadOv[RequestNumber^0x1].hEvent, IoReq[RequestNumber^0x1].TimeOut) == WAIT_TIMEOUT) ReadThreadErrorNumber = 0x3;
						// запишем последнюю порцию данных в файл
			if (!WriteFile(hFile,													// handle to file to write to
				IoReq[RequestNumber ^ 0x1].Buffer,					// pointer to data to write to file
				2 * DataStep,	 											// number of bytes to write
				&FileBytesWritten,									// pointer to number of bytes written
				NULL			  											// pointer to structure needed for overlapped I/O
			)) ReadThreadErrorNumber = 0x4;
			Counter++;
		}
	}
	else { ReadThreadErrorNumber = 0x6; }

	// остановим работу АЦП
	if (!pModule->STOP_ADC()) ReadThreadErrorNumber = 0x1;
	// прервём возможно незавершённый асинхронный запрос на приём данных
	if (!CancelIo(ModuleHandle)) { ReadThreadErrorNumber = 0x7; }
	// освободим все идентификаторы событий
	for (i = 0x0; i < 0x2; i++) CloseHandle(ReadOv[i].hEvent);
	// небольшая задержка
	Sleep(100);
	// установим флажок завершения работы потока сбора данных
	IsReadThreadComplete = true;
	// теперь можно спокойно выходить из потока
	return 0x0;
}

Только вместо вывода в файл в функцию printf в числовом виде.

#6 Техническая поддержка » Простой опрос портов » 12.03.2021 16:28:12

Efim91
Ответов: 6

Добрый день,   сейчас в организации разбираемся с модулем E14-140M, хотим написать свою программу на C++, вроде все понятно, и драйвер и примеры все работают, но т.к. опыта с вашем устройством нет, хотелось бы уточнить, нет ли простого примера программы, которая просто бы опрашивала 1(или какой-нибудь еще порт), и выводила на экран числа, нам пока хватило бы, для дальнейшей работы. Из документации например скелет программы заработал, но вот нормально считать порт не получается. Спасибо.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск