Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

E-154 вывод данных на форму

Вы не вошли.

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

Alena
14.02.2017 13:22:42
#1

Гость

E-154 вывод данных на форму

Организуется потоковый вывод данных с E-154 в Memo, c++.
через таймер. Как только запускаю приложение,оно вылетает. 2 канала опрашивается
подскажите в чем проблема, может, поток неправильно организован?

Инициализация потока в отдельной файле InichialTread.cpp

void __fastcall TInichialTread::Execute()
{   int i;
	WORD Canal;
	Canal = 0x0;

	Synchronize(InitThread);

	Form3->Label1->Caption = "Модуль запущен";

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

		while(!Terminated && !ThreadError)
		{
		// делаем предварительный запрос на ввод данных
		if(!pModule->ReadData(&IoReq[Canal]))
			{ Mes = "Не могу послать запрос на сбор данных с модуля!";
			Synchronize(ShowErrorMessageBox);
			}

		if(!pModule->START_ADC())
			{ Mes = "Не могу стартануть сбор данных!";
			Synchronize(ShowErrorMessageBox);
			}

		for(i = 0x1; i < NDataBlock; i++)
			{
			Canal ^= 0x1;

			if(!pModule->ReadData(&IoReq[Canal]))
				{ Mes = "Не могу прочитать данные с 1 канла!";
				Synchronize(ShowErrorMessageBox);
				}
			if(!WaitingForIoRequestCompleted(&IoReq[Canal]))
				{ Mes = "Не могу прочитать данные с 2 канла!";
				Synchronize(ShowErrorMessageBox);
				}
			Sleep(20);
		}

			Canal ^= 0x1;

		if(!WaitingForIoRequestCompleted(&IoReq[Canal]))
				{ Mes = "Не могу прочитать данные с 2 канла!";
				Synchronize(ShowErrorMessageBox);
				}

		if(!pModule->STOP_ADC())
				{ Mes = "Не могу завершить сбор данных!";
				Synchronize(ShowErrorMessageBox);
				}
		Synchronize(RedrawViewer);

		Sleep(100);
	}
	if(!pModule->STOP_ADC())
		{ Mes = "Не могу завершить сбор данных!";
		Synchronize(ShowErrorMessageBox);
		}
	// прервём все асинхронные запросы
	if(!CancelIo(ModuleHandle))
		{ Mes = "Не могу прервать асинхронный сбор!";
		Synchronize(ShowErrorMessageBox);
		}
	// освободим используемые ресурсы
	FreeResource();
	// ждём-с
	while(!Terminated) { Sleep(50); }
	}

это вывод :

void __fastcall TInichialTread::RedrawViewer(void)
{
	DWORD i;

		for (i=0;i<PointsToRead;i++)
			{
			Form3->Memo1->Lines->Add(String().sprintf(L"%d ",(int)IoReq[Canal].Buffer[i]));
			}
			Sleep(20);
		}

Это в таймере. Таймер в другом файле реализуется TSmain.cpp. они друг в друга вложены.

void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
		DWORD FifoOverflowFlag, FifoSize, MaxFifoBytesUsed;
		double FifoMaxPercentLoad;

	Label2->Caption = Now().TimeString();

	if (!pModule->FIFO_STATUS(&FifoOverflowFlag, &FifoMaxPercentLoad, &FifoSize, &MaxFifoBytesUsed))
		{
		Memo2->Lines->Add(L" Fifo NO");
		}
   //	else
	   //	{
	   //	if (FifoOverflowFlag == 1)
		 //	{
		  //	Memo2->Lines->Add(L" FifoOverflowFlag Error");
		   //	//if(Buffer) { delete[] Buffer; Buffer = NULL; }
		   //	return;
		   //	}
		else
		{
		StartThread();
		}
	}

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

15.02.2017 19:26:57
#2

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

Re: E-154 вывод данных на форму

1. Опишите вкратце желаемый алгоритм сбора данных.
2. Засылайте весь проект приложения. Будем посмотреть.

Alena
20.02.2017 16:06:22
#3

Гость

Re: E-154 вывод данных на форму

https://yadi.sk/d/L509QN4H3EJHZG

вот архив приложения.
преобразование pModule->ProcessArray проходит успешно,мне кажется.

нажатием второй кнопки запускается классический поток на опрос 2 каналов :
поток в файле Unit3.cpp,
проверьте его,пожалуйста.

Alena
20.02.2017 16:13:48
#4

Гость

Re: E-154 вывод данных на форму

Алгоритм : сначала нам нужно построить ВАХ - это отдельная задача, для этого используем функцию ProcessArray которая нам в вольты преобразует данные с первых двух каналов  и с помощью функции рисуем график.
то все в первом таймере .

потом , если нам нужно просто снять данные с каналов АЦП мы запускаем поток сбора данных:как раз вот этот файл Unit3.cpp. на форме второй кнопкой запускается поток. Двойная буферизация вроде правильно организована,правильно ни я опрашиваю каналы? Хочу потом сделать,чтобы с каждого канала если нужно выводились соответствующие ,поступившие данные в мемо .
Это такой функцией делается?

Form3->Memo1->Lines->Add(String().sprintf(L"%4.2d ",(int)IoReq[Canal^0x1].Buffer[i]));

Контакты

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

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

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

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