Цитата Сообщение от Вольд Посмотреть сообщение
Чего ты сказки рассказываешь ? У тебя написано, что цена одного импульса - 1 литр/импульс. Это с какой частотой должен щелкать геркон, чтобы за 10 сек. набралось 360 литров ? Получается 36 раз в секунду. Бред какой-то.
Уважаемый, вы не поняли суть проблемы.
360 литров за час при 3 литрах за 30 секунд, А ШАГ БУДЕТ В 120 ЛИТРОВ, тоесть при 4 литрах за 30 секунд = 480 литров в час. Так, на пальцах понятно?

Цитата Сообщение от Вольд Посмотреть сообщение
Дело плевое. Запусти любой таймер. например TON (у таймера есть выход ET, на который выводится прошедшее время в мс, уставку таймера PT сделай несколько часов, чтобы таймер долго не срабатывал) и считай сколько времени прошло между соседними импульсами, далее делай пересчет в литр/час. Если цикл программы будет, например 2 мс, то погрешность измерения временных интервалов не будет превышать это значение (2 мс).
Да, я упоминал об этом и хотел бы не использовать таким образом, т.к. считаю это костылем, но за ответ спасибо.

Цитата Сообщение от Василий Кашуба Посмотреть сообщение
Какой вам ещё ФБ нужен? Я же вам сказал, на счётчик подавайте частоту, хотя бы 100 герц и сбрасывайте показания счётчика импульсами с водомера, а перед сбросом записывайте показания счётчика в буфер и потом уже с этими показаниями выполняйте любые математические операции.
И я же вам написал, что может есть готовые блоки? Считаю это тоже костылем.

Цитата Сообщение от melky Посмотреть сообщение
Почему бы не считать кубометры ? и потом обрабатывать время....
пока отсчитаются очередные 1000 импульсов, столько можно обработать без всяких погрешностей.
Это я могу дополнительно считать, для проверки данных и т.п., но не то.
Вы не поняли суть проблемы. Нужно считать максимально быстро и максимально точно. Я считаю максимально быстрым - это время от импульса до импульса, быстрее расчитать не получится. Или я не прав?

Цитата Сообщение от Валенок Посмотреть сообщение
Так пойдет ?
Код:
FUNCTION_BLOCK flow
(*
   Для обычных импульсных счетчиков с частотой < 50..100Гц.
   Для вменяемых пользователей с рабочим циклом 0..3мс (Гражданин помни : эмуляция - десятки мс)
   (C) Валенок, апрель 2014 
   Люблю печенки
*)
VAR_INPUT
	impulse : BOOL;
	tmax : TIME;   (*для обрыва асимптоты. Больше время - выше чуйствительность, но хуже ловля закрытия кранчиков*)
	k : REAL;   (*л/имп*)
END_VAR
VAR_OUTPUT
	q : REAL;   (*м3/ч*)
END_VAR
VAR_IN_OUT
	liters : DWORD;   (*наработка целых литров, из внешнего ретайна*)
END_VAR
VAR
	fix : R_TRIG;   (*ловим кокой-нить фронт импульса*)
	period,   (*последний законченный межимпульсный интервал*)
	peri,   (*текущий незаконч..*)
	t : TIME;   (*временная отметка*)
	c : BYTE;   (*на подумать самому*)
	rem : REAL;   (*k - real, liters - dword, нам пох*)
END_VAR


(*порядок выполнения выделенных групп особого значения не имеет*)

peri := TIME() - t;
c := SEL(peri > tmax, c, 0);   (*самореинициализация, если чо*)


fix(clk := impulse);
IF fix.q THEN
 	period := peri;
 	t := TIME();
 	c := MIN(2,c + 1);
	rem := rem + k;
	liters := liters + REAL_TO_DWORD(rem);   (*расчет редкий, промежуточное сохранение не нужно*)
	rem := rem - REAL_TO_DWORD(rem);
END_IF


IF c = 2 THEN
 	IF peri >= period THEN
		q := k * 3600 / TIME_TO_DWORD(peri);   (*расчет делается только по необходимости - импульс и асимптота*)
	END_IF
ELSE
	q := 0;
END_IF
PS
Вот почему тут TAB'ы не любят ?
Вам отдельное спасибо, буду разбираться в коде.