PDA

Просмотр полной версии : Показать значащие биты числа в цикле



melky
07.05.2019, 20:01
Как бы объяснить... Есть число Х, ну скажем 610 (bin 10 0110 0010), как бы отобразить на экране по очереди номера значащих битов в цикле и остановиться ?

то есть надо отобразить 9, 6, 5, 1 применив какие-то процедуры в цикле программы ПР.

Сергей0308
07.05.2019, 20:20
Как бы объяснить... Есть число Х, ну скажем 610 (bin 10 0110 0010), как бы отобразить на экране по очереди номера значащих битов в цикле и остановиться ?

то есть надо отобразить 9, 6, 5, 1 применив какие-то процедуры в цикле программы ПР.

Шутите? Вот, по-моему, если не ошибаюсь, AI делал "триста лет тому назад":

42593

melky
07.05.2019, 20:42
Сергей0308 и где здесь цикл ? просто раскладывание значения на биты и только.
была идея применить cd32 и Putbit как в макросе SortBit, но как используя один cd32 и один putbit сделать цикл обработки ? вот тут у меня затык и вышел.
когда-то что-то подобное делал с циклом, но похоже потерял файл, правда там у меня что-то другое было, но сам алгоритм может помог бы...

Сергей0308
07.05.2019, 20:52
Сергей0308 и где здесь цикл ? просто раскладывание значения на биты и только.
была идея применить cd32 и Putbit как в макросе SortBit, но как используя один cd32 и один putbit сделать цикл обработки ? вот тут у меня затык и вышел.
когда-то что-то подобное делал с циклом, но похоже потерял файл, правда там у меня что-то другое было, но сам алгоритм может помог бы...

Так здесь за цикл всё и определяется, в следующем цикле можете заняться чем-то ещё, а вообще-то принято правила сразу писать и не менять их в процессе, короче, тогда думайте сами, как программу состряпать на двух элементах, зачем мелочиться, на одном делайте!

melky
07.05.2019, 22:45
Вероятно я неправильно выразился.
В общем есть программа в целом - она выполняется ровно один цикл для ПР. Есть небольшие куски программы, вычисления которых надо разбить на несколько шагов, каждый из которых будет выполняться в рамках одного цикла ПР. Но есть неизвестное, количество значащих бит в числе. Если сделать счетчик на 32 бита, то вычисления будут выполняться 32 цикла ПР, а вот как сократить это количество используя тот же cd32 ????

Пока это только наметки, много элементов лишние, просто чтобы было видно результат. При изменении числа Input надо начинать запись с 0 ячейки. На данный момент почему-то пишет с 1-й, что-то не допилил. Ну и потом лишние таймеры и элементы надо будет удалить. Но думаю смысл будет понятен...

melky
08.05.2019, 16:50
Вопрос в догонку, на экран надо выводить время возникновения ошибки (нашел свои наработки по поводу журнала ошибок с циклической перезаписью на 8 последних).

Время записываю в макрос EEPROM в UTC формате при помощи макросов от petera. а вот как это время потом показать на экране ???? лепить 8 макросов преобразования из UTC формата в лоб ???
а нельзя ли обойтись одним макросом преобразования и как-то поиграться с координатами вывода ?

Коды ошибок так же записываются во второй EEPROM и потом тут слепил макрос (из того, что было :) ), которые в цикле вычитывает из EEPROM и фиксирует в 8 переменных коды с защелкой. То же можно сделать и с переменными времени, но тогда однозначно делать 8 макросов, что мне не нравится...

Хотелось бы поработать с экраном в 8 строк (или меньше, если журнал не наполнился) и как-то обойтись одним механизмом для кодов и одним для времени, а не лепить 8 одинаковых последовательностей....

melky
08.05.2019, 20:21
Масок нет, все ручками. Ошибок количество ограничено, но они маскируются, то есть 2,3 или сколько будет и могут появиться вместе. В ПР и ИПП очень не хватает обработки клавиатуры, чтобы выводить одну строку журнала и просто перелистывать их.

Работы со временем штатных нет, в прошивке ПР, хотя бы по UTC, чтобы банально на экран выводить "Метка времени" и подавать на нее время в UTC а ПР сам рисует на экране дату. Только с возможностью выбора формата.

Короче занимаемся всякими извращениями по придумке макросов :). а этот Журнал я еще год назад начинал наверное, только из-за ограничений ПР так и не доделал, да и сейчас наверное вряд ли, пока обработка клавиатуры не появится.

melky
08.05.2019, 23:20
Валенок жертвовать входом это жестко для таких вещей :) переключать по кругу по мне глупо, мне надо четкое понимание и осмысление, еще же битовую маску надо разложить на отдельные ошибки, если их 2 например. Сколько надо на осмысление ? 5 сек? 30 ?

Одна и та же, это если есть автоматический сброс ошибки, если его нет, то и запись одна, но появление при одной ошибке второй может быть, это будет следующая запись.

Для некоторых задач ПЛК часто излишен, и еще момент, например 63-му не достает выходов, что приводит к еще большему удорожанию.

melky
09.05.2019, 10:04
Валенок журнал аварий это не работа, больше хобби :)

ошибок например 5, в журнале будет записана маска + время, Показать маску и время на экране ПР не проблема, а вот без пол холста fbd блоков еще и раскидать маску по отдельным авариям в текстовом виде по каждой ошибке в ПР сложно.. вот это можно было победить при использовании кодов клавиш и возможности разветвленного меню (подменю).

На счет задач, банально - мощности ПР хватает и у него 8 выходов (и нужно 8), ставить ПЛК 63 у которого всего 6 выходов на задачу не тянет (не хватает 2 выходов).
Ставить еще больший ПЛК или добавлять к 63-му модуль вывода ?
В общем сравниваем цену и бюджет....
Если задача не решается на ПР, тут и так понятно, выбираем соответствующий ПЛК и все.

з.ы. с Днем Победы всех!...

Сергей0308
09.05.2019, 16:01
Вообще-то всё это, ваши хотелки легко(по моим меркам) разрешаются, примерно так: высчитываете разность и с помощью шифратора преобразуете в номер соответствующего бита! Всегда определение бит будет начинаться со старшего бита! У меня есть подобный макрос ограничения изменения, чтобы за 1 цикл менялось не более 1 бита! Ранее делал по другому, каждый цикл писался 1 бит переменной, короче, чтобы 32 битную переменную изменить требовалось не менее 32 циклов работы программы, теперь это занимает ровно столько циклов работы программы, сколько бит изменилось, всё! Это может уменьшить время выполнения до 32 раз! Больше ничем помочь не могу, и так всё разболтал и боюсь Вас оставил без хобби!

melky
09.05.2019, 16:17
Сергей0308 вообще то я выше выложил пример, где как раз при помощи CD32 задача решена. По крайней мере в симуляции работает, ну требует допиливания правда.

речь о другом немного, способен ли ПР вывести на экран список аварий (или битов) за несколько циклов, полученных из одной переменной ?

Кстати вероятность возникновения 2-х аварий и тем более большего количества в пределах одного цикла программы приближена к нулю....

melky
09.05.2019, 16:20
Хм, а вот как скрестить ужа с ежом ? сделать EEPROM со стеком ? то есть писать всегда в ячейку 0, но чтобы предварительно все записи смещались вниз ?
Последние просто удалялись. важна энергонезависимость, чтобы при выключении все данные сохранялись..

У вас кажется был макрос стека для целочисленных ? что-то найти не могу
маленькая ремарка, стек может быть перезаписан за один цикл ПР ?

Сергей0308
09.05.2019, 16:38
Хм, а вот как скрестить ужа с ежом ? сделать EEPROM со стеком ? то есть писать всегда в ячейку 0, но чтобы предварительно все записи смещались вниз ?
Последние просто удалялись. важна энергонезависимость, чтобы при выключении все данные сохранялись..

У вас кажется был макрос стека для целочисленных ? что-то найти не могу
маленькая ремарка, стек может быть перезаписан за один цикл ПР ?

У меня есть макрос целочисленного стека на 32 разряда:
42622
Диапазон номеров ячеек, разрядов: 0-31.
Кстати этот макрос как раз то, что хотели и матрица памяти и стек и ничего скрещивать не пришлось!
И хотел уточнить сразу, во избежание лишних вопросов, данные со входа сразу поступают в назначенный разряд и если использовать как стек при подаче сигналов смещение влево-вправо будут смещаться на один разряд, всё!

melky
09.05.2019, 16:57
Спасибо, гляну.

Сергей0308
09.05.2019, 17:20
Спасибо, гляну.

Вот можете и мой макрос(RAMP_BIT) посмотреть в проекте, точнее его кишки! Специально в проекте выложил, чтобы было понятней как им пользоваться. Он очень универсальный, в данном случае используется не совсем по назначению:
42623

42624

melky
10.05.2019, 08:37
Сергей0308 посмотрел стек, аж интересно стало, это из школы высшей математики ? :) никак проще сохранять int нельзя, обязательно через битовое представление ?
з.ы. вчера тут тоже поколдовал, надо будет на железке посмотреть работоспособность...

capzap ваш вариант не разбирал, но что-то кажется он не работает. 1 на входах 1,4,5,9 а на выходе 6 и 0 проскакивает (ну 0 ладно типа переход) но 6 откуда и 4 где ?

melky
10.05.2019, 09:11
ну CD32 при 1 на 0 разряде тоже 0 покажет, он же честно говорит, единица в нулевом разряде :) тут либо 0 разряд никогда не использовать, либо иной подход применять. Ну или банально +1 всегда делать

Сергей0308
10.05.2019, 10:10
Сергей0308 посмотрел стек, аж интересно стало, это из школы высшей математики ? :) никак проще сохранять int нельзя, обязательно через битовое представление ?
з.ы. вчера тут тоже поколдовал, надо будет на железке посмотреть работоспособность...

capzap ваш вариант не разбирал, но что-то кажется он не работает. 1 на входах 1,4,5,9 а на выходе 6 и 0 проскакивает (ну 0 ладно типа переход) но 6 откуда и 4 где ?

Это энергонезависимый реверсивный стек, матрица памяти на 32 ячейки, отдельно назначаются ячейки записи(куда пишутся данные со входа) и чтения(откуда поступают данные на выход), я честно говоря у других вообще не встречал ничего подобного, сравнить не с чем, вот когда Вы придумаете примерно такое же можно будет сравнить и сказать у кого проще, пока вижу от Вас неконструктивную критику! И у меня есть другая матрица памяти также на 32 ячейки но с двумя независимыми выходами, я к тому что здесь явно их не хватает, может и ещё чего не хватает(например входа разрешения записи), сами подумайте чего здесь может ещё не хватать! И здесь всё просто, как три копейки. Вы моего макроса очередь не видели(https://www.owen.ru/forum/showthread.php?t=25068&page=34, пост#333), там многим кажется сложней, но опять, я хочу это подчеркнуть, лишь потому, что они не понимают как это работает, когда это понимаешь, всё кажется очень просто устроено, если интересует какой-то мой макрос и Вам не понятно как он работает, могу объяснить, сразу станет всё понятно и просто, как три копейки!

melky
10.05.2019, 12:02
Сергей0308 я не критикую, просто пытаюсь понять, неужели в ПР нет механизмов перемещать int по стеку проще, а не используя побитовое смещение сперва int полностью разложив на биты а потом собрать обратно ? Вам кажется он простым, но откуда вы взяли идею сделать именно так, то есть распаковать, выполнить какие-то действия и запаковать ?

capzap ох уж эти самообучающиеся программы и матрицы :)

тут вопрос иной - неужели на ПР нельзя работать с переменными в том виде, в котором они есть проще ?
Или не хватает каких то механизмов (FBD) в прошивке ПР для этого ?

понятно, что есть простые логические операции и на их основе можно сделать сложные, но когда программа или макрос представляет из себя простыню холста, куда уже некуда вставлять fbd кажется странным...

Сергей0308
10.05.2019, 13:10
Сергей0308 я не критикую, просто пытаюсь понять, неужели в ПР нет механизмов перемещать int по стеку проще, а не используя побитовое смещение сперва int полностью разложив на биты а потом собрать обратно ? Вам кажется он простым, но откуда вы взяли идею сделать именно так, то есть распаковать, выполнить какие-то действия и запаковать ?


Я начинал со стеков из цепочки SEL-ов, потом, далеко не сразу понял, что так можно сделать и стал сдвигать биты внутри переменной, я здесь точной аналогии привести не могу, наверно это как переход от парового к двигателю внутреннего сгорания!
Вот немного подумал, наверно более правильно сравнивать с переходом с релейной логики на программируемое реле, если для схемы(логики работы) достаточно 1-2 реле, то проще конечно эти 1-2 реле и поставить, если логика сложная, то проще на ПР сделать!

capzap
10.05.2019, 13:22
схема теперь гиганская, но время я потратил всё равно гораздо меньше чем писал бы какую то логику прямо на холсте, а так занимался только копипастом, в этом кстати и была ошибка, только не в коэффициентах, а не выставил в нескольких местах соответствующие переменные, проверил код на яве и сразу нашел ошибку

melky
10.05.2019, 13:37
capzap foo = 245, сколько вы еще потратите времени на корректировку своей матрицы ? не работает

Сергей0308 вот и я на SEL вроде сделал, всегда пугало как сдвигом битов рисовали картинку на экране (давно было при попытках изучать ассемблер).
Сложно мне саму суть схватить, но за сам макрос спасибо, буду пытаться с ним разобраться.

capzap
10.05.2019, 14:36
не буду ни чего корректировать, у меня все сходится 7,6,5,4,2,0 (0,0,1,1,1,1,0,1,0,1)

PS еще раз повторяю, я не пишу логику, этим занимается библиотека на питоне, если она сказало 1.0 значит весь датасет успешно вернул совпадающий результат. Датасет тоже не в ручную писал, там 5122 строки

Сергей0308
10.05.2019, 14:50
Сергей0308[/B] вот и я на SEL вроде сделал, всегда пугало как сдвигом битов рисовали картинку на экране (давно было при попытках изучать ассемблер).
Сложно мне саму суть схватить, но за сам макрос спасибо, буду пытаться с ним разобраться.

Неоднократно давал подробные описания работы макроса, можно найти в разных темах, в крайнем случае спросите что не понятно, по возможности отвечу!

melky
10.05.2019, 15:29
Сергей0308 интересует логика самого сердца, FIFO32, где SHL, SHR и так далее.

capzap вход I10 это какой бит ? - 9? или ??? почему входы шиворот навыворот ? I1 это 9-й бит, разве это нормально ?

Сергей0308
10.05.2019, 16:08
Сергей0308 интересует логика самого сердца, FIFO32, где SHL, SHR и так далее.


Если Вам известно как работают элементы из ОЛ, единственное, что может быть не совсем понятным это назначение входов-выходов, там они подписаны, имеется комментарий, если Вы принципиально ничего не читаете, тогда Смотрите:

42632

Сверху вниз по порядку:
I1 - выбор бита для записи(0-31)
I2 - значение бита записи(0/1)
I3 - сдвиг влево по фронту импульса на 1 разряд
I4 - сдвиг вправо по фронту импульса на 1 разряд
I5 - выбор бита для чтения(0-31)
Q1 - выход читаемого бита(0/1)

Вот честно не пойму, что здесь может быть непонятным, может просто ленитесь, не смотрели, читали?!

melky
10.05.2019, 16:13
вы не совсем поняли. Как этим сдвинуть все записи в INT формате ? :)... вот это непонятно, как вы пришли к этому ? какую литературу изучить или какое высшее заведение окончить ? :)

То, что делают элементы ОЛ я понимаю, но вот принцип как смещением каждого бита происходит перезапись со смещением на одну ячейку стека не совсем понимаю...

capzap
10.05.2019, 16:29
capzap вход I10 это какой бит ? - 9? или ??? почему входы шиворот навыворот ? I1 это 9-й бит, разве это нормально ?
т.е. к 245 больше претензий нет, если рассматривать I1 как некий порядковый номер разряда числа может и не нормально, а если формировать датасет с помощью Integer.toBinaryString, то в нем(датасете) старший разряд будет относится к первому входу в нейросеть

Сергей0308
10.05.2019, 16:36
вы не совсем поняли. Как этим сдвинуть все записи в INT формате ? :)... вот это непонятно, как вы пришли к этому ? какую литературу изучить или какое высшее заведение окончить ? :)

То, что делают элементы ОЛ я понимаю, но вот принцип как смещением каждого бита происходит перезапись со смещением на одну ячейку стека не совсем понимаю...

Целочисленная внутренняя переменная состоит из 32 бит, она раскладывается на 32 бита, и пишется сразу во все 32 регистра сдвига, каждый бит одной переменной пишется в одноимённый разряд(бит) сдвиговых регистров, там 32 таких регистров сдвига и паралейно сдвигаются все биты переменной! При чтении обратный процесс переменная собирается из 32 одноимённых бит регистров сдвига! Короче получается Вы паралейно сдвигаете 32 бита, всё!
И мне ничего там придумывать не надо было, я ранее аналогичным образом целочисленный мультиплексор делал на 32 входа: 42633
Вот попробуйте просто повторить его, скорей всего откажитесь от такой затеи, этот макрос я дольше всего делал, сначала планировал и подобным образом демультиплексор сделать но отказался, по озвученным причинам!

melky
10.05.2019, 18:07
capzap претензия в некотором роде к другому, если на каждый чих прибегать к помощи нейросети, ресурсов не напасешься.

Сергей0308 понял смысл, спасибо.

capzap
10.05.2019, 18:14
capzap претензия в некотором роде к другому, если на каждый чих прибегать к помощи нейросети, ресурсов не напасешься.
ну какой же это чих, думаю здесь все подтвердят, что если чих то его просто делают, а не берут подсказку зала

melky
10.05.2019, 18:17
capzap так примеров вывода значащих битов было предостаточно уже, даже в этой теме, без применения нейросети

Скажем так, не на ту задачу вы нейросеть натравили...

capzap
10.05.2019, 18:36
capzap так примеров вывода значащих битов было предостаточно уже, даже в этой теме, без применения нейросети

Скажем так, не на ту задачу вы нейросеть натравили...
Только мой вариант сперва прошел проверку все значения потом была построена схема, какой либо другой вариант проверялся по всему диапазону возможных значений? Во всех других вариантах сперва будет построена схема и из 1024 четырех возможных значений сколько то будет проверено, предположим 10%, человеку быстро надоедает проделывать монотонно одни и те же операции, а автотестов в ОЛ еще нет. Тех кто пишет только в ОЛ ограничены его возможностями, я же могу использовать весь спектр существующих инструментов чтоб создать выборку, которая уже без моего участия создаст работоспособную модель. Сейчас для ОЛ я сделал нейросеть на одинадцать входов, мне даже не нужно будет переделывать проект, под схожие задачи с меньшим количеством входов, просто неиспользуемые коэффициенты удалю и они не будут участвовать и задам на оставшихся нужные, взятые из модели. Если в ОЛ появиться выгрузка/загрузка переменных например в csv файл, так вообще можно даже не заниматься самому копипастом, на питоне сформировал модель в нужном формате, а в ОЛ сделал импорт

Сергей0308
10.05.2019, 23:03
Сергей0308 понял смысл, спасибо.

Очень рад за Вас! Вот если бы Вы ещё и смысл ваших задумок смогли объяснить, было бы вообще замечательно!
Пока что, имеем внутреннюю переменную, 32 битную, то есть максимально возможно до 32 аварий определить(точнее номер бита аварии). Идём дальше, возможные варианты: допустим сработали все 32 аварии одновременно, у вас запишутся номера битов с 31 до 0 и займёт это 32 разряда стека! К чему я, мне кажется проще записать в стек битовую маску аварий(входов аварий) и займёт это всего 1 разряд стека в 32 раза меньше энергонезависимой памяти потребуется! А из стека забираете битовую маску аварий и делайте с ней все что угодно, можно по очереди номер каждого бита определить, как Вы хотите, а можно сразу, без волокиты, все биты аварий определить с помощью функции чтения бита, тем более это и в десятки раз проще выйдет, всё!

Как Вам, примерно такой расклад:

42639

42640

melky
10.05.2019, 23:43
Сергей0308 боюсь что с такими возможностями экрана и с отсутствием опроса клавиатуры вряд ли что-то получится.
Вообще начинал давно делать журнал аварий с меткой времени (кусок на скрине выше выкладывал). Но не очень нравится идея использовать UTC время.
Сейчас вот думаю использовать ваш макрос стека и так как он на 32 записи попробовать сделать 1 ячейку на коды аварий, а следующую на время. Так как с double time нет смысла заморачиваться в ПР, можно в один регистр впихнуть. Все равно для Scada писать скрипт хоть для UTC хоть для двух байтного времени.

з.ы. сразу скажу, чужие макросы журналов не нравятся, тем более запароленные..

Битовая маска и будет писаться, и выше я говорил, вероятность в одном цикле ПР получить даже 2 аварии практически равна нулю, но вот наличие одной ошибки и добавление в маску следующей вероятна вполне, а это будет восприниматься как новая авария и соответственно новая запись.

Вообще идея перебирать в цикле выходную переменную попробовать вывести на экран список, но думаю тут постигнет неудача, либо экран будет сильно моргать... надо как то на железе проверить будет идею...

Сергей0308
11.05.2019, 00:10
Сергей0308 боюсь что с такими возможностями экрана и с отсутствием опроса клавиатуры вряд ли что-то получится.
Вообще начинал давно делать журнал аварий с меткой времени (кусок на скрине выше выкладывал). Но не очень нравится идея использовать UTC время.
Сейчас вот думаю использовать ваш макрос стека и так как он на 32 записи попробовать сделать 1 ячейку на коды аварий, а следующую на время. Так как с double time нет смысла заморачиваться в ПР, можно в один регистр впихнуть. Все равно для Scada писать скрипт хоть для UTC хоть для двух байтного времени.

з.ы. сразу скажу, чужие макросы журналов не нравятся, тем более запароленные..

Битовая маска и будет писаться, и выше я говорил, вероятность в одном цикле ПР получить даже 2 аварии практически равна нулю, но вот наличие одной ошибки и добавление в маску следующей вероятна вполне, а это будет восприниматься как новая авария и соответственно новая запись.

Вообще идея перебирать в цикле выходную переменную попробовать вывести на экран список, но думаю тут постигнет неудача, либо экран будет сильно моргать... надо как то на железе проверить будет идею...

Я же макрос выкладывал недавно, RAMP_BIT называется, он позволит, если аварии сработали абсолютно одновременно, через цикл их записать, начиная со старшего номера бита, это Вас беспокоить не должно и вроде 32 бит должно хватить для времени с дискретностью 1 секунда и кодом аварии в 5 бит(0-31), я не так давно в какой то теме это подробно подсчитывал! Что вы там аварии не каждый год смотреть будете?

melky
11.05.2019, 00:21
Сергей0308 если аварии одновременно в одном цикле, они и так в маску попадут. Для этого не обязательно какие либо специфические макросы нужны.
На счет упаковки в один регистр аварий и времени - чем больше пакуем, тем больше распаковывать, я еще и о Scada думаю, как там это будет работать, так что тоже не вариант в один регистр пихать и время и аварии.

Сергей0308
11.05.2019, 00:42
Сергей0308 если аварии одновременно в одном цикле, они и так в маску попадут. Для этого не обязательно какие либо специфические макросы нужны.
На счет упаковки в один регистр аварий и времени - чем больше пакуем, тем больше распаковывать, я еще и о Scada думаю, как там это будет работать, так что тоже не вариант в один регистр пихать и время и аварии.

Куда ж тогда время девать, вот смотрите: секунд в сутках(время) 86400, это 13 бит займёт, день месяца, ещё 5 бит(0-31), месяц, ещё 4 бита(0-15), код аварии(номер бита, 0-31), ещё 5 бит, остаётся 5 бит, то есть на 32 года хватит с дискретностью 1 секунда! Я надеюсь уж раз в 32 года Вы в состоянии будете аварии просмотреть?! И мне всё чаще подозрения закрадываются, это наверно Вы сами такую скаду придумали, если ПР оказывается гораздо круче такой скады?!

melky
11.05.2019, 10:29
Сергей0308 вы немного не поняли, Scada по умолчанию понимает время в формате double Time (8 байтный вариант, пришедший на смену UTC). Чтобы вывести любое иное время и его поняла Scada в самой Scada придется написать скрипт(формулу). Тип Scada тут не важен, если время Scada получает не в формате, известном компьютеру, придется писать скрипт для перевода чтобы Scada поняла.

double Time для ПР даже если посильная задача, займет много места в самой программе, UTC есть, но тоже занимает место, а так как даже UTC надо переводить для Scada я и думаю, запихнуть в один регистр время.

Как вы в 5 бит запихнете ДВЕ аварии ? по этому для маски аварий будет отдельный регистр. Scada сама разберет битовую маску, не маленькая.
Вот тут хочу определиться, а разбирать ли маску на экране ПР??? так ли это необходимо ?, табличка в щите со списком аварий легко решает этот вопрос на административном уровне :) А вот был бы опрос клавиш из программы, можно было бы на экране отобразить все красиво.

Для меня это несколько оптимальнее, чем пихать все в один регистр. А чтобы хоть в чем-то была универсальность, я время могу в регистр запаковать, как это в протоколе M-Bus сделано, тогда и формула для Scada будет в некотором роде универсальной.

Сергей0308
11.05.2019, 15:08
Сергей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 разных аварий(код аварий) фиксировать, всё!

melky
11.05.2019, 15:19
Даже 16 аварий в битовой маске в 5 бит вы не запихнете. Например 7-я и 12-я авария - засуньте их сразу обе в 5 бит.

Когда и как будут просматриваться аварии вас не должно волновать вообще, Scada должна зафиксировать аварии и их время тогда, когда они наступили. Хоть через 10 лет оператор вздумает посмотреть, никого это не волнует. Действие должно выполниться здесь и сейчас и это не обсуждается.

Сергей0308
11.05.2019, 16:01
Даже 16 аварий в битовой маске в 5 бит вы не запихнете. Например 7-я и 12-я авария - засуньте их сразу обе в 5 бит.

Когда и как будут просматриваться аварии вас не должно волновать вообще, Scada должна зафиксировать аварии и их время тогда, когда они наступили. Хоть через 10 лет оператор вздумает посмотреть, никого это не волнует. Действие должно выполниться здесь и сейчас и это не обсуждается.

Насчёт 5 бит, я же Вам намекнул обратиться к первоклассникам, может они Вас вразумят, что 5 бит имеет 32 состояния!
И насчёт 10 лет у Вас принципиально неверный подход, вот Вы себе покупаете обувь, одежду на 1000 лет вперед, надеюсь, смысл уловили! У Вас как бы талант, Вы, мне кажется, любую, даже вполне здравую мысль, можете довести до абсурда!

melky
11.05.2019, 16:17
Сергей0308 - еще раз, появилось две аварии 7 и 12, что вы будете делать с 5 битами ? выведете значение 19 ? это что, 10,9 - 11,8 - 5,14 ?
В общем не пудрите мозги первым классом :)
Банально привязываемся к регистрам модбаса, регистр на аварии, регистр на нормальное время. Все, не надо придумывать велосипед, педали к которому потом еще прикручивать в Scada.

Любая нормальная Scada раскладывает любое чило на биты, 0 - нет аварии, 1 - есть авария такая-то. Смотрим в соседний регистр - наступила во столько то. (время принципиально только для случаев, когда очень большой период опроса или преднамерено делается отложенный опрос.

Сергей0308
11.05.2019, 16:40
Сергей0308 - еще раз, появилось две аварии 7 и 12, что вы будете делать с 5 битами ? выведете значение 19 ? это что, 10,9 - 11,8 - 5,14 ?
В общем не пудрите мозги первым классом :)
Банально привязываемся к регистрам модбаса, регистр на аварии, регистр на нормальное время. Все, не надо придумывать велосипед, педали к которому потом еще прикручивать в Scada.

Любая нормальная Scada раскладывает любое чило на биты, 0 - нет аварии, 1 - есть авария такая-то. Смотрим в соседний регистр - наступила во столько то. (время принципиально только для случаев, когда очень большой период опроса или преднамерено делается отложенный опрос.

Вы наверно не читаете, что Вам пишут, типа идёте на авто пилоте или как-то по своему понимаете(своя интерпретация значений слов), короче, для тех, кто в танке, повторяю, в 5 бит можно записать одновременно до 5 аварий битовой маской или до 32 аварий не одновременно(надеюсь это понятно), кодом аварии(например, номером бита)! И я же Вам не запрещаю, возьмите любую нормальную скаду, как Вы пишите, которая не уступает возможностям ПР, в ПР это же без проблем можно сделать и лабудой не занимайтесь, ну это моё мнение!

melky
11.05.2019, 19:52
Сергей0308 вот в том и речь, что вы сами не читаете, выше было, аварий может быть и две, а всего 16. если только по одной, то и 4-х бит хватит. Вот только проблема со Scada системами есть, их тяжело учить что в одном регистре могут аварии передаваться последовательно с задержкой. Это на экране ПР можно запросто реализовать, но не со Scada системами. им лучше и проще передавать бит = одна авария. ну и тем более если мы задействуем один регистр Modbus то и проблем нет и не надо выдумывать дополнительные велосипеды, сперва на ПР (или ином оборудовании) а потом еще и на Scada.

з.ы. я то могу на Scada и массив слепить но вот только НАХРЕНА ? чем проще, тем лучше, тем более какая будет Scada я понятия не имею, если только не себе это делаю..
Не надо усложнять там, где это не требуется.

Сергей0308
11.05.2019, 20:03
Сергей0308 вот в том и речь, что вы сами не читаете, выше было, аварий может быть и две, а всего 16. если только по одной, то и 4-х бит хватит. Вот только проблема со Scada системами есть, их тяжело учить что в одном регистре могут аварии передаваться последовательно с задержкой. Это на экране ПР можно запросто реализовать, но не со Scada системами. им лучше и проще передавать бит = одна авария. ну и тем более если мы задействуем один регистр Modbus то и проблем нет и не надо выдумывать дополнительные велосипеды, сперва на ПР (или ином оборудовании) а потом еще и на Scada.

з.ы. я то могу на Scada и массив слепить но вот только НАХРЕНА ? чем проще, тем лучше, тем более какая будет Scada я понятия не имею, если только не себе это делаю..
Не надо усложнять там, где это не требуется.

Что-то мне не верится что в скаде нет RS(SR)-триггеров - это, насколько понял, основной месседж сообщения, более особо ничего и не требуется для запоминания аварии!

melky
11.05.2019, 20:07
Сергей0308 вы много скад видели ? в некоторых чтобы достать 16 битов из числа надо 16 запросов одного регистра сделать. Возьмите хотя бы облако Овен. Не знаю, у них с этим улучшилось или нет ?
И Шлюзы такие видел, например чтобы данные в SNMP отдать из битовой маски аналогично 16 запросов надо выполнить.

А вы предлагаете триггера на Scada делать. А еще забываете время опроса по Modbus, оно как бы в 5мс цикла ПР ну никак не впишется, учитывая что на линии может быть не одно устройство.

Так что не надо предлагать грабли, которые потом придется исправлять костылями...

Сергей0308
11.05.2019, 20:25
Сергей0308 вы много скад видели ? в некоторых чтобы достать 16 битов из числа надо 16 запросов одного регистра сделать. Возьмите хотя бы облако Овен. Не знаю, у них с этим улучшилось или нет ?
И Шлюзы такие видел, например чтобы данные в SNMP отдать из битовой маски аналогично 16 запросов надо выполнить.

А вы предлагаете триггера на Scada делать. А еще забываете время опроса по Modbus, оно как бы в 5мс цикла ПР ну никак не впишется, учитывая что на линии может быть не одно устройство.

Так что не надо предлагать грабли, которые потом придется исправлять костылями...

Вы, мне кажется, пытаетесь бороться со здравым смыслом: если там(что Вы используете) нет необходимых для Вас функций(для решения вашей задачи), то возьмите и пользуетесь тем, где они есть! И мы же не скаду здесь обсуждаем, а ПР! А то у Вас получается хвост виляет собакой!

melky
11.05.2019, 21:11
мне к сожалению приходится использовать на верхних уровнях то, что есть у заказчиков, по большей части. Выбора нет. По этому когда делаю что-то сам, то приходится задумываться и о том, что за ПР окажется какое-нибудь гавно типа Дата Центр Эксперт от APC

melky
11.05.2019, 21:37
Валенок давно определился что в сеть. Речь о массиве, или применительно к ПР номер в шаге за несколько циклов ПР для отображения на экране локально.