Мы продолжаем изучать программирование ПЛК ОВЕН в универсальной среде программирования CoDeSys. В этой публикации описана структура проекта в CoDeSys. С предыдущей публикацией по программированию ПЛК можно ознакомиться здесь.
Рабочий цикл процессора
Программируемый логический контроллер (ПЛК) — это
программно управляемый дискретный автомат, имеющий некоторое множество входов, подключенных посредством датчиков к объекту управления, и множество выходов, подключенных к исполнительным устройствам. Он контролирует состояние входов и вырабатывает определенные последовательности программно заданных действий, отражающихся в изменении выходов.
Последовательности программно заданных действий в ПЛК – это программа, которая выполняется процессором. При написании программы необходимо понимать, что выполнение самой программы в ПЛК происходит циклически. Рабочий цикл любого процессора состоит из трех этапов:
- Загрузка в память состояния опрашиваемых входных модулей (чтение “входов”).
- Последовательная обработка состояний в соответствии с программой и запоминание промежуточных результатов (выполнение программы).
- Передача результатов вычислений в выходные модули (запись “выходов”).
Таким образом, работа программируемого контроллера происходит циклически с повторением рабочих циклов без дополнительных условий запуска. |
Структура проекта в CoDeSys
Исходный код программы для ПЛК входит в состав проекта, в состав которого также входят другие компоненты, такие как: переменные, ресурсы, библиотеки, элементы визуализации, функциональные блоки и др. На рисунке ниже представлена структура проекта в CoDeSys.
Рассмотрим компоненты проекта отдельно.
Компоненты организации программ (POU)
Компоненты организации программ (POU — Program Organization Unit) — компоненты, образующие код прикладного программного обеспечения ПЛК. Каждый компонент программы имеет собственное наименование, интерфейс и описание на одном из языков программирования. Именно на уровне POU можно совмещать различные языки программирования ПЛК (о видах языков программирования для ПЛК мы говорили ранее, также можно почитать здесь). Иными словами, вы можете создавать исходный код программы ПЛК с использованием различных языков, например, управление агрегатом описать на языке LD, а программу последовательного включения агрегатов технологического комплекса — на языке SFC.
POU являются базовыми элементами, из которых строится исходный код проекта. Один компонент может вызвать другие. Вызов самого себя (рекурсия) не разрешена. Отдельный компонент целиком реализуется на одном виде языка программирования (он выбирается при создании компонента и не может быть изменен в дальнейшем). При вызове компонента язык его реализации значения не имеет.
К POU относятся: программы, функции и функциональные блоки – все они во многом похожи, но имеют определенные особенности и различное назначение.
Одной из задач, решаемых компонентами, является локализация имен переменных. Область видимости локальных переменных определяется рамками одного компонента.
Реализации любого POU всегда должен предшествовать раздел объявлений. Объявления функции, функционального блока и программы начинаются соответственно с ключевых слов FUNCTION, FUNCTION_BLOCK и PROGRAM. За ним следует идентификатор (имя
компонента). Далее определяется интерфейс POU — перечень входных и выходных параметров.
К интерфейсу компонента относятся входы (блок VAR__INPUT), выходы (блок VAR__OUTPUT) и переменные типа вход-выход (блок VAR__IN_OUT). Завершают раздел объявлений локальные переменные (блок VAR). Необходимо отметить, что функции не могут иметь выходные (VAR__OUTPUT) и вход-выходные (VAR__IN_OUT) параметры — выходом функции служит единственная переменная,
совпадающая с именем функции, тип возвращаемого значения функции указывается при определении идентификатора через двоеточие.
Функция
В терминах CodeSys, функция — это программный компонент, отображающий множество значений входных параметров на выход. Функция всегда возвращает только одно значение. При объявлении функции указывается тип возвращаемого значения, имя функции и список входных параметров. Вызов функции производится по имени с указанием значений входных параметров. Функция может использоваться в математических выражениях наряду с операторами и переменными.
Тип функции (тип возвращаемого значения) может быть любым из числа стандартных типов данных или типов созданных пользователем. Тело функции может быть описано на любом языке, кроме SFC. Из функции можно вызывать библиотечные функции и другие функции текущего проекта.
Функциональный блок
Функциональный блок — программный компонент, отображающий множество значений входных параметров на множество выходных. После выполнения экземпляра функционального блока все его переменные сохраняются до следующего выполнения. Следовательно, функциональный блок, вызываемый с одними и теми же входными параметрами, может производить различные выходные значения. Сохраняются все переменные, включая входные и выходные. Таким образом, если экземпляр функционального блока будет вызван, не определяя значения некоторых входных параметров, он будет использовать ранее установленные значения. Извне доступны только входы и выходы функционального блока (интерфейс компонента), получить доступ к внутренним переменным блока нельзя.
Можно сказать, что функциональные блоки — это процедуры в классическом понимании высокоуровневого программирования (независимая именованная часть программы, которую после однократного описания можно многократно вызвать по имени из последующих частей программы для выполнения определенных действий).
Программа
В терминах CodeSys, программа — глобальный программный элемент, отображающий множество значений входных параметров на множество выходных. Программа очень похожа на функциональный блок. Из всех программных компонентов МЭК-программа самый крупный. При помощи программ определяется верхний уровень проекта и реализуется управление многозадачностью. Программы являются глобальными компонентами и объявляются на уровне ресурсов.
При создании программы первый POU помещается в новый проект автоматически и получает название PLC_PRG. Именно с него и начинается выполнение процесса (по аналогии с функцией main в языке С), из него будут вызываться другие программные блоки (программы, функциональные блоки и функции).
Структура программного обеспечения ПЛК
Среди средств, реализующих выполнение программ, можно выделить задачи, ресурсы, конфигурацию.
Задачи
Назначение задач состоит в управлении работой программ проекта, исполняемых одним процессором. Как и программа, каждая задача должна иметь собственный уникальный идентификатор.
Задачи подразделяются на циклические и разовые (single). Выполнение разовой задачи запускается по фронту логической триггерной переменной. Циклические задачи выполняются через заданные интервалы времени.
Каждая задача может включать вызов одной или нескольких программ. Если программа имеет входные параметры (VAR__INPUT), то они задаются в описании задачи. Все программы одной задачи выполняются в одном рабочем цикле ПЛК.
Определение задач в системах программирования МЭК выполняется по-разному. Это может быть текстовое описание или графическое представление. CoDeSys содержит специальный инструмент — менеджер задач (Task configuration), представляющий задачи и их программы в виде иерархического дерева.
Ресурсы
С точки зрения стандарта МЭК ресурс — это один процессор, снабженный собственной системой исполнения. То есть одна или несколько задач загружается в ресурс и исполняется им. В CoDeSys применяется понятие проект — все прикладное программное обеспечение, предоставляющее работу конкретного приложения. Слово же «ресурсы» употребляется во множественном числе и определяет набор аппаратно зависимых деталей проекта. Ресурсы содержат:
- определение глобальных и прямо адресуемых переменных;
- конфигурацию ПЛК;
- установки целевой системы исполнения (тип микропроцессора, распределение памяти, порядок байт в слове, параметры сети и т. д.);
- менеджер задач.
Сюда же включаются и дополнительные фирменные инструменты, зависящие от особенностей реализации конкретной системы исполнения.
Конфигурация
Конфигурация — это множество ресурсов, взаимодействующих определенным образом (сконфигурированных). В одной системе может быть несколько интеллектуальных ресурсов, каждый из которых обладает собственным процессором, памятью и системой исполнения. Каждый из них можно программировать. Это могут быть реальные модули (возможно, удаленные) или виртуальные машины, эмулируемые одним процессором. Все они имеют доступ к определенным наборам входов-выходов и координируют свою работу посредством глобальных переменных, расположенных в общедоступной памяти.
В этой статье описана общая структура проекта в CoDeSys. Любая программа в своей работе использует большое количество переменных, которые имеют свои типы данных. Поэтому в следующем уроке мы познакомимся с типами данных, используемыми в проекте, и принципами объявления переменных.