![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте господа!
Прошу вашего совета по следующей проблеме. Имеется измерительное оборудование, подключенное к ПК через com порт, есть функции обращения к нему (с Delphi). Необходимо написать программку-самописец, которая будет показывать изменения параметров во времени, причем скорость опроса должна быть не менее 30 опросов в секунду. Я пробовал писать через таймер (выглядит все примерно так procedure TForm1.Timer1Timer(Sender: TObject); begin //Функция опроса //Рисование графика end; , но он мерял промежутки времени достаточно не точно, причем при значении interval<50 срабатывал не более 18-20 раз в секунду. Пробовал через мультимедийный таймер, там часто вылетала ошибка доступа к памяти. Пробовал через бесконечный цикл с sleep в конце, так же более 20 опросов в сек получить не удалось((( Каким еще образом можно решить эту задачу???? Последний раз редактировалось serega8623, 19.03.2011 в 17:52. |
#2
|
||||
|
||||
![]() Может порт тормозит?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
|||
|
|||
![]() Что за измерительный прибор? Желательно его название и модель.
Замерьте, сколько по времени отрабатывает одно измерение используя функцию GetTickCount. Какие настройки COM порта использует измерительный прибор, к примеру, если скорость обмена будет 1200 бит/сек, то 30 запросов в секунду вы не сделаете, для этого если имеется такая функция у прибора, ставить его на постоянную отдачу данных, и постоянно слушать порт и выводить результаты, но это зависит от прибора и от модели. |
#4
|
|||
|
|||
![]() Стоит контроллер I-8811 в нем модуль I-8017-16 аналоговых каналов. Скорость порта 115200.
Вот код опроса: Код:
if bComOpen then // Reopen Com port begin Close_Com(gcPort); bComOpen := False; end; if Not bComOpen then OpenCom; if Not bComOpen then exit; gw7000[0] := Word(gcPort); // COM Port gw7000[1] := StrToInt('$' + Address.Text); // Module Address // gw7000[2] := 65536; // Module ID gw7000[2] := StrToInt('$' + TypeComboBox.Text ); // Module ID If RadioButton1.Checked Then gw7000[3] := 1 // CheckSum Enable Else gw7000[3] := 0; gw7000[4] := 10; // TimeOut = 0.01 second gw7000[5] := 0; gw7000[6] := 1; // string debug gw7000[7] := StrToInt(Edit3.Text ); // Module ID wRet := AnalogIn_8K(@gw7000[0], @gf7000[0], gszSend, gszReceive); If wRet <> 0 Then Begin Beep; Application.MessageBox( PChar('The Error Code:' + IntToStr(wRet) + #13 + IGetErrorString(wRet)) , 'AnalogIn() error !!! ' , mb_IconExclamation ); Close_Com (gcPort); end; If gw7000[6] = 1 Then Begin Edit1.Text := gszSend; Edit2.Text := gszReceive; End; Beep; Функция возвращает значения в gszReceive в формате >+00.000+00.000+00.000...+00.000 так 16 каналов. Последний раз редактировалось Admin, 20.03.2011 в 16:53. |
#5
|
|||
|
|||
![]() Время одного опроса я измеряю и позже напишу.
|