
- •Материалы для подготовки к зачету
- •1. Введение
- •1.1 Понятие информации
- •1.2 Количество и качество информации
- •1.3 Понятие системы и ее свойства
- •1.4 Основные признаки систем
- •1.5 Понятие «черного ящика»
- •1.6 Иерархическая система
- •1.7 Управляющие системы
- •1.8 Прямая и обратная связь управления
- •1.9 Основные направления развития автоматизации управления
- •1.10 Автоматизированные системы управления технологическими процессами (асу тп)
- •1.11 Автоматизированная система управления производством (асуп)
- •2. Определение плк
- •3. Устройство плк
- •4. Введение в программирование плк
- •5. Компоненты организации программ (pou)
- •Присваивание значений параметрам функции
- •6. Данные и переменные
- •7. Структурированный текст (st)
- •8. Язык линейных инструкций (il)
- •9. Релейные диаграммы (ld)
- •10. Язык функциональных блок-схем – fbd
- •11. Язык программирования sfc (Sequential Function Chart)
5. Компоненты организации программ (pou)
Компоненты организации программ образуют код прикладного программного обеспечения ПЛК. Именно на уровне компонентов доступно совмещение различных языков МЭК. В англоязычных документах компоненты организации программ сокращенно обозначаются POU — Program Organization Unit. Чтобы не вызывать неоднозначность, мы далее также будем использовать эту аббревиатуру.
Определение компонента
Компоненты организации программ являются базовыми элементами, из которых строится код проекта. Каждый компонент программы имеет собственное наименование, определенный интерфейс и описание на одном из МЭК-языков. Один компонент может вызвать другие компоненты. Вызов самого себя (рекурсия) в стандарте МЭК не разрешена. Комбинировать различные языки в одном проекте можно при описании различных компонентов, но отдельный компонент целиком реализуется на одном языке МЭК. При вызове компонента язык его реализации значения не имеет.
К компонентам организации программ в МЭК-стандарте относятся функции, функциональные блоки и программы. Все они во многом похожи, но имеют определенные особенности и различное назначение.
Компонент обладает свойством инкапсуляции — работает как «черный ящик», скрывая детали реализации. Для работы с компонентом достаточно знать его интерфейс, включающий описание входов и выходов. Внутреннее его устройство знать необязательно. В графической форме представления компонент выглядит как Прямоугольник с входами слева и выходами справа. Локальные (внутренние) переменные компонента недоступны извне и в графическом представлении не отображаются.
Готовый компонент всегда можно вскрыть, изучить и поправить. Это, конечно, относится только к пользовательским компонентам и открытым библиотекам. Некоторые стандартные компоненты включены в транслятор и недоступны для просмотра и изменения. Это относится и к внешним библиотекам. Внешние библиотеки реализуются в виде объектного кода при помощи внешних средств, например компилятора С или ассемблера. Возможно даже, что компонент реализован не только программно, а использует вспомогательные аппаратные средства, например часы реального времени или математический сопроцессор.
Еще одной задачей, решаемой компонентами, является локализация имен переменных. Это означает, что в различных компонентах можно использовать повторяющиеся имена. Так, например, любимую переменную с оригинальным идентификатором «X» можно использовать в каждом компоненте, и всякий раз это будет новая переменная. Область видимости локальных переменных определяется рамками одного компонента. Конечно, можно все переменные проекта объявить глобальными. Модификация и отладка подобных проектов вызывает такие же ощущения, как распутывание «бороды» из лески на удочке во время клева. Ограничение области видимости является обязательным во всех современных системах программирования.
Экземпляры функциональных блоков, объявленные внутри других компонентов, также обладают локальной областью видимости. Программы и функции всегда определены глобально.
Объявление POU
Реализации любого POU всегда должен предшествовать раздел объявлений. Объявления функции, функционального блока и программы начинаются соответственно с ключевых слов FUNCTION, FUNCTION_BLOCK и PROGRAM. За ним следует идентификатор (имя компонента). Далее определяется интерфейс POU. К интерфейсу компонента относятся входы VAR_INPUT, выходы VAR_OUTPUT и переменные типа вход-выход VAR_IN_OUT. Завершают раздел объявлений локальные переменные VAR.
В функциях разделы VAR_OUTPUT и VAR_IN_OUT отсутствуют. Выходом функции служит единственная переменная, совпадающая с именем функции. Тип возвращаемого значения указывается при определении идентификатора через двоеточие.
Например: FUNCTION iNearby : INT
Структура раздела объявлений POU показана в таблице.
Тип POU |
Функция |
Функциональный блок |
Программа |
|
FUNCTION имя: ТИП |
FUNCTION_BLOCK ИМЯ |
PROGRAM имя |
Интерфейс |
VAR_INPUT |
VAR_INPUT |
VAR INPUT |
|
— |
VAR_OUTPUT |
VAR OUTPUT |
|
— |
VAR_IN_OUT |
VAR IN OUT |
Локальные переменные |
VAR |
VAR |
VAR |
Все разделы переменных являются не обязательными. Так нет ничего удивительного в программе, которая не требует координации работы с другими программами. Интерфейс ей не нужен, и раздел объявлений будет содержать только локальные переменные VAR.
Формальные и актуальные параметры
Интерфейс компонента образуется входными и выходными переменными. Интерфейсные входные переменные называют формальными параметрами. При использовании компонента его формальные параметры связываются с актуальными параметрами. И наконец, при вызове параметры компонента приобретают актуальные или текущие значения. Эти понятия необходимы для избежания двусмысленности при описании техники работы с компонентами.
Определение компонента
Поясним их различия на примере. Возьмем стандартный блок R_TRIG. Он имеет вход с названием CLK. Мы будем использовать его в программе, в которой определена некая подходящая переменная, например bPulse. При вызове блока из нашей программы мы подаем bPulse на вход CLK. Далее программа компилируется и загружается в контроллер. Переменная bPulse приобретает некоторое значение, например TRUE. Вход CLK, естественно, тоже будет иметь значение TRUE. Здесь отличия уже практически очевидны. CLK — это формальный параметр, bPulse — актуальный параметр, a TRUE — фактическое значение. С формальными параметрами приходится иметь дело при проектировании POU и описании его интерфейса. Актуальные параметры работают при использовании компонента. Текущие значения рождаются только в «железе» в процессе выполнения.
Параметры и переменные компонента
При объявлении POU вы можете встретить следующие заголовки:
Формальные входные параметры VAR_INPUT Передаются POU по значению путем копирования. При вызове блока такой переменной можно присвоить значение другой переменной (совместимого типа), константы или выражения. Любые изменения такой переменной внутри POU никак не отображаются на данные вызывающего компонента. Применяется в любых POU. Могут иметь значения по умолчанию. Отражаются в графическом представлении с левой стороны компонента.
Формальные выходные параметры VAR_OUTPUT Отражают результаты работы компонента. Передаются из POU по значению путем копирования. Чтение значения выходов обычно имеет смысл после выполнения блока. Вне компонента параметры VAR_OUTPUT доступны только по чтению. Не используются в функциях, поскольку функция имеет только одно возвращаемое значение. Могут иметь начальные значения. Отражаются в графическом представлении справа.
Параметр типа VAR_IN_OUT
Этот параметр одновременно является входом и выходом. Передача переменной экземпляру блока выполняется по ссылке. Это означает, что внешняя переменная как бы сама работает внутри блока на правах внутренней переменной. В компонент передается только адрес ее расположения в памяти данных. Для переменной VAR_IN_OUT нельзя:
-
использовать ее в функциях;
-
присваивать начальное значение;
-
обращаться как к элементу структуры данных, через точку;
-
присваивать константу, как актуальный параметр.
Присваивание внешней переменной для VAR_IN_OUT можно производить только при вызове блока.
Важнейшим свойством VAR__IN_OUT является отсутствие копирования внешних данных. Параметры VAR_INPUT и VAR__OUTPUT могут оперировать с массивами и структурами, но всякий раз при обращении к компоненту будет происходить полное копирование данных. Это может отнимать много времени. Присваивание одного массива другому для VAR_IN_OUT означает фактически переключение компонента с одного массива на другой. Локальная копия данных в этом случае не создается.
Как и глобальные переменные, параметры VAR_IN_OUT нарушают идеологию независимости компонентов. Правильный компонент не должен иметь возможности испортить чужую память. Поэтому применять их нужно очень аккуратно и только в случаях, когда это действительно необходимо.
Локальные переменные VAR
VAR доступны только внутри компонента, вне компонента к ним доступа нет. Могут иметь начальные значения. Для функций локальные переменные размещаются в динамической памяти (обычно в стеке). По окончании работы функции память освобождается и может использоваться в других функциях. В программах и экземплярах функциональных блоков переменные VAR сохраняют свои значения между вызовами программ и экземпляров. В графическом представлении компонента локальные переменные не отражаются.
15.11.2011
Функции
Функция — это программный компонент, отображающий множество значений входных параметров на выход. Функция всегда возвращает только одно значение. При объявлении функции указывается тип возвращаемого значения, имя функции и список входных параметров. Вызов функции производится по имени с указанием значений входных параметров. Функция может использоваться в математических выражениях наряду с операторами и переменными.
Функция не имеет внутренней памяти. Это означает, что функция с одними и теми же значениями входных параметров всегда возвращает одно и то же значение. Функция — это чистый код- Многократное использование функции не приводит к повторному включению кода функции при компоновке. Реализация функции присутствует в коде проекта только один раз. Всякий раз при вызове функции процессор исполняет один и тот же поименованный код. Функция может иметь локальные (временные) переменные. Но при окончании своей работы функция освобождает локальную память.
Тип функции (тип возвращаемого значения) может быть любым из числа стандартных типов данных или типов созданных пользователем. Тело функции может быть описано на языках IL, ST, LD или FBD. Использовать SFC нельзя. Из функции можно вызывать библиотечные функции и другие функции текущего проекта. Вызывать функциональные блоки и программы из функций нельзя.
Вызов функции с перечислением значений параметров
В прародителях языка ST — языках Паскаль и С вызов функции производится по имени с перечислением в скобках списка актуальных входных параметров, через запятую, слева направо. Аналогичный способ приемлем и в языке ST. Например:
у := MUX(0, xl, х2);
(*Возвращает нулевой вход
Здесь интересно обратить внимание на то, что наименования параметров нам не нужны. При перечислении параметров важно только соблюсти правильную последовательность в соответствии с определением в объявлении функции. В графических языках порядок входных параметров задан направлением сверху вниз (рис. 3.1).
Рис.
3.1.
Графическое
отображение вызова функции