Учебный пример: насосная станция
В этом разделе последовательно создаётся структура небольшой насосной станции. Сначала опишем общие параметры насоса в шаблоне PumpBase, затем создадим два экземпляра — Pump1 и Pump2 — и разместим их в модели PumpStation1. Отдельные примеры покажут, как расширить шаблон наследованием и объединить насосы в составной объект.
На снимках показан учебный проект TrainingStation в Studio. Имена можно использовать при повторении примера в своём учебном проекте. Для подключения к контроллеру используйте его карту переменных.
| Объект | Имя | Назначение |
|---|---|---|
| Шаблон | PumpBase | Общие тэги и настройки насоса. |
| Экземпляры | Pump1, Pump2 | Два отдельных насоса со своими значениями и привязками. |
| Модели | WaterSupply, PumpStation1 | Раздел «Водоснабжение» и вложенная насосная станция. |
| Наследник | PumpWithReserve | Вариант насоса с дополнительным признаком готовности резерва. |
| Составной шаблон | PumpGroup | Группа с вложенными насосами N1 и N2. |
Шаблон как описание оборудования
Шаблон предназначен для описания одного типа объекта. В него входят тэги, скрипты и графические символы, необходимые для работы этого типа. Например, у задвижки могут быть признаки открытого и закрытого положения, авария, режим управления, команда и символ корпуса.
Создайте шаблон, задайте имя и описание, затем добавьте тэги. Для каждого тэга укажите назначение сигнала в описании: оно отображается в подсказках и каталогах.
Имена тэгов, скриптов и символов внутри шаблона не должны пересекаться: все они участвуют в адресации через this. При проверке уникальности регистр не учитывается. Служебные слова языка и системные имена также нельзя назначать пользовательским объектам.
Пример: создание шаблона насоса
- Откройте раздел «Шаблоны». Нажмите «+» рядом с заголовком дерева или «Добавить шаблон» под деревом.
- Введите имя
PumpBaseи описание «Общие параметры насоса». В поле «Базовый шаблон» оставьте «Без базового шаблона». Не включайте признак абстрактного шаблона: в примере из PumpBase будут создаваться экземпляры. - Сохраните шаблон. Для последующего изменения имени, описания или базового шаблона откройте вкладку «Свойства» его рабочей области.
- Перейдите на вкладку «Теги» и нажмите «+ Добавить». Создайте тэги из таблицы ниже, сохраняя каждый после заполнения.
| Имя | Тип в редакторе | Начальное значение | Описание |
|---|---|---|---|
| Pressure | Float | 2.4 | Давление после насосов; единица измерения — бар. |
| Running | Boolean | False | Насос работает. |
| StartCommand | Boolean | False | Команда запуска насоса. |
| RuntimeHours | Integer | 0 | Наработка насоса; единица измерения — ч. |
После сохранения в списке должны появиться четыре собственных тэга. Двойной щелчок по строке открывает его редактор. В примере настройки Pressure описаны ввод-вывод, масштабирование и история.
Наследование и собственные определения
Производный шаблон получает определения базового. Это удобно для семейства оборудования: общая логика задаётся в базовом шаблоне, а отличия — в производных. Изменения базового определения передаются наследникам. Разрешённые локальные переопределения сохраняются.
Во вкладках тэгов, скриптов и графики собственные объекты отделены от унаследованных. Унаследованный скрипт или символ можно открыть для просмотра либо перейти к его родительскому определению и редактировать там. Во втором случае изменяется источник, поэтому результат затронет и другие использующие его объекты.
Основные поля унаследованного тэга доступны только для чтения. У блоков I/O, истории, событий, аварий и масштабирования есть собственные правила переопределения. Закрытый замок запрещает изменения ниже по цепочке, открытый разрешает локальную настройку.
Пример: насос с дополнительным признаком
- Создайте шаблон
PumpWithReserve. В поле «Базовый шаблон» выберитеPumpBase. - Откройте его вкладку «Теги». Четыре тэга PumpBase уже присутствуют в разделе унаследованных — создавать их повторно не нужно.
- Добавьте собственный тэг
ReserveReadyтипа Boolean с начальным значением False и описанием «Резервный насос готов к включению». - Проверьте результат: ReserveReady находится над разделителем «Унаследованные тэги», а у Pressure, Running и остальных общих тэгов указан источник PumpBase.
Если требуется изменить общее описание Pressure для всех насосов, измените его в PumpBase. Если нужна индивидуальная настройка I/O у наследника или экземпляра, используйте разрешённое переопределение соответствующего блока.
Композиция и два вида имени
Композиция отвечает на вопрос «из чего состоит объект». Включение PumpBaseTemplate под локальным именем N1 означает отдельный насос внутри группы, а не наследование всей группы от насоса.
Имя определения шаблона уникально в проекте. Имя композиционного вхождения уникально внутри владельца и служит сегментом пути: this.N1.current. Эти имена независимы. Переименование определения шаблона не меняет локальные имена его композиционных вхождений.
В дереве наследования дополнительно показывается путь композиции. Это помогает различать определения N1 и N1_1, которые могут входить в разные группы под одинаковым локальным именем N1. При копировании композиции локальные имена сохраняются, чтобы относительные ссылки продолжали указывать на соответствующие объекты композиции; новые определения получают уникальные имена и сохраняют ссылки на исходные базовые шаблоны.
Пример: группа из двух насосов
- Создайте два шаблона
N1иN2, указав для каждого базовый шаблонPumpBase. Оба получат одинаковые общие тэги. - Создайте отдельный шаблон
PumpGroupбез базового шаблона и откройте вкладку «Вложенные шаблоны». - Найдите N1 и N2 в списке шаблонов проекта и добавьте каждый кнопкой «Вложить». Они появятся в составе группы с путями
this.N1иthis.N2. - В дереве слева переключитесь на «Композиция» и раскройте PumpGroup. Внутри должны быть N1 и N2. При переключении на «Наследование» эти определения показываются под PumpBase, поскольку именно от него они наследуют содержимое.
В скрипте PumpGroup обращение this.N1.Pressure означает давление первого насоса, а this.N2.Pressure — второго. При создании экземпляра группы дочерние экземпляры создаются автоматически. На снимке дерева моделей ниже экземпляр PumpGroup1 уже содержит оба насоса.
Экземпляры и модели
Создайте экземпляр нужного шаблона и назначьте его модели. Если в проекте выбрана модель по умолчанию, новые экземпляры направляются в неё автоматически. Для вложенных объектов композиции автоматически создаются дочерние экземпляры. Назначение другой модели выполняется для корневого экземпляра вместе со всей его группой.
У экземпляра могут быть собственные дополнения, но унаследованные определения по-прежнему принадлежат шаблону.
Модель также поддерживает собственные тэги, скрипты и символы. Для графики модели не требуется создавать фиктивный экземпляр.
Описание и отображаемое имя модели помогают строить понятные каталоги. В трендах полное описание тэга может складываться из описаний родительских групп, экземпляра и самого тэга. В имени задайте техническое обозначение объекта, в описании — его назначение.
Пример: размещение насосов в модели
- Откройте раздел «Модели» и нажмите «+». Создайте модель
WaterSupplyс описанием «Водоснабжение» на корневом уровне. - Создайте модель
PumpStation1с описанием «Насосная станция 1», выбрав WaterSupply родителем. При необходимости назначьте PumpStation1 моделью по умолчанию через её контекстное меню. - Вернитесь к шаблону PumpBase и создайте два экземпляра кнопкой «Создать экземпляр». Studio назначит свободные имена. Чтобы получить имена примера, выделите экземпляр в дереве, нажмите пробел, введите
Pump1илиPump2и подтвердите Enter. - Если модель по умолчанию не назначалась, откройте PumpStation1, перейдите на вкладку «Экземпляры» и нажмите «+ Добавить». Найдите и отметьте нужные экземпляры, затем нажмите «Добавить выбранные». Экземпляр также можно перенести мышью в модель в дереве.
- Для проверки композиции создайте экземпляр PumpGroup, назовите его
PumpGroup1и назначьте той же модели. Раскройте его строку: дочерние насосы должны находиться внутри группы.
В этом учебном примере Pump1 и Pump2 — самостоятельные экземпляры. Насосы внутри PumpGroup1 — другие, независимые экземпляры тех же базовых определений. Для реального оборудования выбирайте нужную структуру и не создавайте оба варианта для одного физического насоса без необходимости.
Проверьте результат: у Pump1 и Pump2 есть тэг Pressure, но значения и I/O-привязки настраиваются для каждого насоса отдельно. Для просмотра на узле назначьте корневую модель WaterSupply серверу приложений и загрузите проект. Далее графические символы экземпляров можно разместить в редакторе видеокадров.
Копирование ветки модели
Дублирование модели создаёт новую ветку на том же уровне: копируются дочерние модели, размещённые экземпляры и собственное содержимое. Новые объекты получают новые идентификаторы. Внутренние ссылки между копируемыми объектами перенаправляются на копии; внешние ссылки требуют отдельного внимания.
Если имя оканчивается числом, нумерация продолжает существующий ряд. При наличии Boiler1, Boiler2 и Boiler3 следующая копия получает следующий свободный номер после максимального. Это правило относится и к копируемым экземплярам.
После копирования настройте I/O-привязки копии на нужное оборудование. Проверьте адреса устройств и строковые выражения, которыми скрипты формируют I/O-ссылки.
Основные свойства тэга
Для каждого тэга задайте имя, тип, начальное значение, описание, единицу измерения и доступ. Тип должен соответствовать смыслу: BOOL — состояние, целый тип — счётчик или код, вещественный — измеряемая величина, STRING — текст.
Значение по умолчанию задаёт начальное состояние тэга. Для типа String введите обычный текст. В единицах измерения можно использовать обозначения °C, м³/ч, % и другие. Цветовые и числовые форматы отображения задаются отдельно в графике.
Индикаторы в списке тэгов показывают включённые возможности: ввод-вывод, сохранение, масштабирование, аварии и события. Они помогают быстро проверить полноту настройки, но подробности находятся в редакторе тэга.
Пример: настройка измерения давления
Предположим, что контроллер передаёт давление целым кодом от 0 до 10000, соответствующим диапазону 0…10 бар. В карте I/O-сервера PLC1 уже создана переменная Pressure. Подготовка карты описана в разделе ввода-вывода.
- Двойным щелчком откройте тэг Pressure в PumpBase. Укажите тип Float, единицу измерения «бар» и описание «Давление после насосов».
- В блоке ввода-вывода включите I/O, выберите направление «Только чтение» и переменную
PLC1.Pressure. Эта ссылка должна соответствовать реальной переменной подготовленной карты. - Включите масштабирование: исходный диапазон 0…10000, выходной диапазон 0…10. Тогда код 2400 будет отображаться как 2.4 бар.
- Включите запись истории. Для примера задайте дедбенд по значению 0.05 бар и принудительную запись раз в 60 секунд. Если поле интервала указано в миллисекундах, введите 60000.
- При необходимости включите аварию по качеству I/O с приоритетом 10. Она сообщит о недостоверности измерения при нарушении обмена.
- Сохраните настройки и вернитесь к списку тэгов. Значки справа от Pressure должны показывать включённые функции.
Для нескольких насосов задайте отдельную I/O-привязку Pressure у каждого экземпляра, если переопределение этого блока разрешено. После загрузки проекта проверьте в просмотре значений узла три контрольные точки: код 0 даёт 0 бар, 5000 — 5 бар, 10000 — 10 бар. Для появления записей в истории примените конфигурацию Historian и обновите Runtime.
Обмен, масштабирование, история и события
Ввод-вывод
Включите I/O, выберите направление и ссылку на переменную карты. В режиме раздельных ссылок чтение и запись могут обращаться к разным переменным. Для BOOL доступна инверсия; проверьте её действие на чтении и на разрешённых командах записи. Запрет записи на I/O-сервере действует и для скриптов, и для команд оператора.
Масштабирование
Укажите исходный диапазон и инженерный диапазон. Например, код 0…10000 может соответствовать 0…10 бар. Проверьте минимум, середину и максимум, а при записи — обратное преобразование. Единица измерения сама по себе значение не пересчитывает.
История
Включите запись нужных параметров и настройте условия фиксации. Дедбенд — порог изменения значения, при превышении которого формируется новая запись. Он сокращает число записей при небольших колебаниях. Принудительный интервал обеспечивает периодическую запись даже неизменного значения. После изменения конфигурации примените её к Historian и обновите Runtime.
События
Для дискретного состояния задайте тексты переходов. Событие описывает факт изменения, например «Насос запущен». События регистрируются без подтверждения оператором.
Аварии и плохое качество
Настройте условия аварии, приоритет и необходимые тексты. Числовые пределы должны соответствовать уже масштабированной величине, если в проекте используется инженерное представление. Различайте возникновение аварии, возврат в норму и подтверждение оператором: это разные переходы.
Для I/O-тэга можно включить аварию по качеству и задать её приоритет. Такая авария сообщает о недостоверности данных, а не о выходе технологического параметра за предел. Последнее значение может оставаться численно нормальным, хотя связь уже потеряна.
Для отображения недостоверных данных включите индикацию плохого качества в свойствах символа. Настройка этой индикации и настройка аварии выполняются отдельно.
Excel, дублирование и удаление
Во вкладке тэгов доступны экспорт и импорт Excel. Используйте выгруженный файл как образец колонок. Все настройки тэга расположены на одном листе; булевы настройки представлены числами 0 и 1. Сохраните текстовый формат идентификаторов и адресов, чтобы Excel не изменил их значения.
Перед импортом проверьте предлагаемые обновления существующих тэгов. При массовом изменении I/O, аварий или типов данных сначала проверьте импорт нескольких строк в копии проекта. После импорта просмотрите результат и обновите нужные узлы.
Дублирование создаёт независимый собственный тэг с новым именем. Удаление выполняется с подтверждением и показом найденных использований в скриптах. Даже после проверки статических ссылок оцените динамически сформированные имена: их смысл может зависеть от выполняемого кода.