Siemens STL 03 - Цикличный сдвиг DWORD — АСУ ТП: сообщество инженеров

Siemens STL 03 — Цикличный сдвиг DWORD

О чём видео

В ролике показана оптимизация блока циклического сдвига DWORD на языке STL в среде Siemens. Разбирается замена команд сдвига внутри слова на команды циклического сдвига двойного слова, упаковка байтов через указатель и адресный регистр, а также исправление ошибки с перезаписью адресного регистра при вызове функции. В конце программа проверяется в симуляторе ПЛК.

Что разбирается
  1. 00:08 Оптимизация блока циклического сдвига
  2. 00:25 Сохранение результата во временную переменную
  3. 01:50 Упаковка байтов через прямую адресацию
  4. 02:40 Использование указателя и адресного регистра
  5. 04:57 Добавление входа для шага сдвига
  6. 04:57 Перекрестные ссылки и обновление вызова
  7. 07:56 Проверка работы в симуляторе ПЛК
Оборудование и ПО
  • Siemens
  • STL
  • ПЛК

Кому полезно: Инженерам АСУ ТП, программистам ПЛК, изучающим STL и работу с адресными регистрами

Описание составлено автоматически по расшифровке речи в ролике.

Расшифровка видео

0:08 В следующем видео я немного оптимизирую программу, я сделаю так, что блок цикличного гигабайта позволит смещаться на любое количество бит без потерь 6 месяцев спустя. Будем работать блоком Шевд Байт Овце 2. Старый блок кода нам не нужен, мы его можем просто закомментировать, создаем еще 1 нетворк, в котором будем писать новый алгоритм сдвига из старого алгоритма. Нам подойдет 1 часть, поэтому мы можем просто ее скопировать. Ранее мы использовали команды сдвига внутри слова, далее нам эти команды будут не нужны, поэтому мы можем их просто удалить. За цикличность сдвиг двойного слова вправо отвечает команда Р. Р. Ди. Если единица находится в самом младшем бите младшего Байта. Данная команда переносит ее в самый старший бит самого старшего Байта. За цикличность сдвиг двойного слова влево отвечает команда РЛДИ. Как нетрудно догадаться, если единица находится в самом старшем бите самого старшего Байта, то данная команда переносит. Эту единицу в самый младший бит самого младшего Байта. Программа сдвига готова, теперь необходимо сохранить ее результат, результат будем сохранять в новую временную переменную темп д. Уорд, созданную в временной области блока ФЦ 2, естественно, что данная. Переменная должна быть типа Деворт. После создания необходимо использовать данную переменную для сохранения результата сдвига вместо переменной темпа Байт. Комментарии нам теперь тоже не подходит, поэтому мы его удалим сохранение результата, по сути. Относится к алгоритму сдвига, поэтому я перенесу данную строку. Теперь нам необходимо запаковать данные двойного слова в 1 Байт, чтобы склеить все Байты двойного слова. Мы могли бы воспользоваться способом из первоначального алгоритма, сдвигая исходную. Последовательность на 8 бит вправо, но повторить эту операцию еще 3 раза, но получить доступ к отдельным Байтам можно и по другому. Например, используя прямую адресацию по локальному стеку памяти, как видим, исходная переменная занимает 4 Байта начиная со 2. Поэтому, просто обратившись напрямую, например, ко 2 и 3 Байту Лстека можно легко получить доступ к 2 Байтам. Переменный темп де Ворд таким образом можно выполнить поочередное склеивание всех Байтов двойного слова. И на практике подобный способ очень часто. Встречается предупреждение, которое вы видите не критично. Она лишь сообщает, что используется переменная без привязки к тегу. Если сейчас скомпилировать программу, то мы не увидим зафиксированных ошибок в логи. Будет информация только о 2 предупреждениях. Которых, впрочем, не будет, если вы используете классический степ 7 менеджер. Несмотря на то, что такой подход прекрасно работает, я не рекомендую его использовать, так как если изменить местоположение исходной переменной, то весь ваш код, завязанный на прямой. Адресации к локальному стеку сломается. Вместо этого я предлагаю использовать указатель и адресный регистр для этого получаем указатель на исходную переменную указатель. Будет хранить начальный адрес переменной темп дуорт, где бы она не находилась в. Пределах локального стека памяти далее необходимо данный указатель передать в адресный регистр, используя команду Лар. 1 Теперь все просто, мы, используя силу косвенной адресации, можем получить доступ к каждому Байту исходного двойного слова, напоминаю, что. Здесь, в квадратных скобках, мы указываем начальную точку памяти, которая может храниться в адресном регистре, а 2 аргументом передаем смещение относительно начальной точки. Таким образом, чтобы загрузить 1 байт, нужно указать нулевое смещение, чтобы загрузить. 2 Байт указываем смещение в 1 Байт и таким же способом получаем информацию с 3 и 4 Байта. Получив доступ к Байтам через указатель, их необходимо поочередно склеить друг с другом с помощью операции или чтобы таким образом получить конечный результат. Работы в виде 1 Байта конечный результат выгружаем в переменную шэфтбайт. Мы почти закончили, с этим блоком осталось только обеспечить возможность управлять шагом сдвига. Для этого необходимо константу бить Намбер перенести в область входных переменных. Новый алгоритм полностью готов, можно провести компиляцию и убедиться, что никаких серьезных ошибок нет. Теперь необходимо убедиться, что нет проблем в месте вызова данного блока. Для этого можно воспользоваться функцией перекрестных ссылок или кросс референс.

4:57 В окне ссылок можно увидеть все внутренние и внешние ссылки, относящиеся к блоку ФЦ. 2 Нас интересует место вызова данного блока и, как мы видим, у нас только 1. Точка обращения, которая находится в блоке ФБ, 1 перейдя по ссылке, попадаем в место, откуда идет обращение к Блоку ФЦ 2. И сразу видим ошибку, ошибка обусловлена тем. Что мы изменили структуру входных данных, добавив 1 новый вход БИЦ Намбер? Необходимо обновить вызываемый блок, для этого воспользуемся контекстным меню нам сразу. Демонстрирует, что произойдет после обновления, это очень удобно после обновления. Необходимо на новый вход передать, какое то значение я передам Меркерное слово. МВ, 100 чтобы можно было во время выполнения программы менять шаг смещения. Что ж, мы почти закончили, но сейчас я вижу, что программа работать не будет, проблема. Связана с неправильным использованием адресного регистра. Я думаю, кто то из вас тоже понимает, в чем дело. Проблема в том, что адресный регистр не сохраняет свое. Значение для каждого блока, в котором используется в моей же программе, мы рассчитываем указатель для адресного регистра до вызова блока ФЦ, 2 а затем снова. Пытаемся использовать значения из адресного регистра, и программа с первоначальным алгоритмом ФЦ 2 работала так, как нигде в Коде адресный регистр не переписывался. Сейчас же в блоке ФЦ 2 мы также используем адресный регистр, меняя указатель внутри него. Именно поэтому код после блока Овца 2 уже не работает, так как он обращается. К совершенно другой части памяти, к счастью, эту ошибку легко исправить. Для начала необходимо создать новую временную переменную типа де Ворд, в данную переменную. Мы сохраним значение адресного регистра для блока ФБ, 1 чтобы не потерять его. После вызова функции ФЦ 2 можно сохранить указатель в переменную через аккумулятор. Как простое значение, но на самом деле в Эстель для этой операции уже имеется специальная команда для выгрузки адресного регистра, мы должны просто написать. Команду Тор 1 и указать имя переменной таким образом значение из адресного регистра будет скопирована во временную переменную, откуда его можно будет взять в. дальнейшем и воспользоваться этим значением необходимо после выполнения кода функции ФЦ 2 для загрузки указателя из переменный темп аир 1 воспользуемся уже. Известной командой Лар, 1 но в этот раз укажем ей источник загрузки данных. Теперь, чтобы не происходило с адресным регистром функции ФЦ, 2 мы не потеряем ранее. Вычисленный указатель блока ФБ 1 и программа будет работать, теперь необходимо загрузить всю программу в симулятор ПЛК и проверить, что алгоритмы работают исправно.

7:56 Включаем движение влево, подав импульс на вход и 0 0 и не забудем указать шаг смещения в МВ. 100 Как видим, движение влево прекрасно работает. Далее нам необходимо проверить движение вправо и возможности. Регулируемого смещения на этом я сегодня и закончу, но мы еще вернемся к данной задаче, поэтому подписывайтесь, чтобы не пропустить дальнейшее развитие событий. Спасибо за просмотр и всего хорошего.

Расшифровка сделана автоматически (Yandex SpeechKit) и может содержать ошибки в терминах.

Оставьте комментарий

Войти

Зарегистрироваться

Сбросить пароль

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

Прокрутить вверх