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

в 15:04, , рубрики: plc, sidel, Siemens plc, Siemens 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 и ищем адрес нашего выхода, который и станет отправной точкой для разбора кода.

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

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

Первые условия были весьма простые, включаем Q15.0 если активно M185.0, а M185.0 включаем если активно M59.6:

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

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

Активация метки M59.6
Активация метки M59.6
  1. Смотрим Network 3. Метка 59.6 активируется в тот момент, когда слово данных DB2.DBW80 достигает значения 240

  2. DB2.DBW80 записывается в Network 1 и происходит это по правилам условного перехода:

    1. Если активно M59.2 и не активно M59.6, то в каждом такте увеличиваем значение DB2.DBW80 на значение MW500

    2. Иначе, если активно 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
Таблица ссылок для М70.3

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

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

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

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

Укрощение строптивого или Reverse Engineering французского паллетайзера на Simatic S7-300 - 9
  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://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js