Версия для печати темы
Mitsubishi Electric. Контроллеры, преобразователи частоты, HMI _ Программирование _ "Подтягивающий" сдвиг битов
Автор: acoustik 30.01.2017 - 15:30
Да да, знаем мы про сдвиги и ротации . Но тут фокус весь вот в чем:
К примеру имеем входы X0...X7 и набор маркеров M0...M7. Допустим включился Х0, это событие зафиксировалось включившимся маркером М0. Затем включился Х5, но отображающий это событие маркер должен стать М1.
Более понятно:
Х0 М0
Х1 М1
Х2 М2
Х3 М3
Х4 М4
Х5 М5
Х6 М6
Х7 М7
Теперь добавился вход Х3 и его маркер следующий по порядку - М2:
Х0 М0
Х1 М1
Х2 М2
Х3 М3
Х4 М4
Х5 М5
Х6 М6
Х7 М7
Маркер М0 "принадлежит" входу Х0, маркер М1 входу Х5 и маркер М2 входу Х3 - в порядке их появления.
Теперь сигнал с Х0 исчез:
Х0 М0
Х1 М1
Х2 М2
Х3 М3
Х4 М4
Х5 М5
Х6 М6
Х7 М7
кол-во включенных входов (Х) и вкл маркеров остались равны, однако маркеры "сместились" вверх и теперь маркеру М0 соотв вход Х5 (т.к. он появился раньше Х3) а маркеру М1 соответственно вход Х3.
Вот над таким алгоритмом размышляю... Если у кого будут какие идеи - милости прошу
Автор: Sergei Troizky 30.01.2017 - 18:25
То есть нужо включить столько последовательных битов, сколько включенных входов.
Можно вот так.
Модель контроллера не указана, поэтому написано так, чтобы подходило для любого контроллера серии FX.
Автор: acoustik 30.01.2017 - 19:29
Цитата(Sergei Troizky @ 31.01.2017 - 00:25)
Можно вот так.
Модель контроллера не указана, поэтому написано так, чтобы подходило для любого контроллера серии FX.
Хм... Работает! Спасибо!
Вот оно как просто оказалось...
А я в своих размышлениях забрел вообще в дебри
. Думал анализировать слово К2Х0 на кол-во включенных бит, затем через массив включать маркеры... ой...
Завтра прокручу все "на листочке", чтобы понять суть )
Тоже чуял, что надо применить некий буфер, как у Вас (К2М100)...
Автор: acoustik 30.01.2017 - 19:48
Цитата(Sergei Troizky @ 31.01.2017 - 00:25)
То есть нужо включить столько последовательных битов, сколько включенных входов.
Да. Для более глубокого понимания сути поясню: мне поставили задачу сделать регистратор событий.
Эти маркеры - это биты отображения полей на HMI. На экране будут присутствовать несколько статичных полей, которые отображают некие данные. Но отсутствующие события (данные) будут отображаться на экране в виде нулей в полях вывода цифровых данных, и следовательно, эти поля нужно отключать (убирать из видимости).
Существующие же данные отображать, сдвигая и группируя их в порядке
убывания возрастания, сверху страниц.
Автор: Sergei Troizky 30.01.2017 - 20:09
Цитата(acoustik @ 30.01.2017 - 19:29)
Завтра прокручу все "на листочке", чтобы понять суть.
Чтобы Вам не мучиться, сразу подскажу: сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига.
Кроме того, такой метод не зависит от марки и модели контроллера, поэтому избавляет от необходимости вспоминать синтаксис команд сдвига, если приходится часто переключаться по работе между различными контроллерами.
Автор: acoustik 30.01.2017 - 20:11
В случае применения процессора FX3U можно было бы использовать сортировку массива по полю, содержащему код события, а нулевые коды (отсутствующие события) в конце списка - гасить, выключением соотв битов.
Просто думаю, для таких задач ставить 3U... что стрелять из пушки по воробьям. Поэтому хотел разработать такой алгоритм и для более младших моделей плк семейства FX. Но там нет инструкции SORT...
Автор: acoustik 30.01.2017 - 20:19
Цитата(Sergei Troizky @ 31.01.2017 - 02:09)
Цитата(acoustik @ 30.01.2017 - 19:29)
Завтра прокручу все "на листочке", чтобы понять суть.
Чтобы Вам не мучиться, сразу подскажу: сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига.
Ну что Вы, это я понял сразу. Еще подумал, а почему просто не умножить на 2... И снова в курсе - команда сложения быстрее команды умножения
.
То что сдвиг влево/вправо на число равному степени двойки равносильно умножению/делению - это есть "азбука".
Я заострил внимание на установке М0 при каждом проходе цикла... Пока не укладывается в голове зачем это. В смысле что это дает
Автор: Sergei Troizky 30.01.2017 - 20:24
Вы бы удивились, узнав, скольким программистам мне приходилось это разъяснять.
М0 включается не в каждом проходе цикла, а только когда обнаружен включенный старший бит буфера после очередного сдвига.
Автор: acoustik 30.01.2017 - 20:30
Цитата(Sergei Troizky @ 31.01.2017 - 02:24)
Вы бы удивились, узнав, скольким программистам мне приходилось это разъяснять.
М0 включается не в каждом проходе цикла, а только когда обнаружен включенный старший бит буфера после очередного сдвига.
Тьфу, прошу прощения. Слона то я и не приметил
. Да, конечно, если включен М107.
Автор: acoustik 30.01.2017 - 20:37
Цитата(Sergei Troizky @ 31.01.2017 - 02:09)
сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига.
Вот это гениально. Что называется век живи... Я просто не додумался провести параллели между этими действиями (сложение/умножение/сдвиг) соотнеся их между собой
Максимум - сдвигал бы влево.
Автор: acoustik 30.01.2017 - 20:58
Еще раз спасибо, Сергей - вопрос считаю закрытым. Все равно на бумажке прям по битикам разложу Ваши действия, чтобы в голове отложилось
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)