"Подтягивающий" сдвиг битов |
Здравствуйте, гость ( Вход | Регистрация )
"Подтягивающий" сдвиг битов |
30.01.2017 - 15:30
Сообщение
#1
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
Да да, знаем мы про сдвиги и ротации . Но тут фокус весь вот в чем:
К примеру имеем входы 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. Вот над таким алгоритмом размышляю... Если у кого будут какие идеи - милости прошу -------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
30.01.2017 - 18:25
Сообщение
#2
|
|
Гигант мысли Группа: Пользователи Сообщений: 377 Регистрация: 30.12.2004 Пользователь №: 108 |
То есть нужо включить столько последовательных битов, сколько включенных входов.
Можно вот так. Модель контроллера не указана, поэтому написано так, чтобы подходило для любого контроллера серии FX. Сообщение отредактировал Sergei Troizky - 30.01.2017 - 19:38
Прикрепленные файлы
-------------------- Делать надо сразу хорошо. Плохо само получится.
|
|
|
30.01.2017 - 19:29
Сообщение
#3
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
Можно вот так. Модель контроллера не указана, поэтому написано так, чтобы подходило для любого контроллера серии FX. Хм... Работает! Спасибо! Вот оно как просто оказалось... А я в своих размышлениях забрел вообще в дебри . Думал анализировать слово К2Х0 на кол-во включенных бит, затем через массив включать маркеры... ой... Завтра прокручу все "на листочке", чтобы понять суть ) Тоже чуял, что надо применить некий буфер, как у Вас (К2М100)... Сообщение отредактировал acoustik - 30.01.2017 - 19:32 -------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
30.01.2017 - 19:48
Сообщение
#4
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
То есть нужо включить столько последовательных битов, сколько включенных входов. Да. Для более глубокого понимания сути поясню: мне поставили задачу сделать регистратор событий. Эти маркеры - это биты отображения полей на HMI. На экране будут присутствовать несколько статичных полей, которые отображают некие данные. Но отсутствующие события (данные) будут отображаться на экране в виде нулей в полях вывода цифровых данных, и следовательно, эти поля нужно отключать (убирать из видимости). Существующие же данные отображать, сдвигая и группируя их в порядке Сообщение отредактировал acoustik - 30.01.2017 - 19:58 -------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
30.01.2017 - 20:09
Сообщение
#5
|
|
Гигант мысли Группа: Пользователи Сообщений: 377 Регистрация: 30.12.2004 Пользователь №: 108 |
Завтра прокручу все "на листочке", чтобы понять суть. Чтобы Вам не мучиться, сразу подскажу: сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига. Кроме того, такой метод не зависит от марки и модели контроллера, поэтому избавляет от необходимости вспоминать синтаксис команд сдвига, если приходится часто переключаться по работе между различными контроллерами. Сообщение отредактировал Sergei Troizky - 30.01.2017 - 20:13 -------------------- Делать надо сразу хорошо. Плохо само получится.
|
|
|
30.01.2017 - 20:11
Сообщение
#6
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
В случае применения процессора FX3U можно было бы использовать сортировку массива по полю, содержащему код события, а нулевые коды (отсутствующие события) в конце списка - гасить, выключением соотв битов.
Просто думаю, для таких задач ставить 3U... что стрелять из пушки по воробьям. Поэтому хотел разработать такой алгоритм и для более младших моделей плк семейства FX. Но там нет инструкции SORT... -------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
30.01.2017 - 20:19
Сообщение
#7
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
Завтра прокручу все "на листочке", чтобы понять суть. Чтобы Вам не мучиться, сразу подскажу: сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига. Ну что Вы, это я понял сразу. Еще подумал, а почему просто не умножить на 2... И снова в курсе - команда сложения быстрее команды умножения . То что сдвиг влево/вправо на число равному степени двойки равносильно умножению/делению - это есть "азбука". Я заострил внимание на установке М0 при каждом проходе цикла... Пока не укладывается в голове зачем это. В смысле что это дает Сообщение отредактировал acoustik - 30.01.2017 - 20:23 -------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
30.01.2017 - 20:24
Сообщение
#8
|
|
Гигант мысли Группа: Пользователи Сообщений: 377 Регистрация: 30.12.2004 Пользователь №: 108 |
Вы бы удивились, узнав, скольким программистам мне приходилось это разъяснять.
М0 включается не в каждом проходе цикла, а только когда обнаружен включенный старший бит буфера после очередного сдвига. Сообщение отредактировал Sergei Troizky - 30.01.2017 - 20:26 -------------------- Делать надо сразу хорошо. Плохо само получится.
|
|
|
30.01.2017 - 20:30
Сообщение
#9
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
Вы бы удивились, узнав, скольким программистам мне приходилось это разъяснять. М0 включается не в каждом проходе цикла, а только когда обнаружен включенный старший бит буфера после очередного сдвига. Тьфу, прошу прощения. Слона то я и не приметил . Да, конечно, если включен М107. -------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
30.01.2017 - 20:37
Сообщение
#10
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
сложение слова с самим собой есть умножение на два, что равносильно сдвигу на один бит влево, но выполняется быстрее команды сдвига. Вот это гениально. Что называется век живи... Я просто не додумался провести параллели между этими действиями (сложение/умножение/сдвиг) соотнеся их между собой Максимум - сдвигал бы влево. -------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
30.01.2017 - 20:58
Сообщение
#11
|
|
Гигант мысли Группа: Пользователи Сообщений: 408 Регистрация: 3.08.2014 Пользователь №: 10311 |
Еще раз спасибо, Сергей - вопрос считаю закрытым. Все равно на бумажке прям по битикам разложу Ваши действия, чтобы в голове отложилось
-------------------- There are only 10 types of people in the world — those who understand binary, and those who don't.
|
|
|
Текстовая версия | Сейчас: 25.04.2024 - 15:51 |