Укрощение строптивого или Reverse Engineering французского паллетайзера на Simatic S7-300 — АСУ ТП: сообщество инженеров

Укрощение строптивого или Reverse Engineering французского паллетайзера на Simatic S7-300

Как возникла задача и общее её описание

Однажды обратился ко мне директор местного производства одного всемирного производителя напитков. Так случилось, что он в течение года добивался от штатных экспертов выполнения ряда задач, но профессионалы с опытом убеждали менеджера, что выполнение данных задач невозможно в принципе. В целом задача была предельно понятна: поменять шаблон укладки кейсов в паллетайзере, чтобы повысить прочность «конструкции».

Внезапно: Исходников программного обеспечения и электрической документации нет уже лет 5.

Итак, сущность проблемы была проста как мир. Имеется технологическая машина — паллетайзер, в которой:

  • Одним рядом заходят ориентированные кейсы с продукцией и фиксируются оптическим дачиком
  • Каждый из кейсов на входе может быть повёрнут на 90° лопаткой разворачивателя
  • Каждый из кейсов может быть остановлен ограничителем: всего ограничителей 6шт. в различных положениях.
  • После формирования ряда срабатывает толкатель, который сдвигает этот ряд на площадку формирования слоя
  • Повторяем набор необходимых рядов до момента, пока не сформируется слой
  • Cлой сдвигается толкателем на «лифт», переносящий его на паллет
  • Повторяем формирование слоёв в заданном количестве. Слой может быть чётным и нечётным, с разной раскладкой.
Упрощенная схема работы паллетайзера, вид сверху

В сухом остатке:

  1. Паллет, состоящий из 4-5 слоев
  2. Слой, состоящий из 3-4 рядов
  3. Ряд, состоящий из 1-6 кейсов, каждый из которых может быть повёрнут или остановлен ограничителем

Меня интересовал сам слой, а точнее две его версии: чётная и нечетная. Если хорошо учиться в школе до 7 класса включительно, то можно проглядеть параллель между видом слоя и математической матрицей, где повёрнутый кейс — это 1, а зашедший без поворота — это 0.

Соответственно, предположил, что где то в коде ПЛК должен быть счётчик кейсов, регистр сдвига и «шаблон укладки»(та самая матрица), которые мне предстояло найти.

Ищем волшебный «шаблон»

Я прекрасно отдаю себе отчёт в том, что данную задачу смогут выполнить многие из читающих, но для конечных пользователей это оказалось действительно чудом, которое они ждали год и платили людям за это зарплату(вполне хорошую по меркам региона)

На момент начала работ я знаю следующее:

  1. Системой управляет ПЛК SImatic S7-300
  2. По машине раскидано 6 Profibus-DP модулей распределённого ввода-вывода IM151 разных конфигураций а также 13 частотников Danfoss работающих в той же шине.
  3. На большинстве кабелей сохранилась маркировка, что позволяет мне отследить куда они идут
  4. Есть backup программы ПЛК(разумеется без комментариев, алиасов и тд)
  5. Машина постоянно в работе, поэтому её нельзя остановить и поиграться с датчиками и исполнительными устройствами
  6. Существует 7 рецептов формирования паллет под разные продукты(выбираются с экрана)

Сначала я допустил, что ограничители мы не используем(отключили) и ориентировался только на разворот кейсов. Повторюсь, я предположил, что есть некая «матрица»(читай: блок данных в энергонезависимой памяти)в которой хранятся нули и единицы, управляющие лопаткой, разворачивающей кейсы. С этой лопатки поиск и начнём.

Быстрая пробежка по маркировке от соленоида лопатки по кабелям привела меня к одной из планок IM151, с выхода которой данная лопатка и активировалась, а конкретно с выхода №0 модуля дискретных выходов 1595U0(см. фото ниже). Данный модуль имеет настроенный сетевой адрес #55, настроенный DIP-переключателями.

Собственно, кабель соленоида и модуль

Определив физическое соединение, мы идём в HW Config и ищем адрес нашего выхода, который и станет отправной точкой для разбора кода.

Там мы видим, что это выход Q15.0. С этим огромным успехом мы идём в таблицу ссылок Reference Data, где и смотрим по каким же условиям срабатывает данный выход.Первые условия были весьма простые, включаем Q15.0 если активно M185.0, а M185.0 включаем если активно M59.6:

И тут мы попадаем на активацию метки M59.6. На первый взгляд это несколько запутанно, но всё на самом деле довольно просто

  1. Смотрим Network 3. Метка 59.6 активируется в тот момент, когда слово данных DB2.DBW80 достигает значения 240
  2. DB2.DBW80 записывается в Network 1 и происходит это по правилам условного перехода:Если активно M59.2 и не активно M59.6, то в каждом такте увеличиваем значение DB2.DBW80 на значение MW500Иначе, если активно M59.6, то пишем в DB2.DBW80 значение 0(сбрасываем)Небольшое разъяснение — в данной программе MW500 — не что иное, как счетчик тактов длиной в 1мс, поэтому понимаем Network 3 так:Если M59.6 неактивно И М59.2 активно в течение 240мс(суть таймер TON по 2-м условиям), включаем M59.6
  3. Последним неизвестным остаётся М59.2, которая активируется в Network 2. Поскольку здесь условий несколько, то я поступил весьма просто: посмотрел в онлайн, какие метки горят постоянно, а какая мигает при прохождении нового кейса и увидел, что за срабатывание лопатки отвечает M70.3

Идем в таблицу ссылок и видим интересную картину — M70.3 нигде не записывается, а только считывается:

Таблица ссылок для М70.3

Но это не значит, что в программе ошибка, а значит только лишь что данная метка записывается в составе целого слова, нажимаем на данную метку в таблице ссылок ПКМ и выбираем Cross-References for Address и видим это самое слово

Слово данных MW69, включающее в себя метку М70.3

Проваливаемся по адресу записи этого слова и находим то самое, что тешит моё самолюбие что и предполагалось. Функцию сдвига, счётчик и ссылку на «шаблон».

А теперь по порядку:

  1. Мы прибавляем к значению DB2.DBW2 значение 100 и пишем это в MW150, после чего открываем DB с этим номером. Поскольку ссылка на блок данных переменная, то я предположил, что DB2.DBW2 не что иное, как номер рецепта, который мы получаем с HMI. И, выбрав другой рецепт на экране — я в этом убедился.Т.е. каждому рецепту соответствует свой «шаблон» (блок данных) с номером DB[100+N], где N — номер рецепта
  2. В качестве счётчика прошедших кейсов используется C6, значение которого мы пишем в MW150 и, сдвинув на 4 бита влево переписываем в MD150.Пример: имея в счетчике C6 значение 0005h, мы сдвигаем его на 4 бита и получаем 0050h, что соответствует указателю +5.0 на double word
  3. Ну, и, в конце концов, мы загружаем значение double word c текущим указателем, соответствующим счётчику MW150 в word слова MW69 и MW70, откуда в конце концов и активируется так нужный нам бит M70.3

Как формируется матрица укладки

Итак, определившись, где хранятся данные о укладке кейсов на паллет мы разбираем матрицу для нужного нам рецепта. Открываем DB102(рецепт 2) и видим следующее:

Собственно, слово +0.0 мы не учитываем, потому что счётчик при первом прохождении кейса уже >0. Разбираем шаблон сравнивая с реальной укладкой и обращаем внимание на следующие закономерности:

  • Разворачивается кейс битом 3 младшего слова данных(M70.3)
  • Конец каждого ряда обозначается битом 0 младшего слова данных(M70.0)
  • Конец каждого слоя обозначается битом 1 младшего слова данных(M70.1)
  • Конец всего шаблона обозначается битом 5 младшего слова данных(M70.5)

Комбинируя данные биты мы получаем нужные слова для записи в шаблон, например:

8h(b1000) — только разворот кейса

9h(b1001) — разворот кейса и конец ряда

Bh(b1011) — разворот кейса, конец ряда и конец слоя

22h(b00100010) — конец слоя и конец шаблона

В общем и целом, задача была решена и теперь я точно знал как изменить шаблон укладки, но потом пришел заказчик.

Мы подумали, и у нас тут маленькие изменения…

Чисто технически, они ничего не меняли, но необходимый шаблон выглядел так:

Самые внимательные читатели однозначно заметили тот факт, что в ряде #2 обоих слоёв всего 3 кейса и между ними пространство, которое должно быть выдержано для того, чтобы туда вошел кейс #2(11).

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

Сначала я допустил, что ограничители мы не используем(отключили) и ориентировался только на разворот кейсов.

В принципе, есть полная ясность о том, как это работает, осталось только найти где это записано. Как говорится, у нас был какой-то план и мы его придерживались. Ищем матрицу, которая отвечает за работу ограничителей.

Я опущу все повторяемые действия с обратным поиском от физических выходов к меткам, и лишь скажу, что за работу ограничителей на выходах Q15.1-Q15.7 отвечают биты слова MW68, по аналогии с тем как работает лопатка разворота. Ну и записан шаблон для срабатывания ограничителей в том же DB, начиная с указателя +200.0 и далее.

Шаблон срабатывания ограничителей

Здесь логика оказалась куда проще:

  • Ограничитель 1 — бит 0 младшего слова данных(M68.0)
  • Ограничитель 6 — бит 5 младшего слова данных(M68.5)

Я определился с тем что в новой раскладке мне необходимо выставлять ограничитель 3 перед кейсом 6 в нечетном слое и ограничитель 5 перед кейсом 8 в чётном.

Итоги

Составлено две матрицы следующего содержания:

Новый шаблон укладки, включая ограничители

И программа заменена прямо в процессе работы после окончания предыдущего паллета:

В результате изменений, конструкция стала устойчивой, а паллет стал формироваться быстрее и ровнее. Линия стала работать на 4% продуктивнее, что для такого производства хорошее изменение.

Источник: https://habr.com/ru/post/567566/

🔗 Укрощение строптивого или Reverse Engineering французского паллетайзера на Simatic S7-300

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

Войти

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

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

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

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