Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.01.2010, 13:22
AntoNechayuk AntoNechayuk вне форума
Новичок
 
Регистрация: 23.11.2009
Сообщения: 58
Репутация: 10
Вопрос функция скорости изменения величины

По таймеру опрашиваю значения от датчика давления. Значения постоянно меняются. Мне необходимо сделать индикатор скорости изменения значений от времени. Вроде просто, но пока не получилось.... значение скорости должно постоянно обновляться минимум 2 раза в секунду

Помогите корректно написать функцию, которая выводит скорость изменения значений от времени (н-р в моем случае Н/сек)
Ответить с цитированием
  #2  
Старый 28.01.2010, 15:10
riaman riaman вне форума
Прохожий
 
Регистрация: 28.01.2010
Сообщения: 4
Репутация: 10
По умолчанию

Вообще то не совсем понятно, где именно у тебя трудности. Приведу два несколько методов.
1. Тут можно считать "мгновенную" скорость изменения Vm, то есть изменение давления за шаг таймера (в конкретном случае за 2 сек.): Vm=delta_p/(Timer.Interval/1000) Па/сек.
2. А можно считать среднюю скорость Vs за какой-либо интервал времени. К примеру за 60 сек.: Vs=(p_60-p_0)/60. Но тут надо единственное сделать, так, чтоб данная операция выполнялась раз в 60 сек. Это надо в таймере поставить код наподобие этого:
inc(n);
if n=60/(Timer.Interval/1000) then begin
Vs=(p_60-p_0)/60;
n:=0;
end;

если шаг таймера равен 2 сек, то n=60/(Timer.Interval/1000) равносильно n=60/2=15.
Но этот метод не корректный, так как эта средняя скорость будет "кусочная" (дискретная) по 60 секунд, что не очень хорошо. Далее я предложу метод, который лучше данного.
3. Если же тебе надо найти среднюю скорось с момента начала работы, то тут можно пойти двумя путями:
1) запомнить значение давления в начале работы программы, а в таймере поставить код наподобие этого:
t:=t+(Timer.Interval/1000);
Vs=(p-p_0)/t;

2) считать в таймере среднее значение "мгновенной" скорости Vm (Vm см. выше):
inc(n);
Vs=Vm/n;

но этот метод тоже не очень хорошый, так как теоретически может наступить переполнение n и t(обнуление). Хотя может даже при типе Integer программе надо будет работать год без остановки)))
4. Поэтому предлогаю на самый интересный на мой взгляд вариант, решаюший проблему вычисления средней скорости за период. Каждый шаг таймера, надо сохраняешь новое значение давления в последний эллемент массива. Размер массива RM берешь исходя из периода T (в сек), за который который считаешь скорость и интервала таймера: RM=T/(Timer.Interval/1000). Предварительно надо выкинуть устаревшее значение, путем сдвига всех эллементов массива в лево (пример сдвига и записи нового значения в массив: до сдвига-1,2,3,4,5,6 после-2,3,4,5,6,0 после записи нового значения-2,3,4,5,6,7). Теперь считаешь разницу между последним и первым элементом массива и делешь на T. Описанная процедура делается каждый шаг таймера. Следует отметить не большой геммор при старте программы, так как элементы массива ещё не будут заполены. Но это можно решить тупо - подождать заполнения массива и не считать скорость, пока все элементы не заполнятся. Или же подумать и вначале считать скорость немного подругому. Этот метод может занимать много памяти из-зи хранения массива, а так же сдвиг элементов может занять определённое кол-во времени. Поэтому я думаю надо ставить шаг таймера 1 секунду, чтоб подстраховаться на затраты времени на вычисления (сдвиг и др.) и на вывод результатов. Пусть он при этом с тормозами выдаёт значение 1 раз в 1,5 сек, чем 1 раз в 2,5. Ну там походу подбирать надо. (В этом методе так же можно сохранять не давление, а мгновенные скорости и считать от них среднее Сумма(Vm)/MR . Но я не знаю, равносильны ли данные способы, захочешь, можешь проверить. Хотя я бы предпочёл сохранять значения давления, это точно правильно.)
Тут было бы не плохо добавить графики средней и мгновенной скорости. Если надо будет, я тебе могу помочь с графиками. Это реализует стандартный компонент дельфи. (Кстати, тогда в компоненте графиков можно хранить значения давления, а не массиве. Хотя это те же самые массивы))).
Ответить с цитированием
  #3  
Старый 28.01.2010, 15:39
AntoNechayuk AntoNechayuk вне форума
Новичок
 
Регистрация: 23.11.2009
Сообщения: 58
Репутация: 10
По умолчанию

Спасибо. график точно будет (Усилие/время), можно еще (усилие/скорость)...

Но 1:
период не 1 раз в 2сек, а наоборот т.е. Т=1/2 сек. (это максимум... можно и быстрее, главное чтобы точно)

2:
по мгновенной формуле
Цитата:
Vm=delta_p/(Timer.Interval/1000) Па/сек.
я не совсем понял что такое delta_p...

сейчас пробую массив.....
Ответить с цитированием
  #4  
Старый 28.01.2010, 16:28
riaman riaman вне форума
Прохожий
 
Регистрация: 28.01.2010
Сообщения: 4
Репутация: 10
По умолчанию

delta_p - это дельта P. Изменение давления p2-p1, где p2 - это давление в текущий момент времени, p1 - в предыдущий.
Насчёт опроса, мне кажется слишком часто. У меня есть идея, как можно посчитать, сколько программа тратит время на вычисления. Давай спишемся в аське или по майлу. Я тебе ща личное сообщение напишу на этом сайте, посмотри. Токо я в аську выйду через часа два. Мне интересна твоя задача. Кстати давление измеряется в Паскалях, а не в ньютонах. P=F_дав/S
Ответить с цитированием
  #5  
Старый 28.01.2010, 16:31
AntoNechayuk AntoNechayuk вне форума
Новичок
 
Регистрация: 23.11.2009
Сообщения: 58
Репутация: 10
По умолчанию

Цитата:
Кстати давление измеряется в Паскалях

мне нет разницы в чем... выводить буду в Н/см2.... хотя в итоге программа будет конвертировать его и в psi, ksi и т.п.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter