|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
функция скорости изменения величины
По таймеру опрашиваю значения от датчика давления. Значения постоянно меняются. Мне необходимо сделать индикатор скорости изменения значений от времени. Вроде просто, но пока не получилось.... значение скорости должно постоянно обновляться минимум 2 раза в секунду
Помогите корректно написать функцию, которая выводит скорость изменения значений от времени (н-р в моем случае Н/сек) |
#2
|
|||
|
|||
Вообще то не совсем понятно, где именно у тебя трудности. Приведу два несколько методов.
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
|
|||
|
|||
Спасибо. график точно будет (Усилие/время), можно еще (усилие/скорость)...
Но 1: период не 1 раз в 2сек, а наоборот т.е. Т=1/2 сек. (это максимум... можно и быстрее, главное чтобы точно) 2: по мгновенной формуле Цитата:
сейчас пробую массив..... |
#4
|
|||
|
|||
delta_p - это дельта P. Изменение давления p2-p1, где p2 - это давление в текущий момент времени, p1 - в предыдущий.
Насчёт опроса, мне кажется слишком часто. У меня есть идея, как можно посчитать, сколько программа тратит время на вычисления. Давай спишемся в аське или по майлу. Я тебе ща личное сообщение напишу на этом сайте, посмотри. Токо я в аську выйду через часа два. Мне интересна твоя задача. Кстати давление измеряется в Паскалях, а не в ньютонах. P=F_дав/S |
#5
|
|||
|
|||
Цитата:
мне нет разницы в чем... выводить буду в Н/см2.... хотя в итоге программа будет конвертировать его и в psi, ksi и т.п. |