[Программирование, Промышленное программирование, Инженерные системы] Укрощение строптивого или Reverse Engineering французского паллетайзера на Simatic S7-300

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
14-Июл-2021 01:31


Внешний вид паллетоукладочной машиныКак возникла задача и общее её описаниеОднажды обратился ко мне директор местного производства одного всемирного производителя напитков. Так случилось, что он в течение года добивался от штатных экспертов выполнения ряда задач, но профессионалы с опытом убеждали менеджера, что выполнение данных задач невозможно в принципе. В целом задача была предельно понятна: поменять шаблон укладки кейсов в паллетайзере, чтобы повысить прочность "конструкции".Внезапно: Исходников программного обеспечения и электрической документации нет уже лет 5. Итак, сущность проблемы была проста как мир. Имеется технологическая машина - паллетайзер, в которой:
  • Одним рядом заходят ориентированные кейсы с продукцией и фиксируются оптическим дачиком
  • Каждый из кейсов на входе может быть повёрнут на 90° лопаткой разворачивателя
  • Каждый из кейсов может быть остановлен ограничителем: всего ограничителей 6шт. в различных положениях.
  • После формирования ряда срабатывает толкатель, который сдвигает этот ряд на площадку формирования слоя
  • Повторяем набор необходимых рядов до момента, пока не сформируется слой
  • Cлой сдвигается толкателем на "лифт", переносящий его на паллет
  • Повторяем формирование слоёв в заданном количестве. Слой может быть чётным и нечётным, с разной раскладкой.
    Упрощенная схема работы паллетайзера, вид сверху
В сухом остатке:
  • Паллет, состоящий из 4-5 слоев
  • Слой, состоящий из 3-4 рядов
  • Ряд, состоящий из 1-6 кейсов, каждый из которых может быть повёрнут или остановлен ограничителем
Меня интересовал сам слой, а точнее две его версии: чётная и нечетная. Если хорошо учиться в школе до 7 класса включительно, то можно проглядеть параллель между видом слоя и математической матрицей, где повёрнутый кейс - это 1, а зашедший без поворота - это 0. Соответственно, предположил, что где то в коде ПЛК должен быть счётчик кейсов, регистр сдвига и "шаблон укладки"(та самая матрица), которые мне предстояло найти.Ищем волшебный "шаблон"Я прекрасно отдаю себе отчёт в том, что данную задачу смогут выполнить многие из читающих, но для конечных пользователей это оказалось действительно чудом, которое они ждали год и платили людям за это зарплату(вполне хорошую по меркам региона)На момент начала работ я знаю следующее:
  • Системой управляет ПЛК SImatic S7-300
  • По машине раскидано 6 Profibus-DP модулей распределённого ввода-вывода IM151 разных конфигураций а также 13 частотников Danfoss работающих в той же шине.
  • На большинстве кабелей сохранилась маркировка, что позволяет мне отследить куда они идут
  • Есть backup программы ПЛК(разумеется без комментариев, алиасов и тд)
  • Машина постоянно в работе, поэтому её нельзя остановить и поиграться с датчиками и исполнительными устройствами
  • Существует 7 рецептов формирования паллет под разные продукты(выбираются с экрана)
Сначала я допустил, что ограничители мы не используем(отключили) и ориентировался только на разворот кейсов. Повторюсь, я предположил, что есть некая "матрица"(читай: блок данных в энергонезависимой памяти)в которой хранятся нули и единицы, управляющие лопаткой, разворачивающей кейсы. С этой лопатки поиск и начнём.Быстрая пробежка по маркировке от соленойда лопатки по кабелям привела меня к одной из планок IM151, с выхода которой данная лопатка и активировалась, а конкретно с выхода №0 модуля дискретных выходов 1595U0(см. фото ниже). Данный модуль имеет настроенный сетевой адрес #55, настроенный DIP-переключателями.
Собственно, кабель соленоида и модульОпределив физическое соединение, мы идём в HW Config и ищем адрес нашего выхода, который и станет отправной точкой для разбора кода.
Там мы видим, что это выход Q15.0. С этим огромным успехом мы идём в таблицу ссылок Reference Data, где и смотрим по каким же условиям срабатывает данный выход.Первые условия были весьма простые, включаем Q15.0 если активно M185.0, а M185.0 включаем если активно M59.6:
И тут мы попадаем на активацию метки M59.6. На первый взгляд это несколько запутанно, но всё на самом деле довольно просто
Активация метки M59.6
  • Смотрим Network 3. Метка 59.6 активируется в тот момент, когда слово данных DB2.DBW80 достигает значения 240
  • 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
  • Последним неизвестным остаётся М59.2, которая активируется в Network 2. Поскольку здесь условий несколько, то я поступил весьма просто: посмотрел в онлайн, какие метки горят постоянно, а какая мигает при прохождении нового кейса и увидел, что за срабатывание лопатки отвечает M70.3
Идем в таблицу ссылок и видим интересную картину - M70.3 нигде не записывается, а только считывается:
Таблица ссылок для М70.3Но это не значит, что в программе ошибка, а значит только лишь что данная метка записывается в составе целого слова, нажимаем на данную метку в таблице ссылок ПКМ и выбираем Cross-References for Address и видим это самое слово
Слово данных MW69, включающее в себя метку М70.3Проваливаемся по адресу записи этого слова и находим то самое, что тешит моё самолюбие что и предполагалось. Функцию сдвига, счётчик и ссылку на "шаблон". А теперь по порядку:
  • Мы прибавляем к значению DB2.DBW2 значение 100 и пишем это в MW150, после чего открываем DB с этим номером. Поскольку ссылка на блок данных переменная, то я предположил, что DB2.DBW2 не что иное, как номер рецепта, который мы получаем с HMI. И, выбрав другой рецепт на экране - я в этом убедился. Т.е. каждому рецепту соответствует свой "шаблон" (блок данных) с номером DB[100+N], где N - номер рецепта
  • В качестве счётчика прошедших кейсов используется C6, значение которого мы пишем в MW150 и, сдвинув на 4 бита влево переписываем в MD150.Пример: имея в счетчике C6 значение 0005h, мы сдвигаем его на 4 бита и получаем 0050h, что соответствует указателю +5.0 на double word
  • Ну, и, в конце концов, мы загружаем значение 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% продуктивнее, что для такого производства хорошее изменение.Буду рад услышать ваши комментарии, истории разбора чужих программ или конструктивную критику. Всем спасибо!
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_programmirovanie (Программирование), #_promyshlennoe_programmirovanie (Промышленное программирование), #_inzhenernye_sistemy (Инженерные системы), #_plk (плк), #_siemens_s7300, #_siemens_plc, #_sidel, #_plc, #_programmirovanie_plk (программирование плк), #_programmirovanie (
Программирование
)
, #_promyshlennoe_programmirovanie (
Промышленное программирование
)
, #_inzhenernye_sistemy (
Инженерные системы
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 09:30
Часовой пояс: UTC + 5