Решено. Алгоритм реализован на трёх 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);