Так человек читает регистр 0х1300, а он 32 бит со знаком. У вас регистр 0х2200 (64 бит без знака). Или он не то что нужно читает?
Вид для печати
Весь и вопрос в том, что часть работает и читается (16 и 32 разрядные), а часть проблема с чтением (64 разрядные) с 0х2200 по 0х2203,
не считая остального, умножение, сложение 20 разрядных чисел и деление 20 разрядного на 10^5, а потом и вывод на экран,
которое возможно решить, как оказалось.
Дополнил сложением длинных чисел.
Искренне сомневаюсь в необходимости умножения длинных чисел - физический смысл величины [куб.м*куб.м] не понятен.
Довольно просто сделать вычитание длинных чисел, умножение длинного на короткое, деление длинного на короткое, чуть сложнее сделать умножение длинных чисел. Деление длинных чисел - сложновато, но возможно.
Всё требует времени - и отладка длинных вычислений. Мне не хочется реализовывать ради реализации.
Думаю, что лучшим вариантом будет, если Nsft сможет принять эти 4 регистра и пояснит, какие вычисления требуются. И попробует их реализовать. Если не сможет - завтра вечером после работы попробую.
Идея вычислений - имеем массив, в котором каждый элемент использует половину разрядов. При операциях проверяется старшая половина и, если она не нулевая, то делается перенос в следующий элемент. Все операции (сложение, вычитание, умножение, деление) выполняются по алгоритму "на бумаге в столбик". Единственно, при делении приходится следить, чтобы перенос не вызвал переполнения разрядной сетки (так не получилось сразу делить на 10^5).
Еще раз, что надо посчитать, вот скрин Вложение 74299
0x2200
младшая часть — значение оставляем «как есть» : 0хb4df hex = 46303 dec (может быть до 65535)
0x2201
значение умножаем на 2^16 : 0x0dff hex = 3583 dec, 3583 * 65536 = 234815488 (может быть до 4294901760)
0x2202
значение умножаем на 2^32 : 0 * 4294967296 = 0 (сейчас 0, а будет число до 5 знаков, например 65535 * 4294967296=281470681743360 )
0x2203
значение умножаем на 2^48 : 0 * 281474976710656 = 0 (сейчас 0, а будет число до 5 знаков, например 65535 * 281474976710656=18446462598732840960 )
Суммируем результаты : 46303 + 234815488 + 0 + 0 = 234861791. Сумму умножаем на 0.00001 (переносим запятую на 5 знаков влево).
В итоге получаем 2348.61791 КВт /час
65535+4294901760+281470681743360+18446462598732840 960=18446744073709551615 - максимально возможное 20-значное число
умноженное на 0.00001=184467440737095.51615
Добрый день.
Подскажите, макросы работают в общем цикле (как вызов Fb в обычном ПЛК) или как-то отдельно?
Попробуйте считывать как два 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
нет, без привязки к номеру насоса. только блокировка одновременного запуска.
Появилось условие запуска сразу двух насосов. Сначала запустился один с наименьшей наработкой, через время Т - второй.
на картинке упрощенная программа
Если исходить из этого, первого Вашего вопроса, то можно так
Вложение 74325
Ну так Вас и просили изложить все условия, Вы задали вопрос, выложили схему, оказалось вопрос несколько иной, и схема "упрощенная".
Из нее виден только один сигнал пуск, флага приоритета ( или номера разрешенного к пуску) насоса нет. Как и
На форуме очень много тем и обсуждений по ротации насосов, поищите. Наверняка найдете нужное решение.Цитата:
Тогда где счетчики моточасов?
забудьте про ротацию. Конкретно тот пример - почему игнорируется блокировка?
Вложение 74326
Так Вы выложите эту часть в виде отдельного проекта, или макроса. Или кто то должен вручную рисовать, чтоб проверить?
https://disk.yandex.ru/d/wMALoZHdprK2EA
OWEN Logic v2.6.345.0
Макрос ротации насосов 2 шт.
https://owen.ru/forum/showthread.php?t=30327
Блин, ну как зачем? Вы хотите чтоб одновременно не включались вообще или запуск разрешен, но с задержкой 5 сек., хотите чтоб приоритет был, у какого? Либо при каждом следующем включении попеременно включались? Вкл-выкл в течении менее5 сек. вариантов масса. То что у Вас , и не меняя логики , как Вы хотели, включится второй выход, через 5 сек 1-й. и при каждом включении так же будет . Я уж не спрашиваю про условия пуска. Поставьте л.з. Но этот вариант не будет отличаться от того что раньше рисовал Вам. Только сложнее.
Вложение 74327
Вероятно Вы хотели что то типа счетчика сделать? N_start? Но это не так делается. Гадать сложно.