ГОСТ Р МЭК 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
Вложенные пространства имен не импортируются.
(* запускает таймер с передним фронтом, сбрасывает таймер с задним фронтом*)
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 |