База ГОСТовallgosts.ru » 25. МАШИНОСТРОЕНИЕ » 25.040. Промышленные автоматизированные системы

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

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

Дата введения: 04/01/2017
Дата отмены: -
Заменен на: -
Код ОКС: 25.040, 35.240.50
Скачать PDF: ГОСТ Р МЭК 61131-3-2016 Контроллеры программируемые. Часть 3. Языки программирования.pdf
Скачать Word:ГОСТ Р МЭК 61131-3-2016 Контроллеры программируемые. Часть 3. Языки программирования.doc


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



ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ТЕХНИЧЕСКОМУ РЕГУЛИРОВАНИЮ И МЕТРОЛОГИИ

ГОСТ Р мэк 61131-3— 2016



НАЦИОНАЛЬНЫЙ

СТАНДАРТ

РОССИЙСКОЙ

ФЕДЕРАЦИИ

КОНТРОЛЛЕРЫ ПРОГРАММИРУЕМЫЕ

Часть 3

Языки программирования

(IEC 61131-3:2013, ЮТ)

Издание официальное

Предисловие

1    ПОДГОТОВЛЕН Негосударственным образовательным частным учреждением «Новая Инженерная Школа» (НОЧУ «НИШ») на основе перевода на русский язык англоязычной версии указанного в пункте 4 стандарта, который выполнен Российской комиссией экспертов МЭК/ТК 65. и Федеральным государственным унитарным предприятием «Всероссийский научно-исследовательский институт стандартизации и сертификации в машиностроении» («ВНИИНМАШ»)

2    ВНЕСЕН Техническим комитетом по стандартизации ТК 306 «Измерения и управление в промышленных процессах»

3    УТВЕРЖДЕН И ВВЕДЕН В ДЕЙСТВИЕ Приказом Федерального агентства по техническому регулированию и метрологии от 13 мая 2016 г. No 313-ст

4    Настоящий стандарт идентичен международному стандарту МЭК 61131-3:2013 «Контроллеры программируемые. Часть 3. Языки программирования (IEC 61131-3:2013. «Programmable controllers — Part 3: Programming languages», IDT).

При применении настоящего стандарта рекомендуется использовать вместо ссылочных международных стандартов соответствующие им национальные стандарты, сведения о которых приведены в дополнительном приложении ДА

5    8 настоящем стандарте часть его содержания может быть объектом патентных прав

6    8ВЕДЕН ВПЕРВЫЕ

Правила применения настоящего стандарта установлены в ГОСТ Р 1.0—2012 (раздел 8). Информация об изменениях к настоящему стандарту публикуется е ежегодном (по состоянию на 1 января текущего года) информационном указателе «Национальные стандарты», а официальный текст изменений и поправок — е ежемесячном информационном указателе «Национальные стандарты». В случае пересмотра (замены) или отмены наслюящего стандарта соответствующее уведомление будет опубликовано в ближайшем выпуске ежемесячного информационного указателя «Национальные стандарты». Соответстеующаяинформация. уведомление и тексты размещаются также в информационной системе общего пользования — на официальном сайте Федерального агентства по техническому регулированию и метрологии в сети Интернет (»vw>v.gost.ru)

© Стандартинформ. 2016

Настоящий стандарт не может быть полностью или частично воспроизведен, тиражирован и распространен в качестве официального издания без разрешения Федерального агентства по техническому регулированию и метрологии

Содержание

Приложение ДА (справочное) Сведения о соответствии ссылочных международных

in

НАЦИОНАЛЬНЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИ

КОНТРОЛЛЕРЫ ПРОГРАММИРУЕМЫЕ Часть 3

Языки программирования

Programmable controllers. Part 3. Programming languages

Дата введения — 2017—04—01

1    Область применения

Настоящий стандарт устанавливает синтаксис и семантику языков программирования программируемых контроллеров, определенных в МЭК 61131 (часть 1).

Функции ввода программы, тестирования, мониторинга, операционной системы и т. п. определены в МЭК 61131 (часть 1).

Настоящий стандарт устанавливает синтаксис и семантику унифицированного набора языков программирования для программируемых контроллеров (PC). Данный набор состоит из двух текстовых языков программирования, списка инструкций (IL) и структурированного текста (ST), и двух графических языков, релейно-контактных схем (LD) и функциональных блоковых диаграмм (FBD).

Дополнительный набор графических и эквивалентных текстовых элементов, именуемый последовательная функциональная схема (SFC), определяется для структурирования внутренней организации программ и функциональных блоков программируемого контроллера. Определены также элементы конфигурации, поддерживающие установку программ программируемого контроллера в системы программируемого контроллера. Кроме того, определены средства, облегчающие взаимодействие между программируемыми контроллерами и другими компонентами автоматизированных систем.

2    Нормативные ссылки

В настоящем стандарте использованы нормативные ссылки на следующие стандарты. Для недатированных ссылок применяют последнее издание ссылочного документа (включая изменения).

МЭК 61131-1 Программируемые контроллеры. Часть 1. Общие положения (IEC 61131-1, Programmable controllers — Part 1: General information)

МЭК 61131-5 Программируемые контроллеры. Часть 5. Взаимодействия (IEC 61131-5, Programmable controllers — Part 5: Communications)

ИСО/МЭК 10646:2012 Информационная технология. Универсальный набор символов (UCS) (ISO/ IEC 10646:2012. Information technology — Universal Coded Character Set (UCS)

ИСО/МЭК/1ЕЕЕ 60559 Информационная технология. Микропроцессорные системы. Арифметика с плавающей точкой (ISO/IEC/IEEE 60559. Information technology — Microprocessor Systems — Floating-Point arithmetic)

Издание официальное

3 Термины и определения

В настоящем стандарте применены следующие термины с соответствующими определениями:

3.1    абсолютное время (absolute time): Комбинация времени суток и даты.

3.2    путь доступа (access path): Связь символического имени с переменной для реализации от* крытою взаимодействия.

3.3    действие (action): Логическая переменная или набор подлежащих выполнению операций вместе со связанной управляющей конструкцией.

3.4    блок действий (action block): Элемент графического языка, который использует входную логическую переменную для определения значения выходной логической переменной или разрешающее условие для действия в соответствии с предопределенной управляющей конструкцией.

3.5 _

агрегат (aggregate): Структурированная совокупность объектов данных, образующая тип дан*

ных.

(ИСТОЧНИК: ISO/AFNOR: 1989)

3.6 _

массив (array): Агрегат, состоящий из объектов данных с идентичными атрибутами, на каждый из объектов данных можно уникально ссылаться с помощью индекса.

(ИСТОЧНИК: ISO/AFNOR: 1989)

3.7 _

присваивание (assignment): Механизм для придания значения переменной или агрегату.

(ИСТОЧНИК: ISO/AFNOR: 1989)

3.8    базовый тип (base type): Тил данных, тип функционального блока или класс, из которых на* следуются или производятся дальнейшие типы.

3.9    число с основанием (based number): Число, представленное с конкретным основанием, от* личным от 10.

3.10    двоично-десятичный код (binary coded decimal; BCD): Код десятичного числа, в котором каждая цифра представлена ее двоичным значением.

3.11    бистабильный функциональный блок (bistable function block): Функциональный блок с дву* мя устойчивыми состояниями, управляемый одним или более входами.

3.12    битовая строка (bit string): Элемент данных, состоящий из одного или более битов.

3.13    битово-строковый литерал (bit string literal): Литерал, который прямо представляет значение битовой строки типов данных BOOL. BYTE. WORD. DWORD или LWORD.

3.14    тело (body): Набор операций программного компонента.

3.15    вызов (call): Языковая конструкция, вызывающая выполнение функции, функционального блока или метода.

3.16    строка символов (character string): Агрегат, состоящий из упорядоченной последовательности символов.

3.17    символьно-строковый литерал (character string literal): Литерал, прямо представляющий значение символа или строки символов типов данных CHAR, WCHAR. STRING или WSTRING.

3.18    класс (class): программный компонент, состоящий из:

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

-    набора методов, выполняемых над структурой данных.

3.19 _

комментарий (comment): Языковая конструкция для включения текста, не влияющего на выполнение программы.

(ИСТОЧНИК: ISO/AFNOR: 1989J

3.20    конфигурация (configuration): Элемент языка, соответствующий системе программируемого контроллера.

3.21    константа (constant): Элемент языка, указывающий на элемент данных с фиксированным значением.

3.22    функциональный блок счетчика (counter function block): Функциональный блок, который накапливает значение числа изменений, определяемых на одном или более указанных выходов.

3.23 _

тип данных (data type): Набор значений вместе с набором допустимых операций.

[ИСТОЧНИК: ISO/AFNOR: 1989)

3.24    дата и время (date and time): Дата с годом и время суток, представленные как отдельный элемент данных.

3.25    объявление (declaration): Механизм для определения элемента языка.

3.26    разделитель (delimiter): Символ или комбинация символов, используемая для разделения элементов языка программирования.

3.27    производный класс (derived class): Класс, создаваемый наследованием из другого класса.

Примечание — Производный класс также называют расширенным классом или порожденный классом.

3.28    производный тип данных (derived data type): Тип данных, созданный с использованием другого типа данных.

3.29    производный тип функционального блока (derived function block type): Тип функционального блока, созданный наследованием из другого типа функционального блока.

3.30    прямое представление (direct representation): Средства представления переменной в программе программируемого контроллера, из которых может быть прямо определено физическое или логическое расположение переменной.

3.31    двойное слово (double word): Элемент данных, содержащий 32 бита.

3.32    динамическое связывание (dynamic binding): Ситуация, в которой экземпляр вызова метода возвращается во время выполнения в соответствии с фактическим типом экземпляра или интерфейса.

3.33    оценка (evaluation): Процесс установления значения выражения, функции, выходных переменных сети или экземпляра функционального блока во время выполнения программы.

3.34    элемент управления выполнением (execution control element): Элемент языка, контролирующий лоток выполнения программы.

3.35    задний фронт (falling edge): Часть временной диаграммы сигнала, где происходит переход логической переменной из 1 в 0.

3.36    функция (function): Элемент языка, который во время выполнения обычно вырабатывает результат в виде одного элемента данных и, возможно, дополнительные выходные переменные.

3.37    экземпляр функционального блока (function block instance): Экземпляр типа функционального блока.

3.38    тип функционального блока (function block type): Элемент языка, состоящий из:

- определения структуры данных, разделенной на входные, выходные и внутренние переменные: и

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

3.39    функциональная блоковая диаграмма (function block diagram): Сеть, узлы которой являются экземплярами функциональных блоков, графически представленные функции или вызовы метода, переменные, литералы и метки.

3.40    родовой тип данных (generic data type): Тип данных, представляющий более одного типа данных.

3.41    глобальная переменная (global variable): Переменная с глобальной областью действия.

3.42    иерархическая адресация (hierarchical addressing): Прямое представление элемента данных как члена физической или логической иерархии.

Пример — Точка в модуле, который хранится на стеллаже, который, в свою очередь, помещен в стенд и т. д.

3.43    идентификатор (identifier): Комбинация букв, цифр и символов подчеркивания, которая начинается с буквы или символа подчеркивания и которая именует элемент языка.

3.44    реализация (implementation): версия программируемого логического контроллера (PLC) или программного или отладочного инструмента, предоставленная разработчиком.

3.45    разработчик (Implementer): Изготовитель PLC или программного или отладочного инструмента. предоставленного пользователю для разработки приложений PLC.

з

3.46    наследование (inheritance): Создание нового класса, типа функционального блока или интерфейса на основе существующего класса, типа функционального блока или интерфейса, соответственно.

3.47    начальное значение (initial value): Значение, присвоенное переменной при запуске системе.

3.48    входная и выходная переменная (in-out variable): Переменная, используемая для передачи значения программному компоненту и, дополнительно, для возврата значения из программного компонента.

3.49    входная переменная (input variable): Переменная, используемая для передачи значения программному компоненту, отличному от класса.

3.50    экземпляр (instance): Отдельная, именованная копия структуры данных, связанная с типом функционального блока, классом или программным типом, которая сохраняет свои значения от одного вызова соответствующей операции до другого.

3.51    имя экземпляра (instance name): Идентификатор, связанный с конкретным экземпляром.

3.52    создание экземпляра (instantiation): Создание экземпляра.

3.53    целое число (nteger): Целое число, которое может содержать положительные, нулевые или отрицательные значения.

3.54    целый литерал (integer literal): Литерал, прямо представляющий целое значение.

3.55    интерфейс (interface): Элемент языка в контексте объектно-ориентированного программирования. содержащий набор прототипов метода.

3.56    ключевое слово (keyword): Лексическая единица, которая характеризует элемент языка.

3.57    метка (label): Конструкция языка, именующая инструкцию, сеть или группу сетей, включая идентификатор.

3.58    элемент языка (language element): Любая единица, идентифицированная символом в левой части порождающего правила в формальной спецификации.

3.59 _

литерал (literal): Лексическая единица, которая прямо представляет значение.

(ИСТОЧНИК: ISO/AFNOR: 1989)

3.60    логическое расположение (logical location): Расположение иерархически адресуемой переменной в схеме, которая может быть связана или может быть не связана с физической структурой входных и выходных переменных и памятью программируемого контроплера.

3.61    длинное действительное число (long real): Действительное число, представленное в двойном слове.

3.62    двойное слово (long word): 64-битовый элемент данных.

3.63    метод (method): Элемент языка, подобный функции, который может быть определен типом функционального блока и имеет неявный доступ к статическим переменным экземпляра функционального блока или экземпляра класса.

3.64    прототип метода (method prototype): Элемент языка, содержащий только сигнатуру метода.

3.65    именованный элемент (named element): Элемент структуры, именуемый своим связанным идентификатором.

3.66    сеть (network): Совокупность узлов и соединяющих ветвей.

3.67    числовой литерал (numeric literal): Литерал, прямо представляющий численное значение, то есть целый литерал или действительный литерал.

3.68    операция (operation): Элемент языка, который представляет элементарную функциональность. присущую программному компоненту или методу.

3.69    операнд (operand): Элемент языка, на котором выполняется операция.

3.70    оператор (operator): Символ, представляющий действие, выполняемое в операции.

3.71    переопределение (override): Ключевое слово override, использованное с методом или типом функционального блока для метода с такой же сигнатурой, как метод базового класса или тип функционального блока, использующие новое тело метода.

3.72    выходная переменная (output variable): Переменная, используемая для возврата значения из программного компонента, отличного от класса.

3.73    параметр (parameter): Переменная, которая используется для предоставления значения программному компоненту (как входной или входной-еыходной параметр), ипи переменная, которая используется для возврата значения из программного компонента (как выходной или входной-выход-ной параметр).

3.74    ссылка (reference): Определяемые пользователем данные, содержащие адрес размещения переменной или экземпляра функционального блока заданного типа.

3.75    поток энергии (power flow): Символический поток электроэнергии в релейно-контактной схеме. используемый для указания продвижения логического решающего алгоритма.

3.76    прагма (pragma): Конструкция языка для включения в программный компонент текста, который может влиять на подготовку программы к выполнению.

3.77    программа (program): Разработка, написание и тестирование программ пользователя.

3.78    программный компонент (program organization unit): Функция, функциональный блок, класс или программа.

3.79    действительный литерал (real literal): Литерал, прямо представляющий значения типа REAL или LREAL.

3.80    ресурс (resource): Элемент языка, соответствующий «функции обработки сигналов» и ее «человеко-машинному интерфейсу» и «функциям интерфейса с датчиками и исполнительными механизмами». при наличии таковых.

3.81    результат (result): Значение, возвращаемое как результат выполнения программного компонента.

3.82    возврат (return): Конструкция языка в программном компоненте, обозначающая конец последовательности выполнения в компоненте.

3.83    передний фронт (rising edge): Часть временной диаграммы сигнала, где происходит переход логической переменной из 0 в 1.

3.84    область видимости (scope): Набор программных компонент, в которых применяется объявление или метка.

3.85    семантика (semantics): Отношения между символическими элементами языка программирования и их значениями, интерпретацией и использованием.

3.86    полуграфическое представление (semigraphic representation): Представление графической информации с использованием ограниченного набора символов.

3.87    сигнатура (signature): Набор информации, однозначно определяющий идентичность интерфейса параметров МЕТОДА, состоящий из его имени и имен, типов и порядка всех его параметров (то есть входных, выходных и еходных-выходных переменных и типа результата).

3.88    одноэлементная переменная (single-element variable): Переменная, представляющая единственный элемент данных.

3.89    статическая переменная (static variable): Переменная, значение которой сохраняется от одного вызова до другого.

3.90    шаг (step): Ситуация, в которой поведение программного компонента в отношении его входных и выходных переменных следует набору правил, определенных связанными действиями шага.

3.91    структурированный тип данных (structured data type): Агрегированный тип данных, который был определен, используя определение STRUCT или FUNCTION_BLOCK.

3.92    индексирование (subscripting): Механизм для ссылки к элементу массива посредством ссылки на массив и одного или более выражений, которые, после их вычисления, определяют положение элемента.

3.93    задача (task): Элемент контроля выполнения, обеспечивающий периодическое или управляемое выполнение группы связанных программных компонентов.

3.94    литерал дат и времени (time literal): Литерал, представляющий данные типов TIME. ОАТЕ. TIME_OF_DAY или DATE_AND_TIME.

3.95    переход (transition): Условие, посредством которого управление переходит от одного или более предшествующих шагов к одному или более последующих шагов по направленной связи.

3.96    целое число без знака (unsigned integer): Целое число, которое может содержать положительные и нулевые значения.

3.97    литерал целого числа без знака (unsigned integer literal): Целый литерал, не содержащий спереди знака (+} или минус (-).

3.98    пользовательский тип данных (user-defined data type): Тип данных, определенный пользователем.

Пример — Перечисление, массив или структура.

3.99    переменная (variable): Объект программного обеспечения, который может принимать различные значения, в каждый момент времени только одно значение.

4 Структурные модели

4.1 Модель программного обеспечения

Основные элементы языка программирования высокого уровня и их взаимосвязи приведены на рисунке 1.

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

Примечание 1 — Рисунок 1 предназначен только для иллюстрации. Графическое представление не является нормативным.

Примечание 2 — В конфигурации с единственным ресурсом необязательно явно представлять ресурс.

Рисунок 1 — Модель программного обеспечения

Конфигурация является элементом языка, который соответствует системе программируемого контроллера. как определено в МЭК 61131-1. Ресурс соответствует «функции обработки сигналов» и ее «человеко-машинному интерфейсу» и «функциям интерфейса с датчиками и исполнительными механизмами» (при наличии таковых), как определено в МЭК 61131-1.

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

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

Задача способна вызывать (например, на периодической основе) выполнение набора программ и экземпляров функциональных блоков.

Конфигурации и ресурсы могут запускаться и останавливаться через функции «интерфейс оператора». «программирование, тестирование и мониторинг» или «операционная система», определенные в МЭК 61131-1. Запуск конфигурации будет вызывать инициализацию ее глобальных переменных с последующим запуском всех ресурсов конфигурации. Запуск ресурса будет вызывать инициализацию всех переменных в ресурсе с последующей активацией всех задач в ресурсе. Останов ресурса будет вызывать прекращение всех его задач, в то время как останов конфигурации будет вызывать останов всех ее ресурсов.

Механизмы управления задачами определены в 6.8.2. а механизмы запуска и останова конфигураций и ресурсов через функции взаимодействия определены в МЭК 61131-5.

Программы, ресурсы, глобальные переменные, пути доступа (и соответствующие привилегии доступа) и конфигурации могут быть загружены или удалены «функцией взаимодействия», определенной в МЭК 61131-1. Загрузка или удаление конфигурации или ресурса будет эквивалентно загрузке или удалению всех элементов, которые там содержатся.

Пути доступа и их соответствующие привилегии доступа определяются в настоящем стандарте.

Отображение элементов языка на объекты взаимодействия определено в МЭК 61131-5.

4.2 Модель взаимодействия

Способы связи значений переменных с элементами программного обеспечения иллюстрируются на рисунке 2.



с) еушцкмельные Споки вЭОимДОАСтвмя    fl)    через пут доступе


Примечание 1 — Рисунок 2 предназначен только для иллюстрации. Графическое представление не является нормативным.

Примечание 2 — В данном примере предполагается, что конфигурации С и D имеют один ресурс.

Примечание 3— На рисунке 2 не показаны детали функционального блока взаимодействия.

Примечание 4 — Пути доступа могут быть объявлены е прямо представленных переменных, входных, выходных или внутренних переменных программ или экземпляров функционального блока.

Примечание 5 — В МЭК 61131-5 определены средства, с помощью которых системы с PC и без PC могут испогъзовать пути доступа для чтения и записи переменных.

Рисунок 2 — Модель взаимодействия

Как показано на рисунке 2а), значения переменных е программе могут связываться прямо, соединением выхода одного программного элемента ко входу другого. Данное соединение явно показывается в графических языках и неявно в тестовых языках.

Значения переменных могут передаваться между программами в одной конфигурации через глобальные переменные, как переменная х. показанная на рисунке 2Ь). Такие переменные будут объявляться в конфигурации как GLOBAL, и в программах как EXTERNAL.

Как показано на рисунке 2с). значения переменных могут передаваться между различными частями программы, между программами в одной или различных конфигурациях или между программой PC и системой без PC. используя функциональные блоки взаимосвязи, определенные в МЭК 61131-5.

Кроме того, системы с и PC и системы без PC могут передавать данные, которые делаются доступными путями доступа, как показано на рисунке 2d), используя механизмы, определенные в МЭК 61131-5.

4.3 Модель программирования

На рисунке 3 показана сводка элементов языков программирования PLC. Комбинация этих элементов должна подчиняться следующим правилам:

1    Типы данных объявляются с использованием стандартных типов данных и любых ранее определенных типов данных.

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

Данные объявления должны использовать механизмы, определенные для языков IL, ST. LD или

FBD.

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

Данные объявления используют механизмы, определенные для языков IL. ST. LD или F8D, и могут включать в себя элементы последовательных функциональных схем (SFC).

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

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

Данные объявления используют механизмы, определенные в языках IL. ST. LO или FBD и могут в себя включать элементы последовательных функциональных схем (SFC).

5    Программы могут собираться в конфигурации, используя элементы, то есть: глобальные переменные. ресурсы, задачи и пути доступа.

Ссылка на «ранее определенные» типы данных, функции и функциональные блоки означает, что после того как некоторый элемент был объявлен, его определение доступно (например, в «библиотеке» ранее определенных элементов) для использования в дальнейших определениях.

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

Рямм щщтгтшшм агамакш    Создшм    Элемент, щщштшшм

и бийкотмыв элемента    пспыюозгапвм

тишынык

. wpewawiMi попым^щеы


(1>

#


Обышшме



йдодепонам пог*'*с*етолвм тгыдммт


Рисунок 3 — Сочетание элементов языка программируемых контроллеров, лист 1


где LD—язык релейно-контактных схем;

FBD — язык функционально-блоковых диаграмм:

1L — язык списка инструкций;

ST — язык структурированного текста;

Другие — другие языки программирования.

Примечание 1 —Числа от (1) до (5) в скобках относятся к соответствующим параграфам 1)—5) выше.

Примечание 2 — Типы данных используются во всех способах создания. Для четкости, соответствующие связи опущены на данном рисунке.

Рисунок 3 — Сочетание элементов языка программируемых контроллеров, лист 2

5 Совместимость

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

Средство программирования и отладки PLC (PADT), как определено в МЭК 61131*1. которое удов* летворяет полностью или частично требованиям настоящего стандарта и должно:

a)    обеспечивать подмножество свойств и предоставлять декларацию соответствия разработчика как описано ниже:

b)    не требовать включения альтернативных или дополнительных элементов языка для достиже* ния какого-либо свойства:

c)    предоставлять документ, определяющий все конкретные расширения разработчика. Сюда входят любые принятые системой свойства, которые запрещены или точно не определены:

<3) предоставлять документ, определяющий все специфические зависимости разработчика. В данный документ включают все зависимости реализации, явно определенные в настоящем стандарте, и ограничивающие параметры, такие как максимальная длина, количество, размер и диапазон изменений. которые на заданы явно:

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

Примечание — В настоящем стандарте только частично установлены ошибки, случающиеся во время выполнения программы, приведенной в МЭК61131;

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

5.2    Таблицы свойств

Все таблицы настоящего стандарта, используемые для конкретной цели, представлены единообразно. В первой графе содержится «номер свойства», во второй графе дается «описание свойства», следующие графы могут содержать примеры или дополнительную информацию. В декларации соответствия разработчика используется следующая структура таблицы.

5.3    Декларация соответствия разработчика

Разработчик может определить любое согласующееся подмножество свойств, перечисляемых в таблицах свойств и будет объявлять предоставляемое подмножество как «Декларацию соответствия разработчика».

Декларация соответствия разработчика будет включена в документацию, сопровождающую систему. или будет создаваться самой системой.

Формат декларации соответствия разработчика будет предоставлять следующую информацию (пример декларации соответствия приведен на рисунке 4}:

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

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

Заголовок и подзаголовок таблицы свойств, описание свойства, примеры, примечания разработчика и другая информация являются необязательными.

Нереализованные таблицы и свойства могут быть опущены.

МЭК 61131-3 «Языки программирования PLC»

Разработчик: Наименование компании, адрес и пр.

Продукт: Наименование продукта, версия и т. д. Тип контроллера и т. д.

Дата: 2012-05-01

Настоящий продукт удовлетворяет требованиям для следующих свойств: языка:

Ноиер

свой*

етва

Номер и заголовок таблицы/ Описание свойства

Соответствующим образом реализовано в языке (%')

Примечание

разработчика

LD

гео

ST

IL

Таблица 1 — Набор символов

1

ИСО/МЭК 10646:2012. Информационная технология — Универсальный набор символов (UCS)

V

V

V

V

Символы нижнего регистра: а. Ь. с....

<

V

V

Отсутствуют символы кЬ. и, а. 6»

Знак числа: # См. таблицу 5

<

Знак доллара $ См. таблицу 6

Таблица 2 — Идентификаторы

1

Буквы верхнего регистра и цифры IW215

2

Буквы верхнего и нижнего регистров, цифры и внутренние символы подчеркивания

3

Буквы верхнего и нижнего регистров, цифры и ведущие или внутренние символы подчеркивания

Таблица 3 — Комментарии

1

Однострочный комментарий//...

Многострочный комментарий {*... *>

Многострочный комментарий Л ... V

За

Вложенный комментарий (* ..(*.. *) ..*)

ЗЬ

Вложенный комментарий Г .. Г .. V.. V

Рисунок 4 — Декларация соответствия разработчика (пример)

Таблица 4 — Прагма

1

Прагма а фигурных скобках { ... }

Таблица 5 — Числовые литералы

1

Целый литерал: -12

2

Действительный литерал: -12.0

3

Действительные литералы с экспонентой: -1.34Е-12

4

Двоичный литерал: 2#1111_1111

5

Восьмеричный литерал: 8#377

6

Шестнадцатеричный литерал: 16#FF

7

Логический ноль и единица

8

Логические FALSE и TRUE

9

Типизированный литерал: INT#-123

Ит.д.

Рисунок 4

б Общие элементы

6.1    Использование печатных символов

6.1.1    Набор символов

Набор символов текстовых языков и текстовых элементов графических языков приведен в таблице 1. Символы представлены по ИСО/МЭК10646.

Таблица 1 — Набор символов

номер

Описание

1

ИСО/МЭК 10646

Символы нижнего регистра3*:

а. Ь, с

Знак числа: #

См. таблицу 5

Знак доллара: $

См. таблицу 6

*) Когда поддерживаются буквы нижнего регистра, регистр букв в элементах языка не учитывается за исключением комментариев, как определено 6.1.5, строковых литералах 6.3.3, и переменных типов STRING и WSTRING. как определено в 6.3.3.

6.1.2 Идентификаторы

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

Регистр букв не имеет значения в идентификаторах, например идентификаторы abed. АВСО и aBCd будут интерпретироваться одинаково.

Символ подчеркивания является существенным в идентификаторах, например. A_BCD и AB_CD будут интерпретироваться, как различные идентификаторы. Множественные ведущие или множественные внутренние символы подчеркивания не допустимы, например последовательности символов _LIM_SW5 и LIM.SWS не являются допустимыми идентификаторами. Завершающие символы подчеркивания не допустимы, например, последовательность символов LIM_SW5_ не является допустимым идентификатором.

Во всех системах, которые поддерживают использование идентификаторов, по меньшей мере. 6 символов будет учитываться при определении уникальности идентификатора, например, во всех таких системах. ABCDE1 будет интерпретироваться отличным от ABCDE2. Максимально допустимое число символов, разрешенное в идентификаторе, определяется разработчиком.

Свойства и примеры идентификаторов приведены в таблице 2.

Таблица 2 — Идентификаторы

Номер

Описание

Пример

1

Буквы верхнего регистра и цифры IW215

IW215IW215Z QX75 IDENT

2

Буквы верхнего и нижнего регистров, цифры и внутренние символы подчеркивания

Все приведенные выше плюс: L1M_SW_5 LimSwS abed ab_Cd

3

Буквы верхнего и нижнего регистров, цифры и ведущие или внутренние символы подчеркивания

Все приведенные выше плюс: _MA1N_12V7

6.1.3    Ключевые слова

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

Например, ключевые слова FOR и for синтаксически эквивалентны. Они не должны использоваться в любых других целях, например, как имена переменных или расширения.

6.1.4    Использование символов-разделителей

Пользователю разрешено вставлять один или более «символов-разделителей» в любом месте текста программ программируемого контроллера, только не внутри ключевых слов, литералов, перечисленных значений, идентификаторов, прямо представленных переменных или разделительных сочетаний. например, для комментариев. «Символ-разделитель» определяется как символ SPACE с кодированным числовым значением 32. а также как непечатаемые символы, такие как символ табуляции, символ перевода строки и т. л., которым в МЭК/ИСО 10646 не придано закодированного значения.

6.1.5    Комментарии

Имеются различные виды комментариев, приведенные в таблице 3.

1    Однострочные комментарии начинаются с комбинации символов /У и заканчиваются на следующем символе перевода строки, новой строки, подачи (прогона) страницы или возврата каретки.

В однострочном комментарии специальные комбинации символов (* и *) или /* и V не имеют специального значения.

2    Многострочном комментарии разделяются вначале и в конце специальными комбинациями символов (* и'). соответственно.

Альтернативно, многострочный комментарий может предоставляться, используя специальные комбинации символов I* и V.

В многострочном комментарии специальная комбинация символов U не имеет специального значения.

Комментарии разрешены в любом месте программы, где разрешены пробелы, только не внутри символьно-строковых литералов.

Комментарии не имеют никакого синтаксического и семантического значения ни в одном из языков. определенных в данном стандарте. Они трактуются как символы-разделители.

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

-    пары (*. *). например. (•... (* ВЛОЖЕННЫЙ КОММЕНТАРИЙ *)... •) или

-    пары Г, V,например. Г ... Г ВЛОЖЕННЫЙ КОММЕНТАРИЙ V... Ч.

Таблица 3 — Комментарии

Номер

Описание

Пример

1

Однострочный комментарий

и...

Х:= 13; // комментарий для одной строки // однострочный комментарий может начинаться И с позиции первого символа

Многострочный комментарий с (*...')

(* текст комментария')

Комментарий а рамке на трех строках

Многострочный комментарий с /•... V

Г комментарий на одной или более строк V

За

Вложенный комментарий с

С •• (* ••в) ••')

(• Г ВЛОЖЕННЫЙ КОММЕНТАРИЙ *> *>

ЗЬ

Вложенный комментарий с

г ..г V

Г Г ВЛОЖЕННЫЙ КОММЕНТАРИЙ V V

6.2 Прагма

Как показано в таблице 4. прагмы ограничиваются в начале и в конце фигурными скобками { и }. соответственно. Синтаксис и семантика конструкций конкретной прагмы определяются разработчиком.

Комментарии разрешены е любом месте программы, где разрешены пробелы, только не внутри сим* вольно-строковых литералов.

Таблица 4 — Прагма

Описание

Пример

Прагма с фигурными скобками

(ВЕРСИЯ 2.0}

(...)

(АВТОР JHC)

(х:= 256. у:= 384}

6.3 Литералы — внешнее представление данных

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

Внешние представления данных в различных языках программирования программируемых контроллеров состоят из числовых литералов, символьно-строковых литералов и литералов дат и времени.

Признана необходимость в обеспечении внешних представлений для двух различных типов данных, связанных со временем:

• данные о продолжительности времени при измерении и контроле событий:

- данные о времени суток, которые могут также включать в себя информацию о дате — для синхронизации начала и окончания событий в абсолютной временной шкале.

6.3.2    Числовые литералы и строковые литералы

Имеется два типа числовых литералов: целые литералы и действительные литералы. Числовой литерал определяется как десятичное число или число с основанием. Максимальное количество цифр для каждого вида числовых литералов должно быть достаточным для выражения всего диапазона значений с требуемой точностью для всех типов данных, которые представляются литералами в заданной реализации.

Единичные символы подчеркивания «_». вставленные между цифрами числового литерала не являются существенными. Никакое иное использование символов подчеркивания в числовых литералах не разрешается.

Десятичные литералы представляются в обычной десятичной нотации. Действительные литералы характеризуются наличием десятичной точки. Экспонента указывает на целую степень 10. на которую должно умножаться предшествующее число, чтобы достичь представленного значения. Десятичные литералы и экспоненты литералов могут содержать предшествующий знак «+» или «-».

Литералы могут также представляться с основаниями 2. 8 и 16. Основание указывается в десятичной нотации. Для основания 16 используется расширенный набор цифр, состоящий из буке от А до F. с оговоренным десятичным значением от 10 до 15. соответственно. Числа с основанием не содержат ведущего знака «♦» или «-». Они интерпретируются как битово-строковые литералы.

Числовые литералы, представляющие положительные целые значения, могут использоваться как битово-строковые литералы.

Логические данные представляются числовыми литералами со значением (0) или один (1). или ключевыми словами FALSE или TRUE, соответственно.

Свойства и примеры числовых литералов приведены в таблице 5.

Тип данных логических или числовых литералов может указываться добавлением префикса типа к литералу, состоящего из имени элементарного типа данных и символа «#». Примеры приведены в свойстве 9 таблицы 5.

Таблица 5 — Числовые литералы

Номер

Описание

Пример

Обьяснение

1

Целый литерал

-12.0. 123.4.+986

2

Действительный литерал

0.0. 0.4560. 3.14159.26

3

Действительные литералы с экспонентой

-1.34Е-12. -1.34в-12 1.0Е+6. 1.0е+6 1.234Е6. 1.234е6

4

Двоичный литерал

2#1111_1111

2#1110_0000

Литерал с основанием 2 для представления:

десятичного числа 255 десятичного числа 224

5

Восьмеричные литералы

8#377 8# 340

Литерал с основанием 8 для представления:

десятичного числа 255 десятичного числа 224

6

Шестнадцатеричный

литерал

16#FF или 16#ff 16#Е0 или 16#е0

Литерал с основанием 16для представления:

десятичного числа 255 десятичного числа 224

7

Логический ноль и единица

0 или 1

8

Логические FALSE и TRUE

FALSE TRUE

9

Тигмзированный литерал

INT#-123

Представление (NT десятичного значения -123

INT#16#7FFF

Представление (NT десятичного значения 32767

WORD#16#AFF

Представление WORD шестнадцатиричного значения 0AFF

WORD#1234

Представление WORD десятичного значения 1234=16#4D2

UINT#16#89AF

Представление UINT шестнадцатиричного значения 89AF

CHAR#16#41

Представление CHAR символа 'А'

BOOL#0

BOOL#1

BOOUJFALSE

BOOUfTRUE


Примечание 1 — Ключевые слова FALSE и TRUE соответствуют логическим значениям 0 и 1. соответственно.


Примечание 2 — Свойство 5 «Восьмеричные литералы» не рекомендуется и может не быть включено в следующую редакцию настоящего стандарта.


6.3.3 Символьно-строковые литералы

Символьно-строковые литералы содержат однобайтовые или двухбайтовые кодированные символы:

•    символьно-строковый литерал однобайтовых символов является последовательностью нуля или более символов, с предшествующим и завершающим символом одиночной кавычки ('). 8 строках однобайтовых символов, трехсимволькая комбинация символа доллара ($) с двумя следующими шестнадцатиричными символами интерпретируется как шестнадцатиричное представление восьмибитового кода символа, как показано в свойстве 1 таблицы 6;

•    символьно-строковый литерал двухбайтовых символов является последовательностью 0 или более символов из набора символов ИСО/МЭК 10646. с предшествующим и завершающим символом двойной кавычки (к). В строках однобайтовых символов, трехсимвольная комбинация символа доллара {$) с двумя следующими шестнадцатиричными символами интерпретируется как шестнадцатиричное представление восьмибитового кода символа, как показано в свойстве 2 таблицы 6.

Примечание —Отношение стандартов ИСО/МЭК 10646 и Юникод:

Несмотря на то. что коды символов и формы кодирования стандартов Юникод и ИСО/МЭК 10646 синхронизированы, стандарт Юникод налагает дополнительные ограничения на реализации, чтобы гарантировать. что они трактуют символы одинаково во всех платформах и приложениях. В связи с этим, данный стандарт предоставляет широкий набор спецификаций функциональных символов, данных символов, алгоритмов и обширный справочный материал, который отсутствует в ИСО/МЭК 10646.

Двухсимвольные комбинации, начинающиеся с символа доллара интерпретируются, как показано в таблице 7, когда они встречаются в строках символов.

Таблица 6 — Симвоге>но-строкоаыегенералы

Номер

Описание

Пример

Односимвольные символы и строки символов с ' *

Пустая строка (длины ноль)

м

Строка длины 1 или символ CHAR, содержащий единственный символ

А-

Строка длины один или символ CHAR, содержащий символ пробела

• •

Id

Строка длины один или символ CHAR, содержащий символ одиночной кавычки

$

Строка длины один или символ CHAR, содержащий символ двойной кавычки

V

11

Поддержка двухсимвольных комбинаций таблицы 7

SR$L'

Поддержка представления символа с знаком доллара ’$' и двумя шестнадцатиричными цифрами

S0A'

Двухбайтовые символы или символьные строки с «» (Примечание)

Пустая строка (длины ноль)

«»

Строка длины один или символ WCHAR. содержащий единственный символ

«А»

Строка длины один или символ WCHAR. содержащий символ пробела

« »

2d

Строка длины один или символ WCHAR. содержащий символ одиночной кавычки

к*»

Строка длины один или символ WCHAR, содержащий символ двойной кавычки

<5**

2f

Поддержка двухсимвольных комбинаций таблицы 7

«$R$L*

2h

Поддержка представления символа с знаком доллара '$' и четырьмя шестнадцатиричными цифрами

«$ООС4»

Типизированные однобайтовые символы или строковый литерал с #

За

Типизированная строка

STRINGrOK'

30

Типизированный символ

CHAR#'X‘

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

Номер

Описание

Пример

Двухбайтовые типизированные строковые литератн с # (NOTE)

Типизированные двухбайтовые строки (с использованием символа двойной кавычки)

WSTRING#«OK»

Типизированный двухбайтовый символ (с использование символа двойной кавычхи)

WCHAR#«X»

4d

Типизированный двухбайтовый символ (с использованием символа одиночной кавычки)

WCHARTX'

Примечание — Если конкретная реализация поддерживает свойство 4. но не поддерживает свойство 2, Реализатор может определить синтаксис и семантику для использования символа двойной кавычки.

Таблица 7 — Двухсимвольные комбинации в символьных строках

Номер

Описание

Комбинации

1

Знак доллара

SS

2

Единичная кавычка

S

3

Перевод строки

$L или $1

4

Новая строка

$N или Sn

5

Прогон (перевод) страницы

SP или $р

6

Возврат каретки

SR или Sr

7

Табуляция

$Т или $t

8

Двойная кавычка

$*

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

Примечание 2 — Комбинация S’ действительна только внутри строковых литералов с одиночными кавычками.

Примечание 3 — Комбинация $» действительна только внутри строковых литералов с двойными кавычками.

6.3.4 Литерал продолжительности времени

Данные продолжительности времени ограничиваются слева ключевым словом Т#. TIME# или LTIME#. Представление данных о продолжительности времени в терминах дней, часов, минут, секунд и долей секунды, или любой их комбинации поддерживается как показано в таблице 8. Наименьшая единица времени может быть записана в нотации действительных чисел без экспоненты.

Единицы литералов продолжительности времени могут разделяться символами подчеркивания.

Разрешается «переполнение» самой большой единицы продолжительности времени, например нотация Т#25П_15т является допустимой.

Единицы времени (например, секунды, миллисекунды и т. д.) могут быть представлены буквами верхнего или нижнего регистра.

Как показано в таблице 8, для продолжительности времени разрешены как положительные, так и отрицательные значения.

Таблица 8 — Литералы продолжительности времени

Номер

Описание

Пример

Сокращения продолжительности времени

d

День

h

Час

m

Минута

1d

8

Секунда

ms

Миллисекунда

If

us {если символ p недоступен)

Микросекунда

19

ns

Наносекунда

Литералы продолжительности времени без символов подчеркивания

короткий префикс

T#14ms T#-14msLT#14.7s T#14.7m

T#14.7h t#14.7d t#25h15m

lt#5d 14h 12m 18s3.Sms W12h4m34ms230us400ns

длинный префикс

TIME#14ms TIME#-14ms time#14.7s

Литералы продолжительности времени с символами подчеркивания

За

короткий префикс

t#25h_15m t#5d_14h_12m_18s_3.5ms LTIME#5m_30s_500ms_100.1us

30

длинный префикс

TIME#25h_15m

ltime#5d_14h_12m_18s_3.5ms

LTIME#34s_345ns

6.3.5 Литерал даты и времени суток

Ключевые слова префикса литералов для времени суток и даты приведены в таблице 9.

Таблица 9 — Литералы даты и времени суток

Номер

Описание

Пример

1a

Литерал даты (длинный префикс)

DATE#1984*06*25. date#2010-09*22

1b

Литерал даты (короткий префикс)

□#1984*06*25

2a

Длиншй литерал даты (длинный префикс)

LDATE#2012-02-29

2b

Длинный литерал даты (короткий префикс)

LD#1984-06*25

3a

Литерал времени суток (длинный префикс)

TlME.Of _DAY#15:36:55.36

3b

Литерал времени суток (короткий префикс)

TOD#15:36:55.36

4a

Длинный литерал времени суток (короткий префикс)

LTOD#15:36:55.36

4b

Длинный литерал времени суток (длинный префикс)

LTIME_OF_DAY#15:36:55.36

Sa

Литерал даты и времени (длинный префикс)

DATE_AND_TIME#1984*06*25*15:36:55.360227400

5b

Литерал даты и времени (короткий префикс)

DT#1984*06*25*15:36:55.360_227_400

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

Номер

Описание

Пример

Длинный литерал даты и времени (длинный префикс)

LDATE_AND_TIME#1984-06-25-15:36:55.360_227_400

Длинный литерал даты и времени (короткий префикс)

LDT#1984-06-25-15:36:55.360_227_400

6.4 Типы данных

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

Тип данных — это классификация, которая определяет возможные значения для литералов и переменных, операции, которые можно выполнять и способ хранения значений.

6.4.2    Элементарные типы данных (BOOL, INT, REAL, STRING и т. д.)

6.4.2.1 Спецификация элементарных типов данных

Настоящий стандарт устанавливает набор (предопределенных) элементарных типов данных. Элементарные типы данных, ключевое слова для каждого типа данных, число битов на элемент данных и диапазон значений для каждого элементарного типа данных приведены в таблице 10.

Таблица 10 — Элементарные типы данных

Номер

Описание

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

Неявное начальное значение

Длина

(бит>*>

1

Логический

BOOL

0. FALSE

1h|

2

Короткое целое

SINT

0

8C)

3

Целое

INT

0

16е»

4

Двойное целое

DINT

0

324

5

Длинное целое

LINT

0

64C>

6

Короткое целое без знака

USINT

0

8dl

7

Целое без знака

UINT

0

16в'

8

Двойное целое без знака

UDINT

0

32Я|

9

Двойное целое без знака

ULINT

0

64е'

10

Действительные числа

REAL

0.0

32е)

11

Длинные целые

LREAL

0.0

64"

12а

Продолжительность времени

TIME

T#0s

В)

12Ь

Продолжительность времени

LTIME

LTIMEWs

54m)4)

13а

Дата (отдельно)

DATE

Примечание

_ ь»

13Ь

Длинная дата (отдельно)

LDATE

LDATE#1970-01-01

64">

14а

Время суток (отдельно)

TIME_OF_DAY или TOD

TOD#00:00:00

_ь>

14Ь

Время суток (отдельно)

LTIME OF DAY или LTOD

LTOD#00:00;00

64°,ч>

15а

Дата и время суток

DATE_AND_TIME или DT

Примечание

_ь>

150

Дата и время суток

LDATE AND TIME ww LDT

LDT#1970-01-01-00:00:00

64Р,Ч>

14а

Время суток (отдельно)

TIME_OF_DAY или TOD

TOD#00:00:00

_Ь>

140

Время суток (отдельно)

LTIME OF DAY или LTOD

LTOD#00;00:00

64°»’ч>

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

Номер

Описание

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

Неявное начальное значение

Длина

(6ит>«

15а

Дата и время суток

DATE.AND.TIME или DT

Примечание

_Ь)

15Ь

Дата и время суток

LOATE AND TIME или LDT

LDT#1970-01-01-00:00:00

64Р,Ч>

16а

Строка однобайтовых символов переменной длины

STRING

”(пустая)

8‘). 9Х

1вЬ

Строка двухбайтовых символов переменной длины

WSTRING

”(пустая)

'). 0). W.4

17а

Однобайтовый символ

CHAR

$00'

17Ь

Двухбайтовый символ

WCHAR

*$0000»

16*"

16

Битовая строка длины в

BYTE

16#00

^.9)

19

Битовая строка длины 16

WORO

1640000

tei).gl

20

Битовая строка длины 32

OWORD

1640000.0000

32i)-9l

21

Битовая строка длины 64

LWORD

1640000.0000.0000.0000

64i>- 9>

Примечание — Определяется разработчиком, так как специальное стартовое значение отлично от 0001-01-01.

8> Значения в данной колонке интерпретируются как описано в подстрочных примечаниях к таблице.

ь> Диапазон значений и точность представления в данных типах данных определяются разработчиком.

с* Диапазон значений переменных данного типа данных от — (2м'1) до (2м'1) -1.

d> Диапазон значений переменных данного типа данных от 0 до (2м) -1.

в> Диапазон значений переменных данного типа данных определяется в МЭК 60559 для основного формата с плавающей точкой одинарной точности. Результаты арифметических команд с ненормализованными значениями, бесконечным значением и нечисловыми значениями определяются разработчиком.

0 Значение переменных данного типа данных определяется в МЭК 60559 для основного формата с плавающей точкой двойной точности. Результаты арифметических хоманд с ненормализованными значениями, бесконечным значением и нечисловыми значениями определяются разработчиком.

9> Числовой диапазон значений не применяется к данному типу данных.

Возможные значения переменных этого типа данных: 0 и 1. соответствующие ключевым словам FALSE и TRUE соответственно.

') Значение N указывает на число битов или символе» для этого типа данных.

I) Значение N указывает на число битов в битовой строке для этого типа данных.

1(1 Допустимая переменных типов STRING и WSTRING определяется разработчиком.

’> Типов CHAR. STRING. WCHAR и WSTRING испогъзуется кодировка по ИСО/МЭК 10646 (см. 6.3.3).

Тип данных LTIME является 64-битовым целым числом со знаком, значение задается в наносекундах.

п> Тип данных LDATE является 64-битовым целым числом со знаком, значение задается в наносекундах, с начальной датой 1970-01-01.

Тип данных LTOD является 64-битовым целым числом со знаком, значение задается в наносекундах, начальное время с полуночи TOD#00;00:00.

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

6.4.2.2 Элементарные строковые типы данных (STRING. WSTRING)

Максимальная поддерживаемая длина элементов типа STRING и WSTRING задается разработчиком и определяет максимальную длину STRING и WSTRING. которая поддерживается средствами программирования и отладки.

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

Доступ к отдельным символам строки в элементах данных CHAR или WCHAR осуществляется указанием в квадратных скобках позиции символа в строке, начиная с позиции 1.

Ошибка возникает, если к строкам двухбайтовых символов осуществляется доступ с использованием однобайтовых символов или если к строкам однобайтовых символов осуществляется доступ с использование двухбайтовых символов.

Пример 1 — Типы STRING, WSTRING и CHAR. WCHAR

a)    Объявление

VAR

Stringl: STRING[10]:= 'ABCD';

String2: STRING(10]:-

aWStrings: ARRAY[0..1J OF WSTRING:- Г1234" “5678"];

Chari: CHAR;

WCharl: WCHAR;

END_VAR

b)    Использование типов STRING и CHAR Char1:= String 1(2); //эквивалентно Chari:- 'S';

String1(3]:- Chari; //приводит к Stringl:- ‘ABBD’

String1(4]:- 'В'; //приводит к Stringl~ 'ABBB'

String1[1]:= String1[4J; // приводит к Stringl:= ‘BBBB’

String2:= String1[2]: (‘ приводит к String1:= ‘BBBB’

если было выполнено неявное преобразование CHAR_TO_S TRING')

c)    Использование типов WSTRING и WCHAR WCharl:= aWStrings[1](2); //эквивалентно WCharl:- 'S'; aWStrings[1][3]:=WChar1; // приводит к aWStrings(1):= «5668» aWStrings[1]{4]:- *6»; // приводит к aWStrings[1]:= “5666”

WStrings[1][1}:- aWStrings(1][4J;//приводит к Stringl:- ”6666” aWStrings[0]:= aWStrings[1}(4]: f приводит aWStringsfO):- “6”;

если было выполнено неявное преобразование WCHAR_Т0_WSTRING')

d)    Эквивалентные функции (см. 6.6.2.5.11}

Chari := String1[2J:

эквивалентно

Chari:- STRING_TO_CHAR(Mid(IN:- Stringl, L:- 1, P:- 2));

aWStrings[1][3):= WCharl:

эквивалентно

REPLACE(IN1:-aWStrings[1}. /А/2.- WCharl, L:= 1. P:=3);

e)    Случаи ошибки

Chari:- String 1(2]; H смешивание типов WCHAR.

STRING StringH2}:- String2:

// требует неявного преобразования STRING_TO_CHAR. которое не разрешено

Примечание — Типы данных для отдельных символов (CHAR и WCHAR) могут содержать только один символ. Строки могут содержать несколько символов; поэтому строки могут содержать дополнительную информацию для управления, которая не нужна для отдельных символов.

Пример 2 — Если тип STR10 объявлен как TYPE STR10: STRING[10):- 'ABCDEF; END_TYPE.

то максимальная длина STR10 равна 10 символам, начальное значение по умолчанию равно ‘ABCDEF’. и начальная длина элементов данных типа STR10 равна шести символам.

6.4.3 Родовыо типы данных

В дополнение к элементарным типам данных, приведенным в таблице 10. в спецификации вход* ных и выходных переменных стандартных функций и функциональных блоков можно использовать иерархию родовых типов данных, локаэанных на рисунке 5. Родовые типы данных определяются по префиксу «ANY».

При использовании родовых типов данных следует соблюдать следующие правила:

1    Родовой тип прямо порожденного типа является таким же. как родовой тип элементарного типа, из которого он порожден.

2    Порожденным типом типа-диапазона является ANYJNT.

Родовым типом всех других порожденных типов, приведенных в таблице 11. является ANY. DERIVED.

Использование родовых типов данных в определенных пользователем программных компонентов находится вне области действия настоящего стандарта.

Родовые типы данных

Родовые типы данных

Группы элементарных типов данных

ANY

g>

ANY.DERIVED

ANY.ELEMENTARY

ANY.MAGNITUDE

ANY.NUM

ANY.REAL

h>

REAL. LREAL

ANYJNT

ANYJJNSIGNED

USINT. U1NT. UD1NT. ULINT

ANY.SIGNED

SINT. INT. DINT. LINT

ANY.DURATION

TIME. LT1ME

ANY.BIT

BOOL. BYTE. WORD. DWORD. LWORD

ANY.CHARS

ANY.STRING

STRING. WSTRING

ANY_CHAR

CHAR. WCHAR

ANY.DATE

DATE.AND.TIME, LDT. DATE. TlME_OF_DAY. LTOD

Рисунок 5 — Иерархия родовых типов данных

6.4.4 Определенные пользователем типы данных

6.4.4.1    Объявление (TYPE)

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

Назначение определенных пользователем типов данных — это их использование в объявлении других типов данных и в объявлениях переменных.

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

Определенные пользователем типы данных объявляются, используя текстовую конструкцию TYPE...END.TYPE. Объявление типа состоит из следующих элементов:

-    имя типа:

• символ двоеточия *:»;

-    объявление собственно типа, как определено в следующих предложениях.

Пример — Объявление типа

TYPE

myDatatypel: <объявление типа с необязательной инициализацией; END_TYPE 22

6.4.4.1.2 Инициализация

Определенные пользователем типы данных могут быть инициализированы определенными пользователем значениями. Такая инициализация имеет приоритет над неявным начальным значением.

Определенная пользователем инициализация следует за объявлением типа и начинается оператором присваивания «:=». за которым следует начальное значение (значения).

Могут использоваться литералы (например. -123. 1.55. «аЬс») или константные выражения (например. 12*24). Используемые начальные значения должны иметь совместимый тип. то есть тот же самый тип или тип. который может быть конвертирован, используя неявное преобразование типа.

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

Родовой тип данных

Инициализировано литералом

Результат

ANYJJNSIGNED

Неотрицательный целый литерал или неотрицательное константное выражение

Неотрицательное целое значение

ANY.SIGNED

Целый литерал или константное выражение

Целое значение

ANY.REAL

Числовой литерал или константное выражение

Числовое значение

ANY.BIT

Целый литерал без знака или константное выражение без знака

Целое значение без знака

ANY.STRING

Битово-строковый литерал

Строковое значение

ANY.DATE

Литерал даты и времени суток

Значение даты и времени суток

ANY .DURATION

Литерал продолжительности времени

Значение продолжительности времени

Рисунок 6 — Инициализация литералами и константными выражениями (правила)

В таблице 11 определены свойства объявления типов данных и их инициализации, определенных пользователем.

Таблица 11 —Объявление определенных пользователем типов данных и их инициализации

Номер

Описание

Пример

Объяснение

Перечислимые типы

TYPE

данных

ANALOG.SIGNAL.RANGE:

(BIPOLAR.10V.

UN1POLARJOV. UNlPOLAR_1_5V. UN1POLAR_0_5V. UNIPOLAR_4_20_MA. UN1POLAR_0_20_MA)

:= UNIPOLAR_1_5V:

END.TYPE

Инициализация

Типы данных с именованными значениями

TYPE

Colors: DWORD

(Red :» 16#OOFFOOOO.

Green:» 160OOOOFFOO.

Blue := 16WOOOOOFF.

White:» Red OR Green OR Blue. Black:» Red ANO Green AND Blue) :» Green:

END.TYPE

Инициализация

Продолжение таблицы 11

Номер

Описание

Пример

Объяснение

За

ЗЬ

Тип — диапазоны

TYPE

ANALOG.DATA: 1NT(-4095 .. 4095):= 0: END.TYPE

Типы данных — массивы

TYPE ANALOG.16_INPUT.DATA: ARRAY [1..16J OF ANALOG.DATA := (8{-4095). 8(4095)]; END.TYPE

ANALOG.DATA см. выше.

Инициализация

5а 5Ь

Типы функциональных блоков и классы как элементы массива

TYPE

TONs: ARRAY(1 ..50] OF TON := (50(PT:=T#100ms)]: END.TYPE

Инициализация функционального блока TON как элемента массива

Структурированный тип данных

TYPE ANALOG.CHANNEL.CONFIGURATION: STRUCT

RANGE: ANALOG.SIGNAL.RANGE: MIN.SCALE: ANALOG.DATA:* -4095: MAX.SCALE: ANALOG_DATA:=4095; END.STRUCT;

END.TYPE

см. выше ANALOG SIGNAL RANGE

Типы функциональных блоков и классы как элементы структуры

TYPE

Cooler: STRUCT Temp: INT;

Cooling: TOF:= (PT:=T#100ms); END.TYPE

Функциональный блок TOF как элемент структуры

Структурированный тип данных с относительной адресацией АТ

TYPE

Coml.dala: STRUCT

head AT %B0: INT: length AT %82: US(NT:= 26; flag! AT %X3.0: BOOL; end AT %825: BYTE;

END.STRUCT;

END.TYPE

Явное расположение без перекрытия

Структурированный тип данных с относительной адресацией АТ и OVERLAP

TYPE

Com2_data: STRUCT OVERLAP head AT %B0: INT: length AT %B2: USINT; flag2 AT %X3.3: BOOL: datal AT %B5: BYTE: data2 AT %S5: REAL: end AT %B19: BYTE: END.STRUCT;

END.TYPE

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

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

Номер

Описание

Пример

Объяснение

10a

10b

Прямо представленные элементы структуры — частично определенные, используя Я*»

TYPE

HW.COMP: STRUCT;

IN AT %P: BOOL;

OUT_VAR AT %Q*: WORD:* 200; ITNL.VAR: REAL:* 123.0; II nol located END.STRUCT;

END.TYPE

Присваивает компоненты структуры еще не локализованным входным и выходным переменным, см. примечание 2

11a

11b

Прямо производный тип данных

TYPE

CNT: UINT;

FREQ: REAL:* 50.0; ANALOG.CHANNEL.CONFIG: ANALOG.CHANNEL.CONF1GURATION :* (MIN.SCALE:* 0. MAX_SCALE:= 4000); END.TYPE

Инициализация Новая инициализация

12

Инициализация с испотъзованием константных выражений

TYPE

P!x2: REAL:* 2 *3.1416: END.TYPE

Использует константное выражение

Примечание 1 — Возможно объявление типа данных без инициализации (свойство «а»} или с инициализацией (свойство «Ь»). Если поддерживается свойство «а». тип данных инициализируется с неявным начальным значением. Если поддерживается свойство «Ьв. тип данных инициализируется с данным значением или неявным начальным значением, если начальное значение не дано.

Примечание 2 — Переменные с прямо представленными элементами — частично определенными, используя «'». не могут использоваться в секциях VAR.INPUT или VAR_IN_OUT.

6.4.4.2 Перечислимый тип данных

6.4.4.2.1 Общие положений

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

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

Различные перечислимые типы данных могут использовать одинаковые идентификаторы для перечислимых значений. Максимально допустимое число перечислимых значений определяется разработчиком.

Для обеспечения уникальной идентификации при использовании е конкретном контексте, перечислимые литералы могут уточняться префиксом, состоящим из имени ассоциированного типа данных и символа номера «#». аналогично типизированным литералам. В перечне перечисления префиксы не используются.

Происходит ошибка, если в перечислимом литерале недостаточно информации для однозначного определения его значения (см. пример ниже).

Пример — Перечислимый тип данных

TYPE

Trafficjight: (Red, Amber, Green);

Paintingjcolors: (Red, Yellow, Green. Blue):- Blue;

END_TYPE

VAR

My_Traffic_light: Trafficjight;* Red;

ENDJVAR

IF My_TrafficJight - TrafficJight*Amber THEN... //OK

IF My_TrafficJight - TrafficJighttRed THEN... //OK

IF My_TrafficJight = Amber THEN... U OK — идентификатор Amber уникален

IF My_Traffic_light = Red THEN... // ОШИБКА — идентификатор Red не является уникальным

S.4.4.2.2 Инициализация

Неявное начальное значение перечислимого типа данных — первый идентификатор в связанном перечне перечисления.

Пользователь может инициализировать тип данных определенным пользователем значением из перечня перечислимых значений данного типа. Такая инициализация имеет приоритет.

Как показано в таблице 11 для ANALOG_SIGNAL_RANGE, определенное пользователем началь* ное значение перечислимого типа данных — это присвоенное значение UNIPOLAR_1_5V.

Определенное пользователем присваивание начального значения типа данных является свой* ством в таблице 11.

6.4.4.3 Тип данных с именованными значениями

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

Связанным с перечислимым типом данных, где перечислимые идентификаторы не заданы паль* зователем, является перечислимый тип данных с именованными значениями. Объявление определяет тип данных и присваивает значения именованных переменных, как показано в таблице 11.

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

Для обеспечения уникальной идентификации при использовании в конкретном контексте, имено* ванные значения могут уточняться префиксом, состоящим из имени ассоциированного типа данных и символа номера «#». аналогично типизированным литералам.

В перечне объявления префиксы не используются. Происходит ошибка, если в перечислимом литерале недостаточно информации для однозначного определения его значения (см. пример).

Пример — Гол данных с именованными значениями

TYPE

Traffic_light: INT(Red:- 1, Amber := 2. Green:= 3)~ Green;

Painting_colors: INT (Red:- 1, Yellow:= 2, Green;* 3, Blue:= 4):= Blue:

END_TYPE

VAR

My_Trafficjight Traffic_light:

END VAR

My_Traffic_light:= 27; I/ Присваивание константы IF My_Traffic_light = Amber THEN .Jf Присваивание выражения

//Примечание — Это невозможно для перечислимых значений My_TrafficJight:= TrafficJighttRed * 1;

IF My_TrafficJight

-123 THEN...

//OK

IF My_TrafficJight

= Traffic Jight9Amber

THEN...

//OK

IF My_Tra№cJight

- TrafftcJightURed

THEN...

//OK

IF My_Tra№cJight

- Amber THEN...

ll OK — идентификатор Amber

уникален IF My_Traffic_light

= Red THEN...

// ОШИБКА — идентификатор

Red не является уникальным

6.4.4.3.2    Инициализация

Неявное значение для типа данных с именованными значениями — это первый элемент данных в перечне перечисления. В приведенном выше примере для Trafficjight таким элементом является Red.

Пользователь может инициализировать тип данных определенным пользователем значением. Инициализация не ограничивается именованными значениями — может использоваться любое значение из диапазона базового типа. Такая инициализация имеет приоритет.

В пример, определенным пользователем начальным значением перечислимого типа для Traffic, light является Green.

Определенное пользователем присваивание начального значения типа данных является свойством в таблице 11.

6.4.4.4    Тип-диапазон

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

Декларацией типа-диапазона определено, что значение любого элемента данных этого типа может принимать значения между указанными верхними и нижними пределами (включительно), как показано в таблице 11.

Пределы в типе-диапазоне должны быть литералами или константными выражениями.

Пример —

TYPE

ANALOGJDATA: !NT(-4095.. 4095):- 0;

END_TYPE

64.4.4.2    Инициализация

Неявные начальные значения для типов данных с диапазоном — это первый (нижний) предел диапазона.

Пользователь может инициализировать тип данных определенным пользователем значением из диапазона. Такая инициализация имеет приоритет.

Например, как показано в примере, приведенном в таблице 11. неявное начальное значение элементов типа ANALOG.DATA равно *4095. в то время, как при явной инициализации, неявное начальное значение равно нулю (как объявлено).

6.4.4.5    Типы данных — массивы

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

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

Массив — это совокупность элементов данных одинакового типа. В качестве типа элемента массива могут использоваться элементарные и определенные пользователем типы данных, типы функциональных блоков и классы. На данную совокупность элементов данных ссылаются с помощью одного или более индексов, заключенных в квадратные скобки и разделенных запятыми. Если значение индекса выходит за пределы, указанные в объявлении массива, возникает ошибка.

Примечание —Для вычисляемых индексов такая ошибка может быть обнаружена только во время выполнения.

Максимальное число индексов массива, максимальный размер массива и максимальный диапазон значений индекса определяются разработчиком.

Пределы в диапазона индекса должны быть литералами или константными выражениями. Массивы переменной длины определены в 6.5.3.

В языке ST индекс является выражением, производящим значение, соответствующее одному из подтипов родового типа ANYJNT.

Форма индексов в языке IL и графических языках, определенных в разделе 8. ограничена одноэлементными переменными или целыми литералами.

Пример —

а) Объявление массива

VAR myANALOG_16: ARRAY f1.. 16) OF ANALOG_DATA:

:= [B(-4095), 6(4095)/.*    // определенные пользователем начальные значения

END_VAR

Ь) Использование переменных массива в языке ST может быть следующим:

0UTARY{6.SYM):- INARYfO] * INARY[7)— INARYfi] • Y.IW6Z

6.4.4.5.2 Инициализация

Неявное начальное значение каждого элемента массива — это начальное значение, определенное для типа данных элементов массива.

Пользователь может инициализировать тип массива значением, определенным пользователем. Такая инициализация имеет приоритет.

Определенное пользователем начальное значение массива назначается в форме списка, в котором могут использоваться скобки для обозначения повторений.

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

Пример — Инициализация массива A: ARRAY [0..SJ OF INT:- [2(1, 2. 3)]

эквивалентно последовательности инициализации 1, 2, 3, 1, Z 3.

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

Определенное пользователем присваивание начального значения типа данных является свойством в таблице 11.

6.4.4.6 Структурированный тип данных

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

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

Элемент структурированного типа данных представляется двумя или более идентификаторами, разделенными точкой «.».

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

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

Например, элемент типа данных ANALOG_CHANNEL_CONFIGURATION, объявленный таблице 11. будет содержать подэлемент RANGE типа ANALOG_SIGNAL_RANGE, подэлемент MIN.SCALE типа ANALOG_DATAn подэлемент MAX_SCALE типа ANALOG JDATA.

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

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

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

а) Объявление структурированного типа данных

TYPE

ANALOG_SIGNAL_RANGE: (BIPOLARJOV.

UNtPOLAR_10V):

ANALOG_DATA: INT(~409S.. 4095);

ANALOG_CHANNEL_CONFlGURATION:

STRUCT

RANGE:    ANALOG_SIGNAL_RANGE;

MIN_SCALE: ANALOGJDATA:

MAX_SCAL£: ANALOG_DATA:

END_STRUCT;

END_TYPE

b)    Объявление структурированной переменной

VAR

MODULE_CONFIG:ANALOG_CHANNEL_CONFIGURATION;

MODULE_8_CONF:    ARRAY [1..8) OF ANALOG_CHANNEL_CONFIGURATtON;

END_VAR

c)    Использование переменных массива в языке ST:

MODULE_CONFIG.MIN_SCALE.--2047;

MODULE_8_CONF(3).RANGE:- BIPOLARJOV.

64.4.6.2 Инициализация

Неявные значения комлонентов структуры даются их индивидуальными типами данных. Пользователь может инициализировать компоненты структуры значениями, определенными пользователем. Такая инициализация имеет приоритет.

Пользователь может также инициализировать ранее определенную структуру, используя перечень присваиваний компонентам структуры. Данная инициализация имеет более высокий приоритет, чем неявная инициализация и инициализация компонентов.

Пример — Инициализация структуры

a)    Объявление с инициализацией структурированного типа данных

TYPE

ANALOG_SIGNAL_RANGE:

(BIPOLARJOV,

UNIPOLARJOV):= UNIPOLARJOV;

ANALOGJDATA: !NT (-4095 ..4095):

ANALOG_CHANNEL_CONFIGURATION:

STRUCT

RANGE:    ANALOG_SIGNAL_RANGE;

MIN_SCAL£: ANALOG_DATA:- -4095:

MAX_SCALE: ANALOG_DATA:= -4096:

END_STRUCT:

ANALOG_8BI_CONFIGURATION:

ARRAY [1..8] OF ANALOG_CHANNEL_CONFIGURATION := (8((RANGE:= BIPOLARJOV)));

ENDjyPE

b)    Объявление с инициализацией структурированной переменной

VAR

UODULE_CONFIG:ANALOG_CHANNEL_CONFIGURATION (RANGE:- BIPOLARJOV. UIN_SCALE:- -1023);

UODULE_8_SMALL:ANALOG_8BI_CONFIGURATION := [8 ((MIN_SCALE:- -2047. MAX_SCALE:= 2048)));

END_VAR

6.4.4.7 Относительное положение элементов структурированных типов данных (АТ)

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

Положения (адреса) элементов структурированного типа могут быть определены относительно начала структуры.

В этом случае, за именем компонента этой структуры следует ключевое слово АТ и относительный адрес.

Объявление может содержать разрывы в расположении памяти.

Относительный адрес состоит из символа процента «%». определителя битового или байтового адреса. Байтовый адрес — это целый литерал без знака, обозначающий смещение в байтах. Битовый адрес состоит из смещения в байтах, следующего символа точки «.» и смещения в битах, являющегося целым литералом без знака в диапазоне от 0 до 7. В относительном адресе не допускаются пробельные символы.

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

Перекрытие строк находится вне области применения настоящего стандарта.

Примечание — Огсчет битового смещения начинается от самого правого бита с 0. Отсчет битового смещения начинается от начала структуры с 0.

Промер — Относительные адреса и перекрытие в структуре

TYPE

Com1_data: STRUCT

head

AT %B0:

INT:

H e положении 0

length AT %B2:

USINT=26; // e положении 2

hag1

AT %X3.0:

BOOL:

// e положении 3.0

end

AT %B25: END_STRUCT:

BYTE;

U e положении 25, оставляя разрыв

Com2_data: STRUCT OVERLAP

head

AT %B0:

INT:

// e положении 0

length

AT %B2:

USINT;

// e положении 2

flag2

AT %X3.3:

BOOL:

//в положении 3.3

datal

AT %B5:

BYTE:

//в положении 5, перекрывается

data2

AT %B5:

REAL;

И в положении от 5 до в

end

AT %B19:

BYTE;

//по адресу f9, оставляя разрыв

END STRUCT:

Com_data: STRUCT OVERLAP// C1 и C2 перекрываются C1 at %B0: Com 1_data:

C2 at %B0: Com2_data;

END_STRUCT;

END_TYPE

6.4.47.2 Инициализация

Структуры с перекрытием не могут явно инициализироваться.

6.4.4.8 Прямо представленные компоненты структуры — частично определенные с использованием «*»

Символ звездочки «*» в таблице 11 может использоваться, чтобы обозначить еще не полностью определенные адреса для прямо представленных компонентов структуры.

Промер — Присваивание компонентов структуры еще не локализованным входным и выходным переменным.

TYPE

HW_COMP: STRUCT:

IN    AT %Г: BOOL:

VAL    AT %(*: DWORD:

OUT    AT %Q‘: BOOL; OUT_VAR    AT %Q': WORD:

fTNL_VAR: REAL://еще не локализован END_STRUCT:

ENDJTYPE

В случае, когда прямо представленный компонент структуры используется для назначения расположения в части объявлений программы, типа функционального блока или класса, на месте префикса размера и целого со знаком может использоваться звездочка «*» для указания того, что прямое представление еще не полностью определено.

Использование этого свойства требует, чтобы положение структурированной переменной, объявленной таким образом, было полностью определено внутри конструкции VAR_CONFIG...END_VAR конфигурации для каждого экземпляра охватывающего типа.

Переменные такого типа не могут использоваться в секциях VARJNPUT. VAR_IN_OUT и VAR_TEMP.

Ошибка возникает, если отсутствует какая-либо полная спецификация в конструкции VAR_ CONFIG...END.VAR для какой-либо неполной спецификации адреса, выраженной символом «*» в любом экземпляре программы или функционального блока, который содержит такие неполные спецификации.

6.4.4.Э Прямо порожденный тип данных

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

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

Это может быть использовано для определения специфических для типа начальных значений.

Пример — Прямо порожденный тип данных

TYPE

myint1123: INT:-123;

myNewArrayType: ANALOG_16JNPUT_DATA ~ (8(-1023). 8(1023));

Com3_data: Com2_data:= (head:= 3. Iength:=40):

END_TYPE

.R1: REAL- 1.0;

R2: R1;

6.4.4.3.2    Инициализация

Неявное начальное значение равно начальному значению типа данных, из которого порожден новый тип. Пользователь может инициализировать тип данных определенным пользователем значением. Такая инициализация имеет приоритет.

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

Пример 1 — Использование определенных пользователем /лилов данных

С учетом объявлений ANALOG_16_INPUT_DATA в таблице 11 и объявления VAR INS: ANALOG_16_ INPUTJDATA: END_VAR переменные от INS{1) до INS{16) могут использоваться везде, аде могут использоваться переменные типа INT.

Пример 2

Аналогично, с учетом объявления Com_dafa в таблице 11 и, дополнительно, объявления VAR telegram: Com_data; END_VAR переменная telegram.length может использоваться везде, где может использоваться тип USINT.

Пример 3

Это правило может применяться рекурсивно:

С учетом объявления ANALOG 16 INPUT CONFIGURATION. ANALOG_CHANNEL_CONFIGURATION и ANALOG_DATA в таблице 11 и объявления VAR CONF: ANALOG_16_INPUT_CONFIGURATION: END_VAR переменная CONF.CHANNEL(2].MIN_SCALE может использоваться везде, где может использоваться тип INT.

6.4.4.10 Указатели

6.4.4.10.1 Объявление указателя

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

Указатели объявляются для определенных типов данных, используя ключевое слово REF_TO и ссылочный тип данных — тип данных, на который производится ссылка. Ссылочный тип данных уже должен быть определен. Им может являться элементарный тип данных или определенный пользователем тип данных.

Примечание —Указатели без привязки к типу данных выходят за пределы настоящего стандарта.

ARRAY{0..999} OFINT;

Пример 1

TYPE

туАггауТуре:

myRefArrType:

myArrOfRefType:

END_TYPE

VAR

myArrayl: myRefArrl : myArrOfRef:

END VAR


REF_TO туАггауТуре;    И определение указателя

ARRAY [0..12} OF myRefArrType; /I определение массива ссылок туАггауТуре:

myRefArrType;    /I определение указателя

myArrOfRefType;    // определение массива указателей

Ссылка должна ссылаться только на переменные указанного ссылочного типа данных. Указатели на прямо порождаемые типы данных обрабатываются как псевдонимы указателей на базовый тип данных. Прямое порождение может применяться несколько раз.

Пример 2

TYPE

myArrTypel: ARRAY[0..999] OF INT; myArrType2: myArrTypel; myRefTypel: REF_TO myArrTypel; myRefType2: REFJTO myArrType2;

ENDJTYPE

myRefTypel и myRefType2 могут ссылаться на переменные типа ARRAY(0..999J OF INT и производных типов данных.

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

Пример 3

CLASS FI...    END_CLASS;

CLASS F2 EXTENDS F1 ...    END_CLASS:

TYPE

myRefFI: REF_TO F1; myRefF2: REFJTO F2;

ENDJTYPE

Указатели типа myRefFI могут ссылаться на экземпляры классов F1. F2 и на производные от них классы. Однако указатели типа myRefF2 не могут ссылаться на экземпляры класса F1. а могут ссылаться только на экземпляры класса F2 и производные от него, так как класс F1 может не поддерживать методы и переменные расширенного класса F2.

6.4.4.10.2 Инициализация указателей

Указатели могут инициализироваться значением NULL (неявно) или адресом уже объявленных переменных, экземпляров функционального блока или класса.

Пример —

FUNCTJON_BL ОСК F1... END_FUNCTION_BLOCK;

VAR

myint:    INT;

myReflnt: REF_TO INT~ REF(mylnt): myFI: FI;

myRefFI; REF_TO F1:= REF{myF1);

END_VAR

6.4.4.10.3 Операции с указателями

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

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

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

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

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

Разыменование указателей осуществляется явно.

Указатель разыменовывается использованием предшествующего символа крышки «А».

Разыменованный указатель может использоваться так же. как прямо используется переменная. Разыменованный указатель на NULL является ошибкой.

Примечание 1 — Возможные проверки указателей на NULL может производиться во время компиляции, системой поддержки выполнения программы или прикладной программой.

Конструкция REF() и оператор разыменования «А» используются в графических языках при определении операндов.

Примечание 2 — Арифметические операции с указателями не рекомендуются и не входят в задачу настоящего стандарта.

Пример 1

TYPE

S1: STRUCT SCI: INT:

SC2: REAL:

END_STRUCT;

A1: ARRAY{1..99] OF INT:

END_TYPE

VAR

myS1:S1:

myA1:A1:

myRefSI: REFJTO S1:= REF(myS1); myRefAl: REFJTO A1:= REF{myA1); myReflnt: REF_TO INT:- REFfmyA 1[ty:

ENDJVAR

myRefSI A.SC1:= myRefAl A[12J; II в данном случае, это эквивалентно S1.SC1:=A1[12]; myReflnt.- REF<A1(11));

S1.SC1:- myReflnt*; // присваивает значение переменной A1[11J элементу структуры S1.SC1

Пример 2

Гоафичесное представление операторов из примера 1

—+

| MOVE |

----------------|ЕМ    ENO)

myRefAlA[12]---|IN    OUTl myRefSlA.SCl

+----------+

| MOVE |    |    MOVE |

--------------)EN ENO |--------------------------|EN    ENO |

REF(A1[11])---|IN OUT!--- myReflnt tayReflnt----IIN    OUT| SI.SCI

4——— — 4    4 —— — — — 4

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

Таблица 12 — Операции с указателями

Номер

Описание

Пример

Объявление

1

И определение типа указателя

TYPE

myRefType: REF_TO INT: END.TYPE

Присваивание и сравнение

Присваивание указателя указателю

«указатель»:8 «указатель» myRefType1:= myRefType2;

Присваивание указателя параметру функции, функционального блока или метода

myFB (a:= myRefSI):

Типы должны быть эквивалентными

Сравнение с NULL

IF mylnt 8 NULL THEN ...

Создание ссылки

За

REF{<nepeueHHBfl>)

Предоставляет типизированную ссылку на переменную

myRefAl:8 REF (A1);

ЗЬ

Р£Р<<экэемпляр функционального блока») Предоставляет типизированную ссылку на экземпляр функционального блока или клаоса

myRefFB1:> REF{myFB1)

Разыменование

4

«указатель»*

Предоставляет содержимое переменной или содержимое экземпляра, на которые ссылается переменная указателя

mylnt:> myA1Ref*f12):

6.5 Переменные

6.5.1    Объявление и инициализация переменных

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

Переменные предоставляют средства идентификации объектов данных, содержание которых мо* жет изменяться. Например, данные, связанные с входами, выходами или памятью программируемого контроллера.

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

6.5.1.2    Объявление

Переменные объявляются внутри одной из секций переменных.

Переменные можно объявлять, используя:

•    элементарный тип данных: или

-    предварительно определенный пользователем тип; или

•    тип указателя; или

•    прямо определенный пользователем тип.

Возможны следующие виды переменной:

•    одноэлементная переменная, то есть переменная, тип которой либо:

•    элементарный тип данных; или

•    определенное пользователем перечисление или тип-диапазон; или

•    определенный пользователем тип. происхождение которого, определяемое рекурсивно, прослеживается до элементарного типа, типа перечисления или типа-диапазона:

•    многоэлвмвнтная переменная, то есть переменная, которая представляет массив ARRAY или структуру STRUCT;

•    указатель, то есть переменную, которая ссылается на другую переменную или экземпляр функционального блока.

Объявление переменной состоит из следующих элементов:

•    списка имен объявляемых переменных:

-    символа двоеточия я:»;

-    типа данных с необязательной инициализации, специфичной для различных видов переменных.

Пример —

TYPE

туТуре: ARRAY [1..9J OF I NT; И предварительно определенный пользователем тип END_TYPE VAR

myVarl, myVarla: INT; // две переменные, используя элементарный тип myVari: туТуре;    // используя предварительно определенный пользователем тип

myVar3: ARRAY[1..8] OF REAL; // используя прямо определенный пользователем тип END_VAR

6.5.1.3    Инициализация переменных

Неявным начальным значением переменной (переменных) являются:

1    Неявное начальное значение (значения) лежащих в основе элементарных типов данных, как определено в таблице 10.

2    NULL, если переменная является указателем.

3    Определенное пользователем значение (значения) назначенного типа данных.

Это значение факультативно может быть определено использованием оператора присваивания «:=» в определении типа ТУРЕ, как показано в таблице 11.

4    Пользователем значение (значения) переменной.

Это значение факультативно может быть определено использованием оператора присваивания «:=» в объявлении переменной VAR (см. таблицу 14).

Определенное пользователем значение может быть литералом (например. -123.1.55. «аЬс») или константным выражением (например. 12*24).

Начальные значения не могут задаваться в объявлениях VAR_EXTERNAL.

Начальные значения могут также определяться с использованием определяемого экземпляром свойства инициализации, предоставляемого конструкцией VAR_CONFIG...END_VAR. Определяемые экземпляром начальные значения всегда замещают специфические для типа начальные значения.

Таблица 13 — Определенна переменных

Номер

Описание

Пример

Объяснение

1

Переменная эле*

VAR

Распределяет бит памяти логине*

ментарного типа

MYBIT: BOOL:

ской переменной MYBIT

данных

OKAY: STR!NG[10]; VALVE.POS AT %QW28: (NT; END. VAR

Распределяет память для хранения строки с максимальной длиной 10 символов

2

Переменная с олре-

VAR

Описание переменных с польэоеа*

деленным пользователем типом данных

myVAR: myType: END.VAR

тельским типом данных

3

Массив

VAR

B(TS: ARRAY10..7J OF BOOL;

TBT: ARRAY [1..2, 1..3J OF INT; OUTAAT %QW6: ARRAY(0..9J OF INT; END. VAR

4

Указатель

VAR

myRellnt: REF.TO INT; END.VAR

Определение переменной, являющейся указателем

Таблица 14 — Инициализация переменных

Номер

Описание

Пример

Объяснение

1

Инициализация переменной с элементарным типом данных

VAR

MYBIT: BOOL :* 1:

OKAY: STRINGJ10J :* ОК‘; VALVE.POS AT %QW28: INT:* 100: END.VAR

Распределяет бит памяти логической переменной MYBIT с начальным значением от 1. Распределяет память для хранения строки с максимальной длиной десяти символов

После инициализации строка имеет длину 2 и содержит двухбайтовую последовательность символов «ОКя (десятичные 79 и 75. соответственно), в порядке, подходящем для печати символьной строки

2

Инициализация переменной с определенным пользователем типом данных

TYPE

myType: ...

END.TYPE

VAR

myVAR: myType:* ... // инициализация END.VAR

Объявление определенного пользователем типа с инициализацией и без инициализации Описание с предваригегъной инициализацией переменной с определенным пользователем типом данных

3

Массив

VAR

BITS: ARRAY|0..7] OF BOOL :*(1.1.0.0.0.1.0.0J;

TBT: ARRAY [1..2. 1..3J OF INT :* [9.8,3(10).6J:

OLTTARY AT %QW6: ARRAY(0..9] OF INT ;* [10(1)]:

END.VAR

Распределяет 8 битое памяти для хранения начальных значений

BITS[0|:* 1. BITS[1]:= 1.....

BITS(6|:*0. BITS[7]:* 0. Распределяет цель» массив TBT размером 2*3 с начальными значениями TBT(1.1J:*9.

TBT(1.2J:*8.

ТВТ(1.3]:= 10. ТВТ[2,1]:= 10. TBTI2.2J:* 10. ТВТ[2.3):= 6.

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

Номер

Описание

Пример

Объяснение

4

Объявление и инициализация констант

VAR CONSTANT PI: REAL:* 3.141592; PI2: REAL:* 2.0*PI; END.VAR

Константа

Символическая константа PI

5

Инициализация с использованием константных выражений

VAR

Plx2: REAL:* 2.0 *3.1416; END_VAR

Использует константное выражение

6

Инициализация указателя

VAR

myReflnt: REF.TO INT :* REF(mylNT); END.VAR

Инициализирует переменную-уха-затель myReflnt ссылкой на переменную myINT.


6.5.2 Секции переменных

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

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

Часть деклараций программного компонента POU может содержать различные секции VAR. в зависимости от вида программного компонента POU.

Переменные могут объявляться в различных текстовых конструкциях VAR... END.VAR, включающих квалификаторы, такие как RETAIN или PUBLIC, при необходимости. Квалификаторы секций переменных кратко приведены на рисунке 7.

Ключевое слово Использование переменной

Секции VAR: зависящие от типа программного компонента POU (функция, функциональный блок, программа) или метода

VAR

VARJNPUT

VAR_OUTPUT

VARJNJDUT

VAR_EXTERNAL

VARJ3LOBAL

VAR_ACCESS

VAR.TEMP

VAR_CONFIG

(END.VAR)


Внутренние no отношению к объекту (функция, функциональный и т. д.). Предоставленные извне, не модифицируются внутри объекта. Предоставляемых объектом для внешних объектов.

Предоставляются внешними объектами, могут модифицироваться внутри объекта. предоставляться для внешнего объекта.

Предоставляемые конфигурацией через VAR_GLOBAL.

Объявление глобальной переменной.

Объявление пути доступа.

Временное хранилище для переменных в функциональных блоках, методах и программах.

Специфическая для экземпляра инициализация и назначение расположения. Заканчивает описанные выше секции VAR.

Рисунок 7 — Ключевые слова объявлений переменных (сводка), лист 1

Квалификаторы: могут следовать за описанными выше ключевыми словами RETAIN    Сохраняемые переменные.

NON_RETAJN    Несохраняемые переменные.

Доступ только изнутри собственного объекта и его производных объектов (не явно).

PROTECTED

PUBLIC

PRIVATE

INTERNAL

CONSTANT»’


Разрешен доступ из всех объектов.

Доступ только из собственно объекта.

Доступ только внутри одного пространства имен.

Константа (неизменяемая переменная).

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

»' Экземпляры функциональных блоков не объявляются в секциях переменных с квалификатором CONSTANT.

Рисунок 7. лист 2

•    VAR

Переменные, объявленные в секции VAR ... END.VAR сохраняются от одного вызова программы или экземпляра функционального блока до другого.

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

•    VAR.TEMP

В пределах программных компонент, переменные могут объявляться только секции VAR.TEMP... END.VAR.

Для функций и методов ключевые слова VAR и VAR_TEMP эквивалентны.

Данные переменные распределяются и инициализируются специфическими для типа неявными значениями, и не сохраняются между вызовами.

•    VARJNPUT, VAR.OUTPUT и VAR.IN.OUT

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

•    VAR_GLOBAL и VAR.EXTERNAL

Переменные, объявленные в секции VAR.GLOBAL, могут использоваться в других программных компонентах, если они повторно объявлены там в секции VAR.EXTERNAL .

На рисунке 8 показано использование ключевых слов VAR_GLOBAL. VAR_EXTERNAL и CON STANT.

Объявление в элементе, содержащем переменную

Объявление в элементе, использующем переменную

Разрешено?

VARJ3LOBALX

VAR.EXTERNAL

CONSTANT

X

Да

VAR.GLOBALX

VAR.EXTERNAL

X

Да

VAR.GLOBAL CONSTANT X

VAR.EXTERNAL

CONSTANT

X

Да

VAR.GLOBAL CONSTANT X

VAR.EXTERNAL

X

П/п

Примечание — Использование секции VAR.EXTERNAL в содержащемся элементе может приводить к непредвиденному поведению. Например, когда значение внешней переменной изменяется другим содержащимся элементом в одном и том же содержащемся элементе.

Рисунок 8 — Использование VAR.GLOBAL. VAR.EXTERNAL и CONSTANT (правила)

6.S.2.2 Область действия объявлений

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

Исключением из данного правила являются переменные, объявленные как глобальные. Такие переменные доступны для программных компонент только через объявление VAR.EXTERNAL. Тип переменных, объявленных в блоке VAR_EXTERNAL. должен быть согласован с типом, объявленным в блоке VAR.GLOBAL. связанных программ, конфигурации и ресурсе.

Ошибка возникает, если:

• какая-либо программная компонента пытается изменить значение переменной, которая была объявлена с квалификатором CONSTANT или в секции VARJNPUT;

-    переменная, объявленная как VAR_GLOBAL CONSTANT, в элементе конфигурации или программном компоненте («содержащем элементе») используется в объявлении VAR.EXTERNAL (без квалификатора CONSTANT) любого элемента, содержащегося в пределах охватывающего элемента, как показано ниже.

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

6.5.3 Переменные типа ARRAY переменной длины

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

-    входные, выходные или входные-выходные переменные функций и методов;

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

Число размерностей массива и фактических и формальных параметров должны быть одинаковыми. Они определяются, используя символ звездочки как спецификацию неопределенного диапазона для границ индекса.

Массивы переменной длины предоставляют программам, функциям, функциональным блокам и методам средства использовать массивы с различными диапазонами индекса.

Для работы с массивами переменной длины предоставляются следующие стандартные функции (см. таблицу 15).

Таблица 15 — Переменные типа ARRAY переменной длины

Комер

Описание

Примеры

1

Декларация с использованием * ARRAY Г. *.... I OF тип данных

VAR.IN.OUT A: ARRAY (*. *) OF INT; END.VAR;

Стандартные функции LOWER.BOUND и UPPER.BOUND

Графическое представление

Получить нижнюю границу массива:

--------------+

! LOWER BOUND !

ARRAY----! ARR !---ANY INT

Ah'Y.INT — t DIM 1 ~ ♦-------------+

Получить верхнюю границу массива:

+-------------+

! UPPER.BOUND !

ARRAY----! ARR !---ANY INT

ANY_INT---! DIM !

+-------------+

Текстовое представление

Получить нижнюю границу 2-го измерения массива А: low2:= LOWER.BOUND (А, 2):

Получить верхнюю границу 2-го измерения массива А ир2:= UPPER.BOUND (А 2):

Пример 1

А1: ARRAY (1..10) OF INT~ f10(1)J;

LOWER_BOUND (A1, 1)

1

UPPER_BOUND(A1. 1)

10

LOWERJBOUND (A2. 1)

1

UPPER_BOUND (A2. 1)

-

20

LOWER_BOUND (A2. 2)

-

■2

UPPER_80UND (A2. 2)

2

LOWER_BOUND (A2. 0)

ошибка

LOWER JBOUND (A2, 3)

ошибка

A2: ARRAY(1..20, -2..2J OFINT:= (20(5(1))}:

Hв соответствии с инициализацией массива, см. 6.4.4.5.2


Пример 2 — Суммирование массивов FUNCTION SUM: INT;

VAR_IN_OUT A: ARRAY Г} OF INT; END_VAR: VAR i, sum2: DINT: END_VAR:

sum2:= 0;

FORiLOWER_BOUND(A,1) TO UPPER_BOUND(A,1) sum2:= sum2 * ApJ; END_FOR;

SUM.- sum2: ENDJFUNCTION

//SUM(A1)    —10

//SUM (A2[2)) -»5

Пример 3 — Умножение матриц FUNCTION MATRIXJAUL VARJNPUT

A: ARRAY Г. V OF INT:

B: ARRAYf. 'JOFINT;

ENDJ/AR;

VARJOUTPUT C: ARRAY C} OF INT: ENDJ/AR:

VAR ij, k. s: INT: ENDJVAR;

FOR /.-= LOWER_BOUND{A, 1) TO UPPERJBOUND(A, 1)

FOR LOWER_BOUND(B, 2) TO UPPER_BOUND(B, 2)

s:=0;

FOR k:-LOWER_BOUND(A,2) TO UPPER_BOUND(A, 2) s:= s + A[i,k] - B(kJ):

END_FOR;

C[iJ):=s;

ENDJFOR;

ENDJFOR;

ENDJFUNCTION

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

VAR

A: ARRAY [1..5, 1..3JOFINT;

В: ARRAY [1..3, 1..4JOFINT;

C:ARRAY[1..5, 1..4JOFINT:

END_VAR

MATRIX_MUL (А, В. С):

6.5.4    Константные переменные

Константные переменные — это переменные, определенные е секции переменных, которая содержит ключевое слово CONSTANT. Применяются правила, определенные для выражений.

Пример — Константные переменные VAR CONSTANT

PI: REAL-3.141592:

TwoPi: REAL:- 2.0‘Pi;

END_VAR

6.5.5    Прямо представленные переменные (%)

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

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

•    знак процента «%»: и

•    префиксы расположения I. О или М; и

•    префикс размера X (или никакого), В. W. D или L: и

•    одно или более (см. ниже иерархическую адресацию) целых без знака, разделенных точками «.».

Пример —

Л/мтл.9

%1012.6

%QL20

Разработчик определяет соответствие между прямым представлением переменной и физическим или логическим расположением адресуемой единицы в памяти на входе или на выходе.

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

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

В таблице 16 представлены свойства прямо представленных переменных.

Использование прямо представленных переменных в теле программных компонентов и методов является не рекомендуемой функциональной возможностью.

Таблица 16 — Прямо представленные переменные

Номер

Описание

Пример

Объяснение

Расположение (примечание 1)

1

Расположение на входе

I

%IW215

Входное слово 215

2

Расположение на выходе

Q

%ОВ7

Выходной байт 7

3

Расположение в памяти

М

%MD46

Двойное слово по адресу памяти 48

Размер

Размер одного байга

X

%1Х1

Тип входных данных BOOL

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

Номер

Описание

Пример

Объяснение

Размер одного байга

Отсутствует

%11

Тил входных дажых BOOL

5

Размер байга (8 битов)

В

%1В2

Тип входных данных BYTE

6

Размер слова (16 битов)

W

%IW3

Тип входных данных WORD

7

Размер двойного слова (32 бита)

О

%Ю4

Тип входных данных DWORD

в

Размер длинного слова (64 бита)

L

%IL5

Тил входных данных LWORD

Адресация

9

Простая адресация

%1Х1

%1В0

Один уровень

10

Иерархическая адресация с использованием «.»

%QX7.5

%ОХ7.5

%MW1.7.9

Определенная разработчиком, например: два уровня, диапазоны 0..7; три уровня, диапазоны 1..16

11

Частично определенные переменные с использованием «*» (примечание 2)

%М*

Примечание 1 — Национальные организации по стандартизации могут публиковать таблицы переводов этих префиксов.

Примечание 2 — Для использования символа звездочки «*» в этой таблице требуется наличие свойства VAR_CONFIG и наоборот.

6.5.5.2    Прямо представленные переменные — иерархическая адресация

Когда простое прямое представление (одного уровня) расширяется дополнительными цифровы* ми полями, разделенными точками, оно интерпретируется как иерархический физический или логи* ческий адрес. Самое левое поле представляет верхний уровень иерархии, уровень понижается при переходе вправо.

Пример — Иерархический адрес

%IW2.5.7.1

Например, данная переменная представляет первый «канал» (слово) седьмого «модуля» на пя* том «стеллаже» второй «шины ввода/выеода» этой системы программируемого контроллера. Макси* мальное число уровней иерархической адресации определяется разработчиком.

Использование иерархической адресации (для разрешения доступа программы из одной системы программируемого контроллера к данным другого программируемого контроллера) считается расшире* нием языка, специфическим для разработчика.

6.5.5.3    Объявление прямо представленных переменных (АТ)

Объявлению прямо представленных переменных в соответствии с таблицей 16 (например. %IW6) может даваться символическое имя. используя ключевое слово АТ.

Переменным с определенными пользователем типами данных (например, массиву) может быть назначен «абсолютный» адрес в памяти, используя АТ. Расположение переменной определяет начальный адрес памяти и не требует размера, равного или превышающего размер данного прямою представления (то есть допустимы пустая память и перекрытие).

Пример — Использование прямого представления

VAR    Имя и тип для входа

INP_0AT %Ю.О: BOOL;

АТ%Ю12: REAL:

PA_VAR AT %1В200: PA_VALUE;    Имя и определенный пользователем тип для разме

щения входа, начиная с %1В200

OUTARY AT %QW6: ARRAY{0..9] OFINT;    Массив из 10 целых для размещения в смежных вы-

END_VAR    ходных адресах, начиная с %QW6

Для всех видов переменных, определенных в таблице 13, явное (определенное пользователем) расположение в памяти может быть объявлено, используя ключевое слово АТ в сочетании с прямо представленными переменными (например. %MW10).

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

Примечание — Инициализация входов системы (например, %IW10) определяется Разработчиком.

6.5.5.4 Прямо представленные переменные — частично определенные с использованием я*» Запись с символом звездочки «’» может использоваться в назначениях адреса внутри программ и типов функциональных блоков для обозначения еще не полностью определенного расположения для прямо представленных переменных.

Пример —

VAR

С2АТ %Q‘: BYTE; END VAR


Назначает еще не расположенный выходной байт переменной типа битовой строки С2. длиной 1 байт.

В случае, когда прямо представленная переменная используется для назначения расположения внутренней переменной в части объявления программы, типа функционального блока, на месте префикса размера и целого со знаком может использоваться звездочка «*» для указания того, что прямое представление еще не полностью определено.

Переменные такого типа не могут использоваться в секциях VARJNPUT и VARJNJDUT.

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

Ошибка возникает, если отсутствует какая-либо полная спецификация в конструкции VAR_ CONFIG...END_VAR для какой-либо неполной спецификации адреса, выраженной символом «*» в любом экземпляре программы или функционального блока, который содержит такие неполные спецификации.

6.5.6 Сохраняемые переменные (RETAIN, NON_RETAIN)

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

Когда элемент конфигурации (ресурс или конфигурация) «запускается», как «теплый рестарт» или «холодный рестарт» в соответствии с МЭК 61131-1, каждая переменная, связанная с элементом конфигурации и ее программами, имеет значение, зависящее от операции запуска элемента конфигурации и объявления свойств переменной в части сохранения.

Свойства в части сохранения могут объявлять переменные, содержащиеся в секциях переменных VARJNPUT. VAR_OUTPUT и VAR функциональных блоков и программ, сохраняемыми или несо-храняемыми. используя квалификаторы RETAIN or NON_RETAJN. представленные на рисунке 7. Использование этих ключевых слов необязательно.

На рисунке 9 показан алгоритм назначения начальных значений переменным.

Рисунок 9 — Алгоритм назначения начального значения переменной (правила)


1    Если тип рестарта — «теплый рестарт», как определено в МЭК 61131*1. то начальные значения всех переменных в секции переменных с квалификатором RETAIN будут сохраненными значениями. Данные значения — значения переменных в момент остановки ресурса или конфигурации.

2    Если тип рестарта — «теплый рестарт», то начальные значения всех переменных е секции пере* менных с квалификатором NON_RETAIN инициализируются.

3    Если тип рестарта — «теплый рестарт», и квалификаторы RETAIN и NON_RETAIN не отсутствуют. то начальные значения определяются разработчиком.

4    Если тип рестарта — «холодный рестарт», начальные значения переменных в секции VAR с квалификаторами RETAIN и NON.RETAIN инициализируются, как описано ниже.

6.S.6.2 Инициализация

Переменные инициализируются, используя определенные пользователем значения, специфические для переменной.

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

Затем применяются следующие правила:

-    переменные, которые представляют входы системы программируемого контроллера, как определено в МЭК 61131-1. инициализируются специфическим для разработчика способом;

-    квалификаторы RETAIN и NON_RETAIN могут использоваться для переменных, объявленных в статических секциях VAR. VARJNPUT. VAR_OUTPUT и VAR_GLOBAL. но не в секции VAR_IN_OUT;

• разрешено использование квалификаторов RETAIN и NON_RETAIN в объявлениях экземпляров функционального блока, класса и программы. Поэтому, все переменные образца обрабатываются как RETAIN или NON_RETAIN. за исключением следующего:

•    переменная явно объявлена, как RETAIN или NON_RETAIN в объявлении функционального блока, класса или типа программы;

•    переменная является типом функционального блока или классом. В этом случае применяется декларация сохранения используемого типа функционального блока или класса.

Разрешено использование квалификаторов RETAIN и NON_RETAIN для экземпляров типов структурированных данных. Поэтому, все элементы структуры, а также все элементы вложенных структур обрабатываются как RETAIN или NON_RETAIN.

Пример —

VAR RETAIN

AT%QW5: WORD:- 16HFF00:

OUTARYAT %QW6: ARRAY{0..9] OFINT:- [10(1)];

BITS: ARRAY(0..7] OF 800L~ [1.1,0.0,0.1,0.0]:

END_VAR

VAR NON_RETAIN

BITS: ARRAYfO.. 7] OF BOOL:

VALVE_POS AT %QW28: INT:- 100:

END_VAR

6.6 Программные компоненты (POU)

6.6.1    Общие свойства программных компонентов

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

Программными компонентами (POU). установленными в настоящем стандарте, являются функция. функциональный блок, класс и программа. Функциональные блоки и классы могут содержать методы.

Для достижения модуляризации и структурирования программные компоненты состоят из четко сформулированных частей программы. Программные компоненты имеют определенный интерфейс с входами и выходами и может вызываться и выполняться много раз.

Примечание — Упомянутый выше параметрический интерфейс не совпадает с интерфейсом, определенным в рамках объектно-ориентированного подхода.

Программные компоненты и методы могут поставляться разработчиком или программироваться пользователем.

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

Рекурсивные выходы программных компонентов и методы определяются разработчиком.

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

6.6.1.2 Присваивание и выражение

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

Языковые конструкции присваивания и выражения используются в текстовых и (частично) графических языках.

6.6.1.2.2    Присваивание

Присваивание используется для записи значения литерала, константы или выражения (см. ниже) другой переменной. Данная переменная может быть переменной любого вида, например, входной или выходной переменной функции, метода, функционального бока и т. д.

Переменные одного типа всегда могут присваиваться. Дополнительно применяются следующие правила:

> переменная или константа типа STRING или WSTRING может быть присвоена другой переменной типа STRING или WSTRING. соответственно. Если исходная строка длиннее, чем целевая строка, результат определяется реализатором:

•    переменная типа-диапазона может использоваться везде, где может использоваться переменная базового типа. Если значение типа-диапазона выходит за пределы указанных значений, возникает ошибка:

•    переменная производного типа может использоваться везде, где может использоваться переменная ее базового типа.

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

Для адаптации типа данных источника к типу данных адресата может использоваться неявное или явное преобразование типа:

а) в текстовой форме (частично применимой и к графическим языкам) оператор присваивания может быть следующим:

«:= » который означает, что значение выражения в правой стороне оператора записывается в переменную в левой стороне оператора: или

« -> ж который означает, что значение в левой стороне оператора записывается в переменную в правой стороне оператора.

Оператор «=>» используется только для списка параметров вызова функций, методов, функциональных блоков и т. п. и только для передачи параметра VAR.OUTPUT назад вызывающему объекту.

Пример —

А:- В + С/2;

Func (in1:-A. out2 => х); A_struct1:= B_Struct1;

Примечание — Присваивание определенных пользователем типов данных (STUCTURE. ARRAY) рассматривается в таблице 72:

Ь) в графической форме:

присваивание изображается как линия соединения от источника к адресату, в основном, слева направо. Например, от выхода функционального блока к входу функционального блока, или от графического «расположения» переменной (константы) к входу функции, или от выхода функции к графическому «расположению» переменной.

Стандартная функция MOVE является одним из графических представлений присваивания.

6.6.1.2.3 выражение

Выражение — это языковая конструкция, которая состоит из определенной конфигурации операндов (таких как литералы, переменные, вызовы функций) и операторов, (таких как ♦,-.*,/) и которая производит одно значение, которое может быть многозначным.

Для адаптации типов данных операции в выражении может использоваться неявное или явное преобразование типа:

a)    в текстовой форме (а также частично в графических языках), выражение вычисляется в определенном порядке, зависящем от приоритетов, заложенных в языке.

Промер —... В * 0/2 * SIN(x)

b)    в графической форме, выражение показывается как сеть графических блоков (функциональных блоков, функций и т. п.), связанных линиями.

6.6.1.2.4 Константное выражение

Константное выражение — это языковая конструкция, состоящая из определенной комбинации операндов (таких как +.-.*) и производит одно значение, которое может быть многозначным.

6.6.1.3 Частичный доступ к переменным типа ANY_B|T

Для переменных типа данных ANY_BIT (BYTE. WORD. DWORD. LWORD). частичный доступ к биту, байту, слову и двойному слову переменной определен в таблице 17.

Для адресации части переменной используются символ «%» и префикс размера, определенный как и для прямо представленных переменных в таблице 16 (X. В. W. D. L) используются в сочетании с целым литералом (со значением от 0 до max) для адреса внутри переменной. Литерал 0 указывает на самую младшую часть, max — на самую старшую часть. Префикс «%Х» может факультативно использоваться при доступе к битам.

Пример — Частичный doc/пуп к переменным ANY_BIT

VAR

Во: BOOL:

By: BYTE:

Wo: WORD:

Do: DWORD:

Lo: LWORD:

END_VAR:

8o:= By.%X0://бит 0 переменной By

Bo:= By.7; // бит 7 переменной By; %X используется по умолчанию и может быть опущен.

Во:= Lo.63 // бит 63 переменной Lo:

Ву:= Wo.%B1; // байт 1 переменной Wo.*

Ву:= Оо.'АВЗ: //байт 3 переменной Do.

Таблица 17 — Частичный доступ к переменным типа ANY_BIT

Ко

кер

Описание

Тип

данных

Пример и синтаксис (примечание 2)

Тип данных — доступ к

myVAR_12.%X1; yourVAR1.%W3;

BYTE — бит VB2.%X0

BOOL

от <имя_первменной>.%ХО до <имя_перемвнной>.%Х7

WORD — бит VW3.%X15

BOOL

от <имя_лвременной>.%ХОдо <имя_леремвнной>.%Х15

DWORD —бит

BOOL

от <имя переменной:».%Х0 до <имя_переменной>.%Х31

id

LWORD —бит

BOOL

от <имя_переменной>.%ХО до <имя_леремвнной>.%Х6Э

WORD — байт VW4.%B0

BYTE

от <имя_первменной>.%ВО до <имя_переменной>.%В1

DWORO — байт

BYTE

от <имя_переменной>.%ВО до <имя_переменной>.%ВЗ

LWORD —байт

BYTE

от <имя_переменной>.%ВО до <имя_переменной>.%В7

За

DWORO — слово

WORO

от <HMR_nepeMeHHoft>.%WO до <MMfl_nepeMeHHoft>.%W1

ЗЬ

LWORD — слово

WORD

от <HM&_nepeMeHHoft>.%WO до <имя_переменной>.14МЗ

4

LWORD — двойное слово VL5.%D1

DWORD

от <имя_переменной>.%00 до <имя_леременной>.%01

Префикс доступа к биту %Х может быть опущен в соответствии с таблицей 16. например. By 1 .%Х7 эквивалентно By 1.7.

Частичные доступ не должен использоваться с прямо представленными переменными, например. %1В10.

6.6.1.4 Представление и правила вызова

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

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

1    Там. где не заданы входные переменные стандартных функций, применяются неявные имена IN1. IN2.... в порядке сверху вниз. Если стандартная функция имеет один вход без имени, применяется неявное имя IN.

2    Если какая-либо переменная VARJNJDUT какого-либо вызова в программном компоненте «неправильно отображается)», возникает ошибка.

Переменная VARJNJDUT «отображена правильно», если:

•    она графически соединена в левой части: или

- она присваивается оператором «:=» в текстовом вызове, переменной, объявленной (без квалификатора CONSTANT) в блоке VARJN_OUT, VAR. VAR_TEMP. VAR_OUTPUT или VAR_ EXTERNAL содержащего программного компонента или «правильно отображенной» в блоке VARJNJDUT другого содержащегося вызова.

3    «Правильно отображенная» (как показано в правиле выше) переменная VARJNJDUT вызова может

•    графически соединяться в правой части: или

•    присваиваться, используя оператор «:=» в текстовом операторе присваивания переменной, объявленной в блоке VAR. VAR_OUTPUT или VAR_EXTERNAL содержащего программного компонента.

Если такое соединение будет приводить к неопределенному значения переменной, соединенной таким образом, то возникает ошибка.

4    Имя экземпляра функционального блока может использоваться как вход, если оно объявлено как VARJNPUT. или как VARJNJDUT.

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

•    если он объявлен как VARJNPUT. переменные функционального блока могут только читаться:

•    если он объявлен как VARJN.OUT. переменные функционального блока могут читаться и записываться. и функциональный блок может вызываться.

6.6.1.4.2    Текстовые языки

Свойства текстового вызова определяются в таблице 20. Текстовый вызов состоит из имени вызываемого объекта и последующего списка параметров.

В языке ST параметры разделяются запятыми, и этот перечень ограничивается слева и справа скобками.

Перечень параметров вызова предоставляет фактические значения и может присваивать их соответствующим именам формальных параметров (если они имеются):

- Формальный вызое

Перечень параметров имеет форму набора операторов присваивания фактических значений формальным параметрам (перечню формальных параметров), то есть:

a)    присваивание значений входным и входным-выходным переменным, используя оператор «:=»; и

b)    присваивание значений выходным переменным, используя оператор «=>».

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

Порядок параметров в перечне не имеет значения. Могут использоваться параметры управления выполнением EN и ENO.

Пример 1

А:= UMIT(EN:= COND, IN:= В, MN:= 0. MX:- 5. ENO -> TEMPL); Itполный перечень параметров A:= UMIT(IN:= В, MX:- 5);    // неполный перечень параметров

■ Неформальный вызов

Перечень параметров содержит точно такое число параметров, и точно в том порядке и тех же типов данных, как задано в определении функции, исключая параметры управления выполнением EN и ENO.

Пример 2 A.- LIMITfB, 0, 5):

Данный вызов эквивалентен полному вызову в примере 1, но без параметров EN и ENO.

6.6.1.4.3 Графические языки

В графических языках вызов функций представляется в виде графических блоков в соответствии со следующими правилами:

1    Все блоки — прямоугольные.

2    Размер и пропорции блока могут изменяться в зависимости от числа входов и другой, показы* ваемой информации.

3    Направление обработки блока — слева направо (входные параметры в левой стороне и выходные параметры — в правой).

4    Имя или символ вызываемого объекта, как описано ниже, расположено внутри блока.

5    Предусмотрено место для входных и выходных переменных, появляющихся на левой и правой сторонах блока, соответственно.

6    Могут использоваться дополнительные входная EN и выходная ENO переменные. Если они присутствуют. то показываются в самой верхней позиции слева и справа от блока, соответственно.

7    Результат функции показывается в верхней позиции с правой стороны блока, кроме случая, когда присутствует выходной параметр ENO. б этом случае результат функции показывается в позиции. следующей за выходным параметром ENO. Так как имя вызванного объекта само используется для присваивания своего выходного значения, никаких имен выходных переменных не показывается в правой стороне блока для результата функции.

8    Соединения параметров (включая результат функции) показываются линиями передачи сигналов.

9    Отрицание логического сигнала показывается помещением светлого кружка вблизи от пересечения входной и выходной линии с блоком. В наборе символов это может быть представлено буквой «О» верхнего регистра, как показано в таблице 20. Отрицание выполняется за пределами программного компонента.

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

Результаты и выходы (VAR_OUTPUT) могут соединяться с переменной, используемой как входная переменная к другим вызовам, или могут оставаться без соединения.

Графический пример |я»ык FBD)

Текстовый пример (язык ST)

Объяснение

а)

| ADD | В—| I—А

С---1 |

D—| |

A:= ADO(B.C.O); II функция или A:= В + С + О; // операторы

Неформальный перечень параметров

(В. С. 0}

Ь)

+-------+

I SHL |

В---1 IN | —А

С—IN | -------+

A;* SHL(IN:= В. N:= С);

Имена формальных параметров IN, N

с)

+-------+

| SHL |

ENABLE—|EN EN0|0-N0 ERR В—| IN |—A C—|N |

+-------+

А:= SHL(

EN:= ENABLE.

IN:* В.

N := С.

NOT ENO *> NO.ERR);

Имена формальных параметров Использование входного параметра EN и отрицания выходного параметра ENO

Графический пример (язык FBD)

Текстовый пример (язык ST)

Объяснение

Ф

А:= INC(V:= X):

Определенная пользователем

+—

------+

функция INC

1

INC |

Имена формальных параметров V

1

I—А

для

X—IV-

-----VI—X

VARJNOUT

Рисунок 10 — Формальное и неформальное представление вызова (примеры), лист 1


8 примере показывается графическое и текстовое представление вызова, включая вызов стандартной функции (ADD) без определенных имен формальных параметров; вызов стандартной функции (SHL) с определенными именами формальных параметров; вызов этой же функции с использованием входного параметра EN и выходного параметра ENO с отрицанием; и вызов определенной пользователем функции (INC) с определенными именами формальных параметров.


Рисунок 10

6.6.1.5 Управление выполнением (EN, ENO)

Как показано в таблице 18. дополнительная логическая входная переменная EN (Разрешить) и дополнительная логическая выходная переменная ENO (Разрешить выход) могут предоставляться разработчиком или пользователем в соответствии с объявлением.

VARJNPUT    EN;    8001:= 1; END_VAR

VAR.OUTPUT    ENO:    BOOL;    END_VAR

Когда используются эти переменные, выполнение операций, определенных программным компонентом. контролируется в соответствии со следующими правилами:

1    Если значение EN равно FALSE, то программный компонент не будет выполняться. Кроме того, значение ENO будет установлено в FALSE. Разработчик подробно определяет поведение в этом случае. см. примеры ниже.

2    В противном случае, если значение EN равно TRUE, значение ENO устанавливается в TRUE, и реализация программного компонента будет выполняться. Программный компонент может устанавливать ENO в логическое значение в соответствии с результатами выполнения.

3    Если во время выполнения одного из программных компонентов возникает ошибка, выходная переменная ENO этого программного компонента устанавливается в FALSE (0) системой программированного контроллера.

4    Если выходная переменная ENO установлена FALSE (0). значения всех других выходных переменных (VAR_OUTPUT. VARJN_OUT и результат функции) определяются разработчиком.

5    Входная переменная EN устанавливается в фактическое значение только во время вызова программного компонента.

6    Выходная переменная ENO передается только как во время вызова программного компонента.

7    выходная переменная ENO устанавливается только внутри программного компонента.

8    Использование параметров EN или ENO в функции REF() для получения указателя на EN или ENO является ошибкой.

В случае, когда EN равно FALSE, можно выполнять другие действия вместо нормального выполнения программного компонента. Данные действия определяются разработчиком. См. примеры ниже.

Пример 1 — Внутренняя реализация

Входная переменная EN оценивается внутри программного компонента.

Если EN равно FALSE, то ENO устанавливается в False, и программный компонент немедленно завершает выполнение или выполняет подмножество операций в зависимости от ситуации.

все заданные входные и входные-выходные параметры оцениваются и устанавливаются в экземпляре программного компонента (за исключением функций). Проверяется достоверность входных-выходных параметров.

Пример 2 — Внешняя реализация

Входная переменная EN оценивается вне программного компонента. Если EN равно False, то только происходит установка EN0 в значение False, и программный компонент не вызывается.

Входные и входные-выходные параметры не оцениваются и не устанавливаются в экземпляре программного компонента. Достоверность входных-выходных параметров не оценивается.

Входной параметр EN не устанавливается вне программного компонента отдельно от вызова.

На следующем рисунке и в примерах иллюстрируется использование программного компонента с параметрами EN и EN0 и без них:

nylnet

Пример 3 — Внутренняя реализация

mylnst (EN:- cond. A:- vl, C~ v3. B-> vZ ENO-> X);

где тело экземпляра функционального блока mylnst начинает выполнение с параметрами IF NOT EN THEN... И выполняет подмножество операций Ив зависимости от ситуации ENO:- 0; RETURN: ENDJF:

Пример 4 — Внешняя реализация

IF cond THEN mylnst (A. -v1, C:= v3. B-> v2. ENO=> X)

ELSE X:-0: ENDJF;

В таблице 18 приведены свойства при вызове программного компонента с параметрами EN и ENO и без них.

Таблица 18 — Управление выполнение*! графически с использованием EN и ENO

Номер

Описание а*

Примерw

1

Использование без EN и ENO

Показано для функции в языках FBD и ST

А---| + |—С

В—-I 1 +------+

C:=ADD(iN1:=A. 1N2:= В):

2

Использование только EN {без ENO)

Показано для функции в языках FBD и ST

+------+

ADD ЕМ----| EN |

А—| + |—С В—I I

С:= ADD{EN:= ADD.EN. IN1 := A. IN2:* В);

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

Номер

Описание

Примерw

3

Использование только ENO {без EN)

Показано для функции в языках FBD и ST

| EN01---ADD OK

А—-| + I— С В—1 I

С:= ADCHIN1:» A. IN2:= В. ENO =>ADD_OK):

4

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

Показано для функции 8 языках FBD и ST

+-------+ |

I ADD EN | + | ADD OK | +---| |---1 EN ENO |---( )---+

III 1

| A—| 1—С 1 1 B —-1 I I +.......+ 1

C:= ADD(EN:= ADD EN. IN1:= a. IN2:= IN2. EN => ADD_OK):

а> Разработчик указывает в каком из языков поддерживается свойство, то есть в реализации может быть

запрещено использование EN и/или ENO. ь> Языки, выбранные для демонстрации свойств выше, даны только для примера.

6.6.1.6 Преобразование типов данных

Преобразование типов данных используется для настройки типов данных к использованию в выражениях. присваиваниях и назначении параметров.

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

•    В присваивании значения переменной другой переменной с другим типом данных.

Это применимо к операторам присваивания и «=>» и присваивании переменным, объявленным как параметры, то входным и выходным переменным функций, функциональных блоков, методов и программ. На рисунке 11 показаны правила преобразования исходного типа данных в целевой тип данных;

Пример 1

А:- В;    И Присваивание переменной

FB1 (х~ г, v -> W):    И Присваивание параметрам

■ 8 выражении (см. 7.3.2 для языка ST). состоящем из операторов, таких как «♦», и операндов, таких как литералы и переменные такого же типа данных или других типов данных.

Пример 2

... SQRT(B + (С * 1.5)); НВыражение

•    Явное преобразование типа данных выполняется использованием функции преобразования.

•    Неявное преобразование типа данных имеет следующие правила применения:

1)    должно сохранять значение и точность типов данных;

2)    может применяться для типизированных функций;

3)    может применяться к присваиваниям выражений переменным;

Пример 3

myUDInt:- myltlntl * myUlnt2;

Л Умножение имеет результат типа UINT

который затем неявно преобразуется в тип UDINT при присваивании V

4)    может применяться к присваиванию входного параметра;

5)    может применяться к присваиванию входного параметра;

6)    не применяется к присваиванию входного-выходного параметра;

7)    может применяться так. что операнды и результаты операции или перегруженной функции получает одинаковый тип данных;

Пример 4

myUDInt:- myUlntl * myUDInt2;

//myUlntl неявно конвертируется в тип данных UDINT, умножение имеет результат типа данных UDINT

8)    правила для нетипизироеанных литералов определяются разработчиком.

Примечание — Для предотвращения неопределенностей, пользователь может использовать типизированные литералы.

Пример 5

IF myWord - NOT (0) THEN...;    //Неопределенное сравнение c 16HFFF. 16*0001. 16000FF и т. д.

IF myWord = NOT (WORDW) THEN...; // Неопределенное сравнение c 16KFFFF

На рисунке 11 показаны два альтернативных «явных» и «неявных» преобразования исходного типа данных к целевому типу данных.

Целевой тип данных


Исходный тип данных


sl

о I

*s е

S ?


целым


без знака


битовым


дата и время


символьным


О

z


ш


■S . X

0 I

11

LREAL


REAL


LINT


OINT


ШТ


SINT


ULINT


UDINT


n

«

«


UINT


USiNT


LWORO


OWORO


WORD


BYTE


BOOL


LTlME


TIME


LOT


ОТ


LOATE


OATE


LTOD


TOD


WSTRiNG


■s

3

z

*

c


STRING (Примечание)


WCHAfi


CHAR (Примечание)


Рисунок 11 — Правила преобразования типов данных — явные и неявные (сводка)


Обозначения:

— преобразование типа данных не требуется;

- — данным стандартом не определены явные или неявные преобразования типов данных.

Реализация может поддерживать дополнительные преобразования типов данных, специфичные для разработчика:

i — неявное преобразование типов данных: однако дополнительно разрешено явное преобразование типов:

е — явное преобразование типов данных, применяемое пользователем (стандартные функции преобразования). могут использоваться для предотвращения потери данных, несоответствия диапазонов или воздействия возможных функциональных возможностей, реализованных разработчиком.

Примечание — Преобразование STRING в WSTRING и CHAR в WCHAR не являются неявными, во избежание конфликтов с используемыми наборам* символов.

Рисунок 11, лист 2

На рисунке 12 показаны преобразования типов данных, поддерживаемые неявным преобразованием типов данных. Стрелки представляют возможные пути преобразования. Например. BOOL может быть преобразована в BYTE, BYTE может быть преобразована в WORD и т. д.

Рисунок 12 — Поддерживаемые неявные преобразования типов В следующих примерах показываются примеры преобразования типов данных.

Пример 6 — Сравнение явных и неявных преобразований типов

1) Объявление типа

VAR

PartsRatePerHr:

REAL:

PartsDone:

INT:

HoursElapsed:

REAL:

PartsPerShift:

INT:

ShiftLength: SINT:

END VAR

2)    Использование в языке ST

a)    Явное преобразование типа данных PartsRatePerHr:- INT_TO_REAL(PartsDone) /HoursElapsed;

PartsPerShift:- REAL_TOJNT(SINT_TO_REAL(ShiftLength)'PartsRatePerHr);

b)    Явное преобразование перегруженного типа

PartsRatePerHr.= TOJREALfPartsDone) / HoursElapsed; PartsPerShift := TO_INT(TO_REAL(ShiftLength)' PartsRatePerHr):

c)    Неявное преобразование типа данных PartsRatePerHr- PartsDone/HoursElapsed:

PartsPerShift:- TO_INT(ShiftLength * PartsRatePerHr):

3)    Использование в языке FBD

а) Явное преобразование типа данных

PartsDone -| INT TO real |~| +.............+ 1

!

DIV REAL

1

1

|

1

1

|

* |--| REAL TO INT |

1 1 1

| *-------------+

I

nuui оыа^о cu

1

1

1

1

I

T*

1

1

i

1

1

ShiftLength -| sintjto_real ♦.....

1__

1

1

I

1

1


PartsPerShift

Ь) Явное преобразование перегруженного типа

+--------+

I to_int I— PartsPerShift I    I


PartsDone -I to_real    I---I div_real |

ShiftLength


с) Неявное преобразование типов типизированными функциями

PartsDone


DIV REAL


HoursElapsed-


•+ + I —

I

I

I


MOL REAL


---1 T0_INT |---PartsPerShift


ShiftLength

6.6.1.7 Перегрузка

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

Говорят, что элемент языка перегруженный, когда он может оперировать с элементами входных данных различных типов в пределах родового типа данных, например ANY_NUM, ANYJNT.

Следующие стандартные элементы языка, предоставляемые изготовителем, могут иметь родо* вую перегрузку как специальное свойство:

•    стандартные функции

Это — перегруженные стандартные функции (например. ADD, MUL) и перегруженные стандарт* ные функции преобразования (например, TO.REAL, TOJNT):

•    стандартные методы

Настоящий стандарт не определяет стандартные методы в пределах стандартных классов и типов функциональных блоков. Однако они могут быть предоставлены разработчиком:

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

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

Однако они могут быть определены другими частями МЭК 61131. и могут предоставляться разработчиком:

•    стандартные классы

Настоящий стандарт не определяет стандартных классов. Однако они могут быть определены в других частях МЭК 61131, и могут предоставляться разработчиком;

•    операции

Это, например. *♦» и «*» в языке ST: ADD, MUL в языке IL.

6.6.1.7.2    Преобразование типов данных

Когда система программированного контроллера поддерживает перегруженные элементы языка, данный элемент языка применяется ко всем подходящим типам данных этого родового типа, которые поддерживаются системой.

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

Пример 1

Настоящий стандарт определяет для функции ADD родовой тип данных ANYJNUM для многих входных переменных одного вида и одного выходного результата.

Разработчик определяет для этого родовой тип данных ANY_NUM для связанных элементарных типов данных REAL и INT системы PLC.

Пример 2

Настоящий стандарт определяет функцию битового сдвиге LEFT для родового типа данных ANYJBIT для одной входной переменной и выходного результата и родового типа данных ANYJNT для другой входной переменной.

Разработчик определяет следующие два родовых тиле данных для системы PLC:

ANY_BIT представляет, например, элементарные типы данных BYTE и WORD:

ANYJNT представляет, например, элементарные mi/лы данных INT и UNT.

Перегруженный элемент языка оперирует с определенными элементарными типами данных в соответствии со следующими правилами:

•    типы данных входных переменных и результата имеют одинаковый тип. это применимо к входным переменным и результату одинаковою вида.

«Одинаковый вид» означает, что параметры, операнды и результат одинаково используются при сложении и умножении.

Более сложные комбинации определяются разработчиком:

-    если типы данных входных и выходных данных одинакового вида имеют разный тип. то преобразование типов в элементе языка определяется разработчиком:

-    неявное преобразование типов выражения и присваивания следует за последовательностью вычисления выражения. См. примеры ниже:

•    тип данных переменной для хранения результата перегруженной функции не влияет на тип данных результата функции или результата.

Примечание — Пользователь может явно задать тип результата операции, используя типизированные функции.

Пример 3

int3 ;= inti + int2 Сложение выполняется как целочисленная операция ')

dint1:= inti + int2; (‘ Сложение выполняется как целочисленная операция, когда результат преобразуется в тип DINT и присваивается переменной dintl *)

dintl:- dint2 * int3; (' int3 преобразуется в тип DINT, сложение выполняется как сложение DINT *)

6.6.2 Функции

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

Функция — это программный компонент, который не сохраняет свое состояние, то есть входные параметры, внутренние переменные, выходные параметры и результат.

Если не оговорено иное, к функциям применяются общие свойства программных компонентов.

Выполнение функции:

•    обычно предоставляет временный результат, который может быть одним элементом, многоэлементным массивом или структурой;

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

•    может изменять значение входных-выходных переменных и переменных VAR_EXTERNAL.

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

не должна вызываться внутри выражения.

6.6.2.2    Объявление функции

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

При объявления функции применяются следующие правила, заданные в таблице 19:

1    Объявление начинается с ключевого слова FUNCTION, за которым следует идентификатор, указывающий имя функции.

2    Если функция предоставляет результат, то далее следует символ «:» и тип данных значения, возвращаемого функцией. Если функция не предоставляет результата, двоеточие и тип данных опускаются.

3    Конструкции с VARJNPUT. VAR_OUTPUT и VAR_IN_OUT. если требуются, указывающие имена и типы данных параметров функции.

4    Значения переменных, которые передаются функции через конструкцию VAR_EXTERNAL. могут изменяться из функции.

5    Значения констант, которые передаются функции через конструкцию VAR_EXTERNAL CONSTANT, не могут изменяться из функции.

6    Значения переменных, которые передаются функции через конструкцию VAR_EXTERNAL. могут изменяться из функции.

7    Массивы переменной длины могут использоваться как VARJNPUT. VAR_OUTPUT и VARJN

OUT.

8    Входные-еыходные и временные переменные могут инициализироваться.

9    Могут использоваться входная переменная EN и выходная переменная ENO как описано.

10    Если требуется, конструкция VAR...END_VAR. а также последовательность VAR_TEMP...END_ VAR используются для определения имен и типов внутренних временных переменных.

В отличие от функциональных блоков, переменные, объявленные в секции VAR. не сохраняются.

11    Если в определении переменных стандартной функции используются родовые типы данных (например. ANYJNT), то правила использования фактических типов параметров таких функций являются частью определения функции.

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

13    Ключевое слово END_FUNCTlON завершает объявление.

Таблица 19 — Объявление функции

Номер

Описание

Пример

1a

Без результата

FUNCTION ... END.FUNCTION

FUNCTION myFC... END.FUNCTION

1b

С результатом

FUNCTION <name>: <data type> END.FUNCTION

FUNCTION myFC: INT... END.FUNCTION

2a

Входные параметры VARJNPUT...END.VAR

VARJNPUT IN:

2b

Выходные параметры VAR.OUTPUT...END.VAR

VAR.OUTPUT OUT: BOOL; ET.OFF: TIME; END.VAR

2c

Входные-выходные параметры VARJN.OUT...END.VAR

VAR.IN.OUT A: INT; END.VAR

2d

Временные переменные VAR.TEMP...END.VAR

VAR.TEMP 1: INT: END.VAR

2e

Временные переменные VAR...END.VAR

VAR B: REAL; END.VAR

Различие с функциональными блоками из-за проблем совместимости в функциональных блоках VAR являются статическими (сохраняются)!

21

Внешние переменные VAR.EXTERNAL...ENO.VAR

VAR.EXTERNAL В: REAL; END.VAR Соответствует следующему: VAR.GLOBAL В: REAL...

2g

Внешние константы VAR.EXTERNAL CONSTANT...END.VAR

VAR.EXTERNAL CONSTANT В: REAL; END.VAR Соответствует следующему:

VAR.GLOBAL В: REAL

3a

Инициализация входных параметров

VARJNPUT MN; INT:= 0;

3b

Инициализация выходных параметров

VAR.OUTPUT RES: INT:» 1;

3c

Инициализация временных переменных

VAR 1: INT:» 1;

-

Входной параметр EN и выходной параметр ENO

Определено в таблице 18

Пример —

//Спецификация интерфейсов параметра FUNCTION SIMPLE_FUN: REAL VARJNPUT A. В: REAL;

C: REAL~ 1.0: END_VAR VARJNjOUT COUNT: INT:

END_VAR


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

FUNCTION

REAL----tA    "    |----REAL

INT-----1 COUNT---COUNT |----INT


// Спецификация тепа функции    // Спецификация тела функции

---COUNTP1--I:- |---COONT

+——+

---I    I---1    /    I-SIMPLE FUN


COUNT :-COUNTP1    COUNT—| I

SIMPL E_FUN~ A *B/C; // результат

S

C

END_FUNCTION

а) Объявление и тело функции (языки ST и FBD) — (см. Примечание)

VAR GLOBAL DataArray: ARRAY (0..100) OF INT: END_VAR

FUNCTION SPECIAL_FUN VARJNPUT Firstlndex: INT:

Lastlndex: INT:

END_VAR VAR_OUTPUT Sum:

INT:

END_VAR

VAR_EXTERNAL DataArray:

ARRAY (0..100) OF INT:

END_VAR

VAR LINT: Sum: INT:-0; END VAR


// Внешний интерфейс

И функция без результата, но есть выходная переменная Sum

| SPECIAL_FUN |

INT----| Firstlndex Sum|----INT

// Тело функции — графически не показано

FOR i:= Firstlndex TO Lastlndex DO Sum:=

Sum * DataArrayp]:

END_FOR

ENDJFUNCTtON

b) Объявление и тело функции (функция без результата — с выходом Var)

Примечание — В примере а) входной переменной дано определенное неявное значение 1.0, чтобы предотвратить ошибку кделение на ноль», если вход не указан при вызове функции, например, если графический вход в функцию слева не соединен.

6.6.2.3 Вызов функции

Вызов функции может быть представлен в текстовой или графической форме.

Так как входные переменные, выходные переменные и результат функции не сохраняется, при* сваиеание входным параметрам, доступ к выходным переменным и результату происходит мгновенно при вызове функции.

Если массив переменной длины используется как параметр, параметр должен быть соединен к статической переменной.

Функция не содержит информацию о внутреннем состоянии, то есть она не сохраняет никакие входные, внутренние (временные) и выходные элементы от одного вызова до другого:

- вызов функции с одинаковыми параметрами (VARJNPUT и VAR_IN_OUT) и одинаковыми значениями переменных VAR_EXTERNAL всегда будет изготавливать одинаковые значения выходных переменных. входных-выходных переменных, внешних переменных и результат функции, если он имеется.

Примечание — Некоторые функции, обычно предоставляемые как системные функции от раэработчкиа могут производить различные значения, например, функции Т1МЕ(). RANDOM().

Таблица 20 — Вызов функции

Номер

Описание

Пример

la

Полный формальный вызов (только текстовый) Примечание 1 — Такой вызов используется, если указание параметров EN и ENO в вызове является обязательным.

А:= UM1T(EN: = CONO.

IN;= 8.

MN:= 0.

МХ:= 5.

ENO => TEMPI);

1b

Неполный формальный вызов (только текстовый) Примечание 2 — Используется, если использование параметров EN и ENO в вызове не является обязагегъным.

A;* L1MIT(IN:= B.

MX:= 5);

Примечание 3 — Переменная MN будет иметь неявное значение 0 (ноль).

2

Неформальный вызов (только текстовый) (с фиксированным порядком параметров и полный)

Примечание 4 — Используется для вызова стандартных функций без формальных имен.

A;- L1M)T(B. 0. 5);

Примечание 4 —Данный вызов эквивалентен вызову в примере 1а. но без параметров EN hENO.

3

Функция без результата функции

FUNCTION myFun ft нет объявления типа VARJNPUT х: INT; ENDVAR; VAR_OUTPUT у; REAL. END.VAR; myFun(150. var); It Вызов

4

Графическое представление

I FUN | а — 1 EN ENOI--b —|IN1 I-- result C --IIN2 Ql|--OUt 1 Q2|

+-------+

5

Испогъзование логического входа с отрицанием и логического выхода с отрицанием в графическом представлении

I FUN | a -olEN ENO| — b --IIN1 |— result C --IIN2 Q1|0- OUt

1 Q2I

Примечание 6 — Использование таких конструкций запрещено для входных-выходных переменных.

6

Графическое использование VAR_IN_OUT

1 rayFCl 1 а — 1 Ini Outl|— d b —llnout—Inoutl— c +------------+

Пример — Вызов функции Вызов VAR

X. У, Z. Resl, Res2: REAL;

Еп1. V: BOOL;

END_VAR

Res1~ DlVfln 1;- COS(X), In2:= SIN(Y), ENO ->EN1): Res2:= MUL(SIN(X), COS(Y));

Z := ADDfEN:- EN1. IN1~ Res1. IN2:= Res2. ENO => V); 60


II II

I

I +......

у    I sin I------

III I

I I

I

+---1 COS I

а) Вызов стандартных функций с результатом и параметрами EN и ENO

Объявление

FUNCTION My_function VARJNPUT Ini:

REAL;

END_VAR

Sнет типа, нет результата

VAR_OUTPUT Outl.

Out2: REAL;

END_VAR

VAR_TEMP Tmp1:

REAL:

END_VAR

//разрешено использование VAR_TEMP

VAR_EXTERNAL Ext:

BOOL:

END_VAR

// Тело функции ENDJFUNC TION

Текстовый и графический вызов My_Function (In1:= a, Outl => 6; Out2 => с);

//без результата

I Му Function |    //с двумя выходными переменными

а —|Ini”    OutlI — b

|    Out2|-- c

+------------+

b)    Объявление и вызов функции без результата, но с двумя выходными переменными Текстовый и графический вызов

myFCi (1п1:= a. lnout:= b, Outl => Ттр1); // использование временной переменной d:= myFC2 (In1:= Ттр1, Inout™ b);    // переменная Ь сохраняется в входноо-выходной пере

менной inout; Присваивание переменной

с:= Ь; И значение переменной b присвоено переменной с

И результат

//присваивание переменной


I myfCl |    I myFCa |

c)    Вызов функции с графическим представлением входных-выхойных переменных Текстовый и графический вызов

Му_ГитеНет (1я4/т в.    ■» 4)t if не разрешен в языке ST

My_Function (Ini™ a. Outl => Tmpf, Ouf2 => Ттр2); d:= Ттр1 + Гтр2;

+------------+

+-------

—+

| Му Function|

1 +

1— d

llnl Outll---

---llnl

1

I Out21---

+------------+

---1 In2

+-------

1

d) вызов функции без результата, но с выражением из выходных переменных

Примечание 2 — Данные примеры представляют различные представления одной и той же фукциональности. Не требуется поддерживать какое-либо автоматическое преобразование между двумя формами представления.

Б.6.2.4 Типизированные и перегруженные функции

Функция, которая нормально представляет перегруженный оператор, должна быть типизированной. Это можно сделать добавлением символа подчеркивания «_» с последующим требуемым типом, как показано в таблице 21. Типизированная функции выполняется, используя тип данных для своих входных и выходных переменных. Может применяться неявное или явное преобразование типов.

Перегруженная функция преобразования ТО_ххх или TRUNC_xxx с ххх. указывающим на типизированный элементарный выходной тип. может быть уточнена предшествующим требуемым элементарным типом входных данных и следующим символом подчеркивания.

Таблица 21 —Типизированные и перегруженные функции

Номер

Описание

Пример

1a

Перегруженная функция ADD (ANY.Num toANYJMum)

+---------+

I ADD |

ANY NUN —I 1 — ANY^NUM ANY_NUN --1 |

ANY_NUN —| |

1b

Преобразование входных переменных ANY_ELEMENT TOJNT

+---------+

ANY ELENBNTARY---1 TO INT |----INT

2aa>

Типизированные функции: ADDJNT

+---------+

| ADD INT |

INT —| I— INT INT —| |

INT —| |

+---------♦

2b*>

Преобразование типов: WORD_TO_INT

+-----------+

WORD----IWORO TO INTI---INT

♦-----------4

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

а> Если поддерживается свойство 2. разработчик предоставляет дополнительную таблицу, показываю-

щую, какие функции являются перегруженными и какие являются типизированными в реализации.

Пример 1 — Типизированные и перегруженные функции


VAR

A: INT; В: INT; С: INT; END VAR


А    —| + |— С


С:» А+В;

Примечание 1 — Преобразование типов в показанном выше примере не требуется.


VAR

+■

A:

INT;

A --1.

B:

REAL;

+

Cs

REAL;

В

END_VAR

Cj

VAR

4'

A:

INT;

A —|

B:

INT;

В — |

C:

REAL;

+■

END_VAR

C:

—+    +-----------+

+ I---I1NT ТО REALI~ С

|    + ----♦

—♦

** INT ТО REAL(А+Э);


+—+

-I + |— с I I •I I +—-+


C:- TO_REAL{A) + В;

Л---I ADD |---|TO_REAL|— C

C:- TO REAL(A+&)7


а) Объявление типа (язык ST)    b) Использование (языки FBQ и ST)

Пример 2 — Явное и неявное преобразование типов типизированными функциями


VAR

A: INT; В: INT; С: INT; END VAR


C:- ADD INT{A, B);


Примечание 2 — Преобразование типов в показанном выше примере не требуется.

Явное преобразование типа данных


VAR

A: INT/ В: REAL; С: REAL; END VAR



+ --------

C:« ADD_REAL{INT TO REAL(A), B);


Неявное преобразование типа данных


VAR

A: INT; В; REAL; С: REAL; END VAR


4_.    .__+



4..........4

C:« ADD REAL <A,B);


Явное преобразование типа данных

VAR

A: INT; В: INT; С: REAL; END VAR


Cj-


A —| ADD_INT [—|INT_TO_REAL|-

INT TO REAL(ADD INT(A, 8));


- C


Неявное преобразование типа данных

VAR

A: INT; В: INT; С: REAL; END VAR


A    —| ADD_INT |— C

C:= ADD INT(A, B);

а) Объявление типов (язык ST)


b) Использование (языки FBD и ST)


6.6.2.S Стандартные функции

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

Стандартная функция, определенная в этом подпункте расширяемой, может иметь две или более входных переменных, к которым может быть применена указанная операция. Например, расширяемое сложение дает в качестве выхода сумму всех ее входов. Максимальное число входных переменных расширяемой функции определяется разработчиком. Фактическое число входных переменных в формальном вызове расширяемой функции определяется именем формальной входной переменной с самым большим индексом в последовательности имен переменной.

Пример 1 —

Оператор X:- ADD (Y1, Y2, Y3);

эквивалентен оператору Х:= ADD (IN1.~ Y1, IN2:= Y2. IN3:= Y3);

Пример 2 —

Оператор I:- MUXJNT (К:=3, IN0:= 1. IN2~ Z IN4:= 3);

эквивалентен оператору l:= 0;

6.6.2.5.2    Функции преобразования типов данных

Как показано в таблице 22. функции преобразования типов    где я*» — тип входной пере

менной IN. а «**» — тип выходной переменной OUT, например, INT_TO_REAL. Влияние преобразований типов на точность и типы ошибок, которые могут возникать во время выполнения операций преобразования типов, определяется разработчиком.

Таблица 22 — Функция преобразования типов данных

Номер

Описание

Графическая форма

Пример использования

Типизированное преобразование вход_ТО_вы-ход

В---\ ‘ТО** |---А

(“) — Входной тип данных, например. INT (**) — Выходной тип данных, например. REAL

А:=

INT_TO_REAL(B);

Номер

Описание

Графическая форма

Пример использования

1Ьа).Ы.е>

Перегруженное преобразование ТО_еыход

В---1 ТО ** |---А

+-----------+

— Входной тип данных, например. INT (“) — Выходной тип данных, например. REAL

A:= TO_REAL(B):

с)

«Старое» перегруженное усечение данных TRUNC

AMY_REAl>---1 TRUNC |---ANY_INT

He рекомендуется

С>

Типизированное усечение данных exofl_TRUNC_BbiXQfl

+-----------+

ANY_R£AL ---I ♦_TR0NC_** |— ANY_INT “ +-----------+ ~

A:=

REAL_TRUNC_1NT(B);

2с®»

Перегруженное усечение данных TRUNC_Bbix<w

+........—+

ANY_REAL---I TRUNC_** I---ANY_INT

+-----------+

A:= TRUNCJNT(B);

33d)

Типизированная

функция

вход_ВСО_ТО_выход

•---| • BCD TO • • |---**

+----------- +

A:=

WORD_BCD_TO_INT{B);

ЗЬ^>

Перегруженная функция ВСО_ТО_выход

+-----------+

.----| BCD TO ** |---**

A:* BCD.TOJNT(B):

43d*

Типизированная

функция

вход_ТО_ВСО_выход

+---------

**----| ** TO BCD * |---*

+-----------4

A:=

INT_TO_BCD_WORD(B);

<*>

Перегруженная функция ТО_ВСО_выход

+-----------+

*----1 TO BCD ** |---**

+-----------+

A:= TO_BCD_WORD{B);

Примечание — Примеры использования даны на языке ST.

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

ь> Преобразования типа REAL или LREAL в тип SINT. INT. D4NT или LINT производить, округлять в соответствии с МЭК 60559. согласно которому, если два ближайших целых значения одинаково бтзки. результатом является ближайшее целое число, например:

REAL_TO_lNT (1.6) эквивалентно 2:

REAL.TOJNT(-1.6)эквивалентно -2;

REAL_TO_lNT ( 1.5) эквивалентно 2:

REAL_TO_lNT (-1.5) эквивалентно -2;

REAL_TO_INT ( 1.4) эквивалентно 1:

REAL_TO_lNT (-1.4)экви8апентно-1;

REAL_TO_INT ( 2.5) эквивалентно 2:

REAL_TO_!NT (-2.5) эквивалентно -2.

с| Функция TRUNC_‘ используется для усечения по направлению к нулю типов REAL tvw LREAL. выдавая один из целых типов, например:

TRUNCJNT (1.6) эквивалентно 1NT#1;

TRUNCJNT (-1.6) эквивалентно INT4M;

TRUNC_SINT {1.4) эквивалентно SINT#1;

TRUNC.SINT (-1.4) эквивалентно SlNT#-1.

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

d> Функции преобразования *_BCD_TO_'* и "_ТО_ВСО_* выполняют преобразования между переменными типа BYTE. WORD, DWORD и LWORD и переменными типа USINT. UINT. UD1NT и ULINT (представленными «*» и «**». соответственно), когда соответствующие переменные типа битовой строки закодированы в формате BCD. Например, значением USINT_TO_BCO_BYTE<25) будет 2#0010_0101. а значением WORD.BC D_TO_UI NT (2#0011_0110_1001) будет 396.

е* Когда входом или выходом функции преобразования типов является тип STRING или WSTRING, данные символьной строки соответствуют внешнему представлению соответствующих данных, как указано в 6.3.3. в наборе символов, определенном в 6.1.1.

6.6.2.5.3 Преобразование числовых типов данных

В преобразовании числовых типов данных используются следующие правила:

1    Тип данных источника расширяется до самого большого типа данных этой категории типов данных.

2    Затем результат преобразуется в самый большой тип данных категории типов данных, к которой принадлежит целевой тип данных.

3    Затем этот результат преобразуется в целевой тип данных.

Если значение исходной переменной не вмещается в целевой тип данных, то есть диапазон значений слишком мал. то значение целевой переменной определяется разработчиком.

Примечание — Реализация фумщии преобразования может использовать более эффективную процедуру.

Промер — Х:= REAL_TO_INT (70_000.4)

1    Значение (70_000.4) типа REAL преобразуется е значение (70_000.400_000..) типа LREAL.

2    Значение (70_000.4000_000..) типа LREAL преобразуется в значение (70_000) типа UNT. Здесь значение округлено до целого.

3    Значение (70_000) типа LINT преобразуется в значение типа INT. Здесь окончательное значение определяется разработчиком, поскольку максимальное значение, которое может хранить тип INT равно 65536.

Затем результат записывается в переменную целевого типа данных. Теперь данная переменная хранит то же значение, что и исходная переменная, если целевой тип данных в состоянии хранить это значение.

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

Тип данных BOOL, используемый в качестве исходного типа данных, рассматривается как тип данных целого без знака, который может хранить значения 0 и 1.

В таблице 23 описаны функции преобразования с деталями, вытекающими из применения описанных выше правил.

Таблица 23 — Преобразование числовых типов данных

Комор

Функции прео$ра>оваиия типов данных

Детяли преобразования

1

LREAL _ТО_ REAL

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

2

LREAL _ТО_ LINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

3

LREAL _ТО_ DINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

4

LREAL _TO_ INT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

Комор

Функции пр*о$ра>ования типов данных

Детали преобрамвания

5

LREAL

.TO.

SINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

6

LREAL

.TO.

ULINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

7

LREAL

.TO.

UDINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

8

LREAL

.TO.

UINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

9

LREAL

.TO.

USINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

10

REAL

.TO.

LREAL

Преобразование, сохраняющее значение

11

REAL

.TO.

LINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

12

REAL

.TO.

DINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

13

REAL

.TO.

I NT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

14

REAL

.TO.

SINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

15

REAL

.TO.

ULINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

16

REAL

.TO.

UDINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

17

REAL

_TO_

UINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

18

REAL

_TO_

USINT

Преобразование с округлением, ошибки дают результат, определяемый разработчиком

19

LINT

_TO_

LREAL

Преобразование с потенциальной потерей точности

20

LINT

.TO.

REAL

Преобразование с потенциальной потерей точности

21

LINT

.TO.

DINT

Ошибки диапазона значений дают результат, определяемый разработчиком

22

LINT

.TO.

I NT

Ошибки диапазона значений дают результат, определяемый разработчиком

23

LINT

.TO.

SINT

Ошибки диапазона значений дают результат, определяемый разработчиком

24

LINT

.TO.

ULINT

Ошибки диапазона значений дают результат, определяемый разработчиком

25

LINT

_TO_

UDINT

Ошибки диапазона значений дают результат, определяемый разработчиком

26

LINT

_TO_

UINT

Ошибки диапазона значений дают результат, определяемый разработчиком

27

LINT

.TO.

USINT

Ошибки диапазона значений дают результат, определяемый разработчиком

Продолжение таблицы 23

Комор

Функции пр*о$ра>ования типов данных

Детали преобрамвания

28

DINT

_TO_

LREAL

Преобразование, сохраняющее значение

29

DINT

_TO_

REAL

Преобразование с потенциальной потерей точности

30

DINT

_TO_

LINT

Преобразование, сохраняющее значение

31

DINT

_TO_

I NT

Ошибки диапазона значений дают результат, определяемый разработчиком

32

DINT

_TO_

SINT

Ошибки диапазона значений дают результат, определяемый разработчиком

33

DINT

.TO.

ULINT

Ошибки диапазона значений дают результат, определяемый разработчиком

34

DINT

-TO.

UDINT

Ошибки диапазона значений дают результат, определяемый разработчиком

35

DINT

_TO_

UINT

Ошибки диапазона значений дают результат, определяемый разработчиком

36

DINT

.TO.

USINT

Ошибки диапазона значений дают результат, определяемый разработчиком

37

I NT

_TO_

LREAL

Преобразование, сохраняющее значение

38

I NT

_TO_

REAL

Преобразование, сохраняющее значение

39

I NT

_TO_

LINT

Преобразование, сохраняющее значение

40

I NT

_TO_

DINT

Преобразование, сохраняющее значение

41

I NT

_TO_

SINT

Ошибки диапазона значений дают результат, определяемый разработчиком

42

I NT

_TO_

ULINT

Ошибки диапазона значений дают результат, определяемый разработчиком

43

I NT

_TO_

UDINT

Ошибки диапазона значений дают результат, определяемый разработчиком

44

I NT

_TO.

UINT

Ошибки диапазона значений дают результат, определяемый разработчиком

45

I NT

-TO.

USINT

Ошибки диапазона значений дают результат, определяемый разработчиком

46

SINT

-TO.

LREAL

Преобразование, сохраняющее значение

47

SINT

-TO.

REAL

Преобразование, сохраняющее значение

48

SINT

-TO.

LINT

Преобразование, сохраняющее значение

49

SINT

-TO.

DINT

Преобразование, сохраняющее значение

50

SINT

-TO.

I NT

Преобразование, сохраняющее значение

51

SINT

-TO.

ULINT

Ошибки диапазона значений дают результат, определяемый разработчиком

52

SINT

-TO.

UDINT

Ошибки диапазона значений дают результат, определяемый разработчиком

53

SINT

-TO.

UINT

Ошибки диапазона значений дают результат, определяемый разработчиком

Комор

Функции пр*о$ра>ования типов данных

Детали преобрамвания

54

SINT

_TO_

USINT

Ошибки диапазона значений дают результат, определяемый разработчиком

55

ULINT

_TO_

LREAL

Преобразование с потенциальной потерей точности

56

ULINT

_TO_

REAL

Преобразование с потенциальной потерей точности

57

ULINT

_TO_

LINT

Ошибки диапазона значений дают результат, определяемый разработчиком

5S

ULINT

_TO_

DINT

Ошибки диапазона значений дают результат, определяемый разработчиком

59

ULINT

_TO_

I NT

Ошибки диапазона значений дают результат, определяемый разработчиком

60

ULINT

_TO_

SINT

Ошибки диапазона значений дают результат, определяемый разработчиком

61

ULINT

_TO_

UDiNT

Ошибки диапазона значений дают результат, определяемый разработчиком

62

ULINT

_TO_

UINT

Ошибки диапазона значений дают результат, определяемый разработчиком

63

ULINT

_TO_

USINT

Ошибки диапазона значений дают результат, определяемый разработчиком

64

UDiNT

_TO_

LREAL

Преобразование, сохраняющее значение

65

UDINT

-TO.

REAL

Преобразование с потенциальной потерей точности

66

UDiNT

_TO_

LINT

Преобразование, сохраняющее значение

67

UDINT

_TO_

DINT

Ошибки диапазона значений дают результат, определяемый разработчиком

68

UDINT

_TO_

I NT

Ошибки диапазона значений дают результат, определяемый разработчиком

69

UDINT

.TO.

SINT

Ошибки диапазона значений дают результат, определяемый разработчиком

70

UDINT

_TO_

ULINT

Преобразование, сохраняющее значение

71

UDINT

_TO_

UINT

Ошибки диапазона значений дают результат, определяемый разработчиком

72

UDINT

_TO_

USINT

Ошибки диапазона значений дают результат, определяемый разработчиком

73

UINT

_TO.

LREAL

Преобразование, сохраняющее значение

74

UINT

_TO_

REAL

Преобразование, сохраняющее значение

75

UINT

_TO_

LINT

Преобразование, сохраняющее значение

76

UINT

.TO.

DINT

Преобразование, сохраняющее значение

77

UINT

_TO_

I NT

Ошибки диапазона значений дают результат, определяемый разработчиком

78

UINT

_TO_

SINT

Ошибки диапазона значений дают результат, определяемый разработчиком

79

UINT

_TO_

ULINT

Преобразование, сохраняющее значение

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

Комор

Функции нреобрадегаиия типов ДАННЫХ

Детали преобразования

80

UINT

_TO_

UDINT

Преобразование, сохраняющее значение

81

UINT

.TO.

USINT

Ошибки диапазона значений дают результат, определяемый разработчиком

82

USINT

_TO_

LREAL

Преобразование, сохраняющее значение

83

USINT

_TO_

REAL

Преобразование, сохраняющее значение

84

USINT

_TO_

LINT

Преобразование, сохраняющее значение

85

USINT

_TO_

DINT

Преобразование, сохраняющее значение

86

USINT

.TO.

I NT

Преобразование, сохраняющее значение

87

USINT

_TO_

SINT

Ошибки диапазона значений дают результат, определяемый разработчиком

88

USINT

_TO_

ULINT

Преобразование, сохраняющее значение

89

USINT

.TO.

UDINT

Преобразование, сохраняющее значение

90

USINT

_TO_

UINT

Преобразование, сохраняющее значение

6.6.2.5.4 Преобразование типов битовых типов данных

При преобразовании этого типа данных используются следующие правила:

1    Преобразование типов данных осуществляется как передача двоичных данных.

2    Если исходный тип данных меньше, чем целевой тип данных, исходное значение хранится в самых правых битах целевой переменной, а самые левые биты устанавливаются в ноль.

3    Если исходный тип данных меньше, чем целевой тип данных, только самые правые биты исходной переменной сохраняются в целевом типе данных.

Правый бейт


U IF


Пример

Источник:


Левый байт


Адресат

В таблице 24 описаны функции преобразования с деталями, вытекающими из применения описанных выше правил.

Таблице 24 — Преобразование битовых типов данных

Но

мер

Функция преобразования типов данных

Детали преобразования

1

LWORD

_ТО_

DWORD

Двоичная передача самых правых байтов в адресат

2

LWORD

.ТО.

WORD

Двоичная передача самых правых байтов в адресат

3

LWORD

_ТО_

BYTE

Двоичная передача самых правых байтов в адресат

4

LWORD

_ТО_

BOOL

Двоичная передача самого правого бита в адресат

Но*

ыер

Функция преобразования типов данных

Детали преобразования

5

DWORO

_to.

LWORD

Двоичная передача самых правых байтов в адресат, самые левые байты устанавливаются в нуль

6

DWORD

_TO_

WORD

Двоичная передача самых правых байтов в адресат

7

DWORD

_TO_

BYTE

Двоичная передача самых правых байтов в адресат

8

DWORD

_TO_

BOOL

Двоичная передача самого правого бита в адресат

9

WORD

_TO_

LWORD

Двоичная передача самых правых бейтов в адресат, самые левые байты устанавливаются в нуль

10

WORD

_TO_

DWORD

Двоичная передача самых правых байтов в адресат, самые левые бейты устанавливаются в нуль

11

WORD

_TO_

BYTE

Двоичная передача самых правых байтов в адресат

12

WORD

_TO_

BOOL

Двоичная передача самого правого бита в адресат

13

BYTE

_TO_

LWORD

Двоичная передача самых правых байтов в адресат, самые левые бейты устанавливаются в нуль

14

BYTE

_TO_

DWORD

Двоичная передача самых правых байтов в адресат, самые левые бейты устанавливаются в нуль

15

BYTE

_TO_

WORD

Двоичная передача самых правых байтов в адресат, самые левые байты устанавливаются в нуль

16

BYTE

_TO_

BOOL

Двоичная передача самого правого бита в адресат

17

BYTE

_TO_

CHAR

Передача двоичных данных

18

BOOL

_TO_

LWORD

Дает результат 16#0 или 16#1

19

BOOL

_TO_

DWORD

Дает результат 16#0 или 16#1

20

BOOL

_TO_

WORD

Дает результат 16#0 или 16#1

21

BOOL

_TO_

BYTE

Дает результат 16#0 или 16#1

22

CHAR

_TO_

BYTE

Передача двоичных данных

23

CHAR

_TO_

WORD

Двоичная передача самых правых байтов в адресат, самые левые байты устанавливаются в нуль

24

CHAR

_TO_

DWORD

Двоичная передача самых правых байтов в адресат, самые левые байты устанавливаются в нуль

25

CHAR

_TO_

LWORD

Двоичная передача самых правых байтов в адресат, самые левые байты устанавливаются в куль

26

WCHAR

_TO_

WORD

Передача двоичных данных

27

WCHAR

_TO_

DWORD

Двоичная передача самых правых байтов в адресат, самые левые байты устанавливаются в нуль

28

WCHAR

_TO_

LWORD

Двоичная передача самых правых байтов в адресат, самые левые байты устанавливаются в нуль

6.6.2.5.S Преобразование битовых типов данных в числовые типы данных При преобразовании этого типа данных используются следующие правила:

1    Преобразование типов данных осуществляется как передача двоичных данных.

2    Если исходный тип данных меньше, чем целевой тип данных, исходное значение хранится в самых правых битах целевой переменной, а самые левые биты устанавливаются в ноль.

Пример 1

X: SINT:- 18: W: WORD: W:= S1NT_TO_WORD(X); и W получает значение 16*0012.

3 Если исходный тип данных меньше, чем целевой тип данных, только самые правые байты исходной переменной сохраняются в целевом типе данных.

Промер 2

W: WORD: - 16*1234: X: SINT; X.- W: и X получает значение 54 (-16*34).

В таблице 25 описаны функции преобразования с деталями, вытекающими из применения опи* санных выше правил.

Таблице 25 — Преобразование битовых и числовых типов данных

Но

мер

Функция преобразования типов данных

Детали преобриования

1

LWORD

_TO_

LREAL

Передача двоичных данных

2

DWORD

_TO_

REAL

Передача двоичных данных

3

LWORD

-TO.

LINT

Передача двоичных данных

4

LWORD

_TO_

DINT

Двоичная передача самых правых байтов в адресат

5

LWORD

-TO.

I NT

Двоичная передача самых правых байтов в адресат

6

LWORD

-TO.

SINT

Двоичная передача самого правого байта в адресат

7

LWORD

-TO.

ULINT

Передача двоичных данных

8

LWORD

-TO.

UDINT

Двоичная передача самых правых байтов в адресат

9

LWORD

-TO.

UINT

Двоичная передача самых правых байтов в адресат

10

LWORD

-TO.

USINT

Двоичная передача самого правого байта в адресат

11

DWORD

-TO.

UNT

Двоичная передача в самые правые байты адресата

12

DWORD

-TO.

DINT

Передача двоичных данных

13

DWORD

-TO.

I NT

Двоичная передача самых правых байтов в адресат

14

DWORD

-TO.

SINT

Двоичная передача самого правого байта в адресат

15

DWORD

-TO.

ULINT

Двоичная передача в самые правые байты адресата

16

DWORD

-TO.

UDINT

Передача двоичных данных

17

DWORD

-TO.

UINT

Двоичная передача самых правых байтов в адресат

16

DWORD

-TO.

USINT

Двоичная передача самого правого байта в адресат

19

WORD

-TO.

UNT

Двоичная передача в самые правые байты адресата

20

WORD

-TO.

DINT

Двоичная передача в самые правые байты адресата

21

WORD

-TO.

I NT

Передача двоичных данных

22

WORD

-TO.

SINT

Двоичная передача самого правого байта в адресат

23

WORD

-TO.

ULINT

Двоичная передача в самые гфавые байты адресата

24

WORD

-TO.

UDINT

Двоичная передача е самые правые байты адресата

25

WORD

-TO.

UINT

Передача двоичных данных

26

WORD

-TO.

USINT

Двоичная передача самого правого байта в адресат

27

BYTE

-TO.

UNT

Двоичная передача в самые гфавые байты адресата

28

BYTE

-TO.

DINT

Двоичная передача е самые правые байты адресата

Но

мер

Функция прео$ра>ок&ния тнпоо данных

Детали преобрамвания

29

BYTE

_TO_

INT

Двоичная передача в самые правые байты адресата

30

BYTE

_TO_

SINT

Передана двоичных данных

31

BYTE

_TO_

ULINT

Двоичная передача в самые правые байты адресата

32

BYTE

_TO_

UDINT

Двоичная передача в самые правые байты адресата

33

BYTE

_TO_

UINT

Двоичная передача в самые правые байты адресата

34

BYTE

_TO_

USINT

Передана двоичных данных

35

BOOL

-TO.

LINT

Дает резугътат 0 или 1

36

BOOL

_TO_

DINT

Дает результат 0 или 1

37

BOOL

.TO.

INT

Дает резугътат 0 или 1

36

BOOL

_TO_

SINT

Дает результат 0 или 1

39

BOOL

_TO_

ULINT

Дает резугътат 0 или 1

40

BOOL

_TO_

UDINT

Дает результат 0 или 1

41

BOOL

.TO.

UINT

Дает резугътат 0 или 1

42

BOOL

.TO.

USINT

Дает результат 0 или 1

43

LREAL

.TO.

LWORD

Передача двоичных данных

44

REAL

_TO_

DWORD

Передача двоичных данных

45

LINT

.TO.

LWORD

Передача двоичных данных

46

LINT

.TO.

DWORD

Двоичная передача самых правых байтов в адресат

47

LINT

_TO_

WORD

Двоичная передача самых правых байтов в адресат

46

LINT

-TO.

BYTE

Двоичная передача самого правого байта в адресат

49

DINT

_TO_

LWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

50

DINT

_TO_

DWORD

Передана двоичных данных

51

DINT

_TO_

WORD

Двоичная передача самых правых байтов в адресат

52

DINT

.TO.

BYTE

Двоичная передача самого правого байта в адресат

S3

INT

.TO.

LWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

54

INT

.TO.

DWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

55

INT

_TO_

WORD

Передача двоичных данных

56

INT

.TO.

BYTE

Двоичная передача самого правого байта в адресат

57

SINT

_TO_

LWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

56

SINT

-TO.

DWORD

Двоичная передача в самые правые бейты адресата, остальные байты =0

59

SINT

_TO_

WORD

Передана двоичных данных

60

SINT

_TO_

BYTE

Передана двоичных данных

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

Но

мер

Функция преобразования типов данных

Детали преобразования

61

ULINT

_TO_

LWORD

Передана двоичных данных

62

ULINT

_TO_

DWORD

Двоичная передача самых правых байтов в адресат

63

ULINT

_TO_

WORD

Двоичная передача самых правых байтов в адресат

64

ULINT

_TO_

BYTE

Двоичная передача самого правого байта в адресат

65

UDINT

_TO_

LWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

66

UDINT

_TO.

DWORD

Передача двоичных данных

67

UDINT

_TO_

WORD

Двоичная передача самых правых байтов в адресат

66

UDINT

_TO_

BYTE

Двоичная передача самого правого байта в адресат

69

UINT

_TO_

LWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

70

UINT

_TO_

DWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

71

UINT

_TO_

WORD

Передана двоичных данных

72

UINT

_TO_

BYTE

Двоичная передача самого правого байта в адресат

73

USINT

_TO_

LWORD

Двоичная передача в самые правые байты адресата, остальные байты = 0

74

USINT

_TO_

DWORD

Двоичная передача в самые правые байты адресата, остальные байты =0

75

USINT

_TO_

WORD

Передача двоичных данных

76

USINT

_TO_

BYTE

Передача двоичных данных

6.6.2.S.6 Преобразование типов данных даты и времени В таблице 26 показывается преобразование типов данных даты и времени.

Таблице 26— Преобразование типов данных даты и времени

Но

мер

Функция преобразования типов данных

Детали преобразования

1

LT1ME

_то.

TIME

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

2

TIME

-TO.

LTIME

Ошибки диапазона значений дают результат, определяемый разработчиком, и может происходить потеря точности

3

LDT

-TO.

DT

Ошибки диапазона значений дают результат, определяемый разработчиком, и может происходить потеря точности

4

LDT

-TO.

DATE

Преобразует только содержащуюся дату, ошибки диапазона значений дают результат, определяемый разработчиком

5

LDT

_TO_

LTOD

Преобразует только содержащееся время суток

6

LDT

-TO.

TOO

Преобразует только содержащееся время суток, может происходить потеря точности

7

DT

_TO_

LDT

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

Но

мер

Функции преобразования типов данных

Детали преобразования

8

DT

_ТО_

DATE

Преобразует только содержащуюся дату, ошибки диапазона значений дают результат, определяемый разработчиком

9

DT

_то.

LTOD

Преобразует только содержащееся время суток, ошибки диапазона значений дают результат, определяемый разработчиком

10

DT

_то.

ТОО

Преобразует только содержащееся время суток, ошибки диапазона значений дают результат, определяемый разработчиком

11

LTOD

_ТО_

ТОО

Преобразование, сохраняющее значение

12

TOD

_ТО_

LTOD

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

6.6.2.5.7 Преобразование символьных типов данных В таблице 27 показывается преобразование символьных типов данных.

Таблица 27 — Преобразование символьных типов данных

Но-

пер

Функция преобразования типов данных

Детали преобразования

1

WSTRING

_TO_

STRING

Преобразуются только символы, поддерживаемые разработчиком в типе данных STRING, преобразование остальных символов определяется разработчиком

2

WSTRING

_to_

WCHAR

Передается первый символ строки, если строка пустая, целевая переменная имеет неопределенное значение

3

STRING

.TO.

WSTRING

Преобразует символы строки как определено разработчиком в соответствующие символы набора символов ИСО/МЭК 10646 (UTF-16)

4

STRING

_TO_

CHAR

Передается первый символ строки, если строка пустая, целевая переменная имеет неопределенное значение

5

WCHAR

-TO.

WSTRING

Дает строку с фактической длтой в один символ

б

WCHAR

-TO.

CHAR

Преобразуются только символы, поддерживаемые разработчиком в типе данных CHAR, преобразование остальных символов определяется разработчиком

7

CHAR

-TO.

STRING

Дает строку с фактической длиной в един символ

8

CHAR

-TO.

WCHAR

Преобразует символ как определено разработчиком в соответствующий символ набора символов UTF-16

6.6.2.5.8 Числовые и арифметические функции

Стандартное графическое представление, имена функций, типы входных и выходных переменных и описания функций одной числовой переменной определяются в таблице 28. Данные функции перегружаются на определенных родовых типах данных и могут быть типизированными. В таких функциях вход и выход имеют одинаковый тип.

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

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

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

Таблица 28 — Числовые и арифметические функции

Но

мер

Описание (имя функции)

Тип входной/ выходной переменной

Объяснение

Графическая форма

• —1 ♦* 1— •

(*) — Тип входной/выходной переменной (*•) — Имя функции

Пример использования в языке ST А:= SIN(B);

(язык ST)

Общие функции

1

ABS(x)

ANY.NUM

Абсолютная величина

2

SQRT(x)

ANY.REAL

Квадратный корень

Логарифмические функции

3

LN(x)

ANY.REAL

Натуральный логарифм

4

LOG(x)

ANY.REAL

Десятичный логарифм

5

ЕХР(х)

ANY.REAL

Экспонента

Тригонометрические функции

6

SIN(x)

ANY.REAL

Синус от входного значения в радианах

7

COS(x)

ANY_REAL

Косинус от входного значения в радианах

8

TAN(x)

ANY.REAL

Тангенс ог входного значения в радианах

9

ASIN(x|

ANY.REAL

Главное значение арксинуса

10

ACOS(x)

ANY.REAL

Главное значение арккосинуса

11

ATAN(x)

ANY.REAL

Главное значение арктангенса

12

ATAN2(yx)

I ATAN2 |

ANY_REAL—|Y |--ANY_REAL ANY~REAL--|X |

+-------+

ANY.REAL

Угол между положительным направлением оси х плоскости и точкой, заданной координатами (х. у). Значение угла является положительным для углов против часовой стрелки (верхняя полуплоскость. у > 0). и отрицательным для углов по часовой стрелке (нижняя полуплоскость. у < 0).

Таблица 29 — Арифметические функции

Но

мер

Описание

Название

Символ

(оператор)

Объяснение

Графическая форма

Пример использования в языке

+-----+

ANY NUM —| *** |— ANY_NUM ANY__NUM — | |

ANY_NUM —| |

+-----+

(***) — Название или символ

как вызов функции: А:= ADD(B. С. D): или

как оператор (символ) А:= В + С + О:

Но*

мор

Описание

Название

Си u eon (оператор!

Объяснение

Расширяемые арифметические функции

1е)

Сложение

ADD

+

OUT:» INI + IN2 +... + INn

2

Умножение

MUL

OUT;» INI * IN2 *... * INn

Нерасширяемые арифметические функции

зс)

Вычитание

SUB

-

OUT:» INI * IN2 *... * INn

43'

Деление

DIV

/

OUT:» INI l IN2

5в)

Остаток по модулю

MOD

OUT:» INI modulo IN2

6^

Экспонента

EXPT

• •

OUT:» IN1IN2

7д>

Пересылка

MOVE

;=

OUT:» IN

Примечание 1 — Непустые значения в графе «Символ» могут использоваться как операторы в текстовых языках.

Примечание 2— Запись IN1, 1N2.....INn ссылается на входные переменные в нисходящем порядке;

OUT ссыпается на выходную переменную.

Примечание 3 — Примеры использования и объявления даны на языке ST.

а> Когда представление функции поддерживается именем, это отмечается суффиксом «п» в декларации соответствия.

Например. «1п» представляет запись «ADD».

ь> Когда представление функции поддерживается символом, это отмечается суффиксом «s» в декларации соответствия. Например. «1в» представляет запись «+».

с' Входные и выходные переменные для этих функций имеют тип ANY_MAGNITUDE.

d> Результатом деления целых чисел является целое число того же типа с усечением значения по направлению к нулю, например. 7/3 = 2 и {-7УЗ = -2.

®>Для этой функции. IN1 и IN2 имеют родовой тип ANYJNT. Результат выполнения этой функции MOD эквивалентен вычислению следующих операторов языка ST:

IF (IN2 = 0)

THEN OUT:=0;

ELSE OUT:=IN1 - <IN1/1N2)'IN2;

ENDJF

^ Для функции EXPT. IN1 имеет тип ANY_REAl. a IN2 — тип ANY_NUM. Тип выходной переменной — такой же. как тип переменной 1N1.

В) Функция MOVE имеет ровно одну входную переменную (IN) типа ANY и одну входную переменную (OUT) типа ANY.

6.6.2.5.Э Битовые строки и поразрядные логические функции

Стандартное графическое представление, имена функций и описания функций сдвига для одной переменной типа битовой строки определяются в таблице 30. Данные функции перегружаются для типов битовой строки и могут быть типизированы.

Стандартное графическое представление, имена функций и символов и описания поразрядных логических функций определяются в таблице 31. Данные функции являются расширяемыми (за исключением функции NOT), перегружаются для всех типов битовых строк, и могут быть типизированными.

Таблица 30 — Функции битового сдвига

Но

мер

Описание

Название

Объяснение

Графическая форма

Пример использования а

-—+ 1 tvt 1

1 1

ANY BIT —| IN |— ANY BIT ANY_INT —|N |

A:=SHL(IN:=B.N:=5>; (язык ST)

T““***T

(***} — Имя функции

1

Сдвиг влево

SHL

OUT:» IN. сдвинутому влево на N бит. биты справа заполняются нулями

2

Сдвиг вправо

SHR

OUT:» IN. сдвинутому вправо на N бит. биты слева заполняются нулями

3

Циклический сдвиг влево

ROL

OUT:» IN. циклически сдвинутому влево на N бит

4

Циклический сдвиг вправо

ROR

OUT:9 IN. циклически сдвинутому вправо на N бит

Примечание 1 — Запись 01ГГ ссылается на результат функции.

Пример —

IN:= 2*0001_1001 of type BYTE. N-3 SHL(IN. 3) = 2tt1100_1000 SHRflN. 3} = 2tt0000_0011 ROLflN, 3} = 2M1100J000 RORflN. 3) - 2#0010_0011

Примечание 2 — IN типа BOOL (один бит) не имеет смысла.

а> Если входная переменная N меньше нуля, возникает ошибка.

Таблица 31 — Поразрядные логические функции

Номер

Описание

Название

Символ

Объяснение (см. примечание 3)

Графическая форма +-----♦

ANY_BIT --I *** I-- ANY_BIT ANY BIT —| |

: —I I : —I I

ANY_BIT — | |

<**•) — Название или символ

Примеры использования (см. примечание 5)

A:9 AND(B. С. D); или

А:9В&С&0:

1

И

ANO

&

(см. примечание 1)

OUT:9 INI & IN2 &... & INn

2

Или

OR

> = 1

(см. примечание 2}

OUT:9 INI OR 1N2 OR... OR INn

3

Исключающее или

XOR

= 2к+1

(см. примечание 2)

OUT:9 INI XOR IN2 XOR... XOR INn

4

Отрицание

NOT

OUT:9 NOT IN1 (см. примечание 4)

Примечание 1 — Данный символ подходит для использования в качестве оператора а текстовых языках. как показано в таблицах 68 и 71.

Примечание 2 — Данный символ не подходит для использования в качестве оператора в текстовых языках.

Примечание 3— Запись IN1, 1N2.....INn ссылается на входные переменные в нисходящем порядке;

OUT ссыпается на выходную переменную.

Примечание 4 — Графическое отрицание сигналов типа BOOL также может быть осуществлено.

Примечание 5 — Примеры использования и объявления даны на языке ST.

а* Когда представление функции поддерживается именем, это отмечается суффиксом «п» 8 декларации соответствия. Например. «1п» представляет запись «AND».

Ь) Когда представление функции поддерживается символом, это отмечается суффиксом «s» в декларации соответствия. Например. «1в» представляет запись «&».


6.6.2.5.10 Функции выбора и сравнения

Функции выбора и сравнения перегружены для всех типов данных. Стандартное графическое представление, имена функций и символов и описания функций сравнения показываются в таблице 32.

Стандартное графическое представление, имена функций и символов и описания функций сравнения показываются в таблице 33. Все функции сравнения (за исключением функции NE) являются расширяемыми.

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

Таблица 32 — Функции выбора*1

Но

мер

Описание

Имя

Графическая форма

ОбъясиекиеЛТример

1

Пересыгкз*1-*> (присваивание)

MOVE

I MOVE |

ANY --I |- ANY +--------+

OUT:= IN

2

Двоичный

выбор*1

SEL

+-------+

1 SEL |

BOOL —|G |- ANY ANY —UNO |

ANY —|IH1 1 +-------+

OUT:= 1N0 if G = 0 OUT:= 1N1 if G = 1 Пример 1 —

A:- SEL (G .- 0, !N0:-X. IN1:=5);

3

Расширяемая функция максимума

МАХ

*-------+

1 MAX I

ANT ELEMENTARY —| |- ANY ELEMENTARY : --I 1

ANY_ELEMENTARY —| |

+-------4

OUT:=

MAX(IN1.IN2.....INn);

Пример 2 —

A™ MAX(B. C, D):

4

Расширяемая функция минимума

MIN

I MIN |

ANY ELEMENTARY —| |- ANY ELEMENTARY : —1 1 AHY_BLEMENTARY —| |

OUT:=

MIN (INI. IN2.....

Nn)

Пример 3 —

A— MIN(B, C, D);

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

Но*

мер

Описание

Имя

Графическая форма

Объяснение,'Пример

5

Ограничитель

LIMIT

4-------+

I LIMIT |

ANY ELEMENTARY —|MN j- ANY ELEMENTARY

any”elementary —I IN |

ANY_ELEMENTARY —|MX |

” +-------+

OUT:* MIN {MAX{IN. MN).MX):

Пример 4 —

A:- UMIT(IN:= B. MN:= 0.

MX:- 5);

6

Расширенный мультиплексор Ь). с), d). е>

MUX

I MUX I

ANY_BLEMBNTARY --|K |- ANY_ELEMENTARY ANY_ELEMENTARY —| j ANY~KLBMENTARY —| |

4-•••-..4

a. b. c:

Выбирает одну из N входных переменных в зависимости от входной переменной К Пример 5 —

А— МиХ(0, В. С, D): имеет такой же эффект как А-В:

Примечание 1 — Запись IN 1. IN2.....INn ссылается на входные переменные в нисходящем порядке:

OUT ссылается на выходную переменную.

Примечание 2 — Примеры испогъзовзния и объявления даны на языке ST.

Функция MOVE имеет ровно одну входную переменную IN типа ANY и одну входную переменную OUT типа ANY.

ь* Неименованные входные переменные функции MUX имеют неявные имена INO. IN1.....INn-1 в нисходящем порядке, где п из общего числа входных переменных. Данные имена могут {но необязательно) быть показаны в графическом представлении.

с) Функция MUX может быть типизирована в форме MUX_*_’*. где * — тип входной переменной К и ** — тип других входных переменных и выхода.

d> Разработчику разрешается (но необязательно) поддерживать выбор среди переменных определенных пользователем типов данных, чтобы подтвердить соответствие этому свойству.

е> Если фактическое значение входной переменной К функции MUX находится вне диапазона {0 ... п-1), возникает ошибка.

Таблица 33 — Функции сравнения

Но

мер

Описание

Имя81

Символ*1

Объяснение

(расширяемая. 2 или большее число операндов)

Графическая форма

Пример использования

ANY ELEMENTARY —| »»* |— BOOL — 1 1

ANY_SL8MENTARY —| |

+*•••**

{***) Имя или символ

A:* GT(B. С. D): // Имя функции или

А:* (В>С) & (OD): /1 Символ

1

Убывающая последовательность

GT

>

OUT:*

<IN1>!N2)& (IN2XN3) &.. & (INn-1 > INn)

2

Монотонная последовательность

GE

>=

OUT:*

<IN1>*IN2)&{IN2>*IN3)&.. & (INn-1 >* INn)

Но-

пор

Описание

Им*81

Символ61

Объяснение

(расширяемая: 2 или большое число операндов)

3

Equality

EQ

=

OUT:®

(IN1®IN2)&(iN2®lN3) &.. & (INn-1 = INn)

4

Монотонная последовагегъность

IE

<=

OUT:®

(IN1<=IN2)&(IN2<=IN3)&.. & (INn-1 <= INn)

5

Increasing sequence

LT

<

OUT:®

<IN1«N2)& (IN20N3) &.. & (INn-1 < INn)

6

Inequality

NE

<>

OUT:® (INI »1N2) (нерасширяемая)

Примечание 1 — Запись IN 1. IN2 INnссылается на входные переменные в нисходящем порядке:

OUT ссылается на выходную переменную.

Примечание 2 — Все символы, показанные в данной таблице, могут использоваться как операторы в текстовых языках.


Примечание 3 — Примеры использования и объявления даны на языке ST.

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

а> Когда представление функции поддерживается именем, это отмечается суффиксом ап» в декларации соответствия. Например. «1п» представляет запись «GT».

ь> Когда представление функции поддерживается символом, это отмечается суффиксом «в» в декларации соответствия. Например. «1в» представляет запись а>».


К строкам символов применяется таблица 33. Вместо однобайтовой строки может использоваться переменная типа CHAR или WCHAR, соответственно.

При сравнении двух строк разной длины более короткая строка рассматривается расширенной справа символами с кулевым значением до длины более длинной строки. Сравнение осуществляется слева направо на базе числовых значений кодов символа в наборе символов.

Пример — Строка символов ’Z’больше строки символов ‘AZ'(‘Z'> ‘А) и строка символов ‘AZ’ больше чем строка 'ABC С А' = ‘А' и ‘Z’> 'В").

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

позиции символов в строке считаются пронумерованными 1. 2.....L. начиная с самого левого символа.

где L — длина строки.

Ошибка возникает, если:

•    фактическое значение какой-либо входной переменной типа ANYJNT в таблице 34 меньше

нуля:

•    вычисление функции приводит к попытке (1) получить доступ к несуществующей позиции в строке. или (2) получить строку длиннее определенной разработчиком максимальной длины строки:

•    аргументы типа данных STRING или CHAR и аргументы типа данных WSTRING или WCHAR смешаны в одной функции.

Таблица 34 — Строковыефунхции

Но

мер

Описание

Графическая форма

Пример

1

Длина

строки

+----------*■

ANY^STRING—| LEN |-- ANY_INT ~ +---------+ ~

Длина строки A:® LEN('ASTRING'):

... эквивалентно А:® 7:

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

Но

мер

Описание

Графическая форма

Пример

2

Левая

подстрока

+---------+

ANY_STRING—| LEN |— ANY_INT

L самых левых символов из IN А:= LEFT(IN:='ASTR'. L:=3); эквивалентно A:= 'AST;

3

Правая

подстрока

+---------4

| RIGHT |

ANY STRING--! IN 1" ANY STRING ANY_INT — f L |

4---------4

L самых правых символов из IN А:= LEFT(IN:=ASTR\ L:=3>; эквивалентно A:= STR-;

4

Средняя

подстрока

+---------+

| MID |

ANY STRING--|IN |-- ANY STRING ANY_INT |L |

ANY_INT --JP |

+---------4

L символов из IN. начиная с Р-й позиции символа

А:= MID(IN:-ASTR\ L:=2. Р;=2); эквивалентно А:= 'ST;

5

Расши

ряемая

конкате

нация

4---------4

| CONCAT |

ANY CHARS—| |— ANY STRING : — 1 1 ANY_CHARS— | |

Расширяемая конкатенация А;= CONCAT(‘AB7CD7E'); эквивалентно А:= ABCDE’,

6

Вставить

———————————

| INSERT |

ANY STRING--UNI |— ANY STRING ANY~CHARS --JIN2 |

ANY_INT—— |P |

4---------4

Вставить строку IN2 в строку INI после Р-й позиции символа А;= INSERT(IN1:=ABC'.

IN2:*'XY', Р=2); эквивалентно А:= 'ABXYC';

7

Удалить

4---------4

I DELETE |

ANY STRING--1 IN |— ANY STRING ANY IN? — |L |

ANY_XNT —|P I ~ +---------+

Удалить L символов из строки 1N. начиная с Р-й позиции символа А;= DELETE{IN:-ABXYC',

L:*2. Р:=3);

эквивалентно А:= 'АВС':

8

Заменить

4---------4

| REPLACE |

ANY STRING—| INI |— ANY STRING ANY CHARS --IIN2 |

ANY IN? —|Ь I ANY_INT —|P |

4.........4

Заменить L символов строки IN1 строкой IN2. начиная в Р-й позиции символа

А:= REPLACE(IN1;= ABCDE. IN2:-X\ L:=2. Р:=3): эквивалентно А:= АВХЕ';

9

Найти

4---------4

I FIND |

ANY_STRING—|INI | — AN¥_INT ANY^CHARS —|IN2 |

~ 4---------+

Найти позицию символа в начала первого вхождения строки IN2 в строку IN1. Если вхождения строки IN2 не обнаружены, то OUT:= 0.

А:= FIND(IN1:= ABCBC. IN2:='BC'); ... эквивалентно А;= 2;

Примечание 1 — Примеры в этой табтце даются на языке ST.

Примечание 2 — Все входные переменные функции CONCAT имеют тип ANY_CHARS, то есть могут быть также типа CHAR или типа WCHAR.

Примечание 3 — Входная переменная I N2 функций INSERT. REPLACE. FIND имеет тип ANY_CHARS. то есть может также иметь тип CHAR или WCHAR.

6.6.2.5.11 Функции даты и продолжительности времени

В функциях сравнения и выбора разрешено также использование входных и выходных перемен* ных, имеющих типы данных времени и продолжительности времени, показанные в таблице 35.

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

Таблица 35 — Числовые функции типе» данных времени и продолжительности времени

Но

мер

Описание (имя функции)

Сиыаол

INI

>N2

OUT

AOD

TIME. LTIME

TIME. LTIME

TIME. LTIME

ADD.TIME

+

TIME

TIME

TIME

ADD.LTIME

LTIME

LTIME

LTIME

AOD

+

TOO. LTOD

LTIME

TOD. LTOD

ADD.TOD.TIME

TOO

TIME

TOD

ADD_LTOD_LTIME

+

LTOD

LTIME

LTOD

За

AOD

DT. LOT

TIME. LTIME

DT. LDT

ЗЬ

ADD.DT.TIME

+

DT

TIME

DT

Зс

ADD_LDT_LTIME

LOT

LTIME

LDT

SUB

-

TIME. LTIME

TIME. LTIME

TIME. LTIME

SUB.TIME

-

TIME

TIME

TIME

SUB.LTIME

-

LTIME

LTIME

LTIME

SUB

-

DATE

DATE

TIME

56

SUB.DATE.DATE

-

DATE

DATE

TIME

SUB_LDATE_LDATE

-

LDATE

LDATE

LTIME

SUB

-

TOO. LTOD

TIME. LTIME

TOD. LTOD

60

SUB.TOO.TIME

-

TOO

TIME

TOD

SUB_LTOD_LTIME

-

LTOD

LTIME

LTOD

SUB

-

TOO. LTOD

TOD. LTOD

TIME. LTIME

70

SUB_TOO_TOD

-

TOO

TOD

TIME

SUB_TOO_TOD

-

LTOD

LTOD

LTIME

SUB

-

DT. LOT

TIME. LTIME

DT. LDT

60

SUB.DTTIME

-

DT

TIME

DT

SUB_LDT_LTIME

-

LOT

LTIME

LDT

SUB

-

DT. LOT

DT. LDT

TIME. LTIME

90

SUB_DT_DT

-

DT

DT

TIME

SUB_LDT_LDT

-

LOT

LDT

LTIME

10а

MUL

e

TIME. LTIME

ANY_NUM

TIME. LTIME

100

MUL.TIME

TIME

ANY_NUM

TIME

10с

MUL.LTIME

e

LTIME

ANY_NUM

LTIME

11а

DIV

/

TIME. LTIME

ANY_NUM

TIME. LTIME

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

Но

мер

Описание (имя функции)

Синкоп

IN1

М2

OUT

11Ь

DIV.TIME

/

TIME

ANY_NUM

TIME

11с

DIV.LTIME

/

LTIME

ANY.NUM

LTIME

Примечание — Данные стандартные функции поддерживают перегрузку, но только е пределах обоих наборе» типов данных (TIME. ОТ. DATE. TOD) и (LTIME. LDT, DATE. LTOO).

Пример —

Операторы языка ST Х:= DT91986-04-28-08:40:00;

Y:- DT_TO_TOD(X);

W:= DT_TO_DATE(X):

имеют такой же результат, как и операторы с •извлеченными» данными.

X:- ОТЯ1986-04-28-08:40:(Ю;

У;= TIME_OF_DAYW8:40:00:

W:= 0АТЕЯ1986-04-28:

Функции конкатенации и расщепления данных, показанные в таблице 36. определены и для об* работки данных даты и времени. Дополнительно определена функция получения дня недели.

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

Таблица 36 — Дополнительные CONCAT и SPLIT функции для типов данных даты и времени

Но

мер

Описание

Графическая форма

Пример

Конкатенация типов данных даты и времени

1a

CONCAT_DATE

_TOD

+-----------------+

I CONCAT DATE TOD l DATE --|DATE |--DT TOD --ITOD |

+-----------------+

Соединить дату и время VAR

myD: DATE:

END.VAR

myD:* CONCAT_DATE_TOD {D#2010-03-12. TOD#12:30:00);

1b

CONCAT DATE _LTOD

+-----------------+

| CONCAT_DATB_LTOD!

DATE —|DATE J--LDT LTOD --ILTOD |

+-----------------+

Соединить дату и время суток VAR

myD: DATE;

END.VAR

myD:* CONCAT_DATE_LTOD (D#2010-03-12,

TOD#12:30:12.1223452);

2

CONCAT_DATE

I CONCAT OATS |

ANY INT —|YEAR [—DATE ANY_INT --|MONTH | ANY_INT --|DAY |

+-------------+

Соединить дату и время суток VAR

myD: DATE:

END.VAR

myD:* CONCAT_DATE (2010.3.12);

Но

мер


Описание


Графическая форма


Пример


За


CONCAT TOD


+-------------+

| CONCAT TOD ANY INT —| BOOR    |—TOD

ANY INT —IMINUTE ANY INT —| SECOND ANYJTNT —IMILLISECOND *•------------


Соединить время суток VAR

myTOD: TOD:

END.VAR

myTD:= CONCAT_TOD (16.33,12.0):


3b


CONCAT LTOD


+-------------+

1 CONCAT_LTOD

ANY_INT — | HOUR    |— LTOD

ANY_INT --(MINUTE ANY_INT --I SECOND ANY~INT —IMILLISECOND *" +------------


Соединить время суток VAR

myTOD: LTOD:

END.VAR

myTD:= CONCAT_TOD (16.33,12,0):


4a


CONCAT DT


| CONCAT_DT ANY^INT --|YEAR ANY~INT —|MONTH ANY_INT —| DAY ANY_INT —| HOUR ANY_INT —|MINUTE ANY INT —|SECOND ANY~INT —IMILLISECOND +------------


--DT


Соединить время суток VAR

myDT: DT;

Day: USINT;

END.VAR

Day := 17; myDT:= CONCATJDT (2010.S.Day. 12.33.12.0):


4b


CONCAT LDT


+---------— — +

I CONCAT LDT

ANY_INT --(YEAR “ I--LDT ANY_INT —|MONTH ANY_INT --|DAY ANY INT --1 HOUR ANY”lNT --(MINUTE ANY_INT —|SECOND ANY INT —IMILLISECOND


Соединить время суток VAR

myDT: LDT;

Day: USINT; END.VAR Day :® 17;

myDT;® CONCAT_LDT (2010.3.Day.12.33.12,0);


Расщепление типов даты и времени


SPLIT DATE


I SPLIT_DATE | DATE--|IN ” YEAR| |    MONTH|


I


DAY | • • +


ANY_INT ANY_INT ANY INT


См. примечание 2


Расщепить дату VAR

myD: DATE:® DATE#2010-03-10; myYear: UINT: myMonth, myDay: USINT:

END.VAR

SPLIT.DATE

(myD. myYear, myMonth. myDay);


Продолжение таблицы 36

Но

мер

Описание

Графическая форма

Пример

SPL1T.TOO

Расщепить время суток

i SPLIT TOD |

VAR myTOD. ТОО:= TOD#14:12:03:

TOD--IIN HOUR!— ANY INT

гпуНоиг. myMin, my Sec: USINT;

1 MINUTE!— ANY_INT

myMitliSec: UINT:

| SECOND!-- ANY INT

END.VAR

| MILLISECOND!— ANY INT

+-------------+

SPLIT_TOD(myTOD. myHour,

См. примечание 2

myMin, mySec. myMUiSec):

SPLIT LTOD

• •

Расщепить время суток

VAR myTOD: LTOO:=TOD#14:12:03;

I SPLIT_LTOD |

LTOD—|IN HOUR!— ANY_INT

myHour.

| MINUTE|— ANY_INT | SECOND!-- ANY INT

myMin. mySec: USINT;

| MILLISECOND!-- ANY INT

myMiUiSec: UINT:

END.VAR

Си. примечание 2

SPUT_TOD(myTOD. myHour. myMin. mySec. myMiHiSec):

SPLIT.DT

+-------------+

Расщепить дату

I SPLIT DT |

VAR myOT: DT

DT—|IN YEAR!-- ANY_INT

;■ DT F2010-03-10-14:12:03:00;

! MONTH|— ANY INT

myYear. myMtiliSec: UINT;

! DAY!— ANY INT

! HOUR!— ANY INT

myMonth, myDay. myHour.

| MINUTE!— ANY INT

myMin,

! SECOND!— ANY INT

mySec: USINT;

1 MILLISECOND!— ANY_INT

4 1

END.VAR

SPLIT_DT(myDT. myYear. myMonth.

См. примечание 2

myDay.

myHour. myMin. mySec. myMifliSec);

SPLfT_LDT

+-------------+

Расщепить дату

| SPLIT_LDT |

VAR myOT: LDT

LDT--IIN YEAR!-- ANY_INT

:= DTF2010-03-10-14:12:03:00;

1 MONTH!— ANY INT

I DAY!-- ANY INT | HOUR!-- ANY INT

myYear. myMtlliSec: UINT; UINT; myMonth. myDay. myHour, myMin.

| MINUTE!-- ANY INT

mySec: USINT:

j SECOND!-- ANY INT

END.VAR

| MILLISECOND!-- ANY_INT • •

SPLIT_DT(myDT. myYear. myMonth.

myDay.

См. примечание 2

myHour. myMin. mySec, myMiltiSec);

Получить день недели

8

DAY OF WEEK

• •

Получить день недели:

1 DAY OF WEEK 1

VAR myD: DATE:» DATE#2010-03-

DATE—| IN “ |- ANY INT

10; myDoW: USINT:

+—-----------+

END.VAR

См. примечание 2

myOoW:= DAY.OF.WEEK(myD):

Функция DAY_OF_WEEK возвращает 0 для воскресенья. 1 для понедельника.....6 для субботы

Примечание 1 —Тип данных входной переменной YEAR должен быть, по меньшей мере, 16-битовым типом для поддержки допустимого значения года.

Примечание 2 — Типы данных для типов данных выходных переменных ANYJNT определяет разработчик.

Примечание 3 — Разработчик может определять дополнительные входные и выход we переменные в соответствии с поддерживаемой точностью, например, микросекунды и наносекунды.


6.6.2.5.12 Функции преобразования порядка следования байтов

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

Порядок следования байтов определяет упорядочение байтов в длинных типах данных и переменных.

Значения данных в порядке big endian (от старшего к младшему) помещаются в байтах памяти, начиная с левого байта и оканчивая правым.

Значения данных в порядке little endian (от младшего к старшему) помещаются в байтах памяти, начиная с правого байта и оканчивая левым.

Независимо от порядка следования байтов, битовое смещение 0 адресует самый правый бит типа данных.

Использование частичного доступа с маленькими числам возвращает нижнюю часть значения независимо от указанного порядка следования байтов.

Пример 1 — Порядок следования байтов TYPED: DWORD.- 1691234_5678; END_TYPE:

Расположение в памяти

для порядка big endian: 16912. 16934. 16956. 16978 для порядка little endian: 16978. 16956. 16934. 16912.

Пример 2 — Порядок следования байтов

TYPE L: UUNT:- 1691234_5678_9ABC_DEF0; END_TYPE;

Расположение в памяти

для порядка big endian: 16912. 16934.16956. 16978. 1699А. 169ВС. 169DE. 169F0 для порядка little endian: 169Р0. 169DE. 1698С. 1699А. 16978. 16956. 16934. 16912

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

-    ANYJNT с размером больше или равным 16 бит.

-    ANY_BIT с размером больше или равным 16 бит.

-    ANY_REAL;

-    WCHAR.

-    TIME;

-    массивы этих типов данных;

• структуры, содержащие компоненты этих типов данных.

Другие типы не преобразуются, но могут содержаться в структурах, подлежащих преобразованию. Функции преобразования порядка следования байтов показаны в таблице 37.

Таблица 37 — Функции преобразования порядка следования байтов

Номер

Описание

Графическая форма

Текстовая форма

1

TO.BIG.ENDIAN

-------—--------+

| TO BIG ENDIAN |

ANY — | IN ~ |—ANY ♦ ----------------

Преобразование 8 формат данных b*g endian А:= TO_B!G_ENDIAN(B);

2

ТО LITTLE ENDIAN

I.TO LITTLE ENDIAN |

ANY —|IN . | --ANY

Преобразование в формат данных little endian В:* TO_UTTLE_ENDtAN(A);

3

BIG_ENDlAN_TO

+------------------♦

1 FROM BIG_ENDIAN |

ANY —| IN ~ |—ANY +------------------*

Преобразование из формата данных Ыд endian A:* FROM_BlG_ENDIAN(B);

4

LITTLE ENDIAN TO

t------------------+

I FROM LITTLE ENDIAN)

ANY —|IN ” “ 1—ANY

Преобразование из формата данных little endian

А:= FROM_LITTLE_ENDIAN(B);

Типы данных на входной и выходной стороне должны иметь одинаковый тип даншх.

Примечание — В случае, если переменная уже находится в требуемом формате, функция не изменяет представления данных.

6.6.2.5.13 Функции перечислимых типов данных

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

Таблица 38 — Функции перечислимых типов данных

Но

мер

Описание/ имя функции

Символ

Номер свойства «х» в таблице «у»

1

SEL

Свойство 2. таблица 32

2

MUX

Свойство 6. таблица 32

За)

EQ

=

Свойство 3. таблица 33

4а>

NE

О

Свойство 6. таблица 33

Примечание — К данной таблице применяются положения примечаний 1 и 2 таблицы 33.

Примечание — К данной таблице применяются положения подстрочных примечаний а) и Ь) таблицы 33.

6.6.2.5.14 Функции подтверждения

Функции подтверждения проверяют, содержит ли заданный входной параметр допустимое значение.

Для типов данных REAL и LREAL определена перегруженная функция IS_VALID. Функции подтверждения возвращает результат FALSE, если действительное число не является числом (NaN) или равно бесконечности {+lnf, -Inf).

Разработчик может поддерживать дополнительные типы данных посредством функции подтверждения IS_VALID. Результат таких расширений определяется разработчиком.

Перегруженная функция IS_VALID_BCD определена для типов данных BYTE. WORD. DWORD и LWORD. Функции подтверждения возвращает результат FALSE, если значение не удовлетворяет определению 8CD.

Перечень свойств функций подтверждения приведен в таблице 39.

Таблица 39 — Функции подтверждения

Но*

мор

Функция

Графическая форма

Пример

1

IS.VALID

4--------------+

| IS VALID |

ANY_REAL—|IN I--BOOL +--------------+

Подтверждение значения типа REAL VAR R: REAL: END.VAR IF IS_VALID(R) THEN ...

2

IS VALID BCD

+--------------+

| IS_VALID_BCD |

-ANY_BIT--|IN ~ ~ |—BOOL +--------------+

Тест подтверждения слова BCD VAR W: WORD; END_VAR IF IS_VALID_BCD(W) THEN ...

6.6.3 Функциональные блоки

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

Функциональный блок — это программный компонент, который представляет хорошо определенную часть программы для обеспечения модульности и структуризации.

Концепция функционального блока реализуется типом функционального блока и экземпляром функционального блока:

•    тип функционального блока состоит из следующих частей:

•    определение структуры данных, разделенной на входные, выходные и внутренние переменные:

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

•    экземпляр функционального блока:

•    это многократное, именованное применение (экземпляры) типа функционального блоха;

•    каждый экземпляр имеет связанный идентификатор (имя экземпляра), и структуру данных, содержащую статические входные, выходные и внутренние переменные.

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

Если не оговорено иное, к функциональным блокам применяются общие свойства программных компонентов;

- объектно-ориентированный функциональный блок.

Функциональный блок может быть расширен набором объектно-ориентированных свойств.

Объектно-ориентированный функциональный блок является также расширенным множеством классов.

6.6.3.2    Объявление типа функционального блока

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

Свойства объявления типа функционального блока определены в таблице 40:

1)    ключевое слово FUNCTION_BLOCK. за которым следует имя объявляемого функционального блока;

2)    множество операций, составляющее тело функционального блока;

3)    завершающее ключевое слово END_FUNCTION_BLOCK после тела функционального блока;

4)    конструкции VARJNPUT. VARJDUTPUT и VAR_IN_OUT. при необходимости, определяющие имена и типы переменных:

5)    значения переменных, которые объявляются через конструкцию VAR_EXTERNAL, могут изменяться из функционального блока:

6)    значения констант, которые объявляются через конструкцию VAR_EXTERNAL CONSTANT и не могут изменяться из функционального блока:

7)    массивы переменной длины могут использоваться как VAR_IN_OUT;

6) выходные и статические переменные могут инициализироваться;

9) переменные EN и ENO объявляются так же. как и входные и выходные переменные. Имеются специфические свойства функциональных блоков (отличные от свойств функций);

10)    конструкция VAR...END_VAR и также конструкция VAR_TEMP...END_VAR. при необходимости, определяющие имена и типы внутренних переменных функциональных блоков, в отличие от функций, переменные, объявленные в секции VAR, являются статическими:

11)    переменные секции УАР(статические) могут быть объявлены как PUBLIC или PRIVATE. По умолчанию используется спецификатор доступ PRIVATE. Переменные PUBLIC могут использоваться вне функционального блока, используя такой же синтаксис, как при доступе к выходным переменным функционального блока;

12)    для входных, выходных и внутренних переменных функционального блока могут использо* ваться квалификаторы RETAIN или NON.RETAIN. как показано в таблице 40;

13)    е текстовых объявлениях квалификаторы R.EDGE и F.EDGE используются для обозначения функции детектирования фронта сигнала логических входных переменных. Это приводит к неявному объявлению в данном функциональном блоке функционального блока типа R_TRIG или F.TRIG. соответственно. для выполнения обнаружения требуемого фронта. Пример такой конструкции приведен е таблице 40.

14)    в графических объявлениях для детектирования задних и передних фронтов сигнала применяется конструкция, показанная в таблице. При использовании набора символов в графических объявлениях. символы «>» и «<» показываются на границе функционального блока;

15)    в объявлении внутренних переменных функционального блока может использоваться символ «*». как определено в таблице 16;

16)    если в объявлениях типов стандартных входных и выходных переменных функционального блока используются родовые типы данных, то правила определения фактических типов выходных параметров таких типов функциональных блоков являются частью определения типа функционального блока;

17)    экземпляры других функциональных блоков, классов, объектно-ориентированных функциональных блоков могут объявляться во всех секциях переменных, за исключением секции VAR_TEMP;

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

Таблице 40 — Объявление типа функционального блока

Ноы«р

Описание

Пример

1

Объявление типа функционального блока FUNCTION.BLOCK... END.FUNCTION.BLOCK

FUNCTION.BLOCKmyFB... END.FUNCTION.BLOCK

Объявление входных переменных VARJNPUT ...END.VAR

VARJNPUT IN: BOOL; T1: TIME: END.VAR

Объявление входных переменных VAR.OUTPUT... END.VAR

VAR.OirTPlfT OUT: BOOL; ET.OFF: TIME; END.VAR

Объявление входных-выходных переменных VARJN.OUT... END.VAR

VAR.IN.OUT A: INT; END.VAR

2d

Объявление временных переменных VAR.TEMP... END.VAR

VAR.TEMP I: INT; ENO_VAR2e

Объявление статических переменных VAR... END.VAR

VAR B: REAL: END.VAR

2f

Объявление внешних переменных VAR.EXTERNAL... END.VAR

VAR.EXTERNAL B: REAL; END.VAR Соответствует следующему: VAR.GLOBAL В: REAL

Номер

Описание

Пример

Объявление внешних переменных VAR_EXTERNAL CONSTANT... END.VAR

VAR_EXTERNAL CONSTANT В: REAL; END.VAR

Соответствует следующему. VAR_GtOBAL В: REAL

За

Инициализация входных парамегров

VARJNPUT MN: INT:= 0;

ЗЬ

Инициализация выходных параметров

VAR.OUTPUT RES: INT:= 1:

Зс

Инициализация статических переменных

VAR B: REAL-12.1;

3d

Инициализация временных переменных

VAR.TEMP 1: INT:= 1;

Входной параметр EN и выходной параметр ENO

Определено в таблице 18

Объявление квалификатора RETAIN для входных переменных

VARJNPUT RETAIN X; REAL: END.VAR

Объявление квалификатора RETAIN для выходных переменных

REAL; END.VAR

Объявление квалификатора RETAIN для выходных переменных

VARJNPUT NON.RETA1N X: REAL: END.VAR

4d

Объявление квалификатора NON_RETAIN для выходных переменных

VAR.OUTPUT NON.RETAIN X: REAL: END.VAR

Объявление квалификатора NON_RETAIN для статических переменных

VAR RETAIN X: REAL: END.VAR

41

Объявление квалификатора NON.RETAIN для статических переменных

VAR NON.RETAIN X: REAL: END.VAR

Объявление квалификатора RETAIN для локальных экземпляре» функционального блока

VAR RETAIN TMR1: TON; END.VAR

Объявление квалификатора NON_RETA)N для локальных экземпляров функционального блока

VAR NON.RETAIN TMR1: TON; END.VAR

Текстовое объявление:

• входных переменных переднего фронта

FUNCTION.BLOCK AND.EDGE VARJNPUT X: BOOL R.EDGE:

Y: BOOL F.EDGE;

END.VAR

VAR.OUTPUT Z: BOOL: END.VAR Z:= X AND Y: ('пример на языке ST *) END.FUNCTION.BLOCK

• входных переменных заднего фронта (текстовое)

См. выше

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

Номер

Описание

Пример

7a

Графическое объявление:

• входных переменных переднего фронта {>)

FUNCTION.BLOCK

{* Внешний интерфейс *)

+--------

— +

| AND EDGE |

BOOL—->Х

I

ZI--B00L

I

1

BOOL--<Y

t

1

1

1

+--------

1

— +

(* тело функционального блока

')

+-----

+

1 «

1

X—|

I—Z

Y—|

1

+-----

+

END_FUNCTION_BLOCK

7b

Графическое объявление:

См. выше

• входных переменных заднего фронта (<}

Примечание — Свойства 1—Зэтойтаблицы эквивалентны функциям, сы.таблицу 19.

Ниже приведены примеры объявления типа FB. Пример 1 — Объявление типа функционального блока FUNCTtONJBL ОСК DEBOUNCE Внешний интерфейс '**)

VARJNPUT

IN: BOOL: (‘ Неявно = 0‘)

DB_TIME: TIME:- t*10ms;    (‘ Неявно = ttHOms ')

END_VAR

VAR_OUTPUT

OUT: BOOL: С Неявно = 0’)

ET_OFF: TIME:    (' Неявно = T#0s V

END_VAR

VAR DB_ON: TON; (** Внутренние переменные At) DBjOFF:    TON; ("и экземпляры FB ")

DBJFF:    SR;

END_VAR

(*** Тело функционального блока ***)

DBjON (IN:- IN, PT~ DB_TIME);

DB_OFF(IN:- NOTIN, PT:= DBJHME);

DBJFF (SI:* DB_ON.Q, R:= DBJOFF.Q);

OUT:* DBJFF.Q1;

ET_OFF:= OB_OFFET;

ENDJFUNCVONJBLOCK

а) Текстовое объявление (язык ST) FUNCTIONJBLOCK

(* Интерфейс внешних параметров V


I    DEB0UNCE |

B00L---1 IN    OUT |---BOOL

TIME---|DB_TIME ET_OFF|---TIME

+---------------+


(* Тело типа функционального блока ‘)


DB ON    DB FF


IN—


| TON |

-----1 IN    Q|

+---1    PT    ET|

I    +-----+


I SR |

---|S1 Q|---OUT

♦—IR I

I +----+


+•

DB TIME


| DB_OFF |

| |

I I TON |    |

I —0| IN Q|—+

+---|PT ET|--------------ET_OFF


END FUNCTION BLOCK


b) Гоафическое объявление (язык FBD)


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


Пример 2 -

+_______+    FUNCTIONJBLOCK ACCUM

| ACCUM |    VARJNJDUTA: INT: END_VAR

INT___| A_____A| jNT    VARJNPUT X: INT; END_VAR

INT---|X    |    A:=A*X;

+-------+    ENDJFUNCTIONJBLOCK

+ --- +

A—| + I—A X— -|    |

+---+


a) Гоафическое и текстовое объявление типа функционального блоке и функции


АСС1

1    ACCUM |


VAR

ACC: INT; X1: INT: X2: INT: END_VAR


+---+

Это объявление предположительное: эффект выполнения:

АСС:= ACC+XVX2:


Ь) Допустимое использование экземпляра функционального блока и функции


ЛСС2

Объявления как в примере Ь) предполагаются для

ACC. Х1, Х2. ХЗ и Х4;

эффект выполнения следующий: АСС:= А СС+Х1 ‘Х2+ХЗ ‘Х4;


ACC1


I ACCOM I    I    ACCOM I

ACC--------1A-----A |---------------1A-----A | —ACC

с) Допустимое использование экземпляра функционального блока

VAR

АСС1

+ — -4


Х1: INT:

Х2: INT.-ХЗ: INT:

Х4: INT:

ENDJVAR

Объявление предположительное: эффект выполнения:

Х3:= ХЗ*Х1 ‘Х2:

Х4г= ХЗ;


d) Допустимое использование экземпляра функционального блока


НЕДОПУСТИМО!

Соединение к входной-выходной переменной А не является переменной или именем функционального блока (см. предыдущий тексту

е) Неразрешенное использование экземпляра FB

Следующий пример показывает функциональный блок AND_EDGE. используемый в таблице 40. Пример 3 — Объявление типа функционального блока AND_EDGE

Объявление функционального блока ANDJEDGE на примере выше в таблице 40 эквивалентно следующему объявлению:

FUNCTtONJBLOCK ANDJEDGE VARJNPUT X: BOOL;

Y: BOOL;

ENDJVAR

VAR

X_TRIG: RJTRIG;

Y_TRIG: FJTRIG;

ENDJVAR VAR_

OUTPUT Z: BOOL;

ENDJVAR

X_TRIG(CLK:= X);

Y_TRIG(CLK:= Y);

Z:- X_ TRtG.Q AND Y_TRIG.Q;

END_FUNCTION_BLOCK

Определение функциональных блоков обнаружения фронта RJTRIG и F.TRIG см. в таблице 44.

6.6.3.3 Объявление экземпляра функционального блока

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

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

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

Таблица 41 —Объявление экземпляра функционального блока

Но*

мер

Описание

Пример

1

Объявление экземпляра функционального блока

VAR

FB_instance_1. FB_inslance_2: my FB_Type: T1. T2. T3: TON:

END.VAR

2

Объявление экземпляра FB с инициализацией его переменных

VAR

TempLoop: P1D:=(PropBand:= 2.5.

Integral:3 T#5s);

END.VAR

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

6.6.3.4 Вызов функциональною блока

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

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

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

1)    текстуальный вызов функционального блока состоит из имени экземпляра с последующим перечнем параметров;

2)    в графическом представлении имя экземпляра функционального блока располагается над блоком;

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

a)    немедленно во время вызова функционального блока (типовой способ); или

b)    отдельно от вызова. Такие отдельные присваивания становятся эффективными во время следующего вызова функционального блока;

c)    неприсвоенные или несоединенные входные переменные функционального блока сохраняют свои инициализированные значения от последнего предыдущего вызова при наличии такового.

Возможна ситуация, когда не указано фактического параметра для еходной-выходной переменной экземпляра функционального блока, используемой в качестве входной переменной другого экземпляра другого функционального блока. Однако экземпляру функционального блока будет предоставлено допустимое значение. Это может быть: значение, полученное инициализацией; сохраненное значение предшествующего вызова: значение, ранее использовавшееся в функциональном блоке: значение, полученное методом. Если допустимое значение не будет получено, возникает ошибка времени выполнения.

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

4)    Если экземпляр функционального блока вызывается с входным параметром £N=0. разработчик определяет установлены ли в экземпляре входные и входные-выходные переменные.

5)    Имя экземпляра функционального блока может использоваться в качестве входного параметра экземпляра функционального блока, если оно объявлено как входная переменная в секции VARJNPUT или как входная-выходная переменная экземпляра функционального блока в секции VAR_IN_OUT.

6)    Выходные значения экземпляра другого функционального блока, чье имя передается в функциональный блок через конструкцию VARJNPUT, VARJN_OUT или VAR_EXTERNAL могут использоваться для доступа, но не могут изменяться из функционального блока.

7)    Функциональный блок, имя экземпляра которого передается в функциональный блок через конструкцию VARJNJDUT или VAR_EXTERNAL. может вызываться из функционального блока.

8)    Через конструкцию VARJN.OUT в функциональный блок могут передаваться только переменные или имена экземпляров функциональных блоков.

Это делается для предотвращения непреднамеренных изменений таких выходных переменных. Тем не менее, «каскадное» использование конструкций VARJN_OUT разрешено.

Свойства вызова функционального блока приведены в следующей таблице 42.

Таблица 42 — Вызов функционального блока

Но-

пор

Описание

Пример

1

Полный формальный вызов (только тексте-

YourCTU( EN:= not В.

вый)

CU:= г.

Используется, если указание параметров EN и ENO в вызове является обязательным

PV:= d, ENO=> next. Q => out, CV=>c2);

2

Нвпотый формальный вызов (только тексте-

YourCTU (Q => out.

вый)

CV =>c2):

Переменные EN. CU. PV будут иметь значение последнего вызов или начальное значение, если FB не вызывался раньше

3

Графический вызов

YourCTU

+-------+

I CTU |

В —|EN ENO|-- next г — | СО Ql— out Cl — | PV CV|— c2 +-------+

4

Графический вызов с отрицаниями логичв-

YourCTU

ских входных и выходных переменных

+-------+

I CTU |

В -0|EN ENO|— next r —|CO Q|0- out Cl —|PV CV|— c2 +-------+

Использование этих конструкций запрещено для вход-ных-выходных переменных

Продолжение таблицы 42

Но-

пор

Описание

Пример

Графический вызов с использованием конструкции VAR_IN_OUT

Графический вызов с присваиванием переменной из конструкции VAR_IN_OUT

Текстовый вызов с отдельным присваиванием входной переменной FB.Inslance.Inpul:* х;

YourTon.lN* г YoorTon.PT:* U YourTon{not Q => out):

Графический вызов с отдельным присваиванием входной переметом

+------+

г—( MOVE |— YourCTU.CU +------+

С—1 MOVE | —-YourCTU.PV +------+

YourCTU

+-------+

| CTU |

1—| EH ENOI— next

—    ICO Q|0- out

—    |PV CV| —

7

Чтение выходной переменной после вызова FB (текстовая форма) х:= FBJnstance.Output:

Выходная переменная, присвоенная в вызове FB (текстовая форма)

Выходная переменная, присвоенная в вызове FB с отрицанием (текстовая форма)

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

VARJNPUT t_TMR: TON: ENO.VAR EXPIRED:* I.TMR.Q:

В данном и следующих примерах предполагается, что переменные EXPIRED и A_VAR были объявлены с типом BOOL

Графический вызов с именем экземпляра функционального блока как входной переменной

См. а)

10а

Текстовый вызов с именем экземпляра функционального блока как переменной из VAR IN.OUT

VARJN.OUT IO.TMR: TOF: END.VAR IO.TMR (IN:=A_VAR. РТ:= T#10S): EXPIRED:* IO.TMR.Q:

10Ь

Графический вызов с именем экземпляра функционального блока как переменной из VAR_IN_OUT

11а

Текстовый вызов с именем экземпляра функционального блока как внешней переменной

VAR.EXTERNAL EX_TMR: TOF; ENO.VAR EX_TMR(IN:= A.VAR. PT;= T#10S): EXPIRED:* EX.TMR.Q;

YourCTU

+-------+

I CTU |

--IEN ENOI —

-“|CU Q|0-out -- | PV CV| —

+-------+

b) Вызов FB с отдельным присваиванием входной переменной

YourCTO

a--| NE I---о I BN    ENOI —

Ь--|    I    e--ICO    QfO-Out


VAR a. b,r, out: BOOL:

YourCTU: CTU: END_VAR YourCTU <EN:- NOT (a <> b). CU :=r,

NOTQ->out);

с) Вызов FB с немедленным доступом к выходной переменной (типовое использование) В вызове также разрешено использование отрицания

TFT 5

Mnl---isi    Q1I-— bOut3


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

Но-

пор

Описание

Пример

11Ь

Графический вызов с именем экземпляра функционального блока как внешней переменной


Пример — Вызов функционального блока с

YourCTU

+---

-----+

YourCTU (EN:- noth.

| CTU |

CU:- r.

В -0 IEN

ENO| —

PV:- c.

г — |CU

Q| 0-out

not 0 => out)

с —|PV

CV| —

+—

-----+


а) Вызов FB с немедленным присваиванием входных переменных (типичное использование)


+------+


Г-


l MOVE |—YOUrCTU.CU +------+


YourCTU.CU:= r; YourCTU.PV:= V;


с-


| MOVE |—YourCTU.PV


+------+


YourCTU(not Q => out);


VAR FF75: SR; END_VAR f Объявление ') FF75{S1:= Ып1, (' вызов V R:= Ып2): bOut3:- FF75.Q1:

d) Вызов FB с текстовым отдельным присваиванием выходной переменной (после вызова)

TONS(12]

VAR

+-------+

TONs: array [0.. 100} OF TON:

| TON |

i: INT:

Ып1 — IN О —

TtlOms — | РТ ЕТ| —

END_VAR

TON(12](IN:= Ып1, PT:= TtlOms);

TONSli]

+-------+

TON[i](IN:- Ып1, PT:- T#20ms);

1 TON |

Ып1 — | IN Q| — T#20ms —|PT ET| — +-------+

e) Вызов FB. используя массив экземпляров

myCooler.Cooling

TYPE

Cooler: STRUCT Temp:Temp: INT;

♦-------+

Cooling: TOF;

| TOF |

END STRUCT:

blnl —|IN Q|—

END TYPE

T#30s —|PT ET|—

4-------4

VAR

myCooler: Cooler:

END_VAR

myCooler. Cooling(IN:= Ып1, PT:= Tt30s); f) Вызов FB с использованием экземпляра как элемента структуры

6.6.3.4.2 Использование входных и выходных параметров

На рисунках 13 и 14 приведена сводка правил использования входных и выходных параметров функционального блока в контексте вызова этого функционального блока. Присваивание входных и входных-выходных лараметров становится эффективным при следующем вызове F8.

FUNCTION.BLOCK FB.TYPE:

VARJNPUT In: REAL: ENDVAR VAR_OUTPUT Out: REAL. END.VAR VAR_lN_OUT ln_out: REAL: ENDVAR VAR M: REAL; ENO.VAR END_FUNCTION-BLOCK

VAR FBJNST: FB.TYPE; А. В. C: REAL: END.VAR

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

а) Внутри функционального блока

b) Outside function block

1 Чтение входной переменной

М:= In:

A;» In Не разрешено (см. примечания 1 и 2)

2 Присваивание входной переменной

___ев.

ТП^^ттГ

Не разрешено (см. примечание 1)

И Вызов с немедленным присваиванием параметра FB_INST(ln:= А);

// Отдельное присваивание (см. примечание 4) FBJNST.In:» А;

3 Чтение выходной переменной

М:= Out:

// Вызов с немедленным присваиванием параметра FB_INST(Out => В):

// Отдельное присваивание В:= FBJNST.Oul;

4 Присваивание выходной переменной

Out:» М;

FBJNST.Oul:~ В:Не разрешено (см. примечание 1)

5 Чтение входной-выходной переменной

М:= ln_out

FBJNST(ln_out~?,> С); Не разрешено

6 Присваивание в ходко й-выхадн ой переменной

ln_out:= М;

(см. примечание 3)

И Вызов с немедленным присваиванием параметра

СО IkKJTil- «,.(../4. СП IMOTI- - /-•

Не разрешено

Примечание 1 — Использования, перечисленные в данной таблице с пометкой «Не разрешено», могут приводить к непредсказуемым побочным эффектам, определяемым разработчиком.

Примечание 2 — Чтение и запись (присваивание) входных и выходных параметров и внутренних переменных функционального блока могут выполняться «функцией взаимодействия», «функцией интерфейса оператора» или «функциями программирования, тестирования и мониторинга», определенными в МЭК 61131-1.

Примечание 3 — Изменение в функциональном блоке переменной, объявленной в секции VAR_IN_ OUT. разрешено.

Рисунок 13 — Использование входных и выходных параметров функционального блока (правила)

Использование входных и выходных параметров, определенных правилами на рисунке 13, иллюстрируется на рисунке 14.

FB-INST

•    Разрешено!

♦    X ■ Не разрешено'

Метки 1а. соответствуют правилен иэ рисунка 13.

Рисунок 14 — Использование входных и выходных параметров функционального блока

(иллюстрация правил)

Следующие примеры демонстрируют графическое использование имен функциональных блоков в качестве параметров и внешних переменных.

Примеры — Графическое использование имен функциональных блоков в качестве параметров и внешних переменных.

FUNCTiON_BLOCK (‘ Внешний интерфейс *)

| INSIDE_A |

TON---| I_TMR EXPIRED |—BOOL

Тело функциональноао блока ")

| MOVE |

IJTMR.Q---|    | EXPIRED

END_FUNCTJON_BLOCK

FUNCTION_BLOCK С Внешний интерфейс *)

f* Тело функциональноао блока *)

E_TMR

+-----+

I TON |

GO---| IN Q |

t#100m$---|PT ET|

+-----+


I_BLK

+--------------+

| INSIDE_A |

E_TMR lI_TMR EXPIRED| DONE

+--------------+


END_FUNCTlON_BLOCK

а) Имя функционального блока как входная переменная (см. примечание) FUNCTION_BLOCK С Внешний интерфейс ф)


+—-----— ----+

| INSIDE_B |

TON---| I_TMR----IJTMRI TON

BOOL—|TMR_GO EXPIRED| BOOL


(‘ Тело функционального блока ’)


IJTMR

+-----+

I TON |

TMR_GO---| IN Q |

|PT ET| +-----+


EXPIRED


ENDJFUNCTtONJBLOCK FUNCTtONJBLOCK (* Внешний интерфейс *)



(* Тело функционального блока ')


E_TMR

+-----+

| TON | UN Q |

t#100ms---|PT ET|

+-----+


I_BLK

+---------------+

| INSIDE_B |

E_TMR---11_TMR-----I_TMR |

GO------|TMR_GO    EXPIRED | DONE

+---------------+


ENDJFUNCTtONJBLOCK

b) Имя функционального блока как входная-выходная переменная


FUNCnON_BLOCK (‘ Внешний интерфейс *)

| INSIDE_C |

BOOL--|TMR_GO EXPIRED|---

VAR_EXTERNAL X_TMR: TON; END_VAR С Тело функционального блока ')

X_TMR

I TON |

TMR GO---| IN Q |---EXPIRED

|PT ET|

END_FUNCTION_BLOCK

PROGRAM

{* Внешний интерфейс *)

VARjGLOBAL X_TMR:    TON; END_VAR

(* Тело программы *)

I_BLK

| INSIDE_C |

GO---|TMR_GO    EXPIRED|---DONE

ENDJPRObtGRAM

с) Имя функционального блока как внешняя переменная

Примечание — l_TMR здесь не представлена графически, так как это будет предполагать еьн зов l_TMR внутри INSIDE_A, что запрещено правилами 3) и 4) на рисунке 13.

6.6.3.5 Стандартные функциональные блоки

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

Определения стандартных функциональных блоков, общие для всех языков программирования PLC. приведены ниже. Пользователь может предоставлять дополнительные стандартные функциональные блоки.

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

Стандартные функциональные блоки могут быть перегружены и могут иметь расширяемые входные и выходные переменные. Определение таких типов функциональных блоков описывает все ограничения на число и типы данных таких входных и выходных переменных. Использование таких возможностей нестандартных функциональных блоков не входит в задачу данного стандарта

6.6.3.5.2    Бистабильные элементы

Графическая форма и тело функционального блока стандартных бистабильных элементов показаны в таблице 43.

Таблица 43 — Стандартные функциональные блоки с двумя устойчивыми состояниями3*

Но

мер

Описание/графическая форма

Тело функциональною блока

Бистабильный функциональный блок (доминанта включения): SR (S1.R.Q1)

4-----4

I SR |

BOOL---|S1 Q11---BOOL

BOOL---| R |

4-----+

SI -------------| >«! |__ Q1

+—+ I 1

R ----0| S |----1 |

Q1.....1 1 1 1

4---+ +-----4

Бистабильный функциональный блок (доминанта включения) с длинными именами входных параметров: SR (SET1. RESET. Q1)

+--------+

I SR |

BOOL---|SET1 Q11---BOOL

BOOL---| RESET |

+--------+

SET1 ------------1 >=1 |— Q1

+—-4 | |

RESET -01 6 |----1 |

Q1 ----1 1 1 1

♦ ---4 +-- — -4

Бистабильный функциональный блока (доминанта выключения): RS (S. R1. Q1)

4-----+

I RS I

BOOL---|S Q11---BOOL

BOOL---| R1 |

+-----+

4---4

R1 --------------0| & |— Ql

4.....4 | |

S -----1 >«1 |----1 |

Ql.....1 1 1 1

+-----+ 4---4

Бистабильный функционатъный блок (доминанта выключения) с длинными именами входных параметров:

RS (SET. RESET1.Q1)

4--------+

I RS |

BOOL---| SET Ql|---BOOL

BOOL---| R1 l

4--------+

4---4

RESET 1--------------0| & |— Ql

4-----4 | |

SET----1 >«1 |----1 |

Ql ----1 | 4—4

4-----4

*> Начальным состоянием выходной переменной Q1 является нормальное неявное значение 0 для логических переменных.

6.6.3.5.3 Определение фронта (R_TRIG и F_TRIG)

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

1 Выходная переменная О функционального блока R_TRIG остается в значении BOOL#1 от одного вычисления вычислениями функционального блока до другого, отслеживая переход 0 к 1 входной переменной CLK. и возвращается в 0 при следующем выполнении.

Выходная переменная Q функционального блока F_TRIG остается в значении BOOL#1 от одного вычисления вычислениями функционального блока до другого, отслеживая переход 1 к 0 входной переменной CLK. и возвращается в 0 при следующем выполнении.

Таблица 44 — Стандартный функциональный блок обнаружения фронта

Но

мер

Описамио/графнческая форма

Определение {на ямке ST)

1

Детектор переднего фронта: R_TR1G(CLK, 0}

+--------+

| R_TRIG |

BOOL —|CLK Q|— BOOL +--------+

FUNCTION.BLOCK R.TRIG VARJNPUT CLK: BOOL: END.VAR VAR_OUTPUTQ:BOOL; END.VAR VAR M: BOOL; END.VAR Q:= CLK AND NOT M;

M:= CLK;

END_FUNCTION_BLOCK

2

Детектор заднего фронта: F_TRIG(CLK, Q)

+--------+

I F TRIG |

BOOL —| CLK Q|— BOOL +--------+

FUNCTION.BLOCK F.TRIG VARJNPUT CLK: BOOL; END.VAR VAR.OUTPUTQ: BOOL: END.VAR VAR M: BOOL: END.VAR G:= NOT CLK AND NOT M:

M:= NOT CLK: END.FUNCTION.BLOCK

Примечание — Когда входная переменная CLK экземпляра типа R.TRIG соединяется со значением BOOLS1. его выходная переменная О сохраняет значение BOOL#1 после первого выполнения, следующего за «холодным рестартом». Выходная переменная Q сохраняет значение BOOL#0 после всех следующих выполнений. Это же применимо к экземпляру F_TRJG . входная переменная CLK которого отсоединяется или соединяется к значению FALSE.

6.6.3.5.4 Счетчики

Графическое представление стандартных функциональных блоков счетчика с типами связанных входных и выходных переменных представлено в таблице 45. Функционирование этих функциональных блоков определяется в телах соответствующих функциональных блоков.

Таблица 45 — Стандартные функциональные блоки счетчиков

Номер

Опнсамие/графичесхая форма

Тело функционального блока (ядох ST)

Возрастающий счетчик

1a

CTU_INT(CU. R. PV. Q. CV) or CTU(..>

+ -- — 4

I CTU |

BOOL--->CU Q|---BOOL

BOOL---|R |

INT---IPV CVJ---INT

+-----+

а также:

+------------+

I CTO INT 1

BOOL--->CU “ Q |---BOOL

BOOL---I R |

INT---|PV CV|---INT

4------------4

VARJNPUT CU: BOOL R.EDGE:...

Г Фронт вычисляется внутри, используя тип данных R.EDGE V

IF R

THEN CV:= 0:

ELSIF CU AND {CV < PVmax) THEN CV:= CV+1;

ENDJF;

Q:= (CV >= PV):

Продолжение таблицы 45

Номер

Описание Графическая ферма

Тело функциональною блока (*>ык ST)

CTU.DINT PV. CV: DINT

см. 1a

CTUJJNT PV. CV: LINT

см. 1a

1d

CTU.UD1NT PV. CV: UD1NT

cm. 1a

CTU_ULINT(CO, LD. PV. CV) PV. CV: ULINT

cm. 1a

Убывающие счетчики

CTD_INT(CD. LD. PV. Q. CV) or CTD

+-----+

VARJNPUT CU: BOOL R.EDGE;...

| CTD |

// Фронт вычисляется внутри типом данных R_EDGE

BOOL--->CD Q|---BOOL

BOOL---|LD \

I NT---|PV CV|---INT

+——+

а также:

IF LD

+-----------+

THEN CV:= PV;

| CTD INT |

ELSIF CD AND (CV > PVmin)

BOOL--->CD Q|---BOOL

THEN CV:* CV-1;

BOOL---1 LD |

END IF:

INT---|PV CV|---INT

+-----------+

Q:= (CV <= 0);

CTD.D1NT PV. CV: DINT

Cm. 2a

CTD.LINT PV. CV: LINT

2d

CTD.UDINT PV. CV: UDINT

Cm. 2a

CTD.ULINT PV.CV: UDINT

Cm. 2a

Реверсивные счетчики

За

CTUD_INT(CD, LD. PV. Q. CV) or CTUD(..)

+-----------+

VARJNPUT CU. CD: BOOL R.EDGE;...

| CTUD |

И Фронт вычисляется внутри типом данных R_EDGE

BOOL--->CU QU|---BOOL

IF R

BOOL--->CD QD|---BOOL

THEN CV:* 0;

BOOL---|R |

BOOL---1 LD |

INT---|PV CV|---INT

+-----------+

ELSIF LD THEN CV:* PV;

ELSE

IF NOT (CU AND CD) THEN

а также:

IFCUAND (CV < PVmax)

+------------+■

THEN CV:* CV+1;

| CTDD INT |

ELSIF CD AND (CV > PVmin)

BOOL--->CU QO|---BOOL

THEN CV:* CV-1:

BOOL—>CD QD |---BOOL

END IF;

BOOL— |R |

BOOL—*|LD |

INT---|PV CV|---INT

+-----------+

ENDJF;

ENDJF;

QU:= (CV >= PV): QD:* (CV <* 0);

Номер

Описание Графическая форма

Тело функциональною блока (язык ST)

ЗЬ

CTUD.DINT

PV. CV: DINT

См. За

Зс

CTUDJ.INT

PV. CV: LINT

См. За

3d

CTUD.UDINT

PV. CV: UDINT

См. За

Зв

CTUD.ULINT

PV. CV: ULINT

См. За

Примечание

—Числовые значения переменных предела PVminnPVmax определяются разработчиком.


6.6.3.5.5 Таймеры

Графическая форма стандартных функциональных блоков таймера показана в таблице 46. Функционирование этих функциональных блоков определено на временной диаграмме, приведенной на рисунке 15.

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

Таблица 46 — Стандартные функциональные блоки таймера

Но*

ыер

Описание

Символ

Графическая форма

Импульсный таймер, перегруженный

ТР

эквивалентно: ТР

+-------+

I *** I

BOOL---1 IN Q |---BOOL

TIME—|PT ET|—TIME +-------+

Импульсный таймер с типом данных TIME

ТР_Т1МЕ

Импульсный таймер с типом данных LTIME

TP.LTIME

Таймер с задержкой включения. перегруженный

TON

TON

РТ см. примечание

Таймер с задержкой включения с типом данных TIME

TON.T1ME

Таймер с задержкой включения с типом данных LTIME

TON.LTIME

IN: Input (Start)

2d*'

Таймер с задержкой включения. перегруженный

(графическая форма)

Т—0

РТ: Установленное время

За

Таймер с задержкой отключения. перегруженный

ТОР

TOF

Q: Выходная переменная

ЗЬ

Таймер с задержкой отключения с типом данных TIME

TOF.TIME

ET: Истекшее время

Зс

Таймер с задержкой отключения с типом данных LTIME

TOFJ.TIME

3d"’

Таймер с задержкой отключения. перегруженный

(графическая форма)

0—Т

Примечание — Воздействие изменения значения входной переменной РТео время работы таймера, например, установка РТ в t#0s при возобновлении функционирования экземпляра ТР определяется параметром. задаваемым разработчиком.


а> В текстовых языках свойстве 2Ь и 30 не используются.


На рисунке 15 показана временная диаграмм стандартных функциональных блоков таймера.

+ +---+

+--------+ ++ ++ +--------+

IN

I

I I I I I

I

|

—+

+-----++-++—

—i-

+---------

to

+----+

tl t2 t3 +----+

t4

+----+

t5

Q

I I —+ +-•

I I

--------+ +_

I I -+ +—

to tO+PT t2 t2+PT t4 t4+PT

PT    +---+•

:    / I

БТ :    /    |

:    / I

J    /    I

0-+ ♦


/I    / I

/I / I / I / I / I /    I

+ +—+ +

to    tl t2    t4


t5

ET


/

/

0-+

to


-+

I

I

I


+-•

tl


+

/I / I / I /

• + +---+

t2 t3 t4


/


-+

I

I

I

I

+-■

t5


b) Времени с задержкой включения (TON)

IN

— •

+—

«♦

1

1

1

1

1

1

--- +

♦—

- +

+ -

to

l

tl

t2

t3

t4

ts

1

I I

1

1 1 +---+

to

tl+PT t2


---+

I

+ --■

t5 + PT


PT


ET


+---+

/ 1

+

/ 1

/1

/ 1

/ 1

/

/ 1

/ 1

/

+ +-

--+ +- — -

tl

t3

ts

с) Расчет времени с задержкой отключения (TOF)


Рисунок 15 — Стандартные функциональные блока таймера — временные диаграммы (правила)


а) Импульсный отсчет времени (PT)

IN

+-

I

-------+

I

1

1

-+ +---

1 1 i a

1

Д

to

T

tl

t2

t3 t4

t5

Q

+---+

1 1

+-

1

—+

1

t

tO+PT tl

t4 + PT

t5

PT

+—

6.6.3.5.6 Функциональные блоки взаимодействия

Стандартные функциональные блоки взаимодействия для программируемых контроллеров определены в МЭК 61131*5. Данные функциональные блоки предоставляют функциональность взаимодействия. такую как средства проверки устройств, сбор данных опроса, запрограммированный сбор данных. управление параметрами, управление с взаимоблокировкой, запрограммированное аварийное оповещение, управление и защита соединений.

6.6.4 Программы

В МЭК 61131-1 программа определяется как «логический набор всех элементов и конструкций языка программирования, необходимый для запланированной обработки сигналов, требуемой для управления оборудованием или процессом системой PLC».

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

^ограничивающими ключевыми словами для программы являются PROGRAM. ..END_PROGRAM;

2)    программа содержит конструкцию VAR.ACCESS...END.VAR. которые предоставляют средства определения именованных переменных, к которым может осуществляться доступ некоторыми службами связи, указанными в МЭК 61131-5. Путь доступа связывает каждую такую переменную с входными, выходными или внутренними переменными программы;

3)    программы могут устанавливаться только в ресурсах, в то время как функциональные блоки могут устанавливаться в программах или других функциональных блоках:

4)    программа может содержать назначение своего расположения в объявлениях своих глобальных и внутренних переменных. Назначение расположения с частично определенным прямым представлением может использоваться только е объявлениях внутренних переменных программы;

5)    объектно-ориентированные свойства программ не входят в задачу настоящего стандарта.

Таблица 47 — Объявление программы

Номер

Описание

Пример

1

Объявление программы PROGRAM... END.PROGRAM

PROGRAM myPrg... END.PROGRAM

Объявление входных переменных VARJNPUT... END.VAR

VARJNPUT IN: BOOL: T1: TIME: END.VAR

Объявление выходных переменных VAR.OUTPUT... END.VAR

VAR.OUTPUT OUT: BOOL: ET.OFF: TIME; END.VAR

Объявление еходных-выходных переменных VAR.IN.OUT... END.VAR

VAR.IN.OUT A: INT; END.VAR

2d

Объявление временных переменных VAR.TEMP ... END.VAR

VAR.TEMP 1: JNT; END.VAR

Определение статических переменных VAR... END.VAR

VAR B: REAL. END.VAR

21

Объявление внешних переменных END.VAR

VAR.EXTERNAL B: REAL; END.VAR Соответствует следующему. VAR.GLOBAL В: REAL

29

Объявление внешних переменных VAR.EXTERNAL CONSTANT... END.VAR

VAR.EXTERNAL CONSTANT B: REAL: END.VAR Соответствует следующему:

VAR.GLOBAL В: REAL

За

Инициализация входных параметров

VARJNPUT MN: tNT;= 0;

ЗЬ

Инициализация выходных параметров

VAR.OUTPUT RES: INT:= 1;

Зс

Инициализация статических переменных

VAR B: REAL:* 12.1;

3d

Инициализация временных переменных

VAR.TEMP 1: INT;* 1;

Продолжение таблицы 47

Номер

Описание

Пример

Объявление квалификатора RETAIN для входных переменных

VARJNRJT RETAIN X: REAL; END.VAR

Объявление квалификатора RETAIN для выходных переменных

VAR.OUTPUT RETAIN X; REAL: END.VAR

Объявление квалификатора NON.RETAIN для входных переменных

VARJNRJT NON.RETAIN X: REAL; END.VAR

4d

Объявление квалификатора NON_RETA!N для выходных переменных

VAR.OUTPUT NON.RETAIN X; REAL; END.VAR

Объявление квалификатора NON.RETAIN для статических переменных

REAL; END.VAR

4f

Объявление квалификатора NON.RETAIN для статических переменных

VAR NON.RETAIN X: REAL; END.VAR

Объявление квалификатора RETAIN для локальных экземпляров функционального блока

VAR RETAIN TMR1: TON: END.VAR

Объявление квалификатора NON_RETAlN для локальных экземпляров FB

VAR NON.RETAIN TMR1; TON; END.VAR

Текстовое объявление - входных переменных переднего фронта

PROGRAM AND.EDGE VARJNRJT X: BOOL R.EDGE;

Y: BOOL F.EDGE.

END.VAR

VAR.OUTPUT Z: BOOL; END.VAR Z:= X AND Y; Пример на языке ST *) END.PROGRAM

6b

Текстовое объявление

- входных переменных заднего фронта (текстовое)

См. выше

Графическое объявление - входных переменных переднего фронта (>)

ПРОГРАММА С Внешний интерфейс *)

+----------+

| AND EDGE |

BOOL—>X Z|—BOOL l I BOOL—<Y |

I I +----------+

(* тело функционального блока *)

+-----+

I & I

X— | I—Z Y—| |

+-----+

END.PROGRAM

Номер

Описание

Пример

Графическое объявление - входных переменных заднего фронта (<)

См. выше

ва

Объявление VAR.GLOBAL...END.VAR в программе PROGRAM

VAR.GLOBAL z1: BYTE: END.VAR

VAR.GLOBAL CONSTANT объявления в объявлениях типов программы ПРОГРАМ-МЫ

VAR.GLOBAL CONSTANT z2: BYTE: END.VAR

9

Объявление VAR.ACCESS...END.VAR в программе PROGRAM

VAR.ACCESS

ABLE: STATION.1 ,%IX1.1: BOOL READ.ONLY: BAKER: STATION.1.P1.x2: UINT READ.WRITE; END.VAR

Примечание — Свойства от 2а до 70 эквивалентны соответствующим свойствам таблицы 40 для функциональных блоков.

6.6.5 Классы

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

Элемент языка класс поддерживает объектно-ориентированную парадигму и характеризуется следующими принципами:

•    определение структуры данных, разделенной на общие и внутренние переменные:

•    выполняемые над элементами структуры данных;

•    классы, состоящие из методов (алгоритмов) и структур данных:

•    интерфейс с прототипами метода и реализация интерфейсов:

- наследование интерфейсов и классов.

Инстанцирование классов.

Примечание термины «класс» и «объект», используемые в языках С#. C++. Java. UML и т.д., соответствуют терминам «тип» и «экземпляр» языков программирования PLC из данного стандарта. Это показано ниже.

Языки программирования ИТ: С#. C++. Java, UML Языки PLC из стандарта

Claes (= тип класса)    Тур (тип функционального блока или класса)

Object (= экземпляр класса)    Instance (экземпляр функционального блока

или класса)

Наследование интерфейса и классов с использованием механизмов реализации и расширения показано на рисунке 16. Это определено в 6.6.5.

Рисунок 16 — Обзор наследования и реализации интерфейса

Класс — это программный компонент, разработанный для объектно-ориентированного программирования. По существу, класс содержит переменные и методы. Класс должен инстанцироваться до того, как его методы смогут вызываться и как можно осуществлять доступ к его переменным.

6.6.5.2 Объявление класса

Свойства объявления класса определены в таблице 48:

1)    ключевое слово CLASS с последующим идентификатором, указывающим имя определяемого класса:

2)    завершающее ключевое слово END.CLASS;

3)    значения переменных, которые объявлены через конструкцию VAR_EXTERNAL. могут изменяться из класса;

4)    Значения констант, которые объявлены через конструкцию VAR.EXTERNAL CONSTANT, не могут изменяться из класса:

5)    конструкция VAR...END.VAR. при необходимости, указывающая имена и типы переменных класса;

6)    переменные могут быть инициализированы;

7)    переменные секции VAR (статические) могут быть объявлены как PUBLIC (общие). К общим переменным можно получать доступ извне класса, используя такой же синтаксис, как для доступа к выходным переменным функционального блока;

8)    для внутренних переменных класса могут использоваться квалификаторы RETAIN и NON. RETAIN;

9)    для объявления внутренних переменных класса может использоваться символ «*», как определено в таблице 16;

10)    переменные могут быть общими PUBLIC, индивидуальными PRIVATE, внутренними INTERNAL или защищенными PROTECTED. По умолчанию используется спецификатор доступа PROTECTED:

11)    класс может поддерживать наследование других классов для расширения базового класса;

12)    класс может реализовывать один или более интерфейсов;

13)    экземпляры других функциональных блоков, классы и блоки объектно-ориентированных функций могут быть объявлены в секциях переменных VAR и VAR.EXTERNAL;

14)    экземпляр класса, объявленный внутри класса, не обязан использовать то же имя. как функция (той же области видимости) для предотвращения неопределенностей.

Класс имеет следующие различия от функционального блока:

•    ключевые слова FUNCTION.BLOCK и END_FUNCTION_BLOCK заменены ключевыми словами CLASS и END.CLASS. соответственно.

•    переменные объявляются только в секции VAR. Не разрешены секции VARJNPUT. VAR. OUTPUT. VARJN.OUT и VAR.TEMP. У класса нет тела:

•    класс может определять только методы;

- вызов экземпляра класса невозможен. Могут вызываться только методы класса.

Реализация классов предоставляет по существу согласующееся подмножество свойств, определенных в таблице 48.

Таблице 48 — Класс

Номер

Описание Ключевое слово

Объяснение

1

CLASS... END.CLASS

Определение класса

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

Класс не может использоваться 8 базовом классе

Основанные на функциональном блоке

Определение переменных VAR ... ENO.VAR

VAR В: REAL; END.VAR

Инициализация переменных

VAR В: REAL:* 12.1; END.VAR

За

Квалификатор RETAIN для внутренних переменных

VAR RETAIN X: REAL: END.VAR

Номер

Описание Ключевое слоев

Объяснение

ЗЪ

Квалификатор RETAIN для внутренних переменных

VAR NON.RETAIN X: REAL; END.VAR

Объявления VAR_EXTERNAL внутри объявлений типа класса

См. эквивалентный пример в таблице 40

Объявления VAR.EXTERNAL CONSTANT в объявлениях типа класса

См. эквивалентный пример в таблице 40

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

5

METHOD...ENO.METHOD

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

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

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

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

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

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

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

5d

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

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

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

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

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

• данные свойства — такие же как в таблице 53 свойств наследования

6

EXTENDS

Класс является наследником класса Примечание — Наследование функциональных блоков отсутствует

7

OVERRIDE

Метод переопределяет базовый метод — см. динамическое связывание имен

в

ABSTRACT

Абстрактный класс — по меньшей мере, один метод

является абстрактным

Абстрактный метод — шаблон метода

Ссылка на доступ

THIS

Ссылка на собственные методы

SUPER

Ссылка на метод базового класса

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

10а

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

Доступ к переменной возможен из любого места

10Ь

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

Доступ к переменной осуществляется только внутри определяющего программного компонента

10с

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

Доступ к переменной осуществляется только внутри одного пространства имен

10d

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

Доступ к переменной осуществляется только из определяющего программного компонента и его наследников (неявно)

Полиморфизм

11а

с секцией переменных VAR_lN_OUT

Переменным из секции VAR_IN_OUT может быть присвоен экземпляр производного класса

11Ь

со ссылкой

Ссылке на (базовый) класс может быть присвоен адрес экземпляра производного класса

Пример ниже иллюстрирует свойства объявления класса и его использование.

Пример — Определение классе Class CCounter VAR

m_iCurrentValue: INT; (' Default = 0 ‘) m_bCountUp: BOOL:-TRUE;

END_VAR VAR PUBLIC

mJUpperLimit: INT:=+10000; mJLowerLimit INT:=-10000;

ENDJVAR

METHOD Count (‘ Только тело

IF (m_bCountUp AND m_iCurrentValue<m_iUpperUmit) THEN mJCurrentValue™ m_iCurrentValue+1:

ENDJF:

IF (NOTm_bCountUp AND m_iCurrentValue>m_iLowerUmit) THEN mJCurrentValue:* m_iCurrentValue-1;

ENDJFг END_METHOD

METHOD SetDirection VARJNPUT

bCountUp: BOOL;

ENDJVAR

m_bCountUp:=bCountUp;

END_METHOD

END_CLASS

6.6.5.3 Декларация экземпляра класса

Экземпляр класса объявляется подобно определению структурной переменной.

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

Элементы, которым не присвоено значение в перечне инициализации, получают начальные зна* чения из объявления класса.

Таблица 49 — Декларация экземпляра класса

Но

мер

Описание

Пример

1

Объявление экземпляра класса с неявной ини-циатзацией

VAR

MyCounlerl: CCounter: END. VAR

2

Декларация экземпляра класса с инициализацией его общих переменных

VAR

MyCounter2: CCounter:8 (m_iUpped.imit:=20000: m_iLowert.imrt;=-20000); END.VAR

6.6.S.4 Методы класса

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

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

Методы могут применяться для определения операций с данными экземпляров класса.

6.6.5.4.2    Сигнатура

В целях данного стандарта, термин сигнатура определен в разделе 3 как набор информации, однозначно определяющий идентичность параметров МЕТОДА.

Сигнатура включает:

- имя метода;

•    тип результата:

•    имена переменных, типы данных и порядок всех параметрое.то есть входных, выходных и вход-ных-выходных переменных.

Локальные переменные не являются частью сигнатуры. Переменные, объявленные в секции VAR_EXTERNAL и постоянные переменные не существенны для сигнатуры.

Спецификаторы доступа, такие как PUBLIC или PRIVATE не существенны для сигнатуры.

6.6.5.4.3    Объявление и выполнение метода

Класс может иметь набор методов.

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

1    Методы объявляются в области действия класса.

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

3    8 текстовом объявлении методы перечисляются после объявления переменных класса.

4    Метод может объявлять свои собственные VARJNPUT. внутренние временные переменные VAR и VAR_TEMP. VAR_OUTPUT. VARJNJDUT и результат метода.

Ключевые слова VAR_TEMP и VAR имеют то же самое значение и оба являются разрешенными для внутренних переменных.

(Ключевое слово VAR используется в функциях).

5    Объявление метода содержит один из следующих спецификаторов доступа: PUBLIC, PRIVATE. INTERNAL или PROTECTED. Если спецификатор доступа на задан, метод будет PROTECTED по умолчанию.

6    Объявление метода может содержать дополнительные ключевые слова OVERRIDE или ABSTRACT.

Примечание 1 — Перегрузка методов не входит в задачу настоящего стандарта.

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

7    Во время выполнения метод может читать свои входные переменные и вычисляет выходные переменные и результат, используя временные переменные.

8    Результат метода присваивается его имени.

9    Все переменные метода и его результат являются временными (как переменные функции), то есть переменные не сохраняются от одного вычисления метода до другого.

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

10    Имена переменных каждого метода класса должны быть различными (уникальными). Имена локальных переменных различных методов могут быть одинаковыми.

11    Все методы класса имеют доступ для чтения/эаписи к статическим и внешним переменным, объявленным в классе.

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

13    Во время выполнения метод может использовать другие методы, определенные в этом классе. Методы экземпляра данного класса вызываются, используя ключевое слово THIS.

Следующий пример иллюстрирует упрощенное объявление класса с двумя методами и вызов метода.

Определение класса (типа) с методами: CLASS пате VAR vars: END_VAR VAR_EXTERNAL externals:

Примечание 2 — Алгоритм методов имеет доступ к их собственным данным и к данным класса.

(Временные параметры заключены в скобки)


Объект (экземпляр)

Г—ЯКЦИ'кЦЯЛЛиДТ

Класс (Тип) (терем);



Пример 1


ENO_VAR

METHOD name 1

(перем ) <*И»Г1Т


- (вход:*


(выводы) -


\ /

—К/    -i I—

Алгоритм М_1 Имя метода 2


пес»?ч i :р*езугь-зт.


Алгоритм м_2


VARJNPUT inputs: END_VAR

VAR_OUTPUT outputs: END_VAR END METHOD


METHOD namej VARJNPUT inputs: ENDJ/AR

VAR_OUTPUT outputs: END_VAR

END_METHOD END_CLASS


A —


ClaesX.name 1


inml


outml


R1


-Y


Примечание 3 — Данное графическое представление метода служит только для иллюстрации


Вызов метода:

a)    Использование результата (результат является необязательным)

R1:- Lmethod1(inm1:- A. outml => Y);

b)    Использование вызова (результат не объявлен)

l.method1(inm1:= A, outml => Y); Присваивание переменным метода за пределами метода l.inml А>//Не разрешено;

Чтение выходных переменных метода за пределами метода ■У..г..Ао4<«я»*> // Не разрешено


Пример 2

Класс COUNTER с двумя методами для прямого счета метод UPS показывает, как вызвать метод из собственного класса.

CLASS COUNTER VAR

CV: UINT;    // Текущее значение счетчика

Max: UINT:- 1000:

END VAR

METHOD PUBLIC UP: UINT VARJNPUT INC: UINT: ENDJ/AR VARJOUTPUTQU: BOOL: ENDJ/AR IF CV <- Max - INC


/ Метод прямого счета, используя Inc // Приращение

// Обнаружение верхнего предела


THEN CV:= CV + INC;    /// Увеличение текущего значения

QU:- FALSE;

ELSE OU:= TRUE;    //Достигнут верхний предел

ENDJF UP:- CV;

END_METHOD    I/ Результат метода

И Count up by 5 //Достигнут верхний предел //вызов внутреннего метода


METHOD PUBLIC UP5: UINT VAR_OUTPUT QU: BOOL; END_VAR UPS:- THIS.UP(INC:- 5, QU => QU):

ENDJMETHOD

endjclass

6.6.5.4.4    Представление вызова метода Методы могут вызываться в текстовых языках (таблица 50) и в графических языках.

В представлениях всех языков имеется два разных случая вызова метода:

a)    внутренний вызов метода из экземпляра собственного класса Имя метода предваряется ключевым словом «THIS». Данный вызов может выдаваться другим методом:

b)    внешний вызов метода экземпляра другого класса. Имени метода предшествует имя экземпляра и «.».

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

Примечание —Используются следующие синтаксисы:

-    синтаксис А{) используется для вызова глобальной функции А:

-    синтаксис THIS.A0 используется для вызова метода из собственного экземпляра класса:

-    синтаксис THIS.A0 используется для вызова метода А из другого экземпляра класса.

6.6.5.4.5    Текстовое представление вызова

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

Метод может вызываться формально или неформально.

Внешний вызов метода дополнительно требует имени экземпляра внешнего класса.

Пример 1 —... class_instance_name.method_name(parameters).

Внутренний вызов метода требует использования THIS вместо имени экземпляра.

Пример 2 —... THIS.method_name (parameters).

Таблица 50— Текстовый вызов методов — Формальный и неформальный перечень параметров

Но

мер

Описание

Пример

Полиьы формальный вызов (только тексговьы)

A:* COUNTER.UP(EN:= TRUE. INC:» В.

Используется, если указание параметров EN и ENO в вызове является обязательным

START:» 1. ENO=> %MX1, QU => С):

Неполный формальный вызов (только текстовый)

A;- COUNTER.UP{INC:= B. QU => C>;

Используется, если указание параметров EN и ENO в вызове не является обязательным

Переменная START будет иметь неявное значение 0 (ноль)

2

Неформальный вызов (только текстовый) (с фиксированным порядком параметров и полный)

Ac- COUNTER.UP(B. 1. С):

Данный т вызов эквивалентен вызову в примере 1а. но без параметров EN и ENO

6.6.5.4.6    Графическое представление

Графическое представление вызова метода подобно представлению функции или функциональ* ного блока. Это — прямоугольный блок с входами слева и выходами справа от блока.

Вызовы метода могут поддерживать параметры EN и ENO. как определено в таблице 18.

- внутренний вызов показывает имя класса и имя метода, разделенные точками внутри блока. Ключевое слово THIS размещают над блоком;

• внешний вызов показывает имя класса и имя метода, разделенные точкой внутри блока Над блоком размещают имя экземпляра класса.

6.6.5.4.7    Ошибка

Использование выхода метода независимо от вызова метода рассматривается как ошибка. См. пример ниже.

Пример — Внутренний и внешний вызов метода

VAR

СТ:    COUNTER;

LIMIT: BOOL;

VALUE: UINT;

END VAR

1) В структурированном тексте (язык ST).

a)    Внутренний вызов метода: VALUE:- THIS.UP(INC:= 5, QU => LIMIT);

b)    Внешний вызов модуля:

VALUE:- CT.UP (INC:- 5. QU -> LIMIT);

2) На функциональных блоковых диаграммах (язык FBD)

а) Внутренний вызов метода;


Оп

5


THIS

+------------+

COUNTER.UP


INC

QU

+------------+


—VALUE —LIMIT


Вызван в классе другого метода

Ключевое слово THIS обязательно Метод UP возвращает результат

Графическое представление служит только для иллюстрации

Переменая On разрешает вызов метода

СТ — экземпляр класса, объявленный в другом классе или функциональном блоке

Вызывается методом или в теле функционального блока


Ь) Внешний вызов модуля:    Штод UP вращает результат

1

Оп---

COUNTER.UP

5---

INC

J

QU


Графическое представление служит только для иллюстрации

---VALUE

Переменная On разрешает вызов метода.

---LIMIT

3) Ошибка Использование выхода метода без графического или текстового вызова

|    GT-tUP

I-------1    |_

I

VALUE:** GT-rUP;


VALUE — ( ) —


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

6.6.5.S Наследование класса (EXTENDS. SUPER. OVERRIDE. FINAL)

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

Применительно к языкам программирования PLC. концепция наследования, определенная в объектно-ориентированном программировании применяется как способ создания новых элементов.

Наследование классов показано на рисунке 17. На базе существующего класса может быть порожден один или более классов. Данный процесс может повторяться многократно.

Примечание — «Множественное наследование» не поддерживается.

Порожденный (дочерний) класс обычно расширяет базовый (родительский) класс дополнительными методами.

Термин «базовый» класс означает всех «предков», то есть родительский класс и его родительские классы и т. д.

Наследование классов с использованием EXTENDS

Рисунок 17 — Наследование классов (иллюстрация)

6.6.5.S.2 Ключевое слово EXTENDS для классов

Класс может порождаться из уже существующего класса (базового класса), используя ключевое слово EXTENDS.

Пример — CLASS X1 EXTENDS X;

Применяются следующие правила:

1    Порожденный класс без всяких объявлений наследует все классы (если таковые имеются) из базового класса со следующими исключениями:

- не наследуются методы PRIVATE;

• за пределами пространства имен не наследуются методы INTERNAL.

2    Порожденный класс наследует все переменные (если таковые имеются) из базового класса.

3    Порожденный класс наследует только из базового класса. Множественное наследование в данном стандарте не поддерживается.

Примечание — Класс может реализовывать (используя ключевое слово IMPLEMENTS) один или более интерфейсов.

4    Порожденный класс может расширять базовый класс, то есть может иметь собственные методы и переменные в дополнение к унаследованным методам и переменным базового класса, и таким образом создавать новую функциональность.

5    Класс, используемый в качестве базового класса, сам может быть порожденным классом. Тогда он переносит в порожденный класс также методы и переменные, которые он унаследовал.

Это может повторяться несколько раз.

6    Если определение базового класса изменяется, все порожденные классы (и их потомки) также соответственно изменяют свою функциональность.

б. 6.5.5.3 OVERRIDE метод

Порожденный класс может переопределять (заменять) один или более унаследованных методов своими собственными реализациями метода (методов). При переопределении базовых методов при* меняются следующие правила:

1    Метод, переопределяющий унаследованный метод, имеет такую же сигнатуру (имя метода и переменные) в пределах области действия класса.

2    Метод, переопределяющий унаследованный класс, должен иметь следующие свойства:

•    ключевое слово OVERRIDE следует за ключевым словом METHOD:

•    порожденный класс имеет доступ к базовым методам, которые определены как PUBLIC or PROTECTED или NTERNAL в том же пространстве имен;

•    новый метод будет иметь те же спецификаторы доступа. Но спецификатор FINAL может быть использован для переопределенного метода.

Пример — METHOD OVERRIDE mb:

в. 6.5.5.4 FINAL для классов и методов

Метод со спецификатором FINAL не будет переопределяться. Класс со спецификатором FINAL не может быть базовым классом.

Пример 1 — METHOD FINAL mb:

Пример 2 — CLASS FINAL cl.

6.6.5.S.5 Ошибки при использовании ключевых слов (EXTENDS. SUPER. OVERRIDE. FINAL) Следующие ситуации рассматриваются как ошибка:

1    Порожденный класс определяет переменную с именем переменной (определенной или унас* ледованной), уже содержащейся в базовом классе. Данное правило не применяется к переменным, объявленным как PRIVATE.

2    Порожденный класс определяет метод с именем, уже содержащемся в базовом классе.

3    Порожденный класс порождается из его собственного базового класса (прямо или косвенно), то есть рекурсия не разрешена.

Класс определяет метод с ключевым словом OVERRIDE, который не переопределяет метод ба* эового класса.

Пример — Наследование и переопределение Класс, расширяющий класс LIGHTROOM.

CLASS LIGHTROOM

VAR LIGHT: BOOL. END_VAR

METHOD PUBLIC DAYTIME LIGHT:- FALSE;

ENDJMETHOD

METHOD PUBLIC NIGHTTIME LIGHT:= TRUE;

END_METHOD

END_CLASS

CLASS UGHT2ROOM EXTENDS LIGHTROOM VAR LIGHT2: BOOL: END_VAR // Second light

METHOD PUBLIC OVERRIDE DAYTIME

LIGHT.- FALSE; //Доступ к переменным родительского класса LIGHT:- FALSE; I/ конкретная реализация ENDJMETHOD

METHOD PUBLIC OVERRIDE NIGHTTIME

LIGHT.- TRUE; //Доступ к переменным родительского класса

LIGHT := TRUE: // конкретная реализация END_METHOD

END_CLASS

6.6.5.6 Динамическое связывание имен (OVERRIDE)

Связывание имен — это ассоциация имени метода с именем реализации. Привязка имени (на* пример, компилятором) до выполнения программы называется статической или «ранней» привязкой. Привязка, выполняемая во время выполнения программы, называется динамической или «поздней» привязкой.

В случае вызова внутреннего метода, свойство переопределения с ключевым словом OVERRIDE приводит к различию между статической и динамической формой связывания имен:

•    статическое связывание: ассоциирует имя метода с реализацией метода класса с вызовом внутреннего метода, или содержит метод, выполняющий вызов внутреннего метода:

•    динамическое связывание: ассоциирует имя метода с реализацией метода фактического типа экземпляра класса.

Пример 1 —Динамическое связывание имен Переопределение с воздействием на связывание ИОбъявление CLASS CIRCLE

METHOD PUBLIC PI: LREAL    I/ Метод дает менее точное определение

PI PI:- 3.1415;

END_METHOD

METHOD PUBLIC CP: LREAL    // Метод вычисляет длину окружности

VARJNPUT DIAMETER: LREAL; END_VAR

CF~ THIS.PIO * DIAMETER:    // Внутренний вызов метода;

END_METHOD И используя динамические связывания PI END_CLASS

CLASS CIRCLE 2 EXTENDS CIRCLE    //Класс с методом, переопределяющим PI

METHOD PUBLIC OVERRIDE PI: LREAL И Метод выдает более точное значение PI PI:-3.1415926535897;

ENDJAETHOD

ENDJCLASS

PROGRAM TEST VAR

CIR1:    CIRCLE;    //Экземпляр CIRCLE

CIR2:    CIRCLE2;    И Экземпляр CIRCLE!

CUMF1:    LREAL:

CUMF2:    LREAL;

DYNAMIC: BOOL:

END VAR

CUMF1:- CIR1.CF(1.0); CUMF2:- CIR2.CF/1.0}; DYNAMIC:- CUMF1 <> CUMF2; END_PROGRAM


И Вызов метода CIR1 H Вызов метода CIR2

//Динамическое связывание приводит к значению True

В данном примере класс CIRCLE содержит внутренний вызов своего метода PI с низкой точно* стью для вычисления длины окружности (CF).

Порожденный класс CIRCLE2 переопределяет этот метод более точным определением PI.

Вызов метода Pl() ссылается либо на CIRCLE.PI. либо на CIRCLE2.PI. в соответствии с типом экземпляра, в котором выполнялся вызов метода CF. Здесь значение CUMF2 точнее значения CUMF1.

Пример 2 — Графическая иллюстрация приведенного выше текстового примера (упрощенная)

Объявление

(CIR1J

CLASS CIRCLE

METROO PUBLIC PI PI 3.4415;

METHOD PUBLIC СГ VAR INPUT Diameter CF-:- THIS.PI 0“Dianeter:

1 Г РАСШИРЯЕТ (CIR2( У

CLASS CIRCLE2 EXTENDS CIRCLE

METHOD РфЪХС OVERRIDE PI V

pi з.т$92«&з$897; ,.*'''

METHOD PUBLIC 4F // inherited VAR INPUT Diameter CF :■ THIS.PI(1 * Dianeter;

CUHF1 :« CIRl.Cr(l.O); // COMF1 - 3.141$

C0MF2 :• CIR2.CFU.0);

// C0KP2 - 3.141592€535897


PROGRAM TEST VAR

CIR1:CIRCLE; CIR2:CIRCLE2;

6.6.S.7 Вызов метода собственного или базового класса (THIS. SUPER)

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

Для доступа к методу, определенному внутри или вне собственного класса, используются ключевые слова THIS и SUPER.

6.6.5J.2 THIS

THIS обеспечивает ссылку на экземпляр собственного класса.

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

THIS может быть передан переменной типа INTERFACE.

Ключевое слово THIS не может использоваться с другим экземпляром, например, выражение mylnstance. THIS не разрешено.

Пример — Использование ключевого слова THIS

Для удобства данные примеры копируются из приведенных выше примеров.

INTERFACE ROOM

METHOD DAYTIME END_METHOD//вызывается в дневное время METHOD NIGHTTIME END_METHOD

//Вызывается в ночное время

ENDJNTERFACE

FUNCTIONJBLOCKROOMJCTRL    И

VARJNPUT

RM: ROOM;    И Интерфейс ROOM как типа входной переменной

END_VAR

VAR_EXTERNAL

Actual_TOD: TOD: //Глобальное определение времени £ND_VAR

IF (RM = NULL)    // ВАЖНО: проверить законность ссылки!

THEN RETURN;

ENDJF:

IF Actual_TOD >= TODK20:15 OR Actual_TOD <= TODHG.OO THEN RM.NIGHTTIMEQ:    //вызов метода из RM

ELSE RM.DAYTIMEO:

ENDJF:

END FUNCTION BLOCK //Применяет ключевое слово THIS для назначения собственного экземпляре

CLASS DARKROOM IMPLEMENTS ROOM// См. объявление ROOM euiueVAR_EXTERNAL Ext_Room_Ctrl: ROOMjCTRL; //См. объявление ROOM_CTRL выше END_VAR METHOD PUBLIC DAYTIME:    ENDJMETHOD METHOD PUBLIC NIGHTTIME:    END_METHOD

METHOD PUBLIC EXT_1

Ext_Room_Ctrl(RM:- THIS):    //Вызвать Ext_Room_Ctrl с собственным экземпляром

END_METHOD

END_CLASS

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

Ключевое слово SUPER обеспечивает доступ к методам реализации базового класса.

С ключевым словом SUPER можно вызвать метод, который действителен в экземпляре базового (родительского) класса. Таким образом, имеет место статическое связывание.

Ключевое слово SUPER не может использоваться с экземплярами других программных элементов. например, выражение my- Room.SUPER.DAYTIME() не разрешено.

Ключевое слово SUPER не может использоваться для доступа к старшим предкам порожденных методов, например, выражение SUPER.SUPER.aMethod не разрешено.

Пример — Использование ключевого слова SUPER и полиморфизм

LIGHT2ROOM с использованием SUPER как альтернативная реализация приведенного выше примера. Для удобства сюда скопированы некоторые предыдущие примеры.

INTERFACE ROOM

METHOD DAYTIME    END_METHOD // Вызывается в дневное время

METHOD NIGHTTIME ENDJMETHOD /1 Вызывается в ночное время ENDJNTERFACE

CLASS LIGHTROOM IMPLEMENTS ROOM VAR UGHT: BOOL: ENDJ/AR

METHOD PUBLIC DAYTIME LIGHT:- FALSE:

ENDJMETHOD

METHOD PUBLIC NIGHTTIME

LIGHT:* TRUE: END_METHOD END CLASS

FUNCTJON_BLOCK ROOM_CTRL VARJNPUT

RM: ROOM:    // Интерфейс ROOM как тип переменной

END_VAR

VAR_EXTERNAL

Actual_TOD: TOD:    //Глобальное определение времени

END_VAR

IF (RM = NULL)    И ВАЖНО: проверить действительность ссылки!

THEN RETURN:

ENDJF:

IFActual_TOD >= TOD«20:15 OR Actual_TOD <= TODSO6.00

THEN RM.NIGHTTIMEQ:    //Вызвать метод RM (динамическое связывание с

//либо UGHTROOM.NIGHTTIME //либо LIGHT2ROOM.NIGHTTIME)

ELSE RM.DAYT1ME0;

ENDJF:

ENDJFUNCVONJBLOCK

И Применяет ключевое слово SUPER для вызова метода базового класса

CLASS LIGHT2ROOM EXTENDS UGHTROOM    И см. выше

VAR LIGHT2: BOOL: ENDJ/AR    //логическая переменная light

METHOD PUBLIC OVERRIDE DAYTIME

SUPER.DAYTIMEO:    И Вызов метода в UGHTROOM

LIGHT2. - TRUE:

END METHOD

METHOD PUBLIC OVERRIDE NIGHTTIME

SUPER.NIGHTTIMEO    //Вызов метода в LIGHTROOM

LIGHT2FALSE:

END_METHOD END CLASS

// Использование полиморфизма и динамическое связывание PROGRAM С VAR

MyRoom 1: LIGHTROOM:    И См. выше

MyRoom2: LIGHT2ROOM;    //См.    выше

My_Room_Ctrl: ROOM_CTRL:    //См. выше

END VAR

My_Room_Ctr1(RM:= MyRooml); //Вызовы в МуJRoomjCtrl вызывают методы LIGHTROOM My_Room_Ctrl(RM:= MyRoom2); // Вызовы в My_Room_Ctrl вызывают методы LIGHT2ROOM END_PROGRAM

6.6.S.8 Абстрактный класс и абстрактный метод

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

Модификатор ABSTRACT может использоваться с классами или отдельными методами. Разработчик определяет реализацию этих свойств в соответствии с таблицей 48.

6.6.5.8.2    Абстрактный класс

Использование модификатора ABSTRACT в объявлении класса указывает, что класс предназначается для использования в качестве базового типа для других классов.

Пример — CLASS ABSTRACT А1

Абстрактный класс имеет следующие свойства:

•    абстрактный класс не может инстанцироваться;

•    абстрактный класс содержит, по меньшей мере, один абстрактный метод.

Класс (неабстрактный), порожденный из абстрактного класса включает фактические реализации всех унаследованных абстрактных методов.

Абстрактный класс может использоваться как тип входных и входных-выходных параметров.

6.6.5.8.3    Абстрактный метод

Все методы абстрактного класса, отмеченные модификатором ABSTRACT, будут реализовываться классами, порожденными из абстрактного класса, если сам порожденный класс не отмечен как ABSTRACT.

Методы класса, унаследованные из интерфейса, получают ключевое слово ABSTRACT, если они еще не реализованы.

Ключевое слово ABSTRACT не используется в сочетании с ключевым словом OVERRIDE. Ключевое слово ABSTRACT может использоваться только с методами абстрактного класса.

Пример — METHOD PUBLIC ABSTRACT М1.

6.6.5.3    Спецификаторы доступа (PROTECTED. PUBLIC. PRIVATE. INTERNAL) к методу

Для каждого метода должно быть определено, откуда он может вызываться. Доступность метода определяется с использованием следующих спецификаторов доступа, следующие за ключевым словом METHOD.

-    PROTECTED

Если реализовано наследование, применим спецификатор доступа PROTECTED. Он указывает, что метод доступен только внутри класса и из всех порожденных классов.

PROTECTED является умолчанием и может быть опущен.

Примечание — Если наследование не поддерживается, спецификатор доступа PROTECTED действует так же. как PRIVATE.

-    PUBLIC

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

-    PRIVATE

Спецификатор доступа PRIVATE указывает, что метод доступен только внутри самого класса.

INTERNAL

Если пространство имен реализовано, то может использоваться спецификатор доступа INTERNAL. Он указывает для методов, что они доступны только в пределах ПРОСТРАНСТВА ИМЕН, в котором класс объявлен.

Неявно доступ к прототипам методов всегда общий (PUBLIC), поэтому для прототипов методов не используется спецификатор доступа.

Все неправильные использования спецификаторов доступа считаются ошибкой.

Пример — Спецификаторы доступа для методов.

Иллюстрация доступности (вызова) методов, определенных в классе С:

а) спецификаторы доступа: PUBLIC. PRIVATE. INTERNAL, PROTECTED

• PU8LIC Метод M1 доступен посредством вызова М1 из класса В (а также класса С);

-    PRIVATE Метод М2 доступен посредством вызова М2 только из класса С:

-    INTERNAL Метод М3 доступен посредством вызова М3 из ПРОСТРАНСТВА ИМЕН А (а также класса В и класса С):

•    PROTECTED Метод М4 доступен посредством вызова М4 из класса лорожденный_С (а также класса С):

Ь) вызовы методов изнутри и извне:

•    метод М2 вызывается из класса С — с ключевым словом THIS:

•    методы М1, М3 и М4 класса С вызываются из класса С — с ключевым словом SUPER для метода М4.

THIS

'SUP8R


6.6.5.10 Спецификаторы доступа к переменной (PROTECTED. PUBLIC. PRIVATE. INTERNAL)

Для секции VAR спецификатор доступа определяет, откуда разрешен доступ к переменным этой секции. Доступность переменных определяется с использованием одного из следующих спецификатор ров доступа, располагающихся вслед за ключевым словом VAR.

Примечание — Спецификаторы доступа могут комбинироваться с другими спецификаторами, такими как RETAIN или CONSTANT в любом порядке.

Определение интерфейса начинается с ключевого слова INTERFACE с последующим именем интерфейса и оканчивается ключевым словом ENDJNTERFACE (см. таблицу 51).

Интерфейс может содержать набор (неявно общих) прототипов методов.

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

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

a)    в объявлении класса

Она определяет, какие методы реализует класс, например, для повторного использования спецификации интерфейса, как показано на рисунке 18;

b)    как тип переменной

Переменные, тип которых — интерфейс, являются ссылками на экземпляры классов и им может присваиваться значение до использования. Интерфейсы не используются как еходкые-выходные переменные.

Таблица 51 —Интерфейс

Номер

Описание Ключевое слово

Объяснение

1

INTERFACE ... ENDJNTERFACE

Определение интерфейса

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

2

METHOD.. .END_METHOD

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

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

3

EXTENDS

Интерфейс наследует из интерфейса

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

IMPLEMENTS интерфейс

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

IMPLEMENTS множественные интерфейсы

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

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

Ссылка на реализацию (экземпляр функционального блока) интерфейса

6.6.6.3 Прототип метода

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

Доступ к прототипам метода всегда PUBLIC; поэтому спецификатор доступа не используется в прототипе метода.

Ниже приведена иллюстрация интерфейса INTERFACE general_drive, включающая:

a)    прототипы метода (без алгоритма);

b)    класс drive_A и класс drive_B: IMPLEMENTS INTERFACE general_drive.

Данные классы имеют методы с разными алгоритмами.

Рисунок 16 — Интерфейс с порожденными классами (иллюстрация)

Б.6.6.4 Использование интерфейса в объявлении класса (IMPLEMENTS)

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

Класс может реализовывать один или более ИНТЕРФЕЙСОВ с использованием ключевоего слова IMPLEMENTS.

Пример — CLASS В IMPLEMENTS А1, А2;

Класс реализует алгоритмы всех методов, указанных прототипами метода, которые содержатся в спецификациях ИНТЕРФЕЙСА.

Класс, который не реализует все прототипы метода, будет отмечен как ABSTRACT и не может быть инстанцирован.

Примечание — Реализация гфотогила метода может иметь дополнительные временные переменные в методе.

6.6.6.4.2    Ошибки

Следующие ситуации рассматриваются как ошибка:

1    Если класс не реализует все методы, определенные в базовом (родительском) интерфейсе, и класс инстанцирован.

2    Если класс реализует методе таким же именем, которое определено в интерфейсе, но с другой сигнатурой.

3    Если класс реализует метод с таким же именем, которое определено в интерфейсе, но не со спецификатором доступа PUBLIC или INTERNAL.

6.6.6.4.3    Пример

Приведенный ниже пример иллюстрирует объявление интерфейса в классе и использование по* средством внешнего вызова метода

Пример — Класс реализует интерфейс.

//Объявление

INTERFACE ROOM

METHOD DAYTIME    END_METHOD // Вызывается в дневное время

METHOD NIGHTTIME END_METHOD // Вызывается в ночное время ENDJNTERFA СЕ

CLASS LIGHTROOM IMPLEMENTS ROOM VAR LIGHT: BOOL: ENDJVAR

METHOD PUBLIC DAYTIME LIGHT:* FALSE:

ENDJMETHOD

METHOD PUBLIC NIGHTTIME LIGHT:* TRUE;

END_METHOD

END_CLASS

// Использование (посредством внешнего вызова метода)

PROGRAM А

VAR MyRoom: LIGHTROOM; END_VAR; I/ Инстанцирование класса VAR_EXTERNAL Actual_TOD: TOD: END_VAR;//определение глобального времени IF Actual_TOD >* TODH20:15 ORActual_TOD <* TOD*6:00 THEN MyRoom.NIGHTTIMEQ;

ELSE MyRoom.DAYTIMEQ;

ENDJF;

END_PROGRAM

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    Ошибка

Значение переменной типа интерфейс должно быть присвоено до ее использования, и должна быть проведена проверка, что оно указывает на действительный экземпляр класса. В противном случае возникает ошибка времени выполнения.

Примечание —Для предотвращения ошибки времени выполнения, инструментальные программные средства должны предоставить неявный «пустой» метод. Другой способ состоит е предварительной проверке того, что назначен действительный экземпляр класса.

6.6.6.5.3 Пример

В примерах 1 и 2 показаны объявление и использование интерфейсов как типа переменной.

Пример 1 — Тип функционального блока с вызовом методов интерфейса ИОбъявление

INTERFACE ROOM

METHOD DAYTIME END_METHOD    // вызывается в дневное время

METHOD NIGHTTIME ENDJMETHOD    // вызывается в ночное время

ENDJNTERFACE

CLASS LIGHTROOM IMPLEMENTS ROOM VAR LIGHT: BOOL: ENDJVAR

METHOD PUBLIC DAYTIME LIGHT:- FALSE:

END_METHOD

METHOD PUBLIC NIGHTTIME LIGHT:- TRUE:

END_METHOD

END_CLASS

FUNCTtON_BLOCK ROOMJCTRL

VARJNPUT RM: ROOM: END_VAR if Интерфейс ROOM как тип (входной) переменной VAR_EXTERNAL

Actual_TOD: TOD: END_VAR //Определение глобального времени

IF (RM - NULL)    //важно: тест на действительную ссылку!

THEN RETURN:

ENDJF:

IFActual_TOD >= TODK20.15 OR Actual_TOD <= TODM6:00

THEN RM.NIGHTTIMEO;    //Вызов метода RM ELSE RM.

DAYTIMEO;

ENDJF:

ENDJFUNC TION_BLOCK

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

И Инстанцирование

UGHTROOM; H Cm. LIGHTROOM IMPLEMENTS ROOM ROOMJCTRL: //Cm. ROOMJCTRL выше


PROGRAM В VAR

My_Room:

My_Room_Ctrl:

END VAR

My_Room_Clrl(RM:= My_Room);

//Вызов FB с передачей экземпляра класса в качестве входной переменной ENDJPROGRAM

В данном примере функциональный блок объявляет переменную типа интерфейс как параметр. Выэое экземпляра функционального блока передает экземпляр (указатель) класса, реализующего интерфейс. этой переменной. Затем метод, вызванный в классе, использует методы переданного экземпляра класса. Таким образом, можно передавать экземпляры различных классов, реализующих интерфейс.

Объявление:

Интерфейс ROOM с двумя методами и класс LIGHTROOM. реализующий интерфейс.

Функциональный блок ROOM_CTRL с входной переменной RM. которая имеет тип интерфейса ROOM. Функциональный блок ROOM_CTRL вызывает методы переданного класса, которые реализуют интерфейс.

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

Программа В инстанцирует класс My_Room и функциональный блок My_Room_Ctrl и вызывает функциональный блок My_Room_Ctr1 с передачей класса My_Room входной переменной RM типа интерфейс ROOM.

Пример 2 — Иллюстрация отношений из примера 1


Объявление:

Примечание — Функциональный блок не имеет реализованных методов, но вызывает методы переданного класса!

в.6.6.6 Наследование интерфейса (EXTENDS)

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

Применительно к языкам программирования PLC концепция наследования и реализации, определенная в объектно-ориентированном программировании применяется как способ создания новых элементов, как показано на рисунке 19 а), Ь), с) ниже.

a)    Наследование интерфейса

Порожденный (дочерний) интерфейс расширяет (EXTENDS) базовый (родительский) интерфейс, который уже был определен, или

b)    Реализация класса

Порожденный класс реализует (IMPLEMENTS) один или более интерфейсов, которые уже были определены, или

c)    Наследование класса

Порожденный класс расширяет (EXTENDS) базовый класс, который уже был определен.

Иллюстрация иерархии наследования:

a)    наследование интерфейса с использованием ключевого слова EXTENDS;

b)    реализация интерфейса, испогьзуя ключевое слово IMPLEMENTS:

c)    класса, используя ключевые слова EXTENDS и OVERRIDE.

Рисунок 19 — Наследование интерфейса и класса

Наследование интерфейса, как показано на рисунке 19 а) является первым из трех уровней на-следоаание/реализация. На основе базового интерфейса можно породить один или более интерфейсов.

Интерфейс может быть порожден из одною или более существующих интерфейсов (базовых интерфейсов). используя ключевое слово EXTENDS.

Пример — Интерфейс А1 расширяет интерфейс А.

Применяются следующие правила:

1    Порожденный (дочерний) интерфейс наследует без дополнительных объявлений все прототипы методов из его базового (родительского) интерфейса.

2    Порожденный интерфейс может наследовать из произвольного числа базовых интерфейсов.

3    Порожденный интерфейс может расширять множество прототипов методов, то есть он может иметь прототипы метода дополнительные к прототипам метода своего базового интерфейса и. таким образом, создавать новую функциональность.

4    Интерфейс, используемый как базовый интерфейс, может сам являться порожденным интерфейсом. Когда он передается своим порожденным интерфейсам, наследуются также прототипы метода.

Данный процесс может повторяться многократно.

5    Если базовый интерфейс изменяет свое определение, все порожденные интерфейсы (и их потомки) также имеют эту измененную функциональность.

6.6.6.6.2 Ошибка

Следующие ситуации будут рассматриваться как ошибка:

1)    интерфейс определяет дополнительный прототип метода (в соответствии с правилом 3) с таким же именем прототипа метода, как и один из его базовых интерфейсов:

2)    интерфейс является своим собственным базовым интерфейсом, явно или неявно, то есть рекурсия не разрешена.

Пример — Свойство OVERRIDE, как определено в 6.6.5.5 для классов, не применимо для интерфей-

6.6.6.7 Попытка присваивания

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

Попытка присваивания используется для проверки того, реализует ли экземпляр данный интерфейс (см. таблицу 52). Это применимо для классов и функциональных блоков.

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

Синтаксис попытки присваивания может также использоваться для безопасных преобразований ссылок интерфейсов в ссылки на классы (или типов функциональных блоков), или ссылки на базовый тип в ссылку на порожденный тип (нисходящее преобразование типа).

Результат попытки присваивания подтверждается отличием от значения NULL перед использованием.

6.6.6.G.7.2 Текстовое представление

В перечне инструкций (язык IL). оператор «ST» (Сохранить) используется как показано в следующем примере.

Пример 1

LD    Interface2 Ив языке IL

ST? interfacel

В структурированном тексте (язык ST). оператор «?-» используется как показано в следующем примере.

Пример 2

interfacel ?= Interface2: Ив языке ST

6.6.6.6.7.3 Графическое представление

В графических языках используется следующая конструкция:

Пример 1

+--------------+

interface2 ---|    ?=    |--- interfacel

+--------------+

Пример 2 — Попытка присваивания с ссылками интерфейса Успешная и неудачная попытка присваивания с ссылками интерфейса //Объявление

CLASS С IMPLEMENTS ITF1. ITF2 END_CLASS

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

PROGRAM А VAR

inst: С; intern: ITF1; interf2: ITF2; interfS: ITF3;

END_VAR

//теперь intern содержит действительную ссылку // interf2 будет содержать действительную ссылку //равную interf2~ inst;

Н interf3 будет равно NULL

Попытка присваивания с указателями интерфейса


interf1r= inst: interf2 ?= interfl;

interf3 ?= intern:

END_PROGRAM Пример 3 -//Объявление

CLASS dBase IMPLEMENTS ITF1, ITF2 END_CLASS

CLASS CIDerived EXTENDS dBase

end_class

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

PROGRAM A VAR

instbase: dBase: instderived: CIDerived: rinstBasel, pinstBase2: REF_TO dBase: rinstDerivedl, rinstDerived2: REF_TO CIDerived: rinstDerived3, rinstDerivedd: REF_TO CIDerived: intern: ITF1: interf2: ITF2; interfS: ITF3;

END_VAR

// rinstbasel ссылается на базовый класс // rinstbase2 ссылавлкя на порожденный класс // rinstDerivedl —NULL

rinst8ase1:s REF(instBase); rinstBase2:= REF(instDerived); rinstDerivedl ?= rinstBasel; rinstDerived2 7- rinstBase2;


//rinstDerived2 будет содержать действительную // ссылку на instDerived

interfl := instbase; // interfl является ссылкой на базовый класс interf2r= instderived: // interf2 является ссылкой на порожденный класс rinstDerived3 7- interfl; // rinstDerived3 == NULL

rinstDerivedd 7- interf2: // rinstDerivedd будет содержать действительную И ссылку на instDerived

END PROGRAM

Результат попытки присваивания подтверждается отличием от значения NULL перед использова-

нием.

Таблица 52 — Попытка присваивания

Номер

Описание

Пример

1

Попытха присваивания интерфейсов, используя «?=#

См. выше

2

Попытха присваивания интерфейсов, используя «?=»

См. выше

6.6.7 06ъбктноч>риентированныб свойства функциональных блоков

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

Концепция функциональных блоков МЭК 61131*3 расширена для поддержки объектно-ориентированной парадигмы в том объеме, как она определена для классов:

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

•    функциональными блоками дополнительно реализуются интерфейсы:

•    поддерживается наследование функциональных блоков.

В объектно-ориентированных функциональных блоках поддерживаются все свойства, определенные в таблице 40.

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

Таблица 53 — Объектно-ориентированный функциональный блок

Но

мер

Описание Ключевое слово

Объяснение

1

Объектно-ориентированный функциональный блок

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

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

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

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

5

METHOD...END.METHOO

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

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

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

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

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

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

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

5d

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

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

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

Но

мер

Описание Ключевое слово

Объяснение

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

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

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

IMPLEMENTS интерфейс

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

IMPLEMENTS множественные интерфейсы

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

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

Поддержка ссыпок на реализации {экземпляры функциональных блоков) интерфейса

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

EXTENDS

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

EXTENDS

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

8

OVERRIDE

Метод переопределяет базовый метод — см. динамическое связывание имен

9

ABSTRACT

Абстрактный функциональный блок — по меньшей мере, один метод является абстрактным

Абстрактный метод — это шаблон метода

Ссылка на доступ

10а

THIS

Ссылка на собственные методы

10Ь

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

Ссылка доступа на метод в базовом функциональном блоке

10с

SUPERf)

Ссылка доступа на тело е базовом функциональном блоке

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

11а

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

Доступ к переменной возможен из любого места

11Ь

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

Доступ к переменной осуществляется только внутри определяющего программного компонента

11с

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

Доступ к переменной осуществляется только внутри одного и того же пространства имен

lid

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

Доступ к переменной осуществляется только из определяющего программного компонента и его наследников (неявно)

Полиморфизм

12а

с секцией переменных VAR IN.OUT

с одинаковой сигнатурой

Секции VAR_IN_OUT базового типа FB может присваиваться экземпляр порожденного типа FB без дополнительных переменных VAR IN OUT, VARJNPUT и VAR.OUTPUT

12Ь

с секцией переменных VAR IN.OUT

с совместимой сигнатурой

Секции VAR_IN_OUT базового типа FB может присваиваться экземпляр порожденного типа FB без дополнительных переменных VAR_IN_OUT

12с

со ссылкой

с одинаковой сигнатурой

Ссылке (базового) типа FB может присваиваться адрес экземпляра порожденного типа FB без дооолнигегъных переменных VAR IN OUT. VARJNPUT и VAR.OUTPUT

12d

со ссылкой

с совместимой сигнатурой

Ссылке (базового) типа FB может присваиваться адрес экземпляра порожденного типа FB без дополнительных переменных VARJN.OUT

6.67.2    Методы для функциональных блоков

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

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

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

6.67.2.2    Варианты функциональных блоков

Функциональный блок может иметь тело функционального блока и дополнительно набор методов. Так как тело FB и^или методы могут быть опущены, существует три варианта функционального блока. Это показано в примере на рисунках 20 а), 20 Ь). 20 с).

a)    Функциональный блок, имеющий только тело

Данный функциональный блок известен из МЭК 61131-3.

В данном случая у функционального блока нет реализованных методов. Элементы функционального блока (входные переменные, выходные переменные и т. п.) и вызовы функционального блока показаны на примере на рисунке 20 а).

b)    Функциональный блок телом F8 и методами

Методы поддерживают доступ к их собственным локально определенным переменным, а также к переменным, определенным в секциях VARJNPUT. VAR_OUTPUT и VAR объявления функционального блока.

c)    Функциональные блоки, имеющие только методы

В данном случае, функциональный блок имеет реализованное пустое тело функционального блока. Элементы функционального блока и вызов методов показан на рисунке 20 Ь).

В данном случае, функциональный блок может также быть объявлен как класс.

Илтэстрацли ммимтяз м мймш фунееюнмльногс Опека стапом мРилк мгтсюшк.

В примере тамз посаж пятя рпртшми марорашанны гфисвятмия и чт— ювдю и выходных гауимат.и.

я) Фуннем. нзаивмреталыю r—nffiiiiw фуп^зштлыют<пяш:

‘Шткю,шшдш»гшраые11ывытта1ст»тучасхжяиддсту1ы диафужеюшгоногоВпяш • также незиивюы от вызове <86.

I

т

А•

ini ocrtl

■t

9

inoue --- inoue

-

Эго графически! лрапсгтевлиаю метода лриадого талью для шпюограцж.

Временные лвряазегры

ГРЯИЮОНЫ8Ш30ШХ.


Пример Ф&

Тт6

МФК

[Чвмвк! ММКК

4иреи.}|

А внешние

Ж

4


[


Алгоритм tana ОБ


X (1в1:а Д, Incut:" В/ cntl «о» Т) г Прмп—гши «мних пармммкихмамк

l.ini if

i.imiutt Dr It He разрешено. Только при вызове

Чти» вызаотьес переменных кжн«

х:- x.outl; /f Разрешив! Оггомаепж orb).

Пройолканив Фб


FB .method


ывтид_1


&-


1ахв1>


ввЫ1


-И1

• т


{■**) {<


»аи;


(nw ншвян.)


алсритм шкда_1


шг«и


И»»;


Это графи» »ыое

гфадетявлвмю метод г|лшцитбя тшыцдта шяюетрацж.

Временные тряммгры лрнмюмы а сюбкюс


Й:и I.eeLbctil (!&!:" A, ouoal «о );

или? мспопъэовшан» результате ноЛвеггельно i.taethodKiiBalc- a, ootal х)>

гу»ша1ШМмеехад)осшрвм113>1Ж1>апцаи1ана:

.»■l.mrtnnur.M, U £&разреаяно.‘Плие при выеме!

Чтений аьамриьа переменны метода «йен

■Ti— Тчмннм^-У/йв развешано. Толысо три шзоеа!


алгоритм папами


9)>УаФ1аирпваи■ Ml фуинвп1илшыйвтапви и методами; а ключи а) м о)

Рисунок 20 — Функциональный блок с необязательным телом и методами (иллюстрация)

6.67.2.3 Объявление и выполнение метода

Функциональный блок может иметь набор методов, приведенных на рисунке 20 с).

Объявление метода подчиняется правилам метода класса, а также дополнительно следующим правилам:

1    Методы объявляются в области действия типа функционального блока.

2    В текстовом объявлении методы перечисляются между частью объявлений функционального блока и телом функционального блока.

Выполненные методы подчиняются правилам для методов класса и дополнительно следующим правилам:

3    Все методы имеют доступ для чтения-записи к статическим переменным, объявленным в функциональном блоке: Входные переменные (кроме тех. которые имеют тип данных BOOL R_EDGE или BOOL F_EDGE). входные, статические и внешние переменные.

4    Метод не имеет доступа к временным переменным VAR_TEMP и входным-выходным переменным VAR_IN_OUT функционального блока.

5    Переменные метода недоступны е теле (алгоритме) функционального блока.

6.67.2.4    Представление вызова метода

Методы могут вызываться так же. как определено для классов в текстовых и графических языках.

6.67.2.5    Спецификаторы доступа (PROTECTEO. PUBLIC. PRIVATE. INTERNAL) к методу

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

6.67.2.6    Спецификаторы доступа к переменным (PROTECTED, PUBLIC. PRIVATE. INTERNAL)

Для секции VAR должно быть определено, откуда разрешен доступ к переменным этой секции.

Доступ к входным и выходным переменным неявно является общим (PUBLIC), поэтому в секциях

входных и выходных переменных отсутствует спецификатор доступа. Входные-выходные переменные могут использоваться только в теле функционального блока и в операторе вызова. Доступ к переменным секции VAR_EXTERNAL всегда неявно является защищенным (PROTECTED): поэтому объявление этих переменных не использует спецификатора доступа.

6.67.2.7    Наследование функционального блока (EXTENDS. SUPER. OVERRIDE, FINAL)

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

Наследование функционального блока похоже на наследование классов. На основе существующею класса или типа функционального блока можно породить один или более функциональных блоков. Данный процесс может повторяться многократно.

6.67.2.9    SUPER() в теле порожденного функционального блока

Порожденные функциональные блоки и их базовый функциональный блок могут иметь тело функционального блока. Тело функционального блока не наследуется автоматически из базового функционального блока. По умолчанию, оно пустое. Затем его можно вызвать, используя функцию SUPER().

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

1    Тело (если имеется) порожденного функционального блока будет вычисляться при вызове функционального блока.

2    Для того чтобы дополнительно выполнить тело базового функционального блока (если оно имеется) в порожденном функциональном блоке, используется вызов SUPER(). Вызов SUPERQ не имеет параметров.

Вызов SUPER() осуществляется только один раз в теле функционального блока и не используется в цикле.

3    Имена переменных в базовом и порожденном функциональных блоках должны быть уникальными.

4    Вызов функционального блока связывается динамически.

a)    Тип порожденного функционального блока может использоваться везде, где может использоваться тип базового функционального блока.

b)    Тип порожденного функционального блока может использоваться везде, где может использоваться тип базового функционального блока.

5    SUPER() может вызываться в теле функционального блока, но не в методе функционального блока.

На рисунке 21 показаны примеры использования SUPERQ:

Включение тела с вызовом SUPER()

{Тйп FB)    ч\    (Тип FB)

ПОРОЖДЕННЫЙ FB 1 У РАСШИРЯЕТ БАЗОВЫЙ F8

* '

* ПОРОЖДЕННЫЙ FB 1 РАСШИРЯЕТ БАЗОВЫЙ FB

VAR INPUT Ь: INT;

VAR INPUT a: INT; VAR INPUT b:INT, VAR OUTPUT х: INT;

SUPER!);

{’включает здесь тело БАЗОВОГО FB*) х := З*х+Ь

x:« a+1; к :■ 3*x*b:

Включение тела с вызовом SUPER()

{Тип FB)_ S    (Тип FB)

/

FB ПОРОЖДЕННЫЙ 2

\

^ FB ПОРОЖДЕННЫЙ 2

ВКЛЮЧАЕТ

ВКЛЮЧАЕТ

VAR_IN_CKJT c INT;

VAR INPUT a: INT; VAR INPUT b:!NT; VAR IN OUT c: INT; VARlOUTPUTx: INT;

SUPER!); ('включает здесь тело из DERIVEDJ *)

a.* a+1; x :• 3’x*b;

с~х/с;

c:*xte;

Рисунок 21 — Наследование тела функционального блока с SUPER0 (пример)

БАЗОВЫЙ FB


VARJNPUT

a:VAR О

UTPUT х: INT; INT;

(• тело:*) х:» а+1:

NIGHTTIME


6.6.7.2.10    OVERRIDE (переопределение метода)

Тип порожденного функционального блока может переопределять (заменять) один или более унаследованных методов собственной реализацией метода.

6.6.7.2.11    FINAL для функционального блока и методов

Метод со спецификатором FINAL не может быть переопределен.

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

ком.

6.6.7.3 Динамическое связывание имен (OVERRIDE)

Связывание имен — это ассоциация имени метода или имени функционального блока с реализацией метода или функционального блока. Оно используется как определено в 6.6.5.6 для методов и функциональных блоков.

6.67.4    Вызов метода из собственного и базового FB (THIS. SUPER) и полиморфизм

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

6.67.5    Абстрактный функциональный блок и абстрактный метод

Модификатор ABSTRACT может также использоваться с функциональными блоками. Реализация этих свойств определяется разработчиком.

6.67.6    Спецификаторы доступа (PROTECTED. PUBLIC. PRIVATE. INTERNAL) к методу

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

6.6.77 Спецификаторы доступа к переменной (PROTECTED. PUBLIC. PRIVATE. INTERNAL)

Для секции VAR определяется, откуда разрешен доступ к переменным секции, как определено это для классов.

Доступ к входным и выходным переменным неявно определен как общий (PUBLIC), поэтому спецификатор доступа в секциях входных и выходных переменных не используется. Выходные переменные неявно доступны только для чтения. Входные-выходные переменные могут использоваться только в теле функционального блока и в операторе вызова. Доступ к переменным секции VAR.EXTERNAL всегда неявно является защищенным (PROTECTED): поэтому объявление данных переменных не использует спецификатора доступа.

6.6.8 Полиморфизм

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

Существует четыре случая, где проявляется полиморфизм, они показаны в 6.6.8 2.6.6.8.3.6 6.8.4 и 6 6.8.5.

6.6.8.2    Полиморфизм в интерфейсе

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

6.6.8.3    Полиморфизм в секции VARJN_OUT

Входным-выходным переменным типа может присваиваться тип порожденного функционального блока, если тип порожденного функционального блока не имеет дополнительных входных-выходных переменных. Разработчик определяет, может ли присваиваться экземпляр типа порожденного функционального блока с дополнительными входными-выходными переменными.

Таким образом, вызов функционального блока и вызов методов функционального блока через экземпляр секции VAR_IN_OUT является случаем динамического связывания.

Пример 1 — Динамическое связывание вызовов функционального блока

•••► DERIVED. 2_A-

VAR IN OUT BASE 1: BASE;


VAR

BASE.A: BASE;

DERIVED 1 A: DERIVED 2s END VAR~


(Тип ФБ) КОСВЕННЫЙ FB


VAR IN OUT BASE li BASE;


BASE 1


123-


SASE «    X


КОСВЕННЫЙ 1

BASS A

КОСВЕННЫЙ FB

VAR IN BASE;

OUT B;

BASE.l

......

123-

BASE

a X

*> x :•

a+1 //x*124

КОСВЕННЫЙ 2


l\ динамически связаны

Ч

l Ч

ч

ч

\


DERIVED 1 А


КОСВЕННЫЙ FB


VAR IN ООТ BASE 1: BAsI?


V


\


V


\


НЕ разрешено!


BASE 1


BASE


123


■> X :» а+1; х :• Э*х*Ь; х .


КОСВЕННЫЙ 3


КОСВЕННЫЙ FB


BASE 1


123-

ошибка


BASE

a    x


Если порожденный блок добавил еходные-выходкые переменные, то динамическое связывание вызова функционального блока должно приводить к INDIRECT.3 в вычислении неназначенной вход* ной*выходной переменной с и вызывать ошибку периода выполнения. Следовательно, присваивание экземпляра порожденных функциональных блоков является ошибкой.

Пример 2

CLASS LIGHTROOM

VAR LIGHT: BOOL: ENDJVAR METHOD PUBLIC SET_DAYTIME VARJNPUT: DAYTIME: BOOL: ENDJVAR LIGHT:= NOT(DAYTIME):

END_METHOD

END_CLASS

CLASS LIGHT2ROOM EXTENDS UGHTROOM

VAR UGHT2: BOOL: ENDJVAR    //Вторая переменная light

METHOD PUBLIC OVERRIDE SET_DAYT1ME VARJNPUT: DAYTIME: BOOL: END_VAR

SUPER.SET_DAYTIME(DAYTIME): //Вызов LIGHTROOM.SETJDAYTIME UGHT2 - NOT(DAYTIME): END_METHOD

end_class

FUNCTIONJBL OCK ROOMjCTRL

VARJNJQUTRM: UGHTROOM; END_VAR

VARJEXTERNAL Actual_TOD: TOD; END_VAR И Определение глобального времени // В этом случае функциональный блок для вызова динамически связан // RM может ссылаться на порожденный классI RM.SET_DAYTIME{DAYTIME:- (ActuaJTOD <= TOD*20:15) AND (ActualJTOD >= TOD#6:00)):

ENDJFUNCTIONJBLOCK

//Использование полиморфизма и динамического связывания со ссылкой

PROGRAM D VAR

MyRooml: UGHTROOM.

MyRoom2: LIGHT2ROOM;

My_Room_Ctr1: ROOMJCTRL:

ENDJVAR

My_Room_Ctrl(RM:= MyRooml);

My_Room_Ctrt(RM:= MyRoom2);

ENDJPROGRAM:

6.6.8.Д Полиморфизм со ссылкой

Пример производного типа может быть назначен для ссылки на базовый класс.

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

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

Пример 1 — Альтернативная реализация примера lightroom FUNCTtONJBLOCK UGHTROOM VAR UGHT: 800L; ENDJVAR VARJNPUT: DAYTIME: BOOL; ENDJVAR UGHT:- NOT(DAYTIME):

END_FUNCTION_BLOCK

FUNCTIONJBLOCK LIGHT2ROOM EXTENDS UGHTROOM VAR UGHT2: BOOL; END_VAR //Дополнительное освещение

SUPER/);    //Вызов LIGHTROOM

LIGHT2:- NOT(DAYTIME):

ENDJFUNCTIONJBLOCK

FUNCT10N_BL0CK ROOM_CTRL

VARJNPUT RM: REF_TO UGHTROOM: END_VAR

VAR_EXTERNALActual_TOD: TOD; END_VAR // Определение глобального времени

// в этом случае, функциональный блок для вызова динамически связанного // RM может относиться к производному типу функционального блока/

IF RM о NULL THEN

RMA.DAYTIME:= (Actual_TOD <- TOD*20:15) AND (Actual_TOD >- TOD*6:00));

ENDJF

END_FUNCTION_BLOCK

//Использование полиморфизма и динамического связывания со ссылкой

PROGRAMD

VAR

MyRooml: UGHTROOM:

//см. выше

MyRoom2: LIGHT2ROOM:

И см. выше

My_Room_Ctri: ROOMJCTRL;

И см. выше

END VAR

My_Room_Ctrl(RM:- REF(MyRoom1));

My_Room_Ctrl(RM:- REF(MyRoom2));

END_PROGRAM:

6.6.8.S Полиморфизм c THIS

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

Примечание — При особых обстоятельствах, например, если тип или метод функционального блока объявлен как FINAL, или отсутствуют производные типы функциональных блоков, то ссылка или THIS могут быть полностью определены в период компиляции. В данном случае нет необходимости в динамическом связывании.

6.7 Элементы последовательной функциональной схемы (SFC)

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

Подраздел 6.7 определяет элементы последовательной функциональной схемы (SFC) для ис* пользования в структурировании внутренней организации программного компонента лрограммируе* мото контроллера, записанные в одном из языков, определенных в настоящем стандарте, для цели выполнения функций последовательного управления. Определения е подразделе 6.7 приведены из МЭК 60848 с изменениями, необходимыми для того, чтобы преобразовать представления из докумен* тального стандарта в набор элементов реализации управления для программного компонента программируемого контроллера.

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

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

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

144

   VAR.ACCESS

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

•    VAR.CONFIG

Конструкция VAR.CONFIG...END.VAR предоставляет средства для назначения специфического для экземпляра размещения символически представленных переменных, используя символ «» или для присвоения специфических для экземпляра начальных значений символически представленным переменным, или и для того и для другого.

с) Фуециыктиыйвискьимевка^ттмю шлея (тесть пустеетеле)Дыбаи1 мегере;

-Пжтцые, выгодные, еканш ■пгзчыепф31»1ииирдуштатшгтадаам1еотонфе1Ш1ышС»п1Я111зз—1>

но достуваиамшне гелио при аз