Форум: Техническая поддержка

Тема: Простой опрос портов

Вы не вошли.

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

12.03.2021 16:28:12
#1

Участник
Здесь с 12.03.2021
Сообщений: 6

Простой опрос портов

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

12.03.2021 18:15:14
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,446

Re: Простой опрос портов

А что конкретно Вы подразумеваете под портом?

14.03.2021 18:38:27
#3

Участник
Здесь с 12.03.2021
Сообщений: 6

Re: Простой опрос портов

Ну канал куда поступают данные на АЦП, а с него на компьютер, на примере как это выводит 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 в числовом виде.

15.03.2021 12:02:07
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,446

Re: Простой опрос портов

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

15.04.2021 14:47:38
#5

Участник
Здесь с 12.03.2021
Сообщений: 6

Re: Простой опрос портов

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

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);
	}
24.08.2022 18:19:06
#6

Участник
Здесь с 24.08.2022
Сообщений: 1

Re: Простой опрос портов

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

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);
	}

Разобрались в итоге с этим вопросом? Столкнулся с такой же проблемой.

25.08.2022 16:30:27
#7

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,446

Re: Простой опрос портов

А можно немного поконкретней описать именно Вашу проблему?

Контакты

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

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

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

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

L-CARD в проектах