PDA

Просмотр полной версии : СИ-30 вычисление мгновенного значения



s22
24.04.2013, 04:37
Здравствуйте! Подскажите пожалуйста, как правильнее реализовать алгоритм вычисления мгновенного значения показаний счетчика СИ-30?

На счетчик приходят импульсы - 1 импульс = 10 л воды. Необходимо вычислить текущий расход м3/ч, пройденный за 1 минуту.

Математически я легко представляю как это реализовать, но как это лучше сделать в CodeSys? Использовать таймеры для отсчета количества импульсов в минуту? Или, возможно, уже есть какая то готовая библиотека для подобных целей? Может у кого есть готовый похожий код?

rovki
24.04.2013, 05:31
Лучше сделать это вычисление самому -просто,наглядно,быстро,,, ,однако.

capzap
24.04.2013, 06:19
в режиме импульса наверное
библиотека с сайта oscat.de

s22
26.04.2013, 18:43
Лучше сделать это вычисление самому -просто,наглядно,быстро,,, ,однако.
спасибо, учту. Но я имел в виду:

Подскажите пожалуйста, как правильнее реализовать алгоритм вычисления мгновенного значения

rovki
26.04.2013, 19:45
Любой работающий алгоритм -правильный .Если вам нужен оптимальный алгоритм ,то сформулируйте требования ,что для вас имеет первостепенное значение.
Вы хотите реализовать алгоритм(расходомер) СИ30 на ПЛК?

s22
08.05.2013, 09:36
Решено. Алгоритм реализован на трёх BLINK'ах: третий управляет первым и вторым генератором, которые дают импульс на запись переменной z1 и z2. Далее над ними производятся стандартные математические операции в результате чего получается переменная z с мгновенным значением. Применить модуль (абсолютное значение) пришлось в силу того, что алгоритм в первый момент времени дает положительное значение во второй - отрицательное. Избавиться от этого можно было использовав 4 блинк, но зачем использовать лишние вычислительные ресурсы если результат одинаков? :)



VAR
blink1: BLINK;
blink2: BLINK;
blink3: BLINK;
si30rchv_z1: DWORD;
si30rchv_z2: DWORD;
si30rchv_z3: DWORD;
si30rchv_en1: BOOL ;
si30rchv_en3: BOOL:=TRUE ;
si30rchv_out3: BOOL;
si30rchv_out1: BOOL;
si30rchv_en2: BOOL ;
si30rchv_out2: BOOL;
si30rchv_dw: DWORD;
END_VAR

si30rchv_dw:=%ID6.5.0.0;

si30rchv_r:=si30rchv_dw*0.01; (*1 импульс = 10 литров, *0.01 = м3*)

blink3 (ENABLE := si30rchv_en3, TIMELOW:=t#60s, TIMEHIGH := t#60s);
si30rchv_out3 := blink3.OUT;

blink1 (ENABLE := si30rchv_out3, TIMELOW:=t#60s, TIMEHIGH := t#2ms);
si30rchv_out1 := blink1.OUT;

IF si30rchv_out3=FALSE THEN
si30rchv_en2:=TRUE;
ELSE
si30rchv_en2:=FALSE;
END_IF

blink2 (ENABLE := si30rchv_en2, TIMELOW:=t#60s, TIMEHIGH := t#2ms);
si30rchv_out2 := blink2.OUT;

IF si30rchv_out1=FALSE AND si30rchv_out2=FALSE THEN
si30rchv_z3:=si30rchv_z2-si30rchv_z1;
END_IF

IF si30rchv_out1=TRUE THEN
si30rchv_z1:=si30rchv_dw;
END_IF

IF si30rchv_out2=TRUE THEN
si30rchv_z2:=si30rchv_dw;
END_IF

si30rchv_z:=ABS (si30rchv_z3*0.01*60);

Сергей Мих
29.08.2013, 22:11
в режиме импульса наверное
библиотека с сайта oscat.de

Какая у Вас библиотека, в <OSCAD codesys2_311_320> FLOW_METER отсутствует.
9797

petera
30.08.2013, 00:22
Какая у Вас библиотека, в <oscad codesys2_311_320=""> FLOW_METER отсутствует.
9797
В версии 332 точно есть
9820</oscad>

Сергей Мих
31.08.2013, 22:06
Спасибо, нашёл . Теперь бы ещё и описание. Просто планируем обвязать насосные счётчиками воды и подключить в действующую диспетчиризацию. Водомеры с К=100 л./имп.