Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МЭК 61131-3

.pdf
Скачиваний:
111
Добавлен:
23.05.2019
Размер:
9.36 Mб
Скачать

ГОСТ Р МЭК 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

Объектно-ориентированный

Объектно-ориентированное расширение концепции функциональных

 

функциональный блок

блоков

Спецификатор FINAL

Функциональный блок не может использоваться как базовый функцио­

 

 

нальный блок

 

Методы и спецификаторы

 

5

METHOD.. ,END_METHOD

Определение метода

Спецификатор PUBLIC

Метод может вызываться откуда угодно

Спецификатор PRIVATE

Метод может вызываться только внутри определяющего программного

 

 

компонента

Спецификатор INTERNAL

Метод может вызываться из одного и того же пространства имен

5d

Спецификатор PROTECTED

Метод может вызываться только из определяющего программного ком­

 

 

понента и его наследников (неявно)

135

ГОСТ Р МЭК 61131-3— 2016

Окончание таблицы 53

 

 

Но­

Описание

Объяснение

мер

Ключевое слово

 

Спецификатор FINAL

Метод не может быть перегружен

 

Использование интерфейса

 

IMPLEMENTS интерфейс

Реализует интерфейс в объявлении функционального блока

IMPLEMENTS

множествен­

Реализует более одного интерфейса в объявлении функционального

 

ные интерфейсы

 

блока

Интерфейс как тип перемен­

Поддержка ссылок на реализации (экземпляры функциональных бло­

 

ной

 

ков) интерфейса

 

Наследование

 

 

EXTENDS

 

Функциональный блок наследует из базового функционального блока

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]