Как бы объяснить... Есть число Х, ну скажем 610 (bin 10 0110 0010), как бы отобразить на экране по очереди номера значащих битов в цикле и остановиться ?
то есть надо отобразить 9, 6, 5, 1 применив какие-то процедуры в цикле программы ПР.
Вид для печати
Как бы объяснить... Есть число Х, ну скажем 610 (bin 10 0110 0010), как бы отобразить на экране по очереди номера значащих битов в цикле и остановиться ?
то есть надо отобразить 9, 6, 5, 1 применив какие-то процедуры в цикле программы ПР.
Шутите? Вот, по-моему, если не ошибаюсь, AI делал "триста лет тому назад":
Вложение 42593
Сергей0308 и где здесь цикл ? просто раскладывание значения на биты и только.
была идея применить cd32 и Putbit как в макросе SortBit, но как используя один cd32 и один putbit сделать цикл обработки ? вот тут у меня затык и вышел.
когда-то что-то подобное делал с циклом, но похоже потерял файл, правда там у меня что-то другое было, но сам алгоритм может помог бы...
Вероятно я неправильно выразился.
В общем есть программа в целом - она выполняется ровно один цикл для ПР. Есть небольшие куски программы, вычисления которых надо разбить на несколько шагов, каждый из которых будет выполняться в рамках одного цикла ПР. Но есть неизвестное, количество значащих бит в числе. Если сделать счетчик на 32 бита, то вычисления будут выполняться 32 цикла ПР, а вот как сократить это количество используя тот же cd32 ????
Пока это только наметки, много элементов лишние, просто чтобы было видно результат. При изменении числа Input надо начинать запись с 0 ячейки. На данный момент почему-то пишет с 1-й, что-то не допилил. Ну и потом лишние таймеры и элементы надо будет удалить. Но думаю смысл будет понятен...
Вопрос в догонку, на экран надо выводить время возникновения ошибки (нашел свои наработки по поводу журнала ошибок с циклической перезаписью на 8 последних).
Время записываю в макрос EEPROM в UTC формате при помощи макросов от petera. а вот как это время потом показать на экране ???? лепить 8 макросов преобразования из UTC формата в лоб ???
а нельзя ли обойтись одним макросом преобразования и как-то поиграться с координатами вывода ?
Коды ошибок так же записываются во второй EEPROM и потом тут слепил макрос (из того, что было :) ), которые в цикле вычитывает из EEPROM и фиксирует в 8 переменных коды с защелкой. То же можно сделать и с переменными времени, но тогда однозначно делать 8 макросов, что мне не нравится...
Хотелось бы поработать с экраном в 8 строк (или меньше, если журнал не наполнился) и как-то обойтись одним механизмом для кодов и одним для времени, а не лепить 8 одинаковых последовательностей....
Масок нет, все ручками. Ошибок количество ограничено, но они маскируются, то есть 2,3 или сколько будет и могут появиться вместе. В ПР и ИПП очень не хватает обработки клавиатуры, чтобы выводить одну строку журнала и просто перелистывать их.
Работы со временем штатных нет, в прошивке ПР, хотя бы по UTC, чтобы банально на экран выводить "Метка времени" и подавать на нее время в UTC а ПР сам рисует на экране дату. Только с возможностью выбора формата.
Короче занимаемся всякими извращениями по придумке макросов :). а этот Журнал я еще год назад начинал наверное, только из-за ограничений ПР так и не доделал, да и сейчас наверное вряд ли, пока обработка клавиатуры не появится.
Валенок жертвовать входом это жестко для таких вещей :) переключать по кругу по мне глупо, мне надо четкое понимание и осмысление, еще же битовую маску надо разложить на отдельные ошибки, если их 2 например. Сколько надо на осмысление ? 5 сек? 30 ?
Одна и та же, это если есть автоматический сброс ошибки, если его нет, то и запись одна, но появление при одной ошибке второй может быть, это будет следующая запись.
Для некоторых задач ПЛК часто излишен, и еще момент, например 63-му не достает выходов, что приводит к еще большему удорожанию.
Валенок журнал аварий это не работа, больше хобби :)
ошибок например 5, в журнале будет записана маска + время, Показать маску и время на экране ПР не проблема, а вот без пол холста fbd блоков еще и раскидать маску по отдельным авариям в текстовом виде по каждой ошибке в ПР сложно.. вот это можно было победить при использовании кодов клавиш и возможности разветвленного меню (подменю).
На счет задач, банально - мощности ПР хватает и у него 8 выходов (и нужно 8), ставить ПЛК 63 у которого всего 6 выходов на задачу не тянет (не хватает 2 выходов).
Ставить еще больший ПЛК или добавлять к 63-му модуль вывода ?
В общем сравниваем цену и бюджет....
Если задача не решается на ПР, тут и так понятно, выбираем соответствующий ПЛК и все.
з.ы. с Днем Победы всех!...
Вообще-то всё это, ваши хотелки легко(по моим меркам) разрешаются, примерно так: высчитываете разность и с помощью шифратора преобразуете в номер соответствующего бита! Всегда определение бит будет начинаться со старшего бита! У меня есть подобный макрос ограничения изменения, чтобы за 1 цикл менялось не более 1 бита! Ранее делал по другому, каждый цикл писался 1 бит переменной, короче, чтобы 32 битную переменную изменить требовалось не менее 32 циклов работы программы, теперь это занимает ровно столько циклов работы программы, сколько бит изменилось, всё! Это может уменьшить время выполнения до 32 раз! Больше ничем помочь не могу, и так всё разболтал и боюсь Вас оставил без хобби!
Сергей0308 вообще то я выше выложил пример, где как раз при помощи CD32 задача решена. По крайней мере в симуляции работает, ну требует допиливания правда.
речь о другом немного, способен ли ПР вывести на экран список аварий (или битов) за несколько циклов, полученных из одной переменной ?
Кстати вероятность возникновения 2-х аварий и тем более большего количества в пределах одного цикла программы приближена к нулю....
Хм, а вот как скрестить ужа с ежом ? сделать EEPROM со стеком ? то есть писать всегда в ячейку 0, но чтобы предварительно все записи смещались вниз ?
Последние просто удалялись. важна энергонезависимость, чтобы при выключении все данные сохранялись..
У вас кажется был макрос стека для целочисленных ? что-то найти не могу
маленькая ремарка, стек может быть перезаписан за один цикл ПР ?
У меня есть макрос целочисленного стека на 32 разряда:
Вложение 42622
Диапазон номеров ячеек, разрядов: 0-31.
Кстати этот макрос как раз то, что хотели и матрица памяти и стек и ничего скрещивать не пришлось!
И хотел уточнить сразу, во избежание лишних вопросов, данные со входа сразу поступают в назначенный разряд и если использовать как стек при подаче сигналов смещение влево-вправо будут смещаться на один разряд, всё!
Спасибо, гляну.
Вот можете и мой макрос(RAMP_BIT) посмотреть в проекте, точнее его кишки! Специально в проекте выложил, чтобы было понятней как им пользоваться. Он очень универсальный, в данном случае используется не совсем по назначению:
Вложение 42623
Вложение 42624
Сергей0308 посмотрел стек, аж интересно стало, это из школы высшей математики ? :) никак проще сохранять int нельзя, обязательно через битовое представление ?
з.ы. вчера тут тоже поколдовал, надо будет на железке посмотреть работоспособность...
capzap ваш вариант не разбирал, но что-то кажется он не работает. 1 на входах 1,4,5,9 а на выходе 6 и 0 проскакивает (ну 0 ладно типа переход) но 6 откуда и 4 где ?
ну CD32 при 1 на 0 разряде тоже 0 покажет, он же честно говорит, единица в нулевом разряде :) тут либо 0 разряд никогда не использовать, либо иной подход применять. Ну или банально +1 всегда делать
Это энергонезависимый реверсивный стек, матрица памяти на 32 ячейки, отдельно назначаются ячейки записи(куда пишутся данные со входа) и чтения(откуда поступают данные на выход), я честно говоря у других вообще не встречал ничего подобного, сравнить не с чем, вот когда Вы придумаете примерно такое же можно будет сравнить и сказать у кого проще, пока вижу от Вас неконструктивную критику! И у меня есть другая матрица памяти также на 32 ячейки но с двумя независимыми выходами, я к тому что здесь явно их не хватает, может и ещё чего не хватает(например входа разрешения записи), сами подумайте чего здесь может ещё не хватать! И здесь всё просто, как три копейки. Вы моего макроса очередь не видели(https://www.owen.ru/forum/showthread...=25068&page=34, пост#333), там многим кажется сложней, но опять, я хочу это подчеркнуть, лишь потому, что они не понимают как это работает, когда это понимаешь, всё кажется очень просто устроено, если интересует какой-то мой макрос и Вам не понятно как он работает, могу объяснить, сразу станет всё понятно и просто, как три копейки!
Сергей0308 я не критикую, просто пытаюсь понять, неужели в ПР нет механизмов перемещать int по стеку проще, а не используя побитовое смещение сперва int полностью разложив на биты а потом собрать обратно ? Вам кажется он простым, но откуда вы взяли идею сделать именно так, то есть распаковать, выполнить какие-то действия и запаковать ?
capzap ох уж эти самообучающиеся программы и матрицы :)
тут вопрос иной - неужели на ПР нельзя работать с переменными в том виде, в котором они есть проще ?
Или не хватает каких то механизмов (FBD) в прошивке ПР для этого ?
понятно, что есть простые логические операции и на их основе можно сделать сложные, но когда программа или макрос представляет из себя простыню холста, куда уже некуда вставлять fbd кажется странным...
Я начинал со стеков из цепочки SEL-ов, потом, далеко не сразу понял, что так можно сделать и стал сдвигать биты внутри переменной, я здесь точной аналогии привести не могу, наверно это как переход от парового к двигателю внутреннего сгорания!
Вот немного подумал, наверно более правильно сравнивать с переходом с релейной логики на программируемое реле, если для схемы(логики работы) достаточно 1-2 реле, то проще конечно эти 1-2 реле и поставить, если логика сложная, то проще на ПР сделать!
схема теперь гиганская, но время я потратил всё равно гораздо меньше чем писал бы какую то логику прямо на холсте, а так занимался только копипастом, в этом кстати и была ошибка, только не в коэффициентах, а не выставил в нескольких местах соответствующие переменные, проверил код на яве и сразу нашел ошибку
capzap foo = 245, сколько вы еще потратите времени на корректировку своей матрицы ? не работает
Сергей0308 вот и я на SEL вроде сделал, всегда пугало как сдвигом битов рисовали картинку на экране (давно было при попытках изучать ассемблер).
Сложно мне саму суть схватить, но за сам макрос спасибо, буду пытаться с ним разобраться.
не буду ни чего корректировать, у меня все сходится 7,6,5,4,2,0 (0,0,1,1,1,1,0,1,0,1)
PS еще раз повторяю, я не пишу логику, этим занимается библиотека на питоне, если она сказало 1.0 значит весь датасет успешно вернул совпадающий результат. Датасет тоже не в ручную писал, там 5122 строки
Сергей0308 интересует логика самого сердца, FIFO32, где SHL, SHR и так далее.
capzap вход I10 это какой бит ? - 9? или ??? почему входы шиворот навыворот ? I1 это 9-й бит, разве это нормально ?
Если Вам известно как работают элементы из ОЛ, единственное, что может быть не совсем понятным это назначение входов-выходов, там они подписаны, имеется комментарий, если Вы принципиально ничего не читаете, тогда Смотрите:
Вложение 42632
Сверху вниз по порядку:
I1 - выбор бита для записи(0-31)
I2 - значение бита записи(0/1)
I3 - сдвиг влево по фронту импульса на 1 разряд
I4 - сдвиг вправо по фронту импульса на 1 разряд
I5 - выбор бита для чтения(0-31)
Q1 - выход читаемого бита(0/1)
Вот честно не пойму, что здесь может быть непонятным, может просто ленитесь, не смотрели, читали?!
вы не совсем поняли. Как этим сдвинуть все записи в INT формате ? :)... вот это непонятно, как вы пришли к этому ? какую литературу изучить или какое высшее заведение окончить ? :)
То, что делают элементы ОЛ я понимаю, но вот принцип как смещением каждого бита происходит перезапись со смещением на одну ячейку стека не совсем понимаю...
Целочисленная внутренняя переменная состоит из 32 бит, она раскладывается на 32 бита, и пишется сразу во все 32 регистра сдвига, каждый бит одной переменной пишется в одноимённый разряд(бит) сдвиговых регистров, там 32 таких регистров сдвига и паралейно сдвигаются все биты переменной! При чтении обратный процесс переменная собирается из 32 одноимённых бит регистров сдвига! Короче получается Вы паралейно сдвигаете 32 бита, всё!
И мне ничего там придумывать не надо было, я ранее аналогичным образом целочисленный мультиплексор делал на 32 входа: Вложение 42633
Вот попробуйте просто повторить его, скорей всего откажитесь от такой затеи, этот макрос я дольше всего делал, сначала планировал и подобным образом демультиплексор сделать но отказался, по озвученным причинам!
capzap претензия в некотором роде к другому, если на каждый чих прибегать к помощи нейросети, ресурсов не напасешься.
Сергей0308 понял смысл, спасибо.
capzap так примеров вывода значащих битов было предостаточно уже, даже в этой теме, без применения нейросети
Скажем так, не на ту задачу вы нейросеть натравили...
Только мой вариант сперва прошел проверку все значения потом была построена схема, какой либо другой вариант проверялся по всему диапазону возможных значений? Во всех других вариантах сперва будет построена схема и из 1024 четырех возможных значений сколько то будет проверено, предположим 10%, человеку быстро надоедает проделывать монотонно одни и те же операции, а автотестов в ОЛ еще нет. Тех кто пишет только в ОЛ ограничены его возможностями, я же могу использовать весь спектр существующих инструментов чтоб создать выборку, которая уже без моего участия создаст работоспособную модель. Сейчас для ОЛ я сделал нейросеть на одинадцать входов, мне даже не нужно будет переделывать проект, под схожие задачи с меньшим количеством входов, просто неиспользуемые коэффициенты удалю и они не будут участвовать и задам на оставшихся нужные, взятые из модели. Если в ОЛ появиться выгрузка/загрузка переменных например в csv файл, так вообще можно даже не заниматься самому копипастом, на питоне сформировал модель в нужном формате, а в ОЛ сделал импорт
Очень рад за Вас! Вот если бы Вы ещё и смысл ваших задумок смогли объяснить, было бы вообще замечательно!
Пока что, имеем внутреннюю переменную, 32 битную, то есть максимально возможно до 32 аварий определить(точнее номер бита аварии). Идём дальше, возможные варианты: допустим сработали все 32 аварии одновременно, у вас запишутся номера битов с 31 до 0 и займёт это 32 разряда стека! К чему я, мне кажется проще записать в стек битовую маску аварий(входов аварий) и займёт это всего 1 разряд стека в 32 раза меньше энергонезависимой памяти потребуется! А из стека забираете битовую маску аварий и делайте с ней все что угодно, можно по очереди номер каждого бита определить, как Вы хотите, а можно сразу, без волокиты, все биты аварий определить с помощью функции чтения бита, тем более это и в десятки раз проще выйдет, всё!
Как Вам, примерно такой расклад:
Вложение 42639
Вложение 42640
Сергей0308 боюсь что с такими возможностями экрана и с отсутствием опроса клавиатуры вряд ли что-то получится.
Вообще начинал давно делать журнал аварий с меткой времени (кусок на скрине выше выкладывал). Но не очень нравится идея использовать UTC время.
Сейчас вот думаю использовать ваш макрос стека и так как он на 32 записи попробовать сделать 1 ячейку на коды аварий, а следующую на время. Так как с double time нет смысла заморачиваться в ПР, можно в один регистр впихнуть. Все равно для Scada писать скрипт хоть для UTC хоть для двух байтного времени.
з.ы. сразу скажу, чужие макросы журналов не нравятся, тем более запароленные..
Битовая маска и будет писаться, и выше я говорил, вероятность в одном цикле ПР получить даже 2 аварии практически равна нулю, но вот наличие одной ошибки и добавление в маску следующей вероятна вполне, а это будет восприниматься как новая авария и соответственно новая запись.
Вообще идея перебирать в цикле выходную переменную попробовать вывести на экран список, но думаю тут постигнет неудача, либо экран будет сильно моргать... надо как то на железе проверить будет идею...
Я же макрос выкладывал недавно, RAMP_BIT называется, он позволит, если аварии сработали абсолютно одновременно, через цикл их записать, начиная со старшего номера бита, это Вас беспокоить не должно и вроде 32 бит должно хватить для времени с дискретностью 1 секунда и кодом аварии в 5 бит(0-31), я не так давно в какой то теме это подробно подсчитывал! Что вы там аварии не каждый год смотреть будете?
Сергей0308 если аварии одновременно в одном цикле, они и так в маску попадут. Для этого не обязательно какие либо специфические макросы нужны.
На счет упаковки в один регистр аварий и времени - чем больше пакуем, тем больше распаковывать, я еще и о Scada думаю, как там это будет работать, так что тоже не вариант в один регистр пихать и время и аварии.
Куда ж тогда время девать, вот смотрите: секунд в сутках(время) 86400, это 13 бит займёт, день месяца, ещё 5 бит(0-31), месяц, ещё 4 бита(0-15), код аварии(номер бита, 0-31), ещё 5 бит, остаётся 5 бит, то есть на 32 года хватит с дискретностью 1 секунда! Я надеюсь уж раз в 32 года Вы в состоянии будете аварии просмотреть?! И мне всё чаще подозрения закрадываются, это наверно Вы сами такую скаду придумали, если ПР оказывается гораздо круче такой скады?!
Сергей0308 вы немного не поняли, Scada по умолчанию понимает время в формате double Time (8 байтный вариант, пришедший на смену UTC). Чтобы вывести любое иное время и его поняла Scada в самой Scada придется написать скрипт(формулу). Тип Scada тут не важен, если время Scada получает не в формате, известном компьютеру, придется писать скрипт для перевода чтобы Scada поняла.
double Time для ПР даже если посильная задача, займет много места в самой программе, UTC есть, но тоже занимает место, а так как даже UTC надо переводить для Scada я и думаю, запихнуть в один регистр время.
Как вы в 5 бит запихнете ДВЕ аварии ? по этому для маски аварий будет отдельный регистр. Scada сама разберет битовую маску, не маленькая.
Вот тут хочу определиться, а разбирать ли маску на экране ПР??? так ли это необходимо ?, табличка в щите со списком аварий легко решает этот вопрос на административном уровне :) А вот был бы опрос клавиш из программы, можно было бы на экране отобразить все красиво.
Для меня это несколько оптимальнее, чем пихать все в один регистр. А чтобы хоть в чем-то была универсальность, я время могу в регистр запаковать, как это в протоколе M-Bus сделано, тогда и формула для Scada будет в некотором роде универсальной.
Вообще-то 5 бит, это диапазон 0-31, 32 аварии запихиваются! Даже битовой маской, одновременно, можно до 5 аварий фиксировать, а Вы 2 не можете, первоклассникам только не рассказывайте, а то они со смеху животики надорвут!
Идём дальше, если воспользоваться здравым смыслом и аварии просматривать не реже 1 раза в год, то от даты-времени(22 бита, расклад чуть выше), остаётся 10 бит, можно одновременно до 10 аварий фиксировать битовой маской или не одновременно(думаю проблем с этим не будет в большинстве случаев) до 1024 разных аварий(код аварий) фиксировать, всё!