Siemens STL 02 - Косвенная адресация — АСУ ТП: сообщество инженеров

Siemens STL 02 — Косвенная адресация

О чём видео

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

Что разбирается
  1. 00:09 Создание функционального блока для решения задачи
  2. 05:30 Форматы указателей при косвенной адресации
  3. 10:29 Выбор интервала движения влево и вправо
  4. 13:33 Формирование входов и структура памяти программ движения
  5. 17:46 Начальные значения ячеек памяти и тестирование программы
Оборудование и ПО
  • STL
  • ПЛК

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

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

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

0:09 Добрый день, приветствую вас на канале клик Клик Лоджик. В этом видео мы продолжим разбираться в решении задачи собеседования на программиста ПЛК. Подробные условия задачи вы можете посмотреть в 1 части видео, напомню. Что в 1 части мы, используя платформу Теопортал, написали 2 основных блока генератор импульсов и блок цикличного сдвигабайта. Сегодня я использую эти наработки соберу окончательное решение поставленной задачи.

0:40 Создам новый программный блок, тут нам потребуется запоминать состояние сдвигаемого Байта, поэтому выбираю блок ФБ. Название дам простое, не отражающее его содержимое, но передающее. Суть, а суть блока, решение задачи или Солюшен и, как всегда, начинаем с описания минимального набора переменных по условию задачи. У нас есть 2 дискретных входа, которые управляют. Направлением движения, поэтому 2-1 входными переменными будут сигналы запуска движения влево и вправо и переменных булиан. Еще нам потребуется выделять передний и задний фронт этих. Сигналов, а также фиксировать статус запущенной последовательности. И так как эти значения требуется запоминать, создадим структуру с необходимыми переменными в статической памяти блока.

1:27 Всего необходимо создать 4 переменные типа Буллиа. Этого набора переменных нам пока хватит. 1 Нетворк будет отвечать за запуск и остановку генератора импульсов. Начнем программу с условия запуска движения влево. Выделяем передний фронт из сигнала запуска движения влево, используя специальный бит из созданной структуры, затем добавляем блокировку запуска. Если движение вправо уже запущена, как помним, движение влево невозможно, пока запущенное движение вправо.

2:05 Запуск и остановка движения по условию задачи осуществляется при подаче сигналов на 1 и тот же вход. То есть необходимо инвертировать в программе некий бит по? Внешнему сигналу инверсия бита пишется просто, но этот код важно выполнять только 1 раз по фронту сигнала, а все остальное время он должен игнорироваться, игнорировать. Код Инверсии я буду с помощью отрицательного перехода. То есть если в текущем цикле контроллера не зафиксирован фронт сигнала, программа будет обходить код инверсии? Если код инверсии не перепрыгивать, то бит будет инвертироваться дважды в начале по фронту, а на следующем цикле обратно из за оборванной логической цепочки.

2:49 Теперь необходимо проделать то же самое, но для сигнала запуска движения вправо, код активации движения вправо, фактически ничем не. Отличается от кода активации движения влево, но стоит помнить, что активация движения вправо происходит по заднему фронту и невозможно при. Уже запущенном движении влево теперь добавим в этот нетворк наш целевой блок. То есть блок генератора импульсов блок сейчас нам нужен? Чтобы держать перед собой список необходимых данных, которые нам нужно для него сформировать. У данного блока есть 3 входные переменные. Сигнал старт, ссылка на таймер и параметры интервала, и 1 выходная, возвращающая нам импульсы с заданным интервалом все входные и выходные. Переменные блока удобно собрать в 1 структуру, чтоб потом с ней и работать начнем эту структуру со сигнала, старт мы уже написали. Условия запуска движения влево и вправо. Теперь давайте сформируем из них 1 условие запуска генератора, генератор запускается в обоих. случаях, поэтому собираем сигнал запуска, используя простое условие или результат, записываем сигнал, старт из структуры генератора.

4:01 И этот же сигнал передаем на вход запуска вызываемого блока ФЦ 1. На следующий вход генератора импульсов нужно передать ссылку на таймер, давайте для этого добавим. Входную переменную соответствующего типа таймер для блока Солюшен. В будущем при необходимости это позволит реализовать несколько решений с разными условиями.

4:28 Создав и подписав входную переменную передаем ее на вход блока в ц 1 в качестве таймера. Вот незадача у нас ошибка блоков ц, 1 почему то не хочет воспринимать ссылку и выделяет это поле красным? Все типы данных я ввел правильно, но мы все равно видим сообщение о несоответствии типов, хотя если чуть выше. В новой строчке попытаться написать код, использующий эту переменную в качестве таймера. То все будет хорошо, и никаких ошибок не зафиксируется. В связи с этим у меня 2 замечания во 1, к сожалению, мы столкнулись. С ограничениями, которые есть у данной платформы, а во 2, к счастью, об эти данные ограничения не так уж и сложно для этого. Отправляемся обратно в блок генератор импульсов и изменим тип входной переменный таймер. На целочисленный тип инт, это нужно, чтобы воспользоваться косвенной адресацией для указания ссылки на нужный нам таймер. Также я немного подправлю описание, поскольку теперь переменная хранит только номер таймера.

5:30 С косвенной адресацией важно помнить, что существует 2 формата указателя формат указателя в виде 1 слова. Подразумевает указание на некоторый вычисляемый номер программного блока этот формат. Состоит из 16 бит, который интерпретируется как целое число. Фактически такой формат используется как указатель на номер таймера счетчика блока данных функции или функционального блока.

6:02 А вот указатель в форме двойного слова содержит указатель на байт и бит памяти, к которой необходимо получить доступ в этом формате. Указатель состоит из 32 бит, где биты. С 3 по 18 хранят номер Байта, а биты с нулевого по 2 интерпретируется как номер бита в указанном байте формат записи указателя. Вы видите на экране здесь пи от слова. Пойнтер указатель и после знака решетки указывается номер байта и номер бита таким образом если программист хочет обратиться например к меркеру м 30.0 через указатель. В формате двойного слова, то он должен сначала загрузить в память число 30, затем сдвинуть его влево на 3 бита и только после этого использовать его в качестве указателя.

6:55 Входная переменная таймер типа ИНТ выступает указателем в формате 1 слова, но использовать ее напрямую мы тоже не можем из за ограничений, чтобы обойти эти. Ограничения необходимо создать дополнительную временную переменную типа ИНД, в которую необходимо переписывать значение из входной переменной с номером. Таймера в шапке текущего блока создаем новую временную переменную таймер с нижним подчеркиванием, чтобы не путать с входной переменной с тем же названием. А теперь над тестовым примером с командой из Ди напишем 2 строки. 1 Загружает данные из входной переменной, а 2 записывает эти данные во временную.

7:38 После этого, если в записи команды СД вместо входной переменной использовать временную ошибка пропадет. Что означает, что пример записан корректно? Разобравшись со способом записи, удаляем уже ненужный пример и переходим к редактированию кода блока генератора импульса. Напоминаю, что сейчас код должен использовать таймер. Обращаясь к нему с помощью косвенной адресации и указателя в формате 1 слова в качестве указателя используется естественно временная переменная таймер после внесения всех. Изменений в код блока ФЦ 1 необходимо убедиться, что мы ничего не сломали. Для этого вернемся в блок об 1, где все еще есть код для проверки генератора импульсов через счетчик. Как видим, блок ФЦ 1 выделяется красным, так как мы изменили тип 1 входной переменной. Чтобы устранить несоответствие, необходимо обновить вызов блока генератора через контекстное. Меню естественно на вход блока, теперь нужно передавать не ссылку на таймер, а всего лишь номер. То есть цифру 1 давайте загрузим в ПК измененный блок генератора импульсов ФЦ? 1 И блок главного цикла программы Об 1, чтобы проверить, как работает новая программа с косвенной адресацией. После полной загрузки открываем симулятор и активируем генератор. Импульсов через Меркер м, 0 0 как видим, все работает точно так же, как и до изменения программы ФЦ. 1 Счетчик ц 1 увеличивает свое значение с каждым новым импульсом генератора. И тут же можно увидеть, что используется именно таймер с номером 1, как мы и хотели. Теперь необходимо, вернувшись блока в 1 изменить тип входной переменной таймер на тип Инд.

9:20 Не забудем для соблюдения выбранного стиля программы добавить поле таймер в структуру генератора. Тип данного поля тоже выбираем инт. Затем после кода по формированию сигнала запуска пишем 2 строки для переноса данных из входной переменной таймер. Такую же переменную структуры генератора, которую мы только что создали. И наконец передаем значение переменной таймер и структуры на вход блока ст. 1 Таким образом, при решении небольшой проблемы с передачей ссылки на таймер. Мы познакомились с косвенной адресацией в языке ст. или далее нам эти знания еще. Пригодятся, а тем временем нам необходимо написать код для выбора интервала между сдвигами. Добавим 2 новые входные, переменные, через которые будем задавать интервалы для движения влево и вправо. Типом этих 2 переменных будет с 5 тайн.

10:29 Написание алгоритма выбора интервалов начнем загрузки этих значений в память лот интервал Лефт Муф и Лоуд интервал Райт МУВ. Итогом работы алгоритма будет использование 1 из этих значений, а это значит, что нам необходимо. Создать итоговое хранилище переменную, которую мы потом передадим на вход блока ФЦ 1. Поэтому вновь возвращаемся к структуре генератора и добавляем новую переменную интервал и тут же используем ее в программе трансфер. Генератор интервал перед нами скелет программы. Теперь нам необходимо в зависимости от входящих условий выбрать нужный интервал. Если выбрано движение влево, берем интервал лифт, если активировано движение вправо, берем интервал. Райт, если не активировано движение влево и вправо, то нам необходимо загрузить переменную интервал саму в себя. Но поскольку переменная интервала это временная переменная, то таким образом мы просто обнуляем интервал таким. образом мы имеем 3 возможные значения интервала, установим метку. 0 3 На командный трансфер на эту метку будет переходить выполняемое условие, чтобы предотвратить выполнение других условий при выполнении условия движения. Влево или движения вправо мы будем переходить на эту метку, используя команду условного перехода. Таким образом, при активации движения влево программа по условному переходу сразу выгрузит интервал движения влево в переменную. Генератора, не выполняя загрузку других данных. Если же движение влево не активно, то в память попадет интервал движения вправо, но если движение вправо также не активно, то переменная генератора перезапишется сама в себя код. Выбора интервала готов и итоговую переменную передаем на вход блока овцы. 1 Нам осталось только где то сохранить импульс генератора для этого допишем переменную импульс в структуре и перемены, естественно, укажем Буллиан.

12:32 Я также ты и такую структуру, чтобы она занимала меньше места в памяти. Я размещу обе булевые, переменные рядом, так как даже под 1 переменную этого типа система выделяет 2 Байта памяти. Наконец заполним последнюю входную переменную блока генератора. Импульсов и перейдем к программированию следующего блока программы, но перед этим нужно обновить вызов блока ФЦ, 1 также как мы делали в об 1. На всякий случай сохраняем программу, а после этого создаем новый нетворк, в котором напишем код сдвига с памятью.

13:08 1 Делом вызываем наш блок цикличного сдвига, который мы создали в 1 части. По примеру, с блоком генератора импульса создадим новую структуру в области временных переменных, которая будет описывать все входные переменные данного блока. Как мы уже убедились, такой подход удобен и облегчает формирование необходимых значений. После создания структуры я сразу же передам все ее переменные на соответствующие входы блока ФЦ 2. Теперь перед вызовом блока добавим код, формирующий входные значения 1 делом. Импульс генератора передадим на вход души.

13:51 Затем сформируем сигнал направления движения. Тут все просто, если не активно движение влево, но активное движение вправо, то значение равно единицы во всех остальных случаях равно 0 по условию задачи у каждой. Программы движения есть своя независимая память, то есть мы должны работать с определенной ячейкой памяти в зависимости от того, какая программа запущена в данный момент память программы опишем в виде новой. Структуры в статической области переменных текущего блока данная структура будет состоять из 2 переменных типа Байт по 1 на каждую программу движения байт 1 для программы движения влево, а Байт 2 для программы. Движения вправо, соответственно, поскольку программа должна переключаться между ними, нам также потребуется, где то хранить указатель на текущий байт. Поэтому в ту же структуру добавим еще 1 переменную пойнтер. Типа инт указатель находится в начале структуры. Таким образом, Байт 1 будет находиться в 3 байке структуры, так как тип Инд занимает сразу 2 Байта. Это важно понимать так, как это смещение нам нужно будет учитывать. Программа выбора ячейки памяти начинается с сохранения в адресный регистр указателя на структуру памяти программы. Загрузка в адресный регистр осуществляется командой ЛАР 1 перед выполнением этой команды. В аккумулятор 1 помещается указатель в формате двойного слова с помощью специальной записи п. Решетка, после которой указывается имя локальной структуры или переменной следом мы должны написать программу. Выбора отличие тут только в том, что мы будем загружать не значение входных переменных, а всего лишь номер необходимого Байта памяти. Результат этой программы помещается в указатель структуры памяти программы.

15:44 Поскольку 1 2 Байта структуры заняты указателем, 1 Байт памяти находится со сдвигом на 2 Байта относительно начала этой структуры. А 2 Байт со сдвигом на 3 Байта именно поэтому перед вычислением указателя на Байт памяти. Нам необходимо увеличить указатель на 1 после этого получившееся значение, необходимо сдвинуть на 3 Байта влево. Согласно формату записи указателя в формате двойного слова, и уже после этого готовое смещение прибавляется к. Адресному регистру, 1 в котором хранится указатель на начало структуры памяти программы с помощью команды, + а Р. 1 используя адресный регистр и косвенную адресацию. Теперь мы можем обратиться к внутреннему Байту программы. Солюшен квадратная скобка специальной записи написаны указатель на начало памяти и через забитую смещения относительно указанного начала. В данном случае подобная запись не обязательна, и ее можно упростить, но оптимизацией. Мы займемся позже, значение загруженное по указателю через косвенную адресацию. Мы переписываем специальную переменную шрифт байт, которая потом передается на ин Аут вход блока ФЦ 2 после того, как под программа цикличного. Сдвига выполнить свою операцию, нам необходимо получившиеся значения, записать обратно выбранную ячейку памяти с помощью всего того же адресного регистра. Аир, 1 для записи значения используется тот же способ записи, адреса. Памяти, что и при загрузке перед блоком овца 2 еще нужно не забыть передать результат в последней операции на выход блока. Солюшен в виде результирующего Байта, но перед этим необходимо, собственно, создать выходную переменную. Для этого снова отправляемся в заголовок блока и в области Аутпут создаем необходимую переменную Аутбайт типа, Байт. И после этого можно смело заканчивать программу блока Солюшн записью текущего значения в эту переменную.

17:46 Но перед тем, как приступать к проверке работы всей программы, необходимо указать начальные значения для ячеек памяти программы. Так как Байт номер 1 отвечает за программу движения влево, его значением по умолчанию будет единица в нулевом. Бите, а для Байта номер, 2 который хранит состояние движения вправо, значением по умолчанию, укажем единицу в 7 бите. Для удобства я записал оба значения в двоичном формате, на этом все блок решения задачи готов и можно приступать к 3.

18:16 Тестированию сохраняем блок ФБ 1 и переходим в программу главного цикла. Об 1 здесь отключаем режим онлайн и удаляем весь код, который тут есть в 1 нетворк, переносим блоков в 1 соглашаемся. На создание таблицы данных для него и заполняем все его входные и выходные поля. Напомню, что за активацию движения влево отвечает вход контролера и 0 0 за движение вправо, вход. И 0 1 а результат должен проецироваться на выходной, Байт Кью Би. 0 Также, согласно условию, движение влево идет с интервалом в 1 секунду, а движение вправо с интервалом в 5 секунд для. Генерации импульсов будем использовать таймер номер 1. Программа готова к тестированию, поэтому сохраняем ее и выполняем полную загрузку программных блоков, чтобы ничего не забыть.

19:07 После загрузки программы в контроллер переключаем об 1 в режим онлайн просмотра и переходим на окно симулятора. Тут мы с помощью подачи сигналов на вход и 0, 0 или и 0 1 можем запускать выполнение нашей программы. Результат работы отражается на состоянии выходного Байта Кью Би. 0 Как видим, программа работает именно так, как. Требуется в условии задачи. Движение влево запускается и останавливается по переднему фронту, 1 входного бита, а движение права по заднему фронту. 2 При этом запустить 1 программу невозможно, пока работает другая и. Наоборот, на данном этапе я считаю задачу полностью выполненной, так как она полностью удовлетворяет всем поставленным условиям в следующем видео. Я немного оптимизирую программу, я сделаю так, что блок цикличного. Сдвигабайта позволит смещаться на любое количество бит без потери информации, а также внесу ряд других изменений, которые никак не повлияют на ее функционал. А на сегодня все спасибо за просмотр и всего хорошего.

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

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

Войти

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

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

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

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