Если вводишь переменные и потом выключишь питание ПР, и вкл. его то исполняется с новыми уставками. Мне нужно чтобы искючить такую ситуацию с выключением ПР.
Вид для печати
Если вводишь переменные и потом выключишь питание ПР, и вкл. его то исполняется с новыми уставками. Мне нужно чтобы искючить такую ситуацию с выключением ПР.
Я знаю, и понимаю это. Когда нет запуска от внешней кнопки на выходах ПР выключенное состояние.
Спасибо, всем кто откликнулся! Проблему решил. Оказалось, что в программе пользователя нужно при запуске от внешней кнопки необходимо сброить счетчик, чтобы в него записалось новое значение и после небольшой задержки дать разрешение на исполнение программы пользователя.
P.S.Когда в менеджере экранов (панель свойств) в разделе контроль ввода устанавливаешь значения от 1 допустим до 20, но при программировании в переменной выводится 0. Я считаю, что в переменную при программировании должно записываться минимальное указанное значение т.е 1. Но этот вопрос скорее всего нужно адресовать системщикам.
Ввод переменной в самом общем виде осуществляется не только с локальной панели, но и из панели оператора, из облака, из другой вышестоящей системы.
Поэтому правильным будет в самой программе диагностировать такие параметры на допустимый диапазон, а при выходе за границы или корректировать (ограничивать) значение или формировать сигнал ошибки с остановкой всего процесса.
Т.е. это проблема программы пользователя, а не прошивки.
Уважаемый Сергей308. Пишу свою первую программу на ОЛ. Ваш макрос "Тапки" мне очень помог в выполнении похожей задачи. Правда сделал на ST. Прошу Вашей рецензии.
*Новичкам не скачивать! Я сам новичок, поэтому без оценки специалистов моим макросом лучше не пользоваться. А макрос от Сергей308 проверен временем.
Здравствуйте, подскажите как импортировать сетевые переменные из файла csv? Экспорт есть, импорта не вижу. Мне нужно из другого проекта перенести переменные для slave порта. Реле ПР200.
Сергей308 у нас противник ST, а ваш код в симуляции можно спокойно обмануть, если быстро нажать I8, потом I7, Вложение 74182
то срабатывает выход Q7, а должен Q8. Быстродействия не хватает
Тоже самое, если нажать I5, потом I4.
Добавил ФБ, выложил EFrol , с приоритетом первого выхода
https://owen.ru/forum/showthread.php...&page=346#3458
Рано мне еще пускаться в обсуждения и споры. Согласен по поводу быстродействия. И Ваш вариант красивее.
Попробовал сначала подать 1 на входы, потом запустил симуляцию. Вот что получилось:Вложение 74190
Прошу прощения. А вот так можно?
Код:function_block Tapki //имя функционального блока.
var_input //объявление входных переменных
I1,I2,I3,I4,I5,I6,I7,I8:bool;
end_var
var_output //объявление выходных переменных
Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8: bool;
end_var
if (I1 or I2 or I3 or I4 or I5 or I6 or I7 or I8) xor
(Q1 or Q2 or Q3 or Q4 or Q5 or Q6 or Q7 or Q8) then
Q1 := I1; Q2 := I2; Q3 := I3; Q4 := I4; Q5 := I5; Q6 := I6; Q7 := I7; Q8 := I8;
end_if
end_function_block
cd32 - Шифратор. Преобразует позиционный код в двоичный код.Вложение 74196
Например при включении 7 бита, в маске M_Al=128, а cd32 выдаёт число M_Nas=7
M_Nas:=cd32(M_Al);
При возникновении нескольких фронтов (спадов) одновременно придется вводить приоритет:
Код:function_block Tapki //имя функционального блока.
var_input //объявление входных переменных
I1,I2,I3,I4,I5,I6,I7,I8:bool;
end_var
var_output //объявление выходных переменных
Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8: bool;
end_var
if (I1 or I2 or I3 or I4 or I5 or I6 or I7 or I8) xor
(Q1 or Q2 or Q3 or Q4 or Q5 or Q6 or Q7 or Q8) then
Q1 := I1; if I1 then return; end_if
Q2 := I2; if I2 then return; end_if
Q3 := I3; if I3 then return; end_if
Q4 := I4; if I4 then return; end_if
Q5 := I5; if I5 then return; end_if
Q6 := I6; if I6 then return; end_if
Q7 := I7; if I7 then return; end_if
Q8 := I8; if I8 then return; end_if
end_if
end_function_block
Это аналогично следующему:
Т.е. любое значение имеющее один единственный бит равный 1-е, будет защелкнуто в a-переменной.Код:if b=1 or b=2 or b=4 or b=8 .... then
a := b;
end_if
Отсюда, два и более бит, равные 1-е защелкнуты не будут (игнорирование).
Могу добавить, что если понадобится обратная логика, в смысле, "кто последний встал, того и тапки", вот здесь обсуждали:
https://owen.ru/forum/showthread.php?t=12691&page=62
Там ещё много чего есть:
https://owen.ru/forum/showthread.php?t=12691&page=63
Здравствуйте. Возник вопрос касательно чтения значения мощности с счетчика WB-MAP3e на ПР205. Видел на форуме, что возникала такая проблема, но она была решалась в Codesys, а не в owen logic. Связь ПР с счетчиком есть, значения напряжения считываются исправно, а вот значения суммарной активной мощности нет. Если кто-нибудь сталкивался, то не могли бы подсказать, как справиться с данной проблемой?Вложение 74276Вложение 74277Вложение 74278Вложение 74279
Nsft Какие ужасные и непонятные имена переменных.
Внешне всё нормально. НО! У Owen Logic есть важное отличие от ПЛК: если в OwenLogic переменная нигде не используется - то она не обрабатывается ВООБЩЕ. Даже сетевая на считывание.
Поэтому, если sum_1 (ужасное имя) нигде не используется - всё будет по нулям. Для теста надо вывести её хоть на экран.
Данная переменная отображается на экране, результат тот же.
На ПР у вас ничего не выйдет, он не умеет работать с 64 битными переменными, всё что вы можете прочитать 4 регистра, Вложение 74282
и их передать куда то, где можно пересчитать.
Вот тема https://owen.ru/forum/showthread.php...light=WB-MAP3e
А она должна быть не равна нулю? Что через другие программы видно в ней?
Откуда там 64 бита? Все регистры у WirenBoard в 16 или 32 бита, обычные (кроме накопленных). Он же напряжения читает 32-юитными регистрами нормально. И на его картинке написано u32 или s32 - 32 бита.
Вот карта: https://wirenboard.com/wiki/WB-MAP3E_Data_Registers_v.2
Умножать 3 регистр на 2^32 степени и 4 регистр на 2^48 степени вы чем будете? Посмотрите мой скрин или свою ссылку до конца.
Кроме того, читать надо все 4 регистра разом, а ПР даже этого не может.
0x2200
младшая часть — значение оставляем «как есть» : 0хb4df hex = 46303 dec
0x2201
значение умножаем на 2^16 : 0x0dff hex = 3583 dec, 3583 * 65536 = 234815488
0x2202
значение умножаем на 2^32 : 0 * 4294967296 = 0
0x2203
значение умножаем на 2^48 : 0 * 281474976710656 = 0
Суммируем результаты : 46303 + 234815488 + 0 + 0 = 234861791. Сумму умножаем на 0.00001 (переносим запятую на 5 знаков влево).
В итоге получаем 2348.61791 КВт /час
Ааа!! Точно же! Но у него читается из регистра 0, поэтому я занимался только этой задачей.
А вот WirenBoard я обожаю пламенной любовью как раз в этом ужасном стиле отображения данных. Там вон для модуля измерения 2 каналов 4..20 мА даже масштабирования нет, и чтобы получить миллиамперы, надо умножать значение из регистра на 3.125*10^-2. Это ЖЕСТЬ. Я иногда хочу убить их за такие скрытые сюрпризы, как и здесь.
Я бы решал задачу вывода 64 разрядного числа на экран методами длинной арифметики. На ST это совсем не составит труда.
Пусть имеется 4 регистра по 16 разрядов. Их можно для упрощения перенести в 4 32 разрядных - повысив ёмкость.
Далее, алгоритм вывода числа на экран на псевдокоде
Для длинной арифметики делить можно вычитанием или имитацией деления в столбик - как раз и пригодится свойство превышения разрядности переменных над разрядностью реального содержимого.Код:uint x=123456;
char digits[30]; //или сколько разрядов будет занимать число
uint count=0;
do
{
digits[count++] = (x % 10); //остаток от деления на 10
x = x / 10; //целочисленное деление на 10;
}while(x>0);
//теперь в массиве digits цифры выводимого числа в обратном порядке
//вывод массива
for(int i=count; i>0; i--)
putchar(digits[i-1]);
Можно и деление на 10 заменить делением на 10^5, что ускорит получение групп цифр для вывода, а последний остаток - выводить отдельно вместе с элементом текст, содержащим символ "точка". Выводить со значащими нулями.
Т.е. вместо одного числа будет выведено 5 при помощи 6 элементов (5 вывод int, 1 вывод text).
Может я чуть сумбурно описал, но алгоритмы длинной арифметики часто используются.
2 в 64 степени = 18 446 744 073 709 551 616, т.е. всего 20 цифр.
Если вопрос только в выводе на экран, а не синхронном получении всех разрядов, то задача элементарна.
Сложение и вычитание длинных чисел - тоже очень простое.
Попробуйте реализовать длиннку. Если не получится - в воскресенье могу попробовать сделать вывод значения на экран.
Хорошо, я сейчас сделаю демку на ПР205 для вывода 64 разрядного числа из 4 регистров (переменных) по 16 разрядов. Это не очень трудно.
А как его принять в ПР - не знаю. Если только в этом проблема, то это неразрешимо до исправления разработчиками.
...но у него в 32-битном регистре 0. Почему он не читается? Вот куда смотреть надо пока что, а не как его обработать.
Вот просто вывод 64 разрядного числа из 4 регистров (переменных) по 16 разрядов каждый.
Брать делитель 10^5 не получится, т.к. возможно переполнение при переносе остатка от деления в следующий разряд.
Но для данного конкретного случая - дробная часть содержит 5 десятичных разрядов можно немного усложнить алгоритм и добиться желаемого.
Перестановку принятых регистров можно делать.
Кроме приёма 4 регистров - проблем не вижу.
Сложение, вычитание больших чисел - это ещё меньшая проблема, чем вывод на экран.
Вот про связь - да, ничего не поделать.
И ещё один тестовый вывод - число с фиксированной десятичной точкой (15+5).
Просто добавил ещё одно деление на 10 и потом собрал 5-разрядное число для показа десятичной дроби
Если нужно сложение-вычитание-умножение длинных чисел - могу сделать, только алгоритм Карацубы реализовывать не буду (не умею).
Я прочитал тему по ссылке, но не уяснил проблемы. Там перемещают какие-то байты для получения правильной последовательности байт в принятом 64 разрядном слове. Но это не проблема.
Если сложность в чём-то другом - лучше прямо напишите, не отсылайте к водянистой многостраничной теме.