В ПЛК есть много инструкций, которые помогают выполнять логику упрощенным способом. Инструкции бывают разных категорий, таких как арифметические, сравнительные, логические, контроллерные и т. д. Например, простая инструкция сложения для сложения двух переменных относится к арифметической категории. Таким образом, аналогично, в логике ПЛК доступно много типов инструкций.
Одной из таких инструкций, которая широко используется в программировании ПЛК, является инструкция сдвига. Она относится к категории числовой обработки.
В этой статье мы изучим концепцию инструкции сдвига битового регистра в программировании ПЛК.
Сдвиг битового регистра в ПЛК
Как следует из названия, инструкция сдвига — это команда для сдвига битов слова на некоторую предопределенную позицию.
Например, у вас есть слово из 16 бит. Вы хотите переместить бит номер 3 из его текущей четвертой позиции в седьмую позицию. Таким образом, всякий раз, когда дается импульс команды сдвига, бит будет сдвигаться в каждом триггере из четвертой позиции в седьмую позицию.
В этой непрерывности бит в пятой позиции переместится в восьмую позицию; а бит в третьей позиции переместится в шестую позицию. Итак, здесь вы сдвигаете биты в группе на определенное вами количество позиций.
Инструкция сдвига
Инструкции сдвига бывают двух типов — сдвиг и поворот. Давайте рассмотрим инструкцию поворота. Рассмотрим синтаксис — %MW10:= SHL (%MW12, 4). %MW10 — это целевое слово памяти, а %MW12 — это исходное слово памяти.
Обратитесь к изображению ниже. В %MW10, когда дается первый триггер для сдвига влево, бит 0 сдвигается в бит 1 и так далее. Этот результат сохраняется в %MW12. Когда такие триггеры даются четыре раза, в конечном итоге бит 0 окончательно сместится в бит 4 и так далее.
Конечный результат в любом случае сохраняется в %MW12, и вы получаете окончательный ответ битов, сдвинутых на четыре позиции от исходного слова. Но следует помнить, что при каждом сдвиге предыдущий бит заполняется значением 0. Это вы можете ясно видеть на изображении.
После первого сдвига первый бит в %MW12 равен 0. Таким образом, после четырех сдвигов конечный результат будет – 0000 1101 1100 0000. Таким образом, этот сдвиг может быть как правым, так и левым.
В ПЛК есть еще один тип сдвига; более ранний добавляет нули из предыдущей позиции, но этот второй тип сохраняет значение первого бита (MSB для правого и LSB для левого) как есть. Это называется арифметическим сдвигом.
Таким образом, если значение первого бита (MSB для правого и LSB для левого) изначально перед сдвигом было 1, то последний бит останется только 1, а нули будут добавлены из второго предыдущего бита до тех пор, пока не будет дана команда сдвига. Следует отметить, что последний сдвинутый бит всегда сохраняется в бите переноса.
Инструкция поворота
Второй тип — инструкция поворота. Рассмотрим синтаксис: %MW10:= ROL (%MW12, 4). %MW10 — это целевое слово памяти, а %MW12 — это исходное слово памяти. Мы будем использовать то же самое изображение выше для справки. Инструкция поворота, как следует из названия, просто сдвигает биты на указанное вами количество позиций.
По сравнению с инструкцией сдвига, где ноль добавлялся после каждого предыдущего бита; здесь биты просто сдвигаются в той же последовательности, что и в левом направлении. Итак, предположим, что у вас есть исходное слово – 1100 1010 1100 0101; затем после срабатывания триггера из 4 позиций конечный результат будет – 1010 1100 0101 1100. Та же логика работает и в правом направлении. Последний сдвинутый бит также сохраняется в бите переноса.
Еще один тип относится к категории вращения. Здесь вместо сдвига только 16 битов бит переноса переворачивается. Это означает, что последний бит смещается к биту переноса, а затем бит переноса будет смещен к первому биту и т. д. В более раннем типе последний бит сохранялся только в бите переноса.