Как возникла задача и общее её описание
Однажды обратился ко мне директор местного производства одного всемирного производителя напитков. Так случилось, что он в течение года добивался от штатных экспертов выполнения ряда задач, но профессионалы с опытом убеждали менеджера, что выполнение данных задач невозможно в принципе. В целом задача была предельно понятна: поменять шаблон укладки кейсов в паллетайзере, чтобы повысить прочность "конструкции".
Внезапно: Исходников программного обеспечения и электрической документации нет уже лет 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. На первый взгляд это несколько запутанно, но всё на самом деле довольно просто
-
Смотрим 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 нигде не записывается, а только считывается:
Но это не значит, что в программе ошибка, а значит только лишь что данная метка записывается в составе целого слова, нажимаем на данную метку в таблице ссылок ПКМ и выбираем Cross-References for Address и видим это самое слово
Проваливаемся по адресу записи этого слова и находим то самое, что тешит моё самолюбие что и предполагалось. Функцию сдвига, счётчик и ссылку на "шаблон".
А теперь по порядку:
-
Мы прибавляем к значению 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% продуктивнее, что для такого производства хорошее изменение.
Буду рад услышать ваши комментарии, истории разбора чужих программ или конструктивную критику.
Всем спасибо!
Автор: Вадим Долгов