БИБЛИОТЕКА НОРМАТИВНЫХ ДОКУМЕНТОВ

ГОСТ Р МЭК 61131-3-2016. Национальный стандарт Российской Федерации. Контроллеры программируемые. Часть 3. Языки программирования

6.9 Пространства имен

6.9.1 Общие положения

Для целей функционирования языков программирования программируемого контроллера пространство имен - это элемент языка, объединяющий другие элементы языка в общий объект.

Одно и то же имя элемента языка, объявленное внутри пространства имен, может также использоваться внутри других пространств имен.

Пространства имен и типы, не имеющие охватывающего пространства имен, являются членами глобального пространства имен. Глобальное пространство имен включает имена, описанные в глобальной области видимости. Все стандартные функции и функциональные блоки являются элементами глобального пространства имен.

Пространства имен могут быть вложенными.

Пространства имен и типы, объявленные внутри пространства имен, являются членами этого пространства имен. Члены пространства имен находятся в локальной области видимости пространства имен.

С пространствами имен может быть реализована концепция библиотеки наряду с концепцией модулей. Пространства имен можно использовать, чтобы избежать неоднозначностей идентификатора. Типовое приложение пространства имен находится в контексте средств объектно-ориентированного программирования.

6.9.2 Объявление

Описание пространства имен начинается с ключевого слова NAMESPACE, за которым опционально следует спецификатор доступа INTERNAL, имя пространства имен и окончания с ключевым словом END_NAMESPACE. Пространство имен содержит набор элементов языка, за каждым из которых опционально следует следующий спецификатор доступа:

- INTERNAL для доступа только внутри собственно пространства имен.

Спецификатор доступа может быть применен к описанию следующих элементов языка:

- определяемых пользователем типов данных - с использованием ключевого слова TYPE;

- функций;

- программ;

- типов функциональных блоков и их переменных и методов;

- классов и их переменных и методов;

- интерфейсов;

- пространств имен.

Если спецификатор доступа не задан, элементы языка пространства имен доступны извне пространства имен, т.е. пространство имен является общедоступным по умолчанию.

Примеры 1 и 2 показывают объявление пространства имен и объявление вложенного пространства имен.

Пример 1 - Объявление пространства имен

NAMESPACE Timers

    FUNCTION INTERNAL TimeTicks DWORD

    // ...объявление и операции здесь

    END_FUNCTION

    // другие элементы пространства имен без спецификатора являются PUBLIC по умолчанию

    TYPE по умолчанию

      LOCAL_TIME:  STRUCT

        TIMEZONE:  STRING [40];

        DST: BOOL; // Декретное время

        TOD: TOD;

        END_STRUCT;

    END_TYPE;

    ...

FUNCTION_BLOCK TON

// ... объявление и операции

END_FUNCTION_BLOCK

...

FUNCTION_BLOCK TOF

// ... объявление и операции

END_FUNCTION_BLOCK

END_NAMESPACE (*Timers*)

Пример 2 - Объявление вложенного пространства имен

NAMESPACE Standard  // Пространство имен = PUBLIC по умолчанию

    NAMESPACE Timers        // Пространство имен= PUBLIC по умолчанию

      FUNCTION INTERNAL TimeTicds DWORD

      // ...объявление и операции здесь

      END_FUNCTION

 

    // другие элементы пространства имен без спецификатора являются PUBLIC за счет

    TYPE по умолчанию

    LOCAL_TIME:

    STRUCT TIMEZONE: STRING [40];

    DST:    BOOL; // Декретное время

    TOD:    TOD;

    END_STRUCT;

    END_TYPE;

    ...

    FUNCTION_BLOCK TON  // определяет реализацию TON с новым именем

    // ... объявление и операции здесь

    END_FUNCTION_BLOCK

    ...

    FUNCTION_BLOCK TOF  // определяет реализацию TOF с новым именем

    // ... объявление и операции здесь END_FUNCTION_BLOCK

 

    CLASS A

    METHOD INTERNAL M1

    ...

    END_METHOD

    METHOD PUBLIC M2 // PUBLIC задано здесь для замены PROTECTED по умолчанию

    ...

    END_METHOD

    END_CLASS

    CLASS INTERNAL B

    METHOD INTERNAL M1

    ...

    END_METHOD

    METHOD PUBLIC M2

    ...

    END_METHOD

    END_CLASS

 

END_NAMESPACE (*Таймеры*) NAMESPACE счетчики

    FUNCTION_BLOCK CUP

    // ... объявление и операции здесь

    END_FUNCTION_BLOCK

    ...

    FUNCTION_BLOCK CDOWN

    // ... объявление и операции здесь

    END_FUNCTION_BLOCK

    END_NAMESPACE (*Timers*)

END_NAMESPACE (*Стандарт*)

Доступность элементов пространства имен, методов и переменных функциональных блоков внутри и извне пространства имен зависит от спецификаторов доступа переменной или метода вместе со спецификатором пространства имен при объявлении пространства имен и элементов языка.

Правила доступности суммированы на рисунке 29.

 

Спецификатор пространства имен

Общедоступно (по умолчанию, спецификатор отсутствует)

INTERNAL

Спецификатор доступа R элементу языка, переменной или методу

Доступ извне пространства имен

Доступ изнутри пространства имен, но извне программного компонента

Доступ извне пространства имен

Доступ изнутри пространства имен, но извне программного компонента

Все пространства имен, кроме предка

Предок пространства имен

PRIVATE

Нет

Нет

Нет

Нет

Нет

PROTECTED

Нет

Нет

Нет

Нет

Нет

INTERNAL

Нет

Да

Нет

Нет

Да

PUBLIC

Да

Да

Нет

Да

Да

 

Рисунок 29 - Доступность с использованием пространств имен

(правила)

 

В случае иерархических пространств имен, внешнее пространство имен может дополнительно ограничивать доступ; оно может не разрешать дополнительный доступ к объектам, которые уже являются внутренними для внутреннего пространства имен.

Пример 3 - Вложенные пространства имен и спецификаторы доступа

NAMESPACE pN1

  NAMESPACE pN11

    FUNCTION pF1 ... END_FUNCTION            // доступно отовсюду

    FUNCTION INTERNAL iF2 ... END_FUNCTION   // доступно в pN11

    FUNCTION_BLOCK pFB1                      // доступно отовсюду

    VAR PUBLIC pVar1: REAL: ... END_VAR      // доступно отовсюду

      VAR INTERNAL iVar2: REAL ... END_VAR   // доступно в pN11

      ...

    END_FUNCTION_BLOCK

    FUNCTION_BLOCK INTERNAL iFB2          // доступно в pN11

    VAR PUBLIC pVar3: REAL: ... END_VAR   // доступно в pN11

    VAR INTERNAL iVar4: REAL ... END_VAR  // доступно в pN11

      ...

    END_FUNCTION_BLOCK

    CLASS pC1

    VAR PUBLIC pVar5: REAL: ... END_VAR      // доступно отовсюду

    VAR INTERNAL iVar6: REAL ... END_VAR     // доступно в pN11

    METHOD pM1 ... END_METHOD                // доступно отовсюду

    METHOD INTERNAL iM2 ... END_METHOD       // доступно в pN11

    END_CLASS

    CLASS INTERNAL iC2

    VAR PUBLIC pVar7: REAL: ... END_VAR      // доступно в pN11

    VAR INTERNAL iVar8: REAL ... END_VAR     // доступно в pN11

    ETHOD pM3 ... END METHOD                 // доступно в pN11

    METHOD INTERNAL iM4 ... END_METHOD       // доступно в pN11

    END_CLASS

END_NAMESPACE

NAMESPACE INTERNAL iN12

    FUNCTION pF1 ... END FUNCTION            // доступно в pN11

    FUNCTION INTERNAL iF2 ... END_FUNCTION   // доступно в iN12

    FUNCTION_BLOCK pFB1                      // доступно в pN1

      VAR PUBLIC pVar1: REAL: ... END_VAR    // доступно в pN1

      VAR INTERNAL iVar2: REAL ... END_VAR   // доступно в iN12

      ...

    END_FUNCTION_BLOCK

 

    FUNCTION_BLOCK INTERNAL iFB2             // доступно в iN12

      VAR PUBLIC pVar3: REAL: ... END_VAR    // доступно в iN12

      VAR INTERNAL iVar4: REAL ... END_VAR   // доступно в iN12

      ...

    END_FUNCTION_BLOCK

    CLASS pC1

      VAR PUBLIC pVar5: REAL: ... END_VAR    // доступно в pN1

      VAR INTERNAL iVar6: REAL ... END_VAR   // доступно в iN12

      METHOD pM1 ... END_METHOD              // доступно в pN1

      METHOD INTERNAL iM2 ... END_METHOD     // доступно в iN12

    END_CLASS

    CLASS INTERNAL iC2

      VAR PUBLIC pVar7: REAL: ... END_VAR    // доступно в in iN12

      VAR INTERNAL iVar8: REAL ... END_VAR   // доступно в in iN12

      METHOD pM3 ... END_METHOD              // доступно в iN12

      METHOD INTERNAL iM4 ... END_METHOD     // доступно в iN12

    END_CLASS

  END_NAMESPACE

END_NAMESPACE

В таблице 64 показаны свойства, определенные для пространства имен.

 

Таблица 64

 

Пространство имен

 

Номер

Описание

Пример

1a

Общее пространство имен (без спецификатора доступа)

NAMESPACE name

declaration(s)

declaration(s)

END_NAMESPACE

Все содержащиеся элементы доступны в соответствии со своими спецификаторами доступа

1b

Внутреннее пространство имен (со спецификатором INTERNAL)

NAMESPACE INTERNAL name

declaration(s)

declaration(s)

END_NAMESPACE

Все содержащиеся элементы без какого-либо спецификатора или со спецификатором доступа PUBLIC доступны в пространстве имен на уровень выше

2

Вложенные пространства имен

См. пример 2

3

Спецификатор доступа к переменной INTERNAL

CLASS C1

VAR INTERNAL myInternalVar: INT; END_VAR

VAR PUBLIC myPublicVar: INT; END_VAR

END_CLASS

4

Спецификатор доступа к методу INTERNAL

CLASS C2

METHOD INTERNAL myInternalMethod: INT; ... END_METHOD

METHOD PUBLIC myPublicMethod: INT; ... END_METHOD

END_CLASS

5

Элемент языка со спецификатором доступа INTERNAL:

Типы данных, определяемые пользователем

- с использованием ключевого слова TYPE

Функции

Типы функциональных блоков

Классы

Интерфейсы

CLASS INTERNAL

METHOD INTERNAL myInternalMethod: INT; ... END_METHOD

METHOD PUBLIC myPublicMethod: INT; ... END_METHOD

END_CLASS

 

CLASS

METHOD INTERNAL myInternalMethod: INT; ... END_METHOD

METHOD PUBLIC myPublicMethod: INT; ... END_METHOD

END_CLASS

 

Именем пространства имен может быть простой идентификатор или полностью уточненное имя, состоящее из последовательности идентификаторов пространства имен, разделенных точками ("."). Последняя форма допускает объявление вложенного пространства имен без объявлений лексически вложенных нескольких пространств имен. Она также поддерживает расширение существующего пространства имен с дополнительными элементами языка за счет дополнительного объявления.

Лексически вложенные пространства имен, описываемые несколькими объявлениями пространств имен с ключевым словом NAMESPACE, текстуально вложены, как показано в первом из трех свойств в таблице 65. Все три свойства вносят элементы языка в одно и то же пространство имен Standard.Timers.HighResolution. Второе свойство показывает расширение того же пространства имен, объявленного полностью уточненным именем. Третье свойство смешивает объявление пространства имен с полностью уточненным именем и лексически вложенными ключевыми словами NAMESPACE для добавления дополнительного программного компонента к пространству имен.

В таблице 65 показаны свойства, определенные для опций объявления вложенного пространства имен.

 

Таблица 65

 

Варианты объявления вложенного пространства имен

 

Номер

Описание

Пример

1

Объявление лексически вложенного пространства имен

Эквивалентно свойству 2 в таблице 64

NAMESPACE Standard

NAMESPACE Timers

NAMESPACE HighResolution

FUNCTION PUBLIC TimeTick: DWORD

// ...объявление и операции

END_FUNCTION

END_NAMESPACE (*HighResolution*)

END_NAMESPACE (*Timers*)

END_NAMESPACE (*Standard*)

2

Объявление пространства имен полностью уточненным именем

NAMESPACE Standard.Timers.HighResolution

FUNCTION PUBLIC TimeResolution: DWORD

// ...объявление и операции

END_FUNCTION

END_NAMESPACE (*Standard.Timers.HighResolution*)

3

Смешанные лексически вложенное пространство имен и пространство имен, вложенное использованием полностью уточненного имени

NAMESPACE Standard.Timers

NAMESPACE HighResolution

FUNCTION PUBLIC TimeLimit: DWORD

// ...объявление и операции

END_FUNCTION

END_NAMESPACE (*HighResolution*)

END_NAMESPACE (*Standard.Timers*)

Примечание - Несколько объявлений пространства имен с одним и тем же полностью уточненным именем осуществляет вложение в одно и то же пространство имен. В примерах этой таблицы функции TimeTick, TimeResolution и TimeLimit являются членами одного и того же пространства имен Standard. Timers.HighResolution даже если они определены в отдельных объявлениях пространства имен; например, в различных файлах программы Structured Text.

 

6.9.3 Использование

Элементы пространства имен могут быть доступны извне относительно пространства имен использованием предшествующего имени пространства имен и последующей точки ".". В этом нет необходимости изнутри пространства имен, но допустимо.

К элементам языка, объявляемым со спецификатором доступа INTERNAL, не может быть доступа извне относительно пространства имен, за исключением собственного пространства имен.

Доступ к элементам во вложенных пространствах имен возможен с использованием наименования всех родительских пространств имен, как показано в примере.

Пример - Использование Timer TON из пространства имен Standard.Timers

FUNCTION_BLOCK Uses_Timer

VAR

Ton1: Standard.Timers.TON;

(* запускает таймер передним фронтом, сбрасывает таймер задним фронтом*)

Ton2: PUBLIC.TON; (* использует стандартный таймер *)

bTest: BOOL;

END_VAR

Ton1(In:= bTest, PT:= t#5s);

END_FUNCTION_BLOCK

6.9.4 Директива USING пространства имен

Директива USING может задаваться вслед за именем пространства имен, программным компонентом, именем и объявлением результата функции или метода. Если директива USING используется внутри функционального блока, класса или структуры, она следует непосредственно за именем типа.

Если директива USING используется внутри функции или метода, она непосредственно следует за объявлением типа результата функции или метода.

Директива USING начинается с ключевого слова USING, за которым следует одно или несколько полностью уточненных имен пространств имен, как показано в таблице 64, свойство 2. Это разрешает использование элементов языка, содержащихся в заданных пространствах имен, непосредственно в окружающем пространстве имен соответствующего программного компонента. Окружающее пространство имен также может являться глобальным пространством имен.

В пределах объявления членов в пространстве имен, которое содержит директиву пространства имен USING, на типы, содержащиеся в заданном пространстве имен, можно ссылаться прямо. В приведенном ниже примере в пределах объявления членов пространства имен Infeed, члены типа Standard.Timers прямо доступны, и, поэтому, функциональный блок Uses_Timer может объявлять переменную экземпляра функционального блока TON без квалификации.

В примерах 1 и 2 ниже показано использование директивы пространства имен USING.

Пример 1 - Директива пространства имен USING

NAMESPACE Counters

FUNCTION_BLOCK CUP

//... объявление и операции

END_FUNCTION_BLOCK

END_NAMESPACE (*Standard.Counters*)

 

NAMESPACE Standard.Timers

FUNCTION_BLOCK TON

//... объявление и операции

END_FUNCTION_BLOCK

END_NAMESPACE (*Standard.Timers*)

 

NAMESPACE Infeed

FUNCTION_BLOCK Uses_Std

USING Standard.Timers;

 

VAR

Ton1: TON;

(* запускает таймер с передним фронтом, сбрасывает таймер с задним фронтом*)

Cnt1: Counters.CUP;

bTest: BOOL;

END_VAR

Ton1(In:= bTest, PT:= t#5s);

END_FUNCTION_BLOCK

END_NAMESPACE

Директива пространства имен USING делает доступными типы, содержащиеся в заданном пространстве имен, но специально не делает доступными типы, содержащиеся во вложенных пространствах имен. Директива пространства имен USING делает доступными типы, содержащиеся в Standard, но не типы пространств имен, вложенные в Standard. Таким образом, ссылка на Timers.TON в объявлении Uses_Timer приводит к ошибке компиляции, поскольку в области видимости отсутствуют члены с именем Standard.

Пример 2 - Недопустимый импорт вложенных пространств имен

NAMESPACE Standard.Timers

FUNCTION_BLOCK TON

// ... объявление и операции

END_FUNCTION_BLOCK

END_NAMESPACE (*Standard.Timers*)

NAMESPACE Infeed

USING Standard;

USING Standard.Counters;

FUNCTION_BLOCK Uses_Timer

VAR

"ГОСТ Р МЭК 61131-3-2016. Национальный стандарт Российской Федерации. Контроллеры программируемые. Часть 3. Языки программирования" Вложенные пространства имен не импортируются.

(* запускает таймер с передним фронтом, сбрасывает таймер с задним фронтом*)

bTest: BOOL;

END_VAR

Ton1(In:= bTest, PT:= t#5s);

END_FUNCTION_BLOCK

END_NAMESPACE (*Standard.Timers.HighResolution*)

Для доступа к элементам языка пространства имен в глобальном пространстве имен должны использоваться ключевое слово USING и идентификаторы пространства имен.

В таблице 66 показаны свойства, определяемые для директивы пространства имен USING.

 

Таблица 66

 

Директива пространства имен USING

 

Номер

Описание

Пример

1

USING в глобальном пространстве имен

USING Standard.Timers;

FUNCTION PUBLIC TimeTick: DWORD

VAR

Ton1: TON;

END_VAR // ...объявление и операции

END_FUNCTION

2

USING в другом пространстве имен

NAMESPACE Standard.Timers.HighResolution

USING Counters;

FUNCTION PUBLIC TimeResolution: DWORD

// ...объявление и операции

END_FUNCTION

END_NAMESPACE (*Standard.Timers.HighResolution*)

3

USING в программных компонентах:

- функции

- типы функционального блока

- классы

- методы

- интерфейсы

FUNCTION_BLOCK Uses_Std

USING Standard.Timers, Counters;

VAR

Ton1: TON;

(* запускает таймер с передним фронтом, сбрасывает таймер с задним фронтом*)

Cnt1: CUP;

bTest: BOOL;

END_VAR

Ton1(ln:= bTest, PT:= t#5s);

END_FUNCTION_BLOCK

 

FUNCTION myFun: INT

USING Lib1, Lib2;

USING Lib3;

VAR ....

.... END_FUNCTION

TOC