МЭК 61131-3
.pdfГОСТ Р МЭК 61131-3—2016
Пример — Класс реализует интерфейс.
//Объявление |
|
|
INTERFACE ROOM |
|
|
METHOD DAYTIME |
ENDMETHOD |
//Вызывается в дневное время |
METHOD NIGHTTIME |
END METHOD |
//Вызывается в ночное время |
ENDJNTERFACE |
|
|
CLASS LIGHTROOM IMPLEMENTS ROOM
VAR LIGHT: BOOL; END VAR
METHOD PUBLIC DAYTIME
LIGHT:= FALSE;
ENDMETHOD
METHOD PUBLIC NIGHTTIME
LIGHT:= TRUE;
ENDMETHOD
ENDCLASS
//Использование (посредством внешнего вызова метода)
PROGRAM А |
|
VAR |
MyRoom: LIGHTROOM; ENDVAR; И Инстанцирование класса |
VAR_EXTERNAL Actual TOD: TOD; END VAR;/ / определение глобального времени |
|
IF Actual_TOD >= TOD#20:15 ORActual_TOD <= TOD#6:00 |
THEN MyRoom.NIGHTTIMEO;
ELSE MyRoom.DAYTIMEO;
END IF;
ENDPROGRAM
6 .6 .6 .5 Использование интерфейса как типа переменной 6 .6 .6 .5.1 Общие положения
Интерфейс может использоваться как тип переменной. Затем данная переменная становится ука зателем на экземпляр класса, реализующего интерфейс. Переменной должна быть назначена ссылка на экземпляр класса до того, как она может использоваться. Данное правило применяется во всех слу чаях, где может использоваться переменная.
Переменной типа INTERFACE могут быть назначены следующие значения: 1) экземпляр класса, реализующего интерфейс;
2)экземпляр класса, порожденного (посредством EXTENDS) из класса, реализующего интерфейс;
3)другая переменная того же порожденного типа INTERFACE;
4)специальное значение NULL, указывающее на недопустимую ссылку. Данное значение также является начальным переменной, если она не инициализирована иным образом.
Переменная типа INTERFACE может сравниваться на равенство с другой переменной того же типа. Результат имеет значение TRUE, если переменные ссылаются на один и тот же экземпляр или если значения обоих переменных равны NULL.
6 .6 .6 .5.2 Ошибка Значение переменной типа интерфейс должно быть присвоено до ее использования, и должна
быть проведена проверка, что оно указывает на действительный экземпляр класса. В противном слу чае возникает ошибка времени выполнения.
П р и м е ч а н и е — Для предотвращения ошибки времени выполнения, инструментальные программные средства должны предоставить неявный «пустой» метод. Другой способ состоит в предварительной проверке того, что назначен действительный экземпляр класса.
129
ГОСТ Р МЭК 61131-3— 2016
6 .6 .6 .5.3 Пример В примерах 1 и 2 показаны объявление и использование интерфейсов как типа переменной.
Пример 1 — Тип функционального блока с вызовом методов интерфейса
// Объявление
INTERFACE ROOM |
|
|
|
|
METHOD DAYTIME ENDMETHOD |
|
// вызывается в дневное время |
||
METHOD NIGHTTIME END METHOD |
И вызывается в ночное время |
|||
ENDINTERFA СЕ |
|
|
|
|
CLASS LIGHTROOM IMPLEMENTS ROOM |
|
|||
VAR LIGHT: BOOL; ENDVAR |
|
|
||
METHOD PUBLIC DAYTIME |
|
|
|
|
LIGHT:= FALSE; |
|
|
|
|
ENDMETHOD |
|
|
|
|
METHOD PUBLIC NIGHTTIME |
|
|
|
|
LIGHT:= TRUE; |
|
|
|
|
ENDMETHOD |
|
|
|
|
ENDCLASS |
|
|
|
|
FUNCTION_BLOCK ROOMCTRL |
|
|
||
VARJNPUT RM: ROOM; END |
VAR //Интерфейс ROOM как тип (входной) переменной |
|||
VAREXTERNAL |
|
|
|
|
ActualTOD: TOD; END VAR |
И Определение глобального времени |
|||
IF (RM = NULL) |
|
|
|
И Важно: тест на действительную ссылку! |
THEN RETURN; |
|
|
|
|
END IF; |
|
|
|
|
IF Actual_TOD >= TOD#20:15 OR |
|
|
||
Actual TOD <= TOD#06:00 |
|
|
|
|
THEN RM.NIGHTTIMEO; |
|
// Вызов метода RM ELSE RM. |
||
DAYTIMEO; |
|
|
|
|
END IF; |
|
|
|
|
END FUNCTION BLOCK |
|
|
|
|
И Использование |
|
|
|
|
PROGRAM В |
|
|
|
|
VAR |
|
|
И Инстанцирование |
|
MyRoom: |
LIGHTROOM; |
// CM . LIGHTROOM IMPLEMENTS ROOM |
||
My Room Ctrl |
ROOM CTRL; |
// CM . ROOM CTRL выше |
||
END VAR |
|
|
|
|
My_Room_Ctrl(RM:= MyRoom);
//Вызов FB с передачей экземпляра класса в качестве входной переменной
END PROGRAM
130
ГОСТ Р МЭК 61131 -3—2016
Наследование интерфейса, как показано на рисунке 19 а) является первым из трех уровней наследование/реализация. На основе базового интерфейса можно породить один или более интерфей сов.
Интерфейс может быть порожден из одного или более существующих интерфейсов (базовых ин терфейсов), используя ключевое слово EXTENDS.
Пример — Интерфейс А1 расширяет интерфейс А.
Применяются следующие правила:
1 Порожденный (дочерний) интерфейс наследует без дополнительных объявлений все прототипы методов из его базового (родительского) интерфейса.
2 Порожденный интерфейс может наследовать из произвольного числа базовых интерфейсов.
3 Порожденный интерфейс может расширять множество прототипов методов, то есть он может иметь прототипы метода дополнительные к прототипам метода своего базового интерфейса и, таким образом, создавать новую функциональность.
4 Интерфейс, используемый как базовый интерфейс, может сам являться порожденным интер фейсом. Когда он передается своим порожденным интерфейсам, наследуются также прототипы мето да.
Данный процесс может повторяться многократно.
5 Если базовый интерфейс изменяет свое определение, все порожденные интерфейсы (и их по томки) также имеют эту измененную функциональность.
6.6.6.6.2 Ошибка Следующие ситуации будут рассматриваться как ошибка:
1)интерфейс определяет дополнительный прототип метода (в соответствии с правилом 3) с таким же именем прототипа метода, как и один из его базовых интерфейсов;
2)интерфейс является своим собственным базовым интерфейсом, явно или неявно, то есть ре курсия не разрешена.
Пример — Свойство OVERRIDE, как определено в 6.6.Б.5 для классов, не применимо для интерфей
сов.
6.6.6.7 Попытка присваивания 6.6.6.7.1 Общие положения
Попытка присваивания используется для проверки того, реализует ли экземпляр данный интер фейс (см. таблицу 52). Это применимо для классов и функциональных блоков.
Если экземпляр, на который дана ссылка, принадлежит классу или типу функционального блока, реализующего интерфейс, то результат является действительной ссылкой на данный экземпляр. В про тивном случае, результатом является NULL.
Синтаксис попытки присваивания может также использоваться для безопасных преобразований ссылок интерфейсов в ссылки на классы (или типов функциональных блоков), или ссылки на базовый тип в ссылку на порожденный тип (нисходящее преобразование типа).
Результат попытки присваивания подтверждается отличием от значения NULL перед использова
нием.
6.6.6.6.7.2 Текстовое представление
В перечне инструкций (язык IL), оператор «ST» (Сохранить) используется как показано в следую щем примере.
Пример 1 |
|
|
LD |
interface2 |
И в языке IL |
ST? interfacel |
|
В структурированном тексте (язык ST), оператор «?=» используется как показано в следующем примере.
Пример 2
interfacel ?= interface2; И в языке ST
6.6.6.6.7.3 Графическое представление В графических языках используется следующая конструкция:
133
ГОСТ Р МЭК 61131-3—2016
Пример 1 |
|
|
|
+ |
---------------------------------- |
+ |
|
in te r f a c e 2 ----- | |
?= |
| ----- |
i n t e r f a c e l |
+ ---------------------------------- |
|
+ |
|
Пример 2 — Попытка присваивания с ссылками интерфейса Успешная и неудачная попытка присваивания с ссылками интерфейса
// Объявление
CLASS С IMPLEMENTS ITF1, ITF2
ENDCLASS
// Использование
PROGRAM А
VAR
inst: С; interfl: ITF1; interf2: ITF2; interf3: ITF3;
END_VAR |
|
interfl:= inst; |
//теперь interfl содержит действительную ссылку |
interf2 ?= interfl; |
//interf2 будет содержать действительную ссылку |
|
//равную interf2:= inst; |
interf3 ?= interfl; |
H interf3 будет равно NULL |
END_PROGRAM |
|
Пример 3 — Попытка присваивания с указателями интерфейса И Объявление
CLASS dBase IMPLEMENTS ITF1, ITF2
ENDCLASS
CLASS CIDerived EXTENDS CIBase
ENDCLASS
// Использование
PROGRAM A
VAR
instbase: CIBase; instderived: CIDerived;
rinstBasel, pinstBase2: REF_TO CIBase; rinstDerivedl, rinstDerived2: REF_TO CIDerived; rinstDerived3, rinstDerived4: REF_TO CIDerived; interfl: ITF1;
interf2: ITF2; interf3: ITF3;
END VAR
134
|
|
|
|
ГОСТ Р МЭК 61131 -3— 2016 |
rinstBase1:= REF(instBase); |
//rinstbasel ссылается на базовый класс |
|
||
rinstBase2:= REF(instDerived); |
//rinstbase2 ссылается на порожденный класс |
|||
rinstDerivedl ?= rinstBasel; |
//rinstD erivedl == NULL |
|
||
rinstDerived2 ?= rinstBase2; |
// rinstDerived2 будет содержать действительную |
|||
|
|
|
//ссы лку на instDerived |
|
interfl := instbase; |
//in te rfl является ссылкой на базовый класс |
|
||
interf2:= instderived; |
//interf2 является ссылкой на порожденный класс |
|
||
rinstDerived3 ?= interfl; / / rinstDerived3 == NULL |
|
|||
rinstDerived4 ?= interf2; / / rinstDerived4 будет содержать действительную |
|
|||
|
|
//ссы лку на instDerived |
|
|
END PROGRAM |
|
|
|
|
Результат попытки присваивания подтверждается отличием от значения NULL перед использова |
||||
нием. |
|
|
|
|
Т а б л и ц а |
52 — Попытка присваивания |
|
||
Номер |
|
|
Описание |
Пример |
1 |
Попытка присваивания интерфейсов, используя «?=» |
См. выше |
||
2 |
Попытка присваивания интерфейсов, используя «?=» |
См. выше |
||
6.6.7 |
Объектно-ориентированные свойства функциональных блоков |
6.6.7.1 Общие положения Концепция функциональных блоков МЭК 61131-3 расширена для поддержки объектно-ориентиро
ванной парадигмы в том объеме, как она определена для классов:
-в функциональных блоках дополнительно используются методы;
-функциональными блоками дополнительно реализуются интерфейсы;
-поддерживается наследование функциональных блоков.
Вобъектно-ориентированных функциональных блоках поддерживаются все свойства, определен ные в таблице 40.
Кроме того, разработчик объектно-ориентированных функциональных блоков предоставляет вну тренне согласованное подмножество свойств объектно-ориентированных функциональных блоков, определенное в таблице 53.
Т а б л и ц а 53 — Объектно-ориентированный функциональный блок
Но |
Описание |
Объяснение |
|
мер |
Ключевое слово |
||
|
|||
1 |
Объектно-ориентированный |
Объектно-ориентированное расширение концепции функциональных |
|
|
функциональный блок |
блоков |
|
1а |
Спецификатор FINAL |
Функциональный блок не может использоваться как базовый функцио |
|
|
|
нальный блок |
|
|
Методы и спецификаторы |
|
|
5 |
METHOD.. ,END_METHOD |
Определение метода |
|
5а |
Спецификатор PUBLIC |
Метод может вызываться откуда угодно |
|
5Ь |
Спецификатор PRIVATE |
Метод может вызываться только внутри определяющего программного |
|
|
|
компонента |
|
5с |
Спецификатор INTERNAL |
Метод может вызываться из одного и того же пространства имен |
|
5d |
Спецификатор PROTECTED |
Метод может вызываться только из определяющего программного ком |
|
|
|
понента и его наследников (неявно) |
135
ГОСТ Р МЭК 61131-3— 2016
Окончание таблицы 53 |
|
|
||
Но |
Описание |
Объяснение |
||
мер |
Ключевое слово |
|||
|
||||
5е |
Спецификатор FINAL |
Метод не может быть перегружен |
||
|
Использование интерфейса |
|
||
6а |
IMPLEMENTS интерфейс |
Реализует интерфейс в объявлении функционального блока |
||
6Ь |
IMPLEMENTS |
множествен |
Реализует более одного интерфейса в объявлении функционального |
|
|
ные интерфейсы |
|
блока |
|
6с |
Интерфейс как тип перемен |
Поддержка ссылок на реализации (экземпляры функциональных бло |
||
|
ной |
|
ков) интерфейса |
|
|
Наследование |
|
|
|
7а |
EXTENDS |
|
Функциональный блок наследует из базового функционального блока |
|
7Ь |
EXTENDS |
|
Функциональный блок наследует из базового функционального блока |
|
8 |
OVERRIDE |
|
Метод переопределяет базовый метод — см. динамическое связывание |
|
|
|
|
имен |
|
9 |
ABSTRACT |
|
Абстрактный функциональный блок— по меньшей мере, один метод яв |
|
|
|
|
ляется абстрактным |
|
|
|
|
Абстрактный метод — это шаблон метода |
|
|
Ссылка на доступ |
|
||
10а |
THIS |
|
Ссылка на собственные методы |
|
10Ь |
Ключевое слово SUPER |
Ссылка доступа на метод в базовом функциональном блоке |
||
Юс |
SUPER() |
|
Ссылка доступа на тело в базовом функциональном блоке |
|
|
Спецификаторы |
доступа |
|
|
|
переменной |
|
|
|
11а |
Спецификатор PUBLIC |
Доступ к переменной возможен из любого места |
||
11Ь |
Спецификатор PRIVATE |
Доступ к переменной осуществляется только внутри определяющего |
||
|
|
|
программного компонента |
|
11с |
Спецификатор INTERNAL |
Доступ к переменной осуществляется только внутри одного и того же |
||
|
|
|
пространства имен |
|
11 d |
Спецификатор PROTECTED |
Доступ к переменной осуществляется только из определяющего про |
||
|
|
|
граммного компонента и его наследников (неявно) |
|
|
Полиморфизм |
|
|
|
12а |
с секцией переменных VAR |
Секции VAR_IN_OUT базового типа FB может присваиваться экземпляр |
||
|
IN_OUT |
|
порожденного типа FB без дополнительных переменных VAR IN OUT, |
|
|
с одинаковой сигнатурой |
VARJNPUT и VAR_OUTPUT |
||
12Ь |
с секцией переменных VAR |
Секции VAR_IN_OUT базового типа FB может присваиваться экземпляр |
||
|
IN_OUT |
|
порожденного типа FB без дополнительных переменных VAR_IN_OUT |
|
|
с совместимой сигнатурой |
|
||
12с |
со ссылкой |
|
Ссылке (базового) типа FB может присваиваться адрес экземпляра по |
|
|
с одинаковой сигнатурой |
рожденного типа FB без дополнительных переменных VAR IN OUT, |
||
|
|
|
VARJNPUT и VARJDUTPUT |
|
12d |
со ссылкой |
|
Ссылке (базового) типа FB может присваиваться адрес экземпляра по |
|
|
с совместимой сигнатурой |
рожденного типа FB без дополнительных переменных VARJNJDUT |
136
ГОСТ Р МЭК 61131 -3—2016
6.6.7.2 Методы для функциональных блоков 6.6.7.2.1 Общие положения
Концепция методов принимается как набор факультативных элементов языка, используемых в определении типа функционального блока.
Методы могут применяться для определения операций сданными экземпляров функционального блока.
6.6.7.2.2 Варианты функциональных блоков Функциональный блок может иметь тело функционального блока и дополнительно набор методов.
Так как тело FB и/или методы могут быть опущены, существует три варианта функционального блока. Это показано в примере на рисунках 20 а), 20 Ь), 20 с).
a) Функциональный блок, имеющий только тело
Данный функциональный блок известен из МЭК 61131-3.
В данном случая у функционального блока нет реализованных методов. Элементы функциональ ного блока (входные переменные, выходные переменные и т. п.) и вызовы функционального блока по казаны на примере на рисунке 20 а).
B) Функциональный блок телом FB и методами
Методы поддерживают доступ к их собственным локально определенным переменным, а также к переменным, определенным в секциях VARJNPUT, VAR_OUTPUT и VAR объявления функционального блока.
c) Функциональные блоки, имеющие только методы
Вданном случае, функциональный блок имеет реализованное пустое тело функционального бло ка. Элементы функционального блока и вызов методов показан на рисунке 20 Ь).
Вданном случае, функциональный блок может также быть объявлен как класс.
137