В общем цикле, макросы на FBD, это ФБ на CFC (или ST).
Вид для печати
Попробуйте считывать как два 32-битных регистра, потом пропустить через макрос rDIV (деление 64-битных чисел представленных как 2 32-битных)
Он, кстати, покажет остаток от деления, который можно отображать как десятичную часть.
Вложение 74312
Код:function_block rDIV
var_input
x1h : udint;
x1l : udint;
x2h : udint;
x2l : udint;
end_var
var_output
QH : udint;
QL : udint;
MH : udint;
ML : udint;
end_var
var
cnt : udint;
end_var
if x2h + x2l = 0 then return; end_if
cnt := 1; QH := 0; QL := 0;
while x2h < 2147483648 do
x2h := shl(x2h, 1);
if x2l > 2147483647 then x2h := x2h + 1; end_if
x2l := shl(x2l, 1); cnt := cnt + 1;
end_while
while cnt > 0 do
QH := shl(QH, 1);
if QL > 2147483647 then QH := QH + 1; end_if
QL := shl(QL, 1);
if x1h > x2h then
x1h := x1h - x2h; QL := QL + 1;
if x1l >= x2L then
x1l := x1l - x2l;
else
x1l := x2l - x1l; x1l := 4294967295 - x1l; x1l := x1l + 1;
x1h := x1h - 1;
end_if
elsif x1h = x2h then
if x1l >= x2l then
x1h := 0; x1l := x1l - x2l; QL := QL + 1;
end_if
end_if
x2l := shr(x2l, 1);
if x2h > shl(shr(x2h, 1), 1) then x2l := x2l + 2147483648; end_if
x2h := shr(x2h, 1);
cnt := cnt - 1;
end_while
MH := x1h; ML := x1l;
end_function_block
Подскажите, в чем может быть ошибка в программе макроса?
переменные P1_start и P2_Start должны запускать c интервалом в 5 сек (задается отдельно), но фактически они запускаются только в разные циклы.
Если выполнять программу в основном листе, то все работает.
Есть ли особенности хранения переменных внутри макроса?
Вложение 74321
А если так:
Вложение 74322
Тогда, нажимаю старт - загораются оба с разностью в цикл.
делаю сброс-сет старт - загораются как надо
я выложил упрощенную версию моей программы. Задача была - блокировка запуска одновременно 2 и более насосов.
Сейчас условие блокировки поставил на тригеры и все теперь работает.
Вложение 74323
По сути задача задержки включения второго насоса относительно первого , верно?
На основе макроса rDIV можно сделать макрос dig64, который разложит 64-битное число на десятичные цифры до любого разряда:
Вложение 74324Код:function_block dig64
var_input
xH : udint;
xL : udint;
end_var
var_output
d0 : udint;
d1 : udint;
d2 : udint;
d3 : udint;
d4 : udint;
d5 : udint;
d6 : udint;
d7 : udint;
d8 : udint;
d9 : udint;
d10 : udint;
d11 : udint;
d12 : udint;
d13 : udint;
d14 : udint;
d15 : udint;
d16 : udint;
d17 : udint;
d18 : udint;
d19 : udint;
d20 : udint;
d21 : udint;
d22 : udint;
d23 : udint;
d24 : udint;
d25 : udint;
d26 : udint;
d27 : udint;
d28 : udint;
d29 : udint;
d30 : udint;
end_var
var
div : rDIV;
qH : udint;
qL : udint;
end_var
div(x1h:=xH, x1l:=xL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d0);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d1);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d2);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d3);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d4);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d5);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d6);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d7);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d8);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d9);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d10);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d11);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d12);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d13);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d14);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d15);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d16);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d17);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d18);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d19);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d20);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d21);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d22);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d23);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d24);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d25);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d26);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d27);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d28);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d29);
div(x1h:=qH, x1l:=qL, x2h:=0, x2l:=10, QH=>qh, QL=>ql, ML=>d30);
end_function_block