Я ничего не ставил. Имею то что досталось
Вид для печати
Вы можете настроить расходомер на 1л/импульс?
Как куда, в смысле, вес импульса(литров/имп) в числитель, время цикла программы(мс) в знаменатель!
Вложение 82090
Чтобы самому сделать надо иметь знания(примерно за 4 класс школы по математике), но если их нет, возьмите готовый проект, я же много раз выкладывал и вам уже и ссылки надавали, даже понять невозможно, в чём проблема, просто взять готовое, вот ещё раз выложу, а то по ссылке ещё не умеете ходить.
Вложение 82092
Вложение 82091
Если Вы хотите измерять расход в кубометрах в час, тогда вместо константы "60000" поставьте константу "3600", всё!
Можно это сделать(менять константы) в виде выбора единицы измерения расхода!
Метод подсчета импульсов на время - плохая идея.
При минимальном периоде 30 сек за 600 сек (10м) проскочит 20 импульсов * 100 л * 6 (периодов пл 10 мин) = 12м3/ч
При максимальном периоде 40 сек за 600 сек проскочит 15 импульсов * 100л * 6 = 9м3/ч
Т.е. дискретность получается (12 - 9)/(20 - 15) = 0,6 м3/ч (т.е. всего 5 возможных значений в этом диапазоне!!!)
Т.к. у Вас ПР200 предлагаю использовать макрос на ST:
Который вычисляет частоту следования импульсов измеряя период между ними.Код:function_block freq
var_input
i : bool;
end_var
var_output
Q : real; // Частота следавния импульсов
end_var
var
rt : SYS.RTRIG;
newTS, oldTS : udint;
end_var
rt(I:=i);
if rt.Q then // На каждом фронте
newTS := time_to_udint(get_time()); // Фиксируем системный таймер
Q := udint_to_real(newTS - oldTS); // Фиксируем период между импульсами
Q := 1000 / Q; oldTS := newTS; // Вычисляем частоту
end_if
end_function_block
Эту частоту Вы потом умножите на вес (0.1м3 * 3600 сек = 360 м3/ч) импульса и получите расход,
который будет вычисляться каждые 30 - 40 сек.
А если сделать 1л\импульс, то каждые 0.3 сек - это будет адекватно для глаз!!!
Вложение 82227
Вот что у меня получилось.
Разобрался я с горем пополам, со счетчиками, импульсам, циклами и.т.д. Главное работает.
Одно, мне не понятно, почему всегда изменчиво время цикла в пр200. вчера посмотрел, 8мс, сегодня утром 7мс, а сейчас уже 3, Завтра запилю в прибор. данными и наблюдениями поделюсь.
А как Вы определяете время цикла без заливки проекта в прибор?
Короче, надо залить проект в прибор и тогда посмотреть время цикла в меню прибора или в ОЛ, мне так кажется!
И время цикла не должно меняться, время цикла программы используется в формуле для подсчёта расхода, иначе будет неверно рассчитывать и в менеджере компонентов, мне кажется, был макрос определения времени цикла ПР!
И, зачем вес импульса на аналоговый вход заводить, сделайте энергонезависимую переменную и выведите на экран для редактирования.
Сумматор в знаменателе можно убрать, сделав "1" началом диапазона счётчика, я так в последнем варианте проекта сделал. Настройки макроса счётчика находятся в его свойствах.
И ещё, чуть не забыл, для вывода из ПР расхода через аналоговый выход сигнал(диапазон) надо привести к 0-1 и уже затем подать на аналоговый выход из программы!
Макрос преобразования диапазонов также имеется в менеджере компонентов!
У меня уже залитый, только время цикла посмотрел в программе вписал константу 8мс. А она имеет свойство меняться. из-за этого расход не верный. чтоб б не быть голословным, я расход сначала проверил тепловычислителем. расход стабильный, со скважины как иначе то. Короче расход составлял 10,35-10,5 м3/час. А на пр200 расход, конечно большую часть времени стабильный 10,4. Но может упасть до 9 или подняться до 12. Поэтому решил что надо через циклтайм делать
В этом то и проблема, что время цикла меняется. Вес импульса сделан в переменную для редакции только с экрана, ну либо с программы как по умолчанию. и немного не понял про сумматор "1" что вы понимаете под началом диапазона счетчика? А я не выводил расход на аналоговый выход.
Тогда плохо, в смысле, ранее представители Овена заверяли, что время цикла программы стабильно, не знаю, может их планы поменялись, в смысле, решили взять свои слова взад?!
А насколько важно привязываться именно к циклу ПРки? Можно же просто сделать тики через каждые 50 мс или 100 мс
Здравствуйте! Подскажите, а с чем может быть связана небольшая неточность в вычислении расхода?
Причем первые несколько импульсов считает правильно
Вложение 85494
Думаю, проблема в погрешности расчета времени цикла.
Попробуйте время цикла посчитать так
Код:function_block TimeCycle
var_input
none : bool;
end_var
var_output
Q : udint;
end_var
var
init : bool;
t1, t2 : udint;
end_var
t1 := time_to_udint(get_time());
if init then
Q := t1 - t2;
else
init := true;
end_if
t2 := t1;
end_function_block
Проще сразу на ST мгновенный расход вычислять, время цикла не нужно вообще
Простейший вариант
Более продвинутый вариант - с учетом параметра расходомера Qмин (Минимальный расход) см.нижеКод:function_block RASHOD_lite (* (с) PeterA для форума ОВЕН *)
var_input
TIC: BOOL; (*импульс счетчика*)
Cimp: REAL; (*Вес импульса, л*)
end_var
var_output
Q: REAL; (*мгновенный расход мкуб/час*)
end_var
var
M: BOOL;
period: TIME;
start: TIME;
end_var
IF TIC AND NOT M THEN
period:= GET_TIME() - start;
start:= GET_TIME();
END_IF
M:= TIC;
Q:= 3600/udint_to_real(time_to_udint(period)) * Cimp;
end_function_block
https://owen.ru/forum/showthread.php...l=1#post470767
Вложение 85498
Более продвинутый вариант не работает Вложение 85499
Спасибо,
Достаточно было опрометчиво переместить одну строчку, в начало IF и всё...
Правильный код
Код:function_block RASHOD_Ex (* (с) PeterA для форума ОВЕН *)
var_input
TIC: BOOL; (*импульс счетчика*)
Cimp: REAL; (*Вес импульса, л*)
Qmin: REAL; (*Минимальный расход м.куб/час*)
end_var
var_output
Q: REAL; (*мгновенный расход мкуб/час*)
overflow: BOOL; (*Нет расхода (период импульсов больше максимального)*)
end_var
var
M: BOOL;
period: TIME;
start: TIME;
INIT: BOOL; (*пришел первый, начальный импульс, последовательности*)
cur_TIME: TIME; (*текущее время*)
period2: TIME; (*сколько прошло времени от фронта импульса*)
end_var
cur_TIME:= GET_TIME();
IF TIC AND NOT M THEN (*если фронт импульса*)
(* Было тут period2:=cur_TIME- start; *)
IF NOT INIT THEN (*если зто первый импульс*)
INIT:= TRUE; (*начинаем подсчет времени до фронта следующего импульса*)
Q:= 0; (* а пока расход = 0*)
ELSE (*если не первый импульс, то*)
period:= cur_TIME - start; (*время между импульсами*)
Q:= 3600/udint_to_real(time_to_udint(period)) * Cimp; (*мгновенный расход*)
overflow:= FALSE; (*переполнения по времени между импульсами нет*)
END_IF
start:= cur_TIME; (*фиксация времени прихода фронта импульса*)
END_IF
M:= TIC; (*пришел фронт импульса*)
period2:=cur_TIME- start; (*сколько прошло времени от фронта последнего импульса*)
IF period2 >= udint_to_time(real_to_udint(3600 * Cimp / Qmin)) THEN (*если от фронта последнего импульса прошло время больше допустимого по Qmin*)
Q:=0; (*значит нет расхода*)
INIT:= FALSE; (*следующий импульс будет первым*)
overflow:= TRUE; (*флаг переполнения по времени между импульсами*)
END_IF
end_function_block