Управление рецептами Allen-Bradley с массивами UDT и интерфейсом редактирования на HMI
Научитесь создавать редактирование рецептов на базе HMI для AB Logix 5000 с использованием массивов UDT и инструкций COP для постоянного хранения параметров.
Работа с рецептами на платформах Logix наиболее эффективна, когда HMI никогда не записывает данные напрямую в исторический массив. Надёжный шаблон использует три тега: Recipe_Storage как массив UDT длиной 50, Recipe_Display как один экземпляр UDT для экрана оператора и Recipe_Index как DINT, определяющий, какой сохранённый рецепт отображается в структуре отображения. Инструкции копирования (COP) перемещают данные при изменении индекса и повторно при сохранении, поэтому оператор всегда редактирует буфер-копию, а архив остаётся согласованным после циклов питания.
Монитор тегов Logix, показывающий Recipe_Storage[50], Recipe_Display и Recipe_Index, используемые для редактирования рецептов через HMI.
Определите UDT один раз, включив все необходимые процессу уставки — температуры, таймеры, скорости, коды продуктов и маски межблокировок, — а затем создайте Recipe_Storage как UDT[50]. Recipe_Display должен иметь точно такой же тип UDT, а не представлять собой набор слабо связанных атомарных тегов. Однородные типы упрощают расчёт длины COP и предотвращают незаметное усечение данных при последующем добавлении членов.
Ограничение индекса и путь загрузки
Ограничьте Recipe_Index включительно диапазоном от 0 до 49 до выполнения любой COP. Индекс без ограничения, полученный из объекта числового ввода, может вызвать ошибку COP или обратиться к неопределённой области памяти — в зависимости от того, как в проекте обрабатываются границы массива. При изменении Recipe_Index по переднему фронту (или при явном нажатии кнопки Load) скопируйте Recipe_Storage[Recipe_Index] в Recipe_Display. HMI должен обращаться только к членам Recipe_Display. Это единственное правило устраняет гонки, при которых два экрана записывают разные элементы массива, пока оператор продолжает изменять значения.
// Структура псевдокода
if Recipe_Index < 0 then Recipe_Index := 0;
if Recipe_Index > 49 then Recipe_Index := 49;
if IndexChanged or LoadPressed then
COP(Recipe_Storage[Recipe_Index], Recipe_Display, 1);
if SavePressed then
COP(Recipe_Display, Recipe_Storage[Recipe_Index], 1);
Экран рецептов HMI, обращающийся только к Recipe_Display; действия Load/Save запускают процедуры COP в контроллере.
Путь сохранения, хранение и поведение при загрузке проекта
При сохранении скопируйте Recipe_Display обратно в Recipe_Storage[Recipe_Index]. Поскольку Recipe_Storage находится среди тегов контроллера, значения сохраняются после отключения и включения питания, если проект настроен на обычное сохранение тегов. Данные также сохраняются при загрузке проекта, если выбрать сохранение значений тегов; считайте этот флажок частью стандартной операционной процедуры работы с рецептами, а не необязным удобством. Операторы должны понимать, что загрузка проекта с включённым параметром «reinitialize tags» сотрёт тщательно настроенные рецепты, если не существует резервной копии вне контроллера.
К рабочим процессам импорта CSV следует относиться скептически. Многие утилиты HMI или Excel-to-tag создают имена тегов, но ненадёжно обновляют значения членов вложенных UDT, особенно если заголовки столбцов отличаются от имён членов UDT. Предпочтительнее использовать явную процедуру импорта с проверкой каждого поля либо повторно загружать проверенный экспорт L5X/тегов после массового редактирования. Не следует считать, что зелёный баннер «импорт завершён» означает, что Recipe_Storage[n].Setpoint теперь равен значению ячейки электронной таблицы.
| Тег | Тип | Привязка к HMI? | Назначение |
|---|---|---|---|
| Recipe_Storage | UDT[50] | Нет | Энергонезависимый архив рецептов |
| Recipe_Display | UDT | Только да | Буфер редактирования оператора |
| Recipe_Index | DINT | Да (селектор) | Активный слот 0–49 |
Рекомендации по интерфейсу HMI
- Предусмотрите дискретные кнопки Load и Save с импульсной активацией, обрабатываемые в контроллере, а не прямую запись в массив с панели.
- Отображайте ограниченный индекс и доступное только для чтения поле «сохранённое имя», скопированное из UDT отображения, чтобы оператор мог подтвердить активный слот.
- Запрещайте Save, пока машина работает в цикле, если члены рецепта влияют на уставки движения или температуры в середине партии.
- Регистрируйте события Save вместе с идентификатором оператора и индексом для обеспечения прослеживаемости на регулируемых производственных линиях.
Проверка границ индекса и сохранения при загрузке проекта
Проверьте работу, загрузив слот 0, изменив контрольное значение в Recipe_Display, сохранив его, переключив индекс на 1, а затем вернувшись к 0 и снова выполнив загрузку. Контрольное значение должно появиться снова только в том случае, если Save действительно выполнилась. Выполните перезапуск контроллера и убедитесь, что Recipe_Storage по-прежнему содержит это значение. Введите с HMI индекс за пределами диапазона и проверьте ограничение. Выполните импорт CSV в резервной системе и сравните содержимое каждого члена с файлом, прежде чем использовать этот путь в производстве.
Не привязывайте панель к Recipe_Storage[Recipe_Index].Member. Косвенная адресация HMI к массивам сложнее для аудита и может привести к записи не в тот слот, если тег индекса и экран обновляются с разной частотой. Шаблон с Display UDT легко масштабируется при последующем расширении UDT, добавлении уровней безопасности или переносе той же модели рецептов между несколькими ячейками систем PLC и PAC, использующими общий рабочий процесс оператора.
Об авторе
Mark Townsend | Ведущий инженер по автоматизации — системы Allen-Bradley
Mark Townsend — ведущий инженер по автоматизации с более чем 18-летним опытом работы с платформами Allen-Bradley, включая ControlLogix, CompactLogix и устаревшие SLC-500. В его повседневную работу входят разработка логики RSLogix / Studio 5000 и запуск HMI FactoryTalk View на устаревающих и смешанных парках оборудования.