Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2009, 19:05   #1
Keysiano
Новичок
Джуниор
 
Регистрация: 07.12.2008
Сообщений: 1
По умолчанию Delphi. тестирование ЦАП

Здравствуйте!
Такая проблема:
Есть программа тестирования 8-ми канального цап через ком порт. Нужно приделать к ней средство диагностики.
К порту com1 подключен 8ми канальный цап. Нужно опрашивать порт, и из полученных данных строить бегущий график. По оси абсцисс время, по У будут отображатсья точки. (получаемые данные) Нужно что бы программа все время принимала данные, и строила их в виде кривой. Время отсчета привязать к моменту нажатия кнопки и отображать в секундах.
1)
какой функцией лучше опрашивать com порт?
2)
Мне подсказали, что график лучше всего будет реализовать через компонент DecisionGraph, так ли это, и нет ли примеров на эту тему?

сама программа (просто проверяет цап на наличие ошибок обмена, нужно к ней прикрутить указанные выше функции)

Код:
unit test;
var
  Form1: TForm1;
  FHandle:THandle;      // Указатель последовательного порта
  DCB:TDCB;             // Структура для установок Параметров последовательного порта
  Stat:COMSTAT;         // Текущее состояние порта
  Bytes1, Errors:dWord; // Ошибки последовательного порта
  Bytes:array [1..8] of byte;
  flag:Boolean;         // Флаг ошибок обмена

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
   i:integer;
   Perfomance_count:int64;
   Perfomance_count1:int64;
   maschtab:int64;
   DateTime:TDateTime;
   i1,i2,i3:integer;
begin
   flag:=False; // ошибок пока нет ))

   //Первой в данном куске будет инициализация последовательного порта на компе
   CloseHandle(FHandle);
   // Описание последовательного порта
   if Com11.Checked=True then FHandle:=CreateFile('COM1', GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
   if Com21.Checked=True then FHandle:=CreateFile('COM2', GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
   SetupCOMM(FHandle,1024,1024);
   // Выборка скорости
   i3:=115200;
   if N384001.Checked=True then i3:=38400;
   with DCB do
   begin
      BaudRate:=i3;
      ByteSize:=8;
      Parity:=EVENPARITY;
      StopBits:=TWOSTOPBITS;
   end;
   SetCOMMState(FHandle,DCB);

   // Очистка входного буфера и сброс счетчика ошибок последовательного порта
   ClearCOMMBreak(FHandle);
   ClearCommError(FHandle,Errors,@Stat);

   // считываем данные из порта. Количество - 200 байт 

   // Завершена инициализация последовательного порта
   // Теперь осуществляем определение режима работы таймера
   // для тестирования каналов. А также определяем и необходимое
   // количество изменений данных.
   // Собственно инициализация переменных для работы таймера
   // Сперва выставляем масштаб для определения времени пересылки данных
   // и сразу по нему выверим время в периоде 10 милисекунд

   DateTime:=Now;
   i:=0;
   while(i=0) do i:= MilliSecondsBetween(DateTime, Now);
   QueryPerformanceCounter(Perfomance_count);
   DateTime:=Now;
   i:=0;
   while(i=0) do i:= MilliSecondsBetween(DateTime, Now);
   QueryPerformanceCounter(Perfomance_count1);
   maschtab:=(Perfomance_count1-Perfomance_count) div int64(i);

   // Формируем теперь все посылки.
   // От одного канала до восьми

   for i:=1 to strtoint(edit1.text) do
   begin
      // Если у нас меньше посылок, чем надо, то остальные посылать не будем
      // Так что пока будем формировать только те каналы, что требуются
      QueryPerformanceCounter(Perfomance_count);
      for i1:=1 to 8 do
      begin
         for i2:=0 to 255 do
         begin
            for i3:=i downto 1 do
            begin
               Bytes[i3]:=i2;
            end;
            while(Perfomance_count1-Perfomance_count<maschtab*int64(Strtoint(edit2.text)))
            do QueryPerformanceCounter(Perfomance_count1);
            Perfomance_count:=Perfomance_count1;
            WriteFile(FHandle,Bytes,i,Bytes1,nil);
            Readfile(FHandle, Bytes, 1, Bytes1,nil);
            if(Bytes[1]<>i2) then flag:=True;
         end;
      end;
   end;

   if(flag=True) then Button3.Caption:='Ошибка обмена';
   if(flag=False) then Button3.Caption:='Ошибки отсутствуют';


end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   Close();
end;

procedure TForm1.N1152001Click(Sender: TObject);
begin
   N1152001.Checked:=True;
   N384001.Checked:=False;
end;


procedure TForm1.N384001Click(Sender: TObject);
begin
   N384001.Checked:=True;
   N1152001.Checked:=False;

end;

procedure TForm1.Com11Click(Sender: TObject);
begin
   Com11.Checked:=True;
   Com21.Checked:=False;
end;

procedure TForm1.Com21Click(Sender: TObject);
begin
   Com21.Checked:=True;
   Com11.Checked:=False;
end;

end;

end.
Вложения
Тип файла: zip tsap-nk-test.zip (302.7 Кб, 14 просмотров)
Keysiano вне форума Ответить с цитированием
Старый 05.10.2009, 22:33   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

а вы не попутали ЦАП и АЦП?

...так как вы пишете что к ком-порту прикручен ЦАП, то что вы там собрались считывать или у вас ком-порт уже и аналоговый сигнал меряет?

я это к тому, что ЦАП -обычно формирует аналоговый по коду, а АЦП преобразует аналоговый в цифру

так. теперь по вашим вопросам...
Цитата:
1) какой функцией лучше опрашивать com порт?
- readfile
- и еще момент, у вас низкоскоростной АЦП ? соm-порт поспеет?

Цитата:
2)Мне подсказали, что график лучше всего будет реализовать через компонент DecisionGraph, так ли это, и нет ли примеров на эту тему?
- для начала можно и стандартным Tchart обойтись... при правильном оформлении он даст фору многим спецпакетам...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ взаимодействие с АЦП/ЦАП и разработка сетевых приложений iukash Свободное общение 4 14.08.2009 18:02
Работа в локальной сети, взаимодействие с АЦП/ЦАП. iukash Общие вопросы C/C++ 0 12.08.2009 11:51
Тестирование сайта janchik1988 JavaScript, Ajax 1 26.06.2009 11:38
Небольшое тестирование merax Софт 3 17.08.2008 19:11