---
title: "Руководство пользователя ALTA IDE (версия 1.4)"
product: "ALTA IDE"
document_number: "№ 1-RU-154848-1.33"
version: "1.33"
language: "ru"
source: "https://docs.owen.ru/product/alta-ide/doc/user_guide_alta_IDE_stable"
pdf: "https://docs.owen.ru/download/pdf/AQtxl.rp_alta+ide+%28versia+1.4%29_1-ru-154848-1.33.pdf"
generated: "2026-10-13"
---

# Руководство пользователя ALTA IDE (версия 1.4)

## Содержание

- [Предисловие](#topic-122525)
- [Используемые аббревиатуры и термины](#topic-122526)
- [О программе](#topic-122527)
  - [Системные требования для работы ALTA IDE](#topic-122528)
- [Установка ПО](#topic-122529)
  - [Установка](#topic-122530)
  - [Обновление](#topic-122531)
- [Описание интерфейса](#topic-122532)
  - [Главное меню](#topic-122533)
  - [Панель инструментов](#topic-122534)
  - [Дерево проекта](#topic-122535)
  - [Рабочая область](#topic-122536)
  - [Окно вывода](#topic-122537)
  - [Строка состояния](#topic-122538)
  - [Сочетания клавиш](#topic-122539)
- [Разработка проекта и порядок работы](#topic-122540)
  - [Создание проекта](#topic-122541)
    - [Открытие проекта](#topic-122542)
  - [Разработка программы](#topic-122543)
    - [Программные блоки](#topic-122544)
      - [Действия с программными объектами](#topic-122545)
      - [Редактор ST](#topic-122546)
    - [Менеджер задач](#topic-122547)
      - [Действия с задачами](#topic-122548)
      - [Привязка программы](#topic-122549)
      - [Циклическая задача](#topic-122550)
  - [Сохранение и сборка проекта](#topic-122551)
- [Работа с устройством](#topic-122552)
  - [Настройка входов/выходов устройства](#topic-122553)
  - [Периферия](#topic-122554)
  - [Подключение устройства к ПК](#topic-122555)
  - [Запись приложения в прибор](#topic-122556)
  - [Режим онлайн и отладка программы](#topic-122557)
    - [Переход в режим онлайн](#topic-122558)
    - [Редактор ST в режиме онлайн. Отладка программы](#topic-122559)
    - [Таблица локальных переменных](#topic-122560)
  - [Modbus](#topic-122561)
    - [Modbus Serial/TCP](#topic-122562)
      - [Modbus Serial/TCP Master](#topic-122563)
      - [Modbus Slave Device Serial/TCP](#topic-122564)
    - [Режим Slave](#topic-122565)
      - [Настройка параметров Modbus Slave](#topic-122566)
      - [Карта тегов](#topic-122567)
      - [Битовая маска](#topic-122568)
      - [Добавление интерфейса подключения UART/TCP](#topic-122569)
- [Расширения](#topic-122570)
  - [Менеджер библиотек](#topic-122571)
  - [Конфигуратор](#topic-122572)
    - [Установка](#topic-122573)
    - [Добавление устройства в проект](#topic-122574)
      - [Добавление устройства online](#topic-122575)
      - [Добавление устройства через сервисную кнопку](#topic-122576)
      - [Добавление устройства offline](#topic-122577)
    - [Конфигурирование устройства](#topic-122578)
      - [Дерево параметров](#topic-122579)
      - [Чтение значений параметров](#topic-122580)
      - [Запись значений параметров](#topic-122581)
      - [Возврат к заводским настройкам](#topic-122582)
      - [Настройка соединения](#topic-122583)
    - [Импорт карты тегов в Modbus Slave Device](#topic-122584)
- [Язык программирования ST](#topic-122585)
  - [Ключевые слова](#topic-122586)
  - [Правила именования](#topic-122587)
  - [Выражения](#topic-122588)
    - [Литералы](#topic-122589)
    - [Литералы массивов](#topic-122590)
    - [Литералы структур](#topic-122591)
    - [Чтение переменных](#topic-122592)
    - [Индексный доступ](#topic-122593)
    - [Чтение полей структур](#topic-122594)
    - [Унарные выражения](#topic-122595)
    - [Бинарные выражения](#topic-122596)
    - [Вызовы функций](#topic-122597)
    - [Составные выражения](#topic-122598)
    - [Приоритеты операций](#topic-122599)
    - [Операторы](#topic-122600)
      - [Оператор ADD](#topic-122601)
      - [Оператор EQ](#topic-122602)
      - [Оператор GT](#topic-122603)
      - [Оператор REF (ADR)](#topic-122604)
      - [Оператор разыменования ^](#topic-122605)
      - [Оператор SIZEOF](#topic-122606)
  - [Утверждения (инструкции)](#topic-122607)
    - [Присвоение](#topic-122608)
    - [IF](#topic-122609)
    - [WHILE](#topic-122610)
    - [FOR](#topic-122611)
    - [EXIT](#topic-122612)
    - [CONTINUE](#topic-122613)
    - [RETURN](#topic-122614)
    - [Комментарии](#topic-122615)
  - [Тип данных переменных](#topic-122616)
    - [BOOL](#topic-122617)
    - [Целочисленные типы](#topic-122618)
    - [Типы с плавающей точкой (IEEE 754)](#topic-122619)
    - [Строковые типы](#topic-122620)
    - [Символьные типы](#topic-122621)
    - [Временные типы](#topic-122622)
    - [Перечисляемый тип](#topic-122623)
    - [Объявление типа](#topic-122624)
      - [Имя другого типа](#topic-122625)
      - [Ограничение диапазона](#topic-122626)
    - [Структуры](#topic-122627)
    - [Массивы](#topic-122628)
    - [Указатели (REF_TO / POINTER TO)](#topic-122629)
  - [POU](#topic-122630)
    - [Функция](#topic-122631)
    - [Программа](#topic-122632)
    - [Переменные](#topic-122633)
      - [VAR](#topic-122634)
      - [VAR_INPUT](#topic-122635)
      - [VAR_OUTPUT](#topic-122636)
      - [VAR_GLOBAL](#topic-122637)
      - [VAR RETAIN](#topic-122638)
    - [Примеры объявления](#topic-122639)
  - [Разрешение имен](#topic-122640)
    - [Области видимости](#topic-122641)
    - [Конфликты](#topic-122642)
      - [Дублирование имен](#topic-122643)
      - [Затенение имен](#topic-122644)
      - [Вызов функции/возвращаемый слот функции](#topic-122645)
      - [Имя типа/Имя функции/переменной](#topic-122646)
  - [Размещение данных в памяти](#topic-122647)
    - [Размещение структур](#topic-122648)
    - [Размещение массивов](#topic-122649)
- [Библиотека Standard](#topic-122650)
  - [Цель документа](#topic-122651)
  - [Установка библиотеки](#topic-122652)
  - [Описание библиотеки Standard](#topic-122653)
    - [Таймеры](#topic-122654)
      - [TP](#topic-122655)
      - [TON](#topic-122656)
      - [TOF](#topic-122657)
    - [Счетчики](#topic-122658)
      - [CTU](#topic-122659)
      - [CTD](#topic-122660)
      - [CTUD](#topic-122661)
    - [Логические функциональные блоки (триггеры)](#topic-122662)
      - [SR](#topic-122663)
      - [RS](#topic-122664)
    - [Детекторы импульсов](#topic-122665)
      - [R_TRIG](#topic-122666)
      - [F_TRIG](#topic-122667)
    - [Операторы сдвига](#topic-122668)
      - [SHL](#topic-122669)
      - [SHR](#topic-122670)
      - [ROL](#topic-122671)
      - [ROR](#topic-122672)
      - [TO_BIG_ENDIAN, TO_LITTLE_ENDIAN](#topic-122673)
      - [FROM_BIG_ENDIAN, FROM_LITTLE_ENDIAN](#topic-122674)
    - [Строковые функции](#topic-122675)
      - [LEN](#topic-122676)
      - [LEFT](#topic-122677)
      - [RIGHT](#topic-122678)
      - [MID](#topic-122679)
      - [CONCAT](#topic-122680)
      - [INSERT](#topic-122681)
      - [DELETE](#topic-122682)
      - [REPLACE](#topic-122683)
      - [FIND](#topic-122684)
      - [STRING_EQUAL, WSTRING_EQUAL](#topic-122685)
      - [STRING_GREATER, WSTRING_GREATER](#topic-122686)
      - [STRING_LESS, WSTRING_LESS](#topic-122687)
    - [Математические функции](#topic-122688)
      - [ABS](#topic-122689)
      - [SQRT](#topic-122690)
      - [LN](#topic-122691)
      - [LOG](#topic-122692)
      - [EXP](#topic-122693)
      - [SIN](#topic-122694)
      - [COS](#topic-122695)
      - [TAN](#topic-122696)
      - [ASIN](#topic-122697)
      - [ACOS](#topic-122698)
      - [ATAN](#topic-122699)
      - [EXPT](#topic-122700)
      - [TRUNC](#topic-122701)
      - [ROUND](#topic-122702)
      - [ATAN2](#topic-122703)
    - [Операторы выборки](#topic-122704)
      - [MAX](#topic-122705)
      - [MIN](#topic-122706)
      - [LIMIT](#topic-122707)
    - [Валидаторы](#topic-122708)
      - [IS_VALID](#topic-122709)
      - [IS_VALID_BCD](#topic-122710)
    - [Операции с временными типами данных](#topic-122711)
      - [CONCAT_DATE, \_TOD, \_LTOD, \_DT, \_LDT](#topic-122712)
      - [SPLIT_DATE, \_TOD, \_LTOD, \_DT, \_LDT](#topic-122713)
      - [ADD_TIME, \_TOD, \_DT, INSTANT](#topic-122714)
      - [SUB_TIME, \_DATE, \_TOD, \_DT, INSTANT](#topic-122715)
      - [MUL_TIME](#topic-122716)
      - [DIV_TIME](#topic-122717)
      - [TIME](#topic-122718)
      - [INSTANT_NOW](#topic-122719)
    - [Преобразователи](#topic-122720)

<a id="topic-122525"></a>

## Предисловие

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

Если в процессе работы вы обнаружили ошибку, некорректное поведение или несоответствие ожидаемому результату, пожалуйста, сообщите об этом по электронной почте: [**support@owen.ru**](mailto:support@owen.ru) или [**alta@owen.ru**](mailto:alta@owen.ru). Ваша помощь позволяет сделать ALTA IDE лучше с каждым днем.

Спасибо, что используете ALTA IDE и участвуете в её развитии.

<a id="topic-122526"></a>

## Используемые аббревиатуры и термины

- **Drag&drop** — механизм перемещения элементов интерфейса, который позволяет перетаскивать нужный элемент, удерживая его кнопкой мыши, из одной области в другую.
- **Modbus** — открытый коммуникационный протокол, основанный на архитектуре ведущий (Master) - ведомый (Slave).
- **OwenCloud** — облачный сервис компании «[Овен Цифровые решения](https://owendigital.ru/)», применяемый для удаленного мониторинга, управления и хранения архивов данных приборов, используемых в системах автоматизации. Доступ к сервису осуществляется с помощью web-браузера или мобильного приложения.
- **Owen Configurator** — ПО для настройки и задачи параметров устройствам компании «[Овен Цифровые решения](https://owendigital.ru/)».
- **Persistent** — энергонезависимые переменные, которые сохраняют свои значения при загрузке нового приложения на устройство.
- **POU (Program Organization Units)** — программные объекты такие, как функция, функциональный блок и программа,позволяющие структурировать проект, повышать модульность и переиспользование кода.
- **Retain** — энергонезависимые переменные, которые сохраняют свои значения при отключении питания контроллера.
- **ST (Structured Text)** — текстовый язык программирования стандарта МЭК 61131-3. Предназначен для программирования промышленных контроллеров и операторских станций. По сравнению с графическими языками занимает меньше места, логику программы, написанной на языке ST легче декодировать и понимать.
- **Битовая маска** — это представление битовой строки в виде набора отдельных битов, с которыми можно работать по отдельности.
- **Глобальные переменные** — переменные, включая Retain и Persistent, которые доступны в рамках всего проекта.
- **Задача** — элемент управления, который позволяет выполнять один или несколько программных объектов на периодической или событийной основе.
- **Исполняемое приложение (далее по тексту — приложение)** — исполняемый файл, содержащий программу или набор инструкций, для записи в прибор и последующего запуска. Результат сборки пользовательского проекта ALTA.
- **Контекстное меню** — элемент графического интерфейса, представляющий собой список команд, вызываемый пользователем для выбора необходимого действия над выбранным объектом. В ALTA IDE вызывается нажатием ПКМ по объекту.
- **ЛКМ** — левая кнопка мыши.
- **ОЗУ (Оперативное Запоминающее Устройство)** — энергозависимая часть памяти прибора, в которой во время работы хранится выполняемый код программы, а также входные, выходные и промежуточные данные, обрабатываемые процессором.
- **Переменная** — поименованная область памяти процесса операционной системы, имя которой можно использовать для осуществления доступа к данным. Может принимать различные значения, но в каждый момент времени только одно.
- **ПЗУ (Постоянное Запоминающее Устройство)** — энергонезависимая память, которая используется для хранения массива неизменяемых данных.
- **ПК** — персональный компьютер.
- **ПКМ** — правая кнопка мыши.
- **Плагин** — динамически подключаемый модуль ALTA IDE содержит информацию о типе компонента и способе отображения компонента в IDE.
- **ПЛК** — программируемый логический контроллер.
- **ПО** — программное обеспечение.
- **Преобразователь** — устройство, через которое прибор подключается к ПК.
- **Программа** — структурированный код, который при выполнении выдает одно или несколько значений. Значения остаются неизменными после выполнения программы и до следующего выполнения. Может содержать функции, функциональные блоки или другие элементы языка.
- **Программные блоки (объекты)** — функция, функциональный блок, программа.
- **Проект** — разработанный пользователем алгоритм работы, созданный в ALTA IDE, включающий в себя комплекс программ и настроек для последующего хранения на ПК.
- **Сборка проекта** — команда, после которой будет выполнено преобразование файлов исходного кода в в низкоуровневый код, который исполняется на приборе
- **Сброс** — команда переинициализации всех переменных проекта кроме энергонезависимых. После выполнения переменные принимают указанные при их объявлении начальные значения. Если начальные значения не указаны – используются значения по умолчанию (например, 0 для числовых типов).
- **Сброс заводской** — команда удаления из прибора текущего приложения. Все остальные настройки (сетевые настройки и т. д.) не сбрасываются к заводским, а сохраняют текущие значения.
- **Сброс холодный** — команда переинициализации всех переменных проекта, включая Retain переменные.
- **Системные события** — сообщения, генерируемые средой исполнения прибора во время работы исполняемого приложения. Предоставляют информацию о событиях, происходящих внутри системы.
- **Таргет** — это ключевой компонент, описывающий конкретное устройство, его ресурсы, периферию и специфические функции, позволяя среде ALTA IDE взаимодействовать с ним, загружать программу и управлять аппаратным обеспечением. Таргеты предоставляются производителями устройств.
- **Тулбар** — инструментальная панель быстрого доступа в интерфейсе ALTA IDE, с кнопками навигации и управления.
- **Устройство** — программируемое устройство, например ПЛК110.
- **Функциональный блок (ФБ)** — структурная единица программы, которая после выполнения выдает одно или более значений. Может быть создано множество поименованных экземпляров (копий) функционального блока.
- **Функция** — структурная единица программы, которая после выполнения выдает только одно значение. Функция не хранит информацию о своем внутреннем состоянии, то есть вызов функции с одними и теми же фактическими параметрами выдает то же значение.
- **Цикл** — время выполнения прибором заданной программы (зависит от количества выполняемых операций в программных цепях).
- **Шаг внутрь** — во время работы в режиме отладки выполнение текущей строки кода. Если в строчке вызывается программный блок, заходит внутрь программного блока.
- **Шаг наружу** — во время работы в режиме отладки продолжение выполнения всего кода текущего программного блока и возврат к строчке кода, откуда произошел переход внутрь программного блока.
- **Шаг поверх** — во время работы в режиме отладки выполнение текущей строки кода. Если в строчке вызывается программный блок, то код программного блока выполняется полностью, без захода внутрь.

<a id="topic-122527"></a>

## О программе

ALTA IDE — это среда программирования, которая предоставляет комплекс инструментов для разработки программ для промышленных ПЛК.

Функции ALTA IDE:

- создание [приложения пользователя на языке ST](#topic-122543) стандарта МЭК 61131-3;
- [отладка](#topic-122557) созданной программы на подключенном устройстве;
- [загрузка приложения](#topic-122556) на устройство;
- [настройка сетевого обмена](#topic-122561) для режимов Master и Slave для протоколов Mobus Serial и Mobus TCP;
- [мониторинг](#topic-122575) работы программы.

ALTA IDE поддерживает современные средства, упрощающие разработку:

- подсветка синтаксиса;
- автодополнение кода;
- перекрестные ссылки для вызываемых объектов.

Перечень приборов, для программирования которых может использоваться ALTA IDE, представлен на сайте компании [Овен Цифровые решения](https://owendigital.ru/).

<a id="topic-122528"></a>

### Системные требования для работы ALTA IDE

Для корректной установки и работы программного обеспечения необходимо соответствие минимальным системным требованиям:

Операционная система:

- Windows 10;
- или аналогичные версии операционных систем.

Процессор:

- частота центрального процессора 1 ГГц или выше.

Оперативная память (ОЗУ):

- не менее 8 ГБ.

Место на жестком диске:

- не менее 5 ГБ свободного пространства.

Видеоадаптер:

- поддержка DirectX 9 или более поздней версии.

Дисплей:

- разрешение экрана не ниже 800 × 600.

<a id="topic-122529"></a>

## Установка ПО

При установке среды загружаются базовые библиотеки, при необходимости дополнительные библиотеки можно загрузить через Менеджер библиотек, или в web-конфигураторе контроллера во вкладке ПЛК/Загрузки.

<a id="topic-122530"></a>

### Установка

1. Запустите файл *AltaSetup.exe*.

2. Откроется окно мастера установки. Выберите папку для установки ALTA IDE. Нажмите кнопку **Далее**.

   ![У2](https://docs.owen.ru/book_img/2380/154597.png)

3. Ознакомьтесь с лицензионным соглашением и, в случае согласия, выберите **Я принимаю условия соглашения**. Нажмите кнопку **Далее**.

   ![У3](https://docs.owen.ru/book_img/2380/154596.png)

4. При необходимости создания ярлыка на рабочем столе установите соответствующий чекбокс. Нажмите кнопку **Далее**.

   ![У5](https://docs.owen.ru/book_img/2380/154595.png)

5. Ознакомьтесь с информацией об установке и нажмите кнопку **Установить**.

   ![У6](https://docs.owen.ru/book_img/2380/154594.png)

6. Откроется окно, в котором будет отображаться процесс установки.

   ![У7](https://docs.owen.ru/book_img/2380/154593.png)

7. Дождитесь окончания установки. При необходимости установите чекбокс **Запустить Alta** и нажмите **Завершить**.

   ![У9](https://docs.owen.ru/book_img/2380/154592.png)

<a id="topic-122531"></a>

### Обновление 

Если при запуске ALTA IDE обнаружены доступные обновления, то в правом нижнем углу отобразится информационное окно со списком доступных обновлений и предложением обновить среду до последней версии:

![Обновление](https://docs.owen.ru/book_img/2380/162479.png)

Для обновления среды выберите **Да** — ALTA IDE обновится и автоматически перезапустится.

Если выбрать **Нет**, либо не сделать выбор в течение 10 секунд, информационное окно закроется. В строке состояния появится иконка сигнализирующая о наличии обновления ![Иконка обновлений](https://docs.owen.ru/book_img/2380/154590.jpg), при нажатии на которую откроется информационное окно со списком доступных обновлений ALTA IDE, и возможностью выбора обновления ПО.

> [!NOTE]
> **Примечание.** Проекты, созданные в новых версиях программы, не могут быть открыты в старых версиях. Рекомендуется своевременно обновлять ПО до актуальной версии, чтобы избежать проблем с открытием проектов.

Для просмотра версии ALTA IDE выберите **Главное меню → Помощь → О программе**.

![О программе](https://docs.owen.ru/book_img/2380/158431.png)

*О программе*

В открывшемся окне отображается версия установленного ПО, контактные данные разработчика, а также версии плагинов, расширений и компонентов сборки, входящих в ALTA IDE.

<a id="topic-122532"></a>

## Описание интерфейса

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

> [!NOTE]
> **Примечание.** В ALTA IDE текущей версии поддерживается только темная тема.

После установки и запуска ALTA IDE откроется главное окно:

![Главное окно](https://docs.owen.ru/book_img/2380/162483.png)

*Главное окно*

Главное окно ALTA IDE содержит:

- [главное меню](#topic-122533): **Файл**, **Онлайн**, **Помощь**;
- [панель инструментов](#topic-122534);
- [дерево проекта](#topic-122535);
- [рабочую область проекта](#topic-122536);
- [окно вывода](#topic-122537);
- [строку состояния](#topic-122538).

Интерфейс ALTA IDE можно настраивать: рабочие окна среды открепляются от главного окна и могут перемещаться независимо от основного окна ALTA IDE.

<a id="topic-122533"></a>

### Главное меню

#### Файл

|   |   |
| --- | --- |
| **[Создать проект](#topic-122541)** | Создание нового проекта |
| **[Открыть проект](#topic-122542)** | Открытие ранее созданного и сохраненного проекта |
| **[Сохранить проект](#topic-122551)** | Сохранение текущего проекта |

#### Онлайн

|   |   |
| --- | --- |
| **[Установить/разорвать соединение](#topic-122555)** | Установка/разрыв соединения с устройством |
| **Настройки соединения** | Вызов окна с настройками соединения |
| **Записать собранный проект в прибор** | Сборка проекта и загрузка приложения в устройство |

#### Помощь

|   |   |
| --- | --- |
| **Справка** | Вызов руководства пользователя ALTA IDE |
| **О программе** | Вызов окна информации о текущей версии ALTA IDE и компонентах среды |

<a id="topic-122534"></a>

### Панель инструментов

#### Панель инструментов

![Панель инструментов апрель 2026](https://docs.owen.ru/book_img/2380/158438.png)

|   |   |   |
| --- | --- | --- |
| ![Создать проект](https://docs.owen.ru/book_img/2380/154617.png) | **[Новый проект](#topic-122541)** | Создание нового проекта. Текущий проект закрывается, перед закрытием будет предложено сохранить проект |
| ![Сохранить проект](https://docs.owen.ru/book_img/2380/154616.png) | **[Сохранить проект](#topic-122551)** | Сохранение текущего проекта. При первом сохранении вызывает окно для присвоения имени файлу |
| ![Открыть проект](https://docs.owen.ru/book_img/2380/154615.png) | **[Открыть проект](#topic-122542)** | Открытие ранее созданного и сохраненного проекта |
| ![Добавить устройство](https://docs.owen.ru/book_img/2380/158437.png) | **Добавить устройство** | Добавить online/offline устройство. Кнопка становится активной только при установке расширения ALTA IDE Конфигуратор |
| ![Сборка проекта](https://docs.owen.ru/book_img/2380/154614.png) | **[Сборка проекта](#topic-122551)** | Выполнение компиляции пользовательского кода в файл с загружаемым приложением |
| ![Установить соединение](https://docs.owen.ru/book_img/2380/154613.png)![Разорвать соединение](https://docs.owen.ru/book_img/2380/154612.png) | **[Установить/разорвать соединение](#topic-122555)** | Установка/разрыв соединения с устройством |
| ![Старт](https://docs.owen.ru/book_img/2380/154610.png)![Стоп](https://docs.owen.ru/book_img/2380/154609.png) | **Старт/Стоп** | Запуск/остановка выполнения приложения |
| ![Режим отладки](https://docs.owen.ru/book_img/2380/154628.png) | **[Онлайн](#topic-122557)** | Запуск режима онлайн |

**Панель отладки** становится активной в случае запуска режима онлайн (значок онлайн становится зеленым):

![Панель отладки](https://docs.owen.ru/book_img/2380/154627.png)

|   |   |   |
| --- | --- | --- |
| ![Продолжить выполнение](https://docs.owen.ru/book_img/2380/154626.png) | **Продолжить выполнение** | Запуск/пауза выполнения программы |
| ![Шаг внутрь](https://docs.owen.ru/book_img/2380/154625.png) | **Шаг внутрь** | Выполнение текущей строки кода. Если в строчке вызывается программный блок, заходит внутрь программного блока |
| ![Шаг наружу](https://docs.owen.ru/book_img/2380/154624.png) | **Шаг наружу** | Продолжает выполнение всего кода текущего программного блока и возврат к строчке кода, откуда произошел переход внутрь программного блока |
| ![Шаг поверх](https://docs.owen.ru/book_img/2380/154623.png) | **Шаг поверх** | Выполнение текущей строки кода. Если в строчке вызывается программный блок, то код программного блока выполняется полностью, без захода внутрь |
| ![Перейти к месту остановки](https://docs.owen.ru/book_img/2380/154622.png) | **Перейти к месту остановки** | Переход к месту остановки выполнения программного кода |
| ![Записать подготовленные значения](https://docs.owen.ru/book_img/2380/154621.png) | **Записать все значения** | Запись подготовленных значений переменных |
| ![Освободить все значения](https://docs.owen.ru/book_img/2380/154620.png) | **Освободить все значения** | Освобождение значений переменных от фиксации. Значения переменных доступны для изменения |
| ![Отключить все точки останова](https://docs.owen.ru/book_img/2380/154619.png) | **Отключить все точки останова** | Отключение всех точек останова в проекте |
| ![Включить все точки останова](https://docs.owen.ru/book_img/2380/154638.png) | **Включить все точки останова** | Включение всех точек останова в проекте |
| ![Удалить все точки останова](https://docs.owen.ru/book_img/2380/154637.png) | **Удалить все точки останова** | Удаление всех точек останова в проекте |

<a id="topic-122535"></a>

### Дерево проекта

Проект в ALTA IDE имеет иерархическую структуру, которая представлена в виде Дерева проекта. Область Дерева проекта располагается слева в главном окне ALTA IDE. В Дереве проекта отображаются компоненты проекта – устройства, системные папки, программные объекты, задачи, узлы протоколов обмена:

![Дерево проекта](https://docs.owen.ru/book_img/2380/155197.png)

*Дерево проекта*

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

![Дерево проекта с мен библиотек](https://docs.owen.ru/book_img/2380/157006.png)

*Системные папки дерева проекта*

![Устройство](https://docs.owen.ru/book_img/2380/154634.png)

**Устройство**

Содержит аппаратные настройки, возможности устройства

![Программные блоки](https://docs.owen.ru/book_img/2380/154633.png)

**[Программные блоки](#topic-122544)**

Содержит созданные программы, функции и функциональные блоки

![Менеджер задач](https://docs.owen.ru/book_img/2380/154632.png)

**[Менеджер задач](#topic-122547)**

Содержит задачи, созданные в рамках проекта

![Коммуникации](https://docs.owen.ru/book_img/2380/154631.png)

**[Коммуникации](#topic-122561)**

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

![Иконка Менеджер библиотек](https://docs.owen.ru/book_img/2380/157005.png)

**[Менеджер библиотек](#topic-122571)**

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

<a id="topic-122536"></a>

### Рабочая область

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

В ALTA IDE возможно управление расположением вкладок в рабочей области. С помощью drag&drop можно изменять порядок вкладок, а также откреплять их от Главного окна для размещения в отдельном окне, выносить на другой экран ПК и при необходимости закреплять обратно.

![Рабочая область](https://docs.owen.ru/book_img/2380/155196.png)

*Рабочая область ALTA IDE*

Значок \* рядом с названием вкладки говорит о несохраненных изменениях во вкладке. При попытке закрыть такую вкладку отобразится информационное окно с предложением сохранить внесенные изменения. В случае выбора "Да" информация, содержащаяся во вкладке сохранится в проекте, при выборе "Нет" данные сохранены не будут.

<a id="topic-122537"></a>

### Окно вывода

В окне вывода отображаются ошибки проекта и ошибки сборки (в том числе возникшие при компиляции).

<a id="topic-122538"></a>

### Строка состояния

Строка состояния располагается в нижней части главного окна ALTA IDE и содержит информацию о статусе и IP-адресе подключенного устройства, а также наличии обновлений:

|   |   |
| --- | --- |
| ![Статус устройства1](https://docs.owen.ru/book_img/2380/154629.png) | не подключено |
| ![Статус устройства2](https://docs.owen.ru/book_img/2380/154658.png) | установка соединения |
| ![Статус устройства3](https://docs.owen.ru/book_img/2380/154657.png) | соединение установлено |
| ![Статус устройства4](https://docs.owen.ru/book_img/2380/154656.png) | ошибка соединения |
| ![Иконка обновлений](https://docs.owen.ru/book_img/2380/154590.jpg) | доступно [обновление](#topic-122531) ALTA IDE |

<a id="topic-122539"></a>

### Сочетания клавиш

**Дерево проекта**

| Сочетание клавиш | Действие |
| --- | --- |
| F2 | Переименовать |
| Delete | Удалить выбранный элемент |
| Enter | Открыть |
| Ctrl + Enter | Открыть справа |

**Работа с проектом**

| Сочетание клавиш | Действие |
| --- | --- |
| Ctrl + N | Создать новый проект |
| Ctrl + О | Открыть существующий проект |
| F4 | Выполнить сборку проекта |

**Редактор ST/Таблица локальных переменных**

| Сочетание клавиш | Действие |
| --- | --- |
| Ctrl + С | Копировать выделенный элемент(ы) в буфер обмена |
| Ctrl + V | Вставить из буфера обмена |
| Ctrl + X | Вырезать выделенный элемент(ы) в буфер обмена |
| Ctrl + Z | Отменить последнее изменение |
| Ctrl + Y | Вернуть (восстановить) отмененное действие |
| Ctrl + А | Выделить все строки |
| Ctrl + S | Сохранить изменения |
| Ctrl + F | Вызов окна поиска/замены |
| Ctrl + Space | Вызвать окно автодополнения |

**Режим онлайн и отладки**

| Сочетание клавиш | Действие |
| --- | --- |
| F5 | Запустить/продолжить выполнение приложения на устройстве |
| F7 | Фиксировать все значения переменных |
| F8 | Шаг внутрь |
| F10 | Шаг поверх |
| Ctrl + F7 | Записать все значения переменных |
| Alt + F7 | Освободить все значения переменных |
| Shift + F10 | Шаг наружу |

**Меню/Помощь**

| Сочетание клавиш | Действие |
| --- | --- |
| F1 | Вызов справки |

<a id="topic-122540"></a>

## Разработка проекта и порядок работы

Для успешной разработки проекта, загрузки на устройство и мониторинга работы приложения в ALTA IDE следует выполнить определенный ряд действий:

- [создание проекта](#topic-122541);
- [разработка программы](#topic-122543);
- [сборка проекта](#topic-122551);
- [подключение устройства к ПК](#topic-122555);
- [запись приложения в прибор](#topic-122556);
- [мониторинг работы приложения в режиме онлайн и отладка программы](#topic-122557).

<a id="topic-122541"></a>

### Создание проекта

После [установки](#topic-122530) и запуска откроется главное окно, в котором доступно создание проекта.

1. **Создать проект** можно одним из способов:

   - воспользуйтесь кнопкой **Создать проект** ![Создать проект](https://docs.owen.ru/book_img/2380/154617.png) на панели инструментов;
   - или пунктом **Главное меню → Файл → Создать проект**.

2. В открывшемся окне введите данные:

   ![Основные настройки проекта](https://docs.owen.ru/book_img/2380/154651.png)

   **Название проекта** — название создаваемого проекта;

   > **Примечание.** При именовании проекта допустимо использование латиницы, кириллицы, а также цифр и символов, исключая специальные символы, запрещённые файловыми системами. Ограничение по длине имени 255 символов. При этом следует учитывать ограничение на путь к файлу в 259 символов. Регистр символов значения не имеет.

   **Директория сохранения проекта** — расположение папки с файлами проекта;

   **Автор проекта** — по умолчанию системное имя пользователя.

   После заполнения всех строк нажмите кнопку **Далее**.

3. Выберите устройство и модификацию:

   ![Создание проекта3](https://docs.owen.ru/book_img/2380/155744.png)

   **Устройство** — из выпадающего списка выберите устройство, для которого разрабатывается проект;

   **Модификация устройства** — из выпадающего списка выберите модификацию устройства;

   **Описание** — после выбора устройства в области описания отобразится изображение устройства и его описание.

4. Нажмите кнопку **Создать**. В [дереве проекта](#topic-122535) отобразится наименование и модификация устройства и обязательные системные папки:

   ![Дерево проекта с мен библиотек](https://docs.owen.ru/book_img/2380/157004.png)

<a id="topic-122542"></a>

#### Открытие проекта

1. **Открыть** ранее сохраненный проект можно одним из способов:

   - воспользуйтесь кнопкой **Открыть проект** ![Открыть проект](https://docs.owen.ru/book_img/2380/154615.png) на панели инструментов;
   - или пунктом **Главное меню → Файл → Открыть проект**.

2. В открывшемся окне выберите файл проекта с расширением *.alta* и нажмите **Открыть**.

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

**Возможные ошибки**

| Ошибка | Визуальное отображение в ALTA IDE | Рекомендации по устранению |
| --- | --- | --- |
| В случае, если компонент проекта был поврежден (например файл, расположенный в папке проекта был удален, или у компонента был изменен тип), то этот компонент отобразится в дереве проекта с иконкой, оповещающей об ошибке: | ![Поврежденный компонент](https://docs.owen.ru/book_img/2380/154649.png) | Для корректной работы приложения рекомендуется удалить такой компонент: нажмите ПКМ на поврежденный компонент в дереве проекта и выберите **Удалить**. |
| Если проект создан в новой версии программы, его открытие в более ранней версии не поддерживается. При попытке открыть такой проект возникнет информационное сообщение. | ![Несовместимая версия](https://docs.owen.ru/book_img/2380/159377.png) | Обновите ALTA IDE до актуальной версии и откройте проект снова. |

<a id="topic-122543"></a>

### Разработка программы

Процесс разработки программы рекомендуется начать с этапа планирования. После формирования перечня задач, которые должны выполняться в рамках программы, следует приступить к [созданию программных объектов](#topic-122545), предназначенных для решения этих задач. Затем созданные программы необходимо привязать к соответствующим задачам, которые [добавляются](#topic-122541) в **Менеджере задач**.

<a id="topic-122544"></a>

#### Программные блоки

Системная папка **Программные блоки** располагается в дереве проекта и позволяет создавать программные объекты:

- **Программа** — высокоуровневый программный объект, привязываемый к задачам устройства. Программы соответствуют крупным фрагментам технологического процесса (например, «управление вентиляцией», «обработка тревог» и т.д.);
- **Функция** — программный объект, возвращающий одно значение;
- **Функциональный блок** — аналог классов из современных языков программирования. Ключевое отличие функциональных блоков от функций в том, что переменные блоков сохраняют свои значения между вызовами. Функциональные блоки используются для создания счетчиков, таймеров и других объектов, которым требуется сохранение данных.

Тип каждого элемента определяется специальной иконкой:

|   |   |
| --- | --- |
| ![Программа](https://docs.owen.ru/book_img/2380/154668.png) | Программа |
| ![Функция](https://docs.owen.ru/book_img/2380/154667.png) | Функция |
| ![Функциональный блок](https://docs.owen.ru/book_img/2380/154666.png) | Функциональный блок |
| ![Привязанная программа](https://docs.owen.ru/book_img/2380/154665.png) | Программа, привязанная к задаче |
| ![Ошибка](https://docs.owen.ru/book_img/2380/154664.png) | Предупреждение. В случае, если рядом с иконкой отображается символ предупреждения, следует навести мышку на иконку - отобразится информационное окно с предупреждением. |

<a id="topic-122545"></a>

##### Действия с программными объектами

###### Добавление POU

Для добавления программного объекта воспользуйтесь контекстным меню системной папки **Программные блоки** в дереве проекта:

![Добавление POU](https://docs.owen.ru/book_img/2380/154663.png)

*Контекстное меню системной папки Программные блоки*

- **Добавить FB** — добавление функционального блока;
- **Добавить FUN** — добавление функции;
- **Добавить PRG** — добавление программы.

Добавленный программный объект отобразится в дереве проекта, как ответвление системной папки Программные блоки:

![Программные блоки в дереве проекта](https://docs.owen.ru/book_img/2380/155542.png)

Созданный программный объект по умолчанию имеет имя \*\_1 (имя зависит от типа объекта). Каждому последующему программному блоку будет присваиваться следующий порядковый номер. Переименование доступно в момент создания, либо через контекстное меню программного блока.

###### Контекстное меню

![КОнтекстное меню программные блоки](https://docs.owen.ru/book_img/2380/155541.png)

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

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

**Переименовать** — изменить имя программного объекта.

**Удалить** — удалить выбранный программный объект.

При выборе данного пункта отобразится диалоговое окно с подтверждением удаления объекта. Выберите **Да** для удаления объекта. Если выбрать **Отмена** объект не будет удален.

Если программа была привязана к задаче, то в случае удаления она будет удалена из системной папки Программные блоки, но останется в Менеджере задач (будет отображаться с ошибкой). Задача к которой выполнена привязка удаленной программы будет подчеркнута красным, при наведении мышки возникнет подсказка с описанием ошибки. Если впоследствии будет создана программа с именем ранее удаленной привязанной программы, привязка к задаче выполнится автоматически.

###### Переименование

Нажмите ПКМ на POU в дереве проекта и выберите пункт **Переименовать**. В предложенной строке введите имя программного объекта в соответствии с [правилами именования языка ST](#topic-122587), убедившись, что выбранное имя не дублирует названия других компонентов в дереве проекта - создание компонентов с одинаковыми именами не допускается.

После переименования новое имя отобразится:

- в дереве проекта;

- в названии вкладки POU;

- в имени программы в редакторе ST.

  ![Переименование1](https://docs.owen.ru/book_img/2380/162497.png)

> [!IMPORTANT]
> **Предупреждение.** Рекомендуется сразу сохранить изменение имени POU с помощью клавиш CTRL+S.

###### Возможные сценарии и рекомендации при переименовании

1. **Расхождение имен компонентов**

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

   ![Переименование2](https://docs.owen.ru/book_img/2380/162496.png)

   Иконка компонента в дереве проекта будет помечена маркером ![Ошибка](https://docs.owen.ru/book_img/2380/158433.png) **Предупреждение**, при наведении на который отобразится сообщение:

   ![Переименование 3](https://docs.owen.ru/book_img/2380/158432.png)

   Для корректной работы необходимо выполнить **синхронизацию имен**. Нажмите ПКМ на компонент с расхождением имен и выберите:

   - **Синхронизировать по имени в дереве** — компоненту будет присвоено имя, отображенное в дереве проекта.
   - **Синхронизировать по имени из редактора** — компоненту будет присвоено имя, отображенное в редакторе ST.
   - **Переименовать** — подтвердите ввод предложенного имени.

2. **Переименование программы, имеющей привязку.**

   Если изменить имя программы, привязанной к задаче, то после переименования программа будет отображаться в системной папке Программные блоки в дереве проекта и будет иметь статус непривязанной. Программа с прежним именем будет отображаться в дереве проекта и во вкладке Менеджер задач, помеченная маркером красного крестика ![Удаленная или переименованная программа](https://docs.owen.ru/book_img/2380/155539.png) "Программа была удалена или переименована". Задача, к которой выполнена привязка переименованной программы будет подчеркнута красным, при наведении мышки возникнет подсказка с описанием ошибки:

   ![Мнеджер задач ошибка](https://docs.owen.ru/book_img/2380/155398.png)

   *Отображение ошибки в дереве проекта*

   Чтобы устранить ошибку, выберите один из вариантов:

   - Отвяжите переименованную программу — в контекстном меню привязанной программы выберите Отвязать программу (Delete). Программа будет удалена из дерева проекта и Менеджера задач.
   - Создайте новую программу с прежним именем — созданная программа автоматически привяжется к задаче.
   - Удалите задачу, связанную с несуществующей программой.

<a id="topic-122546"></a>

##### Редактор ST

Вкладка редактора функции/функционального блока/программы предназначена для написания кода на языке программирования ST. Подробнее правила работы на [**языке ST**](#topic-122585) рассмотрены далее.

Чтобы открыть вкладку редактора ST дважды нажмите ЛКМ на имя программного объекта в дереве проекта, или воспользуйтесь контекстным меню POU:

![Контекстное меню POU](https://docs.owen.ru/book_img/2380/155219.png)

*Контекстное меню POU*

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

Вкладка редактора ST программы

![Вкладка редактор POU](https://docs.owen.ru/book_img/2380/154859.png)

Содержит нередактируемый заголовок **Программа: <имя_программы>**, который является объявлением программы (дополнительно объявлять программу в коде не требуется).

Строка *END_PROGRAM* является обязательной завершающей частью конструкции объявления компонента.

В теле программы расположен блок объявления локальных переменных в текстовом виде.

Вкладка редактора ST функции

![Редактор ST функция](https://docs.owen.ru/book_img/2380/154858.png)

Содержит заголовок **Функция: <имя_функции>**, который является объявлением функции (дополнительно объявлять функцию в коде не требуется), а также тип возвращаемого значения. Сменить тип возвращаемого значения можно в любой момент, для этого начните вводить новое значение — автодополнение предложит возможные варианты.

Строка *END_FUNCTION* является обязательной завершающей частью конструкции объявления компонента.

В теле функции расположен блок объявления локальных переменных в текстовом виде. можно

Вкладка редактора ST функционального блока

![Редактор ST ФБ](https://docs.owen.ru/book_img/2380/154857.png)

Содержит нередактируемый заголовок **Функциональный блок: <имя_фб>**, который является объявлением функционального блока (дополнительно объявлять функциональный блок в коде не требуется).

Строка *END_FUNCTION_BLOCK* является обязательной завершающей частью конструкции объявления компонента.

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

> [!NOTE]
> **Примечание.** В одном POU доступно объявление только одного программного объекта. В случае объявления нескольких программных объектов в одном POU возможны ошибки компиляции.

В ALTA IDE поддержана интеллектуальная подсветка кода, автодополнение и диагностика кода.

###### Автодополнение

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

Окно автодополнения открывается автоматически, в процессе написания кода. При необходимости окно автодополнения можно открыть принудительно, для этого нажмите CTRL + SPACE, если место в коде предполагает наличие вариантов автодополнения, то окно откроется.

![Автодополнение](https://docs.owen.ru/book_img/2380/155218.png)

Из предложенных вариантов с помощью стрелок или мышки выберите нужный, нажмите ЛКМ, либо Enter - слово добавится в код. Если нажать клавишу Tab, то выбранный вариант заменит слово, при написании которого открылось окно автодополнения, включая уже введенные символы.

После добавления слова окно автодополнения закроется автоматически. Также закрыть окно автодополнения можно с помощью клавиши Esc, либо нажатием ЛКМ за пределами окна автодополнения.

###### Диагностика

ALTA IDE выполняет автоматическую проверку кода в редакторе ST, в результате чего фрагменты кода, содержащие ошибки или замечания, отображаются с подчеркиванием. Поддержаны разные варианты оповещений:

| Тип | Отображение в редакторе ST | Отображение информационного сообщения |
| --- | --- | --- |
| Ошибка | ![Подчеркивание ошибка](https://docs.owen.ru/book_img/2380/159376.png) | ![Ошибка](https://docs.owen.ru/book_img/2380/159375.png) |
| Предупреждение | ![Подчеркивание предупреждение](https://docs.owen.ru/book_img/2380/159374.png) | ![Предупреждение](https://docs.owen.ru/book_img/2380/159373.png) |
| Информация | ![Подчеркивание информация](https://docs.owen.ru/book_img/2380/159372.png) | ![Информация](https://docs.owen.ru/book_img/2380/159371.png) |
| Подсказка | ![Подчеркивание подсказка](https://docs.owen.ru/book_img/2380/159370.png) | ![Подсказка](https://docs.owen.ru/book_img/2380/159369.png) |

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

![Тултип с несколькими ошибками в коде](https://docs.owen.ru/book_img/2380/159368.png)

Программный объект, содержащий ошибки в коде, также выделяется в дереве проекта подчеркиванием.

Для устранения ошибки:

1. Найдите подчеркнутый фрагмент.
2. Наведите курсор - прочитайте сообщение.
3. Исправьте код.
4. Убедитесь, что подчеркивание исчезло.

###### Поиск/замена

С помощью сочетания клавиш CTRL+F можно вызвать панель поиска/замены фрагментов текста (слов, символов, фраз) в текущем открытом POU:

![Панель замены поиска](https://docs.owen.ru/book_img/2380/161527.png)

<a id="topic-122547"></a>

#### Менеджер задач

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

![Менеджер задач в дереве проекта](https://docs.owen.ru/book_img/2380/155217.png)

*Менеджер задач в дереве проекта*

Под каждой задачей располагается список привязанных программ (при наличии), которые будут выполняться в рамках задачи. Разрешенное количество привязываемых к задаче программ зависит от прибора. Для того, чтобы свернуть/развернуть список привязанных программ нажмите на стрелку, расположенную слева от имени задачи. Если стрелка отсутствует, значит к задаче не привязано ни одной программы.

Тип задач и вложенных элементов можно определить по иконке в дереве проекта:

![Циклическая задача](https://docs.owen.ru/book_img/2380/154671.png)

[Циклическая задача](#topic-122550)

![Задача по событию](https://docs.owen.ru/book_img/2380/154670.png)

Задача по событию

> [!NOTE]
> **Примечание.** В ALTA IDE текущей версии для создания доступны только циклические задачи.

![Привязанные программы](https://docs.owen.ru/book_img/2380/154669.png)

Программа, привязанная к задаче

В случае возникновения ошибок, иконки помечаются маркерами:

**Возможные ошибки**

| Графическое отображение | Тип ошибки | Варианты устранения ошибки |
| --- | --- | --- |
| ![Задача с ошибкой](https://docs.owen.ru/book_img/2380/155216.png) | Задача содержит ошибку | Наведите мышку для получения подсказки |
| ![Программа привязанная в неск местах](https://docs.owen.ru/book_img/2380/154688.png) | Программа привязана к нескольким задачам | Удалите повторные привязки программы - для корректной работы программа может быть привязана к задаче только один раз |
| ![Удаленная или переименованная программа](https://docs.owen.ru/book_img/2380/154687.png) | Привязанная программа не существует (удалена или переименована) | • Создайте программу с именем удаленной/переименованной программы, она автоматически привяжется к задаче.<br>• Удалите привязку удаленной/переименованной программы к задаче |

При наведении на маркер возникает подсказка с информацией об ошибке и способах исправления.

Чтобы открыть вкладку **Менеджер задач** дважды нажмите ЛКМ на системную папку **Менеджер задач** в дереве проекта, или выберите в контекстном меню пункт **Открыть**:

![Контекстное меню Менеджер задач](https://docs.owen.ru/book_img/2380/155215.png)

Вкладка **Менеджер задач** содержит информацию о созданных задачах, основных настройках, и привязанных программах (при наличии):

![Менеджер задач](https://docs.owen.ru/book_img/2380/154672.png)

*Вкладка Менеджер задач*

- **Задача** — имя созданной задачи и имена программ, привязанных к задаче (при наличии).

- **Тип вызова** — циклическая задача или задача по событию;

  > **Примечание.** В ALTA IDE текущей версии для создания доступны только циклические задачи.

- **Приоритет** — приоритет выполнения задачи (от 5 до 90, в зависимости от типа задачи, где 90 наивысший приоритет).

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

Условием вызова циклической задачи служит истечение заданного интервала времени.

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

1. Выполняется та задача, условия вызова которой выполнены, т.е. прошло указанное время.
2. Если у нескольких задач условия вызова выполнены одновременно, то выполняется задача с наивысшим приоритетом.
3. Если у нескольких задач условия вызова выполняются одновременно, и приоритет одинаков, то порядок выполнения таких задач не определен.
4. Программы одной задачи выполняются в том же порядке, в каком они перечислены в списке **Менеджера задач** и расположены в дереве проекта.
5. Перед выполнением привязанных программ в задаче происходит синхронизация входов компонентов с переменными, используемыми в программах задачи. После выполнения программ происходит аналогичная синхронизация выходов. При каждом старте программы происходит фиксация значений всех переменных проекта, которые были зафиксированы, независимо от того используются ли переменные в выполняемой программе или нет.

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

**Пример**

Многопоточное выполнение задач. Достаточно ресурсов процессора для одновременного выполнения задач:

![Пример1](https://docs.owen.ru/book_img/2380/155214.png)

<a id="topic-122548"></a>

##### Действия с задачами

###### Добавление задачи

Для добавления задачи в проект воспользуйтесь контекстным меню системной папки **Менеджер задач** в дереве проекта: **Добавить CYCLE_TASK**

![Добавление задачи](https://docs.owen.ru/book_img/2380/155109.png)

*Контекстное меню системной папки Менеджер задач*

Добавленная задача отобразится в дереве проекта, как ответвление системной папки **Менеджер задач**:

![Задача ответвление интерфейса](https://docs.owen.ru/book_img/2380/154681.png)

Созданная задача по умолчанию имеет имя task_1 (имя созданного компонента зависит от прибора). Каждой последующей задаче будет присваиваться следующий порядковый номер. Переименование доступно в момент создания, либо через контекстное меню задачи. При задании компоненту имени следует учитывать [правила именования языка ST](#topic-122587), и убедиться, что выбранное имя не дублирует название других компонентов в дереве проекта - создание компонентов с одинаковыми именами не допускается.

В случае, если достигнут лимит добавленных задач, появится сообщение об ошибке:

![Превышен лимит задач](https://docs.owen.ru/book_img/2380/162760.png)

*Информационное окно*

> [!NOTE]
> **Примечание.** Максимальное количество добавленных задач зависит от прибора.

###### Контекстное меню

![Контекстное меню задачи](https://docs.owen.ru/book_img/2380/155540.png)

*Контекстное меню задачи*

С помощью контекстного меню задачи можно выполнить следующие действия:

- **[Добавить привязку программы](#topic-122545)** — привязать программу к задаче.

- **Открыть** — открыть вкладку редактора задачи в рабочей области.

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

- **Удалить** — удалить выбранную задачу.

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

После добавления задачи необходимо [настроить условия выполнения](#topic-122550) и [привязать программы](#topic-122549).

<a id="topic-122549"></a>

##### Привязка программы

Привязать программу к задаче можно несколькими способами:

1. С помощью drag&drop программы в дереве проекта из папки **Программные блоки** в папку:

   - **Менеджер задач → Задача**: привязанная программа добавляется вниз списка;
   - **Менеджер задач → Задача → Программа**: привязанная программа добавляется на место выбранной программы, остальные программы сдвигаются вниз.

2. С помощью контекстного меню элемента **Задача** в дереве проекта, выберите пункт **Добавить привязку программы**.

   В открывшемся окне привязки программы выберите нужную программу, нажмите кнопку **Сохранить**. Привязанная программа добавится вниз списка.

   При выборе программы учитывайте, что у программ, [имеющих расхождение имен](#topic-122545), в списке отображается имя, указанное в редакторе ST:

   ![Переименование4](https://docs.owen.ru/book_img/2380/158436.png)

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

   Для привязки нескольких программ к задаче нажмите и удерживайте кнопку Shift и с помощью ЛКМ выделите программы, которые требуется привязать. Нажмите **Сохранить** — выделенные программы будут привязаны к задаче.

###### Возможные ошибки привязки программы

1. **Лимит привязанных программ.**

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

   ![Превышен лимит программ](https://docs.owen.ru/book_img/2380/162486.png)

   *Информационное окно*

2. **Множественный вызов.**

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

   ![Множественный вызов](https://docs.owen.ru/book_img/2380/162485.png)

   *Отображение множественного вызова*

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

###### Смена порядка вызова привязанных программ

Программы в задаче выполняются в том порядке, в котором они расположены в дереве проекта (перечислены в списке менеджера задач). Порядок выполнения программы в задаче можно сменить методом drag&drop в дереве проекта. Для перетаскивания доступна как одна программа, так и несколько (выбор с помощью удержания кнопки Shift и ЛКМ).

###### Удаление привязки программ

Для удаления привязки программы воспользуйтесь контекстным меню программы, расположенной в дереве проекта в системной папке Менеджер задач:

![Контекстное меню программы](https://docs.owen.ru/book_img/2380/154675.png)

Выберите **Отвязать программу**

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

<a id="topic-122550"></a>

##### Циклическая задача

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

Схема выполнения циклической задачи на ПЛК приведена ниже:

![Схема работы приложения на ПЛК](https://docs.owen.ru/book_img/2380/156635.png)

Блоки, отмеченные звёздочкой (\*), выполняются только при наличии заданных пользователем фиксированных значений переменных. Если фиксированные значения отсутствуют, данные блоки исключаются из цикла.

После [создания задачи](#topic-122548) необходимо задать настройки. Для этого **откройте** окно редактора задачи одним из следующих способов:

- дважды щёлкните ЛКМ по элементу **Задача** в дереве проекта;
- выберите пункт **Открыть** в контекстном меню элемента **Задача** в дереве проекта.

![Настройки циклической задачи](https://docs.owen.ru/book_img/2380/155159.png)

*Настройки циклической задачи*

Заполните:

- **Приоритет** — приоритет выполнения задачи. Число от 5 до 50 со следующими значениями: 50 - самый высокий, 5 – самый низкий приоритет;
- **Период вызова, мкс** — период времени (в микросекундах), после которого задача должна быть вызвана в очередной раз;
- **Ограничить количество вызовов** — поставьте галочку, и введите число, если требуется ограничение количества вызовов задачи;

В случае недопустимого значения любого из параметров окно ввода будет выделено красным цветом:

- поле параметра не может быть пустым;
- введенное значение не соответствует типу данных, допустимый формат ввода целочисленный;
- введенное значение вне диапазона.

При наведении курсора мыши отобразится сообщение с текстом ошибки:

![Ошибка некорректный формат](https://docs.owen.ru/book_img/2380/155158.png)

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

![Привязанные программы](https://docs.owen.ru/book_img/2380/162484.png)

<a id="topic-122551"></a>

### Сохранение и сборка проекта

#### Сохранение проекта

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

1. Через **Главное меню→Файл→Сохранить проект**.
2. Нажатием кнопки **Сохранить проект** ![Сохранить проект](https://docs.owen.ru/book_img/2380/154616.png) на панели инструментов.
3. С помощью [сочетания клавиш](#topic-122539) *Ctrl+S*.

Информация будет сохранена в папку проекта, по пути, указанному при [создании проекта](#topic-122541).

Несохраненные изменения обозначаются в ALTA IDE значком \* рядом с названием вкладки:

![Несохраненные изменения](https://docs.owen.ru/book_img/2380/154718.png)

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

#### Сборка проекта

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

Для **Сборки проекта** нажмите кнопку ![Сборка проекта](https://docs.owen.ru/book_img/2380/154614.png) на панели инструментов. ALTA IDE автоматически выполнит сохранение всех вкладок, в которых произошли изменения. Кнопка перейдет в статус реализации сборки![Отмена сборки проекта](https://docs.owen.ru/book_img/2380/154717.png).

После окончания сборки в папке *.../{Папка с проектом Alta}/Build/dev/out* генерируются три файла:

![Сборка место сохнанения](https://docs.owen.ru/book_img/2380/162495.png)

Информационные сообщения, предупреждения, а также возможные ошибки, возникшие в процессе сборки, будут отображаться в [окне вывода](#topic-122537), расположенном в нижней части основного окна ALTA IDE.

<a id="topic-122552"></a>

## Работа с устройством

Для настройки устройства выполните двойной клик ЛКМ по элементу **Устройство** в дереве проекта, либо воспользуйтесь контекстным меню **Устройства**: выберите пункт **Открыть** или **Открыть справа**. Откроется вкладка с настройками, которая состоит из дерева настройки устройства и рабочей области:

![Вкладка настройки устройства](https://docs.owen.ru/book_img/2380/162480.png)

*Окно Настройка устройства*

Наполнение **Дерева настройки устройства** зависит от устройства.

С помощью контекстного меню элемента **Устройство** в **Дереве проекта** можно выполнить ряд действий:

![Контекстное меню устройства](https://docs.owen.ru/book_img/2380/162481.png)

- **Установить соединение** — установка соединения с устройством;
- **[Настройки соединения](#topic-122555)** — настройка параметров соединения;
- **Открыть** — открытие окна настроек устройства.

<a id="topic-122553"></a>

### Настройка входов/выходов устройства

Настроить входы/выходы устройства можно в окне **Device**. Откройте вкладку одним из способов:

- с помощью двойного клика ЛКМ на элемент **Device** в дереве проекта;
- ПКМ по элементу **Device** — пункт **Открыть** или **Открыть справа**.

В **Дереве настройки устройства** входы/выходы сгруппированы по типам:

![Настройка входов-выходов](https://docs.owen.ru/book_img/2380/160034.png)

> [!NOTE]
> **Примечание.** Наполнение области настройки входов/выходов зависит от устройства.

Для отображения входов/выходов, содержащихся в группе, нажмите на значок ![Развернуть вложенности](https://docs.owen.ru/book_img/2380/154705.png), расположенный перед названием группы.

Если в группе возможен выбор конфигурации входа/выхода, то рядом с названием группы расположен значок ![Шестеренка со стрелочкой](https://docs.owen.ru/book_img/2380/154704.png), который позволяет выбрать конфигурацию из предложенного списка:

![Настройка входов-выходов 1](https://docs.owen.ru/book_img/2380/160033.png)

После выбора конфигурации в рабочей области отобразятся основные настройки входов/выходов для данной конфигурации:

![Таблица настройки входов-выходов](https://docs.owen.ru/book_img/2380/160032.png)

Если для входа/выхода предусмотрена настройка режима, то рядом с названием входа/выхода отображается название режима и треугольный маркер ![Треугольный маркер](https://docs.owen.ru/book_img/2380/160031.png), при нажатии на который откроются доступные для выбора режимы:

![Выбор режима входа-выхода1](https://docs.owen.ru/book_img/2380/160030.png)

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

#### Работа с параметрами

Настройка входов/выходов:

![Настройка входов](https://docs.owen.ru/book_img/2380/155210.png)

**Параметры, доступные для ввода:**

- **Значение/Переменная** — возможен ввод значения или привязка переменной к параметру. При привязке переменной доступно автодополнение;
- **Комментарий** — пользовательский комментарий.

**Поля, заполняемые автоматически (только для просмотра):**

- **Параметр** — наименование параметра;
- **Тип доступа** — чтение/запись;
- **Тип данных** — тип данных параметра;
- **Значение по умолчанию** — значение по умолчанию;
- **Макс. значение** — максимальное значение параметра;
- **Мин. значение** — минимальное значение параметра.

При нажатии на значок ![Сортировка1](https://docs.owen.ru/book_img/2380/160029.png), находящийся в заголовке столбца, осуществляется сортировка по лексикографическому порядку.

<a id="topic-122554"></a>

### Периферия

Наличие и состав раздела **Периферия** зависит от устройства.

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

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

Раздел **Периферия** находится в окне **Device** после списка доступных входов/выходов устройства. Открыть окно **Device** можно одним из способов:

- двойной клик ЛКМ на элемент **Device** в дереве проекта;
- ПКМ по элементу **Device** — пункт **Открыть** или **Открыть справа**.

![Периферия1](https://docs.owen.ru/book_img/2380/160114.png)

#### Работа с параметрами

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

> [!WARNING]
> **Внимание.** Для ПЛК110 поддержка параметров во вкладке **Периферия** реализована не полностью: среда находится в постоянной доработке, и в текущей версии привязка переменных и/или запись значений для части параметров может не применяться.

![Периферия2](https://docs.owen.ru/book_img/2380/160113.png)

**Параметры, доступные для ввода:**

- **Значение/Переменная** — введите значение или привяжите переменную к параметру. При привязке переменной доступно автодополнение;
- **Комментарий** — пользовательский комментарий.

**Поля, заполняемые автоматически (только для просмотра):**

- **Параметр** — наименование параметра;
- **Тип доступа** — чтение/запись;
- **Тип данных** — тип данных параметра;
- **Значение по умолчанию** — значение по умолчанию;
- **Макс. значение** — максимальное значение параметра;
- **Мин. значение** — минимальное значение параметра.

При нажатии на значок ![Сортировка1](https://docs.owen.ru/book_img/2380/160029.png), находящийся в заголовке столбца, осуществляется сортировка по лексикографическому порядку.

<a id="topic-122555"></a>

### Подключение устройства к ПК

Подключите устройство к ПК одним из доступных способов, указанных в Руководстве по эксплуатации прибора.

Подключение к ALTA IDE доступно по интерфейсам:

- USB;
- Ethernet.

> [!WARNING]
> **Внимание.** Модификация и версия прошивки подключенного прибора должна совпадать с загруженным таргетом. В противном случае соединение с устройством не будет установлено. Эти параметры доступны для просмотра в web‑конфигураторе устройства, вкладка Состояние → Обзор.

Для работы в операционной системе Windows следует установить драйвер RNDIS. Драйвер доступен в WEB-конфигураторе на странице **Загрузки** или на сайте [www.owen.ru.](https://owen.ru/product/codesys_v3/software)

#### Настройка соединения

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

1. Выберите:

   - **Главное меню → Онлайн → Настройки соединения**;
   - или нажмите **Настройки соединения** в контекстном меню устройства.

   Откроется окно настроек соединения:

   ![Настройки соединения](https://docs.owen.ru/book_img/2380/162488.png)

   *Окно Настройки соединения*

   > **Примечание.** Предустановленные заводские настройки указаны в Руководстве по эксплуатации прибора. Изменение настроек доступно в web-конфигураторе.

2. Введите данные:

   - Логин;
   - Пароль;
   - IP-адрес;
   - Порт.

3. Нажмите **Установить соединение.**

Если данные введены корректно, то соединение будет установлено, появится всплывающее сообщение об успешной установке соединения, в окне отобразится информация о подключенном устройстве и работе приложения:![Информация о подключенном устройстве](https://docs.owen.ru/book_img/2380/162487.png)

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

![Ошибка соединения](https://docs.owen.ru/book_img/2380/154714.png)

*Уведомление об ошибке*

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

В случае потери соединения с устройством отобразится уведомление:

![Потеря соединения](https://docs.owen.ru/book_img/2380/154712.png)

#### Включение и отключение соединения с прибором

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

- нажатием кнопки **Установить соединение** ![Установить соединение](https://docs.owen.ru/book_img/2380/154613.png) на панели инструментов;
- через контекстное меню элемента **Устройство,** выбрав пункт **Установить соединение**;
- с помощью **Главное меню → Онлайн → Установить соединение**.

**Разорвать соединение** с устройством можно с помощью:

- кнопки ![Разорвать соединение](https://docs.owen.ru/book_img/2380/154612.png) расположенной на панели инструментов;
- контекстного меню элемента **Устройство**, выбрав пункт **Разорвать соединение**;
- **Главное меню → Онлайн → Разорвать соединение**;
- кнопки **Разорвать соединение** в окне **Настройки соединения**.

В дереве проекта и строке состояния отображается статус подключенного устройства:

**Отображение статуса устройства в ALTA IDE**

| Дерево проекта | Строка состояния | Статус |
| --- | --- | --- |
| ![Устройство не подключено](https://docs.owen.ru/book_img/2380/154711.png) | ![Статус не подключено](https://docs.owen.ru/book_img/2380/154710.png) | Не подключено |
| ![Установка соединения](https://docs.owen.ru/book_img/2380/154709.png) | ![Статус подключение](https://docs.owen.ru/book_img/2380/154728.png) | Установка соединения |
| ![Устройство подключено](https://docs.owen.ru/book_img/2380/154727.png) | ![Статус подключено](https://docs.owen.ru/book_img/2380/154726.png) | Соединение установлено |
| ![Ошибка соединения](https://docs.owen.ru/book_img/2380/154725.png) | ![Статус ошибка подключения](https://docs.owen.ru/book_img/2380/154724.png) | Ошибка соединения |

<a id="topic-122556"></a>

### Запись приложения в прибор

Для записи приложения в прибор необходимо убедиться, что:

- устройство [подключено к ПК](#topic-122555);
- соединение установлено.

Если на устройстве запущено выполнение приложения, то выполнение будет остановлено.

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

- с помощью кнопки![Старт](https://docs.owen.ru/book_img/2380/162498.png) на панели инструментов;
- **Главное меню → Онлайн → Записать собранный проект в прибор**.

Перед загрузкой автоматически будет выполнена [сборка проекта](#topic-122551).

Созданное приложение записывается в ПЗУ прибора.

> [!WARNING]
> **Внимание.** Если в подключенном приборе уже есть ранее записанное приложение, то оно заменяется новым.

После окончания загрузки отобразится уведомление об успешной загрузке приложения.

**Возможные ошибки при загрузке приложения**

- потеря связи с устройством;
- файл приложения превышает допустимый размер (максимальный размер исполняемого приложения зависит от доступной памяти в устройстве).

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

<a id="topic-122557"></a>

### Режим онлайн и отладка программы

Режим онлайн служит для мониторинга работы программы с реальными значениями со входов прибора. В режиме онлайн можно устанавливать значения переменных, задавать фиксированные значения на входы и выходы прибора. С помощью установки точек останова можно определять место в программе на котором будет остановлено выполнение и после остановки выполнять код по шагам. В режим онлайн можно перейти только при [подключенном приборе](#topic-122555) и после [записи приложения](#topic-122556) в устройство. Выполнение приложения должно быть запущено.

> [!NOTE]
> **Примечание.** Проект, из которого выполняется переход в режим онлайн, должен быть идентичен проекту, загруженному в устройство.

В режиме онлайн внесение изменений в проект невозможно.

<a id="topic-122558"></a>

#### Переход в режим онлайн

Для запуска режима онлайн:

1. Запустите выполнение приложения кнопкой ![Старт](https://docs.owen.ru/book_img/2380/154610.png) на панели инструментов.
2. Нажмите кнопку перехода в режим онлайн ![Режим отладки](https://docs.owen.ru/book_img/2380/154628.png).

В режиме онлайн иконка ![Режим онлайн зеленый](https://docs.owen.ru/book_img/2380/154719.png) станет зеленого цвета, на панели инструментов появится [панель отладки](#topic-122534). В дереве проекта отобразятся иконки, обозначающие статусы задач:

![Задача выполняется](https://docs.owen.ru/book_img/2380/154685.png)

Задача выполняется

Выполнение задачи в режиме онлайн

![Задача на паузе](https://docs.owen.ru/book_img/2380/154684.png)

Пауза в выполнении задачи

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

![Активная задача](https://docs.owen.ru/book_img/2380/154683.png)

Активная задача

Указывает на задачу в дереве проекта, а также на строку в программном коде, выполняющуюся в данный момент

**Возможные ошибки при переходе в онлайн**

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

   ![Невозможно перейти в режим онлайн](https://docs.owen.ru/book_img/2380/154721.png)

   Загрузите актуальное приложение на устройство и выполните запуск режима онлайн повторно.

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

   ![Ошибка перехода в онлайн](https://docs.owen.ru/book_img/2380/154720.png)

Для **выхода** из режима онлайн, например, чтобы внести корректировки в программу, нажмите кнопку ![Режим онлайн зеленый](https://docs.owen.ru/book_img/2380/154719.png) на панели инструментов.

<a id="topic-122559"></a>

#### Редактор ST в режиме онлайн. Отладка программы

При переходе **в [режим онлайн](#topic-122575)** интерфейс вкладки редактора ST приобретает ряд отличительных особенностей, а в рабочей области отображаются элементы, некоторые из которых доступны только в режиме онлайн:

![ST в режиме онлайн](https://docs.owen.ru/book_img/2380/159145.png)

*Редактор ST в режиме онлайн*

##### Ввод и фиксация значения переменной

1. Для ввода значения переменной дважды нажмите ЛКМ в одном из следующих элементов интерфейса:

   - в коде программы в окне просмотра, предназначенном для ввода значения переменной;
   - в таблице локальных переменных в столбце "Подготовленное значение".

   Откроется окно ввода значения переменной:

   ![Окно ввода значения переменной](https://docs.owen.ru/book_img/2380/154737.png)

2. Введите необходимое значение и нажмите:

   - **Подготовить** — переменная будет подготовлена для последующей записи:

     ![ПОдготовленное значение переменной](https://docs.owen.ru/book_img/2380/155249.png)

     *Отображение подготовленного значения переменной в коде программы*

   - **Записать** — введенное значение будет записано. Также с помощью кнопки **Записать** можно записать ранее подготовленное значение переменной.

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

     > **Примечание.** Значение некоторых переменных зафиксировать невозможно (например, временные переменные). В этом случае чекбокс **Фиксировать значение** будет отсутствовать.

     Фиксированное значение можно как подготовить так и записать:

     - ![Подготовить фиксированное значение](https://docs.owen.ru/book_img/2380/155248.png)

       *Отображение зафиксированного подготовленного значения переменной в коде программы*

       При последующей записи подготовленное фиксированное значение также запишется с фиксацией;

     - ![Записать фиксированное значение](https://docs.owen.ru/book_img/2380/155247.png)

       *Отображение зафиксированного значения в коде программы*

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

Чтобы закрыть окно ввода переменной нажмите Esc или ЛКМ в любой области вне окна.

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

![Контекстное меню переменной из таблицы переменных](https://docs.owen.ru/book_img/2380/159143.png)

Записать **все** подготовленные значения переменных можно:

- с помощью кнопки ![Записать подготовленные значения](https://docs.owen.ru/book_img/2380/154621.png) на панели отладки;
- или **Главное меню → Отладка → Записать все значения**.

Зафиксировать значения **всех** переменных в проекте можно с помощью **Главное меню→Отладка →Фиксировать все значения****.**

Снять фиксацию значений у **всех** переменных в проекте можно:

- с помощью кнопки ![Освободить все значения](https://docs.owen.ru/book_img/2380/154620.png) на панели отладки;
- или **Главное меню → Отладка → Снять фиксацию у всех переменных**.

##### Точки останова

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

![Точки останова](https://docs.owen.ru/book_img/2380/155245.png)

**Установить точку останова** можно одним из следующих способов:

- наведите курсор мыши на маркер возможного места установки ![Место установки точки останова](https://docs.owen.ru/book_img/2380/154730.png) слева от программного кода и нажмите ЛКМ;
- нажмите кнопку ![Включить все точки останова](https://docs.owen.ru/book_img/2380/155244.png) на [панели отладки](#topic-122534) или выберите **Главное меню→Отладка →Включить все точки останова** — **все** точки останова в программе будут установлены;
- откройте контекстное меню точки останова слева от программного кода и выберите **Активировать**.

> [!NOTE]
> **Примечание.** Точки останова можно установить не во всех местах кода. Возможные места обозначены маркером места установки.

**Удалить** включенные или отключенные точки останова можно одним из следующих способов:

- наведите курсор мыши на точку останова слева от программного кода и нажмите ЛКМ;
- нажмите на кнопку ![Место установки точки останова](https://docs.owen.ru/book_img/2380/154730.png) на [панели отладки](#topic-122534) или выберите **Главное меню→Отладка →Удалить все точки останова** — **все** точки останова в программе будут удалены;
- откройте контекстное меню точки останова слева от программного кода и выберите **Удалить**.

**Отключить** установленные точки останова можно одним из следующих способов:

- нажмите на кнопку ![Отключить все точки останова](https://docs.owen.ru/book_img/2380/155243.png) на [панели отладки](#topic-122534) или выберите **Главное меню→Отладка →Отключить все точки останова** — **все** точки останова в программе будут отключены;
- откройте контекстное меню Точки останова слева от программного кода и выберите **Отключить**.

**Включить** отключенную точку останова можно с помощью контекстного меню точки останова слева от программного кода: выберите пункт **Включить**.

При переходе в режим онлайн некоторые включенные и отключенные точки останова могут стать заблокированными ![Точка останова заблокирована](https://docs.owen.ru/book_img/2380/159144.png). На заблокированных точках выполнение кода останавливаться не будет.

##### Пошаговая отладка

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

1. Чтобы перейти к месту остановки выполнения программного кода:

   - нажмите кнопку ![Перейти к месту остановки](https://docs.owen.ru/book_img/2380/154622.png) на панели отладки;
   - или выберите **Главное меню → Отладка → Перейти к месту остановки**.

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

2. Для возобновления выполнения приложения после остановки нажмите кнопку ![Продолжить выполнение](https://docs.owen.ru/book_img/2380/154626.png) на панели отладки, или используйте команды для пошагового выполнения программы расположенные на панели отладки, либо в **Главном меню → Отладка**:

![Шаг внутрь](https://docs.owen.ru/book_img/2380/154625.png)

Шаг внутрь

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

![Шаг наружу](https://docs.owen.ru/book_img/2380/154624.png)

Шаг наружу

Продолжает выполнение всего кода текущего программного блока и возврат к строчке кода, откуда произошел переход внутрь программного блока

![Шаг поверх](https://docs.owen.ru/book_img/2380/154623.png)

Шаг поверх

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

<a id="topic-122560"></a>

#### Таблица локальных переменных

Переменные проекта отображаются в таблице переменных, которая доступна для просмотра только в **режиме онлайн**:

![Таблица локальных переменных](https://docs.owen.ru/book_img/2380/155242.png)

*Таблица локальных переменных*

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

Таблица переменных содержит:

**Имя** — имя переменной в коде программы;

**Тип данных** — один из типов: BYTE, WORD, DWORD, INT, DINT, REAL, STRING80, STRING21. См. подробнее раздел [**Типы переменных**](#topic-122616)

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

**Подготовленное значение** — значение, которое будет присвоено переменной после команды записи переменной.

Чтобы **задать значение переменной** дважды нажмите ЛКМ в столбце подготовленное значение. Откроется окно ввода данных. Подробно работа в окне ввода данных описана в разделе [Редактор ST в режиме онлайн. Отладка программы](#topic-122559).

##### Отображение вложенных переменных

Переменные типа **структур** и **массивов** и другие составные типы (родительские переменные), которые содержат вложенные данные (дочерние переменные) , отображаются в таблице переменных с маркером вложенности перед именем: ![Переменная с вложенностями](https://docs.owen.ru/book_img/2380/154748.png)

- **Родительская переменная** — это переменная составного типа, включающая в себя другие переменные.
- **Дочерние переменные** — это отдельные элементы, входящие в состав родительской переменной, например поля структуры или элементы массива.

Чтобы развернуть отображение дочерних переменных нажмите на значок ![Развернуть вложенности](https://docs.owen.ru/book_img/2380/154705.png), в таблице отобразятся вложенные переменные, которые также могут содержать дочерние переменные.

##### Контекстное меню переменной

Чтобы открыть контекстное меню переменной нажмите ПКМ на любую ячейку в таблице переменных:

![Контекстное меню переменной из таблицы переменных](https://docs.owen.ru/book_img/2380/159142.png)

**Снять фиксацию** - освобождение значения переменной от фиксации.

**Очистить подготовленное значение** - удаление подготовленного значения переменной.

Выделение нескольких переменных доступно с помощью удерживания клавиши Shift+ЛКМ - последовательное выделение, либо клавиши Ctrl+ЛКМ - выборочное выделение строк. Выделить все строки с переменными можно с помощью сочетания клавиш Ctrl+А.

<a id="topic-122561"></a>

### Modbus

Modbus – открытый коммуникационный протокол, основанный на архитектуре Master-Slave (ведущий-ведомый).

Master (ведущее устройство) - является инициатором обмена и может считывать и записывать данные в slave-устройства.

Slave (подчиненное устройство) - отвечает на запросы master-устройства, но не может самостоятельно инициировать обмен.

В ALTA IDE используются две основные реализации протокола:

1. **Modbus Serial** для передачи данных с использованием последовательных интерфейсов (самый распространенный RS-485). Имеет два режима передачи данных:

   - **Modbus RTU** - передача данных в бинарном виде;
   - **Modbus ASCII** - передача данных в виде ASCII символов;

2. **Modbus TCP** для передачи данных через сети TCP/IP (чаще всего используется Ethernet).

Устройства в режиме Slave определяют протокол в зависимости от выбранного интерфейса: UART или TCP. Для устройств в режиме Master необходимо выбрать протокол при добавлении.

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

В случае использования протокола **Modbus Serial** в сети может присутствовать только одно master-устройство и несколько slave-устройств. В ALTA IDE Slave-устройства не поддерживают широковещательную рассылку.

В сети **Modbus TCP** на один IP-порт можно подключить до 255 опрашиваемых устройств. Кроме того, устройство может одновременно выполнять функции master и slave.

Запрос master-устройства к slave-устройству содержит:

- **Slave ID** — адрес slave-устройства;
- **Код функции** — применяемый к slave-устройству;
- **Данные** – адрес первого регистра и их количество (в случае записи – также записываемые значения).
- **Контрольную сумму** — для проверки целостности доставленного пакета.

Ответ slave-устройства имеет схожую структуру.

Запрос master-устройства представляет собой обращение к одной из областей памяти slave-устройства с помощью определенной функции. Область памяти характеризуется типом хранящихся в ней значений (биты/регистры) и типом доступа (только чтение или чтение и запись).

Спецификация Modbus определяет следующие варианты размещения данных в памяти slave-устройств:

- независимые области памяти;
- общая область памяти.

В ALTA IDE поддержан вариант с общей областью памяти: к одним и тем же данным можно получить доступ с помощью нескольких функций Modbus.

Для конфигурируемых устройств производитель предоставляет карту регистров, в которой содержится информация об адресах и типах параметров устройства. Для программируемых устройств пользователь [формирует такую карту самостоятельно](#topic-122567) с помощью среды разработки. Существуют устройства, в которых сочетаются оба рассмотренных случая – у карты регистров есть фиксированная часть, которую можно дополнить в соответствии со своей задачей (но адреса ячеек не должны пересекаться).

> [!NOTE]
> **Примечание.** В некоторых устройствах области памяти наложены друг на друга (например, 0x и 4x) – т. е. есть возможность обращаться разными функциями к одним и тем же ячейкам памяти.

**Функция** определяет операцию (чтение/запись) и область памяти, с которой эта операция будет произведена. Ниже приведен список наиболее часто используемых функций:

**Основные функции протокола Modbus**

| Код функции | Имя функции | Выполняемая команда |
| --- | --- | --- |
| 3 (0х03) | Read Holding Registers | Чтение значений из регистров хранения |
| 4 (0х04) | Read Input Registers | Чтение значений из регистров ввода |
| 6 (0х06) | Write Single Register | Запись значения в один регистр хранения |
| 16 (0х10) | Write Multiple Registers | Запись значений в несколько регистров хранения |

Настройка обмена по протоколу Modbus в ALTA IDE представлена на схеме ниже:

![Схема Модбас](https://docs.owen.ru/book_img/2380/156618.png)

<a id="topic-122562"></a>

#### Modbus Serial/TCP

Ниже приведены общие разделы, описывающие работу с протоколами **Modbus Serial** и **Modbus TCP**.

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

<a id="topic-122563"></a>

##### Modbus Serial/TCP Master

Для добавления устройства в режиме **Master**:

1. Выберите **Добавить Modbus Master TCP/Добавить Modbus Serial Master** в контекстном меню системной папки **Коммуникации** в дереве проекта:

   ![Modbas Serial TCP](https://docs.owen.ru/book_img/2380/156640.png)

   *Добавление Modbus Master*

   Добавленное устройство по умолчанию имеет имя modbusmaster\*\_1 (имя зависит от выбранного протокола). Каждому последующему устройству будет присваиваться следующий порядковый номер. **Переименование** доступно в момент создания, либо через контекстное меню компонента. При задании устройству имени следует учитывать [правила именования языка ST](#topic-122587), и убедиться, что выбранное имя не дублирует название других компонентов в дереве проекта - создание компонентов с одинаковыми именами не допускается.

   После добавления Modbus Master устройство появится в дереве проекта, как ответвление системной папки:

   ![Modbus Master в дереве проекта](https://docs.owen.ru/book_img/2380/156639.png)

   *Modbus Master в дереве проекта*

2. Откройте вкладку редактора Modbus Master:

   - двойным кликом ЛКМ на элемент Modbus Master в дереве проекта;
   - выберите пункт **Открыть** в контекстном меню элемента Modbus Master в дереве проекта.

3. Настройте параметры соединения во вкладке редактора Modbus Master:

   ![Параметры соединения Мастер](https://docs.owen.ru/book_img/2380/156324.png)

   *Настройка параметров соединения*

   **Состояние протокола** — определяет режим работы Master-устройства при запуске приложения. В зависимости от положения переключателя отправляет/не отправляет запросы к slave-устройствам;

   **Таймаут, мс** — время ожидания ответа от slave-устройства, допустимый диапазон от 20 до 6000 мс. Значение, введенное здесь, будет по умолчанию использоваться для всех slave-устройств, если в редакторе Modbus Slave Device не введены индивидуальные значения данного параметра;

   **Количество попыток** — число повторных попыток установить связь со slave-устройством при отсутствии ответа. Значение, введенное здесь, будет по умолчанию использоваться для всех slave-устройств, если в редакторе Modbus Slave Device не введены индивидуальные значения данного параметра;

   **Пауза между запросами, мс** — интервал ожидания перед формированием следующего запроса;

   **Использовать параллельный опрос** (только для <b>**Modbus Master TCP**</b>) — возможность выполнять параллельный опрос нескольких slave-устройств для повышения скорости обмена.

4. Таблица **список устройств** формируется автоматически при [добавлении slave-устройств](#topic-122564) к master-устройству, и содержит следующие столбцы:

   ![Список устройств TCP](https://docs.owen.ru/book_img/2380/156323.png)

   *Таблица список устройств Modbus Master*

   **IP-Адрес** (только для **Modbus Master TCP**) — сетевой адрес устройства, диапазон значений от 0.0.0.0 до 255.255.255.255;

   **Порт** (только для **Modbus Master TCP**) — порт, используемый для обмена, диапазон значений от 0 до 65535 (по умолчанию - 502);

   **Slave ID** — адрес slave-устройства в сети Modbus, диапазон значений от 0 до 255;

   **Имя** — отображаемое имя устройства в дереве проекта;

   **Опрос устройства** — состояние опроса устройства (включен/отключен), определяемое в настройках соответствующего slave-устройства.

   **Комментарий** — пользовательский комментарий.

   Для сортировки данных нажмите на значок ![Сортировка](https://docs.owen.ru/book_img/2380/154699.png) в заголовке столбца.

   Редактирование параметров в таблице невозможно. Чтобы внести изменения, перейдите во вкладку соответствующего **Modbus Slave Device** и задайте необходимые значения. Данные в таблице **Список устройств** обновятся автоматически.

###### Добавление интерфейса подключения UART для Modbus Serial Master

Для устройства **Modbus Serial Master** необходимо выбрать и добавить аппаратный интерфейс.

> [!WARNING]
> **Внимание.** Нельзя добавлять один и тот же интерфейс UART одновременно к компоненту Serial Master и Slave. Такое назначение приведет к отсутствию обмена по сети у одного из устройств. 

1. **Добавьте интерфейс** с помощью контекстного меню компонента **Modbus Serial Master** в дереве проекта:

   ![Добавление UART](https://docs.owen.ru/book_img/2380/156638.png)

    *Добавление интерфейса UART*

   После добавления интерфейс отобразится в дереве проекта, как ответвление компонента **Modbus Serial Master**:

   ![UART в дереве проекта](https://docs.owen.ru/book_img/2380/156637.png)

   *Интерфейс UART в дереве проекта*

2. **Откройте** вкладку редактора UART:

   - двойным кликом ЛКМ на элемент UART в дереве проекта;
   - выберите пункт **Открыть** в контекстном меню элемента UART в дереве проекта.

3. **Настройте** интерфейс во вкладке редактора UART:

   ![UART Master](https://docs.owen.ru/book_img/2380/156636.png)

   *Настройки интерфейса UART*

   **Режим передачи** — выберите из выпадающего списка режим передачи данных RTU/ASCII;

   **Скорость, бит/с** — выберите из выпадающего списка скорость, с которой будет осуществляться передача данных.

   **Чётность** — параметр, отображающий использование бита четности в посылке Modbus. Выберите из выпадающего списка:

   - NONE – отсутствует;
   - EVEN – проверка на четность;
   - ODD – проверка на нечетность.

   **Биты данных** — выберите из выпадающего списка число бит данных. Возможные значения: 7 или 8.

   **Стоп биты** — выберите из выпадающего списка количество стоповых бит в посылке Modbus. Возможные значения: 1, 1.5 или 2.

К устройству **Modbus Serial Master** может быть добавлен только один интерфейс UART. В случае попытки добавить еще один интерфейс появится всплывающее окно с информацией об ошибке. Для замены интерфейса удалите установленный UART и добавьте новый.

**Удалить** и **Переименовать** интерфейс возможно с помощью контекстного меню элемента UART в дереве проекта.

<a id="topic-122564"></a>

##### Modbus Slave Device Serial/TCP

Для добавления slave-устройства к master-устройству:

1. Откройте контекстное меню master-устройства в дереве проекта и выберите **Добавить Modbus Slave Device TCP/Добавить Modbus Serial Slave Device**:

   ![Добавить к мастеру слейв](https://docs.owen.ru/book_img/2380/154741.png)

   *Добавление Modbus Slave Device TCP*

   ![Добавление Слейв к Сериал](https://docs.owen.ru/book_img/2380/156844.png)

   *Добавление Modbus Serial Slave Device*

   Добавленное устройство по умолчанию имеет имя modbusdevice\*\_1 (имя зависит от выбранного протокола). Каждому последующему устройству будет присваиваться следующий порядковый номер. **Переименование** доступно в момент создания, либо через контекстное меню компонента. При задании устройству имени следует учитывать [правила именования языка ST](#topic-122587), и убедиться, что выбранное имя не дублирует название других компонентов в дереве проекта - создание компонентов с одинаковыми именами не допускается.

   После добавления slave-устройство отобразится в дереве проекта, как ответвление компонента Modbus Master:

   ![Слейвы в дереве проекта](https://docs.owen.ru/book_img/2380/156843.png)

   *Modbus Device в дереве проекта*

2. Откройте вкладку редактора Modbus Slave Device:

   - двойным кликом ЛКМ на элемент Modbus Slave Device в дереве проекта;
   - выберите пункт **Открыть** в контекстном меню элемента Modbus Slave Device в дереве проекта.

3. Настройте параметры соединения и параметры обмена во вкладке редактора Modbus Slave Device:

   ![Modbus TCPSlave](https://docs.owen.ru/book_img/2380/156198.png)

   *Вкладка редактора Modbus Slave Device TCP*

   **Параметры соединения:**

   **Опрос устройства** — состояние опроса устройства (включен/отключен). При отключенном опросе master-устройство не посылает запросы slave-устройству;

   **Период опроса** — временной интервал, через который повторяется опрос. Допустимый диапазон от 0 до 6000 мс;

   **Slave ID** — адрес slave-устройства в сети Modbus, диапазон значений от 0 до 255;

   **IP-Адрес** (только для **Modbus Slave Device TCP**) — сетевой адрес устройства, диапазон значений от 0.0.0.0 до 255.255.255.255;

   **Порт** (только для **Modbus Slave Device TCP**) — порт, используемый для обмена, диапазон значений от 1 до 65535 (по умолчанию - 502);

   **Комментарий** — пользовательский комментарий. Отображается в таблице **Список устройств** вкладки редактора Modbus Master.

   **Параметры обмена:**

   **Использовать параметры обмена из мастера** — в случае установки чекбокса внесение данных будет недоступно, будут использованы значения, введенные во вкладке редактора Modbus Master. Если чекбокс отключен, для устройства будут использоваться индивидуальные параметры обмена:

   **Таймаут, мс** — время ожидания ответа от slave-устройства, допустимый диапазон от 20 до 6000 мс.

   **Количество попыток** — число повторных попыток установить связь со slave-устройством при отсутствии ответа, допустимый диапазон от 0 до 3.

4. Заполните карту тегов.

   Карта тегов сопоставляет переменные с регистрами Modbus (адресами). Один тег может включать несколько регистров.

   Настройте общие для всей карты тегов параметры:

   **Порядок регистров** — настройка порядка слов и порядка байт для передачи master-устройству.

   **Добавить** теги можно одним из способов:

   1. Нажмите кнопку **Добавить теги**. Откроется окно создания тегов:

      ![Создание тегов Девайс](https://docs.owen.ru/book_img/2380/155359.png)

      - **Адрес начального регистра** — задает адрес начального регистра, адреса задаются начиная с указанного. Доступен ввод в десятеричном и шестнадцатеричном формате (с префиксом 16# и 0х);
      - **Тип данных** — тип данных тега;
      - **Функция** — определяет операцию (чтение/запись) и область памяти, с которой эта операция будет произведена. Список функций, поддерживаемых в ALTA IDE приведен в [разделе Modbus](#topic-122561);
      - **Количество тегов** — количество тегов, которое требуется создать.

      Нажмите кнопку **Создать**. В карте тегов отобразится информация, согласно введенным данным.

   2. Нажмите кнопку "+" расположенную в столбце **Адрес** таблицы тегов.

      ![Таблица регистров плюс](https://docs.owen.ru/book_img/2380/155537.png)

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

5. При необходимости **отредактируйте** значения в таблице тегов

   |   |   |   |
   | --- | --- | --- |
   | **Адрес** | ![DEX HEX](https://docs.owen.ru/book_img/2380/155357.png) | В поле адрес указывается диапазон регистров, которые занимает созданный тег.<br>**Для переключения формата ввода (DEC/HEX)** — нажмите на заголовок столбца Адрес и выберите нужное значение из выпадающего списка.<br>**Для редактирования значения** — дважды нажмите ЛКМ по ячейке и введите новое значение |
   | **Тип данных** | ![Тип данных](https://docs.owen.ru/book_img/2380/155356.png) | Кликните ЛКМ по ячейке и выберите из выпадающего списка нужное значение |
   | **Функция** | ![Функция](https://docs.owen.ru/book_img/2380/155355.png) | Кликните ЛКМ по ячейке и выберите из выпадающего списка нужное значение<br>Список функций, поддерживаемых в ALTA IDE приведен в [разделе Modbus](#topic-122561) |
   | **Значение/Переменная** | ![Переменная](https://docs.owen.ru/book_img/2380/155354.png) | Дважды нажмите ЛКМ по ячейке и введите новое значение или привяжите переменную:<br>• привязка переменной-входа для чтения регистра в программе;<br>• привязка переменной-выхода для записи регистра из программы;<br>• ввод значения (константы) для записи регистра |
   | **Комментарий** | ![Комментарий](https://docs.owen.ru/book_img/2380/155353.png) | Дважды нажмите ЛКМ по ячейке и введите пользовательский комментарий |

   Для сортировки данных нажмите на значок ![Сортировка](https://docs.owen.ru/book_img/2380/155352.png) в заголовке столбца.

6. **Удалить** тег можно с помощью контекстного меню тега в карте тегов:

   ![Удалить регистр TCP](https://docs.owen.ru/book_img/2380/155351.png)

> [!NOTE]
> **Примечание.** Созданные теги будут опрашиваться в порядке добавления в карту тегов, а не по возрастанию адресов.

Для переменных типа BYTE, WORD, DWORD и LWORD доступен просмотр и редактирование битовой маски. Подробно работа с битовой маской описана в разделе [Битовая маска](#topic-122568).

<a id="topic-122565"></a>

#### Режим Slave

**Добавить** устройства в режиме Slave можно с помощью контекстного меню системной папки **Коммуникации** в дереве проекта:

![Добавление слейва](https://docs.owen.ru/book_img/2380/154767.png)

*Контекстное меню системной папки Коммуникации*

Добавленное устройство по умолчанию имеет имя modbusslaveCE_1. Каждому последующему устройству будет присваиваться следующий порядковый номер. Переименование доступно в момент создания, либо через контекстное меню устройства. При задании компоненту имени следует учитывать [правила именования языка ST](https://confluence.owen.ru/pages/viewpage.action?pageId=10500424), и убедиться, что выбранное имя не дублирует название других компонентов в дереве проекта - создание компонентов с одинаковыми именами не допускается.

Выберите **Добавить Modbus Slave**, устройство появится в дереве проекта, как ответвление системной папки:

![Slave в дереве проекта](https://docs.owen.ru/book_img/2380/154766.png)

*Устройство Modbus Slave в дереве проекта*

Выбор протокола не требуется - в режиме Slave протокол определяется в зависимости от выбранного интерфейса: UART или TCP.

<a id="topic-122566"></a>

##### Настройка параметров Modbus Slave

1. Откройте вкладку редактора Modbus Slave:

   - двойным кликом ЛКМ на элемент ModbusSlave в дереве проекта;
   - выберите пункт **Открыть** в контекстном меню элемента Modbus Slave в дереве проекта.

2. Введите настройки:

   ![Параметры соединения Modbus Slave](https://docs.owen.ru/book_img/2380/154765.png)

   **Настройка параметров соединения**

   - **Состояние протокола** — включение/выключение протокола Modbus. В случае выключения протокол не будет обрабатывать входящие запросы.
   - **Slave ID** — адрес устройства в сети Modbus. Допустимый диапазон от 0 до 255.
   - **Задержка ответа, мс** — пауза перед ответом на запрос от master-устройства.

   **Настройка сторожевого таймера обмена**

   Сторожевой таймер обмена позволяет отслеживать наличие запросов от master-устройства. В случае отсутствия запроса от master-устройства в течение указанного времени генерируется ошибка, которая отобразится в дереве проекта пиктограммой ![Ошибка](https://docs.owen.ru/book_img/2380/154664.png).

   ![Сторожевой таймер Modbus Slave](https://docs.owen.ru/book_img/2380/154764.png)

   - **Состояние таймера** — включение/выключение сторожевого таймера обмена.
   - **Таймаут, мс** — время ожидания запроса от master-устройства.

3. Заполните [карту тегов](#topic-122567).

<a id="topic-122567"></a>

##### Карта тегов

**Тег** — это переменная в проекте, которая привязывается к одному или нескольким **регистрам Modbus** (ячейкам памяти с конкретным адресом) и имеет заданный тип данных, правила упаковки (порядок слов/байт) и назначение (чтение/запись).

Карта тегов сопоставляет переменные с регистрами Modbus (адресами).

###### Правила выравнивания

В ALTA IDE происходит автоматическое выравнивание переменных, в зависимости от их типа, при размещении в области памяти устройства, согласно правилам приведенным в таблице:

**Правила размещения переменных в карте тегов**

| Тип данных | Размер, байт | Количество занимаемых регистров | Адрес первого регистра |
| --- | --- | --- | --- |
| BYTE | 1 | 1 | в любом месте карты |
| WORD | 2 | 1 | в любом месте карты |
| DWORD | 4 | 2 | должен быть кратен 2 (в т.ч. 0) |
| INT | 2 | 1 | в любом месте карты |
| DINT | 4 | 2 | адрес первого регистра должен быть кратен 2 (в т.ч. 0) |
| REAL | 4 | 2 | адрес первого регистра должен быть кратен 2 (в т.ч. 0) |
| STRING80 | 80 | 41 | в любом месте карты |
| STRING21 | 21 | 11 | в любом месте карты |

Правила размещения основаны на организации физической памяти таким образом, что переменные размером 8 бит (1 байт) , 2 байта, и 4 байта должны располагаться только по определенным адресам. Адрес 4-байтной переменной должен быть кратен 4, 2-байтной – кратен 2, а однобайтной (или 8 битной) – кратен 1 и может находиться в любой точке области памяти.

Если представить область памяти с возрастающими адресами (от 0 до какого-либо числа) и расположить переменные, то, если первая переменная имеет размер 1 байт, она будет расположена по адресу 0х0000, следующая – 0х0001 и т.д. Если дальше идет 4-байтная переменная, она должна располагаться по адресу 0х0004, т.е. кратному 4, и т.д. При этом, если однобайтная переменная заняла место, кратное четырем, следующая 4- байтная переменная занимает следующее кратное четырем место. Порядок задания переменных может быть произвольным, выравнивание же ставит переменные на кратные их длине адреса. Соответственно, при таком порядке размещения переменных неизбежно возникают не занятые пространства памяти, которые нигде не отображаются, не видны в области ввода/вывода, но обязательно должны учитываться пользователем: когда производится опрос прибора извне для получения информации, размещенной по конкретному адресу (регистру). Пользователь должен учитывать особенность выравнивания, чтобы не получить некорректную информацию, причем должен учитывать еще на стадии задания переменных.

![Расположение переменных в памяти устройства](https://docs.owen.ru/book_img/2380/155536.png)

*Пример расположения переменных в карте тегов с учетом правила выравнивания*

###### Заполнение карты тегов

Заполнение карты тегов slave-устройства включает в себя определение назначения тега, присвоение ему адреса и заполнение данными, которые будут доступны для чтения, записи или чтения/записи master-устройством.

1. Заполните общие для всей карты тегов данные:

   - **Начальный адрес** — задает начальный адрес регистра для всей карты. Доступен ввод в десятеричном и шестнадцатеричном формате (с префиксом 16# и 0х). В случае ввода начального адреса после заполнения карты тегов, адреса автоматически пересчитаются и будут отображены в таблице согласно введенным данным. Если при вводе нового начального адреса при пересчете будут обнаружены недопустимые адреса регистров, появится сообщение об ошибке.
   - **Порядок регистров** — настройка порядка регистров для передачи master-устройству.
   - **Порядок байт** — настройка порядка байт для передачи master-устройству.

2. Нажмите кнопку **Добавить теги**, откроется окно создания тегов:

   ![Окно создания регистров](https://docs.owen.ru/book_img/2380/155350.png)

   - **Адрес начального регистра** — не доступен для ввода. Автоматически рассчитывается с учетом ранее добавленных тегов и правила выравнивания. В случае создания первого тега - соответствует адресу, введенному в поле Начальный адрес (по умолчанию 0).
   - **Тип данных** — тип данных тега.
   - **Количество тегов** — количество тегов, которое требуется создать.

3. Нажмите кнопку **Создать**. В таблице отобразится информация, согласно введенным данным. Созданные теги располагаются в следующих доступных для размещения регистрах с учетом правил выравнивания.

   ![Карта тегов Slave](https://docs.owen.ru/book_img/2380/156203.png)

   *Пример заполнения карты тегов*

4. **Отредактируйте** значения в таблице тегов:

   |   |   |   |
   | --- | --- | --- |
   | Адрес | ![Выбор DEX HEX](https://docs.owen.ru/book_img/2380/155368.png) | В поле адрес указывается диапазон регистров, которые занимает созданный тег.<br>**Для переключения формата ввода (DEC/HEX)** - нажмите на заголовок столбца **Адрес** и выберите нужное значение из выпадающего списка.<br>**Редактирование** адреса недоступно |
   | Записать в переменную | ![Записать в переменную](https://docs.owen.ru/book_img/2380/156202.png) | Дважды нажмите ЛКМ по ячейке и привяжите переменную для записи тега.<br>Синхронизация переменной и тега происходит при синхронизации входов задачи |
   | Значение/Переменная | ![Прочитать из переменной](https://docs.owen.ru/book_img/2380/156201.png) | Дважды нажмите ЛКМ по ячейке и введите новое значение или привяжите переменную:<br>• привязка переменной для чтения тега;<br>• ввод значения (константы).<br>Синхронизация переменной/значения и тега происходит при синхронизации выходов задачи |
   | Права мастера | ![Права мастера](https://docs.owen.ru/book_img/2380/155365.png) | Уровень прав доступа, который предоставляется master-устройству для работы с тегом.<br>Нередактируемое поле<br>Список функций, поддерживаемых в ALTA IDE приведен в разделе [Modbus](#topic-122561) |
   | Тип данных | ![Тип данных слейв](https://docs.owen.ru/book_img/2380/155364.png) | Нередактируемое поле |
   | Комментарий | ![Комментарий](https://docs.owen.ru/book_img/2380/155363.png) | Дважды нажмите ЛКМ по ячейке и введите пользовательский комментарий |

5. **Добавить теги** на определенный адрес можно с помощью контекстного меню строки в таблице тегов:

   ![Добавить теги на выбранное место](https://docs.owen.ru/book_img/2380/156200.png)

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

   ![Создание регистра преупреждение](https://docs.owen.ru/book_img/2380/155361.png)

6. **Удалить** тег можно с помощью контекстного меню тега в карте тегов:

   ![Удалить тег](https://docs.owen.ru/book_img/2380/156199.png)

Для переменных типа BYTE, WORD, DWORD и LWORD доступен просмотр и редактирование битовой маски. Подробно работа с битовой маской описана в разделе [Битовая маска](#topic-122568).

<a id="topic-122568"></a>

##### Битовая маска

Для переменных типа BYTE, WORD, DWORD и LWORD доступен просмотр и редактирование битовой маски.

1. Чтобы **раскрыть битовую маску** нажмите ПКМ на строку с регистром в карте тегов и выберите в контекстном меню **Раскрыть битовую маску**. Битовая маска тега отобразится в карте тегов:

   ![Битовая маска](https://docs.owen.ru/book_img/2380/155377.png)

2. **Отредактируйте** данные аналогично редактированию значений в таблице тегов для [Modbus Slave Device Serial/TCP](#topic-122564) и [Modbus Slave](#topic-122567)

Если битовая маска **раскрыта**, то все введенные данные сохраняются для последующего редактирования и сохранения.

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

![Скрыть битовую маску](https://docs.owen.ru/book_img/2380/154759.png)

Если выбрать **Да,** то битовая маска **скроется**, все внесенные данные будут удалены. В случае выбора **Нет** битовая маска останется **раскрыта**.

**Свернуть** или **развернуть** битовую маску можно с помощью значка ![Развернуть вложенности](https://docs.owen.ru/book_img/2380/154705.png), расположенного перед адресом тега.

После сохранения проекта в ALTA IDE автоматически формируется файл с картой тегов в формате *.csv*, который располагается в папке проекта *C:User/..../Project\_/Communications/*

![Таблица регистров](https://docs.owen.ru/book_img/2380/154778.png)

<a id="topic-122569"></a>

##### Добавление интерфейса подключения UART/TCP

Для получения запросов от master-устройства следует добавить интерфейс подключения. Устройство в режиме Slave поддерживает выбор **только одного** интерфейса подключения.

- **UART** — добавление аппаратного интерфейса UART (COM)
- **TCP** — добавление аппаратного интерфейса TCP/IP (Ethernet)

**Добавьте интерфейс** с помощью контекстного меню компонента ModbusSlave в дереве проекта:

![Добавление интерфейса](https://docs.owen.ru/book_img/2380/155380.png)

> [!WARNING]
> **Внимание.** Нельзя добавлять один и тот же интерфейс UART одновременно к компоненту Serial Master и Slave. Такое назначение приведет к отсутствию обмена по сети у одного из устройств.

После добавления интерфейс отобразится в дереве проекта, как ответвление компонента ModbusSlave системной папки Коммуникации:

![Интерфейсы в дереве проекта](https://docs.owen.ru/book_img/2380/155379.png)

###### UART

Выполните настройку интерфейса:

1. **Откройте** вкладку редактора UART:

   - двойным кликом ЛКМ на элемент UART_modbus_slave в дереве проекта;
   - выберите пункт **Открыть** в контекстном меню элемента UART_modbus_slave в дереве проекта.

2. **Настройте** интерфейс во вкладке редактора UART:

   ![UART](https://docs.owen.ru/book_img/2380/155098.png)

   *Вкладка интерфейса UART*

   - **Скорость, бит/с** — выберите из выпадающего списка скорость, с которой будет осуществляться передача данных.

   - **Чётность** — параметр, отображающий использование бита четности в посылке Modbus. Выберите из выпадающего списка:

     - NONE – отсутствует;
     - EVEN – проверка на четность;
     - ODD – проверка на нечетность.

   - **Биты данных** — выберите из выпадающего списка число бит данных. Возможные значения: 7 или 8

   - **Стоп биты** — параметр отображающий количество стоповых бит в посылке Modbus. Возможные значения: 1, 1.5 или 2.

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

![UART ошибка](https://docs.owen.ru/book_img/2380/154775.png)

*Повторное добавление интерфейса*

В этом случае один из интерфейсов следует удалить.

**Удалить** и **Переименовать** интерфейс возможно с помощью контекстного меню элемента UART в дереве проекта.

###### TCP

Выполните настройку интерфейса:

1. Откройте вкладку редактора TCP:

   - двойным кликом ЛКМ на элемент TCP_Server в дереве проекта;
   - выберите пункт **Открыть** в контекстном меню элемента TCP_Server в дереве проекта.

2. **Настройте** интерфейс во вкладке редактора TCP:

   ![TCP](https://docs.owen.ru/book_img/2380/155378.png)

   - **Маска подсети** — настройка подсети, в которой идет обмен. Адрес **0.0.0.0** означает, что сервер принимает подключения на всех сетевых интерфейсах (со всех доступных адресов).
   - **Порт TCP** — порт, используемый для обмена.
   - **Количество подключений** — позволяет настроить ограничение количества подключений. Если ограничение включено, то интерфейс обрабатывает запросы не более чем от N источников.

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

**Удалить** и **Переименовать** интерфейс возможно с помощью контекстного меню элемента TCP в дереве проекта.

<a id="topic-122570"></a>

## Расширения

Расширения используются для наиболее эффективного создания проектов или их интеграции с другими сервисами компании "Овен Цифровые решения".

Расширения в ALTA IDE:

- [Менеджер библиотек](#topic-122571).
- [Конфигуратор](#topic-122572).

> [!NOTE]
> **Примечание.** Список расширений постоянно дополняется

<a id="topic-122571"></a>

### Менеджер библиотек

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

Чтобы открыть окно **Менеджер библиотек** дважды нажмите ЛКМ на системную папку **Менеджер библиотек** в дереве проекта, или выберите в контекстном меню пункт **Открыть**:

![Менеджер библиотек Открыть1](https://docs.owen.ru/book_img/2380/158429.png)

*Менеджер библиотек в дереве проекта*

Окно **Менеджер библиотек** содержит две вкладки:

![Менеджер библиотек](https://docs.owen.ru/book_img/2380/157002.png)

*Окно Менеджер библиотек*

1. **Мои библиотеки** — содержит информацию о библиотеках, подключенных к проекту.

   > **Примечание.** В ALTA IDE по умолчанию присутствует обязательная библиотека [**Standard**](#topic-122650). Она подключается автоматически и не может быть удалена или скрыта из проекта.

2. **Магазин** — предназначена для просмотра каталога библиотек с возможностью их подключения к текущему проекту.

#### Информация о библиотеке

![Карточка библиотеки](https://docs.owen.ru/book_img/2380/157001.png)

*Карточка библиотеки*

Для просмотра информации о библиотеке нажмите ЛКМ на карточку библиотеки, расположенную в менеджере библиотек. Карточка содержит вкладки:

- **README** — краткое описание содержания библиотеки;
- **Информация** — содержание данной вкладки зависит от конкретной библиотеки. Вкладка может содержать информацию об авторах, лицензии, сайте и репозитории библиотеки, а также описание библиотеки и ссылку на документацию библиотеки.

#### Подключение библиотеки

Чтобы подключить библиотеку к проекту:

1. Откройте вкладку **Магазин** в редакторе **Менеджер библиотек**.
2. Выберите нужную библиотеку и нажмите кнопку **Подключить** на карточке библиотеки.
3. Библиотека добавится в проект и отобразится на вкладке **Мои библиотеки** в редакторе **Менеджер библиотек**.

#### Отключение библиотеки

Чтобы отключить библиотеку:

1. Откройте вкладку **Мои библиотеки** в редакторе **Менеджер библиотек**.
2. Выберите нужную библиотеку и нажмите кнопку **Отключить** на карточке библиотеки.
3. Библиотека будет удалена из проекта. После отключения библиотека останется доступной на вкладке **Магазин** в редакторе **Менеджер библиотек**, где её можно подключить повторно.

<a id="topic-122572"></a>

### Конфигуратор

Расширение **Конфигуратор** предназначено для настройки и управления приборами компании ОВЕН в среде разработки ALTA IDE. Поддержана работа с устройствами второго поколения, к которым относятся:

- бесконтактный реверсивный пускатель ПБР10А;
- контроллер для вентиляции АЙРА360;
- прибор для индикации и управления СМИ2-М;
- модули ввода-вывода Мх210;
- устройства защиты двигателя УЗД1;
- блоки питания БПхК, БАх-х, ИБП120К;
- нормирующие преобразователи НПТ-1М;
- контроллер управления насосами САУ-У2;
- сетевые шлюзы для доступа к сервису OwenCloud Пх210;
- сетевой шлюз для преобразования и передачи данных протоколов Modbus RTU/ASCII и Modbus TCP МКОН;
- программируемые реле ПР103, ПР205, ПР225 - добавление только в режиме онлайн.

С помощью расширения **Конфигуратор** можно:

- [добавить устройство](#topic-122574) в проект в режиме онлайн/офлайн;
- [назначить IP-адрес](#topic-122576);
- [сконфигурировать параметры](#topic-122578) устройства;
- [импортировать карту тегов](#topic-122584) устройства в Modbus Slave Device.

Расширение ALTA IDE Конфигуратор требует [установки](#topic-122573). Для корректной работы расширения на ПК должна быть установлена последняя версия ALTA IDE.

<a id="topic-122573"></a>

#### Установка

Перед установкой расширения Конфигуратор убедитесь, что на ПК установлена последняя версия ALTA IDE. Если доступно обновление, обновите среду до актуальной версии.

1. Скачайте на ПК и запустите файл *ConfigurationEditorSetup.exe*.

2. Откроется окно мастера установки. Выберите папку для установки расширения **Конфигуратор**.

   > **Предупреждение.** Установка расширения Конфигуратор должна выполняться строго в папку ALTA IDE, автоматически созданную при установке среды. Выбор другой директории может привести к некорректной работе расширения.

   Нажмите кнопку **Далее**.

   ![Установка 3](https://docs.owen.ru/book_img/2380/158524.png)

   *Выбор папки для установки*

3. Ознакомьтесь с лицензионным соглашением и, в случае согласия, выберите **Я принимаю условия соглашения**. Нажмите кнопку **Далее**.

   ![Установка 4](https://docs.owen.ru/book_img/2380/158523.png)

   *Окно лицензионного соглашения* 

4. Ознакомьтесь с информацией об установке и нажмите кнопку **Установить**

   ![Установка 5](https://docs.owen.ru/book_img/2380/158522.png)

   *Окно запуска установки*

5. Откроется окно, в котором будет отображаться процесс установки.

   ![Установка 6](https://docs.owen.ru/book_img/2380/158521.png)

   *Процесс установки программы*

6. Дождитесь окончания установки и нажмите кнопку **Завершить**.

   ![Установка 7](https://docs.owen.ru/book_img/2380/158520.png)

   *Завершение установки*

После успешной установки расширения **Конфигуратор** кнопка **Добавить устройство** на панели инструментов в открытом проекте ALTA IDE станет активной:

![Успешная установка](https://docs.owen.ru/book_img/2380/162482.png)

<a id="topic-122574"></a>

#### Добавление устройства в проект

Добавление устройства возможно только при открытом проекте. Нажмите ЛКМ кнопку ![Добавить устройство](https://docs.owen.ru/book_img/2380/158465.png)**Добавить устройство** на панели инструментов и в выпадающем меню выберите режим добавления устройства:

![Меню Добавить устройство](https://docs.owen.ru/book_img/2380/161152.png)

- [добавить online устройство](#topic-122575);
- [добавить по сервисной кнопке](#topic-122576)
- [добавить offline устройство](#topic-122577).

<a id="topic-122575"></a>

##### Добавление устройства online

1. В меню кнопки **Добавить устройство** выберите **Добавить online устройство**. Откроется вкладка **Добавить Online**:

   ![Вкладка добавить устройство онлайн](https://docs.owen.ru/book_img/2380/161504.png)

2. Выберите интерфейс подключения устройства:

   - **TCP (Ethernet/Wifi)** — подключение по интерфейсу Ethernet.

     ![TCP (Ethernet)](https://docs.owen.ru/book_img/2380/161503.png)

     Введите сетевые параметры:

     - **Найти одно устройство** — задается один известный IP-адрес устройства;
     - **Сканирование сети** — задается диапазон IP-адресов для поиска группы устройств или устройства, IP-адрес которого неизвестен.

   - **USB** — подключение по интерфейсу USB, устройств, работающих по протоколу Modbus. Устройство будет отображаться в интерфейсе, как подключенное через COM-порт. Номер COM-порта отображается в таблице найденных устройств и в настройках соединения.

     ![USB](https://docs.owen.ru/book_img/2380/161502.png)

   - **USB - Преобразователь RS485** — подключение по интерфейсу RS485 через преобразователь, устройств, работающих по протоколу Modbus.

     ![USB-Преобразователь](https://docs.owen.ru/book_img/2380/161501.png)

     Определите режим поиска (сетевые параметры):

     - **Найти одно устройство** — задается один известный порт и адрес устройства.

       - **Порт** — номер порта для подключения;
       - **Адрес** — сетевой адрес устройства.

     - **Найти несколько устройств** — задается порт и диапазон адресов для поиска группы устройств или устройства, адрес которого неизвестен.

       - **Порт** — номер порта для подключения;
       - **Начальный адрес**— начальное значение диапазона адресов;
       - **Конечный адрес** — конечное значение диапазона адресов.

     Определите устройство для поиска:

     - **Автоперебор устройств** — автоматический поиск всех устройств. Если отключить эту функцию, то станет доступен выбор устройства вручную;
     - **Выбрать вручную** — в открывшемся окне выберите устройство или группу устройств из списка. Устройства распределены по категориям.

     Задайте параметры com-порта:

     - Скорость;
     - Четность;
     - Биты данных;
     - Стоп-биты.

3. Нажмите кнопку **Найти устройства**. Конфигуратор выполнит поиск по указанным параметрам, найденные устройства отобразятся в таблице, в нижней части вкладки **Добавить Online**:

   ![Найти устройства](https://docs.owen.ru/book_img/2380/158462.png)

   Нажмите ЛКМ на строку с устройством в таблице. В области справа появится изображение, краткая информация об устройстве и информация об обновлениях в прошивке.

   ![Информация об устройстве](https://docs.owen.ru/book_img/2380/158461.png)

   В случае, если на заданных сетевых настройках не найдено ни одного устройства, отобразится информационное сообщение:

   ![Устройство не найдено](https://docs.owen.ru/book_img/2380/158460.png)

4. Выберите нужное устройство из списка, поставив чекбокс в последнем столбце строки устройства. Либо выберите все устройства поставив чекбокс в заголовке столбца.

5. Нажмите кнопку **Добавить устройства**. Выбранное устройство будет добавлено в проект и отобразится в дереве проекта:

   ![Отображение устройства в дереве проекта](https://docs.owen.ru/book_img/2380/158459.png)

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

   > **Примечание.** В расширении ALTA IDE Конфигуратор текущей версии доступно добавление устройств работающих только по протоколу OwenAutoDetection.

###### Контекстное меню устройства

Нажмите ПКМ на добавленное устройство в дереве проекта, откроется контекстное меню:

![Контекстное меню](https://docs.owen.ru/book_img/2380/161500.png)

*Контекстное меню добавленного устройства*

С помощью контекстного меню добавленного устройства можно:

- **Открыть** — открыть вкладку конфигурирования устройства.
- **Удалить** — удалить добавленное устройство из проекта.

<a id="topic-122576"></a>

##### Добавление устройства через сервисную кнопку

Поддержку данной функции можно проверить в *руководстве по эксплуатации* конкретного устройства.

Функционал назначения IP-адресов доступен для устройства или группы устройств.

1. В меню кнопки **Добавить устройство** выберите **Добавить по сервисной кнопке**. Откроется вкладка **Добавить по сервисной кнопке**:

   ![Вкладка Добавить по сервисной кнопке](https://docs.owen.ru/book_img/2380/161499.png)

2. Подключите одно или несколько устройств, которым необходимо назначить IP-адрес, к ПК.

3. Укажите IP-адрес, который необходимо задать первому устройству.

4. Нажмите сервисную кнопку/кнопки на устройстве/устройствах.

5. Найденные устройства с назначенным IP-адресом отобразятся в таблице, в нижней части вкладки. Нажмите ЛКМ на строку с устройством в таблице. В области справа появится изображение и краткая информация об устройстве.

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

7. Нажмите кнопку **Добавить устройства**. Выбранные устройства будут добавлены в проект и отобразятся в дереве проекта:

   ![Отображение устройства в дереве проекта](https://docs.owen.ru/book_img/2380/158459.png)

###### Расширенные параметры

Расширенные настройки доступные для корректировки:

- сетевой интерфейс;
- порт;
- маска подсети;
- основной шлюз;
- предпочтительный DNS-сервер;
- альтернативные DNS-сервера.

Для изменения или просмотра разверните **расширенные параметры** с помощью кнопки ![Развернуть вложенности](https://docs.owen.ru/book_img/2380/158485.png), расположенной перед заголовком и, при необходимости, откорректируйте данные:

![Расширенные параметры](https://docs.owen.ru/book_img/2380/158484.png)

<a id="topic-122577"></a>

##### Добавление устройства offline

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

1. В меню кнопки **Добавить устройство** выберите **Добавить offline устройство**. Откроется окно добавления устройства офлайн:

   ![Вкладка добавить устройство офлайн](https://docs.owen.ru/book_img/2380/158483.png)

   *Вкладка Добавить Offline*

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

   На тулбаре окна **Добавить Offline** расположены кнопки действий:

   ![Поиск](https://docs.owen.ru/book_img/2380/158482.png)

   Поиск

   После нажатия на кнопку отобразится строка поиска.

   Начните вводить название устройства - все совпадения в списке будут выделены

   ![Развернуть все](https://docs.owen.ru/book_img/2380/158481.png)

   Развернуть все

   Разворачивает все категории и версии устройств

   ![Свернуть все](https://docs.owen.ru/book_img/2380/158480.png)

   Свернуть все

   Сворачивает все категории и версии устройств

   Чтобы развернуть/свернуть категорию или версии у одного из устройств, воспользуйтесь маркером ![Развернуть вложенности](https://docs.owen.ru/book_img/2380/158485.png)/![Свернуть вложенности](https://docs.owen.ru/book_img/2380/158479.png), расположенным перед названием категории устройств/устройства.

2. Выберите устройство из списка. В области справа появится изображение, краткая информация об устройстве и информация об обновлениях в прошивке.

3. Нажмите кнопку **Добавить устройство** — выбранное устройство будет добавлено в проект и отобразится в дереве проекта:

   ![Отображение устройства в дереве проекта](https://docs.owen.ru/book_img/2380/158459.png)

   Одно и то же устройство можно добавить в проект неограниченное количество раз. При каждом повторном добавлении к имени устройства автоматически добавляется постфикс с порядковым номером через нижнее подчеркивание, например: *Device, Device_1, Device_2* и т. д.

<a id="topic-122578"></a>

#### Конфигурирование устройства

**Откройте** окно конфигурирования устройства одним из следующих способов:

- дважды щёлкните ЛКМ по добавленному устройству в дереве проекта;
- нажмите ПКМ на добавленное устройство в дереве проекта и в контекстном меню выберите пункт **Открыть**.

![Вкладка конфигурирования устройства](https://docs.owen.ru/book_img/2380/158478.png)

*Окно конфигурирования устройства*

<a id="topic-122579"></a>

##### Дерево параметров

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

| Название столбца | Описание | Возможность редактирования |
| --- | --- | --- |
| Параметр | Содержит название параметра (группы параметров). Чтобы развернуть/свернуть содержание группы параметров воспользуйтесь маркером ![Развернуть вложенности](https://docs.owen.ru/book_img/2380/158485.png)/![Свернуть вложенности](https://docs.owen.ru/book_img/2380/158479.png), расположенным перед названием параметра. | Нет |
| Значение на устройстве | Значение параметра, считанное с устройства. Если значение не считано в ячейке отобразится знак "—" | Нет |
| Подготовленное значение | Ввод значения параметра которое необходимо записать на устройство | Да |
| Диапазон | Минимальное и максимальное значение параметра | Нет |
| Заводское значение | Заводское значение параметра | Нет |

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

|   |   |   |
| --- | --- | --- |
| ![Прочитать значения параметров](https://docs.owen.ru/book_img/2380/158518.png) | Прочитать значения<br>(только в режиме онлайн) | Команда на однократное чтение значений параметров с устройства.<br>В правой нижней части вкладки отображается шкала выполнения чтения значений.<br>После выполнения команды вкладка будет автоматически сохранена |
| ![Записать все подготовленные значения](https://docs.owen.ru/book_img/2380/158517.png) | Записать все подготовленные значения<br>(только в режиме онлайн) | Команда на однократную запись всех подготовленных значений на устройство.<br>В правой нижней части вкладки отображается шкала выполнения записи подготовленных значений.<br>После выполнения команды вкладка будет автоматически сохранена |
| ![Перезагрузить устройство](https://docs.owen.ru/book_img/2380/158556.png) | Перезагрузка устройства<br>(только в режиме онлайн) | Команда, по которой устройство будет перезагружено |
| ![Сброс до заводских настроек](https://docs.owen.ru/book_img/2380/158555.png) | Сброс устройства на заводские значения<br>(только в режиме онлайн) | Команда, по которой во все параметры устройства будут записаны заводские значения, при этом подготовленные значения останутся.<br>В правой нижней части вкладки отображается шкала выполнения сброса на заводские значения.<br>После выполнения команды вкладка будет автоматически сохранена |
| ![Очистить все подготовленные значения](https://docs.owen.ru/book_img/2380/158554.png) | Очистить все подготовленные значения | Очистка всех подготовленных значений параметров |
| ![Поиск серый фон](https://docs.owen.ru/book_img/2380/158553.png) | Поиск | После нажатия на кнопку отобразится строка поиска.<br>Начните вводить название параметра - все совпадения в списке будут выделены |
| ![Развернуть все серый фон](https://docs.owen.ru/book_img/2380/158552.png) | Развернуть все | Разворачивает все группы параметров/параметры |
| ![Свернуть все серый фон](https://docs.owen.ru/book_img/2380/158551.png) | Свернуть все | Сворачивает все группы параметров/параметры |

<a id="topic-122580"></a>

##### Чтение значений параметров

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

При добавлении устройства в проект происходит первичное считывание параметров устройства. Для считывания текущих значений параметров устройства нажмите кнопку ![Прочитать значения параметров](https://docs.owen.ru/book_img/2380/158477.png) **Прочитать значения** на тулбаре дерева параметров.

<a id="topic-122581"></a>

##### Запись значений параметров

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

1. В столбце **Подготовленное значение** таблицы параметров введите значение параметра, которое необходимо записать на устройство.

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

   ![Есть несохраненные значения](https://docs.owen.ru/book_img/2380/158492.png)

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

2. Нажмите кнопку ![Записать все подготовленные значения](https://docs.owen.ru/book_img/2380/158496.png) **Записать все подготовленные значения**. Если все подготовленные значения допустимы, то они будут записаны на устройство. В случае наличия недопустимых значений откроется информационное окно с выбором:

   ![Есть невалидные значения](https://docs.owen.ru/book_img/2380/158550.png)

   **Да** — все допустимые подготовленные значения параметров будут записаны в устройство.

   **Отмена** — подготовленные значения не будут записаны в устройство.

Чтобы **удалить** подготовленное значение нажмите ПКМ на строчку со значением и в контекстном меню выберите **Очистить подготовленное значение**. Значение будет удалено.

Чтобы **удалить** все подготовленные значения нажмите кнопку ![Очистить все подготовленные значения](https://docs.owen.ru/book_img/2380/158493.png) **Очистить все подготовленные значения** на тулбаре дерева параметров. Все подготовленные значения будут удалены.

В некоторых случаях (например, при назначении устройству IP-адреса через дерево параметров) требуется перезагрузка устройства. Для этого нажмите кнопку ![Перезагрузить устройство](https://docs.owen.ru/book_img/2380/158495.png) **Перезагрузка устройства** на тулбаре дерева параметров. Устройство будет перезагружено.

<a id="topic-122582"></a>

##### Возврат к заводским настройкам

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

Для восстановления заводских настроек нажмите кнопку ![Сброс до заводских настроек](https://docs.owen.ru/book_img/2380/158494.png) **Сброс устройства на заводские значения** на тулбаре дерева параметров. Откроется окно с подтверждением сброса значений:

![Сброс на заводские настройки](https://docs.owen.ru/book_img/2380/158490.png)

*Подтверждение сброса*

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

При выборе **Отмена** сброс на заводские значения выполнен не будет.

<a id="topic-122583"></a>

##### Настройка соединения

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

![Настройка соединения](https://docs.owen.ru/book_img/2380/158489.png)

*Вкладка Настройка соединения*

1. Выберите интерфейс подключения устройства:

   - **TCP (Ethernet/Wifi)** — подключение по интерфейсу Ethernet/Wifi. При выборе данного интерфейса необходимо ввести IP-адрес устройства.
   - **USB** — подключение по интерфейсу USB.

2. Нажмите **Установить соединение**.

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

   ![Установить соединение по USB](https://docs.owen.ru/book_img/2380/158488.png)

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

###### Типовые ситуации при подключении устройства

| Информационное сообщение | Причина | Возможные действия |
| --- | --- | --- |
| ![Соединение установлено](https://docs.owen.ru/book_img/2380/158487.png) | Соединение с устройством успешно установлено |   |
| ![Ошибка соединения1](https://docs.owen.ru/book_img/2380/158506.png) | Устройство с заданными сетевыми настройками не найдено | Проверьте введенные сетевые настройки и подключение устройства |
| ![Найдено новое устройство](https://docs.owen.ru/book_img/2380/158505.png) | Найдено другое устройство по заданным настройкам | Подключите к ПК устройство, добавленное в проект и повторите действия по установке соединения |
| ![Несовместимая версия устройства](https://docs.owen.ru/book_img/2380/158504.png) | Попытка подключить устройство, имеющее другую версию прошивки | Подключите к ПК устройство с версией прошивки, идентичной версии устройства, добавленного в проект, и повторите действия по установке соединения |
| ![Ошибка соединения4](https://docs.owen.ru/book_img/2380/158503.png) | С устройством с заданными сетевыми настройками соединение уже установлено. Одновременное подключение двух или более устройств, добавленных офлайн, к одному физическому устройству невозможно | Разорвите соединение с устройством к которому необходимо подключиться |
| ![Ошибка соединения5](https://docs.owen.ru/book_img/2380/158502.png) | Устройство не отвечает на запрос в течении 30 секунд | Проверьте подключение устройства |

Чтобы отключить устройство нажмите кнопку **Разорвать соединение**. Соединение будет разорвано, в информации о подключенном устройстве отобразится статус соединения "Отключено".

![Разорвать соединение](https://docs.owen.ru/book_img/2380/158501.png)

<a id="topic-122584"></a>

#### Импорт карты тегов в Modbus Slave Device

В ALTA IDE доступен импорт карты тегов устройств, добавленных с помощью расширения **Конфигуратор**.

Импорт карты тегов возможен, когда:

- проект создан;
- в проект добавлено устройство в режиме Modbus Master (TCP или Serial);
- к master-устройству добавлен Modbus Slave Device (TCP или Serial);
- в проект [добавлено конфигурируемое устройство](#topic-122574).

1. В дереве проекта нажмите ПКМ на устройство Modbus Slave Device, в которое требуется импортировать карту тегов, и выберите команду **Импортировать карту тегов из устройства**:

   ![Контекстное меню импортировать карту тегов](https://docs.owen.ru/book_img/2380/158500.png)

2. В открывшемся окне выберите из списка конфигурируемое устройство, карту тегов которого нужно импортировать, и нажмите **Импортировать**.

   ![Импорт карты тегов1](https://docs.owen.ru/book_img/2380/158499.png)

   > **Примечание.** Карта тегов устройства Modbus Slave Device будет полностью заменена. Ранее внесенные данные (при наличии) будут удалены. Карту тегов можно импортировать сколько угодно раз — перед импортом все ранее внесенные данные удаляются и заменяются импортированной картой.

3. В информационном окне подтвердите импорт, нажав **Импортировать**, либо нажмите **Отменить** для отмены операции.

   ![Импорт карты тегов2](https://docs.owen.ru/book_img/2380/158498.png)

##### Добавление и удаление тегов

1. Нажмите кнопку **Изменить карту тегов** , расположенную в верхней части карты тегов (в приведенном ниже примере кнопка называется **Добавить теги из шаблона**).

   ![Изменить карту тегов](https://docs.owen.ru/book_img/2380/158497.png)

2. Откроется окно содержащее все теги:

   ![Имполрт тегов3](https://docs.owen.ru/book_img/2380/158526.png)

   - установите чекбоксы для тегов, которые нужно **добавить**
   - снимите чекбоксы для тегов, которые нужно **удалить**.

   Чтобы выбрать все теги, установите чекбокс **Используется** в заголовке таблицы.

3. Нажмите **Сохранить** — в карте тегов отобразятся выбранные теги.

##### Редактирование значений и привязка переменных

Чтобы отредактировать значение в карте тегов, дважды нажмите ЛКМ по ячейке **Значение/****Переменная** и выполните одно из действий:

- привяжите входную переменную для чтения регистра в программе;
- привяжите выходную переменную для записи регистра из программы;
- задайте значение (константу) для записи регистра.

Редактирование остальных параметров импортированной карты тегов недоступно.

##### Битовая маска

Для переменных типа BYTE, WORD, DWORD и LWORD доступен просмотр и редактирование битовой маски. Подробно работа с битовой маской описана в разделе **[Битовая маска](#topic-122568)**.

<a id="topic-122585"></a>

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

<a id="topic-122586"></a>

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

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

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

#### Зарезервированные ключевые слова

|   |   |   |
| --- | --- | --- |
| [ARRAY](#topic-122628) | END_VAR | [RETURN](#topic-122614) |
| [CONTINUE](#topic-122613) | END_WHILE | STRUCT |
| ELSE | [EXIT](#topic-122612) | TYPE |
| ELSIF | [FOR](#topic-122611) | [VAR](#topic-122634) |
| END_FOR | FUNCTION | [VAR_GLOBAL](#topic-122637) |
| END_FUNCTION | [IF](#topic-122609) | [VAR_INPUT](#topic-122635) |
| END_IF | OF | [VAR_OUTPUT](#topic-122636) |
| END_PROGRAM | POINTER TO | [WHILE](#topic-122610) |
| END_STRUCT | PROGRAM |   |
| END_TYPE | REF_TO |   |

#### Встроенные функции/типы/определения

|   |   |   |
| --- | --- | --- |
| ADD | INSTANT | TIME_OF_DAY |
| ADR | [INT](#topic-122618) | TRUE |
| [BOOL](#topic-122617) | LINT | UDINT |
| BYTE | LREAL | UINT |
| CHAR | LWORD | ULINT |
| DATE | [REAL](#topic-122619) | USINT |
| DATE_AND_TIME | REF | WCHAR |
| DINT | SHR | WORD  |
| DWORD | SINT | WSTRING |
| EQ | SIZEOF | ^ |
| FALSE | [STRING](#topic-122620) |   |
| GT | TIME |   |

<a id="topic-122587"></a>

### Правила именования

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

- Имя не должно содержать пробелов и спецсимволов (!, @ и т.д.). Исключение – символ нижнего подчеркивания (\_);
- Нижнее подчёркивание \_ допускается и считается отдельным символом. (A_BCD и AB_CD - это разные идентификаторы);
- Имя должно начинаться с буквы;
- Имя переменной может содержать только буквы латинского алфавита;
- Имя не должно содержать несколько символов нижнего подчеркивания (\_), размещенных подряд (т.е. имя i\_\_Test недопустимо, а имя i_Te_st - допустимо);
- Регистр имен объектов не учитывается (VAR1, VaR1 и var1 относятся к одной и той же переменной);
- На длину имени не накладывается никаких ограничений;
- Имя не должно совпадать с одним из зарезервированных ключевых слов (например, VAR, INT, и т.д.);

#### Рекомендации

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

| Тип данных | Префикс | Тип данных | Префикс |
| --- | --- | --- | --- |
| BOOL | x | SINT | si |
| BYTE | by | STRING | s |
| CHAR | c | TIME | t |
| DATE | d | TIME_OF_DAY (TOD) | tod |
| DATE_AND_TIME (DT) | dt | UDINT | udi |
| DINT | di | UINT | ui |
| DWORD | dw | ULINT | uli |
| INT | i | USINT | usi |
| LINT | li | WCHAR | wc |
| LREAL | lr | WORD | w |
| LWORD | lw | WSTRING | ws |
| REAL | r |   |   |

Пример:

![Правила именования](https://docs.owen.ru/book_img/2380/155397.png)

<a id="topic-122588"></a>

### Выражения

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

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

Вычисление выражений выполняется согласно [правилам приоритета](#topic-122599). Оператор с самым высоким приоритетом выполняется первым, оператор с более низким приоритетом – вторым и т.д., пока не будут выполнены все операторы.

Операторы с одинаковым приоритетом выполняются слева направо.

В языке поддерживаются следующие виды выражений:

- [Литералы](#topic-122589);
- [Литералы массивов](#topic-122590);
- [Литералы структур](#topic-122591);
- [Чтение переменных](#topic-122592);
- [Индексный доступ](#topic-122593);
- [Чтение полей структур](#topic-122594);
- [Унарные выражения](#topic-122595);
- [Бинарные выражения](#topic-122596);
- [Вызовы функций](#topic-122597);
- [Составные выражения](#topic-122598);

Примеры:

![Выражения](https://docs.owen.ru/book_img/2380/155396.png)

<a id="topic-122589"></a>

#### Литералы

![Литералы](https://docs.owen.ru/book_img/2380/155395.png)

Порядок вычисления литералов не специфицирован.

Числовые литералы могут записываться в десятичном (0, 1, 100), двоичном (2#0011_0011), восьмеричном (8#127), шестнадцатеричном (16#ABCD) видах.

Числовой литерал может быть типизированным (DWORD#123). Числовой литерал может быть записан в научной нотации с указанием множителя и показателя степени числа 10 (2.5E+1 = 25). В случае положительного показателя степени знак "+" можно опустить.

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

<a id="topic-122590"></a>

#### Литералы массивов

![Литералы массивов 1](https://docs.owen.ru/book_img/2380/155394.png)

Литералы массивов записываются в квадратных скобках. При этом элементы массива указываются по порядку объявления через запятую.

Пример:

![Литералы массивов 2](https://docs.owen.ru/book_img/2380/155743.png)

В литералах массивов допускается указывать несколько первых элементов подряд. Неуказанные элементы принимаются равными нулевому значению соответствующего типа. Пропуски элементов (\[1,,3\]) не допускаются (ошибка компиляции E007).

Пример:

![Литералы массивов 3](https://docs.owen.ru/book_img/2380/155742.png)

<a id="topic-122591"></a>

#### Литералы структур

![Литералы структур 1](https://docs.owen.ru/book_img/2380/155391.png)

Литералы структур записываются в круглых скобках с явным указанием идентификаторов полей и их значений в виде <идентификатор_поля>:=<значение> через запятую. Если имя поля не указано явно, возникнет ошибка компиляции \[E071\].

Пропущенные значения принимаются равными нулевому значению соответствующего типа.

Пример:

![Литералы структур 2](https://docs.owen.ru/book_img/2380/155421.png)

Литералы вложенных структур требуют указания типов для каждого уровня вложенности, кроме самого нижнего. В противном случае возникнет ошибка компиляции \[E071\].

Пример вложенных структур:

![Литералы структур 3](https://docs.owen.ru/book_img/2380/155420.png)

Литерал массива структур в текущей реализации работает некорректно.

Пример структуры с массивами:

![Литералы структур 4](https://docs.owen.ru/book_img/2380/155419.png)

<a id="topic-122592"></a>

#### Чтение переменных

![Чтение переменных](https://docs.owen.ru/book_img/2380/155418.png)

Для чтения из переменной достаточно указать её идентификатор (a, dwVar, DWVAR).

Чтение из переменной записывается в текущее значение переменной и имеет тип, совпадающий с типом этой переменной.

<a id="topic-122593"></a>

#### Индексный доступ

![Индексный доступ](https://docs.owen.ru/book_img/2380/155417.png)

Доступ к элементу массива по индексу вычисляется соответствующее значение этого элемента.

<Выражение> должно вычисляться в массив. В противном случае возникнет ошибка компиляции \[E059\]. Порядок вычисления <выражения> и <индекса> не специфицирован.

Попытка доступа к элементу за границами массива (индекс вычисляется на этапе компиляции) приведёт к ошибке компиляции \[E058\].

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

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

<a id="topic-122594"></a>

#### Чтение полей структур

![Чтение полей структур](https://docs.owen.ru/book_img/2380/155416.png)

Чтение поля структуры аналогично чтению переменной. Для доступа к полям структуры после идентификатора структуры используется оператор "точка".

Чтение из поля структуры вычисляется в текущее значение поля указанного экземпляра структуры и имеет тип, совпадающий с типом этого поля.

Вложенный доступ поддерживается. Уровень вложенности неограничен.

Если функция возвращает структуру, недопустимо при вызове функции обращаться к отдельным полям возвращаемого значения. В противном случае произойдёт ошибка компиляции \[E002\]. Имеется в виду конструкция вида b := f().a;

<a id="topic-122595"></a>

#### Унарные выражения

![Унарные выражения](https://docs.owen.ru/book_img/2380/155415.png)

Поддерживаются следующие унарные операторы: +.

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

<a id="topic-122596"></a>

#### Бинарные выражения

![Бинарные выражения](https://docs.owen.ru/book_img/2380/155442.png)

Поддерживаются следующие бинарные операторы: +.

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

Переполнение ведёт себя по принципу арифметики с дополнением до 2.

Пример переполнения:

![Бинарные выражения1](https://docs.owen.ru/book_img/2380/155441.png)

<a id="topic-122597"></a>

#### Вызовы функций

![Вызовы функций 1](https://docs.owen.ru/book_img/2380/155440.png)

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

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

Аргумент может быть массивом. Такой аргумент не может передаваться в виде литерала (ошибка компиляции \[E071\]).

Возможно совмещение вариантов передачи аргументов.

Пример для функции fct(in1,in2,in3):

Вызов fct(in2 := 2, in1 := 1, 3)

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

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

Пример:

![Вызовы функций 2](https://docs.owen.ru/book_img/2380/155439.png)

Возвращаемый слот функции имеет значение по умолчанию - нулевое значение соответствующего типа.

Функция с результатом может вызываться в выражении или как оператор. Такое выражение вычисляется в возвращаемое значение соответствующего типа.

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

Функция без результата не должна вызываться внутри выражения. В противном случае произойдёт ошибка компиляции \[E037\].

Пример:

![Вызовы функций 3](https://docs.owen.ru/book_img/2380/155438.png)

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

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

Запрещено обращаться к отдельным полям возвращаемого значения извне функции. В противном случае произойдёт ошибка компиляции \[E007\].

Пример возврата структуры:

![Вызовы фукнций 4](https://docs.owen.ru/book_img/2380/155437.png)

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

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

> [!IMPORTANT]
> **Предупреждение.** Запрещено обращаться к отдельным элементам возвращаемого значения извне функции. В противном случае произойдёт ошибка компиляции \[E007\].

Возвращаемое значение-массив может быть проигнорировано.

Пример возврата массива:

![Вызовы функций 5](https://docs.owen.ru/book_img/2380/155436.png)

Всё описанное выше справедливо и для массивов структур.

<a id="topic-122598"></a>

#### Составные выражения

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

Вложенные подвыражения вычисляются перед содержащими их выражениями.

Пример:

![Составные выражения](https://docs.owen.ru/book_img/2380/155435.png)

<a id="topic-122599"></a>

#### Приоритеты операций

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

| Операция | Обозначение |
| --- | --- |
| Взятие в скобки | ( <Выражение> ) |
| Оператор с передачей операндов в скобках | <Оператор>(<операнды>) |
| Сложение | + |
| Сравнение | <, >, <=, >= |
| Проверка на равенство | = |

<a id="topic-122600"></a>

#### Операторы

<a id="topic-122601"></a>

##### Оператор ADD

Оператор для сложения переменных.

Разрешённые типы данных: WORD, DWORD, DINT.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>a<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>1<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>+<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>// результат 4<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122602"></a>

##### Оператор EQ

Оператор для проверки операндов на равенство.

Разрешённые типы данных: все элементарные типы.

Возвращает TRUE, если операнды равны, и FALSE в противном случае.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>x1<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>1<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>=<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>1<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>// результат TRUE<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>x2<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>TRUE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>=<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>FALSE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>// результат FALSE<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122603"></a>

##### Оператор GT

Оператор для проверки утверждения "больше" относительно операндов.

Разрешённые типы данных: WORD, DWORD, DINT.

Возвращает TRUE, если первый операнд больше второго, и FALSE в противном случае.

Пример:

![GT](https://docs.owen.ru/book_img/2380/155452.png)

<a id="topic-122604"></a>

##### Оператор REF (ADR)

![REF](https://docs.owen.ru/book_img/2380/155451.png)

Оператор для возврата указателя на объект.

Взятие указателя реализуется оператором REF() или ADR(). ADR() и REF() семантически эквивалентны.

Пример:

![REF1](https://docs.owen.ru/book_img/2380/155450.png)

<a id="topic-122605"></a>

##### Оператор разыменования ^

Разыменование (взятие значения по указателю) реализуется оператором ^.

![Разыменования](https://docs.owen.ru/book_img/2380/155449.png)

Указатели типизированные. Разыменование вычисляется в значение соответствующего типа по указателю.

При несовпадении типов, где это возможно, выполняется неявное преобразование типа (между целочисленными типами и BOOL). Если тип данных слева меньше, неявное преобразование выполняется с предупреждением компилятора \[E067\].

Несовпадение типов с невозможностью неявного преобразования приведёт к ошибке компиляции \[E037\].

Разыменование нулевого указателя приводит к ошибке исполнения (Segmentation fault).

Пример:

![Разыменования1](https://docs.owen.ru/book_img/2380/155448.png)

<a id="topic-122606"></a>

##### Оператор SIZEOF

![SIZEOF](https://docs.owen.ru/book_img/2380/155447.png)

Возвращает размер объекта в байтах (значение типа ULINT).

Пример:

![SIZEOF1](https://docs.owen.ru/book_img/2380/155446.png)

<a id="topic-122607"></a>

### Утверждения (инструкции)

| Утверждение | Синтаксис |
| --- | --- |
| [Присвоение переменной](#topic-122608) | <идентификатор> := <выражение> |
| [Условие](#topic-122609) | IF <условие1> THEN<br><блок кода1><br>ELSIF <условие2> THEN<br>…​<br>ELSE<br><блок кодаN><br>END_IF |
| [Цикл с предусловием](#topic-122610) | WHILE <условие> DO<br>…​<br>END_WHILE |
| [Цикл FOR](#topic-122611) | FOR <выражение-счётчик> := <начальное значение> TO <конечное значение> DO<br>…​<br>END_FOR |
| [EXIT](#topic-122612) | WHILE <условие> DO<br>…​<br>EXIT;<br>…​<br>END_WHILE |
| [CONTINUE](#topic-122613) | FOR <счётчик> := <начальное значение> TO <конечное значение> BY <шаг> DO<br><блок кода 1><br>CONTINUE;<br><блок кода 2><br>END_FOR |
| [RETURN](#topic-122614) | PROGRAM <…​><br>…​<br>RETURN;<br>…​<br>END_PROGRAM |
| [Комментарии](#topic-122615) | // Однострочный комментарий<br>(\* многострочный<br>комментарий \*) |

<a id="topic-122608"></a>

#### Присвоение

![Присвоение](https://docs.owen.ru/book_img/2380/155445.png)

<Выражение места> (L-Value expression) может быть представлено: именем переменной (в том числе структурой), именем поля переменной-структуры, именем функции (внутри этой функции), указателем.

<Выражение> может быть любым. Порядок вычисления <выражения> и <выражения-места> не определён.

Доступ к элементу массива осуществляется по индексу. Доступ к полям структуры осуществляется через точку. Вложенный доступ поддерживается.

Разрешены присвоения выражений типа BOOL и числовых типов (см. примечание ниже), присвоения структур одного и того же типа. Присвоение переменной простого типа значения структуры (и наоборот), а также структур несовпадающих типов приведёт к ошибке компиляции \[E037\].

> [!NOTE]
> **Примечание.** Если тип идентификатора слева **больше**, чем тип, возвращаемый выражением справа, произойдёт неявное преобразование типа от меньшего к большему. В противном случае произойдёт неявное преобразование от большего типа к меньшему, компилятор выдаст предупреждение \[E607\].

Пример:

![Присвоение 1](https://docs.owen.ru/book_img/2380/155444.png)

Пример доступа к полям структур:

![Присвоение 2](https://docs.owen.ru/book_img/2380/155443.png)

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

Пример:

![Присвоение 3](https://docs.owen.ru/book_img/2380/155462.png)

В литералах массивов допускается указывать несколько первых элементов подряд. При этом оставшиеся элементы сохранят свои прежние (начальные) значения. Пропуски элементов (например, \[1,,3\]) не допускаются (ошибка компиляции E007).

> [!NOTE]
> **Примечание.** В ALTA IDE недопустима конструкция вида a := b := c

<a id="topic-122609"></a>

#### IF

Инструкция ветвления в зависимости от условия(-ий).

![IF1](https://docs.owen.ru/book_img/2380/155461.png)

Здесь блоки кода 1, 2 - представляют собой произвольное количество инструкций (от нуля до бесконечности). Блоки кода внутри могут содержать вложенные конструкции IF/FOR/WHILE.

Условия являются выражениями и должны возвращать результат типа BOOL. В противном случае произойдёт неявное преобразование в BOOL, компилятор выдаст предупреждение \[E096\].

При выполнении сначала вычисляется условие. Если оно вычисляется в значение TRUE, то исполняется блок кода 1, иначе - блок кода 2. После этого выполнение завершается. Блок ELSE может отсутствовать.

Пример:

![IF2](https://docs.owen.ru/book_img/2380/155460.png)

Также, в данной конструкции может быть использован вариант с ELSIF.

Количество блоков ELSIF не ограничено.

![IF3](https://docs.owen.ru/book_img/2380/155459.png)

Расширенная конструкция вычисляется следующим образом:

1. Вычисляется условие 1.
2. Если условие1 истинно, выполняется блок кода 1. Далее выполнение конструкции завершается. Если условие 1 ложно, вычисляется условие 2.
3. Если условие 2 истинно, выполняется блок кода 2. Если ложно - вычисляется условие 3.

И так далее по всем имеющимся блокам ELSIF. Если условия IF/ELSIF ложны, выполняется блок кода внутри ELSE. Далее выполнение конструкции завершается.

Расширенная конструкция может быть преобразована к обычной конструкции IF:

![IF4](https://docs.owen.ru/book_img/2380/155458.png)

Здесь первый блок ELSIF преобразован в блок ELSE с вложенным IF с конструкциями ELSIF/ELSE. Операционная семантика расширенной конструкции исходит из операционной семантики базового IF THEN ELSE END_IF.

Пример

![IF5](https://docs.owen.ru/book_img/2380/155457.png)

<a id="topic-122610"></a>

#### WHILE

Инструкция для цикла с предусловием.

![WHILE1](https://docs.owen.ru/book_img/2380/155456.png)

Условие должно возвращать результат типа BOOL. В противном случае произойдёт неявное преобразование в BOOL, компилятор выдаст предупреждение \[E096\].

Блок кода представляет собой произвольное количество инструкций (от нуля до бесконечности). Блок кода внутри может содержать вложенные конструкции IF/FOR/WHILE.

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

Пример:

![WHILE 2](https://docs.owen.ru/book_img/2380/155455.png)

<a id="topic-122611"></a>

#### FOR

Оператор FOR указывает, что последовательность операторов выполняется повторно, в то время как переменная управления (счётчик) инкрементируется.

![FOR](https://docs.owen.ru/book_img/2380/155454.png)

Счётчик, начальное значение и конечное значение должны быть выражениями целого типа (например, DINT). Они не должны изменяться внутри цикла. В противном случае не будет обеспечено заданное количество итераций, но выполнение завершится корректно. Переменная-счётчик должна быть объявлена. При несоответствии типов произойдёт ошибка компиляции \[E094\].

Блок кода представляет собой произвольное количество инструкций (от нуля до бесконечности). Блок кода внутри может содержать вложенные конструкции IF/FOR/WHILE. По окончании выполнения блока кода счётчик изменяется на заданный шаг.

Блок кода выполняется столько раз, сколько задано начальным и конечным значениями для счётчика.

Конструкция BY может быть опущена. В этом случае изменение счётчика происходит на 1 от начального значения к конечному.

Пример:

![FOR 1](https://docs.owen.ru/book_img/2380/155453.png)

<a id="topic-122612"></a>

#### EXIT

Утверждение EXIT используется внутри конструкций FOR и WHILE для безусловного выхода из цикла. Блок кода, расположенный после EXIT, выполняться не будет.

Счётчик FOR при выходе из цикла сохраняет своё значение.

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

![EXIT1](https://docs.owen.ru/book_img/2380/155472.png)

Пример:

![EXIT2](https://docs.owen.ru/book_img/2380/155471.png)

<a id="topic-122613"></a>

#### CONTINUE

Утверждение CONTINUE используется внутри конструкций FOR и WHILE для безусловного перехода на следующую итерацию цикла. Блок кода, расположенный после CONTINUE, выполняться не будет.

Счётчик FOR при выполнении CONTINUE сохраняет своё значение в текущей итерации и изменяется на заданный шаг в следующей итерации. Если CONTINUE вызван на последней итерации, счётчик по окончании цикла примет <конечное значение> + <шаг> (как и без использования CONTINUE).

![CONTINUE](https://docs.owen.ru/book_img/2380/155470.png)

Пример:

![CONTINUE1](https://docs.owen.ru/book_img/2380/155469.png)

<a id="topic-122614"></a>

#### RETURN

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

![RETURN](https://docs.owen.ru/book_img/2380/155468.png)

Пример:

![RETURN1](https://docs.owen.ru/book_img/2380/155467.png)

<a id="topic-122615"></a>

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

![Комментарий](https://docs.owen.ru/book_img/2380/155466.png)

<a id="topic-122616"></a>

### Тип данных переменных

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

Сначала указывается имя переменной, затем ее тип и опционально – начальное значение. Имя переменной и тип разделяются символом двоеточия. Тип и начальное значение разделяются оператором присваивания :=. Заканчивается объявление символом «точка с запятой».

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

ALTA IDE поддерживает однострочные комментарии, начинающиеся с символа //, и многострочные – размещенные между символами (\* и \*).

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

В ALTA IDE используются следующие типы переменных:

- [булевский](#topic-122617) (двоичный);
- [целочисленный](#topic-122618);
- [с плавающей точкой](#topic-122619);
- [строковые типы](#topic-122620);
- [символьные типы](#topic-122621);
- [временные типы](#topic-122622);
- [структура](#topic-122627);
- [массивы](#topic-122628).

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

<a id="topic-122617"></a>

#### BOOL

| Значения | Размер |
| --- | --- |
| TRUE (1), FALSE (0) | 1 байт |

<a id="topic-122618"></a>

#### Целочисленные типы

| Тип данных | Нижняя граница | Верхняя граница | Размер |
| --- | --- | --- | --- |
| WORD/UINT | 0 | 65535 | 16 бит |
| INT | -32768 | 32767 | 16 бит |
| DWORD/UDINT | 0 | 4294967295 | 32 бит |
| DINT | -2147483648 | 2147483647 | 32 бит |

<a id="topic-122619"></a>

#### Типы с плавающей точкой (IEEE 754)

| Тип данных | Нижняя граница | Верхняя граница | Размер |
| --- | --- | --- | --- |
| REAL | 1.0E-44 | 3.402823E+38 | 32 бит |
| LREAL | 4.94065645841247E-324 | 1.7976931348623157E+308 | 64 бит |

<a id="topic-122620"></a>

#### Строковые типы

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

| Тип данных | Кодировка | Размер |
| --- | --- | --- |
| STRING | UTF-8 | 1 байт |
| WSTRING | UCS-2 | 2 байта |

<a id="topic-122621"></a>

#### Символьные типы

| Тип данных | Кодировка | Размер |
| --- | --- | --- |
| CHAR | UTF-8 | 1 байт |
| WCHAR | UCS-2 | 2 байта |

<a id="topic-122622"></a>

#### Временные типы

| Тип данных | Описание | Формат | Разрешение | Нижняя граница | Верхняя граница | Память |
| --- | --- | --- | --- | --- | --- | --- |
| TIME (T) | Интервал времени | d-h-m-s-ms-us-ns | наносекунды (ns) | T#0 | T#18 446 744 073 709 551 615 ns | 64 бит |
| TIME_OF_DAY (TOD) | Значение местного времени, начиная с 0 часов текущих суток | часы: минуты: секунды. миллисекунды | миллисекунды (ms) | 0 ms<br>(TOD#0:0:0) | 4 294 967 295 ms\*<br>(TOD#23:59:59.999) | 32 бита |
| DATE (D) | Значение календарной даты | год-месяц-день | дни (d) | D#0000-0-0 | D#9999-12-31 | 32 бита\*\* |
| DATE_AND_TIME (DT) | Значение календарной даты и местного времени, вычисляется относительно нулевой точки 0000-0-0-0:0:0 | год-мес-день-часы:минуты:секунды.мс | миллисекунды (ms) | DT#0000-0-0-0:0:0 | DT#9999-12-31-23:59:59.999 | 8 байт |
| INSTANT | Монотонное время, точка на временной оси. Разность двух переменных типа INSTANT дает реально прошедший промежуток времени | d-h-m-s-ms-us-ns | наносекунды (ns) | 0 ns | 18 446 744 073 709 551 615 ns | 64 бит |

\* – 86399999 мс, значение, которое соответствует максимуму времени. При больших значениях отсчет времени дня должен начинаться с TOD#0:0:0

\*\* — распределение бит указано в таблице ниже

| Биты | Размер | Назначение |
| --- | --- | --- |
| 31-25 | 7 бит | Зарезервировано, не используется |
| 24-10 | 15 бит | Год (макс. 32 767 |
| 9 | 1 бит | Флаг: 1 = високосный год |
| 8-0 | 9 бит | Порядковый номер дня в году (1-366) |

<a id="topic-122623"></a>

#### Перечисляемый тип

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

Для объявления перечисляемого типа необходимо создать программный объект (программу, функцию или функциональный блок), и объявить переменные после завершающей части конструкции объявления компонента (END_PROGRAM END_FUNCTION или END_FUNCTION_BLOCK):

**Синтаксис перечисления (Enum):**

```
Программа: <имя_программы> - нередактируемый заголовок, объявление программы
   <объявление переменных и параметров>
   END_PROGRAM
TYPE
 <имя перечисления>: INT (*Можете указать другой тип или не указывать его вообще*)
(
   переменная1 := 0,
   переменная2 := 1,
   переменная3 := 2
) 
END_TYPE
```

> [!IMPORTANT]
> **Предупреждение.** На данный момент при объявлении перечислений код и программный объект ошибочно подчеркивается красным, ввиду неправильной диагностики ошибок. Не обращайте на это внимания и проверяйте на действительность ошибки при помощи сборки проекта (F4). Если сборка происходит без ошибок - проект корректен и готов к загрузке.

Если явно не инициализировать значение первой переменной - отсчет начинается с 0. Если явно задать значение первой переменной, например переменная1:= 1 - переменная2 будет равна 2.

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>END_PROGRAM<?Pub /_font?>
<?Pub _font FontColor="#1488CC"?>TYPE<?Pub /_font?>
   <?Pub _font FontColor="#E7C24A"?>eAutoMode<?Pub /_font?><?Pub _font
FontColor="#988DF7"?><?Pub /_font?> <?Pub _font FontColor="#EF724B"
?>:<?Pub /_font?> <?Pub _font FontColor="#E1E1E1"?>(
   Manual,<?Pub /_font?>    <?Pub _font FontColor="#009933"?>(*Ручной режим*)<?Pub /_font?>
   <?Pub _font FontColor="#DCDCDC"?>SemiAuto,<?Pub /_font?>  <?Pub _font
FontColor="#009933"?>(*Полуавтоматический*)<?Pub /_font?>
   <?Pub _font FontColor="#DCDCDC"?>Auto,<?Pub /_font?>      <?Pub _font
FontColor="#009933"?>(*Автоматический*)<?Pub /_font?>
   <?Pub _font FontColor="#DCDCDC"?>Service<?Pub /_font?> <?Pub _font
FontColor="#EF724B"?>:=<?Pub /_font?> <?Pub _font FontColor="#F3A1DD"
?>10<?Pub /_font?>   <?Pub _font FontColor="#009933"?>(*Сервисный режим*)<?Pub /_font?>
<?Pub _font FontColor="#E1E1E1"?>)<?Pub /_font?><?Pub _font
FontColor="#E1E1E1"?>;<?Pub /_font?>
<?Pub _font FontColor="#1488CC"?>END_TYPE<?Pub /_font?></code></td></tr></tbody></table></div></div>

Можно делать назначения числом. Например:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
  <?Pub _font FontColor="#988DF7"?>eAM<?Pub /_font?><?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?> <?Pub _font FontColor="#E7C24A"
?>eAutoMode<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>;<?Pub /_font
?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#A4DBD2"?>IF<?Pub /_font?> <?Pub _font
FontColor="#DCDCDC"?>eAM<?Pub /_font?> <?Pub _font FontColor="#EF724B"
?>=<?Pub /_font?> <?Pub _font FontColor="#FFCC99"?>Manual<?Pub /_font
?> <?Pub _font FontColor="#A4DBD2"?>THEN<?Pub /_font?>
<?Pub _font FontColor="#5DA35B"?>(* работа в ручном режиме *)<?Pub /_font
?>
<?Pub _font FontColor="#A4DBD2"?>END_IF<?Pub /_font?>
  <?Pub _font FontColor="#DCDCDC"?>eAM<?Pub /_font?> <?Pub _font
FontColor="#EF724B"?>:=<?Pub /_font?> <?Pub _font FontColor="#FFCC99"
?>SemiAuto<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>;<?Pub /_font
?> <?Pub _font FontColor="#5DA35B"?>(* eAM будет равно 1 или SemiAuto *)<?Pub /_font?>
  <?Pub _font FontColor="#DCDCDC"?>eAM<?Pub /_font?> <?Pub _font
FontColor="#EF724B"?>:=<?Pub /_font?> <?Pub _font FontColor="#F3A1DD"
?>10<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>;<?Pub /_font?>       <?Pub _font FontColor="#5DA35B"?>(* eAM будет равно 10 или Service *)<?Pub /_font
?></code></td></tr></tbody></table></div></div>

> [!NOTE]
> **Примечание.** Нельзя использовать одно и тоже имя перечисления для разных типов.

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

Например, перечисление circle используется в 2-х типах перечислений:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#1488CC"?>TYPE<?Pub /_font?>
   <?Pub _font FontColor="#E7C24A"?>enShapes<?Pub /_font?><?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?> <?Pub _font FontColor="#E1E1E1"
?>(<?Pub /_font?><?Pub _font FontColor="#DCDCDC"?>circle,<?Pub /_font
?> <?Pub _font FontColor="#DCDCDC"?>square,<?Pub /_font?> <?Pub _font
FontColor="#DCDCDC"?>triangle<?Pub /_font?><?Pub _font
FontColor="#E1E1E1"?>)<?Pub /_font?><?Pub _font FontColor="#E1E1E1"
?>;<?Pub /_font?>
   <?Pub _font FontColor="#E7C24A"?>enButtons<?Pub /_font?><?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?>   <?Pub _font FontColor="#E1E1E1"
?>(<?Pub /_font?><?Pub _font FontColor="#DCDCDC"?>circle,<?Pub /_font
?> <?Pub _font FontColor="#DCDCDC"?>pentagon, star<?Pub /_font?><?Pub _font
FontColor="#E1E1E1"?>)<?Pub /_font?><?Pub _font FontColor="#E1E1E1"
?>;<?Pub /_font?>
<?Pub _font FontColor="#1488CC"?>END_TYPE<?Pub /_font?></code></td></tr></tbody></table></div></div>

Рекомендуется определять уникальные имена перечислений:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#1488CC"?>TYPE<?Pub /_font?>
   <?Pub _font FontColor="#E7C24A"?>enShapes<?Pub /_font?><?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?> <?Pub _font FontColor="#E1E1E1"
?>(SHAPE_CIRCLE, SHAPE_SQUARE, SHAPE_TRIANGLE<?Pub /_font?><?Pub _font
FontColor="#E1E1E1"?>)<?Pub /_font?><?Pub _font FontColor="#E1E1E1"
?>;<?Pub /_font?>
   <?Pub _font FontColor="#E7C24A"?>enButtons<?Pub /_font?><?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?>   <?Pub _font FontColor="#E1E1E1"
?>(<?Pub /_font?><?Pub _font FontColor="#DCDCDC"?>BTN_CIRCLE, BTN_PENTAGON, BTN_STAR<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>)<?Pub /_font?><?Pub _font
FontColor="#E1E1E1"?>;<?Pub /_font?>
<?Pub _font FontColor="#1488CC"?>END_TYPE<?Pub /_font?></code></td></tr></tbody></table></div></div>

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

```
<имя перечисления>.<переменная>.
```

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

Пример, объявляем перечисление (Enum) в функции:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>END_FUNCTION<?Pub /_font?>
<?Pub _font FontColor="#1488CC"?>TYPE<?Pub /_font?>
<?Pub _font FontColor="#DBB740"?>eAutoMode<?Pub /_font?> <?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?> <?Pub _font FontColor="#DBB740"
?>WORD<?Pub /_font?>
<?Pub _font FontColor="#E1E1E1"?>(<?Pub /_font?>
    <?Pub _font FontColor="#E1E1E1"?>Manual<?Pub /_font?> <?Pub _font
FontColor="#EF724B"?>:=<?Pub /_font?><?Pub _font FontColor="#F3A1DD"
?>1<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>,<?Pub /_font?>  <?Pub _font FontColor="#5DA35B"?>(*Ручной режим*)<?Pub /_font?>
    <?Pub _font FontColor="#DCDCDC"?>SemiAuto,<?Pub /_font?>    <?Pub _font
FontColor="#5DA35B"?>(*Полуавтоматический*)<?Pub /_font?>
    <?Pub _font FontColor="#DCDCDC"?>Auto,<?Pub /_font?>        <?Pub _font
FontColor="#5DA35B"?>(*Автоматический*)<?Pub /_font?>
    <?Pub _font FontColor="#DCDCDC"?>Service<?Pub /_font?> <?Pub _font
FontColor="#EF724B"?>:=<?Pub /_font?> <?Pub _font FontColor="#F3A1DD"
?>5<?Pub /_font?> <?Pub _font FontColor="#5DA35B"?>(*Сервисный режим*)<?Pub /_font?>
<?Pub _font FontColor="#E1E1E1"?>)<?Pub /_font?> <?Pub _font
FontColor="#E1E1E1"?>;<?Pub /_font?>
<?Pub _font FontColor="#1488CC"?>END_TYPE<?Pub /_font?></code></td></tr></tbody></table></div></div>

Программа programm_1:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font FontColor="#5684DD"?>VAR<?Pub /_font?>
   <?Pub _font FontColor="#988DF7"?>eAM<?Pub /_font?> <?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?>  <?Pub _font FontColor="#DBB740"
?>eAutoMode<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>;<?Pub /_font
?>
   <?Pub _font FontColor="#988DF7"?>wWord<?Pub /_font?><?Pub _font
FontColor="#EF724B"?>:<?Pub /_font?> <?Pub _font FontColor="#DBB740"
?>WORD<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>;<?Pub /_font
?>
<?Pub _font FontColor="#5684DD"?>END_VAR<?Pub /_font?>
<?Pub _font FontColor="#DCDCDC"?>wWord<?Pub /_font?><?Pub _font
FontColor="#EF724B"?>:=<?Pub /_font?><?Pub _font FontColor="#DBB740"
?>eAutoMode<?Pub /_font?><?Pub _font FontColor="#E1E1E1"?>.<?Pub /_font
?><?Pub _font FontColor="#FFFFCC"?>Auto<?Pub /_font?><?Pub _font
FontColor="#E1E1E1"?>;<?Pub /_font?> <?Pub _font FontColor="#5DA35B"
?>(*wWord = 3*)<?Pub /_font?>
<?Pub _font FontColor="#5684DD"?>END_PROGRAM<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122624"></a>

#### Объявление типа

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

![Объявление типа](https://docs.owen.ru/book_img/2380/155465.png)

Здесь конструкция ()+ означает одно или более повторений.

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

1. Именем другого типа.
2. Ограничением числового типа по диапазону.
3. Объявлением структуры.

> [!IMPORTANT]
> **Предупреждение.** На данный момент в компиляторе присутствуют ошибки: объявление переменной через псевдоним к пользовательскому типу данных приведёт к ошибке исполнения.

<a id="topic-122625"></a>

##### Имя другого типа

![Имя другого типа](https://docs.owen.ru/book_img/2380/155464.png)

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

<a id="topic-122626"></a>

##### Ограничение диапазона

Представляет собой псевдоним другого целочисленного типа (в том числе встроенного) с ограниченным диапазоном значений.

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

![Ограничение диапазона](https://docs.owen.ru/book_img/2380/155463.png)

> [!NOTE]
> **Примечание.** Функционал пока недоступен, планируется поддержка в будущем

Примеры:

![Ограничение диапазона 1](https://docs.owen.ru/book_img/2380/155482.png)

<a id="topic-122627"></a>

#### Структуры

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

Количество полей от 1 до бесконечности. Попытка объявить структуру без полей приведёт к ошибке компиляции \[E028\].

Структуры могут быть вложенными. Уровень вложенности неограничен.

Объявление рекурсивной структуры приведёт к ошибке компиляции \[E029\].

Для объявления структуры необходимо создать программный объект (программу, функцию или функциональный блок), и объявить структуру после завершающей части конструкции объявления компонента (END_PROGRAM END_FUNCTION или END_FUNCTION_BLOCK):

```
Программа: <имя_программы> - нередактируемый заголовок, объявление программы
<объявления переменных и параметров>
<тело реализации>
END_PROGRAM
TYPE <имя_структуры>:
   STRUCT
         <блок объявления>
   END_STRUCT
END_TYPE
```

Пример объявления:

![Структуры 1](https://docs.owen.ru/book_img/2380/155480.png)

Доступ к полям структуры осуществляется через точку. Вложенный доступ поддерживается.

Пример доступа к полям:

![Структуры 2](https://docs.owen.ru/book_img/2380/155479.png)

<a id="topic-122628"></a>

#### Массивы

Массив - совокупность элементов данных одного типа.

Синтаксис:

![Массивы](https://docs.owen.ru/book_img/2380/155478.png)

В случае многомерного массива его размерности указываются через запятую. Число размерностей не ограничено. <Тип_данных> может быть простым типом, объявлением типа, структурой, массивом (в том числе многомерным). Массив массивов **не является** синтаксически и семантически эквивалентным многомерному массиву.

Пример объявления:

![Массивы1](https://docs.owen.ru/book_img/2380/155477.png)

Доступ к элементам массива осуществляется по индексу. Доступ по индексу вычисляется в соответствующее значение элемента массива. Попытка доступа к элементу за границами массива (индекс вычисляется на этапе компиляции) приведёт к ошибке компиляции \[E058\]. Попытка доступа к элементу за границами массива (индекс вычисляется на этапе исполнения) не приводит к ошибке исполнения.

Синтаксис:

![Массивы 2](https://docs.owen.ru/book_img/2380/155476.png)

Примеры доступа по индексу:

![Массивы 3](https://docs.owen.ru/book_img/2380/155475.png)

Доступ по индексу к массиву структур выполняется аналогично.

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

![Массивы 4](https://docs.owen.ru/book_img/2380/155474.png)

<a id="topic-122629"></a>

#### Указатели (REF_TO / POINTER TO)

Указатель - переменная, хранящая адрес некоторого объекта в памяти.

Указатель является 64-битным целым числом (ULINT).

> [!NOTE]
> **Примечание.** В МЭК61131-3 указатели используются с ключевым словом REF_TO.

Объявление:

![Указатели 1](https://docs.owen.ru/book_img/2380/155473.png)

Использование ключевого слова POINTER вызывает предупреждение компилятора (E015), как несоответствие стандарту МЭК61131-3.

Взятие указателя реализуется оператором REF(). Оператор ADR() возвращает числовое значение указателя. В компиляторе реализовано неявное преобразование в обе стороны. Разыменование (взятие значения по указателю) реализуется оператором ^.

Синтаксис:

![Указатели 2](https://docs.owen.ru/book_img/2380/155492.png)

Пример:

![Указатели 3](https://docs.owen.ru/book_img/2380/155491.png)

|   |   |
| --- | --- |
| **Указатель на массив** | Содержит адрес первого элемента массива. |
| **Указатель на структуру** | Содержит адрес первого поля по порядку указания в объявлении типа структуры. |
| **Указатель на указатель** | Допускается использовать указатель на указатель. Глубина "вложенности" неограничена. |

Пример:

![Указатели 4](https://docs.owen.ru/book_img/2380/155490.png)

Операция разыменования выглядит следующим образом:

![Указатели 5](https://docs.owen.ru/book_img/2380/155489.png)

**Арифметика указателей**

Прибавление/вычитание целочисленного выражения N из указателя вычисляется в прибавление/вычитание N\*<размер типа указателя>. Прибавление/вычитание нецелочисленного выражения (REAL, STRING, REF_TO и т.п.) из указателя приведёт к ошибке компиляции \[E071\].

Пример:

![Указатели 6](https://docs.owen.ru/book_img/2380/155488.png)

**Неявные преобразования чисел/массивов/указателей**

Ниже рассматриваются ситуации, когда выражение типа X оказывается в позиции, где ожидается выражение типа Y (или неявное преобразование X ⇒ Y).

1. Преобразование ARRAY \[…​\] OF T ⇒ REF_TO(T) выполняется.
2. Преобразование REF_TO ARRAY \[…​\] OF T ⇒ REF_TO(T) выполняется c предупреждением компилятора \[E090\].
3. Преобразование REF_TO T ⇒ SIZEOF(T) выполняется только если T имеет размер не меньше, чем REF_TO, т.е. LWORD. В противном случае произойдёт ошибка компиляции \[E065\].
4. Преобразование SIZEOF(T) ⇒ REF_TO T выполняется только если T имеет размер не меньше, чем REF_TO, т.е. LWORD. В противном случае произойдёт ошибка компиляции \[E065\].

<a id="topic-122630"></a>

### POU

POU (Programming Organization Unit) - программный компонент, структурная единица проекта, описывающая алгоритм на языке ST.

<a id="topic-122631"></a>

#### Функция

Функция - POU, возвращающий одно значение.

В ALTA IDE допускается использовать VAR_OUTPUT в функциях.

Функция не сохраняет значения переменных между вызовами. Вызов функции с одинаковыми параметрами (VAR_INPUT) приводит к одинаковому результату.

> [!NOTE]
> **Примечание.** Некоторые системные функции, например, TIME() и RANDOM() могут выдавать различные значения.

Объявление функции

![Функция 1](https://docs.owen.ru/book_img/2380/155487.png)

Здесь <имя_функции> - произвольный идентификатор. Возвращаемый тип может не указываться, в этом случае опускается двоеточие.

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

Тело реализации содержит любое (в том числе нулевое) количество утверждений.

Пример описания функции:

![Функция 2](https://docs.owen.ru/book_img/2380/155486.png)

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

Функция без результата **не должна** вызываться внутри выражения.

Пример вызова функции:

![Функция 3](https://docs.owen.ru/book_img/2380/155485.png)

<a id="topic-122632"></a>

#### Программа

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

Объявление программы:

![Программа 1](https://docs.owen.ru/book_img/2380/155484.png)

Здесь **<имя_программы>** - произвольный идентификатор.

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

Тело реализации содержит любое (в том числе нулевое) количество утверждений.

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

Вызов программы:

![Программа 2](https://docs.owen.ru/book_img/2380/155500.png)

Передача параметров VAR_INPUT в программу может осуществляться как позиционно (при отсутствии VAR_OUTPUT), так и именованно. Запрещено совмещать варианты передачи аргументов, в этом случае возникнет ошибка компиляции \[E031\]. VAR_OUTPUT могут передаваться только именованно. При наличии в программе блока VAR_OUTPUT все аргументы должны передаваться именованно.

Извне доступны только переменные VAR_INPUT и VAR_OUTPUT программы. Локальные переменные VAR извне недоступны (ошибка компиляции \[E049\]).

Пример доступа к входным/выходным параметрам программы:

![Программа 3](https://docs.owen.ru/book_img/2380/155502.png)

По окончании выполнения программы выходные параметры VAR_OUTPUT по программы передаются по значению в указанные переменные. Поток выполнения передаётся вызвавшему POU. Для принудительного завершения программы используется утверждение RETURN.

Пример вызова программы:

![Программа 4](https://docs.owen.ru/book_img/2380/155501.png)

<a id="topic-122633"></a>

#### Переменные

В языке имеются следующие виды переменных:

- VAR;
- VAR_INPUT;
- VAR_OUTPUT;
- VAR_GLOBAL.

<a id="topic-122634"></a>

##### VAR

Локальные переменные объявляются между ключевыми словами VAR и END_VAR в области объявления POU.

Пример:

![VAR](https://docs.owen.ru/book_img/2380/155499.png)

<a id="topic-122635"></a>

##### VAR_INPUT

Переменные VAR_INPUT являются аргументами для функции/программы. Переменные VAR_INPUT объявляются между ключевыми словами VAR_INPUT и END_VAR в области объявления POU.

Порядок указания переменных в блоке(-ах) VAR_INPUT определяет позиции аргументов POU.

При вызове POU происходит передача по значению.

Пример:

![VAR INPUT](https://docs.owen.ru/book_img/2380/155498.png)

<a id="topic-122636"></a>

##### VAR_OUTPUT

Переменные VAR_OUTPUT являются выходными параметрами программы. Переменные VAR_OUTPUT объявляются между ключевыми словами VAR_OUTPUT и END_VAR в области объявления POU. Порядок указания переменных в блоке(-ах) VAR_OUTPUT определяет позиции параметров при вызове POU.

По окончании выполнения POU происходит передача параметров VAR_OUTPUT по значению.

Пример:

![VAR OUTPUT](https://docs.owen.ru/book_img/2380/155497.png)

<a id="topic-122637"></a>

##### VAR_GLOBAL

Глобальные переменные видны из всех POU проекта (и доступны для чтения и записи). Глобальные переменные объявляются между ключевыми словами VAR_GLOBAL и END_VAR вне POU в отдельном списке внутри проекта. Количество списков неограничено.

Для объявления глобальной переменной необходимо создать программный объект (программу, функцию или функциональный блок), и объявить список глобальных переменных после завершающей части конструкции объявления компонента (END_PROGRAM END_FUNCTION или END_FUNCTION_BLOCK):

Пример:

![VAR GLOBAL](https://docs.owen.ru/book_img/2380/155806.png)

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

Пример:

![Var Global1](https://docs.owen.ru/book_img/2380/155805.png)

<a id="topic-122638"></a>

##### VAR RETAIN

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

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

Для переменных типа структуры и массивы со свойством retain в энергонезависимую память:

- сохраняется значение каждого поля экземпляра структуры;
- сохраняется значение каждого элемента массива.

Пример объявления в программе:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#26282C"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR RETAIN<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>iCycles<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#E7B639"?>UDINT<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>fbTON<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>TON<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>          <?Pub _font
Weight="medium" FontColor="green"?>// таймер задержки включения<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?></code></td></tr></tbody></table></div></div>

Пример объявления в списке GVL:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#26282C"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR_GLOBAL RETAIN<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>gCounter<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>DINT<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>gMode<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>1<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?></code></td></tr></tbody></table></div></div>

При перезаписи проекта на ПЛК значения retain переменных **не сохраняются**.

<a id="topic-122639"></a>

#### Примеры объявления

Переменные одного типа могут быть объявлены группами через запятую. Размер группы неограничен.

Пример 1:

![Примеры объявления](https://docs.owen.ru/book_img/2380/155495.png)

Блоки объявления **не могут** быть вложены друг в друга.

Пример 2:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#26282C"?><code><?Pub _font Weight="medium" FontColor="#3366FF"?>FUNCTION<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#3399CC"?>fct<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>VAR_INPUT<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in1<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>       <?Pub _font
Weight="medium" FontColor="#E7B639"?>DWORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> 
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>VAR_OUTPUT<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in3<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>            <?Pub _font Weight="medium" FontColor="#E7B639"?>DWORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>local1<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>local2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#E7B639"?>DWORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> 
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#3366FF"?>END_FUNCTION<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122640"></a>

### Разрешение имен

<a id="topic-122641"></a>

#### Области видимости

Каждый POU имеет локальную область видимости (переменные в разделах VAR, VAR_INPUT). Локальные переменные видны только внутри родительского POU.

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

<a id="topic-122642"></a>

#### Конфликты

<a id="topic-122643"></a>

##### Дублирование имен

Дублирование имён в области видимости - объявление переменных и/или функций с одинаковыми именами приведёт к ошибке компиляции \[E004\].

<a id="topic-122644"></a>

##### Затенение имен

Если из POU видимы одноимённые **локальная** переменная и **глобальная** переменная/функция, то компиляция и выполнение произойдут корректно.

Выражение f() будет относиться к функции, а f - к локальной переменной.

<a id="topic-122645"></a>

##### Вызов функции/возвращаемый слот функции

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

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

<a id="topic-122646"></a>

##### Имя типа/Имя функции/переменной

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

<a id="topic-122647"></a>

### Размещение данных в памяти

Данные POU размещаются в памяти последовательно в порядке объявления. Для элементарных типов данных занимаемый размер в памяти, выравнивание (кратность адреса) и сдвиг (занимаемый размер в массиве) совпадают. Для массивов выравнивание определяется выравниванием элемента массива.

| Тип данных | Размер (size) | Выравнивание (alignment) | Сдвиг (offset) |
| --- | --- | --- | --- |
| BOOL/CHAR | 1 | 1 | 1 |
| WORD/UINT/INT/WCHAR | 2 | 2 | 2 |
| DWORD/DINT/UDINT | 4 | 4 | 4 |
| REAL | 4 | 4 | 4 |
| LREAL | 8 | 8 | 8 |
| STRING(len) | len+1 | 1 | len+1 |
| WSTRING(len) | 2\*len+2 | 2 | 2\*len+2 |

<a id="topic-122648"></a>

#### Размещение структур

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

Аналогичное правило действует для вложенных структур: выравнивание в памяти для надструктуры определяется наибольшим выравниванием элементов подструктуры.

Порядок байт/слов самих элементов структуры при этом не изменяется.

Примеры:

![Размещение структур](https://docs.owen.ru/book_img/2380/155493.png)

<a id="topic-122649"></a>

#### Размещение массивов

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

Многомерные массивы (в том числе массивы массивов) располагаются в памяти по порядку указания осей. Элементы каждой оси располагаются по порядку от элемента с начальным индексом до элемента с конечным индексом. Пример: \[a11, a12, a21, a22\].

Порядок байт/слов самих элементов массива при этом не изменяется.

Примеры:

![Размещение массивов](https://docs.owen.ru/book_img/2380/155512.png)

<a id="topic-122650"></a>

## Библиотека Standard

<a id="topic-122651"></a>

### Цель документа

Библиотека Standard — это базовый набор функциональных блоков и функций, соответствующих стандарту МЭК 61131-3, обеспечивающих реализацию универсальных операций и типовых задач при программирования ПЛК.

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

Для полного понимания принципов работы в среде необходимо ознакомиться с руководством пользователя ALTA IDE.

<a id="topic-122652"></a>

### Установка библиотеки

Библиотека Standard установлена в ALTA IDE по умолчанию. Удаление данной библиотеки из проекта невозможно.

<a id="topic-122653"></a>

### Описание библиотеки Standard

Библиотека Standard содержит:

- [таймеры](#topic-122655);
- [счетчики](#topic-122659);
- [логические функциональные блоки (триггеры)](#topic-122663);
- [детекторы импульсов](#topic-122666);
- [операторы сдвига](#topic-122669);
- [строковые функции](#topic-122676);
- [математические функции](#topic-122689);
- [операторы выборки](#topic-122705);
- [валидаторы](#topic-122709);
- [операции с временными типами данных](#topic-122712);
- [преобразователи](#topic-122720).

<a id="topic-122654"></a>

#### Таймеры

<a id="topic-122655"></a>

##### TP

**Функциональный блок TP (Pulse Timer)** — повторитель импульсов.

![Диаграмма PT](https://docs.owen.ru/book_img/2380/156474.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | BOOL | Вход импульса |
| PT | TIME | Заданная длительность импульса |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q | BOOL | Выход импульса |
| ET | TIME | Внутреннее время |

Используется для генерирования импульса с заданной продолжительностью. Если IN становится «TRUE», Q становится «TRUE», и начинается отсчет внутреннего времени (ET). Если внутреннее время достигает значения PT, Q становится «FALSE» (независимо от IN). Отсчет внутреннего времени останавливается/сбрасывается, если IN становится «FALSE». Если внутреннее время не достигло значения PT, импульс IN не влияет на внутреннее время. Если внутреннее время достигло значения PT, и IN равен «FALSE», отсчет внутреннего времени останавливается/сбрасывается, и Q становится «FALSE».

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>TPInst<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>TP<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр TP<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Btn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//кнопка-сигнал<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>PulseOut<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//импульсный выход<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>TPInst<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(IN<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Btn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>, PT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#A4DA65"?>T#200ms<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>PulseOut<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>TPInst<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q;<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122656"></a>

##### TON

**Функциональный блок TON (On Delay Timer)** — таймер с задержкой включения.

![Диаграмма TON](https://docs.owen.ru/book_img/2380/156473.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | BOOL | Вход таймера |
| PT | TIME | Заданное время задержки включения |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q | BOOL | Выход таймера |
| ET | TIME | Внутреннее время |

Если IN становится «TRUE», запускается отсчет внутреннего времени (ET). Если внутреннее время достигает значения PT, Q становится «TRUE». Если IN становится «FALSE», Q становится «FALSE», а подсчет внутреннего времени останавливается/сбрасывается. Если IN становится «FALSE» до того, как внутреннее время достигло значения PT, подсчет внутреннего времени останавливается/сбрасывается, а выход Q не устанавливается в «FALSE».

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>fbTON<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>TON<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр таймера TON<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Start<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//входной сигнал<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Motor<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//выход<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5DA35B"?>//вызов таймера каждый цикл<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>fbTON<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(IN<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Start<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>, PT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#A4DA65"?>T#3s<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5DA35B"?>//выход активируется после выдержки<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Motor<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>fbTON<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q;<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122657"></a>

##### TOF

**Функциональный блок TOF (off-delay timer)** — таймер с задержкой отключения.

![Диаграмма TOF](https://docs.owen.ru/book_img/2380/156472.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| IN | BOOL | Вход таймера |
| PT | TIME | Заданное время задержки выключения |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q | BOOL | Выход таймера |
| ET | TIME | Внутреннее время |

Если IN становится «TRUE», Q становится «TRUE».

Если IN становится «FALSE», запускается отсчет внутреннего времени (ET).

Если внутреннее время достигает значения PT, Q становится «FALSE».

Если IN становится «TRUE», Q становится «TRUE», а подсчет внутреннего времени останавливается/сбрасывается.

Если IN становится «TRUE» до того, как внутреннее время достигло значения PT, подсчет внутреннего времени останавливается/сбрасывается, а выход Q не устанавливается в «FALSE».

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>fbTOFF<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>TOF<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр таймера TOF<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>RunCmd<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//команда "работать"<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Fan<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//выход на вентилятор<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>fbTOFF<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(IN<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>RunCmd<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>, PT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#A4DA65"?>T#10s<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Fan<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>fbTOFF<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>.Q;<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122658"></a>

#### Счетчики

<a id="topic-122659"></a>

##### CTU

**Функциональный блок CTU (Up Counter)** — инкрементный счётчик.

![CTU](https://docs.owen.ru/book_img/2380/156820.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| CU | BOOL | Вход счета - увеличение на 1 при срабатывании |
| RESET | BOOL | Сброс счётчика в 0 |
| PV | WORD | Предустановленное значение (уставка) |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q | BOOL | Признак достижения уставки |
| CV | WORD | Текущее значение счетчика |

По каждому фронту на входе CU (переход из FALSE в TRUE) выход CV увеличивается на 1. Выход Q устанавливается в TRUE, когда счетчик достигнет значения заданного PV. Счетчик CV сбрасывается в 0 по входу RESET = TRUE.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>CTU<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр счетчика CTU<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Pulse<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//импульсы счета<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>ResetBtn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//сброс<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Done<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Value<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font?> <?Pub _font Weight="medium" FontColor="white"?>(CU<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>Pulse<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>, RESET<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ResetBtn<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>, PV<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="violet"?>10<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//считать до 10<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Done<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q;<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#5DA35B"?>//TRUE, когда CV &gt;= 10<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Value<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.CV;<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#5DA35B"?>//текущее значение счетчика<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122660"></a>

##### CTD

**Функциональный блок CTD (Counter Down)** — декрементный счётчик.

![CTD](https://docs.owen.ru/book_img/2380/156818.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| CD | BOOL | Вход счета - уменьшение на 1 при срабатывании |
| LOAD | BOOL | Вход загрузки предустановленного значения |
| PV | WORD | Предустановленное значение (уставка) |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q | BOOL | Признак достижения 0 |
| CV | WORD | Текущее значение счетчика |

По каждому фронту на входе CD (переход из FALSE в TRUE) выход CV уменьшается на 1. Когда счетчик достигнет 0, счет останавливается, выход Q переключается в TRUE. Счетчик CV загружается начальным значением, равным PV по входу LOAD = TRUE.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>CntD<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font Weight="medium" FontColor="#E7B639"?>CTD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр счетчика CTD<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>DecPulse<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//импульсы декремента<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>LoadBtn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//загрузить начальное значение<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Zero<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="bold" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Value<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>CntD<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(CD<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>DecPulse<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>, LOAD<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>LoadBtn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>, PV<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="violet"?>10<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//загрузка 10, затем считать
 вниз<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Zero<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>CntD<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q;<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#5DA35B"?>//TRUE, когда CV = 0<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Value<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>CntD<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.CV;<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#5DA35B"?>//текущее значение счетчика<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122661"></a>

##### CTUD

**Функциональный блок CTUD (Count Up/Down)** — инкрементный/декрементный счетчик.

![CTUD](https://docs.owen.ru/book_img/2380/156819.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| CU | BOOL | Вход счета - увеличение на 1 при срабатывании |
| CD | BOOL | Вход счета - уменьшение на 1 при срабатывании |
| RESET | BOOL | Сброс счетчика в 0 |
| LOAD | BOOL | Вход загрузки предустановленного значения |
| PV | WORD | Предустановленное значение (уставка) |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| QU | BOOL | Признак достижения уставки |
| QD | BOOL | Признак достижения 0 |
| CV | WORD | Текущее значение счетчика |

По входу RESET счетчик CV сбрасывается в 0, по входу LOAD загружается значением PV.

По фронту на входе CU счетчик увеличивается на 1. По фронту на входе CD счетчик уменьшается на 1 (до 0).

QU устанавливается в TRUE, когда CV больше или равен PV.

QD устанавливается в TRUE, когда CV равен 0.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>CTUD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр счетчика CTUD<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>UpPulse<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//импульсы счета вверх<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>DnPulse<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//импульсы счета вниз<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>ResetBtn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//сброс<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>LoadBtn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//загрузка PV и CV<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>QU_reach<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="bold" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>QD_zero<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="bold" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Value<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font?> <?Pub _font Weight="medium" FontColor="white"?>(CU<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>UpPulse<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>, CD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>DnPulse<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>, RESET<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ResetBtn<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>, LOAD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>LoadBtn<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>, PV<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="violet"?>10<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>QU_reach<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.QU;<?Pub /_font
?>  <?Pub _font Weight="medium" FontColor="#5DA35B"?>//TRUE, когда CV &gt;= 10<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>QD_zero<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.QD;<?Pub /_font
?>   <?Pub _font Weight="medium" FontColor="#5DA35B"?>//TRUE, когда CV = 0<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Value<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Cnt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.CV;<?Pub /_font
?>     <?Pub _font Weight="medium" FontColor="#5DA35B"?>//текущее значение счетчика<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122662"></a>

#### Логические функциональные блоки (триггеры)

<a id="topic-122663"></a>

##### SR

**Функциональный блок SR (Set-Reset)** — переключатель с доминантой включения.

![SR](https://docs.owen.ru/book_img/2380/156824.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| SET1 | BOOL | Вход установки |
| RESET | BOOL | Вход сброса |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q1 | BOOL | Запоминаемый выход (состояние триггера) |

Функциональный блок с доминирующим входом SET1. Выход Q1 становится «TRUE», когда вход SET1 становится «TRUE». Это состояние сохраняется, даже если SET1 возвращается обратно в «FALSE». Выход Q1 возвращается в «FALSE», когда вход RESET становится «TRUE».

Если входы SET1 и RESET находятся в «TRUE» одновременно, доминирующий вход SET1 установит выход Q1 в «TRUE». Когда функциональный блок вызывается первый раз, начальное состояние Q1 это «FALSE».

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Latch<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>SR<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр переключателя SR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StartPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//установить<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StopPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//сбросить<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>MotorOn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Latch<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(SET1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StartPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>, RESET<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StopPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>MotorOn<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Latch<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q1;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122664"></a>

##### RS

**Функциональный блок RS (Reset-Set)** — переключатель с доминантой выключения.

![RS](https://docs.owen.ru/book_img/2380/156823.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| SET | BOOL | Вход установки |
| RESET1 | BOOL | Вход сброса |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q1 | BOOL | Запоминаемый выход (состояние триггера) |

Функциональный блок с доминирующим входом RESET1. Выход Q1 становится «TRUE», когда вход SET становится «TRUE». Это состояние сохраняется, даже если SET возвращается обратно в «FALSE». Выход Q1 возвращается в «FALSE», когда вход RESET1 становится «TRUE».

Если входы SET и RESET1 находятся в «TRUE» одновременно, доминирующий вход RESET1 установит выход Q1 в «FALSE». Когда функциональный блок вызывается первый раз, начальное состояние Q1 это «FALSE».

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Latch<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>RS<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр переключателя RS<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StartPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//установить<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StopPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//сбросить, доминирует<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>MotorOn<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Latch<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(SET<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StartPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>, RESET1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StopPB<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>MotorOn<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Latch<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q1;<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122665"></a>

#### Детекторы импульсов

<a id="topic-122666"></a>

##### R_TRIG

**Функциональный блок R_TRIG (Rising Trigger)** — детектор импульсов по переднему фронту.

![r-trig](https://docs.owen.ru/book_img/2380/156822.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| CLK | BOOL | Вход сигнала, по переднему фронту которого выполняется детектирование |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q | BOOL | Выход импульса |

Индикатор нарастания фронта, который генерирует на выходе одиночный импульс при нарастании фронта сигнала. Выход Q становится «TRUE», если происходит переход из «FALSE» в «TRUE» на входе CLK . Выход остается в состоянии «TRUE» от одного выполнения блока до следующего (один цикл); затем выход возвращается в «FALSE».

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>rt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font Weight="medium" FontColor="#E7B639"?>R_TRIG<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр R_TRIG<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Button<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//входной сигнал<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Pulse<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//импульс 1 цикл<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>rt<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(CLK<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>Button<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Pulse<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>rt<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q;<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#5DA35B"?>//TRUE только при переходе Button FALSE -&gt; TRUE<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#99FFFF"?>IF<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>rt<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>.Q)<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#99FFFF"?>THEN<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>dwCount<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>dwCount<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>+<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#FF99CC"?>1<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#99FFFF"?>END_IF<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122667"></a>

##### F_TRIG

**Функциональный блок F_TRIG (Falling Trigger)** — детектор импульсов по заднему фронту.

![f-trig](https://docs.owen.ru/book_img/2380/156821.png)

**Входные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| CLK | BOOL | Вход сигнала, по заднему фронту которого выполняется детектирование |

**Выходные переменные**

| Имя переменной | Тип данных | Описание |
| --- | --- | --- |
| Q | BOOL | Выход импульса |

Индикатор спада фронта, который генерирует на выходе одиночный импульс при спаде фронта сигнала. Выход Q становится «TRUE», если происходит переход из «TRUE» в «FALSE» на входе CLK . Выход будет оставаться в состоянии «TRUE» от одного выполнения блока до следующего; затем выход возвращается в «FALSE».

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>ft<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>     <?Pub _font Weight="medium" FontColor="#E7B639"?>F_TRIG<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//экземпляр F_TRIG<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Sensor<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//входной сигнал<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>Pulse<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//импульс 1 цикл<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Ft<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(CLK<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>Sensor<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>Pulse<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>ft<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>.Q;<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#5DA35B"?>//TRUE только при переходе Sensor TRUE -&gt; FALSE<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#99FFFF"?>IF<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>rt<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>.Q)<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#99FFFF"?>THEN<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>dwCount<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#7B8DF7"?>dwCount<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>+<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#FF99CC"?>1<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#99FFFF"?>END_IF<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122668"></a>

#### Операторы сдвига

<a id="topic-122669"></a>

##### SHL

**Функция SHL (Shift Left)** — побитовый сдвиг влево.

Возвращает в OUT побитный сдвиг операнда IN на N бит влево с заполнением битов справа нулями.

```
OUT:=SHL(in,n)
```

Входные переменные и результат типа BOOL, BYTE, WORD, DWORD или LWORD.

![Побитовый сдвиг влево](https://docs.owen.ru/book_img/2380/156471.png)

*Сдвиг влево, n=1*

В следующем примере представлены различные результаты out_byte и out_word в зависимости от типа входной переменной (BYTE и WORD), хотя их числовые значения равны.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>      <?Pub _font
Weight="medium" FontColor="#5DA35B"?>// 2#0100_0101<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>      <?Pub _font
Weight="medium" FontColor="#5DA35B"?>// 2#0100_0101<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>        <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>SHL<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 2#0001_0100, 16#14<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>SHL<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 2#1_0001_0100, 16#0114<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122670"></a>

##### SHR

**Функция SHR (Shift Right)** — побитовый сдвиг вправо.

Возвращает в OUT побитный сдвиг операнда IN на N бит вправо с заполнением битов слева нулями.

```
OUT:=SHR(in,n)
```

Входные переменные и результат типа BOOL, BYTE, WORD, DWORD или LWORD.

![Побитовый сдвиг вправо](https://docs.owen.ru/book_img/2380/156470.png)

*Сдвиг вправо, n=1*

Следующий пример подчеркивает зависимость результата от типа входной переменной.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>     <?Pub _font
Weight="medium" FontColor="#5DA35B"?>// 2#0100_0101<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>     <?Pub _font
Weight="medium" FontColor="#5DA35B"?>// 2#0100_0101<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>        <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>SHR<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 2#0001_0001, 16#11<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>SHR<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 2#0000_0000_0001_0001, 16#0011<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122671"></a>

##### ROL

**Функция ROL (Rotate Left)** — циклический сдвиг влево.

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

```
OUT:=ROL(in,n)
```

Входные переменные и результат типа BOOL, BYTE, WORD, DWORD или LWORD.

![Циклический сдвиг влево](https://docs.owen.ru/book_img/2380/156469.png)

*Циклический сдвиг влево, n=1*

В следующем примере представлены различные результаты OUT_byte и OUT_word в зависимости от типа входной переменной (BYTE и WORD), хотя числовые их значения равны.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>        <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>ROL<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 16#15<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>ROL<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 16#0114<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122672"></a>

##### ROR

**Функция ROR (Rotate Right)** — циклический сдвиг вправо.

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

```
OUT:=ROR(in,n)
```

Входные переменные и результат типа BOOL, BYTE, WORD, DWORD или LWORD.

![Циклический сдвиг вправо](https://docs.owen.ru/book_img/2380/156468.png)

*Циклический сдвиг вправо, n=1*

Следующий пример подчеркивает зависимость результата от типа входной переменной.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#45<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>        <?Pub _font Weight="medium" FontColor="#E7B639"?>BYTE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_byte<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>ROR<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_byte<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 16#51<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>out_word<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>ROR<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>in_word<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>n<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Результат 16#4011<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122673"></a>

##### TO_BIG_ENDIAN, TO_LITTLE_ENDIAN

Функции интерпретации порядка байт при обмене данными.

- TO_BIG_ENDIAN — старший байт передаётся первым.
- TO_LITTLE_ENDIAN — младший байт передаётся первым

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

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>w<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#1234<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#1234<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>wBE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>qLE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>wBE<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>TO_BIG_ENDIAN<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>w<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?>    <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Возвращаемое значение 16#3412<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>qLE<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>TO_LITTLE_ENDIAN<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//Возвращаемое значение 16#1234<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122674"></a>

##### FROM_BIG_ENDIAN, FROM_LITTLE_ENDIAN

Функция интерпретации порядка байт при обмене данными.

- FROM_BIG_ENDIAN — интерпретирует входное значение как записанное в big-endian, и преобразует его в порядок байт, принятых в системе.
- FROM_LITTLE_ENDIAN — интерпретирует входное значение как записанное в little-endian, и преобразует его в порядок байт, принятых в системе.

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

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>wFBE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#3412<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>(*байты 34 12, как если бы пришло от big-endian
значение 16#1234*)<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>wFLE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#1234<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>(*байты 12 34, как если бы пришло от little-endian
значение 16#1234*)<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>valBE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>valLE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>valBE<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>FROM_BIG_ENDIAN<?Pub /_font?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#7B8DF7"?>wFBE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#5DA35B"?>(*на little-endian CPU возвращаемое значение 
16#1234*)<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>valLE<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>FROM_LITTLE_ENDIAN<?Pub /_font?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#7B8DF7"?>wFLE<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>(*на little-endian CPU возвращаемое значение 
16#1234*)<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122675"></a>

#### Строковые функции

<a id="topic-122676"></a>

##### LEN

Функция, возвращающая длину строки.

Аргумент STR типа STRING, возвращаемое значение типа DINT.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>LEN<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 4<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122677"></a>

##### LEFT

Функция, возвращающая левую часть строки заданной длины.

Входная строка STR типа STRING, размер SIZE типа INT, возвращаемое значение STRING.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>LEFT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF6699"?>3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ’ALT’<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122678"></a>

##### RIGHT

Функция, возвращающая правую часть строки заданной длины.

Входная строка STR типа STRING, размер SIZE типа INT, возвращаемое значение STRING.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>RIGHT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF6699"?>3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ’LTA’<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122679"></a>

##### MID

Функция, возвращающая часть строки заданной длины с заданной позиции.

Входная строка STR типа STRING, размер LEN и POS типа INT, возвращаемое значение STRING.

<div><div><table><tbody><tr><td><?PubTbl cell border-bottom-style="none"
border-left-style="none" border-top-style="none"?><code>MID (STR, LEN, POS) </code></td><td><?PubTbl cell border-bottom-style="none" border-right-style="none"
border-top-style="none"?><p>означает: вырезать LEN символов из STR
строки, начиная с POS.</p></td></tr></tbody></table></div></div>

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>MID<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF6699"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF6699"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ’LT’<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122680"></a>

##### CONCAT

Конкатенация (объединение) двух строк.

Обе входных строки STR1 и STR2 и результат типа STRING.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>CONCAT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IDE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ’ALTAIDE’<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122681"></a>

##### INSERT

Функция, предназначенная для вставки одной строки в заданную позицию другой строки.

Входные переменные STR1 и STR2 - типа STRING, POS - типа INT, возвращаемое значение - строка STRING.

<div><div><table><tbody><tr><td><?PubTbl cell
border-bottom-style="none"
border-left-style="none" border-top-style="none"?><code>INSERT(STR1, STR2, POS)</code></td><td><?PubTbl cell border-bottom-style="none" border-right-style="none"
border-top-style="none"?><p>означает: вставить STR2 в STR1 в позиции
POS.</p></td></tr></tbody></table></div></div>

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>INSERT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IDE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ’ALIDETA’<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122682"></a>

##### DELETE

Функция, предназначенная для удаления части строки с заданной позиции.

Входные переменные STR типа STRING, LEN и POS типа INT, возвращаемое значение строка STRING.

<div><div><table><tbody><tr><td><?PubTbl cell
border-bottom-style="none"
border-left-style="none" border-top-style="none"?><code>DELETE(STR, LEN, POS)</code></td><td><?PubTbl cell border-bottom-style="none" border-right-style="none"
border-top-style="none"?><p>означает: удалить LEN символов из STR,
начиная с позиции POS.</p></td></tr></tbody></table></div></div>

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>DELETE<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTAIDE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ’ALTDE’<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122683"></a>

##### REPLACE

Функция, предназначенная для замены части строки другой строкой с заданной позиции указанной длины.

Входные переменные STR1 и STR2 типа STRING, LEN и POS типа INT, возвращаемое значение строка STRING.

<div><div><table><tbody><tr><td><?PubTbl cell
border-bottom-style="none"
border-left-style="none" border-top-style="none"?><code>REPLACE(STR1, STR2, LEN, POS)</code></td><td><?PubTbl cell border-bottom-style="none" border-right-style="none"
border-top-style="none"?><p>означает: заменить LEN символов строки
STR1 на STR2 начиная с позиции POS.</p></td></tr></tbody></table></div></div>

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="bold" FontColor="#7B8DF7"?>VarSTRING1<?Pub /_font
?> <?Pub _font Weight="bold" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font Weight="bold" FontColor="#009999"?>REPLACE<?Pub /_font?> <?Pub _font
Weight="bold" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="bold" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="bold" FontColor="white"?>’,‘<?Pub /_font?><?Pub _font
Weight="bold" FontColor="#7B8DF7"?>IDE<?Pub /_font?><?Pub _font
Weight="bold" FontColor="white"?>’,<?Pub /_font?><?Pub _font
Weight="bold" FontColor="#FF6699"?>2<?Pub /_font?><?Pub _font
Weight="bold" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="bold" FontColor="#FF6699"?>2<?Pub /_font?><?Pub _font
Weight="bold" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="bold" FontColor="#5DA35B"?>//возвращаемое значение ’AIDEA’<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122684"></a>

##### FIND

Функция, предназначенная для поиска позиции заданного контекста в строке.

Входные переменные STR1 и STR2 типа STRING, возвращаемое значение INT.

<div><div><table><tbody><tr><td><?PubTbl cell border-bottom-style="none"
border-left-style="none" border-top-style="none"?><code>FIND(STR1, STR2)</code></td><td><?PubTbl cell border-bottom-style="none" border-right-style="none"
border-top-style="none"?><p>означает: найти позицию в строке STR1,
где впервые встречается подстрока STR2.</p></td></tr></tbody></table></div></div>

Нумерация позиций в строке начинается с 1. Если STR2 не найдена, STR1 возвращает 0.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>VarINT1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>FIND<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA IDE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ID<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 6<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122685"></a>

##### STRING_EQUAL, WSTRING_EQUAL

Функция, предназначенная для сравнения входных переменных и возврата значения TRUE при совпадении значений.

Входные переменные могут быть типа STRING и WSTRING, возвращаемое значение типа BOOL.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>STRING_EQUAL<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IDE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’);<?Pub /_font?>    <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ‘FALSE’<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>STRING_EQUAL<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’,‘<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>’);<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ‘TRUE’<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>WSTRING_EQUAL<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>("<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>","<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IDE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>");<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ‘FALSE’<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>WSTRING_EQUAL<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>("<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>","<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>ALTA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>");<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение ‘TRUE’<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122686"></a>

##### STRING_GREATER, WSTRING_GREATER

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

Входные переменные могут быть типа STRING и WSTRING, возвращаемое значение типа BOOL.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN1<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>STRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>‘ALTA’<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN2<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>STRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>‘IDE’<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN3<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WSTRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>"IDE"<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN4<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WSTRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>"ALTA"<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>GS<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>GW<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>GS<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>STRING_GREATER<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN1<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>(*возвращаемое значение FALSE, т.к. 'A' 
лексикографически меньше 'I'*)<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>GW<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>WSTRING_GREATER<?Pub /_font?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN4<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>(*возвращаемое значение TRUE, т.к. 'I' 
лексикографически больше 'A'*)<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122687"></a>

##### STRING_LESS, WSTRING_LESS

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

Входные переменные могут быть типа STRING и WSTRING, возвращаемое значение типа BOOL.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN1<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>STRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>‘ALTA’<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN2<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>STRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>‘IDE’<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN3<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WSTRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>"IDE"<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>IN4<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WSTRING<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#00CC99"?>"ALTA"<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>GS<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>GW<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>  <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>GS<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>STRING_LESS<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN1<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>(*возвращаемое значение TRUE, т.к. 'A' 
лексикографически меньше 'I'*)<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>GW<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>WSTRING_LESS<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>IN4<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>(*возвращаемое значение FALSE, т.к. 'I' 
лексикографически больше 'A'*)<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122688"></a>

#### Математические функции

<a id="topic-122689"></a>

##### ABS

Функция, предназначенная для возврата модуля входного числа.

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

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>ABS<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>-<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>5<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 5<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122690"></a>

##### SQRT

Функция, предназначенная для возврата квадратного корня входного числа.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>SQRT<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>16.0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 4.0<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122691"></a>

##### LN

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

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>LN<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>36.6<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 3.6000482404073<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122692"></a>

##### LOG

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

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>LOG<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?><?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>36.6<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 1.5634810853944<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122693"></a>

##### EXP

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

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>EXP<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>2.0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 7.3890561<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122694"></a>

##### SIN

Функция, предназначенная для возврата значения sin (синуса) входного числа.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>SIN<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.5<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0.4794255386<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122695"></a>

##### COS

Функция, предназначенная для возврата значения cos (косинуса) входного числа.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>COS<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.7<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0.7648421873<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122696"></a>

##### TAN

Функция, предназначенная для возврата значения tg (тангенса) входного числа.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>TAN<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.33<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0.342654129<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122697"></a>

##### ASIN

Функция, предназначенная для возврата значения arcsin (арксинуса) входного числа.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>ASIN<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.5<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0.5235987756<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122698"></a>

##### ACOS

Функция, предназначенная для возврата значения arccos (арккосинуса) входного числа.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>ACOS<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.7<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0.7953988302<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122699"></a>

##### ATAN

Функция, предназначенная для возврата значения arctg (арктангенса) входного числа.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>ATAN<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.33<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0.3187475604<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122700"></a>

##### EXPT

Функция, предназначенная для возврата значения входного числа IN1 в степени IN2.

Входная переменная IN1 может быть типа REAL и LREAL, IN2 любого числового типа, возвращаемое значение типа REAL и LREAL.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>var1<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>EXPT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>7.1<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 50.41<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122701"></a>

##### TRUNC

Функция, предназначенная для возврата целой части входного числа.

Входная переменная может быть типа REAL и LREAL, возвращаемое значение типа LINT.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>x<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>TRUNC<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>7.9<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 7<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>y<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>TRUNC<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>-<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.9<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122702"></a>

##### ROUND

Функция, предназначенная для округления входного числа до ближайшего целого.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>ROUND<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>2.3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 2.0<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122703"></a>

##### ATAN2

Функция, предназначенная для возврата значения угла направления вектора.

Входная переменная может быть типа REAL и LREAL, с соответствующим возвращаемым значением.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>q<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>ATAN2<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0.0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#EF7244"?>-<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>1.0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 3.141592653589793<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122704"></a>

#### Операторы выборки

<a id="topic-122705"></a>

##### MAX

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

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

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>MAX<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>10<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>12<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 12<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122706"></a>

##### MIN

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

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

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>MIN<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>10<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>12<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 10<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122707"></a>

##### LIMIT

Функция, предназначенная для возврата ограниченного значения входной переменной.

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

```
OUT := LIMIT(Min, IN, Max);
```

MIN и MAX задают нижнюю и верхнюю границы значений.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#009999"?>LIMIT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>5<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>10<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?>   <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 5<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>LIMIT<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="bold" FontColor="#EF7244"?>-<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>2<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>10<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 0<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#009999"?>LIMIT<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>0<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="bold" FontColor="#EF7244"?>-<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>15<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#FF99CC"?>10<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 10<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122708"></a>

#### Валидаторы

<a id="topic-122709"></a>

##### IS_VALID

Функция, предназначенная для проверки корректности значения: не содержит NaN (Not-a-Number, «не число») и Inf (Infinity, «бесконечность»). Возвращает значение TRUE, если значение корректно.

Входные переменные могут быть типа REAL и LREAL, возвращаемое значение типа BOOL.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>x<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>   <?Pub _font Weight="medium" FontColor="#E7B639"?>LREAL<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>12.5<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="teal"?>IS_VALID<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>x<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение TRUE, т.к. x — корректное число<?Pub /_font?></code></td></tr></tbody></table></div></div>

<a id="topic-122710"></a>

##### IS_VALID_BCD

Функция, предназначенная для проверки корректности значения двоично-десятичного кода и возврата значения TRUE, если значение корректно.

Входные переменные могут быть типа BOOL, BYTE, WORD, DWORD, LWORD, возвращаемое значение типа BOOL.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>bcdVal<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>16#1234<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//BCD: 1-2-3-4<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>    <?Pub _font Weight="medium" FontColor="#E7B639"?>BOOL<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>OUT<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="teal"?>IS_VALID_BCD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>bcdVal<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение TRUE<?Pub /_font
?></code></td></tr></tbody></table></div></div>

<a id="topic-122711"></a>

#### Операции с временными типами данных

<a id="topic-122712"></a>

##### CONCAT_DATE, \_TOD, \_LTOD, \_DT, \_LDT

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

Входные переменные могут быть

- любого целочисленного типа, возвращаемое значение DATE, TOD, LTOD, DT, LDT;

<!-- -->

- типа DATE и TOD, возвращаемое значение DT;
- типа DATE и LTOD, возвращаемое значение DT.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>y<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>2026<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>m<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>11<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>d<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>15<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>myDate<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>DATE<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>myDate<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="teal"?>CONCAT_DATE<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>y<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>m<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>d<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение 2026-11-15<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122713"></a>

##### SPLIT_DATE, \_TOD, \_LTOD, \_DT, \_LDT

Функция, предназначенная для разделения временных переменных.

Входные переменные могут быть типов DATE, TOD, LTOD, DT, LDT, возвращаемое значение INT.

> [!NOTE]
> **Примечание.** В данной реализации возвращаемое значение всегда будет равно 0. Функцию можно использовать для разделения входной временной переменной на выходные переменные целочисленного типа.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>myDate<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>DATE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>D#2026-02-20;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>y<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>m<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>d<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>f<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?>      <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>f<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="teal"?>SPLIT_DATE<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>myDate<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>y<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>m<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#7B8DF7"?>d<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//выходные переменные y=2026, m=02, d=20<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122714"></a>

##### ADD_TIME, \_TOD, \_DT, INSTANT

> [!NOTE]
> **Примечание.** В текущей версии ALTA IDE сложение временных типов с помощью функции ADD не поддерживается. Воспользуйтесь оператором "+"

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

| Наименование функции | Входные переменные | Выход функции | Пример |
| --- | --- | --- | --- |
| ADD_TIME | TIME | TIME | T#1s + T#500ms = T#1s500ms |
| ADD_TOD_TIME | TIME, TOD | TOD | Прибавляет временной интервал к времени суток, время суток смещается вперед на интервал:<br>T#10s + TOD#12:00:00 = TOD#12:00:10 |
| ADD_DT_TIME | DT, TIME | DT | Прибавляет временной интервал к дате-времени, время суток смещается вперед на интервал:<br>T#1h + DT#2026-02-20-12:00:00 = DT#2026-02-20-13:00:00 |
| ADD_INSTANT_TIME | INSTANT, TIME | INSTANT | T#1h + 25ns = 1h25ns |

<a id="topic-122715"></a>

##### SUB_TIME, \_DATE, \_TOD, \_DT, INSTANT

> [!NOTE]
> **Примечание.** В текущей версии ALTA IDE вычитание временных типов с помощью функции SUB не поддерживается. Воспользуйтесь оператором "-"

Функции, предназначенные для вычитания переменных временных типов.

| Наименование функции | Входные переменные | Выход функции | Пример |
| --- | --- | --- | --- |
| SUB_TIME | TIME | TIME | T#15s - T#8s = T#7s |
| SUB_DATE_DATE | DATE | TIME | D#2026-02-20 - D#2026-02-18 = T#48h |
| SUB_TOD_TIME | TOD, TIME | TOD | TOD#12:00:10 - T#5s = TOD#12:00:05 |
| SUB_TOD_TOD | TOD | TIME | TOD#12:00:10 - TOD#12:00:03 = TIME#7s |
| SUB_DT_TIME | DT, TIME | DT | DT#2026-02-20-12:00:10 - T#5s =  DT#2026-02-20-12:00:05 |
| SUB_DT_DT | DT | TIME | DT#2026-02-20-12:00:10 - DT#2026-02-20-12:00:03 = T#7s |
| SUB_INSTANT_INSTANT | INSTANT | INSTANT | 12ns - 5 ns= T#7ns |
| SUB_INSTANT_INSTANT | INSTANT | TIME | 12ns - T#7ns = 5 ns |

<a id="topic-122716"></a>

##### MUL_TIME

> [!NOTE]
> **Примечание.** В текущей версии ALTA IDE умножение временных типов с помощью функции MUL не поддерживается. Воспользуйтесь оператором "\*"

Функция, предназначенная для умножения временной переменной на число.

Входная переменная TIME и переменная любого числового типа данных, возвращаемое значение типа TIME.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>t<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="teal"?>MUL_TIME<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#66FF66"?>T#2s<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>3<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение T#6s<?Pub /_font
?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122717"></a>

##### DIV_TIME

> [!NOTE]
> **Примечание.** В текущей версии ALTA IDE деление временных типов с помощью функции DIV не поддерживается. Воспользуйтесь оператором "/"

Функция, предназначенная для деления временной переменной на число.

Входная переменная TIME и переменная любого числового типа данных, возвращаемое значение типа TIME.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>t1<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="teal"?>DIV_TIME<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#66FF66"?>T#10s<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>,<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF99CC"?>4<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение T#2s500ms<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122718"></a>

##### TIME

Функция, предназначенная для возврата значения местного времени, начиная с 00.00 текущих суток.

Возвращаемое значение типа TIME.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>CurTime<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#E7B639"?>TIME<?Pub /_font
?><?Pub _font Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>CurTime<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="teal"?>TIME<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>();<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение - текущее время, например T#6h41m30s<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122719"></a>

##### INSTANT_NOW

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

Возвращаемое значение типа INSTANT.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>StartTime<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>INSTANT<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>StartTime<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="teal"?>INSTANT_NOW<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>();<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#5DA35B"?>//возвращаемое значение - время от начала запуска 
приложения, например 1h15m30s<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

<a id="topic-122720"></a>

#### Преобразователи

Преобразование типов происходит с помощью функций-преобразователей.

Пример:

<div><div><table><tbody><tr><td><?Pub _cellfont Shading="#2E3136"?><code><?Pub _font Weight="medium" FontColor="#5684DD"?>VAR<?Pub /_font
?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>wVal<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>WORD<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#FF6699"?>16#00FA<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>  <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//250<?Pub /_font?>
    <?Pub _font Weight="medium" FontColor="#7B8DF7"?>iVal<?Pub /_font
?><?Pub _font Weight="medium" FontColor="#EF7244"?>:<?Pub /_font?> <?Pub _font Weight="medium" FontColor="#E7B639"?>INT<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>;<?Pub /_font?>
<?Pub _font Weight="medium" FontColor="#5684DD"?>END_VAR<?Pub /_font
?>
<?Pub _font Weight="medium" FontColor="#7B8DF7"?>iVal<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="#EF7244"?>:=<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="teal"?>WORD_TO_INT<?Pub /_font
?> <?Pub _font Weight="medium" FontColor="white"?>(<?Pub /_font?><?Pub _font
Weight="medium" FontColor="#7B8DF7"?>wVal<?Pub /_font?><?Pub _font
Weight="medium" FontColor="white"?>);<?Pub /_font?> <?Pub _font
Weight="medium" FontColor="#5DA35B"?>//iVal = 250<?Pub /_font?>
</code></td></tr></tbody></table></div></div>

| Тип данных | Может быть преобразован |
| --- | --- |
| LWORD | DWORD, WORD, BYTE, BOOL, LREAL, LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT, STRING, WSTRING, DATE, LDATE, DT, LDT, TOD, LTOD, TIME, LTIME |
| DWORD | LWORD, WORD, BYTE, BOOL, REAL, LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT, STRING, WSTRING |
| WORD | LWORD, DWORD, BYTE, BOOL, LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT |
| BYTE | LWORD, DWORD, WORD, BOOL, CHAR, LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT, STRING, WSTRING |
| BOOL | LWORD, DWORD, WORD, BYTE, LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT |
| CHAR | BYTE, WORD, DWORD, LWORD, STRING, WCHAR |
| WCHAR | WORD, DWORD, LWORD, WSTRING, CHAR |
| REAL | DWORD, STRING, WSTRING, LREAL, LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT |
| LREAL | LWORD, STRING, WSTRING, REAL, LINT, DINT, INT, SINT, ULINT, UDINT, UINT, USINT, TIME |
| SINT | LWORD, DWORD, WORD, BYTE, LREAL, REAL, LINT, DINT, INT, ULINT, UDINT, UINT, USINT |
| INT | LWORD, DWORD, WORD, BYTE, LREAL, REAL, LINT, DINT, SINT, ULINT, UDINT, UINT, USINT |
| DINT | LWORD, DWORD, WORD, BYTE, BOOL, LREAL, REAL, LINT, INT, SINT, ULINT, UDINT, UINT, USINT |
| LINT | LWORD, DWORD, WORD, BYTE, STRING, WSTRING, LREAL, REAL, DINT, INT, SINT, ULINT, UDINT, UINT, USINT, TIME, TOD, DATE, BOOL |
| USINT | LWORD, DWORD, WORD, BYTE, STRING, LREAL, REAL, LINT, DINT, INT, SINT, ULINT, UDINT, UINT |
| UINT | LWORD, DWORD, WORD, BYTE, STRING, LREAL, REAL, LINT, DINT, INT, SINT, ULINT, UDINT, USINT |
| UDINT | LWORD, DWORD, WORD, BYTE, STRING, LREAL, REAL, LINT, DINT, INT, SINT, ULINT, UINT, USINT |
| ULINT | LWORD, DWORD, WORD, BYTE, STRING, LREAL, REAL, LINT, DINT, INT, SINT, UDINT, UINT, USINT, DATE, DT, TOD, TIME |
| STRING | LINT, DINT, REAL, LREAL, WSTRING, CHAR |
| WSTRING | LINT, DINT, REAL, LREAL, WCHAR |
| TIME | STRING, WSTRING, LWORD, LINT, ULINT, LREAL |
| DATE | STRING, WSTRING, LWORD, LINT, ULINT |
| TOD | STRING, WSTRING, LWORD, LINT, ULINT |
| DT | STRING, WSTRING, LWORD, LINT, ULINT, DATE, TOD |
