Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1._2.2.Материалы по АПОУТС часть 8семестр.doc
Скачиваний:
272
Добавлен:
02.12.2018
Размер:
1.85 Mб
Скачать

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. Графическое отображение вызова функции