---
title: "Руководство пользователя Полигон 2. Библиотека paCore"
product: "Полигон"
document_number: "№ 1-RU-137992-1.2"
version: "1.2"
language: "ru"
source: "https://docs.owen.ru/product/poligon/doc/1217"
pdf: "https://docs.owen.ru/download/pdf/QPQp_.rp_poligon+2.+biblioteka+pacore_1-ru-137992-1.2.pdf"
generated: "2026-10-09"
---

# Руководство пользователя Полигон 2. Библиотека paCore

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

- [Используемые термины и сокращения](#topic-95965)
- [Введение](#topic-95966)
- [Знакомство со средой разработки](#topic-95967)
  - [Установка среды программирования для Windows](#topic-95968)
  - [Установка среды программирования для ОС Linux](#topic-95969)
  - [Первый запуск](#topic-95970)
  - [Контроллеры](#topic-95971)
  - [Лицензирование](#topic-95972)
    - [Описание лицензионных пакетов](#topic-95973)
      - [Опции лицензионных пакетов](#topic-95974)
        - [Загрузка файлов лицензий в ПЛК в среде Полигон](#topic-95975)
        - [Загрузка файлов лицензий в ПЛК через WinSCP](#topic-95976)
        - [Загрузка файлов лицензий в ПЛК через терминал Linux](#topic-95977)
  - [Библиотеки](#topic-95978)
    - [Стандартные библиотеки](#topic-95979)
    - [Установка библиотек](#topic-95980)
  - [Обновление](#topic-95981)
  - [Контроль версий](#topic-95982)
  - [Обслуживание](#topic-95983)
- [Общие сведения о среде](#topic-95984)
  - [Проект](#topic-95985)
  - [Структура проекта](#topic-95986)
  - [Поток данных](#topic-95987)
  - [Страница](#topic-95988)
  - [Функциональный блок](#topic-95989)
    - [Входы](#topic-95990)
    - [Выходы](#topic-95991)
    - [Связи](#topic-95992)
  - [Составной блок](#topic-95993)
- [Интерфейс](#topic-95994)
  - [Окна](#topic-95995)
    - [Окна представления](#topic-95996)
      - [Панели инструментов для работы с окнами представления](#topic-95997)
      - [Дерево](#topic-95998)
      - [Страница](#topic-95999)
      - [Окно Составной блок](#topic-96000)
      - [Функциональный блок](#topic-96001)
      - [Редактор](#topic-96002)
      - [Таблица](#topic-96003)
      - [График](#topic-96004)
      - [Экран отладчика](#topic-96005)
    - [Системные окна](#topic-96006)
      - [Контроллер](#topic-96007)
      - [Прогресс](#topic-96008)
      - [Проекты](#topic-96009)
      - [Настройки сборки](#topic-96010)
      - [Поиск](#topic-96011)
      - [Справка](#topic-96012)
      - [О программе](#topic-96013)
      - [Печать](#topic-96014)
  - [Окно Свойства](#topic-96015)
  - [Конфигурация экрана](#topic-96016)
  - [Настройки приложения](#topic-96017)
- [Редактирование проекта](#topic-96018)
  - [Создание нового проекта](#topic-96019)
  - [Создание компонентов проекта](#topic-96020)
    - [Создание таймерного потока Ввод-вывод](#topic-96021)
    - [Создание места работы Поток](#topic-96022)
  - [Создание функционального блока](#topic-96023)
  - [Создание циклических входов/выходов и групп входов/выходов](#topic-96024)
  - [Комментарии у входов/выходов блоков](#topic-96025)
  - [Проведение связей](#topic-96026)
  - [Проведение связей между модулями](#topic-96027)
  - [Задание порядка выполнения функциональных блоков на странице](#topic-96028)
  - [Добавление стрелок, фона и текста на страницы](#topic-96029)
  - [Добавление входов и выходов в разделы](#topic-96030)
  - [Навигация по проекту](#topic-96031)
  - [Копирование частей проекта](#topic-96032)
  - [Перенос блоков, страниц, программ](#topic-96033)
- [Трансляция](#topic-96034)
- [Загрузка и запуск проекта](#topic-96035)
  - [Свойства модуля для загрузки проекта в ПЛК210](#topic-96036)
  - [Панель отладки](#topic-96037)
  - [Запуск проекта через web-интерфейс конфигурации](#topic-96038)
  - [Запуск проекта через окно Контроллер](#topic-96039)
  - [Запуск проекта на виртуальном контроллере](#topic-96040)
- [Отладка проекта](#topic-96041)
  - [Подмена значений на входах/выходах](#topic-96042)
  - [График](#topic-96043)
  - [Экран отладчика](#topic-96044)
  - [Информация о запущенном проекте](#topic-96045)
- [Возможности пользовательской конфигурации](#topic-96046)
  - [Создание составного блока](#topic-96047)
    - [Создание составного блока из функциональных блоков](#topic-96048)
    - [Создание составного блока на C++](#topic-96049)
      - [Создание составных блоков с переменным числом входов/выходов на C++](#topic-96050)
      - [Доступ к системной информации из кода составного блока на C++](#topic-96051)
    - [Свойства типов составных блоков и их входов/выходов](#topic-96052)
    - [Создание справки для составных блоков](#topic-96053)
  - [Создание библиотеки](#topic-96054)
    - [Создание справки для библиотек](#topic-96055)
  - [Экспорт/импорт свойств из MS Excel](#topic-96056)
  - [Генерация из MS Excel](#topic-96057)
  - [Создание серверного многопользовательского проекта](#topic-96058)
- [Защита проекта](#topic-96059)
  - [Шифрование однопользовательского проекта](#topic-96060)
  - [Пароли на составных блоках](#topic-96061)
  - [Пароль отладчика. Управление пользователями](#topic-96062)
- [paCore. Основная библиотека проекта](#topic-96063)
  - [Работа с типами данных](#topic-96064)
    - [Типы данных](#topic-96065)
    - [Преобразователи типов](#topic-96066)
    - [Константы](#topic-96067)
    - [Терминальные блоки](#topic-96068)
  - [Арифметические блоки](#topic-96069)
    - [Сложение (Add)](#topic-96070)
    - [Целочисленное сложение (Addl)](#topic-96071)
    - [Вычитание (Sub)](#topic-96072)
    - [Умножение (Mul)](#topic-96073)
    - [Деление (Div)](#topic-96074)
    - [Целочисленное деление (Divl)](#topic-96075)
    - [Корень квадратный (Sqrt)](#topic-96076)
    - [Инверсия значения (Inv)](#topic-96077)
    - [Абсолютное значение (Abs)](#topic-96078)
    - [Минимальное/максимальное значение (MinMax)](#topic-96079)
    - [Селектор минимального/максимального значения (MinMax2)](#topic-96080)
    - [Сравнение (Cmpr)](#topic-96081)
    - [Маскирование (Mask)](#topic-96082)
    - [Сдвиг влево (Shrl)](#topic-96083)
    - [Сдвиг вправо (Shrr)](#topic-96084)
    - [Табличная функция (TabF)](#topic-96085)
    - [Экспонента (Exp)](#topic-96086)
    - [Логарифм (Ln)](#topic-96087)
    - [Возведение в степень (Pow)](#topic-96088)
    - [Сложение некоторых слагаемых (SumGR)](#topic-96089)
    - [Пакетное умножение и округление (mb_ai)](#topic-96090)
    - [Пакетное умножение (mb_ao)](#topic-96091)
    - [Округление (flt_round)](#topic-96092)
    - [Определение знака (Sign)](#topic-96093)
    - [Переворачивание байт в слове (SwapBytes)](#topic-96094)
    - [Арифметические блоки для аргументов double, long, Uint64](#topic-96095)
  - [Логические блоки](#topic-96096)
    - [Логическое И (AND)](#topic-96097)
    - [Логическое ИЛИ (OR)](#topic-96098)
    - [Логическое НЕ-И (nAND)](#topic-96099)
    - [Логическое НЕ (NOT)](#topic-96100)
    - [Логическое НЕ-ИЛИ (nOR)](#topic-96101)
    - [Логическое сложение по модулю два (XOR)](#topic-96102)
    - [Логическое ИЛИ с блокировкой (Bl_Or)](#topic-96103)
    - [Детектор фронтов (Fronts)](#topic-96104)
    - [Детектор логического канала (bDetect)](#topic-96105)
    - [Контроль ключа (LogContr)](#topic-96106)
  - [Тригонометрические функции](#topic-96107)
    - [Синус (Sin)](#topic-96108)
    - [Косинус (Cos)](#topic-96109)
    - [Тангенс (Tan)](#topic-96110)
    - [Арктангенс (ATan)](#topic-96111)
    - [Арксинус (ASin)](#topic-96112)
    - [Арккосинус (ACos)](#topic-96113)
  - [Переключатели, реле и мультиплексоры](#topic-96114)
    - [Дешифратор (Decoder)](#topic-96115)
    - [Ключ (Key)](#topic-96116)
    - [Коммутатор 8-битных регистров (R8Switch)](#topic-96117)
    - [Коммутатор вещественных переменных (fSwitch)](#topic-96118)
    - [Коммутатор логических переменных (lSwitch)](#topic-96119)
    - [Коммутатор строковых переменных (txtSwitch)](#topic-96120)
    - [Коммутатор целых переменных (iSwitch)](#topic-96121)
    - [Релейный каскад вещественных переменных (fltRelay)](#topic-96122)
    - [Релейный каскад логических переменных (logRelay)](#topic-96123)
    - [Управление реле (SetSW)](#topic-96124)
    - [Выбор одного из целых значений (SelectUI)](#topic-96125)
    - [Вывод значения на заданный выход (ShowSW)](#topic-96126)
    - [Мультиплексор вещественных значений (MuxFlt)](#topic-96127)
    - [Мультиплексор целых значений (MuxInt)](#topic-96128)
    - [Выбор одного из вещественных значений (FCascSw)](#topic-96129)
    - [Выбор строки (Switch_str)](#topic-96130)
    - [Дешифратор уставок (Settings)](#topic-96131)
  - [Генераторы и таймеры](#topic-96132)
    - [Генератор импульсов (Pulse)](#topic-96133)
    - [Включение с задержкой (DelayOn)](#topic-96134)
    - [Выключение с задержкой (DelayOff)](#topic-96135)
    - [Половинный импульс после половины паузы (HalfPulse)](#topic-96136)
    - [Генератор сигналов (GenSign)](#topic-96137)
    - [Логический таймер со взводом (AdvTimer)](#topic-96138)
    - [Генератор импульсов с заданной скважностью (PulseGeneratorEx)](#topic-96139)
    - [Генератор случайных чисел (rndgen)](#topic-96140)
    - [Универсальный счетчик (CounterCTN)](#topic-96141)
    - [Инкрементный счетчик (CounterCTU)](#topic-96142)
    - [Инкрементный счетчик с автосбросом (CounterCT)](#topic-96143)
  - [Обработка сигналов](#topic-96144)
    - [Cимметричный ограничитель сигнала (LimSim)](#topic-96145)
    - [Аппроксимация обратной функции (Approx)](#topic-96146)
    - [Кусочно-линейная интерполяция (KL_Interp)](#topic-96147)
    - [Несимметричный ограничитель сигнала (Lim)](#topic-96148)
    - [Группа ограничителей сигнала (Lims)](#topic-96149)
    - [Градиентный фильтр (GradLim)](#topic-96150)
    - [Определение принадлежности к диапазону (Inside)](#topic-96151)
    - [Параболический ограничитель (SqLim)](#topic-96152)
    - [Фильтр Баттерворта (BatterFilter)](#topic-96153)
    - [Нормализация шкалы (Scale)](#topic-96154)
    - [Преобразователь для модуля термосопротивления (5B34Conv)](#topic-96155)
    - [Интерполяция (Interpolation)](#topic-96156)
    - [Симметричная мертвая зона с гистерезисом (FdeadS)](#topic-96157)
    - [Симметричная мертвая зона (DbandS)](#topic-96158)
    - [Диагностика сигналов датчиков (SensSpd)](#topic-96159)
    - [Изменение значения за заданное время (ValDif)](#topic-96160)
    - [Арифметическое скользящее среднее (MovAverage)](#topic-96161)
  - [Операции с регистрами](#topic-96162)
    - [Объединение 20 битов в регистр (ToReg20)](#topic-96163)
    - [Объединение 8-ми битов в регистр (ToReg8)](#topic-96164)
    - [Выбор 8 битов из регистра (FromReg8)](#topic-96165)
    - [Объединение 16-ти битов в регистр (ToReg16)](#topic-96166)
    - [Выбор 20 битов из регистра (FromReg20)](#topic-96167)
    - [Выбор 16 битов из регистра (FromReg16)](#topic-96168)
    - [Логическое И для 16-битных регистров (rAND)](#topic-96169)
    - [Логическое ИЛИ для 16-битных регистров (rOR)](#topic-96170)
    - [Логическое НЕ для 16-битных регистров (rNOT)](#topic-96171)
    - [Логическое И с отрицанием для 16-битных регистров (rnAND)](#topic-96172)
    - [Логическое ИЛИ с отрицанием для 16-битных регистров (rnOR)](#topic-96173)
    - [Сложение по модулю для 16-битных регистров (rXOR)](#topic-96174)
    - [Склеивание байта из двух тетрад (R4to8)](#topic-96175)
    - [Детектор фронтов для 16-битных регистров (Fronts2)](#topic-96176)
    - [Склеивание слова из двух байт (R8to16)](#topic-96177)
    - [Преобразование 16-битного регистра в два 8-битных (R16to8)](#topic-96178)
    - [Преобразование двух 16-битных регистров в 32-битный (R16to32)](#topic-96179)
    - [Преобразование 32-битного регистра в два 16-битных (R32to16)](#topic-96180)
    - [Объединение 32 битов в регистр (ToReg32)](#topic-96181)
    - [Выбор 32 битов из регистра (FromReg32)](#topic-96182)
    - [Включение с задержкой для 16-битных регистров (rDelayOn)](#topic-96183)
    - [Выключение с задержкой для 16-битных регистров (rDelayOff)](#topic-96184)
    - [Выбор бита из регистра (BitReg16)](#topic-96185)
  - [Операции с массивами](#topic-96186)
    - [Массив вещественных чисел (FloatArray)](#topic-96187)
    - [Массив 4-байтных целых (i32Array)](#topic-96188)
    - [Линейная аппроксимация массивов (LineAprox)](#topic-96189)
    - [Значения массива вещественных чисел (From_fArr)](#topic-96190)
    - [Элемент из массива (one_From_fArr)](#topic-96191)
    - [Нахождение минимума/максимума в массиве (minmax_fArr)](#topic-96192)
    - [Нахождение разницы между элементами массива (minmax_sub_fArr)](#topic-96193)
    - [Переключатель массивов (switch_fArr)](#topic-96194)
    - [Значения массива целых (From_i32Arr)](#topic-96195)
  - [Триггеры](#topic-96196)
    - [Триггер Шмидта (SmTrig)](#topic-96197)
    - [Двойной триггер Шмидта (SmTrig2)](#topic-96198)
    - [RSS-триггер (RSS)](#topic-96199)
    - [RSR-триггер (RSR)](#topic-96200)
    - [D-триггер с инициализацией выхода (DFR_i)](#topic-96201)
    - [JK-триггер с инициализацией (JK \_i)](#topic-96202)
    - [RSS-триггер с инициализацией выхода (RSS_i)](#topic-96203)
    - [RSR-триггер с инициализацией выхода (RSR)](#topic-96204)
    - [D-триггер (DFR)](#topic-96205)
    - [DV-триггер (DFRV)](#topic-96206)
    - [Несимметричный триггер Шмидта (asymSmTrig)](#topic-96207)
    - [Шаговая последовательность (Steper)](#topic-96208)
  - [Системные](#topic-96209)
    - [Информация о временах выполнения (SysInfo)](#topic-96210)
    - [Получить время и дату, день недели (getTDN)](#topic-96211)
    - [Получить время и дату (getTD)](#topic-96212)
    - [Завершение программы (Exit)](#topic-96213)
    - [Разность тиков процессора (GetTicksDiff)](#topic-96214)
    - [Счетчик тиков процессора (GetTicks)](#topic-96215)
    - [Загруженность таймерного потока (Effect)](#topic-96216)
    - [Событие по фронту (Event)](#topic-96217)
    - [TCP/IP клиент (TcpIpClA)](#topic-96218)
    - [TCP/IP сервер (TcpIpSrA)](#topic-96219)
    - [Информация о сборке (BuildVersionInfo)](#topic-96220)
    - [Информация о накопителе (DriveInfo)](#topic-96221)
    - [Асинхронное выполнение команд Linux (SysExecute)](#topic-96222)
    - [Менеджер потоков (ThreadMan)](#topic-96223)
    - [Последовательный порт (SerialPort)](#topic-96224)
  - [Работа со строками](#topic-96225)
    - [Длина строки (StrLen)](#topic-96226)
    - [Часть строки (StrNmp)](#topic-96227)
    - [Слияние строк (StrApp)](#topic-96228)
  - [Сохранение данных](#topic-96229)
    - [Хранение параметров на диске (SaverEx)](#topic-96230)
    - [Счетчик времени наработки (CounterMEx)](#topic-96231)
    - [Буфер чтения/записи уставок (BufSupEx)](#topic-96232)
    - [Запись логов в оперативную память (RamLog)](#topic-96233)
  - [Очереди](#topic-96234)
    - [Очередь битов qb](#topic-96235)
    - [Преобразование регистра в очереди битов (R2toQuBit)](#topic-96236)
    - [Преобразование очереди битов в бит (QuBit_Bit)](#topic-96237)

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

## Используемые термины и сокращения

**ЛКМ** – левая кнопка мыши.

**Место работы** – набор программ, который вызывается заданным способом.

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

**ОС** – операционная система.

**ПК** – персональный компьютер.

**ЛКМ (ПКМ)** – левая (правая) кнопка мыши.

**ПЛК** – программируемый логический контроллер.

**ПО** – программное обеспечение.

**Представления** – тип окон в среде Полигон, которые предназначены для редактирования проекта (например, дерево, страница, редактор и т.д.).

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

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

**Составной функциональный блок** – функциональный блок, который состоит из других функциональных блоков.

**Таймер (место работы)** – поток, выполняющийся в режиме реального времени с заданной периодичностью.

**Трансляция** – процесс перевода программы с одного языка на другой, состоит из компиляции и интерпретации.

**ФБ** – **функциональный блок** – элементарный пользовательский алгоритм (класс C++), который используется несколько раз в проекте.

**Фон (место работы)** – поток, выполняющийся циклически.

**C** **++**    – компилируемый  язык  программирования  со  строгой  типизацией,  который  поддерживает  парадигмы  процедурного  и  объектно-ориентированного  программирования.

**FTP** **(****File** **Transfer** **Protocol****)** — протокол прикладного уровня для передачи файлов по сети.

**NTP** **(Network Time Protocol)** — сетевой протокол для синхронизации внутренних часов устройств в сети.

**Runtime (среда выполнения)** – вычислительное окружение, необходимое для выполнения компьютерной программы и доступное во время выполнения компьютерной программы.

**SQL** (**Structured Query Language**) – язык программирования для хранения и обработки информации в реляционной базе данных.

**SSH** **(Secure SHell)** – протокол прикладного уровня для удаленного управления операционной системой с шифрованием трафика.

**Unix****-время** – количество секунд, прошедших с полуночи (00:00:00 UTC) 1 января 1970 года (четверг).

**UTC** **(****Temps** **Universel** **Coordonn****é)** – всемирное координированное время.

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

## Введение

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

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

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

Открыть или создать проект (файл с расширением **.pl2**) можно в окне [Проекты](#topic-96009). Рекомендуется размещать каждый новый проект в отдельном каталоге.

Открытый проект можно отобразить в рабочих окнах на экране с помощью представлений ![Иконка Дерево](https://docs.owen.ru/book_img/1936/137231.png) [Дерево](#topic-95998) и ![Иконка Страница](https://docs.owen.ru/book_img/1936/137230.png) [Страница](#topic-95999). Для того, чтобы добавить в проект функциональные блоки, необходимо также открыть соответствующие [библиотеки](#topic-95979) (файлы с расширением **.ll2**).

Расположение окон и ссылки на открытые проекты и библиотеки сохраняются в файле на диске и восстанавливаются при следующем запуске **Полигона**. В меню [Экран](#topic-96016) можно создавать разные конфигурации рабочего экрана и сохранять их.

Одно из рабочих окон обычно является текущим (обозначается символом ![Иконка Прицел](https://docs.owen.ru/book_img/1936/137229.png)), в этом окне отображаются страницы при нажатии на полях и двойном нажатии в <b>*Дереве*</b>. Окно можно зафиксировать (флажок <b>*Фиксировать*</b> в верхней панели окна), чтобы оно при нажатии не становилось текущим (это полезно, например, для дерева, в котором всегда отображается структура проекта).

Данный документ актуален для версии среды **Полигон** – **1994** и выше, версии библиотеки <b>*paCore*</b> – **988** и выше.

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

## Знакомство со средой разработки

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

### Установка среды программирования для Windows

Скачать инсталлятор среды **Полигон** для ОС Windows можно по [ссылке](http://files.pa.ru/download/Polygon2Installer_LinuxOwen3_win.zip).

Рекомендуемые системные требования:

- ОС: Windows 7/8/10/11 64 Bit;
- Оперативная память: 4 Гб и выше;
- Память на диске: 2 Гб и выше.

Для установки среды следует:

1. Распаковать скачанный архив и запустить <b>*Polygon2Installer_LinuxOwen3.exe*</b>.

   ![Инсталлятор Полигон 2](https://docs.owen.ru/book_img/1936/137228.png)

   *Инсталлятор Полигон 2*

   ![Установка Полигон 2 Приветственное окно](https://docs.owen.ru/book_img/1936/137227.png)

   <i>**Установка Полигон 2. Приветственное окно**</i>

2. Выбрать путь для установки среды **Полигон**. По умолчанию среда устанавливается на диск **C**.

   > **Примечание.** Путь установки среды не должен содержать кириллицу и пробелы.

   ![Выбор директории установки](https://docs.owen.ru/book_img/1936/137226.png)

   <i>**Выбор директории установки**</i>

3. Выбрать компоненты для установки.

   По умолчанию инсталлятор устанавливает саму среду **Полигон** и пакет сборки под [текущую заводскую прошивку ПЛК210](#topic-95971). Для выборочной установки можно отметить требуемый компонент флажком.

   ![Установка Полигон 2 Выбор компонентов установки](https://docs.owen.ru/book_img/1936/137225.png)

   <i>**Установка Полигон 2. Выбор компонентов установки**</i>

4. Ознакомиться с лицензионным соглашением и принять его.

   ![Установка Полигон 2 Лицензионное соглашение](https://docs.owen.ru/book_img/1936/137224.png)

   <i>**Установка Полигон 2. Лицензионное соглашение**</i>

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

   ![Установка Полигон 2. Ярлыки меню «Пуск»](https://docs.owen.ru/book_img/1936/137223.png)

   <i>**Установка Полигон 2. Ярлыки меню «Пуск»**</i>

6. Нажать <b>*Установить*</b>.

   ![Установка Полигон 2. Завершение установки](https://docs.owen.ru/book_img/1936/137262.png)

   <i>**Установка Полигон 2. Завершение установки**</i>

Когда установка завершится, на рабочем столе появится ярлык программы **Полигон**. Инсталлятор предложит открыть краткое описание [демонстрационного проекта](#topic-95970).

![Ярлык Полигон 2](https://docs.owen.ru/book_img/1936/137261.png)

<i>**Ярлык Полигон 2**</i>

Инсталлятор также предложит установить или обновить драйверы Guardant.

После установки среды рекомендуется обновить версии среды и библиотек до актуальных. Добавление библиотек в среде **Полигон** описано в [разделе](#topic-95980). Процедура обновления среды и библиотек описана в [разделе](#topic-95981).

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

### Установка среды программирования для ОС Linux

Скачать скрипт установки среды **Полигон** для ОС Linux можно по [ссылке](http://files.pa.ru/download/Polygon2Installer_LinuxOwen3_lnx.zip).

Рекомендуемые системные требования:

- ОС: Astra Linux Special Edition 1.7, Ubuntu (версия ядра Linux 5.10 и выше);
- Оперативная память: 4 Гб и выше;
- Память на диске: 2 Гб и выше.

Для установки среды следует:

1. Распаковать архив со скриптом установки.

2. Дать права на исполнение скрипта установки <b>*Polygon*</b><b>*2*</b><b>*Installer*</b><b>*\_*</b><b>*LinuxOwen*</b><b>*3.*</b><b>*sh*</b>.

   ![Распаковка архива и разрешение исполнения скрипта установки](https://docs.owen.ru/book_img/1936/137260.png)

   <i>**Распаковка архива и разрешение исполнения скрипта установки**</i>

3. Запустить скрипт установки.

4. Следовать инструкциям инсталлятора.

   ![Установка Полигон 2. Приветственное окно](https://docs.owen.ru/book_img/1936/137259.png)

   <i>**Установка Полигон 2. Приветственное окно**</i>

5. Указать директорию для установки среды **Полигон**.

   > **Примечание.** Путь установки среды не должен содержать кириллицу и пробелы.

   ![Установка Полигон 2. Выбор директории для установки](https://docs.owen.ru/book_img/1936/137258.jpg)

   <i>**Установка Полигон 2. Выбор директории для установки**</i>

6. Выбрать компоненты среды для установки. По умолчанию инсталлятор устанавливает саму среду Полигон и пакет сборки под [текущую заводскую прошивку ПЛК210](#topic-95971).

   ![Установка Полигон 2. Выбор компонентов для установки](https://docs.owen.ru/book_img/1936/137257.png)

   <i>**Установка Полигон 2. Выбор компонентов для установки**</i>

7. Ознакомиться с лицензионным соглашением и принять его.

   ![Установка Полигон 2. Лицензионное соглашение](https://docs.owen.ru/book_img/1936/137256.png)

   <i>**Установка Полигон 2. Лицензионное соглашение**</i>

8. Нажать <b>*Установить*</b>.

   ![Установка Полигон 2. Завершение установки (2)](https://docs.owen.ru/book_img/1936/137255.png)

   <i>**Установка Полигон 2. Завершение установки**</i>

Когда установка завершится, на рабочем столе появится ярлык программы **Полигон** (только для ПК с ОС Astra Linux). Инсталлятор предложит открыть краткое описание [демонстрационного проекта](#topic-95970).

![Ярлык Полигон 2 (2)](https://docs.owen.ru/book_img/1936/137254.png)

<i>**Ярлык Полигон 2**</i>

После установки среды рекомендуется обновить версии среды и библиотек до актуальных. Добавление библиотек в среде **Полигон** описано в [разделе](#topic-95980). Процедура обновления среды и библиотек описана в [разделе](#topic-95981).

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

### Первый запуск 

**Полигон** рекомендуется запускать через ярлык на рабочем столе или из папки **Polygon2** (для ОС Windows исполняемый файл **polygon2.exe**, для ОС Linux –**startPolygon2.sh**).

При первом запуске среды откроется демонстрационный проект <b>*mnu*</b><b>*\_*</b><b>*demo*</b><b>*.*</b><b>*pl*</b><b>*2*</b>. Краткое описание демонстрационного проекта приведено в документе <b>*Описание.*</b><b>*pdf*</b> в папке <b>*Polygon*</b><b>*2*</b>.

Если необходимо, демонстрационный проект можно запустить на виртуальном контроллере через <b>*Панель отладки*</b>.

Для этого следует:

1. Добавить <b>*Панель отладки*</b> через меню <b>*Окна/Панели инструментов/Панель отладки*</b>.

2. Нажать на <b>*Панели отладки*</b> кнопку <b>*Запустить*</b> на виртуальном контроллере.

3. В отдельном окне запустится приложение виртуального контроллера.

4. Среда попросит ввести пароль для через отладчик среды. Пароль демонстрационного проекта – **123**.

5. Среда подключится отладчиком среды к запущенному контроллеру.

   ![Запуск демо-проекта на виртуальном контроллере](https://docs.owen.ru/book_img/1936/137253.png)

   <i>**Запуск демо-проекта на виртуальном контроллере**</i>

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

### Контроллеры

ПЛК ОВЕН, которые работают с исполнительной средой **Полигон**, представлены в таблице ниже.

**ПЛК ОВЕН с исполнительной средой Полигон**

| Модификация контроллера | Версия прошивки и инструкция по обновлению |
| --- | --- |
| ПЛК210-11-PL-X\* | [3.6.0704.1220](https://owen.ru/product/polygon/documentation) |
| ПЛК210-12-PL-X | [3.6.0704.1220](https://owen.ru/product/polygon/documentation) |
| ПЛК210-14-PL-X | [3.6.0704.1220](https://owen.ru/product/polygon/documentation) |

> [!NOTE]
> **Примечание.** \* Версия лицензии runtime. Описание версий лицензий приведено в [разделе](#topic-95973).

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

### Лицензирование

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

#### Описание лицензионных пакетов

**Описание лицензионных пакетов**

| Тип лицензии | Назначение | Состав библиотек\* |
| --- | --- | --- |
| BASE | Базовая лицензия | <b>*paCore*</b><br><b>*paOwenIO*</b><br><b>*paOpcUA*</b><br><b>*paControls*</b><br><b>*paModbus*</b><br><b>*profiLogger*</b><br><b>*profiLoggerLight*</b> |
| BASE104 | Лицензия с поддержкой протоколов **МЭК 60870-5-101** и **МЭК 60870-5-104** | Библиотеки базовой лицензии + <b>*paIEC104*</b> |
| BASE850 | Лицензия с поддержкой протокола **МЭК 61850** | Библиотеки базовой лицензии + <b>*paIEC850*</b> |
| BASE-R | Лицензия с поддержкой программного резервирования ПЛК | Библиотеки базовой лицензии + <b>*paSync*</b> |
| BASE104-R | Лицензия с поддержкой протоколов **МЭК 60870-5-101** и **МЭК 60870-5-104** и программного резервирования ПЛК | Библиотеки базовой лицензии + <b>*paIEC*</b><b>*104*</b>, <b>*paSync*</b> |
| BASE850-R | Лицензия с поддержкой протокола **МЭК 61850** и программного резервирования ПЛК | Библиотеки базовой лицензии + <b>*paIEC*</b><b>*850*</b>, <b>*paSync*</b> |

> [!NOTE]
> **Примечание.** Описание библиотек приведено в [разделе](#topic-95979)

Состав библиотек, доступных пользователю для полноценной работы, можно посмотреть в web-конфигураторе контроллера в разделе <b>*Состояние/Обзор*</b>.

![Состав доступных библиотек в web-конфигураторе](https://docs.owen.ru/book_img/1936/137272.png)

<i>**Состав доступных библиотек в web-конфигураторе**</i>

> [!WARNING]
> **Внимание.** Если в пользовательском проекте используются блоки из библиотек без соответствующих лицензий, проект прекратит свою работу по истечении 1 часа. При подключении откладчиком в этом случае на модуле будет надпись <b>*Демо-режим*</b> и время до окончания выполнения программы.

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

##### Опции лицензионных пакетов

При необходимости можно приобрести опции для работы с блоками библиотек <b>*paSync*</b>, <b>*paIEC*</b><b>*104*</b>, <b>*paIEC*</b><b>*850*</b> отдельно:

**Опции лицензий runtime**

| Опция | Описание | Состав доступных библиотек\* |
| --- | --- | --- |
| REDU | Опция поддержки программного резервирования ПЛК | <b>*paSync*</b> |
| IEC104 | Опция поддержки протоколов **МЭК 60870-5-101** и **МЭК 60870-5-104** | <b>*paIEC104*</b> |
| IEC850 | Опция поддержки протокола **МЭК 61850** | <b>*paIEC850*</b> |

> [!NOTE]
> **Примечание.** \* Описание библиотек приведено в [разделах](#topic-95979) [и](#topic-95980).

Загрузка файлов лицензии в контроллер описана в [разделах](#topic-95975),  [Загрузка файлов лицензий в ПЛК через WinSCP](#topic-95976), [и](#topic-95977).

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

###### Загрузка файлов лицензий в ПЛК в среде Полигон

Пакет лицензий можно загрузить из среды **Полигон**.

Для этого следует настроить свойства модуля для подключения к контроллеру. Подключаться к контроллеру можно через **USB** **Device** (IP адрес ПЛК при подключении через **USB** **Device** – **172.16.0.1**) или через **Ethernet**.

Подробно подключение к контроллеру описано в [разделе](#topic-96035).

![Свойства модуля для подключения к ПЛК через USB Device](https://docs.owen.ru/book_img/1936/137271.png)

<i>**Свойства модуля для подключения к ПЛК через** USB Device</i>

Для загрузки лицензий следует:

1. Нажать правой кнопкой мыши (ПКМ) на модуль и выбрать команду <b>*Записать лицензии*</b>.

   ![Записать лицензии](https://docs.owen.ru/book_img/1936/137270.png)

   <i>**Записать лицензии**</i>

2. В появившемся окне ввести серийный номер контроллера. Серийный номер выгравирован на корпусе прибора и приведен в паспорте на прибор (входит в комплект поставки прибора).

   ![Ввод серийного номера](https://docs.owen.ru/book_img/1936/137269.png)

   <i>**Ввод серийного номера**</i>

3. Нажать <b>*ОК*</b>. Начнется процесс скачивания лицензий с сервера *pa.ru* и загрузка их в контроллер. После окончания загрузки лицензий появится окно:

   ![Успешная загрузка лицензий в контроллер](https://docs.owen.ru/book_img/1936/137268.png)

   <i>**Успешная загрузка лицензий в контроллер**</i>

Также серийный номер прибора можно ввести в свойстве модуля. Снизу в окне свойств модуля нужно выбрать из выпадающего списка свойство <b>*Серийный номер*</b> и нажать **Добавить**, потом вводить номер сверху в поле **Значение**.

![Серийный номер в свойствах модуля](https://docs.owen.ru/book_img/1936/137267.png)

<i>**Серийный номер в свойствах модуля**</i>

Если данное свойство прописано в модуле, то среда при записи лицензий не будет требовать ввести серийный номер контроллера.

Свойство <b>*Серийный номер*</b> также добавляется средой автоматически при вводе номера в окне <b>*Введите серийный номер*</b> при вызове команды <b>*Записать лицензии*</b>.

> [!WARNING]
> **Внимание.** Для загрузки лицензий в контроллер через среду **Полигон** требуется доступ к сети Интернет.

Загрузка файлов лицензии через утилиту WinSCP (для ОС Windows) описана в [разделе](#topic-95976). Загрузка файлов лицензии через консоль Linux описана в [разделе](#topic-95977).

> [!WARNING]
> **Внимание.** После загрузки дополнительных файлов лицензий для обновления списка доступных библиотек на странице web-конфигуратора <b>*Состояние/Обзор*</b> следует загрузить в контроллер проект с блоком <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

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

###### Загрузка файлов лицензий в ПЛК через WinSCP

При отсутствии возможности подключения к серверу **pa****.****ru** пакет лицензий можно загрузить через утилиту **WinSCP** (или через любой менеджер файлов). Утилиту можно загрузить бесплатно на сайте [https://winscp.net/eng/download.php](https://winscp.net/eng/download.php)

Подключаться к контроллеру можно как через **USB** **Device** (IP адрес ПЛК при подключении через **USB** **Device** – **172.16.0.1**), так и через **Ethernet**.

После запуска утилиты следует настроить соединение по протоколу **SFTP**, указав IP-адрес контроллера, имя пользователя – **root** и пароль (по умолчанию – **owen**, можно изменить в web-конфигураторе). Чтобы подключиться к контроллеру, следует нажать <b>*Войти*</b>.

![Настройки подключения в Win SCP](https://docs.owen.ru/book_img/1936/137266.png)

<i>**Настройки подключения в WinSCP**</i>

Файлы лицензии необходимо загрузить в рабочую директорию контроллера <b>*/*</b><b>*home*</b><b>*/*</b><b>*root*</b>.

> [!WARNING]
> **Внимание.** После загрузки дополнительных файлов лицензий нужно обновить список доступных библиотек на странице web-конфигуратора <b>*Состояние/Обзор*</b>. Для этого следует загрузить в контроллер проект с блоком <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

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

###### Загрузка файлов лицензий в ПЛК через терминал Linux

Если нет возможности подключиться к серверу *pa.ru*, то пакет лицензий можно загрузить через терминал Linux по протоколу **SSH** с помощью команды <b>*scp*</b>.

Подключаться к контроллеру можно как через **USB** **Device** (IP адрес ПЛК при подключении через **USB** **Device** – **172.16.0.1**), так и через **Ethernet**.

Синтаксис команды <b>*scp*</b>:

```
$ scp опции пользователь1@хост1:файл пользователь2@хост2:файл
```

**Пример**

Команда для загрузки файла лицензии <b>*paSync*</b> при подключении ПЛК через **USB** **Device**:

```
$ scp /home/user/Documents/paSync root@172.16.0.1:/home/root
```

Для подключения к **SSH**-серверу контроллера необходимо указать пароль (по умолчанию – **owen**, можно изменить в web-конфигураторе).

![Загрузка файла лицензии через терминал Linux](https://docs.owen.ru/book_img/1936/137265.png)

*Загрузка файла лицензии через терминал Linux*

Для проверки файлов лицензии можно подключиться к **SSH**-серверу контроллера и ввести команду **ls**.

![Проверка загрузки файла лицензии](https://docs.owen.ru/book_img/1936/137264.png)

<i>**Проверка загрузки файла лицензии**</i>

> [!WARNING]
> **Внимание.** После загрузки дополнительных файлов лицензий нужно обновить список доступных библиотек на странице web-конфигуратора <b>*Состояние/Обзор*</b>. Для этого следует загрузить в контроллер проект с блоком <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

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

### Библиотеки

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

#### Стандартные библиотеки

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

| Библиотека | Описание | Документация |
| --- | --- | --- |
| <b>*paCore*</b> | Основная библиотека. Содержит базовые блоки простых операций (арифметических, логических, триггеры и т.п.), а также некоторые блоки для конфигурации ПЛК, блоки работы с данными. В данной библиотеке описаны [типы данных](#topic-96065), используемые в других библиотеках | Описание библиотеки приведено в [разделе](#topic-96063) |
| <b>*paOwenIO*</b> | Библиотека предназначена для конфигурирования ввода/вывода ПЛК ОВЕН, а также настройки системных функций ПЛК (внешних накопителей, зуммера, светодиодов и т. п.) | [Работа с ОВЕН ПЛК. Библиотека paOwenIO](https://owen.ru/product/polygon/documentation) |
| <b>*paOpcUA*</b> | Библиотека предназначена для реализации обмена ПЛК с другими устройствами/ПО по протоколу **OPC** **UA** | [Обмен с верхним уровнем. Библиотека paOpcUA](https://owen.ru/product/polygon/documentation) |
| <b>*paModbus*</b> | Библиотека предназначена для реализации обмена ПЛК с другими устройствами/ПО по протоколам **Modbus** **RTU**, **Modbus** **TCP** | [Обмен по протоколу Modbus. Библиотека paModbus](https://owen.ru/product/polygon/documentation) |
| <b>*paControls*</b> | Библиотека содержит основные блоки для реализации управления процессами и обработки сигналов с датчиков | [Алгоритмы управления. Библиотека paControls](https://owen.ru/product/polygon/documentation) |
| <b>*profiLogger*</b>,<br><b>*profiLoggerLight*</b> | Библиотеки содержат основные блоки для реализации архивирования | [Архивирование и сохранение уставок](https://owen.ru/product/polygon/documentation) |
| <b>*paSync*</b> | Библиотека предназначена для синхронизации проектов контроллеров, реализации горячего резервирования | [Синхронизация проектов и реализация резервирования. Библиотека paSync](https://owen.ru/product/polygon/documentation) |
| <b>*paIEC104*</b> | Библиотека предназначена для реализации обмена ПЛК с другими устройствами/ПО по протоколам стандартов **МЭК 60870-5-101** и **МЭК 60870-5-104** | [Обмен по протоколам МЭК 60870-5. Библиотека paIEC104](https://owen.ru/product/polygon/documentation) |
| <b>*paIEC850*</b> | Библиотека предназначена для реализации обмена ПЛК с другими устройствами/ПО по протоколу стандарта **МЭК 61850** | [Обмен по протоколу МЭК 61850. Библиотека paIEC850](https://owen.ru/product/polygon/documentation) |

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

#### Установка библиотек

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

При установке среды загружаются библиотеки [базовой лицензии](#topic-95973), при необходимости дополнительные библиотеки можно загрузить на [странице среды Полигон](https://owen.ru/product/polygon/libraries) или в web-конфигураторе контроллера во вкладке <b>*ПЛК/Загрузки*</b>.

> [!WARNING]
> **Внимание.** Путь к файлам библиотек не должен содержать кириллицу и пробелы.

Для добавления библиотеки в проект следует:

1. Перейти в меню <b>*Окна/Проекты*</b>. В появившемся окне отобразится текущий проект и добавленные библиотеки.

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

   <i>**Добавление библиотеки в проект**</i>

   > **Внимание.** Чтобы устанавливать обновления для среды и библиотек, необходимо иметь доступ к сети Интернет.

2. Нажать кнопку <b>*Открыть*</b> и перейти в папку с файлами библиотеки, которую необходимо добавить. Затем в выпадающем списке выбрать тип файла <b>*Библиотека Полигон 2 (\*.*</b><b>*ll*</b><b>*2)*</b>.

   ![Добавление библиотеки в проект (2)](https://docs.owen.ru/book_img/1936/137292.png)

   <i>**Добавление библиотеки в проект**</i>

3. В окне появится файл библиотеки с расширением **.****ll****2**. Следует выбрать его и нажать **Открыть.**

   ![Добавление библиотеки в проект (3)](https://docs.owen.ru/book_img/1936/137291.png)

   <i>**Добавление библиотеки в проект**</i>

Если необходимо, можно сразу открыть библиотеку в отдельном окне типа <b>*Дерево*</b> с помощью всплывающего окна.

Добавленная библиотека отобразится в окне <b>*Проекты*</b>.

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

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

В системном окне <b>*Окна/*</b><b>*О программе*</b> отображаются установленные версии среды **Полигон** и библиотек.

![Окно О программе](https://docs.owen.ru/book_img/1936/137290.png)

<i>**Окно О программе**</i>

Во вкладке <b>*Обновления*</b> есть возможность проверить и скачать обновления.

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

![Сообщение о наличии обновлений](https://docs.owen.ru/book_img/1936/137289.png)

<i>**Сообщение о наличии обновлений**</i>

![Окно Обновления](https://docs.owen.ru/book_img/1936/137288.png)

<i>**Окно Обновления**</i>

> [!WARNING]
> **Внимание.** Чтобы устанавливать обновления для среды и библиотек, необходимо иметь доступ к сети Интернет.

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

1. Убедиться, что соединение с сервером **pa****.****ru** установлено, нажав кнопку <b>*Подключить*</b>.

   > **Примечание.**

2. Нажать на кнопку <b>*Проверить*</b>. В окне появятся версии среды и библиотек, доступные для установки.

3. Кнопками снизу выбрать распаковщик <b>*unzip*</b> или <b>*7*</b><b>*zip*</b> и нажать <b>*Сохранить*</b>.

4. Нажать <b>*Установить*</b>.

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

![Предупреждение о закрытии программы](https://docs.owen.ru/book_img/1936/137287.png)

<i>**Предупреждение о закрытии программы**</i>

После завершения установки среда снова откроется. В окне <b>*О программе*</b> отобразятся последние установленные версии среды и библиотек.

![Успешная установка обновлений](https://docs.owen.ru/book_img/1936/137286.png)

<i>**Успешная установка обновлений**</i>

> [!WARNING]
> **Внимание.** Если установка обновлений версий среды и библиотек не произошла, следует прописать полный путь к файлу распаковщика в окне <b>*Команда для распаковки*</b> (например, **"C:\\Program Files (x86)\\7-Zip\\7z.exe"**).

> [!NOTE]
> **Примечание.** При возникновении других проблем с установкой обновлений среды и библиотек следует обратиться на почту технической поддержки [support@owen.ru](mailto:support@owen.ru)

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

### Контроль версий

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

![Тултип с информацией о модуле](https://docs.owen.ru/book_img/1936/137285.png)

<i>**Тултип с информацией о модуле**</i>

Также текущую версию запущенного проекта можно посмотреть в web-конфигураторе контроллера в разделе <b>*ПЛК/Информация*</b>.

> [!WARNING]
> **Внимание.** Для того, чтобы в web-конфигураторе контроллера (раздел <b>*ПЛК/Информация*</b>) обновлялась информация о запущенном проекте, следует добавить в проект блок <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

![Информация о запущенной программе в web-конфигураторе](https://docs.owen.ru/book_img/1936/137284.png)

<i>**Информация о запущенной программе в web-конфигураторе**</i>

В файле <b>*versions*</b><b>*.*</b><b>*txt*</b> в папке, куда транслируется проект, можно получить информацию о версии проекта и используемых в нем библиотек.

![Файл versions .txt](https://docs.owen.ru/book_img/1936/137283.png)

<i>**Файл version**s<b>.txt</b></i>

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

![Предупреждение о несовпадении версий проекта](https://docs.owen.ru/book_img/1936/137302.png)

<i>**Предупреждение о несовпадении версий проекта**</i>

Для просмотра данных по версиям библиотек, используемых в проекте, нужно нажать ПКМ на запущенный модуль в дереве и выбрать в открывшемся меню <b>*Показать все*</b>. Откроется окно трансляции (системное окно [Прогресс](#topic-96008)).

![Показать все](https://docs.owen.ru/book_img/1936/137301.png)

<i>**Показать все**</i>

![Информация о версиях библиотек](https://docs.owen.ru/book_img/1936/137300.png)

<i>**Информация о версиях библиотек**</i>

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

### Обслуживание

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

![Ошибка трансляции](https://docs.owen.ru/book_img/1936/137299.png)

<i>**Ошибка трансляции**</i>

При выборе <b>*Отправить*</b> лог ошибки и сам проект будут подготовлены в выбранной папке на диске для отправки разработчикам. Данные файлы следует направить на почту [support@owen.ru](mailto:support@owen.ru) в виде архива с подробным описанием проблемы.

При выборе <b>*Отмена*</b> окно будет закрыто. Информацию по ошибкам можно самостоятельно посмотреть в окне [Прогресс](#topic-96008). Ошибки в тексте выделены красным шрифтом.

Перемещение по ошибкам можно осуществлять с помощью кнопок **Вверх** и **Вниз**.

![Окно Прогресс при ошибке трансляции нов](https://docs.owen.ru/book_img/1936/140141.png)

<i>**Окно Прогресс при ошибке трансляции**</i>

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

## Общие сведения о среде

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

### Проект

Однопользовательский проект в среде **Полигон** представляет собой файл с расширением **.pl2**. В нем хранится все содержимое проекта за исключением дополнительных файлов, которые могут использоваться, например, при создании пользовательского [составного блока на C++](#topic-96049). Файлы проектов можно копировать и таким образом передавать другим разработчикам. Каждый проект рекомендуется размещать в отдельной папке, поскольку внутри нее среда разработки создает временные файлы при трансляции и копии проекта (бэкапы).

При редактировании проекта все изменения происходят только в кратковременной памяти. Для записи изменений в файл нужно использовать команду <b>*Сохранить*</b> ![Кн Сохранить](https://docs.owen.ru/book_img/1936/137297.png) в панели инструментов или комбинацию клавиш **Ctrl + s**. Последние **10** действий можно отменить командой <b>*Отменить*</b> ![Кн Отменить](https://docs.owen.ru/book_img/1936/137296.png) или комбинацией клавиш **Ctrl** <b></b>**+** <b></b>**z** независимо от того, был ли сохранен проект на диск или нет.

Автоматическое сохранение проекта по умолчанию производится каждые **5** **минут**. Период сохранения проекта можно изменить в меню [Экран/Настройки](#topic-96017) (при установке **0** автосохранения производиться не будут). При каждом сохранении на диск создается копия проекта (бэкап) с таким же именем плюс суффикс с датой и временем сохранения.

Более подробную информацию о создании многопользовательского проекта можно найти в [разделе](#topic-96058).

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

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

Проект в среде разработки **Полигон** имеет иерархическую структуру, которую можно увидеть в представлении <b>*Дерево*</b>. Узлы дерева могут быть разных типов. Основной узел с точки зрения создания программы для контроллера – <b>*Модуль*</b>.

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

Проект может содержать несколько модулей.

Внутренняя структура модуля жестко определена: <b>*Модуль > Место работы > Программа > Страница > Функциональный блок*</b>.

![Структура проекта](https://docs.owen.ru/book_img/1936/137295.png)

<i>**Структура проекта**</i>

<b>*Место работы*</b> задает способ выполнения находящихся в нем программ, т.е. поток, в котором программы будут выполняться.

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

- место работы <b>*Таймер*</b> (таймерное прерывание);
- место работы <b>*Ввод-вывод*</b> (таймерное прерывание);
- место работы <b>*Фон*</b> (фоновый поток);
- место работы <b>*Поток*</b> (фоновый поток).

Часть алгоритма, помещенная в таймерном прерывании, всегда выполняется в режиме реального времени с заданной периодичностью (периодичность задается свойством места работы <b>*Таймерный промежуток*</b>) – это поток с самым высоким приоритетом.

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

Существуют функциональные блоки, такие, как логические таймеры, которые целесообразно помещать только в <b>*Таймер*</b>.

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

> [!NOTE]
> **Примечание.** По умолчанию в проекте добавлено два места работы: <b>*Таймер*</b> и <b>*Фон*</b>. О создании дополнительных потоков см. [раздел](#topic-96020).

![Диаграмма выполнения потоков](https://docs.owen.ru/book_img/1936/137294.png)

<i>**Диаграмма выполнения потоков**</i>

<b>*Программа*</b> – это относительно независимая алгоритмическая задача или группа однотипных задач.

Ради простоты дальнейшей поддержки проекта следует избегать двух крайностей: малого числа слишком длинных программ (т.е. с большим числом страниц) и слишком большого числа коротких программ.

Имя программы должно состоять только из символов латинского алфавита и нижнего подчеркивания **«\_»**, поскольку это имя при трансляции определяет имя файла исходных текстов и объектного файла. Важно давать программам осмысленные имена, чтобы впоследствии было проще понять их назначение. Желательно всегда присваивать разные порядковые номера выполнения программам [одного потока](#topic-95987).

Для удобства просмотра программы разбиты на <b>*Страницы*</b>. Количество страниц задает пользователь.

Страница, в свою очередь, содержит <b>*Функциональные блоки*</b>, соединенные между собой связями.

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

### Поток данных

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

При создании алгоритма функциональные блоки можно размещать либо в фоновом, либо в таймерном потоке. Для этого блок создается в определенном <b>*Месте работы*</b>.

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

1. Порядок выполнения программы (свойство <b>*Номер*</b>);
2. Номер страницы (свойство <b>*Номер*</b>);
3. Порядок выполнения блока на странице (свойство <b>*Порядок*</b>).

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

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

![Поток данных](https://docs.owen.ru/book_img/1936/137293.png)

*Поток данных*

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

### Страница

Для удобства представления <b>*Программа*</b> делится на <b>*Страницы*</b>.

Страница имеет порядковый номер (свойство <b>*Номер*</b>), который влияет на порядок выполнения блоков ([поток данных](#topic-95987)) и может иметь другие свойства (<b>*Комментарии*</b>, <b>*Размер листа*</b>).

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

В дереве проекта страница отображается со своим номером и названием, которое задается в свойстве <b>*Комментарии*</b>.

Графически страница выглядит как две области:

1. <b>*Рабочая область*</b> содержит функциональные блоки. Все манипуляции с функциональными блоками (перемещение, создание, удаление, копирование, проведение связей) проводятся здесь. Команды редактирования доступны из контекстного меню блоков и пустого пространства страницы (по нажатию правой кнопки мыши).
2. <b>*Поля*</b> – область, содержащая информацию о входах и выходах блоков, которые находятся на других страницах и связаны с входами и выходами блоков данной страницы.

![Страница](https://docs.owen.ru/book_img/1936/137312.png)

*Страница*

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

![Обозначение входа-выхода на поле страницы](https://docs.owen.ru/book_img/1936/137311.png)

*Обозначение входа/выхода на поле страницы*

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

Размер страницы можно поменять при помощи свойства <b>*Размер листа*</b>, однако следует учитывать, что слишком большая страница, на которой размещено много блоков, может долго открываться.

Масштаб каждой открытой страницы можно менять при помощи колеса мыши при нажатом **Ctrl**. Масштаб открытых страниц меняется относительно общего масштаба всего приложения, который задается комбинациями **Ctrl +** и **Ctrl -**.

Для перемещения по странице можно использовать ползунки справа – перемещение вверх-вниз и снизу – влево-вправо. Также можно использовать колесо мыши – перемещение вверх-вниз и **Shift** + колесо мыши – перемещение влево-вправо.

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

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

<b>*Функциональный блок*</b> представляет из себя элементарный алгоритм. Программа в среде **Полигон** состоит только из функциональных блоков, входы и выходы которых связаны между собой связями.

Типы функциональных блоков описаны в [библиотеках](#topic-95979) (файлы с расширением **.ll2**) и реализованы как классы **C****++**. Информацию о работе блока можно получить из справки библиотеки, выделив блок и нажав **F1**.

Графическое отображение функционального блока на странице несет информацию об его свойствах и свойствах его входов и выходов.

![Представление функционального блока на странице](https://docs.owen.ru/book_img/1936/137310.png)

<i>**Представление функционального блока на странице**</i>

**Основные свойства функционального блока и его входов/выходов**

| Свойство | Описание |
| --- | --- |
| <b>*Имя блока*</b> | Любая строка, удобная для навигации по проекту |
| <b>*Порядок выполнения*</b> | Положительное целое число, которое задает очередность выполнения блока на странице ([поток данных](#topic-95987)). Для корректного выполнения программы рекомендуется не использовать одинаковые порядки выполнения для блоков на одной странице |
| <b>*Тип блока*</b> | Имя типа функционального блока, тип блока выбирается при создании и не может быть изменен в процессе работы |
| <b>*Имя входа*</b> | Строка, уникальная для данного типа блока (может содержать число – индекс в массиве, в случае циклических входов) |
| <b>*Тип входа*</b> | Сокращенное имя типа данных входа |
| <b>*Константа*</b> | Выражение, формат которого зависит от типа входа. Константа задается на входе, не связанном ни с каким выходом и определяет значение входа при выполнении программы. **Полигон** не ограничивает возможные форматы констант. Если константа будет задана неправильно (например, на входе типа **flt** (float) будет задана строковая константа "s"), при трансляции возникнет ошибка |
| <b>*Имя выхода*</b> | Строка, уникальная для данного типа блока (может содержать число – индекс в массиве, в случае циклических выходов) |
| <b>*Тип выхода*</b> | Сокращенное имя типа данных выхода |
| <b>*Связи*</b> | Связи между входами и выходами блоков на одной странице или между блоками, расположенных на разных страницах |
| <b>*Комментарии*</b> | Комментарии, относящиеся к входам/выходам. Комментарии отображаются в дереве проекта |

Свойства блока и его входов/выходов можно менять в окне [Свойства](#topic-96015). Для изменения имени, порядка выполнения, констант на входах и комментариев достаточно дважды нажать мышкой на соответствующем параметре блока в представлении <b>*Страница*</b> и ввести новое значение.

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

#### Входы

Входы функционального блока могут быть следующих типов:

1. <b>*Циклические*</b> – входы, количество которых может изменяться. Входы добавляются командой <b>*Создать*</b> в контекстном меню блока.

2. <b>*Циклические группы*</b> – входы, объединенные в группы, количество которых может изменяться (аналогично циклическим входам). Группа соответствует структуре в **C++**.

3. <b>*Нециклические*</b> – входы, количество которых определяется исключительно типом функционального блока и не изменяется.

   ![Типы входов ФБ](https://docs.owen.ru/book_img/1936/137309.png)

   *Типы входов ФБ*

По отношению к возможности проведения связи входы делятся на следующие типы (задается свойством входа <b>*Тип связей*</b>):

1. <b>*Обычный вход*</b> – вход, на котором можно (необязательно) задать константу или провести связь (свойство <b>*Тип связей*</b> **= 0**).
2. <b>*Константный вход*</b> – вход, на котором требуется задать константу и нельзя провести связь (<b>*Тип связей*</b> **= 1**).
3. <b>*Необязательный вход*</b> – вход, на котором можно (необязательно) провести связь и нельзя задать константу. При отсутствии связи вход не используется в программе. Данный вход обычно обозначается символом <b>*#*</b> в поле констант и имеет свойство <b>*Тип связей*</b> **= 2**.
4. <b>*Обязательный вход*</b> – вход, на котором следует провести связь и нельзя задать константу. Если на вход данного типа не будет проведена связь, то при трансляции будет выдана ошибка. Данный вход обозначается обычно символами <b>*???*</b> в поле констант и имеет свойство <b>*Тип связей*</b> **= 3**.

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

#### Выходы

Выходы функционального блока могут быть двух типов:

1. <b>*Циклические*</b> – выходы, количество которых может изменяться. Выходы добавляются командой <b>*Создать*</b> в контекстном меню блока. Количество циклических выходов может зависеть от количества входов: при изменении количества входов меняется и количество выходов, и наоборот.
2. <b>*Нециклические*</b> – обычные выходы, количество которых нельзя изменить.

![Типы выходов ФБ](https://docs.owen.ru/book_img/1936/137308.png)

*Типы выходов ФБ*

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

#### Связи

Для того чтобы провести <b>*Связь*</b>, следует щелкнуть левой кнопкой мыши на входе или выходе ФБ и, не отпуская левую кнопку мыши, подвести указатель к другому входу или выходу ФБ. При отпускании левой кнопки мыши связь будет проведена.

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

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

Цвет связей отображает тип данных входа:

- <b>*черный*</b> – булевое;
- <b>*красный*</b> – целое;
- <b>*синий*</b> – вещественное;
- <b>*серый*</b> – строковое.

Подробнее о проведении связей см. в [разделе](#topic-96026).

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

### Составной блок

Часть алгоритма, повторяющаяся в проекте несколько раз, может быть выделена в новый <b>*Составной функциональный блок*</b>. Обычно это упрощает отладку и модификацию этой части алгоритма, а также уменьшает время трансляции проекта. Составной блок при трансляции превращается в класс.

Подробно о создании составного блока см. в [разделе](#topic-96047).

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

## Интерфейс

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

### Окна

В среде **Полигон** существует два вида окон – <b>*Окна представления*</b> и <b>*Системные окна*</b>.

<b>*Окна представления*</b> предназначены для редактирования и отладки проекта и их нельзя вынести поверх других окон в среде.

<b>*Системные окна*</b> предназначены для работы со средой разработки: подключения к контроллеру, управления проектами и библиотеками, поиска по проекту и т. д. Системные окна можно как встраивать рядом с окнами представления, так и выносить поверх них.

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

#### Окна представления

**Типы окон представления**

| Тип окна представления | Пиктограмма | Функция |
| --- | --- | --- |
| [Дерево](#topic-95998) | ![Пикг Дерево](https://docs.owen.ru/book_img/1936/137307.png) | Навигация по проектам и библиотекам |
| [Страница](#topic-95999) | ![Пикг Страница](https://docs.owen.ru/book_img/1936/137306.png) | Отображение страницы с функциональными блоками |
| [Составной блок](#topic-96000) | ![Пикг Сост Блок](https://docs.owen.ru/book_img/1936/137305.png) | Отображение содержания составного блока |
| [Функциональный блок](#topic-96001) | ![Пикг ФБ](https://docs.owen.ru/book_img/1936/137304.png) | Графическое отображение функционального блока |
| [Редактор](#topic-96002) | ![Пикг Редактор](https://docs.owen.ru/book_img/1936/137303.png) | Отображение файлов-ссылок для редактирования |
| [Таблица](#topic-96003) | ![Пикг Таблица](https://docs.owen.ru/book_img/1936/137332.png) | Отображение информации о функциональных блоках и их входах/выходах в табличном виде |
| [График](#topic-96043) | ![Пикг График](https://docs.owen.ru/book_img/1936/137331.png) | Отображение значений входов/выходов в виде графиков |
| [Экран отладчика](#topic-96041) | ![Пикг Экр Отл](https://docs.owen.ru/book_img/1936/137330.png) | Отображение значений входов/выходов в виде графических элементов |

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

1. Открыть меню <b>*Окна/Новое окно*</b>. Выбрать расположение нового окна относительно открытых окон – в окне <b>*Выберите место для нового окна*</b> отображается прямоугольниками серого цвета. Выбрать тип нового окна из списка.

   ![Создание нового окна представления](https://docs.owen.ru/book_img/1936/137329.png)

   *Создание нового окна представления*

   ![Выбор места для окна представления](https://docs.owen.ru/book_img/1936/137328.png)

   *Выбор места для нового окна представления*

   ![Выбор типа окна представления](https://docs.owen.ru/book_img/1936/137327.png)

   <i>**Выбор типа окна представления**</i>

2. Выбрать тип нового окна на панели <b>*Представления*</b>. Выбрать положение нового окна относительно открытых окон. Панель <b>*Представления*</b> добавляется через меню <b>*Окна/Панели инструментов/Представления*</b>.

   ![Панель Представления](https://docs.owen.ru/book_img/1936/137326.png)

   <i>**Панель Представления**</i>

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

##### Панели инструментов для работы с окнами представления

Для работы с окнами представления используются следующие панели, которые можно добавить или убрать с помощью установки или снятия флагов в меню <b>*Окна/Панели инструментов*</b>:

1. <b>*Инструменты*</b> – панель основных инструментов для работы с окнами представления.

   ![Панель Инструменты](https://docs.owen.ru/book_img/1936/137325.png)

   <i>**Панель Инструменты**</i>

   **Элементы панели Инструменты**

   | Элемент | Пиктограмма | Функция |
   | --- | --- | --- |
   | **<i>Сохранить или **Ctrl** **+** **s**</i>** | ![Пикг Сохр](https://docs.owen.ru/book_img/1936/137324.png) | Сохранить изменения на странице |
   | <b>*Свойства*</b> | ![Пикг Св-ва](https://docs.owen.ru/book_img/1936/137323.png) | Открыть панель [Свойства](#topic-96015) страницы или элемента |
   | <b>*Показать*</b> | ![Пикг Показ](https://docs.owen.ru/book_img/1936/137342.png) | Открыть окно с выбранным элементом (страницей, ФБ, входом, выходом и т. д.) |
   | <b>*Создать*</b> | ![Пикг Создать](https://docs.owen.ru/book_img/1936/137341.png) | Открыть окно создания нового элемента (страницы в дереве, ФБ на странице и т. д.) |
   | <b>*Транслировать все*</b> | ![Пикг Трансл Все](https://docs.owen.ru/book_img/1936/137340.png) | Запустить [трансляцию](#topic-96034) проекта |
   | <b>*Копировать*</b> | ![Пикг Копрвт](https://docs.owen.ru/book_img/1936/137339.png) | Копировать выбранные элементы |
   | <b>*Вставить*</b> | ![Пикг Вставить](https://docs.owen.ru/book_img/1936/137338.png) | Вставить скопированные элементы |
   | <b>*Экспорт*</b> | ![Пикг Экспорт](https://docs.owen.ru/book_img/1936/137337.png) | Экспортировать элементы для редактирования в MS Excel (см. [раздел](#topic-96056)) |
   | <b>*Импорт*</b> | ![Пикг Импорт](https://docs.owen.ru/book_img/1936/137336.png) | Импортировать элементы из MS Excel (см. [раздел](#topic-96056)) |
   | <b>*Отладчик*</b> | ![Пикг Отладчик](https://docs.owen.ru/book_img/1936/137335.png) | Запустить [отладчик](#topic-96041) |
   | **<i>Отменить или **Ctrl** **+** **z**</i>** | ![Пикг Отм](https://docs.owen.ru/book_img/1936/137334.png) | Отменить последнее действие (программа сохраняет в памяти **10** последних действий) |

2. <b>*Навигация*</b> – панель, обеспечивающая навигацию по окнам.

   ![Панель Навигация](https://docs.owen.ru/book_img/1936/137333.png)

   <i>**Панель Навигация**</i>

   **Элементы панели Навигация**

   | Элемент | Пиктограмма | Функция |
   | --- | --- | --- |
   | <b>*Текущее окно*</b> | ![Пикг Тек Окно](https://docs.owen.ru/book_img/1936/137352.png) | Сделать окно текущим. При установке данное окно становится рабочим – в нем будут отображаться страницы при двойном нажатии в <b>*Дереве*</b> и при нажатии на полях страниц |
   | <b>*Списки выбора*</b> | В соответствии с типом окна | Отобразить список типов окон представления |
   | <b>*Назад и Вперед*</b> | ![Пикг Назд Впрд](https://docs.owen.ru/book_img/1936/137351.png) | Открыть предыдущую или последующую открытую страницу |
   | <b>*Путь*</b> | ![Пикг Путь](https://docs.owen.ru/book_img/1936/137350.png) | Путь до страницы в дереве проекта (для окон типа <b>*Страница*</b>) |
   | <b>*Представления*</b> |   | Список типов окон представления. При смене окна его тип выбирается в этом выпадающем списке |
   | <b>*Проекты*</b> | ![Пикг Пр-ты](https://docs.owen.ru/book_img/1936/137349.png) | Список добавленных проектов и библиотек |
   | <b>*На уровень вверх или Сброс*</b> | ![Пикг На Ур Вв](https://docs.owen.ru/book_img/1936/137348.png) | Переместиться на уровень вверх или переместиться на верхний уровень (для окон типа <b>*Дерево*</b>) |
   | <b>*Предыдущая или Следующая страница*</b> | ![Пикг Пред След Стр](https://docs.owen.ru/book_img/1936/137347.png) | Открыть предыдущий или следующий элемент в дереве в окнах типа <b>*Страница*</b>, <b>*Составной блок*</b>, <b>*Функциональный блок*</b>, <b>*Редактор*</b>, <b>*Таблица*</b> |

3. <b>*Вид*</b> – панель, определяющая взаимное расположение окон.

   ![Панель Вид](https://docs.owen.ru/book_img/1936/137346.png)

   <i>**Панель Вид**</i>

   **Элементы панели Вид**

   | Элемент | Пиктограмма | Функция |
   | --- | --- | --- |
   | <b>*Обновление*</b> | ![Пикг Обнов](https://docs.owen.ru/book_img/1936/137345.png) | Обновить вид окна |
   | <b>*Вертикальное размещение*</b> | ![Пикг Верт Разм](https://docs.owen.ru/book_img/1936/137344.png) | Разместить окна вертикально |
   | <b>*Горизонтальное размещение*</b> | ![Пикг Гориз Разм](https://docs.owen.ru/book_img/1936/137343.png) | Разместить окна горизонтально |
   | <b>*Вкладки*</b> | ![Пикг Вклдк](https://docs.owen.ru/book_img/1936/137362.png) | Разместить окна по вкладкам. При открытии нового окна появляется вариант поместить его как вкладку |
   | <b>*Фиксировать*</b> | ![Пикг Фикс](https://docs.owen.ru/book_img/1936/137361.png) | Закрепить текущее окно. В закрепленное окно нельзя отобразить другие окна (пиктограмма <b>*Текущее окно*</b> пропадает). Это полезно, например, для окон типа <b>*Дерево*</b>, в которых всегда отображается структура проекта |

4. <b>*Редактирование*</b> – панель для окон типов <b>*Страница*</b> и <b>*Экран отладчика*</b> для добавления графических элементов: <b>*стрелка*</b>, <b>*фон*</b>, <b>*текст*</b> (подробнее см. в [разделе](#topic-96029)).

   ![Панель Редактирование](https://docs.owen.ru/book_img/1936/137360.png)

   <i>**Панель Редактирование**</i>

   **Элементы панели Редактирование**

   | Элемент | Пиктограмма | Функция |
   | --- | --- | --- |
   | <b>*Стрелка*</b> | ![Пикг Стрлк](https://docs.owen.ru/book_img/1936/137359.png) | Разместить стрелку |
   | <b>*Фон*</b> | ![Пикг Фон](https://docs.owen.ru/book_img/1936/137358.png) | Разместить фон |
   | <b>*Текст*</b> | ![Пикг Текст](https://docs.owen.ru/book_img/1936/137357.png) | Разместить текст |

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

##### Дерево

С помощью окна представления <b>*Дерево*</b> можно перемещаться по проектам и библиотекам. Переключение между проектами и библиотеками происходит в выпадающем списке в верхнем меню окна.

![Окно представления Дерево](https://docs.owen.ru/book_img/1936/137356.png)

*Окно представления Дерево*

В окне <b>*Дерево*</b> отображается структура выбранного проекта и есть раскрывающиеся списки на модулях, местах работы, программах, страницах, функциональных блоках и библиотеках.

В окне <b>*Дерево*</b> можно редактировать проект – создавать, удалять, копировать части проекта и библиотек (см. [раздел](#topic-96020)).

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

##### Страница

Окно представления <b>*Страница*</b> предназначено для отображения страницы с функциональными блоками.

![Окно представления Страница](https://docs.owen.ru/book_img/1936/137355.png)

*Окно представления Страница*

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

[В режиме отладки](#topic-96041) на странице отображаются онлайн значения входов/выходов.

Основные свойства страницы:

- <b>*Комментарии*</b> – название страницы в дереве;
- <b>*Номер*</b> – номер в дереве, данное свойство определяет порядок выполнения программы ([поток данных](#topic-95987));
- <b>*Размер листа*</b> – от **А4** до **А0** (по умолчанию установлен **А4**).

При нажатии **Shift** над страницей у курсора мыши появляется крест из линий.

![Кнопка шифт и крест мыши](https://docs.owen.ru/book_img/1936/140140.png)

*Отображение креста у курсора мыши*

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

##### Окно Составной блок

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

![Окно представления Составной блок](https://docs.owen.ru/book_img/1936/137354.png)

*Окно представления Составной блок*

Входы и выходы внутренних блоков, которые входят в составной блок, отображаются на полях страницы. Внешние входы и выходы составного блока выделены желтым цветом. Подробно о создании составного блока см. в [разделе](#topic-96047)

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

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

В окне представления <b>*Функциональный блок*</b> показаны названия, имена входов/выходов и типы входов/выходов функционального блока.

![Окно представления Функциональный блок](https://docs.owen.ru/book_img/1936/137353.png)

*Окно представления Функциональный блок*

Подробнее о функциональном блоке см. в [разделе](#topic-95989).

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

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

Для отображения и редактирования файлов-ссылок в проекте предназначено окно представления <b>*Редактор*</b>.

Окно <b>*Редактор*</b> открывается автоматически при двойном щелчке на файле в дереве проекта.

![Окно представления Редактор](https://docs.owen.ru/book_img/1936/137382.png)

<i>**Окно представления Редактор**</i>

В окне <b>*Редактор*</b> пишется программный код при создании составного функционального блока. Подробнее о создании составного ФБ см. в [разделе](#topic-96048).

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

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

##### Таблица

Окно представления <b>*Таблица*</b> отображает информацию о функциональных блоках, их входах/выходах и свойствах в табличном виде. При представлении данных в виде таблицы удобно редактировать свойства, смотреть комментарии, уставки и значения, измененные во время отладки.

![Окно представления Таблица](https://docs.owen.ru/book_img/1936/137381.png)

<i>**Окно представления Таблица**</i>

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

![Выбор отображаемых свойств в таблице](https://docs.owen.ru/book_img/1936/137380.png)

<i>**Выбор отображаемых свойств в таблице**</i>

![Установка фильтра по столбцам в таблице](https://docs.owen.ru/book_img/1936/137379.png)

<i>**Установка фильтра по столбцам в таблице**</i>

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

##### График

Окно представления <b>*График*</b> позволяет просматривать значения на входах и выходах функциональных блоков в графическом представлении во время отладки (подробнее см. в [разделе](#topic-96041)).

![Окно представления График](https://docs.owen.ru/book_img/1936/137378.png)

<i>**Окно представления График**</i>

Для того, чтобы вход или выход отображался на графике, следует перетащить его ЛКМ со страницы с зажатым **Ctrl** в верхнюю часть окна <b>*График*</b>. <b>*Модуль*</b> добавленного входа или выхода автоматически станет текущим для графика. Для текущего <b>*Модуля*</b> можно добавлять входы/выходы на график из дерева с помощью перетаскивания по одному.

Для того, чтобы на графике отображалась группа входов или выходов, следует добавить их в <b>*Раздел*</b>.

Для создания <b>*Раздела*</b> нужно нажать на модуль ПКМ и нажать <b>*Создать*</b>. В появившемся окне необходимо выбрать пункт <b>*раздел*</b> и ввести <b>*имя*</b> нового раздела. Входы и выходы проекта добавляются в <b>*Раздел*</b> путем перетаскивания из дерева или со страницы (с зажатым **Ctrl**). В выпадающем меню при перетаскивании входа или выхода в раздел следует выбрать <b>*Добавить*</b>.

Для отображения входов и выходов раздела на графике следует перетащить раздел из дерева проекта в верхнюю часть окна <b>*График*</b> – данный <b>*Раздел*</b> автоматически станет текущим для графика. Для текущего <b>*Раздела*</b> в таблицу графика автоматически добавляются входы/выходы из этого раздела. Если добавить новый вход или выход проекта в таблицу графика, он автоматически добавится в раздел.

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

**Свойства для отображения в таблице графика**

| Свойство | Описание |
| --- | --- |
| <b>*Значение онлайн*</b> | Текущее значение входа/выхода |
| <b>*Маркер*</b> | Значение входа/выхода в момент, отмеченный маркером |
| <b>*График: минимум шкалы*</b> | Минимум индивидуальной шкалы входа/выхода |
| <b>*График: максимум шкалы*</b> | Максимум индивидуальной шкалы входа/выхода |
| <b>*Цвет*</b> | Цвет графика сигнала и его индивидуальной шкалы |
| <b>*Получено*</b> | Количество полученных значений |
| <b>*Ошибок*</b> | Количество ошибок |
| <b>*Зона нечувствительности*</b> | Если модуль разницы между значениями сигналов меньше данной величины, то будет считаться, что значение не изменилось |
| <b>*Период опроса (мс)*</b> | Количество миллисекунд между опросами |
| <b>*Размер очереди*</b> | Количество значений, которые могут быть накоплены перед отправкой (при недостаточном размере очереди можно наблюдать появление ошибок) |

![Свойства входов-выходов в таблице графика](https://docs.owen.ru/book_img/1936/137377.png)

<i>**Свойства входов/выходов в таблице графика**</i>

Свойства <b>*Получено*</b> и <b>*Ошибок*</b> отображают количество полученных значений данного сигнала и количество ошибок, которые сигнализируют о переполнении очереди.

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

Если нажать ПКМ на строке таблицы, соответствующей входу/выходу, то вызывается контекстное меню, которое позволяет:

- <b>*Скрыть*</b> или <b>*Показать*</b> вход или выход на графике;
- <b>*Скрыть ось*</b> или <b>*Показать ось*</b> для входа или выхода;
- <b>*Удалить*</b> вход или выход из таблицы.

**Настройки графика**

| Свойство | Описание |
| --- | --- |
| <b>*Длительность данных (сек)*</b> | Количество данных, которое нужно хранить |
| <b>*Показывать (сек)*</b> | Количество данных, которое нужно показывать на окне |
| <b>*Период отправки шкалы*</b> | Частота отправки значений сигналов контроллером на график (отправка происходит не чаще этого времени) |
| <b>*Очищать данные*</b> | Удалять старые данные с графика при запуске |
| <b>*Общая ось (Y)*</b> | Используется для отображения данных на общей оси |
| <b>*Маркеры 1, 2*</b> | Вертикальные прямые, с помощью которых можно просмотреть значение на графике в нужный момент времени |
| <b>*Делать отсчеты*</b> | · <b>*в фоне*</b> – по окончании периода отсчета будет посылаться одно текущее значение с каждого входа/выхода,<br>· <b>*в таймере*</b> – по окончании периода отсчета для каждого входа/выхода будут посылаться значения, накопленные с заданным таймерным промежутком,<br>· <b>*произвольно*</b> – значения накапливаются с заданным периодом, <b>*Период*</b> и <b>*Размер*</b> очереди устанавливается справа. Эти значения применяются для всех входов/выходов, у которых не установлены свои значения. |

Для просмотра текущих значений входов/выходов на графике следует нажать кнопку <b>*Запустить*</b> (запуск проекта на контроллере описан в [разделе](#topic-96035)). Для остановки отрисовки графика следует нажать <b>*Остановить*</b>.

> [!NOTE]
> **Примечание.** Для корректной работы графика необходимо синхронизировать системное время контроллера с браузером через web-конфигуратор (<b>*Система/Время/Системное время*</b> – <b>*Синхронизировать с браузером*</b>).

График подключается к запущенному проекту как клиент по протоколу **OPC** **UA**. По умолчанию график оформляет подписку на данные проекта с дискретностью фонового цикла.

Для получения данных из таймера в проекте должен быть создан функциональный блок <b>*OpcUAServerTimer*</b> из библиотеки <b>*paOpcUA*</b>. Блок следует создать в <b>*Таймере*</b> для работы подписок с точностью таймерного цикла (период отображения данных задается свойством модуля <b>*Таймерный промежуток*</b> в мс).

Подробнее см. в документе [Обмен с верхним уровнем. Библиотека paOpcUA](https://owen.ru/product/polygon/documentation).

![Блок Opc UAServer Timer](https://docs.owen.ru/book_img/1936/137376.png)

<i>**Блок OpcUAServerTimer**</i>

![Пример работы графика в фоне1](https://docs.owen.ru/book_img/1936/137375.png)

![Пример работы графика в фоне2](https://docs.owen.ru/book_img/1936/137374.png)

<i>**Пример работы графика в фоне (сверху) и в таймере (снизу)**</i>

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

Перемещаться по графику влево/вправо и вверх/вниз можно с помощью мыши с зажатой ЛКМ на соответствующей оси графика.

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

Также можно выбрать режим <b>*Отображение на разных полотнах*</b>.

![Отображение графиков на разных полотнах](https://docs.owen.ru/book_img/1936/137373.png)

<i>**Отображение графиков на разных полотнах**</i>

Нажатие правой кнопкой мыши по оси Х или У открывает их свойства. Также кнопки свойств осей можно отобразить, нажав на кнопку с ползунками в левой нижней части графика.

В свойствах оси Х можно выбрать тип тренда, временное ограничение буфера данных, параметры оси.

В свойствах оси Y можно выбрать границы отображаемого интервала данных.

С помощью кнопки <b>*Экспорт*</b> можно выгрузить график на диск в форматах **.****txt**, **.****pdf** или **.****png**.

> [!WARNING]
> **Внимание.** Путь сохранения не должен содержать кириллицу и пробелы.

![Экспорт графика](https://docs.owen.ru/book_img/1936/137392.png)

<i>**Экспорт графика**</i>

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

##### Экран отладчика

Окно представления <b>*Экран отладчика*</b> позволяет просматривать и изменять значения на входах и выходах функциональных блоков во время отладки (подробнее об отладке см. в [разделе](#topic-96041)).

Экран отладчика соответствует определенному <b>*Разделу*</b>. Входы и выходы, которые нужно отобразить на экране, следует добавить в этот раздел.

Для создания <b>*Раздела*</b> нужно нажать на модуль ПКМ и нажать <b>*Создать*</b>. В появившемся окне необходимо выбрать пункт <b>*раздел*</b> и ввести <b>*имя*</b> нового раздела.

Для того, чтобы добавить необходимые входы/выходы в раздел экрана, следует выделить интересующий вход/выход на странице, зажав **C****trl**, перетащить его в раздел, выбрать <b>*Добавить*</b> – данный вход/выход появится в разделе. Также входы/выходы можно перетащить на экран из дерева или страницы, тогда они автоматически добавятся в текущий раздел.

Для открытия экрана отладчика необходимо в окнах представления в верхнем меню выбрать <b>*Экран отладчика*</b>, сделать окно активным и дважды нажать на необходимый раздел в дереве, либо перетащить раздел на активную страницу.

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

**Типы графических элементов**

| Свойство | Класс отображения | Описание |
| --- | --- | --- |
| <b>*Кнопка импульсная*</b> | pushbutton | При нажатии, если на входе не **0**, сначала посылает **0**, затем **1**, затем **0** |
| <b>*Кнопка*</b> | togglebutton | При нажатии посылает **1**, при отжатии – **0** |
| <b>*Слайдер*</b> | slider | Отображает значения в диапазоне от минимума до максимума, для входа – позволяет редактировать значение |
| <b>*Шкала*</b> | dial | Аналогично <b>*слайдеру*</b> отображает значения в диапазоне от минимума до максимума, для входа - позволяет редактировать значение |
| <b>*Значение*</b> | value | Отображает значение целым или вещественным числом |
| <b>*Лампа*</b> | lamp | При нулевом или отрицательном значении светится красным цветом, при положительном – светится зеленым (цвета <b>*лампы*</b> можно поменять в окне свойств) |

![Вид графических элементов на экране отладки](https://docs.owen.ru/book_img/1936/137391.png)

<i>**Вид графических элементов на экране отладки**</i>

Один вход или выход в проекте может соответствовать только одному графическому элементу на экране.

При добавлении входа или выхода в раздел экрана ему по умолчанию присваивается класс отображения в соответствии с правилом:

- если это логический вход – <b>*кнопка*</b>, иначе – <b>*слайдер*</b>
- если это логический выход – <b>*лампа*</b>, иначе – <b>*значение*</b>.

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

1. Открыть свойства интересующего графического элемента.
2. Добавить свойство <b>*Экран: класс отображения*</b> из нижнего выпадающего списка.
3. Установить в свойстве нужное значение класса отображения.

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

Для удаления графического элемента нужно нажать на него ПКМ, открыть контекстное меню и выбрать команду <b>*Удалить*</b>. Эта команда также удаляет вход или выход из раздела, открытого в качестве экрана.

На экран отладчика также можно добавить элементы панели <b>*Редактирование*</b>: [стрелку, фон, текст](#topic-96029).

Масштабирование экрана отладчика выполняется с помощью колеса мыши с зажатым **Ctrl**.

В режиме работы отладчика для изменения значения на входе нужно дважды щелкнуть на соответствующем элементе и отредактировать значение. Это доступно для графических элементов: <b>*значение*</b>, <b>*слайдер*</b> и <b>*шкала*</b>.

**Свойства графических элементов экрана отладчика**

| Свойство | Описание |
| --- | --- |
| <b>*Комментарии*</b> | Отображается в качестве комментария около входа/выхода, в дереве, над графическим элементом |
| <b>*Номер*</b> | Определяет порядок отображения в дереве, начиная с **0** |
| <b>*Экран: класс отображения*</b> | Выбор типа графического элемента |
| <b>*Экран: разрешить изменения*</b> | Разрешает редактировать значение во время отладки для графических элементов <b>*значение*</b>, <b>*слайдер*</b>, <b>*шкала*</b> |
| <b>*Экран: x и Экран: y*</b> | Координаты элемента |
| <b>*Экран: min и Экран: max*</b> | Задают диапазон изменения (минимальное и максимальное значения) для графических элементов <b>*слайдер*</b>, <b>*шкала*</b> |
| <b>*Экран: шаг*</b> | Задает шаг шкалы для <b>*слайдера*</b> и <b>*шкалы*</b> |
| <b>*Экран: радиус скругления*</b> | Задает радиус скругления для лампы |
| <b>*Экран: цвет_1 и Экран: цвет_2*</b> | Задают цвет графического элемента **лампа** во «включенном» и «выключенном» состояниях |
| <b>*Экран: ширина элемента и Экран: высота элемента*</b> | Задают ширину и высоту графического элемента |
| <b>*Экран: отключить надписи*</b> | Убирает отображение свойства <b>*Комментарии*</b> над графическим элементом |

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

#### Системные окна

**Типы системных окон**

| Тип окна представления | Пиктограмма | Функция |
| --- | --- | --- |
| [Контроллер](#topic-96007) | ![Пикг Контроллер](https://docs.owen.ru/book_img/1936/137390.png) | Подключение к контроллеру и загрузка проекта |
| [Прогресс](#topic-96008) | ![Пикг Прогресс](https://docs.owen.ru/book_img/1936/137389.png) | Отслеживание процессов исполнения |
| [Проекты](#topic-96009) | ![Пикг Проекты](https://docs.owen.ru/book_img/1936/137388.png) | Управление проектами и библиотеками |
| [Настройки сборки](#topic-96010) | ![Пикг Настр Сбр](https://docs.owen.ru/book_img/1936/137387.png) | Пути к установленным сборкам |
| [Поиск](#topic-96011) | ![Пикг Поиск](https://docs.owen.ru/book_img/1936/137386.png) | Поиск по проекту |
| [Справка или F1](#topic-96012) | ![Пикг Справка](https://docs.owen.ru/book_img/1936/137385.png) | Информация по среде разработки и добавленным библиотекам |
| [О программе](#topic-96013) | ![Пикг Оп Рог](https://docs.owen.ru/book_img/1936/137384.png) | Сведения о программе, библиотеках, загрузка обновлений |
| [Печать](#topic-96014) | ![Пикг Печать](https://docs.owen.ru/book_img/1936/137383.png) | Печать страниц проекта |

Системные окна добавляются из меню <b>*Окна*</b> или с помощью панели <b>*Окна*</b>, которую можно открыть из меню <b>*Окна*</b><b>*/*</b><b>*Панели инструментов*</b><b>*/*</b><b>*Окна*</b>.

![Панель Окна](https://docs.owen.ru/book_img/1936/137402.png)

*Панель Окна*

Системные окна можно размещать на экране несколькими способами:

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

![Размещение системных окон по вкладкам](https://docs.owen.ru/book_img/1936/137401.png)

*Размещение системных окон по вкладкам*

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

##### Контроллер

Инструменты для загрузки и запуска программ на контроллере находятся в окне <b>*Контроллер*</b>.

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

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

При установке флага <b>*Параметры модуля*</b> – настройки подключения и путь к исполняемому файлу проекта подгружаются из соответствующих свойств модуля, выбираемого из выпадающего списка. При убранном флаге <b>*Параметры модуля*</b> настройки подключения и путь к исполняемому файлу можно задать вручную.

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

Кнопкой <b>*Загрузить*</b> выполняется загрузка проекта в контроллер.

Кнопками <b>*Запустить модуль*</b> и <b>*Остановить модуль*</b> выполняется, соответственно, запуск и останов работы загруженного приложения на контроллере.

Кнопкой <b>*Закрыть сессию*</b> выполняется отключение от ПЛК.

![Системное окно Контроллер](https://docs.owen.ru/book_img/1936/137400.png)

<i>**Системное окно Контроллер**</i>

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

##### Прогресс

Для отслеживания процесса выполнения используется окно <b>*Прогресс*</b>.

При трансляции в окне <b>*Прогресс*</b> отображается ход выполнения, при наличии ошибок они указываются с описанием.

По итогу трансляции можно видеть результат – сообщение об успешности выполнения и время выполнения.

Подробно о трансляции проекта см. в [разделе](#topic-96034).

![Системное окно Прогресс нов](https://docs.owen.ru/book_img/1936/140139.png)

<i>**Системное окно Прогресс**</i>

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

##### Проекты

Для добавления в среду ссылок на проекты и библиотеки используется окно <b>*Проекты*</b>.

В окне <b>*Проекты*</b> с помощью соответствующих кнопок можно открыть существующие проект и/или библиотеку, создать новые, закрыть (для этой функции также можно использовать значок «**х**» закрытия справа от проекта/библиотеки в списке).

В списке указывается путь до добавленных проекта и/или библиотеки на диске.

В окне <b>*История изменений*</b> можно получить информацию по логам выбранного проекта и/или библиотеки.

Через окно <b>*Проекты*</b> можно сохранить копию проекта под другим названием с помощью кнопки <b>*Сохранить как…*</b>, а также создать зашифрованную версию проекта (подробнее о защите проекта см. в [разделе](#topic-96060)).

![Системное окно Проекты](https://docs.owen.ru/book_img/1936/137398.png)

<i>**Системное окно Проекты**</i>

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

##### Настройки сборки

Для настроек сборок используется окно <b>*Настройки сборки*</b>.

В окне <b>*Настройки сборки*</b> указаны пути к установленным сборкам. Настройки сборки устанавливаются инсталлятором, пользователю остается убедиться в их наличии.

![Системное окно Настройки сборки](https://docs.owen.ru/book_img/1936/137397.png)

<i>**Системное окно Настройки сборки**</i>

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

##### Поиск

Для поиска по проекту используется окно <b>*Поиск*</b>.

В окне <b>*Поиск*</b> выбирается проект и задаются критерии поиска. Для быстрого поиска можно добавлять условия.

![Системное окно Поиск](https://docs.owen.ru/book_img/1936/137396.png)

*Системное окно Поиск*

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

##### Справка

Для получения информации по среде разработки или по работе и назначению входов/выходов функционального блока из библиотеки используется окно <b>*Справка*</b> (горячая клавиша **F****1**).

В верхнем выпадающем списке окна <b>*Справка*</b> можно выбрать интересующий раздел справки – среду разработки или конкретную библиотеку.

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

Открыть справку на конкретный функциональный блок в проекте можно, выбрав его в дереве (в проекте или в библиотеке) или непосредственно на странице проекта и нажав **F1**. Еще можно выбрать <b>*Справка*</b> в выпадающем контекстном меню при нажатии ПКМ на блоке.

При создании составных функциональных блоков и/или пользовательских библиотек можно создавать для них справку. Подробнее см. в [разделе](#topic-96053).

![Системное окно Справка](https://docs.owen.ru/book_img/1936/137395.png)

<i>**Системное окно Справка**</i>

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

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

Для получения сведений о программе, версиях библиотек и наличии обновлений предназначено системное окно <b>*О программе*</b>.

Во вкладке окна <b>*О программе*</b> можно получить информацию о текущих установленных версиях среды Полигон и библиотек.

При нажатии кнопки <b>*Лицензионная информация*</b> открывается окно со сведениями о системных лицензиях, которые используются в среде разработки библиотек.

![Системное окно О программе](https://docs.owen.ru/book_img/1936/137394.png)

<i>**Системное окно О программе**</i>

Во вкладке окна <b>*Обновления*</b> при нажатии <b>*Проверить*</b> проверяется наличие обновлений. Требуется подключение к серверу *pa.ru*.

После нажатия кнопки <b>*Установить*</b> программа установит найденные обновления и выполнит перезагрузку среды.

При установке флага <b>*Показывать тестовые версии*</b> в списке обновлений также будут доступны тестовые релизы среды и библиотек.

При установке флага <b>*Показывать старые версии*</b> будут показаны доступные для установки прошлые версии релизов среды и библиотек.

В нижней части окна выбирается распаковщик – <b>*unzip*</b> или <b>*7zip*</b>.

Подробно обновление среды и/или библиотек описано в [разделе](#topic-95981).

В левом нижнем углу окна расположена кнопка <b>*Удалить бэкапы*</b>. В новом окне можно выбрать бэкапы (резервные копии проекта) для удаления. При превышении общего объема бэкапов в **500 Мб** в окне выводится предупреждающее сообщение.

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

![Вкладка Обновления](https://docs.owen.ru/book_img/1936/137393.png)

<i>**Вкладка Обновления**</i>

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

##### Печать

Для печати страниц проекта используется окно <b>*Печать*</b>.

В окне выбирается нужный проект.

![Системное окно Печать](https://docs.owen.ru/book_img/1936/137422.png)

*Системное окно Печать*

При нажатии на кнопку <b>*Сведения*</b> добавляются данные для титульного листа и штампов.

![Данные для титульного листа и штампов](https://docs.owen.ru/book_img/1936/137421.png)

*Данные для титульного листа и штампов*

В <b>*Настройках*</b> можно выбрать печати и вариант печати – на бумажном носителе или в файл.

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

![Настройки печати](https://docs.owen.ru/book_img/1936/137420.png)

*Настройки печати*

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

### Окно Свойства

Окно <b>*Свойства*</b> элемента можно открыть, вызвав контекстное меню правой кнопкой мыши и выбрав <b>*Свойства*</b>. Или можно нажать соответствующую пиктограмму на панели [Инструменты](#topic-95997).

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

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

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

Нажатием кнопки <b>*Сохранить*</b> новые свойства вступают в силу. Нажатием кнопки <b>*Отмена*</b> можно отменить последние действия – добавление, удаление или изменение свойства.

Для удаления свойства нужно нажать на него ПКМ и выбрать <b>*Удалить свойство*</b>.

![Окно Свойства](https://docs.owen.ru/book_img/1936/137419.png)

*Окно Свойства*

Включенный флаг <b>*Привязать к родителю*</b> позволяет задать свойство текущего узла только внутри текущего родителя.

Например, если вход добавлен в несколько разделов, то можно раскрыть в дереве конкретный раздел, выбрать этот вход и добавить ему свойство с флагом <b>*Привязать к родителю*</b>, тогда в других разделах у данного входа этого свойства не появится. Такое же свойство у входов в других разделах можно задать отдельно и тоже с флагом <b>*Привязать к родителю*</b>.

Этим способом можно добавить вход в несколько **OPC UA**-клиентов и в каждом задать свое свойство <b>*Зона нечувствительности*</b>.

В свойства можно добавить пользовательские свойства <b>*Пользовательское свойство 00*</b>,<b>..., *20*</b>. Их использование полезно, например, в свойствах модуля для сохранения дополнительных IP адресов и обращения к ним по SQL-запросам.

Пример запроса пользовательского свойства <b>*Пользовательское свойство 00*</b> (prop_0):

```
<sql SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_0"</sql>.
```

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

### Конфигурация экрана

Расположение окон, а также ссылки на открытые проекты и библиотеки сохраняются в файле на диске и восстанавливаются при следующем запуске среды **Полигон** как файл конфигурации с расширением **.ini**. Можно создавать разные конфигурации рабочего экрана и сохранять их через меню <b>*Экран*</b>.

![Действия с файлом конфигурации в меню Экран](https://docs.owen.ru/book_img/1936/137418.png)

<i>**Действия с файлом конфигурации в меню Экран**</i>

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

### Настройки приложения

В окне <b>*Экран/Настройки*</b> можно изменять некоторые свойства навигации, трансляции и другие пользовательские настройки. Например, в данном окне можно настроить время сохранения бэкапов или отключить сохранение бэкапов совсем.

![Окно Настройки приложения](https://docs.owen.ru/book_img/1936/137417.png)

<i>**Окно Настройки приложения**</i>

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

## Редактирование проекта

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

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

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

1. Выбрать пункт меню <b>*Проект/Создать*</b>.

   ![Создание нового проекта через меню Проект-Создать](https://docs.owen.ru/book_img/1936/137416.png)

   *Создание нового проекта через меню Проект/Создать*

2. Перейти в <b>*Окно/Проекты*</b> и нажать кнопку <b>*Создать*</b>.

   ![Создание нового проекта через окно Проекты](https://docs.owen.ru/book_img/1936/137415.png)

   *Создание нового проекта через окно Проекты*

   В открывшемся окне следует выбрать место для сохранения и ввести имя нового проекта. В имени можно использовать только латинские буквы, символ «\_» и цифры. Каждый новый проект рекомендуется размещать в отдельной папке, поскольку внутри нее среда разработки создает временные файлы при трансляции и копии проекта (бэкапы).

   > **Внимание.** Путь к файлам проекта не должен содержать кириллицу и пробелы.

Далее следует выбрать шаблон создаваемого проекта – <b>*Пустой*</b> проект или <b>*Модуль с отладчиком для контроллера*</b>. Рекомендуется всегда создавать проект с отладчиком для контроллера, чтобы не настраивать его подключение вручную.

> [!WARNING]
> **Внимание.** Для создания модуля с отладчиком для контроллера обязательно наличие в среде ссылок на библиотеки <b>*paCore*</b> и <b>*paOpcUA*</b>. Подробнее о добавлении библиотек в среде см. [в разделе](#topic-95980).

![Окно выбора шаблона модуля](https://docs.owen.ru/book_img/1936/137414.png)

<i>**Окно выбора шаблона модуля**</i>

**Отладчик** среды **Полигон** подключается к запущенному проекту как клиент **OPC UA**. При выборе шаблона модуля с отладчиком в новом проекте в месте работы <b>*Фон*</b> автоматически создается программа <b>*Debug*</b>, на странице которой добавлен блок **OPC UA**-сервера (<b>*OpcUAServer*</b>) из библиотеки <b>*paOpcUA*</b>. На входы блока **ip** – IP адрес и **prt** – локальный порт контроллера прописываются соответствующие свойства модуля в виде SQL-запросов.

Запрос IP адреса:

```
"<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
```

Запрос номера порта:

```
<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_debug_port"</sql>
```

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

Реализация протокола **OPC UA** в среде Полигон подробнее описана в документе [Обмен с верхним уровнем. Библиотека paOpcUA](https://owen.ru/product/polygon/documentation).

После выбора шаблона для модуля следует задать пароль для доступа отладчика к запущенному проекту. Если необходимо, пароль можно поменять в свойстве модуля <b>*Пароль admin*</b>. Изменение вступит в силу после трансляции проекта.

![Окно задания пароля для доступа к отладчику](https://docs.owen.ru/book_img/1936/137413.png)

<i>**Окно задания пароля для доступа к отладчику**</i>

После задания пароля среда выведет сообщение об успешном создании проекта и предложит открыть его в окне представления типа <b>*Дерево*</b>.

Ссылку на созданный проект можно увидеть в окне <b>*Проекты*</b>. Для начала работы с созданным проектом необходимо открыть его в представлениях типа <b>*Дерево*</b> и <b>*Страница*</b>.

![Новый проект в представлении Дерево и Страница](https://docs.owen.ru/book_img/1936/137432.png)

<i>**Новый проект в представлении Дерево и Страница**</i>

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

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

Создать компоненты проекта внутри существующих можно в представлении <b>*Дерево*</b>. Структура компонентов проекта описана в [разделе](#topic-95986).

Таким образом, внутри проекта создаются <b>*Модули*</b>. Внутри <b>*Модуля*</b> –<b>*Места работы*</b> и <b>*Разделы*</b>. Внутри <b>*Мест работы*</b> создаются <b>*Программы*</b> и т. д.

Для создания нового компонента в проекте следует:

1. Нажать ПКМ на модуле, месте работы (таймере или фоне), программе и т. д.

2. В контекстном меню выбрать команду <b>*Создать*</b>.

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

   ![Создание компонентов внутри модуля](https://docs.owen.ru/book_img/1936/137431.png)

   <i>**Создание компонентов внутри модуля**</i>

   ![Пример создание разделов внутри модуля](https://docs.owen.ru/book_img/1936/137430.png)

   <i>**Пример создания разделов внутри модуля**</i>

   ![Результат создания разделов внутри модуля](https://docs.owen.ru/book_img/1936/137429.png)

   <i>**Результат создания разделов внутри модуля**</i>

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

#### Создание таймерного потока Ввод-вывод

По умолчанию в проекте добавлено два места работы – <b>*Таймер*</b> и <b>*Фон*</b>. Если необходимо, в проект можно добавить второй таймерный поток – <b>*Ввод-вывод*</b>.

<b>*Ввод-вывод*</b> – таймерный поток, полностью аналогичный месту работы <b>*Таймер*</b>, но с более высоким приоритетом выполнения.

> [!WARNING]
> **Внимание.** Таймерный поток <b>*Ввод-вывод*</b> прерывает поток <b>*Таймер*</b> на время своего выполнения, поэтому время выполнения <b>*Таймера*</b> увеличивается.

Для добавления места работы <b>*Ввод-вывод*</b> следует в контекстном меню модуля нажать <b>*Создать*</b> и выбрать <b>*ввод-вывод*</b>.

![Создание второго таймерного потока в модуле](https://docs.owen.ru/book_img/1936/137428.png)

<i>**Создание второго таймерного потока в модуле**</i>

![Создание потока Ввод-вывод](https://docs.owen.ru/book_img/1936/137427.png)

<i>**Создание потока Ввод-вывод**</i>

![Создание второго таймерного потока](https://docs.owen.ru/book_img/1936/137426.png)

<i>**Создание второго таймерного потока**</i>

Основное свойство <b>*Таймера*</b> и <b>*Ввода-вывода*</b> – <b>*Таймерный промежуток*</b> – время, через которое повторно вызывается программа.

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

![Свойства таймерных потоков](https://docs.owen.ru/book_img/1936/137425.png)

<i>**Свойства таймерных потоков**</i>

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

#### Создание места работы Поток

По умолчанию в проекте добавлено два места работы – <b>*Таймер*</b> и <b>*Фон*</b>. В проект также можно добавить несколько мест работы, которые выполняются в фоновых потоках – <b>*Потоки*</b>.

<b>*Поток*</b> представляет собой бесконечный цикл с возможностью периодического выполнения. <b>*Поток*</b> уходит в простой после каждого цикла. Время простоя по умолчанию равно значению <b>*Таймерного промежутка*</b> места работы <b>*Таймер*</b>. Другое значение можно назначить на входе блока [ThreadMan](#topic-96223) из библиотеки <b>*paCore*</b>, раздел <b>*Системные*</b>.

Для добавления <b>*Потока*</b> следует в контекстном меню модуля нажать <b>*Создать*</b> и выбрать <b>*поток*</b>.

Свойства мест работы <b>*Фон*</b> и <b>*Поток*</b>:

- <b>*Приоритет фонового потока*</b> - число, задающее приоритет потока в системе. Чем выше это значение, тем более приоритетным является поток. Место работы приостанавливает выполнение менее приоритетных потоков, пока наиболее приоритетный поток не завершит свой цикл. Максимальное значение приоритета определяется операционной системой (например, для ОС Linux на ПЛК Овен –47). Актуальное значение максимально возможного приоритета можно посмотреть в отладчике на выходе блока [ThreadMan](#topic-96223) из библиотеки <b>*paCore*</b>, раздел <b>*Системные*</b>;
- <b>*Периодичность работы фонового потока (мс)*</b> – время в мс, задающее периодичность выполнения программ потока (только для места работы <b>*Поток*</b>). Время выполнения потока не контролируется. Если поток не успевает получить управление в соответствии с заданной периодичностью, то выполнение программы не прерывается (в этом отличие от места работы <b>*Таймер*</b> и <b>*Входы*</b>). Если свойство не задано, то поток переходит к следующему циклу сразу после завершения предыдущего (после обязательного простоя);
- <b>*Привязка фонового потока к ядру*</b> – для многоядерных процессоров задает номер ядра (от **0**), к которому системе следует привязать поток. Если свойство не задано, то ядро выбирается системой автоматически.

![Св-ва фоновых потоков](https://docs.owen.ru/book_img/1936/137424.png)

*Свойства фоновых потоков*

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

### Создание функционального блока 

<b>*Функциональные блоки*</b> создаются внутри страниц. Для создания функционального блока есть несколько способов:

1. Открыть нужную страницу в активном окне, нажать ПКМ на свободном месте и выбрать <b>*Создать*</b>.

   ![Создание функционального блока на открытой странице](https://docs.owen.ru/book_img/1936/137423.png)

   <i>**Создание функционального блока на открытой странице**</i>

2. Нажать на пиктограмму <b>*Создать*</b> на панели [Инструменты](#topic-95997) открытой страницы.

   ![Создание функционального блока через панель Инструменты](https://docs.owen.ru/book_img/1936/137452.png)

   <i>**Создание функционального блока через панель Инструменты**</i>

3. Открыть контекстное меню страницы в представлении <b>*Дерево*</b> и нажать <b>*Создать*</b>.

После выбора команды <b>*Создать*</b> откроется окно создания функционального блока.

![Окно создания функционального блока](https://docs.owen.ru/book_img/1936/137451.png)

<i>**Окно создания функционального блока**</i>

Вверху окна в поле <b>*Имя*</b> можно ввести имя нового функционального блока, которое будет отображаться сверху над блоком и в дереве проекта как комментарий. Если оставить данное поле пустым, то имя блока будет задано автоматически по шаблону <b>*b<индекс блока>*</b>.

В поле <b>*Количество*</b> можно указать необходимое количество блоков выбранного типа для создания. По умолчанию создается один блок выбранного типа.

Для создания блока следует:

1. В левом поле окна выбрать библиотеку, функциональный блок из которой планируется создать.
2. В поле посередине появится список разделов выбранной библиотеки, внутри разделов – списки функциональных блоков. Следует выбрать нужный блок.
3. При выделении блока в правой части окна отобразится его справка. Справку на блок, созданный на странице, также можно открыть, нажав на него ПКМ и выбрав <b>*Справка*</b>.
4. После выделения нужного блока нажать <b>*ОК*</b> – новый блок появится на странице.

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

![Результат создания функциональных блоков](https://docs.owen.ru/book_img/1936/137450.png)

<i>**Результат создания функциональных блоков**</i>

Также можно создать ФБ на странице путем перетаскивания его из дерева библиотеки. Для этого следует:

1. Открыть в представлении <b>*Дерево*</b> нужную библиотеку.
2. Выбрать функциональный блок.
3. Перетащить блок на открытую страницу.
4. При отпускании мыши появится контекстное меню, в котором следует выбрать <b>*Создать*</b>.

![Создание функционального блока из дерева библиотеки](https://docs.owen.ru/book_img/1936/137449.png)

<i>**Создание функционального блока из дерева библиотеки**</i>

Некоторые ФБ можно разместить только в таймерном потоке или в фоне (определяется свойством <b>*Может работать только в…*</b>), при попытке разместить такой блок не в указанном месте работы появится окно соответствующей ошибки.

![Ошибка вставки блока](https://docs.owen.ru/book_img/1936/137448.png)

<i>**Ошибка вставки блока**</i>

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

### Создание циклических входов/выходов и групп входов/выходов

Многие блоки в проекте могут иметь разное количество входов и выходов. Такие входы и выходы блока, а также группы входов и выходов, называются циклическими (см. [раздел](#topic-95990)).

Для того, чтобы добавить входы/выходы у блока, необходимо выделить его ПКМ и выбрать команду <b>*Создать*</b>. В появившемся окне следует ввести необходимое <b>*Количество*</b> добавляемых входов/выходов и нажать <b>*ОК*</b>.

![Создание входов-выходов блока](https://docs.owen.ru/book_img/1936/137447.png)

<i>**Создание входов/выходов блока**</i>

![Создание входов-выходов блока (2)](https://docs.owen.ru/book_img/1936/137446.png)

<i>**Создание входов/выходов блока**</i>

![Результат создания входов-выходов блока](https://docs.owen.ru/book_img/1936/137445.png)

<i>**Результат создания входов/выходов блока**</i>

Для удаления лишних входов/выходов можно выделить их с зажатым **Shift** и выполнить: ПКМ – <b>*Удалить*</b>.

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

### Комментарии у входов/выходов блоков

Около входов/выходов ФБ можно оставлять комментарии. Добавить комментарий входу/выходу можно двумя способами:

1. Выделить необходимый вход/выход, зайти через контекстное меню в его <b>*Свойства*</b>, добавить свойство <b>*Комментарии*</b>, ввести необходимый комментарий, нажать <b>*Сохранить*</b>. Комментарий появится около входа.

   ![Добавление комментария входу-выходу](https://docs.owen.ru/book_img/1936/137444.png)

   <i>**Добавление комментария входу/выходу**</i>

   ![Свойство Комментарии](https://docs.owen.ru/book_img/1936/137443.png)

   <i>**Свойство Комментарии**</i>

2. Дважды нажать ЛКМ около интересующего входа/выхода – появится строка ввода комментария, следует ввести комментарий, он отобразится зеленым цветом.

   ![Добавление комментария входу-выходу у блока](https://docs.owen.ru/book_img/1936/137462.png)

   <i>**Добавление комментария входу/выходу у блока**</i>

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

### Проведение связей

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

![Создание связи между ФБ](https://docs.owen.ru/book_img/1936/137461.png)

<i>**Создание связи между ФБ**</i>

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

![Создание связи между ФБ, находящимися на разных страницах](https://docs.owen.ru/book_img/1936/137460.png)

<i>**Создание связи между ФБ, находящимися на разных страницах**</i>

![Ссылки на полях](https://docs.owen.ru/book_img/1936/137459.png)

<i>**Ссылки на полях**</i>

При создании связи учитываются типы данных входа и выхода. Если типы оказываются несовместимы, выдается сообщение об ошибке и связь не проводится. Нельзя создать связь с [Константным входом](#topic-95990).

Цвет связей отображает тип данных входа:

- <b>*черный*</b> – булевое;
- <b>*красный*</b> – целое;
- <b>*синий*</b> – вещественное;
- <b>*серый*</b> – строковое.

Для удаления связи нужно выделить правой кнопкой мыши вход, куда приходит связь. Откроется меню, в котором нужно выбрать <b>*Удалить связь*</b>.

![Удаление связи](https://docs.owen.ru/book_img/1936/137458.png)

<i>**Удаление связи**</i>

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

Связь можно проводить с входа/выхода на странице проекта к выходу/входу в дереве. Для этого следует захватить интересующий вход/выход и, зажав **Ctrl**, перетащить его на выход/вход в дереве, к которому необходимо провести связь. В появившемся меню выбрать <b>*Провести связь*</b>.

Аналогично можно провести связь с входа/выхода в дереве проекта к выходу/входу на странице. Для этого вход/выход из дерева следует захватить мышью и перетащить на выход/вход на странице. В появившемся меню выбрать <b>*Провести связь*</b>.

Из «дерева в дерево» также можно провести связь: захватить нужный вход/выход, перетащить его на выход/вход, к которому необходимо провести связь – выбрать в меню <b>*Провести связь*</b>.

> [!NOTE]
> **Примечание.** При проведении связей следует помнить: если провести связь от выхода к входу – комментарий выхода дублируется на вход. Если проводить связь от входа к выходу – комментарий не дублируется. Подробно о комментариях см. в [разделе](#topic-96025).

Для установления скрытой связи можно использовать <b>*Глобальные константы*</b>. Для выхода, с которого будет идти связь, нужно добавить свойства <b>*Полный алиас*</b> и <b>*Глобальная константа*</b>.

![Создание глобальной константы](https://docs.owen.ru/book_img/1936/137457.png)

<i>**Создание глобальной константы**</i>

На входе, на который должна идти связь, следует щелкнуть ПКМ и выбрать <b>*Задать константу*</b>. В открывшемся списке выбрать нужную константу и нажать <b>*Установить*</b>.

![Установка глобальной константы](https://docs.owen.ru/book_img/1936/137456.png)

<i>**Установка глобальной константы**</i>

![Результат проведения скрытой связи](https://docs.owen.ru/book_img/1936/137455.png)

<i>**Результат проведения скрытой связи**</i>

Вид связи можно менять с помощью контекстного меню, которое вызывается щелчком ПКМ на связи. При установке <b>*Ручное*</b> на связи появляются точки, потянув за которые, можно придать связи любой вид. При установке <b>*Авто*</b> связь приобретает автоматически определяемый вид.

![Контекстное меню связи](https://docs.owen.ru/book_img/1936/137454.png)

<i>**Контекстное меню связи**</i>

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

### Проведение связей между модулями

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

Обмен данными при проведении связей между модулями обеспечивается по протоколу **OPC UA**.

Подробно реализация протокола **OPC UA** в среде Полигон описана в документе [Обмен с верхним уровнем. Библиотека paOpcUA](https://owen.ru/product/polygon/documentation).

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

![Проведение связи между модулями](https://docs.owen.ru/book_img/1936/137453.png)

<i>**Проведение связи между модулями**</i>

В появившемся окне необходимо настроить связь между модулями. В одном из модулей выбирается блок **OPC UA**-сервера, во втором – блок **OPC UA**-клиента. После настройки связи необходимо нажать <b>*Провести связь между модулями*</b>.

![Проведение связи между модулями (2)](https://docs.owen.ru/book_img/1936/137472.png)

<i>**Проведение связи между модулями**</i>

![Результат проведения связи между модулями](https://docs.owen.ru/book_img/1936/137471.png)

<i>**Результат проведения связи между модулями**</i>

В раздел <b>*Данные*</b> выбранного блока **OPC UA**-клиента добавится вход с прописанным свойством <b>*ID*</b> <b>*источника/приемника*</b>, равным индексу входа или выхода в модуле, который был выбран как **OPC UA**-сервер.

![Свойства входа, добавленного в раздел Данные](https://docs.owen.ru/book_img/1936/137470.png)

<i>**Свойства входа, добавленного в раздел Данные**</i>

![Свойства выхода-источника](https://docs.owen.ru/book_img/1936/137469.png)

<i>**Свойства выхода-источника**</i>

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

### Задание порядка выполнения функциональных блоков на странице

Для задания очередности выполнения блоков на странице следует нажать на свободном месте страницы ПКМ и выбрать <b>*Порядки*</b>.

![Порядки](https://docs.owen.ru/book_img/1936/137468.png)

*Порядки*

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

- <b>*Одинаковый порядок*;</b>
- <b>*Порядок по возрастанию*;</b>
- <b>*Порядок по потоку данных*</b>.

![Установка порядков блоков на странице](https://docs.owen.ru/book_img/1936/137467.png)

*Установка порядков блоков на странице*

При выборе пункта <b>*Одинаковый порядок*</b> всем блокам на странице будет присвоен порядок выполнения, указанный в поле справа.

![Одинаковый порядок выполнения](https://docs.owen.ru/book_img/1936/137466.png)

*Одинаковый порядок выполнения*

При выборе пункта <b>*Порядок по возрастанию*</b> блокам будут присвоены порядки от **5**, начиная с верхнего левого угла, кратно **5**. Чем левее и выше находится блок, тем меньший порядок выполнения у него будет. Чем правее и ниже – тем больший порядок выполнения.

![Порядок выполнения по возрастанию](https://docs.owen.ru/book_img/1936/137465.png)

*Порядок выполнения по возрастанию*

При выборе пункта <b>*По потоку данных*</b> очередность блоков будет определена их связями друг с другом на текущей странице – если с выхода блока идет связь на вход другого блока, то первый получит меньший порядок исполнения.

![Порядок выполнения по потоку данных](https://docs.owen.ru/book_img/1936/137464.png)

*Порядок выполнения по потоку данных*

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

### Добавление стрелок, фона и текста на страницы

Для добавления комментариев и заметок на страницы проекта и экраны отладчика предусмотрены элементы <b>*стрелка*</b>, <b>*фон*</b> и <b>*текст*</b>. Добавить их на страницу можно с панели инструментов <b>*Редактирование*</b>.

Для добавления панели следует в меню <b>*Окнв/Панели инструментов*</b> поставить флаг <b>*Редактирование*</b>.

![Добавление панели Редактирование](https://docs.owen.ru/book_img/1936/137463.png)

<i>**Добавление панели Редактирование**</i>

Вверху активной страницы появится панель, на которой можно выбрать элементы для редактирования: <b>*стрелка*</b>, <b>*фон*</b>, <b>*текст*</b>. В свойствах созданных элементов можно менять их координаты, задавать размеры и цвет.

![Отображение элементов панели редактирования на странице](https://docs.owen.ru/book_img/1936/137482.png)

<i>**Отображение элементов панели редактирования на странице**</i>

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

### Добавление входов и выходов в разделы

В компонент проекта <b>*Раздел*</b> можно добавлять входы/выходы со страниц программ для отображения на экране отладчика, для вывода на график, для передачи сигналов **OPC UA**-клиенту и др.

Для добавления входа или выхода в раздел следует выделить нужный вход или выход и, зажав клавишу **Ctrl** и левую кнопку мыши, перетащить его на нужный раздел в дереве проекта и выбрать <b>*Добавить*</b> в контекстном меню.

Можно добавить сразу несколько входов/выходов одного блока в раздел. Для этого следует выделять их с зажатой клавишей **Shift**.

![Добавление входа-выхода в раздел](https://docs.owen.ru/book_img/1936/137481.png)

<i>**Добавление входа/выхода в раздел**</i>

После добавления в раздел вход или выход блока окрасится в желтый цвет. Если нажать на него ПКМ и выбрать в меню <b>*Принадлежит*</b>, то в списке отображается функциональный блок и разделы, к которым принадлежит этот вход или выход.

![Добавление входавыхода в раздел](https://docs.owen.ru/book_img/1936/137480.png)

<i>**Добавление входа/выхода в раздел**</i>

![Окно Принадлежит](https://docs.owen.ru/book_img/1936/137479.png)

<i>**Окно Принадлежит**</i>

При двойном щелчке ЛКМ по строке списка откроется расположение входа или выхода в дереве.

![Отображение входа-выхода в дереве](https://docs.owen.ru/book_img/1936/137478.png)

<i>**Отображение входа/выхода в дереве**</i>

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

### Навигация по проекту

Для навигации по проекту можно воспользоваться панелью <b>*Навигация*</b>, которая добавляется установкой флага <b>*Навигация*</b> в меню <b>*Окна/Панели инструментов*</b>.

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

При нажатии на кнопку <b>*Списки выбора*</b> на панели отображается поле, в выпадающем меню которого можно выбрать соответствующее окно представления для активной страницы.

![Навигация по проекту](https://docs.owen.ru/book_img/1936/137477.png)

<i>**Навигация по проекту**</i>

С помощью кнопок <b>*Назад*</b> и <b>*Вперед*</b> можно перемещаться между ранее открытыми страницами. Кнопки <b>*Предыдущая страница*</b> и <b>*Следующая страница*</b> производят переключение в той последовательности, как страницы расположены в проекте (сверху-вниз).

![Кнопки Назад и Вперед](https://docs.owen.ru/book_img/1936/137476.png)

<i>**Кнопки Назад и Вперед**</i>

Еще можно перемещаться по полям страниц – если щелкнуть ЛКМ на адрес связи, то в активное окно отобразится соответствующая страница.

![Перемещение по адресам связи](https://docs.owen.ru/book_img/1936/137475.png)

<i>**Перемещение по адресам связи**</i>

Для того, чтобы открыть нужную страницу в активном окне, нужно либо два раза нажать ЛКМ на страницу в дереве, либо перетащить страницу из дерева в это окно и нажать <b>*Показать*</b>.

![Открытие страницы из дерева](https://docs.owen.ru/book_img/1936/137474.png)

<i>**Открытие страницы из дерева**</i>

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

### Копирование частей проекта

Для копирования части проекта следует выделить нужную часть при помощи мыши (для выделения нескольких частей – зажав **Shift**) и нажать <b>*Копировать*</b> на панели инструментов. Также можно воспользоваться комбинацией **Ctrl + c**.

![Копирование частей проекта](https://docs.owen.ru/book_img/1936/137473.png)

<i>**Копирование частей проекта**</i>

Далее перейти в нужное место проекта и нажать на панели инструментов <b>*Вставить*</b>. Также выполнить вставку можно через контекстное меню, которое открывается при нажатии ПКМ на компоненте дерева, или сочетанием клавиш **Ctrl + v**.

![Вставка скопированных разделов](https://docs.owen.ru/book_img/1936/137502.png)

<i>**Вставка скопированных разделов**</i>

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

Также копировать части проекта можно перетаскиванием. Для этого нужно «схватить» мышью требуемую часть проекта и перетащить в новое место. В открывшемся меню выбрать команду <b>*Копировать*</b> (если выбрать <b>*Перенести*</b>, то часть проекта удалится из начального места).

![Копирование части проекта перетаскиванием](https://docs.owen.ru/book_img/1936/137501.png)

<i>**Копирование части проекта перетаскиванием**</i>

Копировать компоненты возможно не только внутри одного проекта, но и в разных.

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

1. Имя вида <b>*b<индекс блока>*</b> присваивается при создании блоков, для которых не задано пользовательское имя. При копировании в имени нового блока отобразится его индекс.

   ![Копирование блока b76. Имя нового блока b253 определяется по индексу](https://docs.owen.ru/book_img/1936/137500.png)

   *Копирование блока b76. Имя нового блока b253 определяется по индексу*

2. Кастомные имена могут быть заданы пользователем или сформированы при [генерации блоков из MS Excel](#topic-96057). Переименование таких блоков зависит от наличия порядкового номера в имени.

Если имя без цифр в конце, то добавится суффикс **«\_»** и номер вида <b>*01*</b> (дополнение до двух цифр).

![Копирование блока custom name](https://docs.owen.ru/book_img/1936/137499.png)

<i>**Копирование блока** custom<b>\_</b>name</i>

Если в имени есть номер в конце, то при копировании блока номер меняется, определяя формат по количеству «лишних» нулей в начале числа. Для генерации порядкового номера производится поиск всех нумерованных имен, которые начинаются так же, как исходное, и добавляется номер на **1** больше максимального из них. Если при копировании необходимо сохранять номер в имени, то рекомендуется обеспечить окончание имени нечисловым символом, например, знаком **«\_»**.

![Копирование блока custom name (2)](https://docs.owen.ru/book_img/1936/137498.png)

<i>**Копирование блока** custom<b>\_</b>name**09**</i>

Автоматическое изменение имен блоков при копировании можно отключить в окне <b>*Настройки приложения*</b> во вкладке <b>*Копирование*</b>.

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

### Перенос блоков, страниц, программ

Для переноса блоков, страниц или программ нужно «схватить» их мышью и перетащить в требуемое место. При отпускании выбрать <b>*Перенести*</b>.

![Перенос частей проекта](https://docs.owen.ru/book_img/1936/137497.png)

<i>**Перенос частей проекта**</i>

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

Перенос компонентов возможен только в рамках одного проекта. Для переноса блоков, страниц и программ из одного проекта в другой можно использовать команды <b>*Копировать*</b> и <b>*Удалить*</b>.

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

## Трансляция

Завершающим этапом создания проекта является <b>*Трансляция*</b> созданного алгоритма в исполняемый файл.

Трансляция проводится в два этапа. Графическое представление проекта преобразуется в исходные тексты программы на **C++**. Эти файлы с расширениями **.срр** и **.hpp**, хранятся в каталоге проекта в папке с именем <b>*build_имя модуля_ОС*</b>. Они создаются заново каждый раз при трансляции и их редактирование не имеет смысла.

На каждую программу проекта создается несколько файлов:

- <b>*\[имя программы\].cpp*</b> – содержит вызовы алгоритмов функциональных блоков в соответствии с порядком выполнения;
- <b>*i\_\[индекс программы\].cpp*</b> – содержит вызовы инициализации функциональных блоков в соответствии с порядком выполнения;
- <b>*n\_\[индекс программы\].cpp*</b> и <b>*e\_\[индекс программы\].cpp*</b> – содержат описания функциональных блоков.

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

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

Имя исполняемого файла для операционной системы Linux – <b>*имя модуля.o*</b>, для Windows – <b>*имя модуля.*</b><b>*exe*</b>.

**Свойства модуля, используемые при трансляции**

| Свойство | Описание |
| --- | --- |
| <b>*IP адрес*</b> | IP-адрес контроллера |
| <b>*ОС*</b> | Тип операционной системы для трансляции |
| <b>*Тип процессорной платы*</b> | Тип процессорной платы контроллера |
| <b>*Watchdog*</b> | Включить/выключить сторожевой таймер (флаг). Отладку удобнее производить при выключенном сторожевом таймере, при эксплуатации его необходимо включить |
| <b>*Автозапуск*</b> | Включить/выключить автоматический запуск проекта на исполнение (флаг). При включении на контроллер загружается файл <b>*autostart*</b> |
| <b>*Порт отладчика*</b> | Порт **OPC UA**-сервера в программе, если отличается от стандартного **4840** (вход **prt** блока <b>*OpcUAServer*</b>) |

Для того, чтобы выполнить трансляцию в **Полигон**, можно использовать одну из команд контекстного меню (открывается нажатием ПКМ на модуле):

- <b>*Транслировать все*</b> – трансляция всего модуля;
- <b>*Перестроить*</b> – компиляция проекта без изменения исходных текстов. Данную команду следует применять при трансляции неизмененного проекта с новыми библиотеками.

При возникновении сомнений рекомендуется использовать команду <b>*Транслировать все*</b>. Для трансляции проекта также можно использовать соответствующую кнопку на панели [Инструменты](#topic-95997).

Если ранее проект транслировался в данную папку, возникнет окно подтверждения трансляции, следует выбрать – <b>*Да*</b>.

![Трансляция](https://docs.owen.ru/book_img/1936/137496.png)

<i>**Трансляция**</i>

![Подтверждение трансляции](https://docs.owen.ru/book_img/1936/137495.png)

<i>**Подтверждение трансляции**</i>

При трансляции в окне <b>*Прогресс*</b> (меню <b>*Окна/Прогресс*</b>) отображается ход выполнения, при наличии ошибок они указываются с описанием.

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

![Системное окно Прогресс нов](https://docs.owen.ru/book_img/1936/140139.png)

<i>**Окно прогресс: сообщение об успешной трансляции**</i>

Примеры задания свойств модуля для трансляции под ПЛК210 и виртуальный контроллер приведены в [разделе](#topic-96035).

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

## Загрузка и запуск проекта

После трансляции проекта его следует загрузить на контроллер.

Для контроллеров ОВЕН загрузку и запуск проекта можно провести следующими способами:

- через <b>*Панель отладки*</b>;

- через web-интерфейс конфигурации во вкладке <b>*ПЛК/Приложение*</b>;

  через системное окно <b>*Контроллер*</b>.

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

### Свойства модуля для загрузки проекта в ПЛК210

Проект в ПЛК210 загружается через протокол **SSH**.

<a id="t1"></a>

**Свойства модуля, используемые при трансляции под ПЛК210**

| Свойство | Описание | Значение |
| --- | --- | --- |
| <b>*IP-адрес*</b> | IP-адрес контроллера | К контроллеру можно подключаться из среды через интерфейсы:<br>·    **USB** **Device** – IP-адрес **172.16.0.1**<br>·    **Ethe****rnet** – IP-адрес по умолчанию **192.168.0.10** (порты Eth 1…3) |
| <b>*Подключаться через*</b> | Протокол для подключения к контроллеру | **SSH** |
| <b>*SSH: логин*</b> | Логин для подключения к контроллеру | **root** |
| <b>*SSH: пароль*</b> | Пароль для подключения к контроллеру | По умолчанию **owen** |
| <b>*ОС*</b> | Тип операционной системы для трансляции | **Linux Овен прошивка 3.х** |
| <b>*Тип процессорной платы*</b> | Тип процессорной платы контроллера | **Овен ПЛК210** |
| <b>*Watchdog*</b> | Включить/выключить сторожевой таймер (флаг) | На время отладки рекомендуется отключать |
| <b>*Автозапуск*</b> | Включить/выключить автоматический запуск проекта на исполнение при включении контроллера (флаг). При установке флага на контроллер загружается файл <b>*autostart*</b> | - |
| <b>*Порт отладчика*</b> | Порт **OPC UA**-сервера для доступа отладчика Полигон | По умолчанию **4840** |

Недостающие в окне свойства можно добавить из выпадающего списка снизу. Работа с окном <b>*Свойства*</b> подробно описана в [разделе](#topic-96015).

При трансляции проекта под ПЛК210 файлы трансляции записываются в папку <b>*build_имя модуля\_*</b><b>*LinuxOwen*</b><b>*3*</b>. Исполняемый файл программы для контроллера – <b>*имя модуля.*</b><b>*o*</b>.

![Свойства модуля для трансляции и загрузки проекта в ПЛК210](https://docs.owen.ru/book_img/1936/137493.png)

<i>**Свойства модуля для трансляции и загрузки проекта в ПЛК210**</i>

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

### Панель отладки

Для трансляции, загрузки и запуска проекта на контроллере в среде **Полигон** предназначена <b>*Панель отладки*</b>. Панель отладки добавляется через меню <b>*Окна/Панели инструментов*</b> – <b>*Панель отладки*</b>.

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

<i>**Панель отладки**</i>

**Элементы панели отладки**

| Элемент | Пиктограмма | Функция |
| --- | --- | --- |
| <b>*Модуль*</b> | ![Пикг Модуль](https://docs.owen.ru/book_img/1936/137511.png) | Выбор модуля для запуска |
| <b>*Индикатор статуса*</b> | ![Пикг Инд Стат](https://docs.owen.ru/book_img/1936/137510.png) | Отображает статус запущенного проекта |
| <b>*Перезапустить во временной сессии*</b> | ![Пикг Перезап Вр](https://docs.owen.ru/book_img/1936/137509.png) | Трансляция модуля, загрузка исполняемого файла на контроллер и запуск на «переднем плане»<br>**Внимание.** При закрытии среды разработки выполнение программы на контроллере будет остановлено |
| <b>*Перезапустить для постоянной работы*</b> | ![Пикг Перезап Пост](https://docs.owen.ru/book_img/1936/137508.png) | Трансляция модуля, загрузка исполняемого файла на контроллер и запуск со свойством <b>*Автозапуск*</b><br>**Внимание.** Для запуска программы со свойством <b>*Автозапуск*</b> контроллер будет перезагружен |
| <b>*Запустить на виртуальном контроллере*</b> | ![Пикг Запна Вирт К](https://docs.owen.ru/book_img/1936/137507.png) | Трансляция модуля и запуск локально на ПК. Отладчик подключается к запущенному модулю, независимо от того, какие выбраны <b>*IP адрес*</b> и <b>*OC*</b> для трансляции. Подробнее см. в [разделе](#topic-96040) |

Для запуска проекта на контроллере через панель отладки следует:

1. Задать свойства модуля в соответствии с [таблицей](#t1).

2. В выпадающем списке на панели отладки выбрать <b>*Модуль*</b> (среди модулей проектов, открытых в данный момент в среде разработки).

3. Выполнить запуск модуля одним из способов:

   - <b>*Перезапустить во временной сессии*</b> – будет произведена трансляция модуля, загрузка исполняемого файла на контроллер, запуск его и подключение к нему отладчиком.

     > **Внимание.** При запуске программы во временной сессии ее выполнение на контроллере будет прекращено при закрытии среды разработки.

   - <b>*Перезапустить для постоянной работы*</b> – будет произведена трансляция модуля со свойством <b>*Автозапуск*</b>, загрузка исполняемого файла на контроллер, перезагрузка контроллера и последующее подключение отладчика к запущенной программе.

     > **Внимание.** При загрузке нового проекта на контроллер перезапишется проект только с таким же названием. Ненужные файлы проектов можно удалить через web-конфигуратор контроллера (вкладка <b>*ПЛК/Приложение*</b> – <b>*Удаление…*</b>), через любой файловый менеджер или через консоль.

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

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

![Предупреждение о запущенной программе](https://docs.owen.ru/book_img/1936/137506.png)

<i>**Предупреждение о запущенной программе**</i>

Информацию о запущенной программе на контроллере можно посмотреть в web-конфигураторе в разделе <b>*ПЛК/Информация*</b>.

> [!WARNING]
> **Внимание.** Для обновления информации в разделе <b>*ПЛК/Информация*</b> в запущенном проекте должен быть добавлен блок <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

![Информация о запущенном проекте в web-конфигураторе](https://docs.owen.ru/book_img/1936/137505.png)

<i>**Информация о запущенном проекте в web-конфигураторе**</i>

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

### Запуск проекта через web-интерфейс конфигурации

Инструменты для загрузки и запуска программы на контроллере через web-интерфейс конфигурации находятся во вкладке <b>*ПЛК/Приложение*</b>. Для запуска программы следует:

1. Задать свойства модуля в соответствии с [таблицей](#t1) и транслировать модуль – в папке <b>*build_имя модуля\_*</b><b>*LinuxOwen*</b><b>*3*</b> на диске появится исполняемый файл программы для контроллера – <b>*имя модуля.*</b><b>*o*</b>.

2. Зайти в web-конфигуратор контроллера и перейти во вкладку <b>*ПЛК/Приложение*</b>.

3. Нажать <b>*Загрузка приложения…*</b> и выбрать файл <b>*имя модуля.*</b><b>*o*</b>.

   > **Внимание.** При загрузке нового проекта на контроллер перезапишется проект только с таким же названием. Ненужные файлы проектов можно удалить через web-конфигуратор контроллера (вкладка <b>*ПЛК/Приложение*</b> – <b>*Удаление…*</b>), через любой файловый менеджер или через консоль.

4. Нажать кнопку <b>*Запуск…*</b> напротив <b>*имя модуля.*</b><b>*o*</b>.

   > **Внимание.** Для автоматического запуска приложения при перезагрузке контроллера следует установить для него <b>*Автозапуск*</b> (кнопка <b>*Установить Автозапуск…*</b>). Для корректного останова приложения из web-конфигуратора следует снять для него <b>*Автозапуск*</b>.

   ![Вкладка ПЛК-Приложение](https://docs.owen.ru/book_img/1936/137504.png)

   <i>**Вкладка ПЛК/Приложение**</i>

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

> [!WARNING]
> **Внимание.** Для корректной остановки программы через web-конфигуратор следует снять <b>*Автозапуск*.</b>

Информацию о запущенной программе на контроллере можно посмотреть в web-конфигураторе в разделе <b>*ПЛК/Информация*</b>.

> [!WARNING]
> **Внимание.** Для обновления информации в разделе <b>*ПЛК/Информация*</b> в запущенном проекте должен быть добавлен блок <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

![Информация о запущенном проекте в web-конфигураторе](https://docs.owen.ru/book_img/1936/137505.png)

<i>**Информация о запущенном проекте в web-конфигураторе**</i>

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

### Запуск проекта через окно Контроллер

Для загрузки и запуска проекта на контроллере через системное окно <b>*Контроллер*</b> следует:

1. Задать свойства модуля в соответствии с [таблицей](#t1) и транслировать модуль.

2. Открыть окно <b>*Контроллер*</b> через меню <b>*Окна/Контроллер*</b>.

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

4. Кнопкой <b>*Соединить*</b> выполнить подключение к контроллеру по **SSH**.

   ![Успешное подключение к контроллеру](https://docs.owen.ru/book_img/1936/137503.png)

   <i>**Успешное подключение к контроллеру**</i>

5. Кнопкой <b>*Загрузить*</b> выполнить загрузку проекта в контроллер.

   > **Внимание.** При загрузке нового проекта на контроллер перезапишется проект только с таким же названием. Ненужные файлы проектов можно удалить через web-конфигуратор контроллера (вкладка <b>*ПЛК/Приложение*</b> – <b>*Удаление…*</b>), через любой файловый менеджер или через консоль.

6. Кнопкой <b>*Запустить модуль*</b> выполнить запуск загруженного проекта.

7. Подключится к запущенному проекту отладчиком среды через панель [Инструменты](#topic-95997).

После запуска программы станет активной кнопка остановки программы – <b>*Остановить модуль*</b>.

![Успешный запуск проекта на контроллере](https://docs.owen.ru/book_img/1936/137522.png)

<i>**Успешный запуск проекта на контроллере**</i>

> [!WARNING]
> **Внимание.** Через окно <b>*Контроллер*</b> проект запускается в **foreground**, поэтому при закрытии сессии проект на контроллере перестанет выполняться. Для старта проекта в **background** следует установить <b>*Автозапуск*</b>, повторно транслировать модуль, загрузить в ПЛК, выполнить перезагрузку ПЛК по питанию или команду <b>*reboot*</b> из терминала. Проект запустится автоматически после загрузки ПЛК. Аналогично можно запустить проект для постоянной работы через [Панель отладки](#topic-96037) или [web-конфигуратор ПЛК](#topic-96038).

Информацию о запущенной программе на контроллере можно посмотреть в web-конфигураторе в разделе <b>*ПЛК/Информация*</b>.

> [!WARNING]
> **Внимание.** Для обновления информации в разделе <b>*ПЛК/Информация*</b> в запущенном проекте должен быть добавлен блок <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

![Информация о запущенном проекте в web-конфигураторе](https://docs.owen.ru/book_img/1936/137505.png)

<i>**Информация о запущенном проекте в web-конфигураторе**</i>

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

### Запуск проекта на виртуальном контроллере

Запустить проект на виртуальном контроллере можно с помощью <b>*Панели отладки*</b> (см. [раздел](#topic-96037)). Для этого следует:

1. Добавить панель отладки через меню <b>*Окна/Панели инструментов – Панель отладки*</b>.
2. В выпадающем списке на панели отладки выбрать <b>*Модуль*</b> (среди модулей проектов, открытых в данный момент в среде разработки).
3. Выполнить запуск модуля на виртуальном контроллере кнопкой <b>*Запустить на виртуальном контроллере*</b> – в новом окне запустится приложение виртуального контроллера, к нему подключится отладчик среды.

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

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

1. Установить свойства модуля в соответствии с таблицей:

   **Свойства модуля, используемые при трансляции на ПК**

   | Свойство | Описание | Значение для ОС Windows | Значение для ОС Windows | Значение для ОС Linux |
   | --- | --- | --- | --- | --- |
   | <b>*IP-адрес*</b> | Локальный IP-адрес | **127.0.0.1** | **127.0.0.1** | **127.0.0.1** |
   | <b>*Подключаться через*</b> | Протокол для подключения к контроллеру | Не используется | Не используется | **SSH** |
   | <b>*ОС*</b> | Тип операционной системы для трансляции | Windows | Windows | Astra Linux SE1.7 |
   | <b>*Тип процессорной платы*</b> | Тип процессорной платы | ПК | ПК | ПК |
   | <b>*Порт отладчика*</b> | Порт **OPC UA**-сервера для доступа отладчика Полигон | По умолчанию **4840** | По умолчанию **4840** | По умолчанию **4850** |
   | <b>*Запускать с ключами*</b> | Используется для игнорирования блоков из библиотеки <b>*paOwenIO*</b> | **-I** | **-I** | **-I** |

2. Недостающие свойства можно добавить из выпадающего списка добавления новых свойств внизу окна. Работа с окном <b>*Свойства*</b> подробно описана в [разделе](#topic-96015).

   ![Свойства модуля для трансляции под ОС Windows](https://docs.owen.ru/book_img/1936/137521.png)

   <i>**Свойства модуля для трансляции под ОС** Windows</i>

   ![Свойства модуля для трансляции под ОС Linux](https://docs.owen.ru/book_img/1936/137520.png)

   <i>**Свойства модуля для трансляции под ОС** Linux</i>

3. Транслировать модуль:

   - для ПК с ОС Windows – запустить исполняемый файл <b>*имя*</b> **<i></i>**<b>*модуля*</b><b>*.exe*</b> из папки <b>*build\_*</b><b>*имя*</b> **<i></i>**<b>*модуля*</b><b>*\_WINmingw*</b>;
   - для ПК с ОС Linux – запустить исполняемый файл <b>*имя*</b> <b>*модуля*</b><b>*.o*</b> <b>*из*</b> <b>*папки*</b> <b>*build\_*</b><b>*имя*</b> **<i></i>**<b>*модуля*</b><b>*\_LinuxAstra17*</b>.

4. Подключиться к запущенному приложению отладчиком среды через панель [Инструменты](#topic-95997).

> [!WARNING]
> **Внимание.** Ограничение на работу виртуального контроллера составляет **1 час**. Виртуальный контроллер работает неограниченное время, если у пользователя есть USB-ключ. По вопросу приобретения USB-ключа обращаться на почту polygon@pa.ru.

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

## Отладка проекта

Для отладки программы в **Полигон** существует возможность просмотра текущих значений на входах/выходах функциональных блоков. Для этого необходимо запустить программу на контроллере и выбрать команду <b>*Отладчик*</b> на панели [Инструменты](#topic-95997).

![Отладчик](https://docs.owen.ru/book_img/1936/137519.png)

<i>**Отладчик**</i>

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

![Окно ввода пароля для доступа к отладчику](https://docs.owen.ru/book_img/1936/137518.png)

<i>**Окно ввода пароля для доступа к отладчику**</i>

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

Обмен данными осуществляется по протоколу **OPC UA**, поэтому в проекте обязательно должен быть блок <b>*OpcUAServer*</b> из библиотеки <b>*paOpcUA*</b>. На входе блока ip следует прописать IP-адрес интерфейса контроллера, по которому будет подключаться отладчик.

При выборе шаблона модуля с отладчиком при создании нового проекта в месте работы <b>*Фон*</b> автоматически создается программа <b>*Debug*</b>, на странице которой добавлен блок **OPC UA**-сервера. На входы блока **ip** – IP адрес и **prt** – локальный порт контроллера прописываются соответствующие свойства модуля в виде SQL-запросов.

Запрос IP-адреса:

```
"<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_ip"</sql>"
```

Запрос номера порта:

```
<sql>SELECT value FROM blocks_prop WHERE indx=:module AND type="prop_debug_port"</sql>
```

Подробнее реализация протокола **OPC** **UA** в среде **Полигон** описана в документе [Обмен с верхним уровнем. paOpcUA](https://owen.ru/product/polygon/documentation).

Остановить выполнение проекта на контроллере можно через <b>*Панель отладки*</b> или, если проект запускался через окно <b>*Контроллер*</b>, кнопкой <b>*Остановить*</b> <b>*модуль*</b>. Также выполнение проекта можно остановить через контекстное меню модуля в дереве проекта, нажав <b>*Остановить*</b>.

![Остановка выполнения проекта](https://docs.owen.ru/book_img/1936/137517.png)

<i>**Остановка выполнения проекта**</i>

Для отключения отладчика без остановки программы необходимо повторно нажать на кнопку <b>*Отладчик*</b> на панели [Инструменты](#topic-95997).

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

### Подмена значений на входах/выходах

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

![ФБ в режиме отладки](https://docs.owen.ru/book_img/1936/137516.png)

<i>**ФБ в режиме отладки**</i>

Текущие значения на входах блоков можно подменить. Для этого необходимо дважды нажать ЛКМ на текущем значении входа и задать новое значение. Подмененные значения отображаются красным цветом.

![Подмена значения в режиме отладки](https://docs.owen.ru/book_img/1936/137515.png)

<i>**Подмена значения в режиме отладки**</i>

Заданная константа действует только в течение данного запуска программы. Чтобы вернуть значение на входе к заданному в программе, надо выбрать команду <b>*Сбросить*</b> в контекстном меню входа.

![Сброс подмененного значения](https://docs.owen.ru/book_img/1936/137514.png)

<i>**Сброс подмененного значения**</i>

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

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

1. Подмена выключает блок. По умолчанию при двойном нажатии на текущем значении, срабатывает этот вариант.

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

   ![Подмена выхода с выключением блока](https://docs.owen.ru/book_img/1936/137513.png)

   <i>**Подмена выхода с выключением блока**</i>

Для подмены значения выхода без выключения блока следует:

1. Нажать на выходе ПКМ.
2. Выбрать <b>*Установить значение*</b>.
3. Выбрать <b>*не выключать блок*</b> и установить значение на выходе – введенное значение установится на всех входах, связанных с данным выходом. Выход продолжит меняться в соответствии с алгоритмом блока и подсветится оранжевым цветом.

![Установка значения выхода](https://docs.owen.ru/book_img/1936/137542.png)

<i>**Установка значения выхода**</i>

![Подмена выхода без выключения блока](https://docs.owen.ru/book_img/1936/137541.png)

<i>**Подмена выхода без выключения блока**</i>

Для сброса значения нужно нажать на выходе ПКМ и выбрать <b>*Сбросить*</b>.

Во время отладки можно получить список всех подмененных значений командой <b>*Показать все*</b>, а также отменить все подмены командой <b>*Сбросить все*</b>. Эти команды появляются при щелчке правой кнопкой мыши в дереве проекта на узле модуля.

![Получение списка и сброс подмененных значений](https://docs.owen.ru/book_img/1936/137540.png)

<i>**Получение списка и сброс подмененных значений**</i>

При нажатии <b>*Показать все*</b> отображается таблица подмененных значений, о работе с представлением **Таблица** подробнее см. в [разделе](#topic-96003).

![Таблица подмененных (зафорсированных) значений](https://docs.owen.ru/book_img/1936/137539.png)

<i>**Таблица подмененных (зафорсированных) значений**</i>

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

### График

<b>*График*</b> позволяет просматривать изменения значений на входах и выходах функциональных блоков в графическом представлении в режиме отладки.

Для добавления входа или выхода в таблицу над графиком нужно перетащить его со страницы (соответствующий <b>*Модуль*</b> автоматически станет текущим для графика). Входы/выходы текущего <b>*Модуля*</b> из дерева можно добавлять в таблицу с помощью перетаскивания.

Если текущим будет <b>*Раздел*</b>, то в таблицу автоматически добавятся входы/выходы из раздела. Если добавить новый вход или выход в таблицу, он автоматически добавится в <b>*Раздел*</b>.

Подробнее об элементах графика см. в [разделе](#topic-96043).

Для просмотра значений входов/выходов нужно загрузить исполняемый файл на контроллер и нажать кнопку <b>*Запустить*</b>. Для остановки – <b>*Остановить*</b>.

График подключается к **OPC UA**-серверу контроллера в качестве клиента (аналогично отладчику) с добавленными в него данными.

> [!NOTE]
> **Примечание.** Для корректной работы графика необходимо синхронизировать системное время контроллера с браузером через web-конфигуратор (<b>*Система/Время/Системное время*</b> – <b>*Синхронизировать с браузером*</b>).

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

### Экран отладчика

В режиме отладки текущие значения можно просматривать и изменять на <b>*Экране отладчика*</b>.

Входы/выходы, которые нужно отобразить на экране, необходимо добавить в соответствующий <b>*Раздел*</b>. Их также можно перетащить на экран из дерева или страницы, тогда они автоматически добавятся в текущий раздел. Входу или выходу автоматически присваивается класс отображения следующим образом:

- если это логический вход – <b>*кнопка*</b>, иначе – <b>*слайдер*</b>;
- если это логический выход – <b>*лампа*</b>, иначе – <b>*значение*</b>.

Класс отображения можно поменять в окне свойств.

Подробнее о работе с экраном отладчика и свойствах элементов см. в [разделе](#topic-96041).

В режиме работы отладчика для того, чтобы изменить значения на входе, нужно дважды щелкнуть ЛКМ на соответствующем элементе и отредактировать значение. Это работает для графических элементов <b>*значение*</b>, <b>*слайдер*</b> и <b>*шкала*</b>.

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

### Информация о запущенном проекте

В режиме отладки можно получить различную информацию о запущенной программе.

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

![Тултип с информацией о модуле](https://docs.owen.ru/book_img/1936/137285.png)

<i>**Тултип с информацией о модуле**</i>

Информацию о запущенном приложении на контроллере также можно посмотреть в web-конфигураторе в разделе <b>*ПЛК/Информация*</b>.

> [!WARNING]
> **Внимание.** Для обновления информации в разделе <b>*ПЛК/Информация*</b> в запущенном проекте должен быть добавлен блок <b>*OwenHWInfo*</b> из библиотеки <b>*paOwenIO*</b>.

![Информация о запущенном проекте в web-конфигураторе](https://docs.owen.ru/book_img/1936/137505.png)

<i>**Информация о запущенном проекте в web-конфигураторе**</i>

При нажатии правой кнопкой мышки на запущенном модуле в дереве и выборе в открывшемся меню <b>*Показать все*</b> в окне трансляции (системное окно <b>*Прогресс*</b>) можно увидеть данные по версиям библиотек.

![Показать все](https://docs.owen.ru/book_img/1936/137301.png)

<i>**Показать все**</i>

![Информация о версиях библиотек](https://docs.owen.ru/book_img/1936/137300.png)

*<b>**Информация о версиях библиотек**</b>*

Также при трансляции в папке <b>*build_имя модуля_ОС*</b> создается файл <b>*version*</b><b>*s*</b><b>*.txt*</b>, в котором показаны идентификатор проекта, название модуля, дата и время трансляции, версии библиотек.

![Файл versions.txt](https://docs.owen.ru/book_img/1936/137538.png)

*Файл versions.txt*

Если добавить в свойства модуля свойство <b>*Показывать время выполнения*</b>, то можно отслеживать время выполнения мест работы и программ модуля. После трансляции и запуска проекта в дереве будут отображаться времена выполнения программ модуля.

![Отображение времен выполнения программ модуля](https://docs.owen.ru/book_img/1936/137537.png)

<i>**Отображение времен выполнения программ модуля**</i>

Получить время выполнения мест работы в программе также можно с помощью ФБ [SysInfo](#topic-96210).

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

## Возможности пользовательской конфигурации 

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

### Создание составного блока

Часть алгоритма, повторяющаяся в проекте несколько раз, может быть выделена в новый <b>*Составной функциональный блок*</b>. Обычно это упрощает отладку и модификацию этой части алгоритма, а также уменьшает время трансляции проекта. Составной блок при трансляции превращается в класс. Составные блоки можно создавать как в пользовательских проектах, так и в пользовательских библиотеках.

О защите пользовательского составного блока подробнее можно прочитать в [разделе](#topic-96061).

Для того, чтобы создать составной функциональный блок в **проекте**, следует создать <b>*Группу типов*</b> в узле <b>*Библиотеки*</b> в дереве проекта.

> [!WARNING]
> **Внимание.** Имя <b>*Группы типов*</b> должно содержать только латинские буквы, цифры и **«\_»**. Если оставить поле ввода имени пустым, то оно будет назначено автоматически по шаблону <b>*b<индекс>*</b>.

![Узел Библиотеки в дереве проекта](https://docs.owen.ru/book_img/1936/137536.png)

<i>**Узел Библиотеки в дереве проекта**</i>

![Создание Группы типов в проекте](https://docs.owen.ru/book_img/1936/137535.png)

<i>**Создание Группы типов в проекте**</i>

Для того чтобы создать функциональный блок **в пользовательской библиотеке** следует открыть необходимую библиотеку в представлении <b>*Дерево*</b> и создать в ней <b>*Группу типов*</b> с любым именем.

О создании пользовательской библиотеки подробнее можно прочитать в [разделе](#topic-96054).

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

<i>**Библиотека в представлении Дерево**</i>

![Создание Группы типов в библиотеке](https://docs.owen.ru/book_img/1936/137533.png)

<i>**Создание Группы типов в библиотеке**</i>

Теперь в новой группе типов следует создать <b>*Тип*</b>. При создании типа указывается <b>*Имя типа*</b> – имя класса, который будет создан при трансляции.

> [!WARNING]
> **Внимание.** <b>*Имя типа*</b> должно быть уникально в проекте и может содержать только латинские буквы, цифры и **«\_»**. Если оставить поле ввода имени пустым, то оно будет назначено автоматически по шаблону <b>*b<индекс>*</b>.

![Группа типов в дереве проекта](https://docs.owen.ru/book_img/1936/137552.png)

<i>**Группа типов в дереве проекта**</i>

![Создание Типа](https://docs.owen.ru/book_img/1936/137551.png)

<i>**Создание Типа**</i>

На данном этапе был создан класс (<b>*Тип*</b>) нового функционального блока. Теперь можно реализовать алгоритм, который будет выполняться экземплярами класса функционального блока в проекте.

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

#### Создание составного блока из функциональных блоков

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

1. Создать [Тип](#topic-96047).

2. Создать <b>*Страницу*</b> в <b>*Типе*</b>.

   ![Тип в дереве проекта](https://docs.owen.ru/book_img/1936/137550.png)

   *Тип в дереве проекта*

   ![Создание Страницы в Типе](https://docs.owen.ru/book_img/1936/137549.png)

   *Создание Страницы в Типе*

   На страницах <b>*Типа*</b> реализуется алгоритм блока.

   Страницы в <b>*Тип*</b> можно скопировать из проекта. Если необходимо, чтобы связи между блоками на разных страницах сохранились, копировать страницы следует вместе, выделив их в дереве с зажатым **Shift**.

3. Создать на новой странице блоки <b>*Mul*</b> и <b>*Add*</b> из библиотеки <b>*paCore*</b> и соединить их, как показано на рисунке ниже.

   ![Алгоритм работы составного блока](https://docs.owen.ru/book_img/1936/137548.png)

   *Алгоритм работы составного блока*

4. Назначить внутренние входы/выходы блоков как внешние входы/выходы составного блока.

   Для этого следует в контекстном меню нужного входа/выхода выбрать команду <b>*Сделать внешним*</b> – вход/выход станет одновременно принадлежать и внутреннему блоку, и <b>*Типу*</b>. Входы/выходы внутренних блоков, назначенные внешними, подкрасятся желтым и на <b>*Странице,*</b> и в <b>*Дереве*</b>.

   > **Примечание.** Рекомендуется входы/выходы составного блока, которые необходимо назначить внешними, выводить на терминальные блоки (типа [Trans](#topic-96068)). Терминальные блоки повторяют значения своих входов на выходах. Таким образом, если возникнет необходимость изменить компоненты составного блока, когда он уже будет добавлен в проект, не потребуется повторно выполнять проведение связей.

   ![Назначение внешними входов-выходов составного блока](https://docs.owen.ru/book_img/1936/137547.png)

   *Назначение внешними входов/выходов составного блока*

   ![Внешние входы-выходы составного блока](https://docs.owen.ru/book_img/1936/137546.png)

   *Внешние входы/выходы составного блока*

5. Транслировать проект для проверки корректности созданного типа. После сообщения об успешной трансляции (<b>*Трансляция завершена*</b>) экземпляры нового типа можно создавать на страницах проекта.

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

1. Перетащить блок из <b>*Дерева*</b> проекта или библиотеки на <b>*Страницу*</b> проекта и выбрать <b>*Создать*</b> в контекстном меню.

   ![Добавление пользовательского составного блока в проект](https://docs.owen.ru/book_img/1936/137545.png)

   *Добавление пользовательского составного блока в проект*

2. На пустом месте <b>*Страницы*</b> щелкнуть ПКМ – <b>*Создать*</b> и выбрать необходимый блок в разделе <b>*Библиотека проекта*</b>, нажать **ОК**.

   ![Добавление пользовательского составного блока в проект (2)](https://docs.owen.ru/book_img/1936/137544.png)

   *Добавление пользовательского составного блока в проект*

На графическом отображении составных блоков на страницах проекта изображается знак <b>*#*</b>, что означает, что данный блок – составной.

В дереве проекта или библиотеки <b>*Тип*</b>, экземпляр которого был создан на странице проекта, подсветится желтым.

![Составной блок в проекте](https://docs.owen.ru/book_img/1936/137543.png)

*Составной блок в проекте*

![Работа составного блока](https://docs.owen.ru/book_img/1936/137562.png)

*Работа составного блока*

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

#### Создание составного блока на C++

В проекте можно создать составной функциональный блок с алгоритмом, написанным на **C++**. Пример – блок RS-триггера с приоритетом по сбросу. Для создания составного блока с алгоритмом на **C++** следует:

1. Создать [Тип](#topic-96049).

2. Создать внешние входы/выходы типа через контекстное меню <b>*Типа*</b> командой <b>*Создать*</b>. В появившемся окне следует выбрать <b>*вход типа*</b> или <b>*выход типа*</b> и ввести <b>*Имя*</b> входа/выхода.

   > **Внимание.** <b>*Имя*</b> входа или выхода должно содержать только латинские буквы, цифры и **«\_»**. Если оставить поле ввода имени пустым, то оно будет назначено автоматически по шаблону <b>*b<индекс>*</b>.

   ![Создание внешних входов-выходов типа](https://docs.owen.ru/book_img/1936/137561.png)

   <i>**Создание внешних входов/выходов типа**</i>

   ![Создание внешнего входа типа](https://docs.owen.ru/book_img/1936/137560.png)

   <i>**Создание внешнего входа типа**</i>

   ![Результат создания внешних входов-выходов типа](https://docs.owen.ru/book_img/1936/137559.png)

   <i>**Результат создания внешних входов/выходов типа**</i>

3. Задать свойства добавленным входам/выходам.

   **Свойства входов/выходов типа**

   | Свойство | Описание |
   | --- | --- |
   | <b>*Имя*</b> | Отображается как имя входа/выхода блока |
   | <b>*Имя переменной*</b> | Переменная класса, соответствующая этому входу/выходу. Имя должно быть уникальным в пределах класса |
   | <b>*Номер*</b> | Определяет положение входа/выхода в дереве и в составном блоке |
   | <b>*Комментарии*</b> | Отображается у входа/выхода в дереве и у составного блока |
   | <b>*Индекс типа данных*</b> | Индекс типа данных входа/выхода из раздела <b>*Библиотеки/Типы данных*</b> |
   | <b>*Тип связей*</b> | Для **входов** определяет правила, по которым разрешается проводить связи на данный вход:<br>**0** – можно провести связь или задать константу (переменная – указатель);<br>**1** – связь проводить нельзя, вход константный (переменная – не указатель);<br>**2** – нельзя задать константу, можно провести связь, но она не обязательна (при отсутствии связи на вход будет передан **0**, переменная – указатель);<br>**3** – нельзя задать константу, можно провести связь, и она обязательна (при отсутствии связи при трансляции будет выдана ошибка, переменная – указатель) |
   | <b>*Указатель*</b> | Для **выходов**:<br>**Установлен флаг** – признак того, что переменная является указателем;<br>**Не установлен флаг** – обычный выход<br>**Примечание.** По умолчанию добавляемые выходы не являются указателями, если необходимо соответствующее свойство можно добавить в разделе <b>*Свойства*</b>. |

4. Для того, чтобы задать тип данных входа/выхода, следует:

   1. Найти нужный тип данных в разделе <b>*Библиотеки/Типы данных*</b>. В данном примере – тип данных <b>*b*</b> (bool).
   2. Открыть свойства <b>*b*</b>.
   3. Скопировать значение свойства <b>*Индекс*</b>.

   > **Примечание.** Свойство <b>*Индекс*</b> типов данных в разделе <b>*Библиотеки/Типы данных*</b> может различаться в разных проектах.

   ![Индекс для типа данных b](https://docs.owen.ru/book_img/1936/137558.png)

   <i>**Индекс для типа данных** b</i>

5. Подставить скопированное значение в свойство <b>*Индекс типа данных*</b> нужного входа или выхода.

   При правильной подстановке индекса типа данных в свойствах входа или выхода появится <b>*Имя типа*</b>, соответствующее указанному типу. Если в разделе <b>*Библиотеки/Типы данных*</b> нет подходящего типа данных, его можно скопировать из основной библиотеки.

6. Задать таким же способом <b>*Индекс типа данных*</b> для всех созданных входов/выходов типа.

7. Установить свойство входов <b>*Тип связей = 0*</b>.

   ![Свойства входа reset](https://docs.owen.ru/book_img/1936/137557.png)

   <i>**Свойства входа** reset</i>

   ![Свойства выхода q](https://docs.owen.ru/book_img/1936/137556.png)

   <i>**Свойства выхода** q</i>

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

   Для того, чтобы написать блок на **C++**, следует добавить в <b>*Тип*</b> текстовые файлы. Для создания алгоритмов на **C++** используются следующие расширения файлов:

   - **.work** – вызывается из функции <b>*Work*</b> каждый цикл выполнения программы;
   - **.init** – вызывается из функции <b>*InitInp*</b> один раз при инициализации;
   - **.hpp** – включается внутрь описания класса, это могут быть объявления дополнительных переменных и функций;
   - **.cpp** – включается в **.cpp**-файл класса – реализация дополнительных функций, добавление библиотек.

   Для создания блока необходимо добавить как минимум один файл с расширением **.****work**.

   Для реализации RS-триггера понадобится создать файлы с расширениями **.****work** для написания логики работы триггера и **.****hpp** для того, чтобы хранить значение выхода во внутренней памяти блока. Нужно добавить текстовый файл в <b>*Тип*</b>.

8. Выполнить команду <b>*Создать*</b> в контекстном меню типа.

9. Выбрать <b>*файл*</b> и задать ему имя и расширение.

   ![Создание файла в типе](https://docs.owen.ru/book_img/1936/137555.png)

   <i>**Создание файла в типе**</i>

   ![Создание файла с расширением .work](https://docs.owen.ru/book_img/1936/137554.png)

   *<b>Создание файла с расширением .</b>work*

   ![Создание файла с расширением .hpp](https://docs.owen.ru/book_img/1936/137553.png)

   *<b>Создание файла с расширением .</b>hpp*

   ![Созданные файлы в дереве проекта](https://docs.owen.ru/book_img/1936/137572.png)

   <i>**Созданные файлы в дереве проекта**</i>

   Для редактирования текстовых файлов в **Полигон** предназначено окно типа [Редактор](#topic-96002), которое открывается автоматически при двойном щелчке на текстовом файле в дереве проекта.

   Если файла на диске не существует, то он будет создан при нажатии кнопки <b>*Сохранить*</b>. По умолчанию файлы хранятся в той же папке, где расположен проект или библиотека.

10. Прописать в файле *logic**\_**rs**.**work* логику работы RS-триггера.

11. Нажать <b>*Сохранить*</b>.

    ![Пример содержания файла с расширением .work](https://docs.owen.ru/book_img/1936/137571.png)

    *<b>Пример содержания файла с расширением .</b>work*

12. В файле *store**.**hpp* объявить переменную для хранения значения триггера.

13. Нажать <b>*Сохранить*</b>.

    ![Пример содержания файла с расширением .hpp](https://docs.owen.ru/book_img/1936/137570.png)

    *<b>Пример содержания файла с расширением .</b>hpp*

14. Транслировать проект для проверки корректности созданного типа. После сообщения об успешной трансляции (<b>*Трансляция завершена*</b>) экземпляры нового типа можно создавать на страницах проекта.

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

1. Перетащить блок из <b>*Дерева*</b> проекта или библиотеки на <b>*Страницу*</b> проекта и выбрать <b>*Создать*</b> в контекстном меню.

   ![Добавление пользовательского составного блока в проект](https://docs.owen.ru/book_img/1936/137545.png)

   <i>**Добавление пользовательского составного блока в проект**</i>

2. На пустом месте <b>*Страницы*</b> щелкнуть ПКМ – <b>*Создать*</b> и выбрать необходимый блок в разделе <b>*Библиотека проекта*</b>, нажать **ОК**.

   ![Добавление пользовательского составного блока в проект (2)](https://docs.owen.ru/book_img/1936/137544.png)

   <i>**Добавление пользовательского составного блока в проект**</i>

   На графическом отображении составных блоков на страницах проекта изображается знак <b>*#*</b>, что означает, что данный блок – составной.

В дереве проекта или библиотеки <b>*Тип*</b>, экземпляр которого был создан на странице проекта, подсветится желтым.

![Работа составного блока2](https://docs.owen.ru/book_img/1936/137569.png)

<i>**Работа составного блока**</i>

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

##### Создание составных блоков с переменным числом входов/выходов
на C++

Одно из важных преимуществ создания пользовательских составных блоков на **C****++** – возможность создавать блоки с переменным количеством входов/выходов.

Для того, чтобы создать входы/выходы переменного количества в блоке, следует создать <b>*Массив*</b> в <b>*Типе*</b>.

В <b>*Массиве*</b> следует создать либо входы, либо выходы, **но не вместе**. Возможны два варианта:

1. <b>*Простой массив*</b> состоит из одного входа или выхода. <b>*Имя переменной*</b> входа/выхода определяется именем массива. Например, если массив имеет <b>*Имя*</b> – **arr**, то <b>*Имя переменной*</b> его входа/выхода – <b>*arr*</b><b>*\[%1\]*</b>. Простой массив соответствует **циклическим** входам или выходам.
2. <b>*Массив структур*</b> состоит из нескольких входов или выходов. Имя структуры задается свойством <b>*Имя типа*</b>. <b>*Имя переменной*</b> входа/выхода определяется именем массива и именем переменной внутри структуры, например, <b>*arr*</b><b>*\[%1\].*</b><b>*in*</b>. Массив структур соответствует **циклическим группам** входов или выходов.

<b>*Имена переменных*</b> внутри массива заполняются автоматически, если перед добавлением входов/выходов правильно задать свойство <b>*Имя типа*</b>.

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

Для этого следует обоим массивам входов и выходов задать одинаковое значение свойства <b>*Принадлежит к группе*</b>, например, **1**.

Например, можно создать блок логического **НЕ** с переменным числом входов/выходов. Для этого следует:

1. Создать [Тип](#topic-96048).

   ![Создание Типа (2)](https://docs.owen.ru/book_img/1936/137568.png)

   <i>**Создание Типа**</i>

2. Создать в <b>*Типе*</b> два массива, первый – массив входов, второй – массив выходов.

   ![Создание массива входов](https://docs.owen.ru/book_img/1936/137567.png)

   <i>**Создание массива входов**</i>

   ![Создание массива выходов](https://docs.owen.ru/book_img/1936/137566.png)

   <i>**Создание массива выходов**</i>

   ![Результат создания массивов](https://docs.owen.ru/book_img/1936/137565.png)

   <i>**Результат создания массивов**</i>

3. В свойствах обоих массивов добавить свойство <b>*Принадлежит к группе = 1*</b>.

   ![Свойства массива входов](https://docs.owen.ru/book_img/1936/137564.png)

   <i>**Свойства массива входов**</i>

   ![Свойства массива входов (2)](https://docs.owen.ru/book_img/1936/137563.png)

   <i>**Свойства массива выходов**</i>

4. Создать <b>*вход типа*</b> в массиве входов, создать <b>*выход типа*</b> в массиве выходов.

   ![Создание входа](https://docs.owen.ru/book_img/1936/137582.png)

   <i>**Создание входа**</i>

   ![Создание выхода](https://docs.owen.ru/book_img/1936/137581.png)

   <i>**Создание выхода**</i>

   ![Результат создания входа и выхода](https://docs.owen.ru/book_img/1936/137580.png)

   <i>**Результат создания входа и выхода**</i>

5. В свойствах входа и выхода добавить свойство <b>*Индекс типа данных*</b> и скопировать в него значение <b>*Индекса*</b> типа данных <b>*b*</b> из раздела <b>*Библиотеки/Типы данных*</b> аналогично [разделу](#topic-96047).

   ![Свойства входа](https://docs.owen.ru/book_img/1936/137579.png)

   <i>**Свойства входа**</i>

   ![Свойства выхода](https://docs.owen.ru/book_img/1936/137578.png)

   <i>**Свойства выхода**</i>

6. Добавить в <b>*Тип*</b> файл **.****work**, в котором расписать логику работы блока.

   ![Добавление файла с расширением .work](https://docs.owen.ru/book_img/1936/137577.png)

   *<b>Добавление файла с расширением .</b>work*

   ![Логика работы блока](https://docs.owen.ru/book_img/1936/137576.png)

   <i>**Логика работы блока**</i>

7. Транслировать проект для проверки корректности созданного типа. После сообщения об успешной трансляции (<b>*Трансляция завершена*</b>) экземпляры нового типа можно создавать на страницах проекта.

8. Создать экземпляр блока в проекте. Создание экземпляра блока на странице проекта описано в [разделе](#topic-96048).

   ![Блок на странице проекта](https://docs.owen.ru/book_img/1936/137575.png)

   <i>**Блок на странице проекта**</i>

9. Создать у блока дополнительные входы – одновременно с входами добавится соответствующее количество выходов.

   ![Добавление входов блока](https://docs.owen.ru/book_img/1936/137574.png)

   <i>**Добавление входов блока**</i>

   ![Блок с добавленными входами](https://docs.owen.ru/book_img/1936/137573.png)

   <i>**Блок с добавленными входами**</i>

   ![Работа блока](https://docs.owen.ru/book_img/1936/137592.png)

   <i>**Работа блока**</i>

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

##### Доступ к системной информации из кода составного блока на C++

Доступ к системной информации можно получить из статических функций класса **runtimeInfo**:

1. **runtimeInfo::nsAbsTime()** возвращает значение **uint64_t**, которое равно количеству **наносекунд**, прошедших от **01.01.1970**. Это значение можно использовать как абсолютное время в **UTC**, например, для меток времени. Не стоит использовать значение **uint64_t** при измерениях интервалов, потому что его может изменять **NTP**-клиент. Обновляется в потоке <b>*Таймер*</b>, если он один, или в потоке <b>*Ввод-вывод*</b>, один раз за цикл.
2. **runtimeInfo::nsMonotonic()** возвращает значение **uint64_t** равномерно меняющегося счетчика в **наносекундах**. Не редактируется **NTP**-клиентом и при изменении системного времени, поэтому значение можно использовать для измерения интервалов, превышающих таймерный цикл.
3. **runtimeInfo::timerCycle()** возвращает значение типа **float**, равное циклу таймерного потока, в котором выполняется блок, в **миллисекундах**. Если блок выполняется в фоновом потоке, то значение не определено.
4. **runtimeInfo::cpuCoresNum()** возвращает количество ядер процессора (тип **uint16_t**).

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

#### Свойства типов составных блоков и их входов/выходов

Для удобства отображения в дереве проекта или библиотеки <b>*Типу*</b> можно задать свойство <b>*Имя*</b> – это имя, которое отображается в дереве проекта или библиотеки.

Еще одно полезное свойство <b>*Типа*</b> – <b>*Может работать только в…*</b>. Его можно добавить из нижнего выпадающего списка в окне <b>*Свойства*</b>. Данное свойство определяет, в каком <b>*Месте работы*</b> можно создать экземпляр блока данного типа. При попытке создать блок в другом <b>*Месте работы*</b> появится окно ошибки.

![Свойства Типа](https://docs.owen.ru/book_img/1936/137591.png)

<i>**Свойства Типа**</i>

![Ошибка вставки блока](https://docs.owen.ru/book_img/1936/137448.png)

<i>**Ошибка вставки блока**</i>

Основные свойства внешних входов/выходов составного блока:

- <b>*Имя*</b> – отображается как имя входа/выхода блока;
- <b>*Номер*</b> – определяет положение входа/выхода в дереве и в составном блоке;
- <b>*Комментарии*</b> – отображается у входа/выхода в дереве и у составного блока.

При изменении свойства <b>*Номер*</b> внешнего входа или выхода <b>*Типа*</b> появится сообщение <b>*Обновить блоки типа…*</b>– применить изменение ко всем экземплярам блока данного типа в проекте.

Если необходимо изменить свойства <b>*Имя*</b> и/или <b>*Комментарии*</b> внешних входов/выходов, то для применения изменений следует пересоздать блок на странице проекта.

![Изменение свойств входов-выходов составного блока](https://docs.owen.ru/book_img/1936/137590.png)

<i>**Изменение свойств входов/выходов составного блока**</i>

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

#### Создание справки для составных блоков

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

Для создания справки следует:

1. В контекстном меню <b>*Типа*</b> выбрать команду <b>*Описание*</b>.

   ![Создание описания типа](https://docs.owen.ru/book_img/1936/137589.png)

   <i>**Создание описания типа**</i>

2. В текущем окне отобразится окно <b>*Редактора*</b>. В папке проекта (если тип создан в проекте, иначе в папке библиотеки) автоматически создастся папка <b>*userHelp*</b> и в ней файл с расширением **.****html** и именем типа.

3. Добавить в файл описание блока.

   ![Редактирование файла с расширением .html](https://docs.owen.ru/book_img/1936/137588.png)

   *<b>Редактирование файла с расширением .</b>html*

   В папке <b>*userHelp*</b> следует размещать все файлы, которые используются для создания описаний для <b>*Типов*</b> данной <b>*Группы типов*</b>.

4. Если необходимо добавить картинки в описание, следует подготовить изображения с расширением **.****png**, имена которых начинаются с имени соответствующего файла справки, и поместить их в папку <b>*userHelp*</b>.

Например, для описания *my**\_**block**2.**html* следует добавить файлы изображений с названиями *my**\_**block**2_1.**png*, *my**\_**block**2_2.**png* и т.д.

Для того, чтобы вызвать описание блока, можно выделить <b>*Тип*</b> в дереве и выполнить команду <b>*Справка*</b> в контекстном меню (или нажать горячую клавишу **F1**). В нижней части окна <b>*Справка*</b> отобразится созданное описание блока, картинки автоматически появятся в начале описания.

![Описание типа в окне Справка](https://docs.owen.ru/book_img/1936/137587.png)

<i>**Описание типа в окне Справка**</i>

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

### Создание библиотеки

Пользователь может создать библиотеку самостоятельно.

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

> [!WARNING]
> **Внимание.** Путь к файлам библиотек не должен содержать кириллицу и пробелы.

Для создания библиотеки следует:

1. Перейти в окно <b>*Проекты*</b> и нажать <b>*Создать*</b>.

   ![Создание пользовательской библиотеки0](https://docs.owen.ru/book_img/1936/137586.png)

   <i>**Создание пользовательской библиотеки**</i>

2. В открывшемся окне перейти в папку, где будет создана библиотека, ввести имя новой библиотеки, в выпадающем списке выбрать тип <b>*Библиотека Полигон 2 (\*.*</b><b>*ll*</b><b>*2)*</b> и нажать <b>*Создать*</b>.

   ![Создание пользовательской библиотеки](https://docs.owen.ru/book_img/1936/137585.png)

   <i>**Создание пользовательской библиотеки**</i>

3. Для работы с библиотекой следует открыть ее в представлении <b>*Дерево*</b>. Среда при создании библиотеки сразу предложит открыть ее в дереве – следует нажать <b>*Да*</b>.

   ![Создание пользовательской библиотеки (2)](https://docs.owen.ru/book_img/1936/137584.png)

   <i>**Создание пользовательской библиотеки**</i>

4. Созданная библиотека отобразится в окне <b>*Проекты*</b>.

   ![Результат Создания пользовательской библиотеки](https://docs.owen.ru/book_img/1936/137583.png)

   <i>**Результат Создания пользовательской библиотеки**</i>

   Для создания блоков в библиотеки следует добавить в нее [типы данных](#topic-96065). По умолчанию раздел <b>*Типы данных*</b> в библиотеке пустой. Его следует скопировать из основной библиотеки <b>*paCore*</b>. Для добавления в библиотеку типов данных следует:

5. Открыть библиотеку <b>*paCore*</b> в соседнем окне типа <b>*Дерево*</b>.

   ![Добавление типов данных в пользовательскую библиотеку](https://docs.owen.ru/book_img/1936/137612.png)

   <i>**Добавление типов данных в пользовательскую библиотеку**</i>

6. Открыть раздел <b>*Типы данных*</b> в <b>*paCore*</b>, выделить первый тип данных раздела и с зажатым **Shift** выделить последний тип данных раздела.

7. С помощью команд **Ctrl** **+** **c** и **Ctrl** **+** **v** выполнить копирование типов данных в раздел <b>*Типы данных*</b> новой библиотеки.

   Теперь в библиотеке можно создавать [пользовательские составные блоки](#topic-96047), копируя индексы типов данных для входов и выходов из раздела <b>*Типы данных*</b> библиотеки.

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

8. В окне <b>*Экран/Настройки*</b> выбрать <b>*ОС для трансляции библиотек*</b>.

   > **Внимание.** Библиотеку следует транслировать для всех ОС, в которых ее планируется использовать.

   ![Трансляция библиотеки](https://docs.owen.ru/book_img/1936/137611.png)

   <i>**Трансляция библиотеки**</i>

9. Выполнить <b>*Транслировать все*</b> на панели [Инструменты](#topic-95997) окна библиотеки.

10. В папке библиотеки создастся папка <b>*build*</b> и в ней папка с файлами трансляции для выбранной ОС:

    - <b>*Windows*</b> для Windows;
    - <b>*Astra*</b> <b>*Linux*</b> <b>*SE*</b> <b>*1.7*</b> для Astra Linux SE 1.7;
    - <b>*Linux*</b> <b>*Овен прошивка 3.х*</b> для ОС ПЛК210.

Теперь новую библиотеку можно использовать в проектах.

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

#### Создание справки для библиотек

> [!NOTE]
> **Примечание.** Возможность создания полноценной справки для библиотеки есть только при работе на ПК с ОС Windows. При работе на ПК с ОС Linux см. создание справки для отдельных блоков в [разделе](#topic-96053).

Чтобы создать справку для библиотеки, следует:

1. Скопировать папку <b>*help*</b> с шаблонами (из папки <b>*Polygon2*</b>) в папку библиотеки, для которой будет создаваться справка.

2. В папке <b>*help*</b> переименовать файлы в соответствии с именами библиотеки и функциональных блоков, например, <b>*my*</b><b>*\_*</b><b>*lib*</b> и <b>*my*</b><b>*\_*</b><b>*block*</b>:

   - <b>*paControls.qhp*</b> в <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.qhp*</b> – список индивидуальных описаний блоков в справке библиотеки;
   - <b>*paControls.qhcp*</b> в <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.qhcp*</b> – указания для генератора справки;
   - <b>*paControls.bat*</b> в <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.bat*</b> – исполняемый **.bat**-файл создания бинарных файлов библиотеки для **Полигон**;
   - <b>*mode.html*</b> в <b>*my*</b><b>*\_*</b><b>*block*</b><b>*.html*</b> – описание блока.

3. Отредактировать переименованные файлы. Рекомендуется пользоваться редактором Notepad++ для удобства.

4. Редактирование файла <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.qhp*</b> на примере части содержимого из <b>*paControls.qhp*</b>:

   - <b>*paControls*</b> заменить на имя библиотеки, например, <b>*my*</b><b>*\_*</b><b>*lib*</b>;
   - Редактировать/удалить и создать нужное количество разделов. Например, <b>*Функциональные блоки*</b> вместо <b>*Регуляторы*</b>;
   - Редактировать описания блоков и ссылки на их файлы описания. Например, вместо <b>*Выдача данных с задержкой*</b> вставить <b>*Вычисление линейной функции*</b> <b>*k*</b>**<i>\*</i>**<b>*x*</b> <b>*+*</b> <b>*b*</b>, вместо <b>*delayv.html*</b> вставить <b>*my*</b><b>*\_*</b><b>*block*</b><b>*.html*</b>;
   - В ключевых словах указать <b>*my*</b><b>*\_*</b><b>*block*</b> вместо <b>*delayv*</b>, другие строки удалить.

   > **Примечание.** При редактировании следует сохранить строку, где в ключевом слове указано точное имя типа (в примере указаны <b>*my_block*</b> и <b>*C\_ my_block*</b>). Это требуется для вызова справки на конкретный блок по клавише **F1**.

5. В результате должно получиться следующее содержание <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.qhp*</b>:

   ![Редактирование файла с расширением .qhp](https://docs.owen.ru/book_img/1936/137610.png)

   *<b>Редактирование файла с расширением .</b>qhp*

6. Редактирование файла **my_lib.qhcp**: заменить **paControls** на **my_lib**.

   ![Редактирование файла с расширением .qhcp](https://docs.owen.ru/book_img/1936/137609.png)

   *Редактирование файла с расширением .qhcp*

7. Редактирование файла <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.bat*</b>:

   - Заменить <b>*paControls*</b> на <b>*my_lib*</b>;

   - Убедиться, что указан правильный путь к <b>*qhelpgenerator.exe*</b>. Например, <b>*E:\\Polygon2\\qhelpgenerator.exe*</b>.

     ![Редактирование файла с расширением .bat](https://docs.owen.ru/book_img/1936/137608.png)

     *<b>Редактирование файла с расширением .</b>bat*

8. Редактирование файла <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.html*</b>:

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

9. В папку <b>*images*</b> следует поместить картинки **.png**, **.gif** к описанию блока. Стандартно имена задаются именем блока и цифрой. В примере используется <b>*my*</b><b>*\_*</b><b>*block*</b><b>*.png*</b>.

10. Запустить файл **my_block.bat**. Будут созданы файлы **.qch** и **.qhc**.

11. В папке библиотеки будут созданы файлы справки: <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.qch*</b> и <b>*my*</b><b>*\_*</b><b>*lib*</b><b>*.qhc*</b>.

Эти файлы используются справкой **Полигон** для отображения описания блоков библиотеки. Они должны передаваться вместе с ней, когда исходные файлы в папке <b>*help*</b> остаются у разработчиков библиотеки.

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

![Результат создания пользовательской справки](https://docs.owen.ru/book_img/1936/137607.png)

<i>**Результат создания пользовательской справки**</i>

> [!WARNING]
> **Внимание.** Возможные ошибки при запуске **.bat**-файла:
>
> - Указан неверный путь к файлу генератора – в файле **.bat** следует указать прямой путь к <b>*qhelpgenerator.exe*</b> или создать переменную среды <b>*%DirQtInstall%*;</b>
> - Библиотека <b>*qminimal.dll*</b> неверной версии – следует обратиться к разработчику за верным файлом;
> - Если название проекта в <b>*\<namespace>*</b> задано кириллицей то поменять на латинские символы;
> - Файл **.qhc** не получилось обновить – сейчас файл используется приложением Полигон, следует закрыть его и повторить операцию;
> - Справка создалась, можно самостоятельно в дереве справки выбрать описание блока, но оно не вызывается на блоке командой **F1** – в разделе ключевых слов файла **.qhp** не указано точное имя типа блока. Следует добавить эту строчку со ссылкой на описание блока.

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

### Экспорт/импорт свойств из MS Excel

Полигон поддерживает выгрузку и загрузку свойств компонентов проекта в виде таблицы MS Excel с помощью команд <b>*Экспорт/Импорт*</b> на панели [Инструменты](#topic-95997). Это может быть полезно для быстрого массового редактирования свойств функциональных блоков и их входов/выходов.

С помощью команды <b>*Экспорт*</b> можно выгрузить свойства компонентов <b>*Модуля*</b>, <b>*Места работы*</b>, <b>*Программы*</b>, <b>*Страницы*</b>, <b>*Раздела*</b>.

Сначала следует выделить экспортируемый компонент проекта, затем выбрать команду <b>*Экспорт*</b> на панели <b>*Инструменты*</b> в дереве проекта.

![Команды Экспорт-Импорт на панели Инструменты](https://docs.owen.ru/book_img/1936/137606.png)

<i>**Команды Экспорт/Импорт на панели Инструменты**</i>

Также можно выбрать команду <b>*Экспорт*</b> в контекстном меню нужного компонента (нажать на компонент ПКМ).

![Команды Экспорт-Импорт в контекстном меню](https://docs.owen.ru/book_img/1936/137605.png)

<i>**Команды Экспорт/Импорт в контекстном меню**</i>

Аналогично можно экспортировать и импортировать свойства функциональных блоков и входов/выходов на открытой странице. Для этого следует нажать кнопку <b>*Эскпорт*</b> на панели <b>*Инструменты*</b>.

![Исходный вид страницы](https://docs.owen.ru/book_img/1936/137604.png)

<i>**Исходный вид страницы**</i>

После выполнения команды <b>*Экспорт*</b> откроется окно, в котором следует:

1. Установить в графе тип файла <b>*MS Excel (\*.xlsx)*</b> – справа в окне отобразится предпросмотр таблицы свойств страницы, блоков и входов/выходов на этой странице.

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

   ![Выбор экспортируемых свойств](https://docs.owen.ru/book_img/1936/137603.png)

   <i>**Выбор экспортируемых свойств**</i>

3. Ввести имя файла.

4. Выбрать его расположение на диске.

5. Нажать <b>*Сохранить*</b>.

Сохраненный файл следует открыть в программе MS Excel.

> [!NOTE]
> **Примечание.** При работе на ПК с ОС Linux для редактирования таблицы можно использовать редактор ONLYOFFICE.

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

![Свойства после редактирования в MS Excel](https://docs.owen.ru/book_img/1936/137622.png)

<i>**Свойства после редактирования в** MS Excel</i>

Отредактированный файл следует сохранить на диске в формате <b>*MS Excel (\*.xlsx)*</b>.

Чтобы импортировать новые свойства, следует нажать кнопку <b>*Импорт*</b> на панели <b>*Инструменты*</b> и выбрать в открывшемся окне сохраненный файл.

Новые свойства применятся к странице, блокам и входам/выходам на этой странице.

> [!WARNING]
> **Внимание.** Место свойств в проекте определяется однозначно уникальными свойствами <b>*Индекс*</b> (index) входов/выходов, блоков и т.д., поэтому импорт можно произвести в любом месте проекта. Изменения применятся только к свойствам тех элементов, которые были экспортированы.

![Вид страницы после импорта свойств](https://docs.owen.ru/book_img/1936/137621.png)

<i>**Вид страницы после импорта свойств**</i>

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

### Генерация из MS Excel

**Полигон** поддерживает генерацию программ из MS Excel с помощью команды <b>*Импорт*</b>.

Генерация из MS Excel в **Полигон** позволяет:

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

> [!NOTE]
> **Примечание.** При работе на ПК с ОС Linux для редактирования таблиц можно использовать редактор ONLYOFFICE.

Для генерации требуется **.****xlsx**-файл определенного формата.

На модуле следует нажать <b>*Импорт*</b>, указать файл и в качестве типа файла выбрать <b>*Генерация из MS Excel (\*.xlsx)*</b>. **Полигон** проверяет начало названия листа и выполняет соответствующий алгоритм импорта.

Листы файла **.****xlsx**:

- <b>*create*</b> – листы данного типа предназначены для добавления программ и блоков;
- <b>*io*</b> – предназначен для изменения значений, комментариев и прочих свойств входов и выходов;
- <b>*ii*</b> – предназначен для изменения значений на группах входов;
- <b>*links*</b> – предназначен для проведения связей.

Если при импорте будет обнаружена ошибка, то изменения не применяются и происходит откат версии до начала импорта. Генерация оперирует с именами блоков, поэтому они должны быть уникальны. Листы считываются слева направо, поэтому вначале необходимо разместить листы типа <b>*create*</b>. Процесс импорта сопровождается сообщениями в окне <b>*Прогресс*</b> и завершается выдачей информации о количестве добавляемых блоков, программ и т.п. Алгоритм импорта не выполняет удаление блоков, программ, свойств и связей.

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

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

<i>**Лист create. Добавление программ и блоков**</i>

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

**Заголовки таблицы create**

| Заголовок | Описание | Ограничения |
| --- | --- | --- |
| <b>*blocktype*</b> | **6** – для программ, **0** – для блоков | Любые другие значения остановят импорт |
| <b>*name*</b> | Если необходимо создать множество блоков, следует использовать спецсимвол «#» в названии.<br>**bsup\_##** – **bsup_00**, **bsup_01**, …<br>**decd\_###** – **decd \_000**, **decd \_001**, … | Имя может состоять из букв латинского алфавита, цифр, символа «**\_**» и спецсимвола «**#**», другие символы не допускаются.<br>**#** – разрешен только для блоков.<br>Нельзя создать несколько программ одной строчкой.<br>При использовании **#** ввод количества блоков в столбец **n** обязателен.<br>**#** могут располагаться только в конце названия |
| <b>*typename*</b> | Имя блока из библиотеки или имя составного блока из корня проекта | Обязательное поле для блоков |
| <b>*parent*</b> | Имя родителя в дереве. Для программ – место работы, для блоков – имя программы | Обязательное поле для программ и блоков |
| <b>*n*</b> | Количество блоков | Поле считывается только при наличии **#** в названии |
| <b>*inp_n*</b> | Количество циклических входов/выходов блока | Только для блоков.<br>Если блок не имеет циклических входов/выходов, поле должно быть пустым |

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

**Для программы**: при наличии указанной программы в проекте (независимо от места работы) программа не добавляется. В противном случае проверяется наличие указанного места работы и добавляется программа.

**Для блока**: при наличии указанного количества блоков (независимо от типа блоков и программы) блоки не добавляются. В противном случае проверяется наличие указанной программы,и добавляются блоки, начиная с **0** номера. Если в программе присутствует часть блоков, новые блоки добавляются, начиная с последнего номера **+1**. Блоки вставляются друг за другом. Если у блока много входов/выходов, используется формат **А3**.

![Лист io. Изменение-добавление свойств входа-выхода](https://docs.owen.ru/book_img/1936/137619.png)

*Лист io. Изменение/добавление свойств входа/выхода*

Заголовок таблицы <b>*io*</b> предопределен частично (первые три столбца), при несоответствии импорт прекратится с выдачей предупреждения на указанный лист.

**Заголовки таблицы io**

| Заголовок | Описание | Ограничения |
| --- | --- | --- |
| <b>*type_io*</b> | **0** – для входов, **1** – для выходов | Любые другие значения остановят импорт |
| <b>*block*</b> | Имя блока | Если блок не найден, импорт прекращается |
| <b>*name*</b> | Имя входа/выхода | Если вход/выход у блока не найден, импорт прекращается |

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

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

Можно организовывать циклы и повторения в таком же формате, как и <b>*links*</b>.

![Пример организация циклов](https://docs.owen.ru/book_img/1936/137618.png)

<i>**Пример организации циклов**</i>

В данном примере строка **204** приведет к тому, что у всех блоков **prm4_00**, **prm4_01**, … на всех выходах типа «**o**» выставятся одинаковые комментарии **comment1** и алиас **alias1**.

Строки **206…214** будут использовать имя блока с предыдущей строки.

![Лист ii. Изменение значений на группах входов](https://docs.owen.ru/book_img/1936/137617.png)

<i>**Лист ii. Изменение значений на группах входов**</i>

Заголовок таблицы <b>*ii*</b> предопределен частично (первые два столбца), при несоответствии импорт прекратится с выдачей предупреждения на указанный лист.

<b>Заголовки таблицы **ii**</b>

| Заголовок | Описание | Ограничения |
| --- | --- | --- |
| <b>*block*</b> | Имя блока | Если блок не найден, импорт прекращается |
| <b>*array*</b> | Номер входа | - |

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

- **bsup_00.adr1 = 150**, **bsup_00.ini1 = -25**, **bsup_00.min1 = -50**, **bsup_00.max1 = 50**, **bsup_00.typ1 = II**;
- **bsup_01.adr3 = 151**, **bsup_01.ini3 = -26**, **bsup_01.min3 = -51**, **bsup_01.max3 = 49**, **bsup_01.typ3 = AI**.

Алгоритм работает не только на циклических входах, но нужно, чтобы <b>*<имя заголовка + номер входа>*</b> присутствовал у блока.

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

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

![Лист links. Проведение связей](https://docs.owen.ru/book_img/1936/137616.png)

<i>**Лист** links<b>. Проведение связей</b></i>

Заголовок таблицы <b>*links*</b> предопределен, при несоответствии импорт прекратится с выдачей предупреждения на указанный лист.

<b>Заголовки таблицы **links**</b>

| Заголовок | Описание | Ограничения |
| --- | --- | --- |
| <b>*out_block*</b> | Имя блока с выходом | Для указания циклических связей используются символы **#**, **\[,\]** |
| <b>*out*</b> | Имя выхода | - |
| <b>*in_block*</b> | Имя блока с входом | - |
| <b>*in*</b> | Имя входа | - |

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

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

> [!WARNING]
> **Внимание.** Обязательным условием использования циклических связей является непрерывность имен блоков. Например, если существуют **bsup_00** и **bsup_03**, обязаны существовать **bsup_01**, **bsup_02**, иначе импорт завершится ошибкой. Также обязательна нумерация с **0**, т.е. если имеется три блока **bsup_01**, **bsup_02**, **bsup_03**, к ним не сможет обратиться **bsup\_##**.

Для задания циклических связей используются символы «**#**», «**,**», «**\[-\]**». Возможные типы циклов перечислены в таблице ниже.

**Типы циклов**

| Цикл | Формат | Описание | Ограничения |
| --- | --- | --- | --- |
| Определенный цикл | **bsup\_\[05-07\]**<br>**dan\[4-8\]**<br>**min\[00-14\]** | В квадратных скобках задаются начальный и конечный номера блоков через «**-**» | Для блока:<br>Номер необходимо задавать с учетом лидирующих нулей.<br>Пример – для блоков **bsup****\_1**, **bsup****\_2** указывается **bsup****\_\[1-2\]**, для блоков **bsup****\_09**, **bsup****\_11** указывается **bsup****\_\[09-11\]**<br>Для входа/выхода:<br>У входов/выходов лидирующих нулей нет, но необходимо, чтобы начальный и конечный номер имели одинаковое количество цифр.<br>Пример: для выходов **dan****4**, **dan****5** указывается **dan****\[4-5\]**,<br>для выходов **dan****9**, **dan****10** указывается **dan****\[09-10\]** |
| Перечисление | **dan1**, **Ty**, **Kp** | Имена входов/выходов задаются через запятую. Пробелы игнорируются | Нельзя использовать для блоков, только для входов/выходов |
| Неопределенный цикл | **bsup\_##**<br>**dan#** | В качестве начального берется нулевой элемент. Конечный элемент определяется по ходу | Для блока:<br>Количество **#** определяет маску номера блока<br>**bsup\_##** – **bsup_00**, **bsup_01**,…<br>**decd\_###** – **decd \_000**, **decd \_001**,…<br>Для входа/выхода:<br>Количество **#** не имеет значения |
| Повторение | Пустая ячейка | Если оставить поле **out****\_****block** или **in****\_****block** пустым, то используется информация с прошлой строки с сохранением позиции в цикле | - |

Примеры задания циклических связей можно посмотреть в разделе <b>*Генерация из*</b> <b>*MS*</b> <b>*Excel*</b> в справке среды.

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

### Создание серверного многопользовательского проекта

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

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

1. Выполнить команду <b>*Создать*</b> в окне <b>*Проекты*</b>.

2. В списке типа проекта выбрать <b>*Полигон 2 многопользовательский (\*.pg2)*</b>.

   ![Создание многопользовательского проекта](https://docs.owen.ru/book_img/1936/137615.png)

   <i>**Создание многопользовательского проекта**</i>

3. Определить местоположение файла проекта на диске. Рекомендуется каждый проект размещать в отдельной папке.

   > **Внимание.** Полный путь к файлу проекта не должен содержать символов кириллицы и пробелов.

4. Задать имя проекта. Имя проекта также определяет имя базы данных на сервере PostgreSQL.

   > **Внимание.** Имя проекта должно содержать только символы латинского алфавита, цифры и «**\_**», начинаться с буквы.

5. В открывшемся окне ввести IP-адрес или имя компьютера и порт, на котором работает сервер PostgreSQL.

   ![Настройка подключения к серверу баз данных Postgre SQL](https://docs.owen.ru/book_img/1936/137614.png)

   <i>**Настройка подключения к серверу баз данных PostgreSQL**</i>

6. Ввести имя пользователя и пароль.

   ![Настройка подключения к серверу баз данных Postgre SQL (2)](https://docs.owen.ru/book_img/1936/137613.png)

   <i>**Настройка подключения к серверу баз данных PostgreSQL**</i>

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

![Создание базы данных](https://docs.owen.ru/book_img/1936/137632.png)

<i>**Создание базы данных**</i>

Файл проекта с расширением **.pg2** можно скопировать к другим пользователям и открыть в среде разработки. Для этого следует:

1. Выполнить команду <b>*Открыть*</b> в меню <b>*Проекты*</b>.

2. В списке типа проекта выбрать <b>*Полигон2 многопользовательский (\*.pg2)*</b>.

3. Найти на диске файл типа **.pg2** и нажать <b>*Открыть*</b>.

4. Ввести имя пользователя и пароль.

   ![Подключение к серверу баз данных Postgre SQL](https://docs.owen.ru/book_img/1936/137631.png)

   <i>**Подключение к серверу баз данных PostgreSQL**</i>

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

Рекомендуется организовать работу над проектом таким образом, чтобы пользователи редактировали разные <b>*Программы*</b> проекта. Для этого следует создать структуру проекта, состоящую из <b>*Мест работы*</b> и <b>*Программ*</b>, одним пользователем и затем привлечь к работе остальных.

Когда один пользователь вносит изменения в проект, остальные этих изменений не видят, пока он не сохранит проект на сервер. Остальным пользователям видны узлы проекта, в которых изменения в данный момент происходят, они подсвечиваются красным фоном в представлении <b>*Дерево*</b>. Для пользователя, который изменения вносит, они обозначаются в <b>*Дереве*</b> курсивом. При наведении курсора мыши на подсвеченный узел <b>*Дерева*</b> можно увидеть, какой именно пользователь его редактирует.

![Редактирование многопользовательского проекта](https://docs.owen.ru/book_img/1936/137630.png)

<i>**Редактирование многопользовательского проекта**</i>

![Редактирование многопользовательского проекта (2)](https://docs.owen.ru/book_img/1936/137629.png)

<i>**Редактирование многопользовательского проекта**</i>

Среда разработки не сохраняет изменения проекта на сервер автоматически, однако если несохраненные изменения есть, то каждые **5 минут** выдается предложение сохранить проект. Время сохранения можно изменить/отключить в меню [Экран/Настройки](#topic-96017).

![Предложение о сохранении проекта](https://docs.owen.ru/book_img/1936/137628.png)

<i>**Предложение о сохранении проекта**</i>

Кнопка <b>*Сохранить*</b> ![Кн Сохранить](https://docs.owen.ru/book_img/1936/137297.png) в панели инструментов показывает, что есть необходимость сохранить изменения. Последние **60** действий можно отменить командой <b>*Отмена*</b> ![Кн Отменить](https://docs.owen.ru/book_img/1936/137296.png) или комбинацией клавиш **Ctrl + z**, пока проект не сохранен на сервер. Если очередь изменений переполнена, будет предложено ее очистить или не выполнять последнюю операцию. После сохранения отмена изменений невозможна, и они становятся видны остальным пользователям.

После каждого сохранения проекта на локальной машине также создается копия проекта в виде <b>*sql dump*</b> для того, чтобы иметь возможность при необходимости восстановить определенную версию проекта. Файл с копией имеет такое же имя, как основной проект, плюс суффикс, обозначающий версию проекта на момент создания (например, файл <b>*mnu_demo_27.pg2*</b> содержит копию проекта <b>*mnu_demo*</b> версии **27**). Для восстановления копии необходимо открыть соответствующий файл проекта в среде разработки, тогда проект будет развернут на сервер в новую базу данных (например, <b>*mnu_demo_27_pg2*</b>).

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

![Ошибка блокировки](https://docs.owen.ru/book_img/1936/137627.png)

<i>**Ошибка блокировки**</i>

Массовые операции, такие как импорт, [генерация из MS Excel](#topic-96057) и копирование больших частей проекта рекомендуется проводить в момент минимальной активности остальных пользователей.

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

## Защита проекта

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

### Шифрование однопользовательского проекта

Проект в среде разработки **Полигон** – это база данных **Sqlite**. Защитить проект можно с помощью создания зашифрованной версии. Для этого следует:

1. В системном окне <b>*Проекты*</b> выделить интересующий проект и нажать кнопку <b>*Сохранить как…*</b>.
2. В появившемся окне выбрать расширение <b>*Полигон 2 с защитой(\*.*</b><b>*pp*</b><b>*2)*</b>.
3. Нажать <b>*Сохранить*</b>.

![Сохранение защищенного проекта](https://docs.owen.ru/book_img/1936/137626.png)

<i>**Сохранение защищенного проекта**</i>

В окне <b>*Проекты*</b> отобразится защищенная копия проекта.

![Защищенный проект в окне Проекты](https://docs.owen.ru/book_img/1936/137625.png)

<i>**Защищенный проект в окне Проекты**</i>

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

### Пароли на составных блоках

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

Для установки пароля следует:

1. Выбрать составной блок в дереве проекта.

2. Нажать ПКМ и выбрать в контекстном меню <b>*Установить пароль*</b>.

   > **Примечание.** Защита содержимого составного блока при помощи пароля эффективна только тогда, когда файл проекта хранится в [защищенном формате](#topic-96060).

   ![Задание пароля составного блока](https://docs.owen.ru/book_img/1936/137624.png)

   <i>**Задание пароля составного блока**</i>

3. Задать пароль в открывшемся окне – на иконке блока в дереве отобразится знак «замка».

   ![Составной блок с паролем](https://docs.owen.ru/book_img/1936/137623.png)

   <i>**Составной блок с паролем**</i>

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

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

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

### Пароль отладчика. Управление пользователями

Для ограничения возможности доступа к проекту в свойствах модуля следует задать свойство <b>*Пароль admin*</b>.

Чтобы изменение <b>*Пароль admin*</b> вступило в силу, следует перетранслировать проект.

![Свойство Пароль admin](https://docs.owen.ru/book_img/1936/137642.png)

<i>**Свойство Пароль admin**</i>

Если установлен <b>*Пароль admin*</b>, то при первом запуске модуля будет выводиться окно с запросом пароля.

![Окно ввода пароля для доступа к отладчику](https://docs.owen.ru/book_img/1936/137518.png)

<i>**Окно ввода пароля для доступа к отладчику**</i>

Окно с запросом пароля отладчика появляется только **1 раз**. Если пароль введен неверно, то запуск отладчика будет выдавать ошибку, а окно ввода пароля уже не появится.

Чтобы ввести корректный пароль, следует щелкнуть по модулю в дереве ПКМ и выбрать команду <b>*Задать пароль*</b>, ввести пароль в появившемся окне.

![Задать пароль](https://docs.owen.ru/book_img/1936/137641.png)

<i>**Задать пароль**</i>

Также в среде есть возможность установить пароли для пользователей <b>*user1*</b>…<b>*user7*</b>. Итого **8** прав доступа – **1** <b>*admin*</b> и **7** <b>*user*</b>. Их можно использовать для ограничения доступа к данным проекта клиентам по протоколу **OPC UA**. См. подробнее в документе [Обмен с верхним уровнем. Библиотека paOpcUA](https://owen.ru/product/polygon/documentation).

![Задание паролей пользователей](https://docs.owen.ru/book_img/1936/137640.png)

<i>**Задание паролей пользователей**</i>

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

## paCore. Основная библиотека проекта

В данном разделе приведено описание основных блоков обязательной в проекте библиотеки <b>*paCore*</b>. Описание соответствует версии библиотеки – **979** и выше.

Об установке библиотек см. в [разделе](#topic-95980).

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

### Работа с типами данных

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

#### Типы данных

**Типы данных paCore**

| Обозначение в среде | Название типа | Описание | Размер в памяти | Диапазон значений | Аналоги названий |
| --- | --- | --- | --- | --- | --- |
| <b>*chr, i8*</b> | Байт | Целое значение со знаком. Signed 8-bit integer | 1 байт | -128…127 | sint, int8, TINYINT, INT1 |
| <b>*uch, ui8, reg*</b> | Байт без знака | Целое значение без знака. Unsigned 8-bit integer | 1 байт | 0…255 | Byte |
| <b>*int, i16*</b> | Целое | Целое значение со знаком. Signed 16-bit integer | 2 байта | -32768…32767 | INT, SMALLINT, INT2 |
| <b>*uns, u16, rg2*</b> | Целое без знака | Целое значение без знака. Unsigned 16-bit integer | 2 байта | 0…65535 | WORD |
| <b>*lng, i32, l32*</b> | Длинное целое | Целое значение со знаком. Signed 32-bit integer | 4 байта | -2147483648…2147483647 | DINT, INT4 |
| <b>*ulg, u32, rg4, ul32*</b> | Длинное целое без знака | Целое значение без знака. Unsigned 32-bit integer | 4 байта | 0…<br>4294967295 | UDINT |
| <b>*i64*</b> | Двойное длинное целое | Двойное целое значение со знаком. Signed 64-bit integer | 8 байт | -9223372036854775808…9223372036854775807 | - |
| <b>*u64*</b> | Двойное длинное целое без знака | Двойное целое значение без знака. Unsigned 64-bit integer | 8 байт | 0…18446744073709551615 | - |
| <b>*flt*</b> | Вещественное | Вещественное значение со знаком. Данные в формате с плавающей запятой | 4 байта | -3.4E+38…<br>1.18E-38<br>и<br>1.18E-38…<br>3.4E+38 | Float, Real |
| <b>*double*</b> | Вещественное двойное | Вещественное значение со знаком. Данные в формате с плавающей запятой | 8 байта | -1.7E+308…<br>1.18E-308<br>и<br>1.18E-308…<br>1.7E+308 | Double |
| <b>*b, bool, boolean, bit*</b> | Логический | Принимает значение 0 или 1 | 1 бит | 0,1 | Bit |
| <b>*s40, s50, s100, str*</b> | Строковый | Cтроки символов | -<b>\*</b> | - | String |

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

Кроме представленных в таблице типов данных используются массивы и перечисления.

<b>*Массив*</b> – массив данных определенного типа:

- <b>*i32a*</b> - массив типа **int32**;
- <b>*fa*</b> - массив данных типа **float**.

<b>*Перечисление*</b> – список констант, определяемый конкретным входом. Для входа с типом Перечисление невозможно задать значение, отличное от заданных в выпадающем списке. Обозначение: <b>*enm*</b>.

<b>*Очередь битов*</b> – позволяет накапливать очередь битовых значений в таймерном потоке. Обозначение: <b>*qb*</b>. Подробнее в [разделе](#topic-96235).

Другие типы в разделе <b>*Типы данных*</b>, кроме вышеперечисленных, являются **системными**.

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

Цвет связей отображает тип данных входа:

- <b>*черный*</b> – булевое;
- <b>*красный*</b> – целое;
- <b>*синий*</b> – вещественное;
- <b>*серый*</b> – строковое.

Преобразование типов также можно осуществить вручную, используя блоки раздела [Преобразователи типов](#topic-96066).

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

Если вход/выход блока имеет системный тип данных, то создать связь можно **только** с выходом/входом **того же** типа.

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

#### Преобразователи типов

Преобразование типов можно осуществить вручную, используя блоки <b>*Flt*</b><b>*\_*</b><b>*Un*</b>, <b>*Flt*</b><b>*\_*</b><b>*Ul*</b>, <b>*Uc*</b><b>*\_*</b><b>*flt*</b>, <b>*Us*</b><b>*\_*</b><b>*Flt*</b> и др. из раздела <b>*Преобразователи типов*</b>.

Блок преобразует значение одного [типа данных](#topic-96065) в другой.

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

Алгоритм:

```
out = in
```

![Преобразователи типов](https://docs.owen.ru/book_img/1936/137639.png)

<i>**Преобразователи типов**</i>

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

#### Константы

Блоки <b>*Константа*</b> повторяют на выходе значение входа – <b>*Real*</b>, <b>*Integer*</b>, <b>*Reg*</b><b>*2*</b> и др. из раздела <b>*Преобразователи типов*</b>. Блок инициализируется константой на входе, не нулем.

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

```
y = fi
```

Алгоритм:

```
y = fi
```

![Константы](https://docs.owen.ru/book_img/1936/137638.png)

*Константы*

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

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

<b>*Терминальные блоки*</b> повторяют на выходе значение входа – <b>*TransFlt*</b>, <b>*TransInt*</b>, <b>*TransBit*</b> и др. Данные блоки удобно использовать в качестве сбора входных и выходных параметров на одной странице программы. Блок инициализируется константой на входе, не нулем.

Назначение входов и выходов:

- **l****0**, **l****1**, **…**,**ln** – входные значения;
- **o****0**, **o****1**, **…**,**on** – выходные значения.

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

```
oi = li, где I = 0…n
```

Алгоритм:

```
oi = li, где I = 0…n
```

![Терминальные блоки](https://docs.owen.ru/book_img/1936/137637.png)

<i>**Терминальные блоки**</i>

Для передачи массивов используются терминальные блоки <b>*Transi*</b><b>*32*</b><b>*A*</b>, <b>*TransFA*</b>, <b>*TransStor*</b> и др. Блок повторяет на выходе массив соответствующего входа. Данные блоки удобно использовать в качестве сбора входных и выходных параметров на одной странице программы. Блок инициализируется массивом на входе, не нулем.

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

Назначение входов и выходов:

- **in****0**, **in****1**, **…**,**inn** – входные массивы;
- **o****0**, **o****1**, **…**,**on** – выходные массивы.

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

```
oi = ini, где I = 0…n
```

Алгоритм:

```
oi = ini, где I = 0…n
```

![Терминальные блоки передачи массивов](https://docs.owen.ru/book_img/1936/137636.png)

<i>**Терминальные блоки передачи массивов**</i>

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

### Арифметические блоки

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

#### Сложение (Add)

Функция <b>*Add*</b> вычисляет сумму своих входов. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **f****0**, **f****1**, **…**,**fn** – слагаемые;
- **sum** – сумма.

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

```
sum = 0
```

Алгоритм:

```
sum = f0 + f1 + … + fn
```

![Сложение (Add)](https://docs.owen.ru/book_img/1936/137635.png)

*<b>Сложение (</b>Add<b>)</b>*

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

#### Целочисленное сложение (Addl)

Функциональный блок <b>*Addl*</b> производит целочисленное сложение. Аргументы являются целыми числами. Если на вход подается связь с выхода другого типа, то при выполнении программы происходит преобразование типов. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in****0**, **in****1**, **…**,**inn** – слагаемые;
- **sum** – сумма.

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

```
sum = 0
```

Алгоритм:

```
sum = in0 + in1 + … + inn
```

![Целочисленное сложение (Addl)](https://docs.owen.ru/book_img/1936/137634.png)

<i>**Целочисленное сложение (Addl)**</i>

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

#### Вычитание (Sub)

Функция <b>*Sub*</b> вычисляет разность двух аргументов. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **f****1** – уменьшаемое;
- **f****2** – вычитаемое;
- **out** – разность.

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

```
out = 0
```

Алгоритм:

```
out = f1 - f2
```

![Вычитание (Sub)](https://docs.owen.ru/book_img/1936/137633.png)

<i>**Вычитание (Sub)**</i>

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

#### Умножение (Mul)

Функция <b>*Mul*</b> вычисляет произведение своих входов. Число входов задается при создании функционального блока, и может быть изменено в процессе редактирования программы. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **f****0**, **f****1**, **…**,**fn** – множитель;
- **out** – произведение множителей.

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

```
out = 0
```

Алгоритм:

```
out = f1 ∙ f2 ∙…∙ fn
```

![Умножение (Mul)](https://docs.owen.ru/book_img/1936/137662.png)

<i>**Умножение (Mul)**</i>

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

#### Деление (Div)

Функция <b>*Div*</b> вычисляет частное своих аргументов. Если делитель равен нулю, то выставляется флаг ошибки, на выходе устанавливается **1**. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **1**.

Назначение входов и выходов:

- **f****1** – делимое;
- **f****2** – делитель;
- **out** – частное от деления;
- **zf** – флаг ошибки.

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

```
out = 1;
zf = 0
```

Алгоритм:

```
Если f2 = 0 → zf = 1, out = 1,
иначе out = f1/f2, zf = 0
```

![Деление (Div)](https://docs.owen.ru/book_img/1936/137661.png)

<i>**Деление (Div)**</i>

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

#### Целочисленное деление (Divl)

Функция <b>*Divl*</b> производит целочисленное деление. Вычисляет неполное частное и остаток. Если делитель равен нулю, то выставляется флаг ошибки, на выходе остается прежнее значение. Аргументы являются целыми числами. Если на вход подается связь с выхода другого типа, то при выполнении программы происходит преобразование типов. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **1**.

Назначение входов и выходов:

- **i****1** – делимое;
- **i****2** – делитель;
- **out** – частное от деления;
- **rem** – остаток от деления;
- **zf** – флаг ошибки.

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

```
out = 1;
rem = 0;
zf = 0
```

Алгоритм:

```
Если i2 = 0 → zf = 1, out = out_old,
иначе out = i1/i2, rem = i1 - (out ∙ i2), zf = 0,
где out_old – значение выхода в предыдущем цикле выполнения программы
```

![Целочисленное деление (Divl)](https://docs.owen.ru/book_img/1936/137660.png)

<i>**Целочисленное деление (Divl)**</i>

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

#### Корень квадратный (Sqrt)	

Функция <b>*Sqrt*</b> вычисляет корень квадратный своего аргумента. Если аргумент отрицательный, то выставляется флаг ошибки, на выходе корень квадратный из модуля аргумента. Аргумент является вещественным числом. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in** – аргумент;
- **out** – значение корня квадратного от аргумента;
- **nf** – флаг ошибки.

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

```
out = 0;
zf = 0
```

Алгоритм:

```
Если in ≤ 0 → nf = 1, out = √(|in|),
иначе out = √in, nf = 0
```

![Корень квадратный (Sqrt)](https://docs.owen.ru/book_img/1936/137659.png)

*Корень квадратный (Sqrt)*

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

#### Инверсия значения (Inv)

Функция <b>*Inv*</b> инвертирует знак входного значения. Аргумент является вещественным числом. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – аргумент;
- **out** – инвертированный вход.

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

```
out = 0
```

Алгоритм:

```
out = -in
```

![Инверсия значения (Inv)](https://docs.owen.ru/book_img/1936/137658.png)

<i>**Инверсия значения (Inv)**</i>

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

#### Абсолютное значение (Abs)	

Функция <b>*Abs*</b> определяет модуль и знак числа. Если на вход подается отрицательное значение, то выставляется флаг знака. Аргумент является вещественным числом. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in** – аргумент;
- **out** – модуль входа;
- **sf** – флаг знака.

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

```
out = 0,
sf = 0
```

Алгоритм:

```
out = |in|, sf – знак in,
если in > 0 → sf = 0,
иначе sf = 1
```

![Абсолютное значение (Abs)](https://docs.owen.ru/book_img/1936/137657.png)

<i>**Абсолютное значение (Abs)**</i>

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

#### Минимальное/максимальное значение (MinMax)

Функция <b>*MinMax*</b> ищет минимальное и максимальное значения среди набора входов. Число входов задается при создании функционального блока, его можно изменить в процессе редактирования программы. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in****0**, **in****1**, **…**,**inn** – входы;
- **max** – максимальное значение;
- **min** – минимальное значение.

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

```
max = 0,
min = 0
```

Алгоритм:

```
min = min (in0, in1, …, inn),
max = max (in0, in1, …, inn)
```

![Минимальное-максимальное значение (Min Max)](https://docs.owen.ru/book_img/1936/137656.png)

<i>**Минимальное/максимальное значение (MinMax)**</i>

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

#### Селектор минимального/максимального значения (MinMax2)

Функция <b>*MinMax*</b><b>*2*</b> ищет минимальное и максимальное значения среди набора входов, и определяет индекс минимального и максимального входа. Число входов задается при создании функционального блока, его можно изменить в процессе редактирования программы. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in****0**, **in****1**, **…**,**inn** – входы;
- **max** – максимальное значение;
- **min** – минимальное значение;
- **mxn** – индекс максимума;
- **mnn** – индекс минимума.

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

```
max = 0,
min = 0,
mxn = 0,
mnn = 0
```

Алгоритм:

```
min = min (in0, in1, …, inn),
max = max (in0, in1, …, inn),
mxn – индекс максимального значения,
mnn – индекс минимального значения
```

![Селектор минимального-максимального значения (Min Max2)](https://docs.owen.ru/book_img/1936/137655.png)

<i>**Селектор минимального/максимального значения (MinMax2)**</i>

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

#### Сравнение (Cmpr)

Функция <b>*Cmpr*</b> сравнивает два входа. В зависимости от их отношения выставляет флаги больше, меньше или равно. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in****1** – вход 1;
- **in****2** – вход 2;
- **uf** – флаг «больше»;
- **ef** – флаг «равно»;
- **if** – флаг «меньше».

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

```
uf = 0,
ef = 0,
if = 0
```

Алгоритм:

![Сравнение (Cmpr)](https://docs.owen.ru/book_img/1936/137654.png)

<i>**Сравнение (Cmpr)**</i>

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

#### Маскирование (Mask)

Функция <b>*Mask*</b> производит побитное умножение аргумента на маску. Аргументы являются целыми числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **i****1** – вход;
- **i****2** – маска;
- **out** – выход.

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

```
out = 0
```

Алгоритм:

```
out = i1 & i2
```

![Маскирование (Mask)](https://docs.owen.ru/book_img/1936/137653.png)

<i>**Маскирование (Mask)**</i>

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

#### Сдвиг влево (Shrl)

Функция <b>*Shrl*</b> производит побитовый сдвиг влево числа **i****1** на **i****2** бит. Аргументы являются целыми числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **i****1** – вход;
- **i****2** – величина сдвига;
- **out** – выход.

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

```
out = 0
```

Алгоритм:

```
out = i1 ≪ i2
```

![Сдвиг влево (Shrl)](https://docs.owen.ru/book_img/1936/137682.png)

<i>**Сдвиг влево (Shrl)**</i>

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

#### Сдвиг вправо (Shrr)

Функция <b>*Shrr*</b> производит побитовый сдвиг вправо числа **i****1** на **i****2** бит. Аргументы являются целыми числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **i****1** – вход;
- **i****2** – величина сдвига;
- **out** – выход.

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

```
out = 0
```

Алгоритм:

```
out = i1 ≫ i2
```

![Сдвиг вправо (Shrr)](https://docs.owen.ru/book_img/1936/137681.png)

<i>**Сдвиг вправо (Shrr)**</i>

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

#### Табличная функция (TabF)

Функциональный блок производит кусочно-линейную аппроксимацию зависимости **y = f(x)**, заданной табличной функцией, и вычисление в заданной точке. Табличная функция задается набором пар **(x****,** **y)**. Для корректной работы блока наборы пар **(x****,** **y)** должны быть упорядочены по возрастанию **x**. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **val** – значение **x**;
- **x****0**, **x****1**, **...**, **xn** – набор абсцисс;
- **y****0**, **y****2**, **...**, **yn** – набор соответствующих ординат;
- **out** – значение **y**.

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

```
out = 0
```

Алгоритм: при нахождении значения функции используется алгоритм кусочно-линейной аппроксимации

```
Если val < x0 → out = y0,
если val > xn → out = yn
```

![Табличная функция (Tab F)](https://docs.owen.ru/book_img/1936/137680.png)

<i>**Табличная функция (TabF)**</i>

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

#### Экспонента (Exp)	

Функция <b>*Exp*</b> производит вычисление экспоненциальной функции от своего аргумента. Аргумент является вещественным числом. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – аргумент;
- **out** – выход, значение ограничено интервалом **\[exp(-37)****,** **exp(10)\]**.

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

```
out = 0
```

Алгоритм:

```
out = exp(in)
```

![Экспонента (Exp)](https://docs.owen.ru/book_img/1936/137679.png)

<i>**Экспонента (Exp)**</i>

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

#### Логарифм (Ln)

Функция <b>*Ln*</b> вычисляет натуральный логарифм своего аргумента. Аргумент является вещественным числом. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **1**.

Назначение входов и выходов:

- **in** – аргумент;
- **out** – выход, снизу ограничен **ln(1.0****e** **- 15)**.

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

```
out = 1
```

Алгоритм:

```
out = ln(in)
```

![Логарифм (Ln)](https://docs.owen.ru/book_img/1936/137678.png)

<i>**Логарифм (Ln)**</i>

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

#### Возведение в степень (Pow)	

Функция <b>*Pow*</b> производит возведение в степень аргумента функции. Если производится возведение в степень отрицательного числа в нецелочисленную степень, то степень округляется до ближайшей целой. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выход инициализируется **1**.

Назначение входов и выходов:

- **in** – аргумент;
- **pw** – степень;
- **out** – выход, значение ограничено интервалом **\[1.0e - 18; 1.0e + 18\]**.

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

```
out = 1
```

Алгоритм:

```
out = inpw
```

![Возведение в степень (Pow)](https://docs.owen.ru/book_img/1936/137677.png)

<i>**Возведение в степень (Pow)**</i>

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

#### Сложение некоторых слагаемых (SumGR)

Блок <b>*SumGR*</b> вычисляет сумму входов, у которых **en ≠ 0**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in****0**, **in****1**, **...**, **inn** – слагаемые;
- **en****0**, **en****1**, **...**, **enn** – разрешающие флаги;
- **sum** – сумма;
- **cnt** – количество слагаемых.

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

```
sum = 0,
cnt = 0
```

Алгоритм: при нахождении значения функции используется алгоритм кусочно-линейной аппроксимации

```
Если en0, en1, …, enn ≠ 0 → sum = in0 + in1 + … + inn, cnt = n
```

![Сложение некоторых слагаемых (Sum GR)](https://docs.owen.ru/book_img/1936/137676.png)

<i>**Сложение некоторых слагаемых (SumGR)**</i>

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

#### Пакетное умножение и округление (mb_ai)

Блок <b>*mb*</b><b>*\_*</b><b>*ai*</b> производит умножение входа на множитель. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **x****0**, **x****1**, **...**, **xn** – аргументы;
- **m0**, **m****1**, **...**, **mn** – множители;
- **y****0**, **y****1**, **...**, **yn** – выходы.

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

```
y0, y1, ..., yn = 0
```

Алгоритм:

```
yi = xi ∙ mi, I = 1, 2, …, n
```

![Пакетное умножение и округление (mb ai)](https://docs.owen.ru/book_img/1936/137675.png)

<i>**Пакетное умножение и округление (mb_ai)**</i>

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

#### Пакетное умножение (mb_ao)

Блок <b>*mb*</b><b>*\_*</b><b>*ao*</b> производит умножение входа на множитель. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Аргументы являются целыми числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **x****0**, **x****1**, **...**, **xn** – аргументы;
- **m0**, **m****1**, **...**, **mn** – множители;
- **y****0**, **y****1**, **...**, **yn** – выходы.

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

```
y0, y1, ..., yn = 0
```

Алгоритм: 

```
yi = xi ∙ mi, I = 1, 2, …, n
```

![Пакетное умножение (mb ao)](https://docs.owen.ru/book_img/1936/137674.png)

*Пакетное умножение (mb_ao)*

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

#### Округление (flt_round)

Блок <b>*flt*</b><b>*\_*</b><b>*round*</b> вычисляет несколько вариантов округления для входного значения. Аргумент является вещественным числом. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in** – значение;
- **rnd** – до ближайшего целого;
- **up** – в большую сторону;
- **dn** – в меньшую сторону.

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

```
rnd = 0,
up = 0,
dn = 0
```

![Округление (flt round)](https://docs.owen.ru/book_img/1936/137673.png)

<i>**Округление (flt_round)**</i>

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

#### Определение знака (Sign)	

Функция <b>*Sign*</b> производит определение знака входного значения относительно базового. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in** – вход;
- **x****0** – базовое значение;
- **out** – знак;
- **inv** – инверсия знака;
- **zer**– признак равенства.

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

```
out = 0,
inv = 0,
zer = 0
```

Алгоритм:

![Определение знака (Sign](https://docs.owen.ru/book_img/1936/137702.png)

*Определение знака (Sign)*

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

#### Переворачивание байт в слове (SwapBytes)

Функция <b>*SwapBytes*</b> меняет местами байты в двухбайтном числе. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Аргументы являются целыми числами. Раздел библиотеки: <b>*Арифметические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **in0**, **in1**, ..., **inn** – входы
- **o0**,**o1**, **...**, **on** – выходы.

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

```
o0, o1, ..., on = 0
```

Алгоритм:

```
ini [byte1, byte2] → oi = ini [byte2, byte1], I = 1, 2, …, n
```

![Переворачивание байт в слове (Swap Bytes)](https://docs.owen.ru/book_img/1936/137701.png)

*Переворачивание байт в слове (SwapBytes)*

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

#### Арифметические блоки для аргументов double, long, Uint64

Арифметические блоки для аргументов <b>*double*</b>, <b>*long*</b>, <b>*Uint*</b><b>*64*</b> представлены в соответствующих группах в разделе библиотеки <b>*Арифметические*</b>. Описание представленных блоков аналогично описанию соответствующих блоков, приведенному выше.

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

### Логические блоки

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

#### Логическое И (AND)

Функциональный блок <b>*AND*</b> производит логическое умножение своих входов. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****0**, **b****1**, **...**, **bn** – входы;
- **q** – логическое произведение;
- **inv** – инвертированное логическое произведение.

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

```
q = 0,
inv = 1
```

Алгоритм: 

```
q = b0 & b1 &…& bn, inv = !(q)
```

Пример для блока с двумя входами:

![Логическое И (AND)](https://docs.owen.ru/book_img/1936/137700.png)

<i>**Логическое И (AND)**</i>

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

#### Логическое ИЛИ (OR)

Функциональный блок <b>*OR*</b> производит логическое сложение своих входов. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****0**, **b****1**, **...**, **bn** – входы;
- **q** – логическое сложение;
- **inv** – инвертированное логическое сложение.

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

```
q = 0,
inv = 1
```

Алгоритм: 

```
q = b0 ∪ b1 ∪ … ∪ bn, inv = !(q)
```

Пример для блока с двумя входами:

![Логическое ИЛИ (OR)](https://docs.owen.ru/book_img/1936/137699.png)

*<b>Логическое ИЛИ (</b>OR<b>)</b>*

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

#### Логическое НЕ-И (nAND)

Функциональный блок <b>*nAND*</b> производит логическое умножение с инверсией своих входов. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****0**, **b****1**, **...**, **bn** – входы;
- **q** – логическое произведение инверсных входов;
- **inv** – инвертированное **q**.

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

```
q = 0,
inv = 1
```

Алгоритм:

```
q = !(b0) & !(b1) & … & !(bn), inv = !(q)
```

Пример для блока с двумя входами:

![Логическое НЕ-И (n AND)](https://docs.owen.ru/book_img/1936/137698.png)

<i>**Логическое НЕ-И (nAND)**</i>

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

#### Логическое НЕ (NOT)

Функциональный блок <b>*NOT*</b> производит логическую инверсию своего входа. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****1** – вход;
- **q** – логическое отрицание.

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

```
q = 0
```

Алгоритм:

```
q = !(b1)
```

![Логическое НЕ (NOT)](https://docs.owen.ru/book_img/1936/137697.png)

<i>**Логическое НЕ (NOT)**</i>

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

#### Логическое НЕ-ИЛИ (nOR)

Функциональный блок <b>*nOR*</b> производит логическое сложение с инверсией своих входов. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****0**, **b****1**, **...**, **bn** – входы;
- **q** – логическое сложение инверсных входов;
- **inv** – инвертированное **q**.

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

```
q = 0,
inv = 1
```

Алгоритм:

```
q = !(b0) ∪ !(b1) ∪ … ∪ !(bn), inv = !(q)
```

![Логическое НЕ-ИЛИ (n OR)](https://docs.owen.ru/book_img/1936/137696.png)

<i>**Логическое НЕ-ИЛИ (nOR)**</i>

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

#### Логическое сложение по модулю два (XOR)

Функциональный блок <b>*XOR*</b> производит логическое суммирование по модулю два своих входов. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****1**, **b****2** – входы;
- **q** – сумма по модулю два.

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

```
q = 0
```

Алгоритм:

```
q = b1 ⊕ b2
```

![Логическое сложение по модулю два (XOR)](https://docs.owen.ru/book_img/1936/137695.png)

<i>**Логическое сложение по модулю два (XOR)**</i>

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

#### Логическое ИЛИ с блокировкой (Bl_Or)

Функциональный блок <b>*Bl*</b><b>*\_*</b><b>*Or*</b> осуществляет алгоритм логического ИЛИ среди входов **x** и **y**. Наличие единицы на входе блокировки запрещает все выходы, кроме собственного. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Логические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **x****0**, **x****1**, **...**, **xn** – входы;
- **y****0**, **y****1**, **...**, **yn** – соответствующие блокировки;
- **out****0**, **out****1**, **...**, **outn** – выходы.

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

```
out0, out1, ..., outn = 0
```

Алгоритм:

```
outi = xi | yi & !(y0 | y1 | … | yi – 1 | yi + 1 │ … | yn)
```

![Логическое ИЛИ с блокировкой (Bl Or)](https://docs.owen.ru/book_img/1936/137694.png)

<i>**Логическое ИЛИ с блокировкой (Bl_Or)**</i>

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

#### Детектор фронтов (Fronts)

Функциональный блок <b>*Fronts*</b> сравнивает предыдущее значение входа с настоящим и анализирует на наличие фронтов и спадов. Раздел библиотеки: <b>*Логические*</b>. Выходы инициализируются **0**.

Назначение входов и выходов:

- **i** – вход;
- **f****01** – бит, сигнализирующий о приходе фронта на входе;
- **f****10** – бит, сигнализирующий о приходе спада на входе.

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

```
f01 = 0,
f10 = 0
```

Алгоритм:

```
Если i_old = 0 & i = 1 → f01 = 1,
если i_old = 1 & i = 0 → f10 = 1,
где i_old – значение входа на предыдущем цикле выполнения программы
```

![Детектор фронтов (Fronts)](https://docs.owen.ru/book_img/1936/137693.png)

<i>**Детектор фронтов (Fronts)**</i>

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

#### Детектор логического канала (bDetect)

Функциональный блок <b>*bDetect*</b> определяет номер входа, на котором произошел перепад значения из **0** в **1**. Если перепад произошел на нескольких входах, обнаруживается только самый поздний. Если перепада нет ни на одном входе, то **num = -1**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****0**, **b****1**, **...**, **bn** – входы;
- **num** – номер входа, на котором произошел перепад.

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

```
num = 0
```

Алгоритм: **num** – номер входа, на котором произошел перепад из **0** в **1**, начинается с **0**

![Детектор логического канала (b Detect)](https://docs.owen.ru/book_img/1936/137722.png)

*Детектор логического канала (bDetect)*

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

#### Контроль ключа (LogContr)

Функциональный блок <b>*LogContr*</b> определяет запрещенные состояния ключа, которые задаются двумя логическими сигналами. Раздел библиотеки: <b>*Логические*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **b****0**, **b****1** – входы;
- **n****\_****z** – запрещенное состояние;
- **m****\_1** – больше одной единицы.

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

```
n_z = 0,
m_1 = 0
```

Алгоритм:

![Контроль ключа (Log Contr)](https://docs.owen.ru/book_img/1936/137721.png)

*Контроль ключа (LogContr)*

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

### Тригонометрические функции

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

#### Синус (Sin)

Функция <b>*Sin*</b> вычисляет синус аргумента. Раздел библиотеки: <b>*Тригонометрические функции*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – вход;
- **out** – выход.

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

```
out = 0
```

Алгоритм:

```
out = sin(in)
```

![Синус (Sin)](https://docs.owen.ru/book_img/1936/137720.png)

<i>**Синус (Sin)**</i>

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

#### Косинус (Cos)

Функция <b>*Cos*</b> вычисляет косинус аргумента. Раздел библиотеки: <b>*Тригонометрические функции*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – вход;
- **out** – выход.

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

```
out = 0
```

Алгоритм:

```
out = cos(in)
```

![Косинус (Cos)](https://docs.owen.ru/book_img/1936/137719.png)

<i>**Косинус (Cos)**</i>

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

#### Тангенс (Tan)

Функция <b>*Tan*</b> вычисляет тангенс аргумента. Раздел библиотеки: <b>*Тригонометрические функции*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – вход;
- **out** – выход.

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

```
out = 0
```

Алгоритм: 

```
out = tan(in)
```

![Тангенс (Tan](https://docs.owen.ru/book_img/1936/137718.png)

<i>**Тангенс (Tan)**</i>

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

#### Арктангенс (ATan)

Функция <b>*ATan*</b> вычисляет арктангенс аргумента. Раздел библиотеки: <b>*Тригонометрические функции*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – вход;
- **out** – выход, диапазон изменения **\[-π/2 ≤ out ≤ π/2\]**.

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

```
out = 0
```

Алгоритм: 

```
out = atan(in)
```

![Арктангенс (ATan)](https://docs.owen.ru/book_img/1936/137717.png)

<i>**Арктангенс (ATan)**</i>

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

#### Арксинус (ASin)

Функция <b>*ASin*</b> вычисляет арксинус аргумента. Раздел библиотеки: <b>*Тригонометрические функции*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – вход, диапазон изменения **\[-1.0 ≤** **in** **≤ 1.0\]**;

- **out** – выход, диапазон изменения **\[-π/2 ≤ out ≤ π/2\]**

  ;

- **q** – флаг ошибки.

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

```
out = 0,
q = 0
```

Алгоритм: 

```
Если -1.0 ≤ in ≤ 1.0 → out = asin(in), q = 0,
если in > 1 → out = π/2, q = 1,
если in < -1 → out = -π/2, q = 1
```

![Арксинус (ASin)](https://docs.owen.ru/book_img/1936/137716.png)

<i>**Арксинус (ASin)**</i>

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

#### Арккосинус (ACos)

Функция <b>*ACos*</b> вычисляет арксинус аргумента. Раздел библиотеки: <b>*Тригонометрические функции*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **in** – вход, диапазон изменения **\[-1.0 ≤** **in** **≤ 1.0\]**;
- **out** – выход, диапазон изменения **\[0 ≤ out ≤ π\]**;
- **q** – флаг ошибки.

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

```
out = 0,
q = 0
```

Алгоритм:

```
Если -1.0 ≤ in ≤ 1.0 → out = acos(in), q = 0,
если in > 1 → out = 0, q = 1,
если in <-1 → out = π, q = 1
```

![Арккосинус (ACos)](https://docs.owen.ru/book_img/1936/137715.png)

<i>**Арккосинус (ACos)**</i>

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

### Переключатели, реле и мультиплексоры

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

#### Дешифратор (Decoder)

Функциональный блок <b>*Decoder*</b> выставляет **1** на одном из своих выходов. Индекс выхода задает входная переменная. Если значение входа выходит за рамки интервала **\[0…количество выходов - 1\]**, то все выходы равны **0**. Число выходов задается при создании функционального блока, которые задаются в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **sel** – номер выхода;
- **o****0**, **o****1**, **...**, **on** – выходы.

Алгоритм:  

```
o[sel] = 1
```

![Дешифратор (Decoder)](https://docs.owen.ru/book_img/1936/137714.png)

<i>**Дешифратор (Decoder)**</i>

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

#### Ключ (Key)

Функциональный блок <b>*Key*</b> передает значение своего входа на выход при **1** на управляющем входе и выдает **0** на выходе при **0** на управляющем входе. Раздел библиотеки: <b>*Переключатели*</b>**,** <b>*реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **x** – вход;
- **i** – управляющий вход;
- **out** – выход.

Алгоритм: 

```
Если i = 1 → out = x,
иначе out = 0
```

![Ключ (Key)](https://docs.owen.ru/book_img/1936/137713.png)

<i>**Ключ (Key)**</i>

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

#### Коммутатор 8-битных регистров (R8Switch)

Функциональный блок <b>*R*</b><b>*8*</b><b>*Switch*</b> передает на свой выход значение одного из своих входов в зависимости от управляющего сигнала **i**. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **in****1**, **in****2** – входы типа [reg](#topic-96065);
- **i** – управляющий бит;
- **out** – выход типа [reg](#topic-96065).

Алгоритм: 

```
Если i = 1 → out = in1,
иначе out = in2
```

![Коммутатор 8-битных регистров (R8Switch)](https://docs.owen.ru/book_img/1936/137742.png)

<i>**Коммутатор 8-битных регистров (R8Switch)**</i>

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

#### Коммутатор вещественных переменных (fSwitch)

Функциональный блок <b>*fSwitch*</b> передает на свой выход значение одного из своих входов в зависимости от управляющего сигнала **i**. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **x****1**, **x****2** – входы типа [flt](#topic-96065);
- **i** – управляющий бит;
- **out** – выход типа [flt](#topic-96065).

Алгоритм: 

```
Если i = 1 → out = x1,
иначе out = x2
```

![Коммутатор вещественных переменных (f Switch)](https://docs.owen.ru/book_img/1936/137741.png)

<i>**Коммутатор вещественных переменных (fSwitch)**</i>

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

#### Коммутатор логических переменных (lSwitch)

Функциональный блок <b>*lSwitch*</b> передает на свой выход значение одного из своих входов в зависимости от управляющего сигнала **i**. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **x****1**, **x****2** – входы логического типа;
- **i** – управляющий бит;
- **out** – выход логического типа.

Алгоритм:

```
Если i = 1 → out = x1,
иначе out = x2
Если i = 1 → out = x1,
иначе out = x2
```

![Коммутатор логических переменных (l Switch)](https://docs.owen.ru/book_img/1936/137740.png)

<i>**Коммутатор логических переменных (lSwitch)**</i>

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

#### Коммутатор строковых переменных (txtSwitch)

Функциональный блок <b>*txtSwitch*</b> передает на свой выход значение одного из своих входов в зависимости от управляющего сигнала **i**. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **str****1**, **str****2** – входы типа [str](#topic-96065);
- **cross** – управляющий бит;
- **str****1****o**, **str****2****o** – выходы типа [str](#topic-96065).

Алгоритм:

```
Если cross = 1 → str1o = str2, str2o = str1,
иначе str1o = str1, str2o = str2
```

![Коммутатор строковых переменных (txt Switch)](https://docs.owen.ru/book_img/1936/137739.png)

<i>**Коммутатор строковых переменных (txtSwitch)**</i>

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

#### Коммутатор целых переменных (iSwitch)

Функциональный блок <b>*iSwitch*</b> передает на свой выход значение одного из своих входов в зависимости от управляющего сигнала **i**. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **x****1,** **x****2** – входы целого типа;
- **i** – управляющий бит;
- **out** – выход целого типа.

Алгоритм:  

```
Если i = 1 → out = x1, 
иначе out = x2
```

![Коммутатор целых переменных (i Switch)](https://docs.owen.ru/book_img/1936/137738.png)

<i>**Коммутатор целых переменных (iSwitch)**</i>

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

#### Релейный каскад вещественных переменных (fltRelay)

Функциональный блок <b>*fltRelay*</b> в зависимости от управляющего входа передает на каждый свой выход значение одного из входов группы с тем же индексом. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **x****0**, **x****1**, **…**, **xn** – входы типа [flt](#topic-96065);
- **y****0**, **y****1**, **…**, **yn** – входы типа [flt](#topic-96065);
- **upr** – управляющий бит;
- **o****0**, **o****1**, **…**, **on** – выходы типа [flt](#topic-96065).

Алгоритм:

```
Если upr = 1 → oi = xi,
иначе oi = yi, где i = 1, 2, …, n
```

![Релейный каскад вещественных переменных (flt Relay)](https://docs.owen.ru/book_img/1936/137737.png)

<i>**Релейный каскад вещественных переменных (fltRelay)**</i>

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

#### Релейный каскад логических переменных (logRelay)

Функциональный блок <b>*logRelay*</b> в зависимости от управляющего входа передает на каждый свой выход значение одного из входов группы с тем же индексом. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **x****0**, **x****1**, **…**, **xn** – входы логического типа;
- **y****0**, **y****1**, **…**, **yn** – входы логического типа;
- **upr** – управляющий бит;
- **o****0**, **o****1**, **…**, **on** – выходы логического типа.

Алгоритм:

```
Если upr = 1 → oi = xi,
иначе oi = yi, где i = 1, 2, …, n
```

![Релейный каскад логических переменных (log Relay)](https://docs.owen.ru/book_img/1936/137736.png)

<i>**Релейный каскад логических переменных (logRelay)**</i>

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

#### Управление реле (SetSW)

Блок <b>*SetSW*</b> осуществляет потенциальное и импульсное управление реле с обратной связью. Выход потенциального управления **out = 1**, если управление **inp** и разрешение **enb** равны **1**.

На выходах импульсного управления **on** и **off** выдаются импульсы длиной в один таймерный интервал (если блок находится в <b>*Таймере*</b>) соответственно при включении и выключении выхода **out**.

Ошибка **err** выдается, если обратный сигнал **ret** не появился в течение таймаута **cnt** (задается в миллисекундах). Для правильной работы таймера ошибки данный блок необходимо размещать в <b>*Таймере*</b>, а значения **cnt** задавать кратными времени таймерного цикла. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **inp** – управление;
- **ret** – обратная связь;
- **cnt** – таймер ошибки, мс;
- **enb** – разрешение;
- **out** – потенциальное управление;
- **on** – включение (импульсное);
- **off** – выключение (импульсное);
- **err** – ошибка.

![Управление реле (Set SW)](https://docs.owen.ru/book_img/1936/137735.png)

<i>**Управление реле (SetSW)**</i>

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

#### Выбор одного из целых значений (SelectUI)

Блок <b>*SelectUI*</b> выводит на выход первое из входных значений, для которого **en = 1**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **val****0**, **val****1**, **…**, **valn** – входы;
- **en****0**, **en****1**, **…**, **enn** – выбор входа;
- **out** – выбранное значение.

Алгоритм:  

```
Если eni = 1 → out = vali, где i = 1, 2, …, n
```

![Выбор одного из целых значений (Select UI)](https://docs.owen.ru/book_img/1936/137734.png)

<i>**Выбор одного из целых значений (SelectUI)**</i>

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

#### Вывод значения на заданный выход (ShowSW)

Блок <b>*ShowSW*</b> выводит значение входа **spc** на соответствующий выход **o** при появлении его номера на входе **num** (входы нумеруются от **1**). Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **num** – номер входа;
- **def** – значение по умолчанию;
- **spc****0**, **spc****1**, **…**, **spcn** – входы;
- **o****0**, **o****1**, **…**, **on** – выходы.

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

```
oi = def
```

Алгоритм: 

```
Для каждого входа, если i = num - 1, oi = spci, иначе oi = def
```

![Вывод значения на заданный выход (Show SW)](https://docs.owen.ru/book_img/1936/137733.png)

<i>**Вывод значения на заданный выход (ShowSW)**</i>

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

#### Мультиплексор вещественных значений (MuxFlt)

Функциональный блок <b>*MuxFlt*</b> передает значение своего входа с индексом **sel** на выход. Если индекс выходит за рамки интервала \[**0**…**количество входов - 1**\], то на выходе остается предыдущее значение. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>. Изначально выход инициализируется **0**.

Назначение входов и выходов:

- **sel** – номер входа;
- **in0**, **in1**, **…**, **inn** – входы;
- **out** – выход.

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

```
out = 0
```

Алгоритм: 

```
out = in[sel]
```

![Мультиплексор вещественных значений (Mux Flt)](https://docs.owen.ru/book_img/1936/137762.png)

<i>**Мультиплексор вещественных значений (MuxFlt)**</i>

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

#### Мультиплексор целых значений (MuxInt)

Функциональный блок <b>*MuxFlt*</b> передает значение своего входа с индексом **sel** на выход. Если индекс выходит за рамки интервала \[**0**…**количество входов - 1**\], то на выходе остается предыдущее значение. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>. Изначально выход инициализируется **0**.

Назначение входов и выходов:

- **sel** – номер входа;
- **in0**, **in1**, **…**, **inn** – входы;
- **out** – выход.

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

```
out = 0
```

Алгоритм:

```
out = in[sel]
```

![Мультиплексор целых значений (Mux Int)](https://docs.owen.ru/book_img/1936/137761.png)

<i>**Мультиплексор целых значений (MuxInt)**</i>

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

#### Выбор одного из вещественных значений (FCascSw)

Блок <b>*FCascSw*</b> выводит на выход первое из входных значений, для которого **l = 1**. Если все **l = 0**, то на выход выводится значение по умолчанию **DEF**, и признак **Q** выставляется в **1**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>. Изначально выход инициализируется **0**.

Назначение входов и выходов:

- **DEF** – значение выхода по умолчанию;
- **x****0**, **x****1**, **…**, **xn** – входы;
- **l****0**, **l****1**, **…**, **ln** – выбрать значение;
- **Y** – выход;
- **Q** – признак значения по умолчанию.

Алгоритм:

```
Если li = 1 → Y = xi, где i = 1, 2, …n,
если l0, l1, …, ln = 0 → Y = DEF, Q = 1
```

![Выбор одного из вещественных значений (FCasc Sw)](https://docs.owen.ru/book_img/1936/137760.png)

<i>**Выбор одного из вещественных значений (FCascSw)**</i>

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

#### Выбор строки (Switch_str)

Блок <b>*Switch*</b><b>*\_*</b><b>*str*</b> выводит на выход строку, для которой **cond = 1**. Если несколько входов имеют значение **cond = 1**, то на выход выводится значение строки из входа, у которого наибольший порядковый номер и **cond = 1**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

Назначение входов и выходов:

- **str0**, **str1**, …, **strn** – входы;
- **cond0**, **cond1**, **…**, **condn** – выбрать строку;
- **str_out** – выход.

Алгоритм: 

```
Если condi = 1 → str_out = stri, где i = 1, 2, …, n
```

![Выбор строки (Switch str)](https://docs.owen.ru/book_img/1936/137759.png)

<i>**Выбор строки (Switch_str)**</i>

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

#### Дешифратор уставок (Settings)

Блок <b>*Settings*</b> представляет собой дешифратор уставок. Раздел библиотеки: <b>*Переключатели, реле и мультиплексоры*</b>.

**Назначение входов и выходов Settings**

**Входы**

| Элемент | Описание |
| --- | --- |
| nust | Текущий номер уставки |
| val | Значение текущей уставки |
| nout | Номер уставки для вывода на выход **vout** |
| n0 | Начальный номер уставок **in** |
| wen | Разрешение записи из **val** в **o** |
| ren | Разрешение чтения из **o** в **vout** |
| in | Значение инициализации уставки (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| vout | Последнее прочитанное/записанное значение уставки с номером **nout** |
| wrtng | Фронт записи |
| rdng | Фронт чтения |
| o | Текущее значение уставки (циклический) |

![Дешифратор уставок (Settings)](https://docs.owen.ru/book_img/1936/137758.png)

*Дешифратор уставок (Settings)*

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

### Генераторы и таймеры

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

#### Генератор импульсов (Pulse)

Функциональный блок <b>*Pulse*</b> генерирует импульсы заданной ширины в ответ на появление фронта на его управляющем входе. Ширина импульса **T** задается в миллисекундах. Длительность паузы соответствует величине цикла, в котором размещен блок. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Для адекватной работы блока следует размещать его только в <b>*Таймере*</b>. Не рекомендуется задавать ширину импульса меньше времени таймерного цикла. Оптимальными значениями ширины импульса являются числа, кратные величине таймерного цикла (не кратные значения округляются до времени таймерного цикла в большую сторону).

Назначение входов и выходов:

- **I** – управление;
- **T** – ширина импульса, мс;
- **q** – выход.

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

```
q = 0
```

![Алг Pulse](https://docs.owen.ru/book_img/1936/137757.png)

<i>**Алгоритм блока Pulse**</i>

![Генератор импульсов (Pulse)](https://docs.owen.ru/book_img/1936/137756.png)

<i>**Генератор импульсов (Pulse)**</i>

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

#### Включение с задержкой (DelayOn)

Функциональный блок <b>*DelayOn*</b> реагирует на фронт на управляющем входе **I** через заданное время задержки **T**. Если управляющий бит сбросится, логический таймер также сбросится и будет ожидать следующего фронта на управляющем входе. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Для адекватной работы блока следует размещать его только в <b>*Таймере*</b>. Не рекомендуется задавать время задержки меньше времени таймерного цикла. Оптимальными значениями времени задержки являются числа, кратные величине таймерного цикла (не кратные значения округляются до времени таймерного цикла в большую сторону).

Назначение входов и выходов:

- **I** – управление;
- **T** – время задержки, мс;
- **q** – выход.

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

```
q = 0
```

![Ал Delay On](https://docs.owen.ru/book_img/1936/137755.png)

<i>**Алгоритм блока DelayOn**</i>

![Включение с задержкой (Delay On)](https://docs.owen.ru/book_img/1936/137754.png)

<i>**Включение с задержкой (DelayOn)**</i>

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

#### Выключение с задержкой (DelayOff)

Функциональный блок <b>*DelayOff*</b> при установлении управляющего бита **I** устанавливает выходной бит **q**, инициализирует логический таймер – блок переходит в режим ожидания спада управляющего бита. После спада управляющего бита выходной бит сбрасывается через время задержки **T**. Если до истечения времени задержки выставится управляющий бит, логический таймер сбросится и будет ожидать следующего спада управляющего бита. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Для адекватной работы блока следует размещать его только в <b>*Таймере*</b>. Не рекомендуется задавать время задержки меньше времени таймерного цикла. Оптимальными значениями времени задержки являются числа, кратные величине таймерного цикла (не кратные значения округляются до времени таймерного цикла в большую сторону).

Назначение входов и выходов:

- **I** – управление;
- **T** – время задержки, мс;
- **q** – выход.

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

```
q = 0
```

![Ал Delay Off](https://docs.owen.ru/book_img/1936/137753.png)

*Алгоритм блока DelayOff*

![Выключение с задержкой (Delay Off)](https://docs.owen.ru/book_img/1936/137782.png)

<i>**Выключение с задержкой (DelayOff)**</i>

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

#### Половинный импульс после половины паузы (HalfPulse)

Блок <b>*HalfPulse*</b> выдает импульс длительности **T****/2** после паузы **T****/2** по перепаду **0** в **1** на входе **I**. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Для адекватной работы блока следует размещать его только в <b>*Таймере*</b>. Не рекомендуется задавать время длительности меньше времени таймерного цикла. Оптимальными значениями времени длительности являются числа, кратные величине таймерного цикла (не кратные значения округляются до времени таймерного цикла в большую сторону).

Назначение входов и выходов:

- **I** – управление;
- **T** – длительность, мс;
- **q** – выход.

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

```
q = 0
```

![Ал Half Pulse](https://docs.owen.ru/book_img/1936/137781.png)

<i>**Алгоритм блока HalfPulse**</i>

![Половинный импульс после половины паузы (Half Pulse)](https://docs.owen.ru/book_img/1936/137780.png)

<i>**Половинный импульс после половины паузы (HalfPulse)**</i>

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

#### Генератор сигналов (GenSign)

Блок <b>*GenSign*</b> генерирует сигналы различной формы. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Для адекватной работы блока следует размещать его только в <b>*Таймере*</b>. Не рекомендуется задавать время длительности меньше времени таймерного цикла. Оптимальными значениями времени длительности являются числа, кратные величине таймерного цикла (не кратные значения округляются до времени таймерного цикла в большую сторону).

Назначение входов и выходов:

- **Tsg** – период сигнала в секундах;
- **Amp** – амплитуда сигнала;
- **Shf** – смещение сигнала по оси ординат;
- **Aut** – включение периодичности сигнала;
- **Dis** – сброс сигнала;
- **sin** – синусоида;
- **line** – пила;
- **sqw** – меандр;
- **l1**,**l****2** – логические биты.

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

```
sin = line = sqw = l1 = l2 = 0
```

Алгоритм:

1. Если **Aut = 0**, тогда сигналы на выходе имеют следующий вид:

   ![Алг Gen Sign при Aut = 0](https://docs.owen.ru/book_img/1936/137779.png)

   *Алгоритм блока GenSign при Aut = 0*

2. Если **Aut = 1**, тогда сигналы на выходе имеют следующий вид:

   ![Алг Gen Sign при Aut = 1](https://docs.owen.ru/book_img/1936/137778.png)

   *Алгоритм блока GenSign при Aut = 1*

   Если установить и сбросить бит **Dis**, сигнал начнет генерироваться со значения **Shf**.

![Генератор сигналов (Gen Sign)](https://docs.owen.ru/book_img/1936/137777.png)

<i>**Генератор сигналов (GenSign)**</i>

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

#### Логический таймер со взводом (AdvTimer)

Блок <b>*AdvTimer*</b> передает на выход **q** с управляющего входа после задержки по времени **T**. Взвод осуществляется по входу **set** при **I = 1**. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Для адекватной работы блока следует размещать его только в <b>*Таймере*</b>. Не рекомендуется задавать время задержки меньше времени таймерного цикла. Оптимальными значениями времени задержки являются числа, кратные величине таймерного цикла (не кратные значения округляются до времени таймерного цикла в большую сторону).

Назначение входов и выходов:

- **I** – управление;
- **T** – задержка, мс;
- **set** – задержка;
- **q** – выход;
- **t** – значение таймера.

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

```
q = 0,
t = T
```

![Ал Adv Timer](https://docs.owen.ru/book_img/1936/137776.png)

<i>**Алгоритм блока AdvTimer**</i>

![Логический таймер со взводом (Adv Timer)](https://docs.owen.ru/book_img/1936/137775.png)

<i>**Логический таймер со взводом (AdvTimer)**</i>

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

#### Генератор импульсов с заданной скважностью (PulseGeneratorEx)

Блок <b>*PulseGeneratorEx*</b> при **enbl = 1** на входе формирует на выходе логические импульсы заданной скважности: длительность импульса задается входом **t1**, длительность паузы –входом **t2**. Выходы **t_on** и **t_off** ведут отсчет текущего времени импульса и паузы, соответственно. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Для адекватной работы блока, следует размещать его только в <b>*Таймере*</b>. При работе блока в <b>*Фоне*</b> присутствует погрешность. Не рекомендуется задавать время задержки меньше времени таймерного цикла. Оптимальными значениями времени задержки являются числа, кратные величине таймерного цикла (не кратные значения округляются до времени таймерного цикла в большую сторону).

Назначение входов и выходов:

- **t1** – длительность импульса, мс;
- **t2** – длительность паузы, мс;
- **enbl** – разрешение работы;
- **out** – выход;
- **t_on** – текущее время импульса, мс;
- **t_off** – текущее время паузы, мс.

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

```
out = 0
```

![Алг Pulse Generator Ex](https://docs.owen.ru/book_img/1936/137774.png)

*Алгоритм блока PulseGeneratorEx*

![Генератор импульсов с заданной скважностью (Pulse Generator Ex)](https://docs.owen.ru/book_img/1936/137773.png)

<i>**Генератор импульсов с заданной скважностью (PulseGenerator**Ex<b>)</b></i>

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

#### Генератор случайных чисел (rndgen)

Блок <b>*rndgen*</b> выдает на выходе случайные числа в диапазоне от **-amp** до **+amp**. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Назначение входов и выходов:

- **amp** – амплитуда;
- **out** – случайное значение.

![Генератор случайных чисел (rndgen)](https://docs.owen.ru/book_img/1936/137802.png)

<i>**Генератор случайных чисел (rndgen)**</i>

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

#### Универсальный счетчик (CounterCTN)

Универсальный счетчик <b>*Counter*</b><b>*CTN*</b> используется для прямого и обратного счета. Операция «прямой счет» выполняется по переднему фронту импульса на входе прямого счета **inU**, что увеличивает значение выходного сигнала **out**. Импульсы, приходящие на вход **inD** («обратный счет»), уменьшают значение выхода **out**. Если на вход **rst** поступает сигнал логической **1**, то выход счетчика **out** устанавливается в значение входа **n**. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Если на входы **inU** и **inD** одновременно поступают сигналы, то приоритетным является сигнал входа **inU**. Допустимый диапазон значений числа импульсов **n**: от **0** до **65535**.

Назначение входов и выходов:

- **inU** – вход импульсов прямого счета;
- **inD** – вход импульсов обратного счета;
- **rst** – логический вход;
- **n** – установленное значение импульсов;
- **out** – выход.

![Алгоритм блока Counter CTN](https://docs.owen.ru/book_img/1936/137801.gif)

<i>**Алгоритм блока CounterCTN**</i>

![Универсальный счетчик (Counter CTN)](https://docs.owen.ru/book_img/1936/137800.png)

<i>**Универсальный счетчик (CounterCTN)**</i>

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

#### Инкрементный счетчик (CounterCTU)

Инкрементный счетчик <b>*Counter*</b><b>*CT*</b><b>*U*</b> используется для подсчета числа импульсов, приходящих на вход **in**. На выходе **out** счетчика появится импульс сигнала логической **1**, если число приходящих на вход импульсов достигнет установленного значения на входе **n**. Счетчик сбрасывается в **0** по переднему фронту импульса на входе **rst**. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Если сигналы поступают на входы одновременно, то приоритетным является сигнал входа **rst**. Допустимый диапазон значений числа импульсов **n**: от **0** до **65535**.

Назначение входов и выходов:

- **in** – вход импульсов прямого счета;
- **rst** – импульсный вход для сброса выхода счетчика в **0**;
- **n** – установленное значение импульсов;
- **out** – выход.

![Алгоритм блока Counter CTU](https://docs.owen.ru/book_img/1936/137799.gif)

<i>**Алгоритм блока CounterCTU**</i>

![Инкрементный счетчик (Counter CTU)](https://docs.owen.ru/book_img/1936/137798.png)

<i>**Инкрементный счетчик (CounterCTU)**</i>

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

#### Инкрементный счетчик с автосбросом (CounterCT)

Инкрементный счетчик с автосбросом <b>*Counter*</b><b>*CT*</b> используется для подсчета заданного числа импульсов **n**. На выходе **out** счетчика появится импульс сигнала логической **1** длительностью в один цикл, если число приходящих на вход **in** импульсов достигнет установленного значения **n**. Раздел библиотеки: <b>*Генераторы и таймера*</b>.

Допустимый диапазон значений числа импульсов **n**: от **0** до **65535**.

Назначение входов и выходов:

- **in** – вход импульсов;
- **n** – устанавливаемое значение импульсов;
- **out** – выход.

![Алгоритм блока Counter CT](https://docs.owen.ru/book_img/1936/137797.gif)

<i>**Алгоритм блока CounterCT**</i>

![Инкрементный счетчик с автосбросом (Counter CT)](https://docs.owen.ru/book_img/1936/137796.png)

<i>**Инкрементный счетчик с автосбросом (CounterCT)**</i>

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

### Обработка сигналов

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

#### Cимметричный ограничитель сигнала (LimSim)

Функциональный блок <b>*LimSim*</b> является симметричным (на величину **val**) ограничителем входного сигнала **inp**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **inp** – входной сигнал;
- **val** – величина ограничения (абсолютное значение);
- **dis** – команда обнуления выхода;
- **out** – выходной сигнал ограничителя.

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

```
out = 0
```

Алгоритм:

```
dis = 0 → out = inp, если inpval → out = val,
если inp < -val → out = -val,
dis = 1 → out = 0
```

![Симметричный ограничитель сигнала (Lim Sim)](https://docs.owen.ru/book_img/1936/137795.png)

*Cимметричный ограничитель сигнала (LimSim)*

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

#### Аппроксимация обратной функции (Approx)

Блок <b>*Approx*</b> для заданной табличной функции **y = f(x)** производит аппроксимацию обратной функции **x = g(y)**. Табличная функция **y = f(x)** задается массивом **tab_y** значений **y**, соответствующих значениям **x** аргумента, выбранным из диапазона **\[minx...maxx\]** с шагом **hx**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **y** – табличная функция;

- **hx** – шаг **x**;

- **minx** – минимум **x**;

- **maxx** – максимум **x**;

- **ty0**, **ty****1**, **…**, **tyn** – значения **y** для **x0**, **x1**, **…**, **xn**

  ;

- **x** – обратная функция.

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

```
out = 0
```

Алгоритм: используется кусочно-линейная аппроксимация по двум соседним точкам.

![Аппроксимация обратной функции (Approx)](https://docs.owen.ru/book_img/1936/137794.png)

<i>**Аппроксимация обратной функции (Approx)**</i>

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

#### Кусочно-линейная интерполяция (KL_Interp)

Блок вычисляет значение функции y, заданную таблично (**x0**, **y0**, ...), при значении аргумента, равном in. Используется кусочно-линейная интерполяция. Значение **dlt** задает смещение значения y относительно значений в точках **x0**, **x1**, …, которое используется, если **edl = 1**. Если значение **x** не входит в диапазон, заданный точками **x0**, **x1**, **…**, то выставляется флаг ошибки **err**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **in** – значение **x**;

- **dlt** – смещение **y**;

- **edl** – учитывать смещение;

  ;

- **t0**, **t1**, **…**, **tn** – значение **y0**, **y1**, **…**, **yn**;

- **c0**, **c1**, **…**, **cn** – значение **x0**, **x1**, **…**, **xn**;

- **out** – значение **y**;

- **err** – флаг ошибки.

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

```
out = 0, err = 0
```

Алгоритм: вычисление значения функции основано на кусочно-линейной интерполяции.

![Кусочно-линейная интерполяция (KL Interp)](https://docs.owen.ru/book_img/1936/137793.png)

<i>**Кусочно-линейная интерполяция (KL_Interp)**</i>

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

#### Несимметричный ограничитель сигнала (Lim)

Функциональный блок <b>*Lim*</b> является Функциональный блок является ограничителем входного сигнала **inp**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **inp** – входной сигнал;
- **max** – верхняя граница;
- **min** – нижняя граница;
- **out** – выход;
- **uf** – inp > max;
- **if** – inp < min.

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

```
out = 0
```

Алгоритм:

```
out = inp, если inp > max → out = max, uf = 1,
если inp < min → out = min, if = 1
```

![Несимметричный ограничитель сигнала (Lim)](https://docs.owen.ru/book_img/1936/137812.png)

<i>**Несимметричный ограничитель сигнала (Lim)**</i>

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

#### Группа ограничителей сигнала (Lims)

Функциональный блок <b>*Lims*</b> представляет собой группу ограничителей сигнала **val**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **vali** – входы;
- **maxi** – верхняя граница i-го входа;
- **mini** – нижняя граница i-го входа;
- **oi** – выходы.

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

```
oi = 0
```

Алгоритм:

```
o = val, если val > max → o = max,
если val < min → o = min
```

![Группа ограничителей сигнала (Lims)](https://docs.owen.ru/book_img/1936/137811.png)

<i>**Группа ограничителей сигнала (Lims)**</i>

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

#### Градиентный фильтр (GradLim)

Функциональный блок <b>*GradLim*</b> ограничивает рост входного сигнала **Q**, сравнивая приращение этой величины с заданной величиной допустимого приращения **dQ**. Если приращение не превышает заданного, блок работает как усредняющий по двум значениям фильтр. В противном случае на выходе блока устанавливается величина **out\[i - 1\] ± dQ**, а индикатор **lf** устанавливается в единицу. Дискретизация по времени задается стробирующим входом **enbl**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **Q** – вход;
- **dQ** – допустимое приращение;
- **enbl** – стробирующий вход;
- **out** – выход;
- **if** – приращение больше заданного.

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

```
out = 0, if = 0
```

Алгоритм:

```
out = out[i - 1] ± dQ, при -dQ < Q - out[i - 1] < dQ,
out = out[i - 1] + Q, иначе
```

![Градиентный фильтр (Grad Lim)](https://docs.owen.ru/book_img/1936/137810.png)

*Градиентный фильтр (GradLim)*

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

#### Определение принадлежности к диапазону (Inside)

Функциональный блок <b>*Inside*</b> определяет принадлежность значения входной переменной **val** к заданному диапазону **(a…b)** с допуском нечувствительности **eps** (от **-eps/2** до **+eps/2**). Если значение **val** находится внутри диапазона, то блок устанавливает выход **isd** = **1** (внутри). Если же значение **val** находится вне диапазона, блок задает выход **osd** = **1** (снаружи). Единица на выходе **apx** указывает на то, что значение **val** находится вблизи границы диапазона (в зоне нечувствительности). Это свойство может оказаться полезным для задания гистерезисных зависимостей. Если это не нужно, необходимо задать **eps = 0**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **val** – вход;
- **a** – нижняя граница;
- **b** – верхняя граница;
- **eps** – гистерезис;
- **enbl** – разрешение на работу блока;
- **isd** – внутри;
- **osd** – снаружи;
- **apx** – в зоне нечувствительности.

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

```
isd = 0, osd = 0, apx = 0
```

![Определение принадлежности к диапазону (Inside)](https://docs.owen.ru/book_img/1936/137809.png)

<i>**Определение принадлежности к диапазону (Inside)**</i>

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

#### Параболический ограничитель (SqLim)

Блок <b>*SqLim*</b> обнаруживает выход входного значения за ограничивающие параболы. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **dp** – вход;
- **q** – x параболы;
- **k1** – коэффициент 1;
- **k2** – коэффициент 2;
- **gt** – больше верхней;
- **lt**– ниже нижней;
- **alm** – выход за пределы.

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

```
gt = 0, lt = 0, alm = 0
```

Алгоритм:

```
Если q > 0.01 → gt = 1, если dqk2∙q∙q, itlt1, если dq < k1∙q∙q,
иначе gt = 1, если dq > 0, lt = 1, если dq < 0,
alm = gt∪lt
```

![Параболический ограничитель (Sq Lim)](https://docs.owen.ru/book_img/1936/137808.png)

<i>**Параболический ограничитель (SqLim)**</i>

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

#### Фильтр Баттерворта (BatterFilter)

Блок <b>*BatterFilter*</b> представляет из себя фильтр Баттерворта с постоянной времени **Tx** и коэффициентом демпфирования **g**. Для адекватной работы фильтра необходимо размещать данный блок в <b>*Таймере*</b>. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **in** – вход;
- **Tx** – постоянная времени;
- **g** – коэффициент демпфирования;
- **out** – выход.

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

```
out = 0
```

![Фильтр Баттерворта (Batter Filter)](https://docs.owen.ru/book_img/1936/137807.png)

<i>**Фильтр Баттерворта (BatterFilter)**</i>

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

#### Нормализация шкалы (Scale)

Блок <b>*Scale*</b> осуществляет линейное преобразование диапазонов без ограничителя. Аргументы являются вещественными числами. Раздел библиотеки: <b>*Обработка сигналов*</b>. Выход инициализируется **0**.

Назначение входов и выходов:

- **x** – вход;
- **minx** – минимум входа;
- **maxx** – максимум входа;
- **miny** – минимум выхода;
- **maxy** – максимум выхода;
- **y** – выход.

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

```
y = 0
```

Алгоритм:

```
Если (max(x) - min(x)) > 0.001 → y =  (max(y) - min(y))/(max(x) - min(x))∙(x - min(x)) + min(y), 
иначе y = min(y)
```

![Нормализация шкалы (Scale)](https://docs.owen.ru/book_img/1936/137806.png)

<i>**Нормализация шкалы (Scale)**</i>

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

#### Преобразователь для модуля термосопротивления (5B34Conv)

Блок <b>*5*</b><b>*B*</b><b>*34*</b><b>*Conv*</b> предназначен для согласования 50-Омных термосопротивлений типа 50П и 50М с входными модулями типа 50П. Для согласования точки 0 °C последовательно с датчиком подключается постоянное сопротивление 50 Ом. Для пересчета показаний результат измерения с функционального блока аналогового входа заводится на вход **t** блока <b>*5B34Conv*</b>. При использовании датчика типа 50М вход **type** устанавливается в **1**, а для 50П – в **2**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Диапазон работы функционального блока: для 50П -150 °C … 200 °C, для 50М -50 °C … 200 °C.

Назначение входов и выходов:

- **t** – вход;
- **type** – тип (**1**, **2**);
- **out** – выход.

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

```
out = 0
```

Алгоритм:

```
type = 1: t > -50,5 → out = 2,02∙t,
иначе out = 1.33∙t-32.8.
type = 2: t > -10,8 → out = 1,83∙t,
иначе out = 4.62∙t + 29.9
```

![Преобразователь для модуля термосопротивления (5B34Conv)](https://docs.owen.ru/book_img/1936/137805.png)

<i>**Преобразователь для модуля термосопротивления (5B34Conv)**</i>

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

#### Интерполяция (Interpolation)

Блок <b>*Interpolation*</b> производит интерполяцию функции, заданной на входах **x** и **y**. Если функция задана неправильно, либо количество **num** превышает заданное, выставляется признак ошибки **sts**. Если **en = 0**, то **out = in**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Блок можно размещать только в **Фоне**.

Назначение входов и выходов:

- **en** – включение блока;
- **typ** – тип (**0** – линейная, 1 – сплайн Акима);
- **num** – количество точек;
- **ctrl** –не используется;
- **cfg** – не используется;
- **in** – вход;
- **x****0**, **x****1**, **…**, **xn** – значения **x**;
- **y****0**, **y****1**, **…**, **yn** – значения **y**;
- **out** – выход;
- **sts** – ошибка.

![Интерполяция (Interpolation)](https://docs.owen.ru/book_img/1936/137804.png)

<i>**Интерполяция (Interpolation)**</i> 

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

#### Симметричная мертвая зона с гистерезисом (FdeadS)

Функциональный блок <b>*FdeadS*</b> является симметричной (на величину **v****al**) мертвой зоной по отношению к сигналу **inp**. Отличие данного ФБ от блока [Симметричная мертвая зона](#topic-96158) состоит в том, что при выходе сигнала **inp** за пределы мертвой зоны в блоке формируется внутренний флаг, который скачком отключает ее. Сброс флага происходит в момент смены полярности входного сигнала **inp**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **inp** – вход;
- **v****al** – мертвая зона;
- **dis** – отключение мертвой зоны;
- **out** – выход.

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

```
out = 0
```

![Симметричная мертвая зона с гистерезисом (Fdead S)](https://docs.owen.ru/book_img/1936/137803.png)

<i>**Симметричная мертвая зона с гистерезисом (FdeadS)**</i>

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

#### Симметричная мертвая зона (DbandS)

Функциональный блок <b>*DbandS*</b> является симметричной (на величину **v****al**) мертвой зоной по отношению к сигналу **inp**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

**inp** – вход;

**v****al** – мертвая зона;

**dis** – отключение мертвой зоны;

**out** – выход.

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

```
out = 0
```

Алгоритм:

```
dis = 0: out = 0, если inp > val → out = inp - val,
если inp < -val → out = inp + val.
type = 2:t > -10,8 → out = 1,83∙t,
dis = 1: out = inp
```

![Симметричная мертвая зона (Dband S)](https://docs.owen.ru/book_img/1936/137832.png)

<i>**Симметричная мертвая зона (DbandS)**</i>

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

#### Диагностика сигналов датчиков (SensSpd)

Блок <b>*SensSpd*</b> анализирует скорость изменения входного сигнала **inp** и ограничивает его, если скорость превышает заданную **spd**. Блок сравнивает текущее значение сигнала **inp** и его значение на предыдущем цикле выполнения программы, а скорость **spd** задает максимально допустимое изменение сигнала в секунду. При отключении диагностики **dis = 0** сигнал **inp** передается на выход **out** без изменений, **hsp = 0** и **nul = 0**. Первые **10** циклов программы диагностика отключена независимо от значения **dis**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **inp** – вход;
- **spd** – скорость;
- **dis** – включить;
- **out** – выход;
- **hsp** – высокая скорость;
- **nul** – не изменился.

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

```
out = 0, hsp = 0, nul = 0
```

Алгоритм:

```
Если inp = inp[i - 1] → nul = 1, out = inp,
если inp - out[i - 1] > spd∙таймерный интервал,
out = inp + spd∙таймерный интервал,
hsp = 1,
если inp - out[i - 1] < -spd∙таймерный интервал,
out = inp - spd∙таймерный интервал,
hsp = 1,
иначе out = inp, hsp = 0, nul = 0
```

![Диагностика сигналов датчиков (Sens Spd)](https://docs.owen.ru/book_img/1936/137831.png)

<i>**Диагностика сигналов датчиков (SensSpd)**</i>

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

#### Изменение значения за заданное время (ValDif)

Функциональный блок <b>*ValDif*</b> передает на выход изменение значения **val** за установленное время **time**. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **val** – вход;
- **time** – время, мс;
- **diff** – разница за время **time**.

![Изменение значения за заданное время (Val Dif)](https://docs.owen.ru/book_img/1936/137830.png)

<i>**Изменение значения за заданное время (ValDif)**</i>

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

#### Арифметическое скользящее среднее (MovAverage)

Блок <b>*MovAverage*</b> реализует алгоритм определения среднего значения исходного входного сигнала за предыдущие периоды (циклы). При инициализации блока выделяется память под массив сохраняемых значений входного сигнала с заданными пользователем максимальными размерами. В дальнейшем пользователь может динамически изменять фактическую величину выборки, участвующей в расчете для определения оптимальных параметров фильтрации. При подаче активного логического сигнала на вход балансировки значение входного сигнала передается на выход блока без фильтрации. Раздел библиотеки: <b>*Обработка сигналов*</b>.

Назначение входов и выходов:

- **in** – вход;
- **W** – количество значений входного сигнала для расчета (должно быть меньше **mW**);
- **mW** –максимально количество значений входного сигнала для расчета, неизменяемый вход, значение которого принимается один раз при компиляции, допустимые значения в диапазоне **2…255**;
- **bal** – максимально количество значений входного сигнала для расчета, неизменяемый вход, значение которого принимается один раз при компиляции, допустимые значения в диапазоне **2…255**;
- **out** – выход.

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

```
out = in
```

Алгоритм:

```
out = 1/W∙∑in_i
где in_i – исходные сохраненные за предыдущие периоды значения входного сигнала, 
W = k - l – сглаживающий интервал – количество значений входного сигнала, 
используемых для расчета.
Если bal = 1 → out = in
```

![Арифметическое скользящее среднее (Mov Average)](https://docs.owen.ru/book_img/1936/137829.png)

<i>**Арифметическое скользящее среднее (MovAverage)**</i>

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

### Операции с регистрами

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

#### Объединение 20 битов в регистр (ToReg20)

Блок <b>*ToReg*</b><b>*20*</b> объединяет **20** **битов** в **регистр**. **Бит** **0** – младший бит регистра, **бит** **19** – старший. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Объединение 20 битов в регистр (To Reg20)](https://docs.owen.ru/book_img/1936/137828.png)

<i>**Объединение 20 битов в регистр (ToReg20)**</i>

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

#### Объединение 8-ми битов в регистр (ToReg8)

Блок <b>*ToReg*</b><b>*8*</b> объединяет **8** **битов** в **регистр**. **Бит** **0** – младший бит регистра, **бит 7** – старший. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Объединение 8-ми битов в регистр (To Reg8)](https://docs.owen.ru/book_img/1936/137827.png)

<i>**Объединение 8-ми битов в регистр (ToReg8)**</i>

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

#### Выбор 8 битов из регистра (FromReg8)

Блок <b>*FromReg*</b><b>*8*</b> раскладывает **байт** на **8 бит**. Первый выходной бит будет младшим битом байта, последний – старшим. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Выбор 8 битов из регистра (From Reg8](https://docs.owen.ru/book_img/1936/137826.png)

<i>**Выбор 8 битов из регистра (FromReg8)**</i>

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

#### Объединение 16-ти битов в регистр (ToReg16)

Блок <b>*ToReg*</b><b>*16*</b> объединяет **в** **слово** **16** **бит**. Первый входной бит будет младшим битом слова, последний – старшим. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Объединение 16-ти битов в регистр (To Reg16)](https://docs.owen.ru/book_img/1936/137825.png)

<i>**Объединение 16-ти битов в регистр (ToReg16)**</i>

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

#### Выбор 20 битов из регистра (FromReg20)

Блок <b>*FromReg*</b><b>*20*</b> раскладывает **4** **байта** в **20** **бит**. Первый выходной бит будет младшим битом слова, последний – старшим. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Выбор 20 битов из регистра (From Reg20)](https://docs.owen.ru/book_img/1936/137824.png)

<i>**Выбор 20 битов из регистра (FromReg20)**</i>

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

#### Выбор 16 битов из регистра (FromReg16)

Блок <b>*FromReg*</b><b>*16*</b> раскладывает **слово в 16 бит**. Первый выходной бит будет младшим битом слова, последний – старшим. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Выбор 16 битов из регистра (From Reg16)](https://docs.owen.ru/book_img/1936/137823.png)

<i>**Выбор 16 битов из регистра (FromReg16)**</i>

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

#### Логическое И для 16-битных регистров (rAND)

Функциональный блок <b>*rAND*</b> работает аналогично блоку [И](#topic-96097), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Логическое И для 16-битных регистров (r AND)](https://docs.owen.ru/book_img/1936/137852.png)

<i>**Логическое И для 16-битных регистров (rAND)**</i>

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

#### Логическое ИЛИ для 16-битных регистров (rOR)

Функциональный блок <b>*rOR*</b> работает аналогично блоку [ИЛИ](#topic-96098), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Логическое ИЛИ для 16-битных регистров (r OR)](https://docs.owen.ru/book_img/1936/137851.png)

<i>**Логическое ИЛИ для 16-битных регистров (rOR)**</i>

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

#### Логическое НЕ для 16-битных регистров (rNOT)

Функциональный блок <b>*rNOT*</b> работает аналогично блоку [НЕ](#topic-96100), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Логическое НЕ для 16-битных регистров (r NOT)](https://docs.owen.ru/book_img/1936/137850.png)

<i>**Логическое НЕ для 16-битных регистров (rNOT)**</i>

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

#### Логическое И с отрицанием для 16-битных регистров (rnAND)

Функциональный блок <b>*rnAND*</b> работает аналогично блоку [И с отрицанием](#topic-96099), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Логическое И с отрицанием для 16-битных регистров (r NAND)](https://docs.owen.ru/book_img/1936/137849.png)

<i>**Логическое И с отрицанием для 16-битных регистров (rNAND)**</i>

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

#### Логическое ИЛИ с отрицанием для 16-битных регистров (rnOR)

Функциональный блок <b>*rnNOR*</b> работает аналогично блоку [ИЛИ с отрицанием](#topic-96101), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Логическое ИЛИ с отрицанием для 16-битных регистров (r NOR)](https://docs.owen.ru/book_img/1936/137848.png)

<i>**Логическое ИЛИ с отрицанием для 16-битных регистров (rNOR)**</i>

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

#### Сложение по модулю для 16-битных регистров (rXOR)

Функциональный блок <b>*rXOR*</b> работает аналогично блоку [XOR](#topic-96102), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Сложение по модулю для 16-битных регистров (r XOR)](https://docs.owen.ru/book_img/1936/137847.png)

<i>**Сложение по модулю для 16-битных регистров (rXOR)**</i>

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

#### Склеивание байта из двух тетрад (R4to8)

Блок <b>*R*</b><b>*4*</b><b>*to*</b><b>*8*</b> собирает **8-ми битный регистр** из младшей тетрады регистра **low** и старшей тетрады регистра **high**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Склеивание байта из двух тетрад (R4to8)](https://docs.owen.ru/book_img/1936/137846.png)

<i>**Склеивание байта из двух тетрад (R4to8)**</i>

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

#### Детектор фронтов для 16-битных регистров (Fronts2)

Функциональный блок <b>*Fronts*</b><b>*2*</b> работает аналогично блоку [детектора фронтов](#topic-96104), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Детектор фронтов для 16-битных регистров (Fronts2)](https://docs.owen.ru/book_img/1936/137845.png)

<i>**Детектор фронтов для 16-битных регистров (Fronts2)**</i>

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

#### Склеивание слова из двух байт (R8to16)

Блок <b>*R*</b><b>*8*</b><b>*to*</b><b>*16*</b> собирает **16-ти битный регистр** из младшего регистра **low** и старшего регистра **high**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Склеивание слова из двух байт (R8to16)](https://docs.owen.ru/book_img/1936/137844.png)

<i>**Склеивание слова из двух байт (R8to16)**</i>

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

#### Преобразование 16-битного регистра в два 8-битных (R16to8)

Блок <b>*R*</b><b>*16*</b><b>*to*</b><b>*8*</b> разбивает **16-битный регистр** на **два 8-битных**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Преобразование 16-битного регистра в два 8-битных (R16to8)](https://docs.owen.ru/book_img/1936/137843.png)

<i>**Преобразование 16-битного регистра в два 8-битных (R16to8)**</i>

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

#### Преобразование двух 16-битных регистров в 32-битный (R16to32)

Блок <b>*R*</b><b>*16*</b><b>*to*</b><b>*32*</b> склеивает **32-битный регистр** из **двух 16-битных**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Преобразование двух 16-битных регистров в 32-битный (R16to32)](https://docs.owen.ru/book_img/1936/137872.png)

<i>**Преобразование двух 16-битных регистров в 32-битный (R16to32)**</i>

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

#### Преобразование 32-битного регистра в два 16-битных (R32to16)

Блок <b>*R*</b><b>*32*</b><b>*to*</b><b>*16*</b> разбивает **32-битный регистр** на **два 16-битных**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Преобразование 32-битного регистра в два 16-битных (R32to16)](https://docs.owen.ru/book_img/1936/137871.png)

<i>**Преобразование 32-битного регистра в два 16-битных (R32to16)**</i>

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

#### Объединение 32 битов в регистр (ToReg32)

Блок <b>*ToReg*</b><b>*32*</b> объединяет **32 бита** в **регистр**. **Бит** **0** – младший бит регистра, **бит** **31** – старший. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Объединение 32 битов в регистр (To Reg32)](https://docs.owen.ru/book_img/1936/137870.png)

<i>**Объединение 32 битов в регистр (ToReg32)**</i>

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

#### Выбор 32 битов из регистра (FromReg32)

Блок <b>*FromReg*</b><b>*32*</b> раскладывает **4 байта** в **32 бита**. Первый выходной бит будет младшим битом слова, последний – старшим. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Выбор 32 битов из регистра (From Reg32)](https://docs.owen.ru/book_img/1936/137869.png)

<i>**Выбор 32 битов из регистра (FromReg32)**</i>

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

#### Включение с задержкой для 16-битных регистров (rDelayOn)

Функциональный блок <b>*rDelayOn*</b> работает аналогично блоку [Включение с задержкой](#topic-96134), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Включение с задержкой для 16-битных регистров (r Delay On)](https://docs.owen.ru/book_img/1936/137868.png)

<i>**Включение с задержкой для 16-битных регистров (rDelayOn)**</i>

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

#### Выключение с задержкой для 16-битных регистров (rDelayOff)

Функциональный блок <b>*rDelayOff*</b> работает аналогично блоку [Выключение с задержкой](#topic-96135), но обрабатывает параллельно **16** логических сигналов, предварительно объединенных в **16-битный регистр**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

![Выключение с задержкой для 16-битных регистров (r Delay Off)](https://docs.owen.ru/book_img/1936/137867.png)

<i>**Выключение с задержкой для 16-битных регистров (rDelayOff)**</i>

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

#### Выбор бита из регистра (BitReg16)

Функциональный блок <b>*BitReg*</b><b>*16*</b> выбирает бит из регистра **ireg** по указанному номеру **ibit**. Раздел библиотеки: <b>*Операции с регистрами*</b>.

Назначение входов и выходов:

- **ireg** – регистр;
- **ibit** – номер бита;
- **obit** – выходной бит.

![Выбор бита из регистра (Bit Reg16)](https://docs.owen.ru/book_img/1936/137866.png)

<i>**Выбор бита из регистра (BitReg16)**</i>

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

### Операции с массивами

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

#### Массив вещественных чисел (FloatArray)

Блок <b>*FloatArray*</b> создает массив из элементов. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Операции с массивами*</b>.

Назначение входов и выходов:

- **in****0**, **in****1**, **…**, **inn** – элементы типа [flt](#topic-96065);
- **p****\_****a** – массив.

![Массив вещественных чисел (Float Array)](https://docs.owen.ru/book_img/1936/137865.png)

<i>**Массив вещественных чисел (FloatArray)**</i>

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

#### Массив 4-байтных целых (i32Array)

Блок <b>*i*</b><b>*32*</b><b>*Array*</b> создает массив из элементов. Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Операции с массивами*</b>.

Назначение входов и выходов:

- **in****0**, **in****1**, **…**, **inn** – элементы типа [i32](#topic-96065);
- **p****\_****a** – массив.

![Массив 4-байтных целых (i32Array)](https://docs.owen.ru/book_img/1936/137864.png)

<i>**Массив 4-байтных целых (i32Array)**</i>

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

#### Линейная аппроксимация массивов (LineAprox)

Блок <b>*LineAprox*</b> рассчитывает значение таблично заданных функций при значении аргумента **inp**. Текущие значения функций выдаются на соответствующие выходы **o**. Функция задается массивом аргументов **arg** (общим для всех функций) и массивом значений **fun**. Размерности всех массивов должны совпадать, иначе на выход будет выдана ошибка **err - (-1 - \[номер функции\]).**

Массив аргументов **arg** должен быть упорядочен либо по возрастанию, либо по убыванию. Если порядок нарушен, то на выход **err** выдается номер этого элемента (считая с **1**). Число входов задается при создании функционального блока, и его можно изменить в процессе редактирования программы. Раздел библиотеки: <b>*Операции с массивами*</b>.

> [!WARNING]
> **Внимание.** На входы **arg** и **fun** должны быть проведены связи только с выходов блоков [Массив вещественных чисел](#topic-96187), в противном случае работа программы будет некорректной.

Назначение входов и выходов:

- **inp** – аргумент;
- **arg** – аргументы;
- **fun****0**, **fun****1**, **…**, **funn** – функции;
- **err** – ошибка;
- **o0**, **o1**, **…**, **on** – значения функций.

![Линейная аппроксимация массивов (Line Aprox)](https://docs.owen.ru/book_img/1936/137863.png)

<i>**Линейная аппроксимация массивов (LineAprox)**</i>

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

#### Значения массива вещественных чисел (From_fArr)

Блок <b>*From*</b><b>*\_*</b><b>*fArr*</b> позволяет получить значения элементов вещественного массива, поданного на вход. Раздел библиотеки: <b>*Операции с массивами*</b>.

Коды ошибок статуса **err**:

- **0** – ошибок нет;
- **1** – выходов блока меньше, чем элементов у входного массива;
- **2** – выходов больше, чем элементов у входного массива;
- **3** – на входе отсутствует массив (может быть связано с порядком выполнения блоков).

Назначение входов и выходов:

- **in** – массив элементов типа [flt](#topic-96065)

  ;

- **err** – статус;

- **out0**, **out1**, **…**, **outn** – значения элементов массива.

![Значения массива вещественных чисел (From f Arr)](https://docs.owen.ru/book_img/1936/137892.png)

<i>**Значения массива вещественных чисел (From_fArr)**</i>

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

#### Элемент из массива (one_From_fArr)

Блок <b>*one*</b><b>*\_*</b><b>*From*</b><b>*\_*</b><b>*fArr*</b> позволяет получить значение **i**-го элемента из массива, поданного на вход. Раздел библиотеки: <b>*Операции с массивами*</b>.

Коды ошибок статуса **err**:

- **0** – ошибок нет;
- **1** – выбранный номер элемента находится за пределами массива;
- **2** – на входе отсутствует массив (может быть связано с порядком выполнения блоков).

Назначение входов и выходов:

- **in** – массив элементов типа [flt](#topic-96065);
- **i** – номер элемента;
- **err** – статус;
- **out** – значения элемента.

![Элемент из массива (one From f Arr)](https://docs.owen.ru/book_img/1936/137891.png)

<i>**Элемент из массива (one_From_fArr)**</i>

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

#### Нахождение минимума/максимума в массиве (minmax_fArr)

Блок <b>*minmax*</b><b>*\_*</b><b>*fArr*</b> определяет минимальное и максимальное значение из элементов массива, поданного на вход. Раздел библиотеки: <b>*Операции с массивами*</b>.

Коды ошибок статуса **err**:

- **0** – ошибок нет;
- **1** – на входе отсутствует массив (может быть связано с порядком выполнения блоков).

Назначение входов и выходов:

- **in** – массив элементов типа [flt](#topic-96065);
- **err** – статус;
- **m****in** – минимум;
- **m****ax** – максимум.

![Нахождение минимума-максимума в массиве (minmax f Arr)](https://docs.owen.ru/book_img/1936/137890.png)

*Нахождение минимума-максимума в массиве (minmax_fArr)*

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

#### Нахождение разницы между элементами массива (minmax_sub_fArr)

Блок <b>*minmax*</b><b>*\_*</b><b>*sub*</b><b>*\_*</b><b>*fArr*</b> минимальное и максимальное значение разницы *соседних* элементов массива, поданного на вход. Раздел библиотеки: <b>*Операции с массивами*</b>.

Коды ошибок статуса **err**:

- **0** – ошибок нет;
- **1** – на входе отсутствует массив (может быть связано с порядком выполнения блоков).

Назначение входов и выходов:

- **in** – массив элементов типа [flt](#topic-96065);
- **err** – статус;
- **m****in** – минимальная разница соседей;
- **m****ax** – максимальная разница соседей.

![Нахождение минимума-максимума разницы между элементами массива (minmax sub f Arr)](https://docs.owen.ru/book_img/1936/137889.png)

<i>**Нахождение минимума/максимума разницы между элементами массива (minmax_sub_fArr)**</i>

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

#### Переключатель массивов (switch_fArr)

Блок <b>*switch*</b><b>*\_*</b><b>*fArr*</b> принимает на входы два массива вещественных чисел и выдает на выход один из них, в зависимости от состояния управляющего входа **i**: при **i = 0** — массив **in2**, в остальных случаях — массив **in1**. Раздел библиотеки: <b>*Операции с массивами*</b>.

Коды ошибок статуса **err**:

- **0** – ошибок нет;
- **1** – на входе отсутствует массив (может быть связано с порядком выполнения блоков).

Назначение входов и выходов:

- **in1**, **in****2** – массивы элементов типа [flt](#topic-96065);
- **err** – статус;
- **p****\_****a** – выходной массив.

![Переключатель массивов (switch f Arr)](https://docs.owen.ru/book_img/1936/137888.png)

<i>**Переключатель массивов (switch_fArr)**</i>

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

#### Значения массива целых (From_i32Arr)

Блок <b>*From*</b><b>*\_*</b><b>*i*</b><b>*32*</b><b>*Arr*</b> позволяет получить значения элементов целочисленного массива, поданного на вход. Раздел библиотеки: <b>*Операции с массивами*</b>.

Коды ошибок статуса **err**:

- **0** – ошибок нет;
- **1** – выходов блока меньше, чем элементов у входного массива;
- **2** – выходов больше, чем элементов у входного массива;
- **3** – на входе отсутствует массив (может быть связано с порядком выполнения блоков).

Назначение входов и выходов:

**in** – массивы элементов типа [i32](#topic-96065);

**err** – статус;

**out0**, **out1**, **…**, **outn** – значения элементов массива.

![Значения массива целых (From i32Arr)](https://docs.owen.ru/book_img/1936/137887.png)

<i>**Значения массива целых (From_i32Arr)**</i>

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

### Триггеры 

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

#### Триггер Шмидта (SmTrig)

Блок <b>*SmTrig*</b> осуществляет алгоритм симметричного триггера Шмидта. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **x** – аргумент;
- **m** – уставка;
- **dm** – гистерезис;
- **fu** – больше;
- **fl** – меньше.

Алгоритм:

```
fl = 1 при x ≤ m+ dm,
fu = 1 при x > m + dm
```

![Алг Sm Trig](https://docs.owen.ru/book_img/1936/137886.png)

<i>**Алгоритм SmTrig**</i>

![Триггер Шмидта (Sm Trig)](https://docs.owen.ru/book_img/1936/137885.png)

<i>**Триггер Шмидта (SmTrig)**</i>

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

#### Двойной триггер Шмидта (SmTrig2)

Блок <b>*SmTrig*</b> осуществляет алгоритм двойного симметричного триггера Шмидта. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **x** – аргумент;
- **m** – центр уставки;
- **dm** – гистерезис;
- **l** – отклонение уставки;
- **fu** – больше;
- **fm** – между;
- **fl** – меньше.

Алгоритм:

```
fl = 1 при x < m – l + dm,
fm = 1 при m – l + dm ≤ x < m + l - dm,
fu = 1 при x ≥ m + l - dm
```

![Алг Sm Trig2](https://docs.owen.ru/book_img/1936/137884.png)

<i>**Алгоритм SmTrig2**</i>

![Двойной триггер Шмидта (Sm Trig2)](https://docs.owen.ru/book_img/1936/137883.png)

<i>**Двойной триггер Шмидта (SmTrig2)**</i>

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

#### RSS-триггер (RSS)

<b>*RSS*</b> – RS-триггер с S-доминантой. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **q** – выход;
- **inv** – инверсный выход.

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

```
q = 0
```

Алгоритм:

![RSS-триггер (RSS)](https://docs.owen.ru/book_img/1936/137912.png)

<i>**RSS-триггер (RSS)**</i>

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

#### RSR-триггер (RSR)

<b>*RSR*</b> – RS-триггер с R-доминантой. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **q** – выход;
- **inv** – инверсный выход.

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

```
q = 0
```

Алгоритм:

![RSR-триггер (RSR)](https://docs.owen.ru/book_img/1936/137911.png)

<i>**RSR-триггер (RSR)**</i>

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

#### D-триггер с инициализацией выхода (DFR_i)

<b>*DFR_i*</b> – D-триггер с R- доминантой. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **i** – перепад;
- **d** – потенциал;
- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **ini** – инициализация;
- **q** – выход;
- **qn** – инверсный выход.

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

```
q = ini
```

Алгоритм:

![D-триггер с инициализацией выхода (DFR i)](https://docs.owen.ru/book_img/1936/137910.png)

<i>**D-триггер с инициализацией выхода (DFR_i)**</i>

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

#### JK-триггер с инициализацией (JK \_i)

<b>*JK \_i*</b> – JK-триггер с инициализацией. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **j** – бит job;
- **k** – бит keep;
- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **ini** – начальное значение **q**;
- **q** – выход;
- **qn** – инверсный выход.

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

```
q = ini
```

Алгоритм:

![JK-триггер с инициализацией (JK i)](https://docs.owen.ru/book_img/1936/137909.png)

<i>**JK-триггер с инициализацией (JK \_i)**</i>

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

#### RSS-триггер с инициализацией выхода (RSS_i)

<b>*RSS*</b> – RS-триггер с S-доминантой с инициализацией. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **i** – начальное значение **q**;
- **q** – выход.

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

```
q = i
```

Алгоритм:

![RSS-триггер с инициализацией (RSS i)](https://docs.owen.ru/book_img/1936/137908.png)

<i>**RSS-триггер с инициализацией (RSS_i)**</i>

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

#### RSR-триггер с инициализацией выхода (RSR)

<b>*RSR*</b> – RS-триггер с R-доминантой с инициализацией. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **i** – начальное значение **q**;
- **q** – выход.

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

```
q = i
```

Алгоритм:

![RSR-триггер (RSR) (2)](https://docs.owen.ru/book_img/1936/137907.png)

<i>**RSR-триггер (RSR)**</i>

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

#### D-триггер (DFR)

<b>*DFR*</b> – D-триггер с R- доминантой. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **i** – перепад;
- **d** – потенциал;
- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **q** – выход;
- **qn** – инверсный выход.

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

```
q = 0
```

Алгоритм:

![D-триггер (DFR)](https://docs.owen.ru/book_img/1936/137906.png)

<i>**D-триггер (DFR)**</i>

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

#### DV-триггер (DFRV)

<b>*DFRV*</b>– DV-триггер с R- доминантой. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **is** – потенциал;
- **i** – перепад;
- **s** – бит установить (set);
- **r** – бит сбросить (reset);
- **q** – выход;
- **qn** – инверсный выход.

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

```
q = 0
```

Алгоритм:

![DV-триггер (DFRV)](https://docs.owen.ru/book_img/1936/137905.png)

<i>**DV-триггер (DFRV)**</i>

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

#### Несимметричный триггер Шмидта (asymSmTrig)

Блок <b>*SmTrig*</b> осуществляет алгоритм несимметричного триггера Шмидта. Раздел библиотеки: <b>*Триггеры*</b>.

Назначение входов и выходов:

- **x** – аргумент;
- **m****in** – нижний гистерезис;
- **max** – верхний гистерезис;
- **l** – отклонение уставки;
- **fu** – больше;
- **fl** – меньше.

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

```
fu = 0, fl = 0
```

Алгоритм: первые три цикла **fu = 1** при **x > max**, **fl = 1** при **x ≤ max**, затем см. рисунок ниже.

![Алг asym Sm Trig](https://docs.owen.ru/book_img/1936/137904.png)

<i>**Алгоритм asymSmTrig**</i>

![Несимметричный триггер Шмидта (asym Sm Trig)](https://docs.owen.ru/book_img/1936/137903.png)

<i>**Несимметричный триггер Шмидта (asymSmTrig)**</i>

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

#### Шаговая последовательность (Steper)

Блок <b>*Steper*</b> осуществляет последовательное переключение заданного количества шагов. Раздел библиотеки: <b>*Триггеры*</b>.

**Назначение входов и выходов Steper**

**Входы**

| Элемент | Описание |
| --- | --- |
| enb | Разрешение работы |
| str | Пуск |
| rst | Сброс |
| t_f | Не используется |
| i | Разрешение (циклический) |
| t | Таймаут (циклический) |
| a | Сигнал (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| ind | Номер шага |
| s_w | Идет работа |
| s_t | Таймаут |
| s_r | Сброс |
| s_f | Конец работы |
| w | Признак работы (циклический) |
| t | Признак таймаута (циклический) |
| r | Авария (циклический) |

Работа последовательности возможна только при наличии **1** на входе разрешения **enb**:

- если **enb = 0** до запуска, то запуск не произойдет;
- если **enb = 0** после запуска, то последовательность сбрасывается и на выходы выдается авария: **s_r = 1** и **ri = 1** (для всех **i**).

Запуск последовательности происходит при появлении перепада **0 → 1** на входе **str**.

Каждый шаг представлен группой входов **i**, **t** и **a** и выходов **w**, **t** и **r**. Включение шага происходит после завершения предыдущего шага и при **i = 1**, а на выходе признака работы **w** выставляется **1**. Если к моменту включения шага его разрешение **i** не равно **1**, то последовательность сбрасывается и на выходы выдается авария: **s_r = 1** и **ri = 1** (для всех **i**). Шаг завершается, когда блок получает **1** на входе ответного сигнала **a**. Если сигнал **a** не получен в течение времени **t** (задается в мс) с момента включения шага, то последовательность сбрасывается и на выход выдается признак таймаута: **s_t = 1** и **t = 1**.

![Шаговая последовательность (Steper)](https://docs.owen.ru/book_img/1936/137932.png)

<i>**Шаговая последовательность (Steper)**</i>

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

### Системные

В данном разделе приведено описание основных блоков библиотеки <b>*paCore*</b> из раздела <b>*Системные*</b>.

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

#### Информация о временах выполнения (SysInfo)

Блок <b>*SysInfo*</b> выдает информацию о временах выполнения. Раздел библиотеки: <b>*Системные*</b>.

**Назначение входов и выходов SaverEx**

**Входы**

| Элемент | Описание |
| --- | --- |
| fmap | Имя map-файла |
| rst | Сброс |

**Выходы**

| Элемент | Описание |
| --- | --- |
| init | Не используется |
| IT | Заданный таймерный цикл ввода-вывода |
| ic | Текущий таймерный цикл ввода-вывода |
| im | Максимальный таймерный цикл ввода-вывода |
| MT | Заданный таймерный цикл |
| tc | Текущий таймерный цикл |
| tm | Максимальный таймерный цикл |
| fc | Текущий фон |
| fm | Максимальный фон |
| crc | Не используется |
| inm0 | Не используется (циклический) |
| cnt0 | Не используется (циклический) |

![Информация о временах выполнения (Sys Info)](https://docs.owen.ru/book_img/1936/137931.png)

<i>**Информация о временах выполнения (SysInfo)**</i>

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

#### Получить время и дату, день недели (getTDN)

Блок <b>*getTDN*</b> выдает на выходы текущее время и дату, день недели, установленные в ОС контроллера. Блок можно размещать как в <b>*Таймере*</b>, так и в <b>*Фоне*</b>. Раздел библиотеки: <b>*Системные*</b>.

Назначение входов и выходов:

- **f** – не используется;
- **h** – часы;
- **m** – минуты;
- **s** – секунды;
- **dw** – день недели;
- **d** – число;
- **mn** – месяц;
- **y** – год.

![Получить время и дату, день недели (get TDN)](https://docs.owen.ru/book_img/1936/137930.png)

<i>**Получить время и дату, день недели (getTDN)**</i>

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

#### Получить время и дату (getTD)

Блок <b>*getTD*</b> выдает на выходы текущее время и дату, установленные в ОС контроллера. Блок можно размещать как в <b>*Таймере*</b>, так и в <b>*Фоне*</b>. Раздел библиотеки: <b>*Системные*</b>.

Назначение входов и выходов:

- **f** – не используется;
- **h** – часы;
- **m** – минуты;
- **s** – секунды;
- **d** – число;
- **mn** – месяц;
- **y** – год.

![Получить время и дату (get TD)](https://docs.owen.ru/book_img/1936/137929.png)

<i>**Получить время и дату (getTD)**</i>

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

#### Завершение программы (Exit)

Блок <b>*Exit*</b> осуществляет корректное завершение программы, когда на входе **b1** появляется **1**. Раздел библиотеки: <b>*Системные*</b>.

Назначение входов и выходов:

- **b1** – выйти;
- **q** – значение входа.

![Завершение программы (Exit)](https://docs.owen.ru/book_img/1936/137928.png)

<i>**Завершение программы (Exit)**</i>

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

#### Разность тиков процессора (GetTicksDiff)

Блок <b>*GetTicksDiff*</b> предназначен для проведения высокоэффективных измерений малых временных промежутков. Раздел библиотеки: <b>*Системные*</b>.

Блок определяет разность между двумя входными значениями **start** и **end** (полученными при помощи блоков [Счетчик тиков процессора](#topic-96215)), переводя ее в единицы измерения времени (мс) на выходе **ms**.

На выходе **ms** фиксируется последнее полученное значение до момента изменения на входе **end**.

> [!WARNING]
> **Внимание.** Для получения корректного результата последовательность выполнения блоков должна удовлетворять следующим условиям: <b>*GetTicks*</b>**(start) <** <b>*GetTicks*</b>**(end) <** <b>*GetTicksDiff*</b>.

Назначение входов и выходов:

- **start** – тик начала;
- **end** – тик окончания;
- **ms** – разница между входами, мс;
- **pday** – частота процессорного счетчика, кГц;
- **min** – не используется для контроллеров ОВЕН.

![Разность тиков процессора (Get Ticks Diff](https://docs.owen.ru/book_img/1936/137927.png)

<i>**Разность тиков процессора (GetTicksDiff)**</i>

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

#### Счетчик тиков процессора (GetTicks)

Блок <b>*GetTicks*</b> в связке с блоком [Разность тиков процессора](#topic-96214) позволяет выполнять высокоэффективные измерения малых временных промежутков. Раздел библиотеки: <b>*Системные*</b>.

Если на вход блока **enb** подан ненулевой сигнал, то на выходе **tcks** текущее значение внутреннего независимого цикличного счетчика.

При нулевом сигнале на входе, на выходе фиксируется последнее полученное значение счетчика (если измерений не было – **0**).

Назначение входов и выходов:

- **end** – включение;
- **tcks** – тик.

![Счетчик тиков процессора (Get Ticks)](https://docs.owen.ru/book_img/1936/137926.png)

<i>**Счетчик тиков процессора (GetTicks)**</i>

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

#### Загруженность таймерного потока (Effect)

Блок <b>*Effect*</b> выдает информацию о загруженности таймерного потока. Раздел библиотеки: <b>*Системные*</b>.

**Назначение входов и выходов Effect**

**Входы**

| Элемент | Описание |
| --- | --- |
| rst | Сброс |

**Выходы**

| Элемент | Описание |
| --- | --- |
| mt | Таймерный цикл основной |
| it | Таймерный цикл ввода-вывода |
| ctm | Средний процент заполнения таймерного цикла основного программой таймера |
| cti | Средний процент заполнения ввода-вывода цикла программой ввода-вывода |
| mtm | Средний процент заполнения ввода-вывода цикла программой ввода-вывода |
| mti | Максимальный процент заполнения ввода-вывода цикла программой ввода-вывода |
| cf | Средний процент от величины таймера работы фоновой программы |
| mf | Максимальный процент от величины таймера работы фоновой программы |

![Загруженность таймерного потока (Effect)](https://docs.owen.ru/book_img/1936/137925.png)

<i>**Загруженность таймерного потока (Effect)**</i>

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

#### Событие по фронту (Event)

Блок <b>*Event*</b> предназначен для определения времени между событиями. На вход блока **front** заводится бит события. По входному фронту на выходе **time** блока будет значение времени в наносекундах. Раздел библиотеки: <b>*Системные*</b>.

Назначение входов и выходов:

- **front** – входной фронт;
- **me** – событие;
- **time** – время срабатывания, нс.

![Событие по фронту (Event)](https://docs.owen.ru/book_img/1936/137924.png)

<i>**Событие по фронту (Event)**</i>

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

#### TCP/IP клиент (TcpIpClA)

Блок <b>*TcpIpClA*</b> представляет собой TCP/IP-клиент для обеспечения работы протоколов (например, **Mod****b****us TCP** **Master**). Раздел библиотеки: <b>*Системные*</b>.

Так как работа блока занимает значительное время, его можно размещать только в <b>*Фоне*</b>.

Назначение входов и выходов:

- **lprt** – локальный порт;
- **lip** – локальный IP-адрес;
- **sdr** – сетевой стек, для ПЛК ОВЕН **"/"**;
- **rprt** – удаленный порт;
- **ip** – IP адрес удаленного сервера;
- **cnc** – связь с блоком протокола;
- **stat** – статус работы (**0** – есть связь с TCP/IP сервером, **>0** – нет связи).

![TCPIP клиент (Tcp Ip Cl A)](https://docs.owen.ru/book_img/1936/137923.png)

<i>**TCP/IP клиент (TcpIpClA)**</i>

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

#### TCP/IP сервер (TcpIpSrA)

Блок <b>*TcpIpSrA*</b> представляет собой TCP/IP-сервер для обеспечения работы протоколов (например, **Mod****b****us TCP Slave**). Сервер поддерживает одновременно не более **2****0** подключений. Раздел библиотеки: <b>*Системные*</b>.

Назначение входов и выходов:

- **prt** – порт;
- **lip** – локальный IP-адрес;
- **sdr** – сетевой стек, для ПЛК ОВЕН **"/"**;
- **wait** – время в миллисекундах до закрытия пустого канала (**0** – никогда);
- **cnc** – связь с блоком протокола;
- **stat** – статус работы (**0** – есть подключения, **>0** – нет подключений).

![TCPIP сервер (Tcp Ip Sr A)](https://docs.owen.ru/book_img/1936/137952.png)

<i>**TCP/IP сервер (TcpIpSrA)**</i>

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

#### Информация о сборке (BuildVersionInfo)

Блок <b>*BuildVersionInfo*</b> передает на свои выходы информацию о сборке. Раздел библиотеки: <b>*Системные*</b>.

Назначение выходов:

- **ver** – версия проекта;
- **date** – дата и время трансляции;
- **guid** – уникальный идентификатор (**GUID**);
- **usr** – имя пользователя;
- **pc** – имя компьютера.

![Информация о сборке (Build Version Info)](https://docs.owen.ru/book_img/1936/137951.png)

*<b>Информация о сборке (</b>BuildVersionInfo<b>)</b>*

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

#### Информация о накопителе (DriveInfo)

Функциональный блок <b>*DriveInfo*</b> используется для получения информации о накопителе по имени (адресу устройства). Раздел библиотеки: <b>*Системные*</b>.

По факту наличия восходящего фронта на вход **start** ФБ выполняет разовую выдачу информации о накопителях.

Для цикличного обновления информации о накопителе необходимо обеспечить цикличную подачу восходящего фронта на вход **start**.

Назначение входов и выходов:

- **start** – запуск работы блока по восходящему фронту (**0** **→** **1**);
- **driveName** – адрес накопителя в системе (до **49** символов);
- **error** – накопитель отсутствует или недоступен;
- **capacity** – общий объем накопителя, Кбайт;
- **used** – занятый объем накопителя, Кбайт;
- **available** – доступный объем накопителя, Кбайт.

![Информация о накопителе (Drive Info)](https://docs.owen.ru/book_img/1936/137950.png)

*<b>Информация о накопителе (</b>DriveInfo<b>)</b>*

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

#### Асинхронное выполнение команд Linux (SysExecute)

Функциональный блок <b>*SysExecute*</b> используется для отправки команды в терминал Linux и получения ответа. Раздел библиотеки: <b>*Системные*</b>.

Интерфейс данного блока соответствует **CAA Behavior Model** (PLCopen Behavior Model).

Бизнес-логика ФБ выполняется в отдельном потоке и не оказывает влияние на время работы циклов таймера и фона.

> [!WARNING]
> **Внимание.** Вызываемые команды могут выполняется в неблокирующем режиме. Поток может освобождаться после подачи команды и через определенное время забирать ее ответ. Для этого в конце команды необходимо добавить знак **'&'** (амперсанд).

Если результат выполнения команды содержит более **1023** символов, выполнение команды будет прервано, будут подняты флаги **done**, **error**, но результат работы будет содержаться в **output**.

Запуск выполнения команды не произойдет, если поднят флаг прерывания **abort**.

Назначение входов и выходов:

- **execute** – запуск выполнения команды по восходящему фронту (**0** **→** **1**);
- **command** – текст команды;
- **abort** – запуск прерывания исполнения команды по восходящему фронту (**0** **→** **1**);
- **priority** – приоритет потока ожидания выполнения команды, по умолчанию **5**;
- **output** – результат выполнения команды (менее **1024** символов);
- **done** – выполнение завершено;
- **aborted** – выполнение было прервано;
- **busy** – идет работа;
- **error** – работа была прервана из-за переполнения результирующей строки.

![Асинхронное выполнение команд Linux (Sys Execute)](https://docs.owen.ru/book_img/1936/137949.png)

<i>**Асинхронное выполнение команд Linux (SysExecute)**</i>

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

#### Менеджер потоков (ThreadMan)

Блок <b>*ThreadMan*</b> предоставляет возможности управления и диагностики фоновых потоков исполнительной системы. Раздел библиотеки: <b>*Системные*</b>.

Назначение входов и выходов:

- **slp** – время сна (простоя) фоновых потоков в мкс, в этот промежуток времени управление передается другим потокам. Если задано значение **0** или блок <b>*ThreadMan*</b> не добавлен в проект, то время простоя задается таймерным промежутком места работы <b>*Таймер*</b>;
- **btd** – включение диагностики времени выполнения блоков: **0** – выключена, **1** – включена. Если диагностика включена, то в отладчике у каждого блока отображается время его выполнения, если выключена, то время выполнения всегда отображается как 1 мкс, что означает, что блок работает. На некоторых контроллерах выключение диагностики может существенно оптимизировать время выполнения всей программы;
- **num** – количество запущенных дополнительных фоновых потоков (не включает <b>*Таймер*</b>, <b>*Ввод-вывод*</b> и <b>*Фон*</b>);
- **prio_max** – максимально разрешенный приоритет для дополнительных фоновых потоков, зависит от ОС и не может быть изменен. Для места работы Поток в проекте следует выбирать приоритет ниже **prio_max**;
- **pmin** – минимальный приоритет из запущенных дополнительных фоновых потоков;
- **pmax** – максимальный приоритет из запущенных дополнительных фоновых потоков.

![Менеджер потоков (Thread Man)](https://docs.owen.ru/book_img/1936/137948.png)

<i>**Менеджер потоков (ThreadMan)**</i>

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

#### Последовательный порт (SerialPort)

Блок <b>*SerialPort*</b> представляет собой драйвер COM-порта, поддерживает системный последовательный порт под Linux и Windows. Раздел библиотеки: <b>*Системные*</b>.

**Назначение входов и выходов SerialPort**

**Входы**

| Элемент | Описание |
| --- | --- |
| **dev** | Имя устройства (например, **ser1**, **COM****2**) |
| **spd** | Скорость в бодах: **300**, **600**, **1200**, **2400**, **4800**, **9600**, **19200**, **38400**, **57600**, **115200**, **128000**, **256000**, **153600**, **230400**, **460800**, **921600** |
| **par** | Контроль четности:<br>**0** – нет;<br>**1** – нечетный;<br>**3** – четный |
| **stb** | Количество стоповых бит: **1** или **2** |
| **dtb** | Количество бит данных: **7** или **8** |

**Выходы**

| Элемент | Описание |
| --- | --- |
| **cnc** | Связь с блоком протокола |
| **stat** | Статус:<br>**1** – корректная работа;<br>**-1** – в системе не найдено устройство с именем **dev**;<br>**-2** – к выходу **cnc** не подключен блок протокола |
| **rcnt** | Количество полученных байт |
| **wcnt** | Количество отправленных байт |
| **diag** | Диагностический – счетчик разности между количеством ошибок и принятыми (не может быть меньше **0**) |

![Последовательный порт (Serial Port)](https://docs.owen.ru/book_img/1936/137947.png)

*Последовательный порт (SerialPort)*

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

### Работа со строками

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

#### Длина строки (StrLen)

Блок <b>*StrLen*</b> осуществляет подсчет количества символов **len** в строке **s**. Раздел библиотеки: <b>*Работа со строками*</b>.

Назначение входов и выходов:

- **s** – строка;
- **len** – длина.

![Длина строки (Str Len)](https://docs.owen.ru/book_img/1936/137946.png)

<i>**Длина строки (StrLen)**</i>

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

#### Часть строки (StrNmp)

Блок <b>*StrNmp*</b> выделяет часть входной строки начиная с позиции **n** и длиной **m** (1-й символ строки имеет позицию **0**). Если **n** и **m** заданы так, что длины исходной строки недостаточно, то выходная строка **res** ограничивается концом входной строки. Раздел библиотеки: <b>*Работа со строками*</b>.

Назначение входов и выходов:

- **s** – строка;
- **n** – начало;
- **m** – длина;
- **res** – выходная строка.

![Часть строки (Str Nmp)](https://docs.owen.ru/book_img/1936/137945.png)

<i>**Часть строки (StrNmp)**</i>

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

#### Слияние строк (StrApp)

Блок <b>*StrApp*</b> сливает входные строки **s** в одну результирующую строку **str**. В выходной строке строки расположены в том же порядке, что и входы **s**. Длина каждой строки **s** не должна превышать **60** символов. Раздел библиотеки: <b>*Работа со строками*</b>.

Назначение входов и выходов:

- **s0**, **s1**, **…**, **sn** – строки;
- **res** – результирующая строка.

![Слияние строк (Str App](https://docs.owen.ru/book_img/1936/137944.png)

<i>**Слияние строк (StrApp)**</i>

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

### Сохранение данных 

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

#### Хранение параметров на диске (SaverEx)

Блок <b>*SaverEx*</b> обеспечивает хранение данных в архиве на диске контроллера в виде бинарного файла. Раздел библиотеки: <b>*Сохранение данных*</b>.

Поскольку операции файлового ввода/вывода занимают значительное время, данный блок следует размещать только в <b>*Фоне*</b>.

**Назначение входов и выходов SaverEx**

**Входы**

| Элемент | Описание |
| --- | --- |
| rst | Сброс ошибок записи |
| fnm | Абсолютный путь и имя файла на диске (может быть пустым – задается автоматически), расширение игнорируется. При сохранении данных на внешнем накопителе следует использовать путь, указанный на выходе блока <b>*210-*</b><b>*SD*</b><b>*-*</b><b>*USB*</b> из библиотеки <b>*paOwenIO*</b> (константный) |
| wr | Запись на диск |
| in | Значение параметра (циклический) |
| typ | Тип параметра (циклический, константный):<br>**DI** – 8-ми битный регистр;<br>**AI** – вещественное значение;<br>**II** – 16-ти битный регистр |
| ini | Значение для инициализации (циклический, константный) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| next | Имя следующего файла |
| enb | Запись разрешена |
| sts | Статус:<br>**0** – после сброса;<br>**1** – записан;<br>**2** – прочитан;<br>**<0** – ошибка |
| good | Количество удачных записей |
| bad | Количество ошибок записи |
| rej | Количество отклоненных записей |
| o | Текущее значение параметров (циклический) |

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

Данные организуются в виде переменных **in** с жестко заданным типом **typ**.

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

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

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

Запись на диск можно осуществить принудительно, подав команду **wr**.

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

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

Если происходит однократная ошибка при записи файла на диск, блок пытается переименовать текущий файл и снова произвести запись. Если повторная запись оказывается удачной, то продолжается работа в обычном режиме, а выход **bad** инкрементируется. Следует следует принять меры по диагностике или замене носителя, поскольку сбои при записи могут быть следствием скорого выхода его из строя. Файл, на котором произошел сбой, остается на диске под тем же именем с добавленным к нему суффиксом, равным метке времени сбоя (в мс от 1 января 1970 г). Удалять его не желательно, чтобы повторно не использовать потенциально сбойный сектор.

Если происходит повторный сбой записи, то блок блокируется (выход **enb = 0**) и больше не производит попыток переименований файлов и записи до тех пор, пока ошибки не будут сброшены фронтом на входе **rst**.

> [!WARNING]
> **Внимание.** При изменении числа входов блока <b>*SaverEx*</b> файлы на диске перезаписываются.

Подробнее о возможностях и работе блока <b>*SaverEx*</b> см. в документе [Архивирование и сохранение уставок](https://owen.ru/product/polygon/documentation).

![Хранение параметров на диске (Saver Ex)](https://docs.owen.ru/book_img/1936/137943.png)

<i>**Хранение параметров на диске (SaverEx)**</i>

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

#### Счетчик времени наработки (CounterMEx)

Блок <b>*CounterMEx*</b> предназначен для сохранения в файл наработки устройств, например, насосов. Раздел библиотеки: <b>*Сохранение данных*</b>.

Поскольку операции файлового ввода/вывода занимают значительное время, данный блок следует размещать только в <b>*Фоне*</b>.

**Назначение входов и выходов CounterMEx**

**Входы**

| Элемент | Описание |
| --- | --- |
| rst | Сброс ошибок записи |
| fn | Абсолютный путь и имя файла (может быть пустым – задается автоматически), расширение игнорируется. При сохранении данных на внешнем накопителе следует использовать путь, указанный на выходе блока <b>*210-*</b><b>*SD*</b><b>*-*</b><b>*USB*</b> из библиотеки <b>*paOwenIO*</b> (константный) |
| ask | Запись на диск |
| slv | Используется для изменения значений счетчиков, если **slv = 1**, то **cnt = mas**, **cfrn** **=** **mcfrn** |
| enbl | Работа устройства (циклический): пока **enbl = 1**, увеличивается время наработки **cfrn**, при изменении **enbl** с **0** на **1** число включений **cnt** увеличивается на **1** |
| rst | Сброс времени наработки **cnt** (циклический) |
| frm | Формат отображения для времени наработки. Не используется |
| rfr | Сброс числа включений **cfrn** (циклический) |
| mas | Балансировка времени наработки **cnt** (циклический), если **slv = 1**, то **cnt = mas** |
| mcfrn | Балансировка числа включений **cfrn** (циклический), если **slv = 1**, то **cfrn** **=** **mcfrn** |

**Выходы**

| Элемент | Описание |
| --- | --- |
| next | Имя следующего файла |
| enb | Запись разрешена |
| good | Количество удачных записей |
| bad | Количество ошибок записи |
| cnt | Время наработки в секундах (циклический) |
| hour | Время наработки в формате часы (циклический) |
| min | Время наработки в формате минуты (циклический) |
| sec | Время наработки в формате секунды (циклический) |
| day | Текущий день (циклический) |
| mnth | Текущий месяц (циклический) |
| year | Текущий год (циклический) |
| cfrn | Число включений (циклический) |

Блок анализирует входы **enbl**.

На выходе **cfrn** отображается число включений устройства (количество изменений **enbl** c **0** на **1**), на выходе **cnt** отображается время наработки устройства (сколько секунд **enbl** был равен **1**).

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

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

Для изменения числа включений и времени наработки следует подать **1** на вход **slv**, тогда **cnt = mas**, **cfrn = mcfrn**. Это может быть полезно для синхронизации в дублированных системах.

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

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

Если происходит однократная ошибка при записи файла на диск, блок пытается переименовать текущий файл и снова произвести запись. Если повторная запись оказывается удачной, то продолжается работа в обычном режиме, а выход **bad** инкрементируется. Следует принять меры по диагностике или замене носителя, поскольку сбои при записи могут быть следствием скорого выхода его из строя. Файл, на котором произошел сбой, остается на диске под тем же именем с добавленным к нему суффиксом, равным метке времени сбоя (в мс от 1 января 1970 г). Удалять его не желательно, чтобы повторно не использовать потенциально сбойный сектор.

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

> [!WARNING]
> **Внимание.** При изменении числа входов блока <b>*CounterMEx*</b> файлы на диске перезаписываются.

Подробнее о возможностях и работе блока <b>*CounterMEx*</b> см. в документе [Архивирование и сохранение уставок](https://owen.ru/product/polygon/documentation).

![Счетчик времени наработки (Counter MEx)](https://docs.owen.ru/book_img/1936/137972.png)

<i>**Счетчик времени наработки (CounterMEx)**</i>

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

#### Буфер чтения/записи уставок (BufSupEx)

Блок <b>*BufSupEx*</b> представляет собой двунаправленный буфер данных интерфейса, а данные сохраняются в бинарном файле на диске контроллера. Блок сохраняет все значения на диске контроллера аналогично блоку [SaverEx](#topic-96230). Раздел библиотеки: <b>*Сохранение данных*</b>.

Поскольку операции файлового ввода/вывода занимают значительное время, данный блок следует размещать только в <b>*Фоне*</b>.

**Назначение входов и выходов BufSupEx**

**Входы**

| Элемент | Описание |
| --- | --- |
| inter | Cвязь от интерфейса, к которому принадлежит данный буфер |
| group | Номер группы (константный) |
| fnm | Абсолютный путь и имя файла (может быть пустым – задается автоматически), расширение игнорируется. При сохранении данных на внешнем накопителе следует использовать путь, указанный на выходе блока <b>*210-*</b><b>*SD*</b><b>*-*</b><b>*USB*</b> из библиотеки <b>*paOwenIO*</b> (константный) |
| mask | Не используется |
| rst | Сброс ошибок записи |
| wr | Запись на диск |
| dan | Значение, которое записывается в буфер при **czap = 1** (циклический) |
| czap | Запись значения **dan** (циклический) |
| typ | Тип параметра (циклический, константный):<br>**DI**, **DO** – 8-ми битный регистр;<br>**AI**, **AO** – вещественное значение;<br>**II**, **IO** – 16-ти битный регистр |
| adr | Адрес параметра (циклический, константный) |
| ini | Значение для инициализации (циклический, константный) |
| min | Минимум. Если принятое значение меньше **min**, то оно игнорируется (циклический) |
| max | Максимум. Если принятое значение больше **max**, то оно игнорируется (циклический) |

**Выходы**

| Элемент | Описание |
| --- | --- |
| pkt | Подключение к блокам <b>*OpcUAClient*</b>, <b>*UABufSups*</b> из библиотеки <b>*paOpcUA*</b> |
| next | Имя следующего файла |
| enb | Запись разрешена |
| sts | Статус:<br>**0** – после сброса;<br>**1** – записан;<br>**2** – прочитан;<br>**<0** – ошибка |
| good | Количество удачных записей |
| bad | Количество ошибок записи |
| rej | Количество отклоненных записей |
| dan | Значение параметра, полученное по интерфейсу или на вход **dan** (после проверки на **min** и **max**) |
| chn | Признак изменения, выставляется в **1** на один цикл выполнения программы, если значение **dan** изменилось |
| zap | Признак записи, выставляется в **1** на один цикл выполнения программы, если значение с входа **dan** было записано |

Номер группы **group** используется в качестве Slave ID при подключении к блоку интерфейса Modbus Slave.

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

Адрес переменной **adr** зависит от интерфейса, к которому подключен буфер, например, адрес регистра Modbus.

Поскольку входы **dan** имеют тип <b>*any*</b>, следует строго соблюдать правила преобразования типов при проведении связей.

Если файл существует на диске, выходы инициализируются сохраненными значениями. Если файла не существует – выходы инициализируются значениями инициализации **ini**.

Запись в файл осуществляется при изменении значений на входах **dan** или по интерфейсу. Если файла на диске не существует и выходы **dan** приняли значения **ini**, то можно записать их на диск принудительно, подав команду **wr**.

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

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

Имя файла и путь к нему задается на входе **fnm**. Имя может быть пустым, тогда имя файла будет выбрано автоматически по индексу блока, а файл сохранится в рабочую директорию контроллера. Если повторная запись оказывается удачной, то продолжается работа в обычном режиме, а выход **bad** инкрементируется. Следует принять меры по диагностике или замене носителя, поскольку сбои при записи могут быть следствием скорого выхода его из строя. Файл, на котором произошел сбой, остается на диске под тем же именем с добавленным к нему суффиксом, равным метке времени сбоя (в мс от 1 января 1970 г). Удалять его не желательно, чтобы повторно не использовать потенциально сбойный сектор.

Если происходит повторный сбой записи, то блок блокируется (выход **enb** **= 0**) и больше не производит попыток переименований файлов и записи до тех пор, пока ошибки не будут сброшены фронтом на входе **rst**.

> [!WARNING]
> **Внимание.** При изменении числа входов блока <b>*BufSupEx*</b> файлы на диске перезаписываются.

Подробнее о возможностях и работе блока <b>*BufSupEx*</b> см. в документе [Архивирование и сохранение уставок](https://owen.ru/product/polygon/documentation).

![Буфер чтения-записи уставок (Buf Sup Ex)](https://docs.owen.ru/book_img/1936/137971.png)

<i>**Буфер чтения/записи уставок (BufSupEx)**</i>

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

#### Запись логов в оперативную память (RamLog)

Блок <b>*RamLog*</b> обеспечивает возможность сбора логов по заданным параметрам для сохранения в оперативную память. Запись происходит в несколько буферов, которые при заполнении или по таймауту попадают в очередь для передачи на выход (сама передача происходит при условии, что предыдущий прочтен). Раздел библиотеки: <b>*Сохранение данных*</b>.

Так как работа блока занимает значительное время, данный блок следует размещать только в <b>*Фоне*</b>.

**Назначение входов и выходов RamLog**

**Входы**

| Элемент | Описание |
| --- | --- |
| enb | Включение блока |
| bsize | Размер буфера – позволяет задать максимальное количество символов, хранимых в отдельном буфере: **128…4096** |
| bnum | Количество буферов: **2…64** |
| init | Создать ли все буферы при инициализации. Полезно, если требуемые диагностические сообщения имеют большой объем и генерируются с самого начала работы программы. Изначально, при инициализации создается минимальное количество буферов и, если требуется, увеличивается в процессе работы. Если **init = 1**, то сразу будет создано **bnum** буферов |
| tmout | Таймаут неполного буфера, мс - определяет временной промежуток, через который буфер, не заполненный до конца, будет считаться готовым к выдаче. Отсчет ведется с момента последнего дописанного сообщения. Полезно, если диагностические сообщения генерируются редко или имеют малый объем |
| glvl | Уровень ошибок, если у сообщения уровень меньше или равен заданному, то оно будет напечатано независимо от кодов и индексов (**ERR = 1**, **WRN = 2**, **INF = 3, DBG = 10**, **DBG + N**) |
| dbglvl | Уровень отладки, если у сообщения уровень превышает заданный, оно не будет напечатано |
| dscrd | Сброс, очищает списки отслеживаемых блоков и кодов. Срабатывает при изменении значения с **0** на **1** |
| code | Код отладки – значение, которое будет добавлено в список отслеживаемых при изменении входа **addcd** или удалено при изменении входа **delcd** |
| addcd | Добавить код |
| delcd | Удалить код |
| indx | Индекс блока – значение, которое будет добавлено в список отслеживаемых при изменении входа **addix** или удалено при изменении входа **delix** |
| addix | Добавить индекс |
| delix | Удалить индекс |
| print | Выводить записываемые логи в консоль |

**Выходы**

| Элемент | Описание |
| --- | --- |
| sts | Статус:<br>**0** – нормальная работа;<br>**+2** – сообщение, записываемое в буфер, превышает его максимальный размер, часть сообщения обрезана;<br>**+4** – все буферы заполнены, происходит периодическая потеря сообщений. Для устранения ошибок следует изменить соответствующие входные параметры: размер **b****s****ize** или количество **bnum** |
| log | Текущий буфер, доступный для чтения |
| cds | Список отслеживаемых диагностических кодов |
| indxs | Список индексов отслеживаемых блоков |

![Запись логов в оперативную память (Ram Log)](https://docs.owen.ru/book_img/1936/137970.png)

<i>**Запись логов в оперативную память (RamLog)**</i>

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

### Очереди

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

#### Очередь битов qb

Тип данных <b>*qb*</b> позволяет накапливать очередь битовых значений в таймерном потоке. Если выход типа <b>*qb*</b> использовать в обмене по протоколу **OPC UA**, то будут переданы все накопленные данные, независимо от настроек подписки.

![Очередь битов qb](https://docs.owen.ru/book_img/1936/137969.png)

![Очередь битов qb2](https://docs.owen.ru/book_img/1936/137968.png)

<i>**Очередь битов** qb</i>

Если передача слишком медленная или входной сигнал изменяется слишком часто, то очередь может переполниться, что будет видно на выходе блока-источника очереди (например, [R2toQuBit](#topic-96236)). Для изменения размера очереди необходимо перетранслировать программу.

При соединении выхода типа <b>*qb*</b> с битовым входом, расположенным в фоновом потоке, будет автоматически выполнено преобразование (блок [QuBit_Bit](#topic-96235)), которое обеспечит гарантированную передачу бита. Пример ниже показывает разницу между обычным битом и битов с накоплением очереди. Обычный импульс, сформированный в таймере, ннельзя гарантированно получить в фоновом потоке, если длительность импульса достаточно мала.

![Разница между обычным битом и битов с накоплением очереди2](https://docs.owen.ru/book_img/1936/137967.png)

![Разница между обычным битом и битов с накоплением очереди1](https://docs.owen.ru/book_img/1936/137966.png)

<i>**Разница между обычным битом и битом с накоплением очереди**</i>

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

#### Преобразование регистра в очереди битов (R2toQuBit)

Блок <b>*R*</b><b>*2*</b><b>*toQuBit*</b> разбирает входной регистр на биты, каждый из которых может накапливать очередь значений в таймерном потоке. Раздел библиотеки: <b>*Очереди*</b>.

Назначение входов и выходов:

- **qus** – размер очереди (на каждый выходной бит);
- **reg** – входной регистр;
- **ov** – количество переполнений очереди;
- **n** – текущее количество очередей;
- **b****0**, **…**, **b15** – биты.

![Преобразование регистра в очереди битов (R2to Qu Bit)](https://docs.owen.ru/book_img/1936/137965.png)

<i>**Преобразование регистра в очереди битов (R2toQuBit)**</i>

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

#### Преобразование очереди битов в бит (QuBit_Bit)

Блок <b>*QuBit*</b><b>*\_*</b><b>*Bit*</b> преобразует очередь битов в бит, который можно дальше использовать в фоновом потоке. Среда разработки автоматически добавляет этот блок, если проведена связь между выходом типа **qb** и входом типа **b**. Раздел библиотеки: <b>*Очереди*</b>.

Назначение входов и выходов:

- **in** – входная очередь;
- **val** – какое значение ловить;
- **out** – выход.

Алгоритм работы: значения из входной очереди сравниваются с заданным (вход **val**), и если встречается хотя бы одно, то выход **out** устанавливается равным **val**.

![Преобразование очереди битов в бит (Qu Bit Bit)](https://docs.owen.ru/book_img/1936/137964.png)

*Преобразование очереди битов в бит (QuBit_Bit)*
