Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Mitsubishi Electric. Контроллеры, преобразователи частоты, HMI _ Программирование _ "Подтягивающий" сдвиг битов

Автор: acoustik 30.01.2017 - 15:30

Да да, знаем мы про сдвиги и ротации smile.gif. Но тут фокус весь вот в чем:
К примеру имеем входы 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.

Вот над таким алгоритмом размышляю... Если у кого будут какие идеи - милости прошу smile.gif

Автор: Sergei Troizky 30.01.2017 - 18:25

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

 

Автор: acoustik 30.01.2017 - 19:29

Цитата(Sergei Troizky @ 31.01.2017 - 00:25) *
Можно вот так.
Модель контроллера не указана, поэтому написано так, чтобы подходило для любого контроллера серии FX.

Хм... Работает! Спасибо! rolleyes.gif Вот оно как просто оказалось...
А я в своих размышлениях забрел вообще в дебри ph34r.gif. Думал анализировать слово К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... sad.gif

Автор: acoustik 30.01.2017 - 20:19

Цитата(Sergei Troizky @ 31.01.2017 - 02:09) *
Цитата(acoustik @ 30.01.2017 - 19:29) *
Завтра прокручу все "на листочке", чтобы понять суть.

Чтобы Вам не мучиться, сразу подскажу: сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига.

Ну что Вы, это я понял сразу. Еще подумал, а почему просто не умножить на 2... И снова в курсе - команда сложения быстрее команды умножения rolleyes.gif .
То что сдвиг влево/вправо на число равному степени двойки равносильно умножению/делению - это есть "азбука".

Я заострил внимание на установке М0 при каждом проходе цикла... Пока не укладывается в голове зачем это. В смысле что это дает wacko.gif

Автор: Sergei Troizky 30.01.2017 - 20:24

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

Автор: acoustik 30.01.2017 - 20:30

Цитата(Sergei Troizky @ 31.01.2017 - 02:24) *
Вы бы удивились, узнав, скольким программистам мне приходилось это разъяснять.
М0 включается не в каждом проходе цикла, а только когда обнаружен включенный старший бит буфера после очередного сдвига.

Тьфу, прошу прощения. Слона то я и не приметил smile.gif. Да, конечно, если включен М107.

Автор: acoustik 30.01.2017 - 20:37

Цитата(Sergei Troizky @ 31.01.2017 - 02:09) *
сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига.

Вот это гениально. Что называется век живи... Я просто не додумался провести параллели между этими действиями (сложение/умножение/сдвиг) соотнеся их между собой smile.gif Максимум - сдвигал бы влево.

Автор: acoustik 30.01.2017 - 20:58

Еще раз спасибо, Сергей - вопрос считаю закрытым. Все равно на бумажке прям по битикам разложу Ваши действия, чтобы в голове отложилось smile.gif

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)