<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://docs.kb-agava.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=TaushkanovKV</id>
	<title>docs.kb-agava.ru - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.kb-agava.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=TaushkanovKV"/>
	<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/view/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/TaushkanovKV"/>
	<updated>2026-05-25T06:53:09Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3510</id>
		<title>Перечень изменений AgavaSCADA/AgavaPLC 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3510"/>
		<updated>2026-05-07T05:45:26Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные изменения в сравнении с версией 1.2:&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания программ на языке C++ в соответствии с подходом, описанным в стандарте МЭК 61131-3.&lt;br /&gt;
# Продолжение развития объектной модели и возможности разработки программ, начатых в версии &amp;lt;code&amp;gt;AS 1.5&amp;lt;/code&amp;gt;. [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
# Добавлена поддержка локального и онлайн (удаленного) отладчика.&lt;br /&gt;
# Для редактирования текстов программ, функций и классов внедрен новый, удобный и функциональный текстовый редактор, подобный распространенному VSCode.&lt;br /&gt;
# Транспорты MQTT, SNMP, МЭК 60870-5-101, МЭК 60870-5-104 портированы на ПК с ОС Linux x64 и контроллеры АГАВА.&lt;br /&gt;
# Реализован новый архиватор в БД PostgreSQL.&lt;br /&gt;
# Добавлена поддержка ресурсов и библиотек ресурсов.&lt;br /&gt;
# Добавлена Web-визуализация. См. пример &amp;lt;code&amp;gt;Visualization/MultiImageLabel&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Разработан ряд примеров, демонстрирующих новые возможности: &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PIDRegulator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Wdt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AgavaAnalogInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WidgetAgavaInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Pump&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; и другие.&lt;br /&gt;
Также запланировано добавление новых возможностей:&lt;br /&gt;
# Поддержка языка ST МЭК 61131-3  (Structured text).&lt;br /&gt;
# Поддержка распределенных проектов.&lt;br /&gt;
# Поддержка сохранения в проекте информации о целевой системе.&lt;br /&gt;
# Конфигурирование целевых устройств из проекта.&lt;br /&gt;
# Создание расширений для среды разработки с помощью SDK.&lt;br /&gt;
Перевод разработанных ранее проектов на актуальную версию описан в документе [[Миграция проектов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== 1.6.34-r1005c4072459 от 2026-04-24 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Восстановлена работа узла &amp;lt;code&amp;gt;Транспорт OPC UA&amp;lt;/code&amp;gt;. Восстановлена обработка операций после чтения и перед записью.&lt;br /&gt;
# Дополнена валидация узла &amp;lt;code&amp;gt;Тег OPC UA&amp;lt;/code&amp;gt;. '''В связи с обширной переделкой транспорта и тега изменены настройки свойства &amp;lt;code&amp;gt;Тип значения&amp;lt;/code&amp;gt;, для ранее созданных проектов требуется ревизия значений данного свойства тегов.'''&lt;br /&gt;
# Исправлены ошибки в работе узла &amp;lt;code&amp;gt;Сигнал комплексный&amp;lt;/code&amp;gt;. Также реализована выдача сигнала обновления значения при изменении значений свойств во время исполнения.&lt;br /&gt;
# Исправлен запуск и валидация узла &amp;lt;code&amp;gt;Монитор событий комплексный&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализована работа архиваторов, графика исторического и отчетов со свойствами узлов. Теперь архивация значений свойств работает корректно.&lt;br /&gt;
# Доработана объектная модель: для класса &amp;lt;code&amp;gt;NodeProperty&amp;lt;/code&amp;gt; добавлены перегрузки &amp;lt;code&amp;gt;SetValue(ResourceLink)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;SetValue(Color)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны архиваторы &amp;lt;code&amp;gt;PostgreSQL&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;SQLite&amp;lt;/code&amp;gt; - отключена запись изменений свойств всех узлов коллекции (ошибочно введенная ранее функция).&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Виджет &amp;quot;Условное изображение&amp;quot;&amp;lt;/code&amp;gt; - исправлена работа свойства &amp;lt;code&amp;gt;Видимость&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Узел типа &amp;lt;code&amp;gt;Система сигнализации&amp;lt;/code&amp;gt; внесен в объектную модель. Зарегистрирован метод &amp;lt;code&amp;gt;void SystemAlarming::AcknowledgeAll()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлены ошибки в методах &amp;lt;code&amp;gt;BasicNode::GetPath()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::GetName()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::SetName()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::GetDescription()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::SetDescription()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка некорректной остановки &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt; серверов.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при закрытии проекта.&lt;br /&gt;
# Исправлена ошибка копирования экземпляров классов.&lt;br /&gt;
# Исправлена ошибка, возникавшая при вставке узлов экземпляров из другого проекта.&lt;br /&gt;
# Устранена критическая ошибка в системе проверки прав, возникавшая при проверке проекта.&lt;br /&gt;
# Исправлена критическая ошибка создания узла типа &amp;lt;code&amp;gt;Логгер PostgreSQL&amp;lt;/code&amp;gt;.&lt;br /&gt;
# При валидации проекта добавлены предупреждения о кириллических символах в именах узлов.&lt;br /&gt;
# Доработана компиляция проекта -  изменено отображение замечаний об исключениях. Теперь исключение, возникающее при компиляции такого проекта, отображается как ошибка для большей заметности. Устранены неинформативные замечания этапа компиляции.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;Visualization/DynamicWidgets&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан пример &amp;lt;code&amp;gt;Visualization/WidgetAgavaInput&amp;lt;/code&amp;gt; - добавлена демонстрация вызова метода виджета из кнопки на форме.&lt;br /&gt;
# Пример &amp;lt;code&amp;gt;Transports/ModbusMasterSlave&amp;lt;/code&amp;gt; дополнен демонстрацией работы TCP Master/Slave.&lt;br /&gt;
&lt;br /&gt;
=== Разное ===&lt;br /&gt;
&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;ASLauncher&amp;lt;/code&amp;gt; - доработана утилита конфигурирования - настройки сети и времени для ОС Windows.&lt;br /&gt;
&lt;br /&gt;
== 1.6.33-rc335f5d9dacf от 2026-04-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработан выполнение алгоритмов C++: &lt;br /&gt;
#* Возвращён вызов виртуальных методов BasicSource. &lt;br /&gt;
#* Реализована защита от рекурсии в методах BasicSource.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; - зарегистрированы конструкторы и методы работы с типами uint64, uint32.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Отключена возможность множественных подключений к транспорту в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; :&lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Восстановлена работа в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт УПД&amp;lt;/code&amp;gt;: &lt;br /&gt;
## Исправлена работа со свойством &amp;lt;code&amp;gt;Идентификаторы ведущих&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Добавлено отслеживание активного подключения в режиме &amp;lt;code&amp;gt;Slave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Зарегистрирован класс [[Класс any|any]].&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Retain накопитель&amp;lt;/code&amp;gt; - реализована возможность сохранения через задержку.&lt;br /&gt;
# Добавлена возможность связывания свойств экземпляров с свойствами других узлов.&lt;br /&gt;
# Добавлены типы (u)int64 для связи со свойствами экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в команде &amp;quot;Показать в графическом представлении&amp;quot;.&lt;br /&gt;
# Доработано контекстное меню дерева проекта: &lt;br /&gt;
#* Исправлена критическая ошибка в команде &amp;quot;Выделить&amp;quot; для виджетов.&lt;br /&gt;
#* Пункт &amp;quot;Выделить&amp;quot; перемещен на уровень выше.&lt;br /&gt;
#* Добавлено действие &amp;quot;Выделить&amp;quot; на двойной клик по виджетам.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при открытии диалога &amp;quot;Настройки&amp;quot; для графиков.&lt;br /&gt;
# Устранены назойливые сообщения загрузки плагинов и регистрации узлов при проверке проекта.&lt;br /&gt;
# Добавлена возможность восстановления связей между узлами при вставке фрагментов из других проектов.&lt;br /&gt;
# Исправлена ошибка многократной установки ошибок в редактор кода, приводившая к сильному замедлению работы при большом количестве открытых окон редактора.&lt;br /&gt;
# Реализовано отображение содержимого массивов и указателей (хэндлов) в режиме отладки.&lt;br /&gt;
# Добавлены файловые ассоциации на файл проекта для быстрого открытия проекта в среде разработки с помощью двойного клика по .asp файлу.&lt;br /&gt;
# '''Отключен вызов сеттеров свойств при установке значений свойств в среде разработки.'''&lt;br /&gt;
# Отключено кеширование композиций в среде разработки.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при установке значения свойства типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; у экземпляра после сборки проекта.&lt;br /&gt;
# Доработано контекстное меню дерева проекта и контекстное меню графического предаставления - добавлены иконки элементов контекстного меню &amp;lt;code&amp;gt;Добавить узел&amp;lt;/code&amp;gt;, изменен порядок команд для более удобного их использования.&lt;br /&gt;
# Изменена горячая клавиша создания проекта на &amp;lt;code&amp;gt;Ctrl+Shift+N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Добавлено логгирование для системного и межстанционного транспортов.&lt;br /&gt;
# Убрана поддержка IPv6 в системном транспорте и межстанционном транспорте для работы на встраиваемых системах без IPv6.&lt;br /&gt;
# Исправлена критическая ошибка в BasicNode, иногда приводившая к крахам при одновременном доступе к объекту из разных задач.&lt;br /&gt;
&lt;br /&gt;
== 1.6.32-r79b12a16bbd7 от 2026-03-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Класс &amp;lt;code&amp;gt;WindowForm&amp;lt;/code&amp;gt; добавлен в объектную модель.&lt;br /&gt;
# Отключена возможность добавления узлов типа &amp;lt;code&amp;gt;Задача ПЛК&amp;lt;/code&amp;gt; как устаревшего функционала. Вместо него будет добавлена возможность создавать программы на языках FBD, CFC, SFC.&lt;br /&gt;
# Реализовано автоматическое создание конструкторов по умолчанию для классов из ОМ при отсутствии пользовательского.&lt;br /&gt;
# Исправлен запуск сигналов.&lt;br /&gt;
# Устранены утечки памяти при сохранении проекта в .bin.&lt;br /&gt;
# Внутренняя реорганизация обработчиков событий OperationsInput, OperationsOutput в узле &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен TransportModbusRtuIdr2.&lt;br /&gt;
# В действии &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; исправлена работа форматтера &amp;lt;code&amp;gt;$$pd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан редактор графического представления: добавлена сетка, [[Универсальная среда разработки Agava#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5 .D1.8F.D0.BA.D0.BE.D1.80.D0.B5.D0.B9|линейки, якоря]], функции выравнивания виджетов.&lt;br /&gt;
# Исправлена ошибка, вызывавшая двойной вызов обработчиков событий мыши для окон.&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при удалении виджетов.&lt;br /&gt;
# Добавлено приветственное окно со списком последних открытых проектов и таблицей примеров.&lt;br /&gt;
# Исправлена некритическая ошибка, возникавшая при закрытии фрейма.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при закрытии окна с кешированными композициями.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-rac6da98668fb от 2025-12-26 ==&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
# Добавлен пример  &amp;lt;code&amp;gt;Controllers/PLC70_Submodules&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-r9e81e0333260 от 2025-12-25 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания конструкторов вида Classname(const string &amp;amp;in path) в дереве.&lt;br /&gt;
# Исправлена ошибка в вызове обработчика &amp;lt;code&amp;gt;OnWheel&amp;lt;/code&amp;gt; у виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Корзина субмодулей&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Уменьшено время ожидания ответа субмодуля с 1000 мс до 25 мс.&lt;br /&gt;
#* Реализована поддержка слотов G/H/I/K для ПЛК-70. &lt;br /&gt;
#* Реализовано создание узлов для каналов субмодулей в дереве проекта. '''Обратите внимание, проекты, использующие прежнюю структуру субмодулей, не совместимы с версией AgavaSCADA/AgavaPLC 1.6.31!'''&lt;br /&gt;
#* Исправлена валидация слотов на уровне субмодуля. Добавлена проверка на занятость одного слота несколькими субмодулями с формированием сообщения об ошибке.&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-60&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлено ограничение значений подсветки экрана и индикаторов, добавлена валидация соответствующих свойств узлов.&lt;br /&gt;
#* Реализована установка яркости подсветки экрана и состояния светодиодов согласно настроек в проекте.&lt;br /&gt;
# Доработан транспорт OPC UA: &lt;br /&gt;
#* Добавлена поддержка типа double.&lt;br /&gt;
#* Устранены критические ошибки при повторном запуске транспорта и при записи в read-only тэги.&lt;br /&gt;
#* Добавлено уведомление пользователя о некорректных тэгах.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;: исправлено форматирование значений типа double - число знаков после запятой теперь зависит от шага значения.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена потенциальная ошибка сохранения проекта при открытии в проводнике папки с проектом.&lt;br /&gt;
# Изменен мастер создания проектов: для проектов для &amp;lt;code&amp;gt;ПЛК-70.А&amp;lt;/code&amp;gt;, создаваемых с помощью мастера, используется узел &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt; в предыдущей версии.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при запуске на ПК среды исполнения без проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.30-rb3d3b577ed29 от 2025-12-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Ядро ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена работа системного транспорта: устранена ошибка взаимодействия с другими станциями.&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка с обработкой вложенных групп в узле типа &amp;lt;code&amp;gt;Приложение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;NodeProperty&amp;lt;/code&amp;gt;: изменена регистрация класса, устранены критические ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработано редактирование свойств типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt;: добавлен сброс значения, позволяющий удалить ранее установленное значение.&lt;br /&gt;
# Доработан редактирование свойств типа &amp;lt;code&amp;gt;NodeLink&amp;lt;/code&amp;gt;: исправлена ошибка при работе с узлами с одними цифрами в имени.&lt;br /&gt;
# Доработано окно свойств: свойства типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt; принимают перетаскивание узлов.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Стек вызовов&amp;lt;/code&amp;gt;: при двойном клике по элементам таблицы открывается редактор кода.&lt;br /&gt;
# Доработан редактор кода: добавлены маркеры ошибок компиляции.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Ошибки&amp;lt;/code&amp;gt;: при двойном клике на ошибке выполняется открытие редактора кода.&lt;br /&gt;
# '''Добавлена возможность поиска по проекту. Панель поиска вызывается комбинацией клавиш &amp;lt;code&amp;gt;Ctrl+Shift+F&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Доработано окно тревог: добавлено сообщение &amp;quot;Активных тревог нет&amp;quot; в центре таблицы при отсутствии активных тревог.&lt;br /&gt;
&lt;br /&gt;
== 1.6.29-rf17ce9e25c7a от 2025-11-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;SetNodeValueAsUInt(string strNodePath, uint32_t uiValue)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Требовать квитирование&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана система тревог: добавлены обработчики событий &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;OnActiveEventsAcknowledged&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан архиватор SQLite: изменен алгоритм прореживания в режиме &amp;lt;code&amp;gt;Процент от среднего значения&amp;lt;/code&amp;gt; — теперь среднее вычисляется по последним N значениям.   Добавлено свойство &amp;lt;code&amp;gt;Размер окна среднего (N)&amp;lt;/code&amp;gt; для настройки ширины окна. Также добавлена опция &amp;lt;code&amp;gt;Процент от среднего (окно по времени)&amp;lt;/code&amp;gt;, в которой среднее рассчитывается по значениям за временной интервал, равный параметру &amp;lt;code&amp;gt;Интервал архивирования&amp;lt;/code&amp;gt;.  Исправлено отсутствие таблицы &amp;lt;code&amp;gt;SignalInfo&amp;lt;/code&amp;gt; при ротации БД.&lt;br /&gt;
# Доработана система тревог: добавлено свойство &amp;lt;code&amp;gt;Использовать цвет группы&amp;lt;/code&amp;gt; для отображения элементов в окне тревог.   Добавлено сохранение событий квитирования.&lt;br /&gt;
# Доработано окно смены пароля: добавлена поддержка свойства &amp;lt;code&amp;gt;Запретить смену пароля&amp;lt;/code&amp;gt; у узла пользователя.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;void sleep(ms)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Изменена логика работы функции &amp;lt;code&amp;gt;LaunchProcess&amp;lt;/code&amp;gt;, которая теперь выполняет запуск в блокирующем режиме, то есть функция завершится после завершения запущенного процесса.&lt;br /&gt;
# Исправлена ошибка в узле &amp;lt;code&amp;gt;Операция Таймер&amp;lt;/code&amp;gt;. Теперь выключенные действия в обработчике &amp;lt;code&amp;gt;OnTimerFinished&amp;lt;/code&amp;gt; не исполняются.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Упорядочен вывод сообщений в окно Сообщения. Устранен вывод служебных сообщений.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.28-r7aa0d6dc2386 от 2025-11-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработано действие Смена пароля пользователя - пользователи с запретом смены пароля блокируются в списке выбора.&lt;br /&gt;
# Исправлена критическая ошибка в системе проверки прав, возникающая при некорректной конфигурации системы. Дополнена валидация системы для уведомления о некорректной конфигурации.&lt;br /&gt;
# Доработана стандартная библиотека: реализованы функции &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetInterfaceAddresses(string)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetNetworkInterfaces()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запретить изменение пароля&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована работа со значениями типа SignalValue.&lt;br /&gt;
# Доработаны приложения - реализована выдача значений типа SignalValue для свойств экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в виджетах &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt;, возникавшая при удалении источника из списка.&lt;br /&gt;
# Добавлено сохранение типа узла в его тег в XML проекте.&lt;br /&gt;
# Изменено редактирование узлов &amp;lt;code&amp;gt;Операция скрипт С++&amp;lt;/code&amp;gt;, размещенных в обработчиках. Теперь это работает почти как в версии 1.2, но переход к редактору возможен только по нажатию ОК. При закрытии диалога контейнера добавлено закрытие окна редактора кода для вложенного узла.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, демонстрирующий применение ООП в проекте.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;, демонстрирующие принцип построения распределенных проектов.&lt;br /&gt;
&lt;br /&gt;
== 1.6.27-r8573369cf034 от 2025-10-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработана [[Узлы проекта AgavaSCADA/AgavaPLC#Композиция|композиция многослойная]]: добавлено свойство &amp;lt;code&amp;gt;ActionsOnLoad&amp;lt;/code&amp;gt;.&lt;br /&gt;
# В стандартную  библиотеку добавлена поддержка класса &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено чтение свойств типа &amp;lt;code&amp;gt;NColor&amp;lt;/code&amp;gt;  [[Свойства узлов в AgavaSCADA/AgavaPLC#NColor|через преобразование в int]].&lt;br /&gt;
# Устранены критические ошибки в системных функциях поиска файлов, возникавшие при работе с разрушенными файловыми системами.&lt;br /&gt;
# Добавлены функции &amp;lt;code&amp;gt;bool isnan(float value)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void LaunchProcess(string strFilePath)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.26-rfd1b5cbbf1fc от 2025-10-23 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Для узлов &amp;lt;code&amp;gt;RetainStorage&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;StorageDrive&amp;lt;/code&amp;gt; реализовано онлайн создание свойств.&lt;br /&gt;
# Доработаны методы &amp;lt;code&amp;gt;BasicSignal::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSignal::UpdateValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::UpdateValue&amp;lt;/code&amp;gt; - реализована выдача кодов [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|ошибок]].&lt;br /&gt;
# Доработаны архиваторы &amp;lt;code&amp;gt;SQLite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PostreSQL&amp;lt;/code&amp;gt; - добавлена возможность прореживания записи в БД.&lt;br /&gt;
# Выполнен рестайлинг окон проверки подлинности пользователя и смены пароля пользователя.&lt;br /&gt;
# Доработаны библиотеки ресурсов - исправлена работа с русскими символами.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Текущий&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана логика работы операторов &amp;lt;code&amp;gt;SignalValue operator&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SignalValue operator||&amp;lt;/code&amp;gt; - реализована генерация соответствующих событий при ошибках исполнения. Реализовано более простое и корректное сравнение значений. Изменен режим сравнения аргументов типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно с композицией: исправлена работа с свойством &amp;lt;code&amp;gt;CurrentCompositionDesc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;: устранена ошибка &amp;quot;Illegal Data Address&amp;quot; в режиме &amp;quot;Сервер&amp;quot; при создании нескольких блоков регистров.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск метода экземпляра&amp;lt;/code&amp;gt;: добавлена возможность передачи аргументов.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлен форматтер &amp;lt;code&amp;gt;$$ns&amp;lt;/code&amp;gt; - шифр узла.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt;: для вложенных действий типа &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; передается ссылка на себя для работы с форматтерами.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена критическая ошибка, возникавшая при кликах по свойствам только для чтения типа bool узлов в дереве проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.25-r97ac006e3905 от 2025-10-15 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;bool isnan(double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int LoadComposition(string, string, int)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена возможность размещения пользовательских виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Не показывать в списке&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в действии &amp;lt;code&amp;gt;Закрытие окна&amp;lt;/code&amp;gt;, возникавшая при закрытии нескольких окон подряд на активном экране.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Тренд&amp;lt;/code&amp;gt; графика исторического: в свойство &amp;lt;code&amp;gt;Использовать описание и шифр&amp;lt;/code&amp;gt; добавлен вариант &amp;lt;code&amp;gt;Вышестоящий узел сигнала&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена отдельная иконка для аварий. Исправлена работа свойства &amp;lt;code&amp;gt;Включить воспроизведение звуков&amp;lt;/code&amp;gt; на контроллерах.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: исправлена ошибка, при возникновении которой при деактивации события выводился текст активации.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при редактировании свойств типа &amp;lt;code&amp;gt;Узел&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Устранено &amp;quot;зависание&amp;quot; среды разработки при онлайн отладке и просмотре значений переменных из отлаживаемой программы.&lt;br /&gt;
# Доработано окно редактирования свойств типа &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;: добавлена возможность перемещения элементов.&lt;br /&gt;
# Доработано окно редактирования списка привилегий у роли: добавлена поддержка клавиши Del, реализовано сохранение и восстановление геометрии окна, реализовано удаление множества элементов.&lt;br /&gt;
# Доработано окно ошибок: двойной клик по ошибке выделяет в дереве проекта узел, вызвавший ошибку.&lt;br /&gt;
# Исправлено повторное открытие окна настройки привилегий.&lt;br /&gt;
# Доработана библиотека ресурсов: сохранение теперь выполняется только при наличии изменений.&lt;br /&gt;
&lt;br /&gt;
== 1.6.24-r93067f2c1dd1 от 2025-10-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;double rand(double, double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена поддержка команды &amp;lt;code&amp;gt;Сброс&amp;lt;/code&amp;gt; для действия &amp;lt;code&amp;gt;Команда узлу&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Контроллер событий&amp;lt;/code&amp;gt; переименован в &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Для монитора событий добавлено свойство &amp;lt;code&amp;gt;Блокировка работы&amp;lt;/code&amp;gt;, добавлен обработчик &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt;, вызывающийся после удаления всех активных тревог.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Регистр Modbus&amp;lt;/code&amp;gt; - добавлена поддержка онлайн создания свойств.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Транспорт Modbus&amp;lt;/code&amp;gt;: в режиме работы Slave устранена критическая ошибка, если не было указано свойство &amp;quot;Узел для чтения/записи&amp;quot;. Добавлено соответствующее предупреждение при сборке проекта.&lt;br /&gt;
# Добавлена поддержка связывания свойств экземпляров через аргументы типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Поведение при блокировании&amp;lt;/code&amp;gt;. Добавлена проверка значений контролируемых узлов при старте проекта.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан текстовый редактор кода: добавлена обработка нажатия клавиши &amp;lt;code&amp;gt;F9&amp;lt;/code&amp;gt; для добавления/удаления точек останова. Значительно ускорено открытие текстов программ в редакторе.&lt;br /&gt;
# Доработан отладчик: добавлено человеко-читаемое представление значений типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Дополнен пример &amp;lt;code&amp;gt;TestEventsAlarms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.23-ra13bff0d25ce от 2025-09-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлено восстановление свойств экземпляров объектов из retain.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt; - реализован арбитраж чтения/записи с помощью приоритетов.&lt;br /&gt;
# Исправлено некорректное позиционирование окон авторизации пользователя, выбора интервала графика или журнала и др. в проектах с составными фреймами, содержащими множество окон.&lt;br /&gt;
# Реализована запись во все источники узла &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка в редактировании свойств типа &amp;lt;code&amp;gt;Цвет&amp;lt;/code&amp;gt;, из-за которой иногда некорректно сохранялось значение альфа канала.&lt;br /&gt;
# Исправлена ошибка использования одной библиотеки ресурсов в разных проектах.&lt;br /&gt;
&lt;br /&gt;
== 1.6.22-r2d092373a7c2 от 2025-09-24 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Исправлены критические ошибки обращения к свойствам экземпляров объектов при выполнении программ.&lt;br /&gt;
# Исправлена ошибка первичного отображения окна тревог.&lt;br /&gt;
# Устранены ошибки в работе субмодулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранены ошибки компиляции проектов, использующих субмодули.&lt;br /&gt;
&lt;br /&gt;
== 1 1.6.21-rb7d9d1301bf0 от 2025-09-18 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств для виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализована проверка свойства &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; у действий перед выполнением.&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств экземпляров объектов и связывания их с методами и инициализации значениями.&lt;br /&gt;
# AS/PLC 2.38.&lt;br /&gt;
# Реализована возможность игнорирования ошибок связи при работе транспорта &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; (свойство &amp;lt;code&amp;gt;Действие при превышении порога ошибок 2&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Реализована инициализация значения сигнала простого значением связанного источника при запуске.&lt;br /&gt;
# Реализован кэш методов экземпляров объектов.&lt;br /&gt;
# Изменен механизм определения IP-адресов станции.&lt;br /&gt;
&lt;br /&gt;
=== 1.2 Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлена возможность выбора свойств узлов как источников для операций.&lt;br /&gt;
# Реализовано отображение признака &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; узлов в окне выбора узлов.&lt;br /&gt;
# Дополнена валидация виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.20-r0ad724e1e636 от 2025-08-08 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int StoreMessage(int iMessageLevel, string strMessage, string strGroup).&amp;lt;/code&amp;gt;&lt;br /&gt;
# Добавлена возможность вызова методов экземпляров объектов из действий.&lt;br /&gt;
# Исправлено выполнение действия &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;, теперь возможно создание событий из обработчиков.&lt;br /&gt;
# В тренды графиков добавлено свойство &amp;lt;code&amp;gt;Единицы измерения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен межстанционный транспорт. Для станций добавлено свойство &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt;. Станция с ролью &amp;lt;code&amp;gt;Клиент&amp;lt;/code&amp;gt; производит подключение к удаленным станциям с ролью &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt; и уведомляет об изменениях источников и сигналов.&lt;br /&gt;
# Устранена ошибочная генерация нескольких дублирующихся событий при работе контроллеров событий.&lt;br /&gt;
# В окне &amp;lt;code&amp;gt;Фильтр&amp;lt;/code&amp;gt; виджета &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; размер элементов теперь зависит от свойства системы тревог &amp;lt;code&amp;gt;Размер кнопки&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* добавлена [[Транспорты AgavaSCADA/AgavaPLC#Этап 2. Объединение команд записи (функции 15 и 16)|группировка команд записи]] для функций 15 и 16;&lt;br /&gt;
#* реализована [[Транспорты AgavaSCADA/AgavaPLC#Этап 1. Дедупликация при постановке в очередь|дедупликация команд записи]].&lt;br /&gt;
# Доработан транспорт OPC-UA: &lt;br /&gt;
#* исправлены типы свойств;&lt;br /&gt;
#* сервер теперь привязывается к порту, указанному в свойстве &amp;lt;code&amp;gt;Адрес&amp;lt;/code&amp;gt; (ранее всегда использовался 4840).&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка при перетаскивании разделителя столбцов.&lt;br /&gt;
# Свойство &amp;quot;Аргументы&amp;quot; программы сделано скрытым.&lt;br /&gt;
# Добавлена возможность размещения определений классов в приложении в подгруппах любой вложенности.&lt;br /&gt;
&lt;br /&gt;
== 1.6.19-r89b594033f4d от 2025-09-02 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Реализовано определение локальной станции для запуска проекта.&lt;br /&gt;
# Исправлен запуск узла типа &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# В мастер создания проектов добавлена поддержка АГАВА ПЛК-70.А.&lt;br /&gt;
# Исправлена конвертация виджетов &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt; при обновлении проекта с версии 1.2.&lt;br /&gt;
# Исправлена ошибка в окне настройки исторического графика, связанная с одновременным удалением нескольких трендов.&lt;br /&gt;
# Доработана проверка проекта перед сохранением конфигурации. При обнаружении критических ошибок - отказ сохранения.&lt;br /&gt;
# Добавлена проверки станций на использование адреса 127.0.0.1, на дублирующиеся IP-адреса.&lt;br /&gt;
&lt;br /&gt;
== 1.6.18-r4a325427448b от 2025-08-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработана установка аргументов в вызываемые методы экземпляров (добавлен тип &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; для некоторых сценариев).&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлен узел типа &amp;lt;code&amp;gt;Счетчик&amp;lt;/code&amp;gt;, хранящий признак активного подключения к устройству с заданным Modbus адресом.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Реализовано множественное подключение клиентов в режиме работы &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Доработан режим &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;: добавлена возможность настройки таймаута активности клиента и максимального количества подключений к серверу.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Шаблонная композиция&amp;lt;/code&amp;gt; убран из списка доступных типов для группы &amp;quot;Композиции&amp;quot;.&lt;br /&gt;
# Исправлена критическая ошибка, изредка возникавшая при переключении окон.&lt;br /&gt;
# Исправлена ошибка выполнения действия Закрытие окна.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена функция просмотра и редактирования списка источников формы.&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== 1.6.17-r1f70359a00b4 от 2025-08-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка передачи аргументов типов &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; в методы классов.&lt;br /&gt;
# Исправлено связывание свойств экземпляров базовых типов с узлами проекта.&lt;br /&gt;
# Доработан вызов методов типа &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; классов для исключения критических ошибок.&lt;br /&gt;
# Для кривых графиков изменена толщина линии по умолчанию на &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в команде &amp;lt;code&amp;gt;Сохранить архив проекта&amp;lt;/code&amp;gt; - устранено ошибочное создание дубликатов некоторых используемых проектом файлов.&lt;br /&gt;
# Доработано восстановление &amp;lt;code&amp;gt;retain&amp;lt;/code&amp;gt; - добавлена возможность восстановления в свойства экземпляров классов.&lt;br /&gt;
# Изменена конвертация &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; в другие типы.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены ошибки работы отладчика с точками останова в методах и свойствах классов.&lt;br /&gt;
# Изменен уровень ошибок компиляции при поиске путей в проекте (Get/SetNodeValueAs...  и др.) с &amp;lt;code&amp;gt;Ошибка&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;Предупреждение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализовано связывание виджетов со свойствами узлов путем перетаскивания.&lt;br /&gt;
# Добавлено местное (inplace) редактирование свойств типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; в диалоге редактирования сопоставлений, например в окне редактирования сопоставлений виджета &amp;lt;code&amp;gt;Выпадающий список&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Уточнено сообщение об ошибочном открытии проекта из папки &amp;lt;code&amp;gt;.autosave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно выбора узлов - кнопка &amp;lt;code&amp;gt;ОК&amp;lt;/code&amp;gt; теперь является кнопкой по умолчанию.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример SQLiteDecimation, демонстрирующий возможности прореживания при записи архива SQLite.&lt;br /&gt;
# Доработан пример TestEventsAlarms.&lt;br /&gt;
&lt;br /&gt;
== 1.6.16-r4dc07fc875a4 от 2025-07-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработан системный транспорт &amp;lt;code&amp;gt;TransportSystem2&amp;lt;/code&amp;gt; - изменена процедура остановка сервера для устранения незавершенных соединений.&lt;br /&gt;
# Доработаны виджеты &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; - исправлена работа с источником.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск процесса&amp;lt;/code&amp;gt; - исправлен запуск процесса.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлено обновление BuildNo и даты сборки проекта.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Убрано диалоговое окно с сообщением о частых попытках перезапуска при выходе.&lt;br /&gt;
# При запуске приложений из `.desktop` файлов добавлена проверка, что логирование в указанные файлы возможно.&lt;br /&gt;
# В файлы логов добавлена информация о версии приложения.&lt;br /&gt;
&lt;br /&gt;
== 1.6.15-r710146e4389e от 2025-07-09 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Узел Система тревог - добавлены настройки окна тревог (ширина, высота, перенос строк в сообщениях).&lt;br /&gt;
# Исправлена ошибка в проверке прав на закрытие фрейма, из-за чего в некоторых проектах без системы проверки прав закрытие фрейма не работало.&lt;br /&gt;
# Виджет &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; - исправлена ошибка при работе с диалогом ожидания.&lt;br /&gt;
# Действие &amp;lt;code&amp;gt;Авторизация пользователя&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt;. Действие с включенным свойством &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt; будет отображать окно авторизации без возможности смены пользователя.&lt;br /&gt;
# Реализована возможность инициализации свойств экземпляров объектов постоянными значениями, задаваемыми в среде разработки (доступны типы bool, int, uint, long, ulong, double, string).&lt;br /&gt;
# Для транспортов &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; добавлена очистка очереди команд при (ре)старте обмена.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена поддержка нового системного транспорта. Для подключения к панелям оператора и контроллерам из среды разработки необходимо обновить среду исполнения до версии 1.6.15 или более новой.&lt;br /&gt;
# Добавлена иконка для приложения [[Универсальная среда разработки Agava]] (впервые с версии 1.0!).&lt;br /&gt;
# Исправлены критические ошибки в webvisu из-за отсутствия qml модулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Откорректировано оформление окна авторизации с целью улучшения привлекательности.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LayersDemo&amp;lt;/code&amp;gt;. Пример &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; дополнен демонстрацией webvisu.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;OpcUaDemo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OpcUaClientDemo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Версия переведена в стабильную стадию.'''&lt;br /&gt;
&lt;br /&gt;
== 1.6.14-r1c61c35c3da4 от 2025-06-20 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность регулирования частоты обновления форм и экранов с композициями. Добавлено свойство &amp;quot;Интервал обновления&amp;quot; для экранов и композиций.&lt;br /&gt;
# У виджета &amp;quot;График&amp;quot; изменен форматтер оси времени по умолчанию с &amp;quot;dd.MM.yy hh:mm:ss&amp;quot; на &amp;quot;dd.MM.yyyy hh:mm:ss&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизирован вывод информации на экран - исключена повторная отрисовка виджетов, при записи значений в их свойства из скриптов и программ.&lt;br /&gt;
# Реализовано профилирование вызова базовых методов и работы с контекстами.&lt;br /&gt;
# Реализован вывод информации о перерисовке виджетов в консоль с настройкой через файл as.ini.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;WindowUpdateRate&amp;lt;/code&amp;gt;, демонстрирующий возможность ограничения частоты обновления окон.&lt;br /&gt;
&lt;br /&gt;
== 1.6.13-r13248581de39 от 2025-06-17 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка функции &amp;quot;Просмотр событий&amp;quot;, из-за которой некорректно выдавались события в проектах без логгеров.&lt;br /&gt;
# Реализовано копирование станций ПК-40, ПК-50, ПК-60.&lt;br /&gt;
# Устранено сохранение в архив проекта файлов .bi?, хранящихся в подпапках, начинающихся с точки. Например .autosave, .backup&lt;br /&gt;
# Разрешено добавление приложений к станциям ПО-40, ПО-50, ПО-60.&lt;br /&gt;
# Убрана зависимость от библиотеки libclang.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Реализован вывод информации о регионах перерисовки окон в консоль с настройкой через файл as.ini.&lt;br /&gt;
# Доработаны методы BasicSignal::GetValue, BasicSignal::SetValue для корректного обращения к узлам проекта.&lt;br /&gt;
# Исправлена ошибка в работе со светодиодами станции ПК-40.&lt;br /&gt;
# Исправлено создание BasicSource(&amp;quot;path&amp;quot;), BasicSignal(&amp;quot;path&amp;quot;), BasicWidget(&amp;quot;path&amp;quot;) в программах. Теперь появилась возможность доступа ко всем свойствам узла проекта, а не только к свойствам, определенным в BasicNode.&lt;br /&gt;
# Добавлена проверка типа при создании экземпляра BasicSource (ОМ).&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Разработан пример &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, демонстрирующий работу со светодиодами ПО-50 из программы с использованием объектной модели.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен скрипт для восстановления &amp;lt;code&amp;gt;explorer.exe&amp;lt;/code&amp;gt; в качестве оболочки рабочего стола после установки ASLauncher.&lt;br /&gt;
&lt;br /&gt;
== 1.6.12-r17b244111a8c от 2025-05-30 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка, возникавшая при перемещении узлов в дереве проекта, из-за которой перемещаемые узлы пропадали.&lt;br /&gt;
# Добавлено текстовое описание при появлении окна с ошибками, например при сохранении проекта.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Операция Пара условий&amp;lt;/code&amp;gt; - исправлены имена свойств. В проектах версии 1.2 операция не работала в режиме проверки двух условий. '''Необходимо проверить корректность настроек при переходе с версии 1.2.'''&lt;br /&gt;
# Исправлена ошибка определения уровня логгеров при вызове команды &amp;lt;code&amp;gt;Просмотр событий&amp;lt;/code&amp;gt;, из-за которой при наличии в проекте логгеров с уровнями логгирования &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; в окно событий не попадали события ниже уровнем.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизация узла &amp;lt;code&amp;gt;Транспорт TCP&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована система журналирования.&lt;br /&gt;
&lt;br /&gt;
== 1.6.8-r915d8d477fa4 от 2025-05-14 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
# Исправлено несоответствие настроек узла &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt; и фактически исполняемых команд. '''При обновлении на эту версию необходимо проверить корректность настроек всех улов типа &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_filesystem&amp;diff=3509</id>
		<title>Класс filesystem</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_filesystem&amp;diff=3509"/>
		<updated>2026-04-28T04:55:12Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Методы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс предоставляет интерфейс для взаимодействия с файловой системой операционной системы. Позволяет выполнять операции с файлами и директориями, получать информацию о них, а также управлять текущей рабочей директорией.&lt;br /&gt;
&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Методы==&lt;br /&gt;
 '''bool changeCurrentPath(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Изменяет текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к новой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если путь существует и текущая директория успешно изменена.&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если указанный путь не существует или не является директорией.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Если путь задан относительно, он объединяется с текущей директорией.&lt;br /&gt;
*Путь не должен содержать обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; – они автоматически заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Завершающие слеши автоматически удаляются из пути.&lt;br /&gt;
*Не поддерживает разрешение внутренних ссылок &amp;lt;code&amp;gt;/./&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;/../&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''string getCurrentPath() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Строка с абсолютным путём текущей директории, использующая разделители &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*При создании объекта &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt; текущая директория инициализируется рабочим каталогом приложения.&lt;br /&gt;
*Все обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; для единообразия.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getDirs() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех поддиректорий внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Массив строк с именами поддиректорий.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Специальные записи &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (текущая директория) и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (родительская директория) исключаются из результата.&lt;br /&gt;
*Возвращает пустой массив, если директорий нет или произошла ошибка чтения.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getFiles() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех файлов внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Массив строк с именами файлов.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*В результат включаются только файлы, директории исключаются.&lt;br /&gt;
*Возвращает пустой массив, если файлов нет или произошла ошибка чтения.&lt;br /&gt;
 '''bool isDir(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь директорией.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является директорией.&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не существует, не является директорией или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
*Абсолютные пути определяются наличием двоеточия &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt;) или начального слеша &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''bool isLink(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь символической ссылкой (symlink).&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является символической ссылкой (на Windows – репарс-точкой).&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не является ссылкой, не существует или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Кроссплатформенная поддержка: Windows (атрибут &amp;lt;code&amp;gt;FILE_ATTRIBUTE_REPARSE_POINT&amp;lt;/code&amp;gt;) и POSIX (флаг &amp;lt;code&amp;gt;S_IFLNK&amp;lt;/code&amp;gt;).&lt;br /&gt;
*Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
 '''int64 getSize(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Размер файла в байтах (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не существует, указан путь к директории или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется API-функция &amp;lt;code&amp;gt;GetFileSizeEx&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Для директорий возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int makeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Создаёт новую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к создаваемой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно создана.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка создания (например, недостаточно прав, путь не существует).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*'''Важно:''' Не поддерживает рекурсивное создание промежуточных директорий.&lt;br /&gt;
*На Windows создаёт директорию с правами по умолчанию.&lt;br /&gt;
*На POSIX создаёт с правами &amp;lt;code&amp;gt;S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH&amp;lt;/code&amp;gt; (755: чтение/запись/исполнение для владельца, чтение/исполнение для группы и остальных).&lt;br /&gt;
 '''int removeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет пустую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно удалена.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (директория не пуста, не существует, недостаточно прав).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Удаляет только '''пустые''' директории.&lt;br /&gt;
*Не поддерживает рекурсивное удаление с содержимым.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;RemoveDirectoryW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int deleteFile(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемому файлу (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно удалён.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (файл не существует, недостаточно прав, указана директория).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;DeleteFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;unlink&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Для удаления директорий используйте &amp;lt;code&amp;gt;removeDir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int copyFile(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Копирует файл из одного местоположения в другое.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – путь к исходному файлу.&lt;br /&gt;
*&amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – путь к целевому файлу (не директории).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно скопирован.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка копирования (исходный файл не существует, недостаточно прав, целевой файл уже существует).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется API-функция &amp;lt;code&amp;gt;CopyFileW&amp;lt;/code&amp;gt; с параметром &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; (не перезаписывать существующий файл).&lt;br /&gt;
*На POSIX-системах копирование выполняется '''вручную''' побайтово через &amp;lt;code&amp;gt;fopen/fread/fwrite&amp;lt;/code&amp;gt;, так как стандартной функции копирования нет.&lt;br /&gt;
*Целевой файл не должен существовать (флаг &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; на Windows).&lt;br /&gt;
 '''int move(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Перемещает или переименовывает файл или директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – текущий путь к объекту.&lt;br /&gt;
*&amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – новый путь или имя объекта.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – объект успешно перемещён/переименован.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка операции (объект не существует, недостаточно прав).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Может использоваться как для файлов, так и для директорий.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;MoveFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Операция может выполняться в пределах одного тома/файловой системы.&lt;br /&gt;
 '''datetime getCreateDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время создания файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время создания.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*'''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату создания.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;createTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется поле &amp;lt;code&amp;gt;st_ctime&amp;lt;/code&amp;gt; (change time) – может отличаться от реального времени создания на некоторых файловых системах.&lt;br /&gt;
 '''datetime getModifyDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время последнего изменения файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время последней модификации.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Выбрасывает исключение, если не удаётся получить дату изменения.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;modifyTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется поле &amp;lt;code&amp;gt;st_mtime&amp;lt;/code&amp;gt; (modify time).&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3508</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3508"/>
		<updated>2026-04-27T06:48:28Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Классы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Стандартная библиотека языка ==&lt;br /&gt;
&lt;br /&gt;
=== Математические и тригонометрические функции ===&lt;br /&gt;
&lt;br /&gt;
====Преобразование IEEE битов====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Сравнение с допуском====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Тригонометрические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Гиперболические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Экспоненциальные и логарифмические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Степенные функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Функции округления и остатка ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Специализированные функции===&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с узлами====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с окнами ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с временем====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с событиями====&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы со строками====&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Другие функции====&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
=== Классы ===&lt;br /&gt;
&lt;br /&gt;
* Класс [[Класс any|any]].&lt;br /&gt;
* Класс [[Класс datetime|datetime]].&lt;br /&gt;
* Класс [[Класс file|file]].&lt;br /&gt;
* Класс [[Класс filesystem|filesystem]].&lt;br /&gt;
Классы объектной модели:&lt;br /&gt;
&lt;br /&gt;
* [[Базовые классы AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* Класс [[Класс SystemAlarming|SystemAlarming]].&lt;br /&gt;
* Классы для [[Классы для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC|рисования и работы с графическим интерфейсом]].&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3507</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3507"/>
		<updated>2026-04-27T06:45:01Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Классы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Стандартная библиотека языка ==&lt;br /&gt;
&lt;br /&gt;
=== Математические и тригонометрические функции ===&lt;br /&gt;
&lt;br /&gt;
====Преобразование IEEE битов====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Сравнение с допуском====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Тригонометрические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Гиперболические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Экспоненциальные и логарифмические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Степенные функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Функции округления и остатка ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Специализированные функции===&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с узлами====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с окнами ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с временем====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с событиями====&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы со строками====&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Другие функции====&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
=== Классы ===&lt;br /&gt;
&lt;br /&gt;
* Класс [[Класс any|any]].&lt;br /&gt;
* Класс [[Класс datetime|datetime]].&lt;br /&gt;
* Класс [[Класс file|file]].&lt;br /&gt;
* Класс [[Класс filesystem|filesystem]].&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3506</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3506"/>
		<updated>2026-04-27T06:44:26Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Классы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Стандартная библиотека языка ==&lt;br /&gt;
&lt;br /&gt;
=== Математические и тригонометрические функции ===&lt;br /&gt;
&lt;br /&gt;
====Преобразование IEEE битов====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Сравнение с допуском====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Тригонометрические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Гиперболические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Экспоненциальные и логарифмические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Степенные функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Функции округления и остатка ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Специализированные функции===&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с узлами====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с окнами ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с временем====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с событиями====&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы со строками====&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Другие функции====&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
=== Классы ===&lt;br /&gt;
&lt;br /&gt;
* Класс [[Класс datetime|datetime]].&lt;br /&gt;
* Класс [[Класс file|file]].&lt;br /&gt;
* Класс [[Класс filesystem|filesystem]].&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3505</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3505"/>
		<updated>2026-04-27T06:43:33Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Преобразование IEEE битов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Стандартная библиотека языка ==&lt;br /&gt;
&lt;br /&gt;
=== Математические и тригонометрические функции ===&lt;br /&gt;
&lt;br /&gt;
====Преобразование IEEE битов====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Сравнение с допуском====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Тригонометрические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Гиперболические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Экспоненциальные и логарифмические функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Степенные функции ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Функции округления и остатка ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Специализированные функции===&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с узлами====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с окнами ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с временем====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы с событиями====&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Функции для работы со строками====&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Другие функции====&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
=== Классы ===&lt;br /&gt;
&lt;br /&gt;
* [[Класс datetime|datetime]].&lt;br /&gt;
* [[Класс file|file]].&lt;br /&gt;
* [[Класс filesystem|filesystem]].&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3504</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3504"/>
		<updated>2026-04-27T06:40:20Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Класс file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Математические и тригонометрические функции ==&lt;br /&gt;
&lt;br /&gt;
===Преобразование IEEE битов===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сравнение с допуском===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тригонометрические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Гиперболические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Экспоненциальные и логарифмические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Степенные функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Функции округления и остатка ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Специализированные функции==&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с узлами===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с окнами ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с временем===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с событиями===&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы со строками===&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Другие функции===&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_datetime&amp;diff=3503</id>
		<title>Класс datetime</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_datetime&amp;diff=3503"/>
		<updated>2026-04-27T06:37:57Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Конструкторы==&lt;br /&gt;
===Конструктор по умолчанию===&lt;br /&gt;
 datetime dt();&lt;br /&gt;
Создает объект с текущей датой и временем.&lt;br /&gt;
===Конструктор копирования===&lt;br /&gt;
 datetime dt(other);&lt;br /&gt;
Создает копию существующего объекта datetime.&lt;br /&gt;
===Конструктор с параметрами===&lt;br /&gt;
 datetime dt(year, month, day, hour = 0, minute = 0, second = 0);&lt;br /&gt;
Создает объект с указанной датой и временем. &lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
 // Только дата&lt;br /&gt;
 datetime newYear = datetime(2024, 1, 1);&lt;br /&gt;
 &lt;br /&gt;
 // Дата и время&lt;br /&gt;
 datetime meeting = datetime(2024, 12, 25, 14, 30, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Полная спецификация&lt;br /&gt;
 datetime exact = datetime(2024, 6, 15, 9, 45, 30);&lt;br /&gt;
==Методы==&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_year() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает год (4 цифры).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_month() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает месяц (1-12).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_day() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает день месяца (1-31).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_hour() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает часы (0-23).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_minute() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает минуты (0-59).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_second() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает секунды (0-59).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 12, 25, 14, 30, 45);&lt;br /&gt;
 &lt;br /&gt;
 uint year = dt.year;    // 2024&lt;br /&gt;
 uint month = dt.month;  // 12&lt;br /&gt;
 uint day = dt.day;      // 25&lt;br /&gt;
 uint hour = dt.hour;    // 14&lt;br /&gt;
 uint minute = dt.minute; // 30&lt;br /&gt;
 uint second = dt.second; // 45&lt;br /&gt;
&amp;lt;code&amp;gt;bool setDate(year, month, day)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает дату. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверной дате.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setDate(2024, 2, 29); // true (високосный год)&lt;br /&gt;
 bool invalid = dt.setDate(2023, 2, 29); // false (не високосный)&lt;br /&gt;
&amp;lt;code&amp;gt;bool setTime(hour, minute, second)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает время. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверном времени.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
cpp&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setTime(23, 59, 59); // true&lt;br /&gt;
 bool invalid = dt.setTime(25, 0, 0);   // false (часы &amp;gt; 23)&lt;br /&gt;
==Арифметические операции==&lt;br /&gt;
Вычитание дат&lt;br /&gt;
 int64 difference = dt1 - dt2;&lt;br /&gt;
Возвращает разницу в секундах.&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = datetime(2024, 1, 2, 0, 0, 0);&lt;br /&gt;
 int64 diff = end - start; // 86400 секунд (1 день)&lt;br /&gt;
Сложение с секундами&lt;br /&gt;
 datetime result = dt + seconds;&lt;br /&gt;
 datetime result = seconds + dt; // обратный порядок&lt;br /&gt;
 dt += seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Добавить 2 часа&lt;br /&gt;
 datetime later = dt + 7200;&lt;br /&gt;
 dt += 7200;&lt;br /&gt;
 &lt;br /&gt;
 // Обратный порядок&lt;br /&gt;
 datetime same = 7200 + dt;&lt;br /&gt;
Вычитание секунд&lt;br /&gt;
 datetime result = dt - seconds;&lt;br /&gt;
 datetime result = seconds - dt; // обратный порядок&lt;br /&gt;
 dt -= seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Вычесть 30 минут&lt;br /&gt;
 datetime earlier = dt - 1800;&lt;br /&gt;
 dt -= 1800;&lt;br /&gt;
===Операции сравнения===&lt;br /&gt;
&amp;lt;code&amp;gt;bool opEquals(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка равенства дат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;bool opLess(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка что дата раньше.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;int opCmp(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сравнение с возвратом -1 (меньше), 0 (равно), 1 (больше).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt1 = datetime(2024, 1, 1);&lt;br /&gt;
 datetime dt2 = datetime(2024, 1, 2);&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 &amp;lt; dt2) {&lt;br /&gt;
     // dt1 раньше dt2&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 == dt2) {&lt;br /&gt;
     // даты равны&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int result = dt1.opCmp(dt2); // -1&lt;br /&gt;
==Практические примеры==&lt;br /&gt;
Пример 1: Таймер выполнения&lt;br /&gt;
 datetime startTime;&lt;br /&gt;
 &lt;br /&gt;
 // Выполняем некоторую операцию&lt;br /&gt;
 for (int i = 0; i &amp;lt; 1000000; i++) &lt;br /&gt;
 {&lt;br /&gt;
     // какая-то работа&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 datetime endTime;&lt;br /&gt;
 int64 elapsed = endTime - startTime;&lt;br /&gt;
 print(&amp;quot;Операция заняла: &amp;quot; + elapsed + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
Пример 2: Расчет дат событий&lt;br /&gt;
 // Дата начала проекта&lt;br /&gt;
 datetime projectStart = datetime(2024, 1, 15);&lt;br /&gt;
 &lt;br /&gt;
 // Напоминание за 3 дня до дедлайна&lt;br /&gt;
 datetime deadline = datetime(2024, 3, 1);&lt;br /&gt;
 datetime reminder = deadline - 3 * 86400; // 3 дня в секундах&lt;br /&gt;
 &lt;br /&gt;
 // Продление срока на 2 недели&lt;br /&gt;
 datetime extendedDeadline = deadline + 14 * 86400;&lt;br /&gt;
Пример 3: Проверка рабочего времени&lt;br /&gt;
 datetime currentTime;&lt;br /&gt;
 &lt;br /&gt;
 // Создаем время начала и конца рабочего дня&lt;br /&gt;
 datetime workStart = datetime(currentTime.year, currentTime.month, &lt;br /&gt;
                              currentTime.day, 9, 0, 0);&lt;br /&gt;
 datetime workEnd = workStart + 8 * 3600; // 8 часов&lt;br /&gt;
 &lt;br /&gt;
 if (currentTime &amp;gt;= workStart &amp;amp;&amp;amp; currentTime &amp;lt;= workEnd) &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Рабочее время&amp;quot;);&lt;br /&gt;
 } &lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Вне рабочего времени&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
Пример 4: Валидация даты&lt;br /&gt;
 bool createAppointment(uint year, uint month, uint day, uint hour) &lt;br /&gt;
 {&lt;br /&gt;
     datetime appointment;&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность даты&lt;br /&gt;
     if (!appointment.setDate(year, month, day)) {&lt;br /&gt;
         print(&amp;quot;Неверная дата!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность времени&lt;br /&gt;
     if (!appointment.setTime(hour, 0, 0)) {&lt;br /&gt;
         print(&amp;quot;Неверное время!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем что дата не в прошлом&lt;br /&gt;
     datetime now;&lt;br /&gt;
     if (appointment &amp;lt; now) {&lt;br /&gt;
         print(&amp;quot;Дата не может быть в прошлом!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     print(&amp;quot;Встреча создана: &amp;quot; + appointment.year + &amp;quot;-&amp;quot; + appointment.month + &amp;quot;-&amp;quot; + appointment.day);&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;br /&gt;
Пример 5: Разбивка интервала времени&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = start + 365 * 86400; // +1 год&lt;br /&gt;
 &lt;br /&gt;
 int64 totalSeconds = end - start;&lt;br /&gt;
 int64 days = totalSeconds / 86400;&lt;br /&gt;
 int64 hours = (totalSeconds % 86400) / 3600;&lt;br /&gt;
 int64 minutes = (totalSeconds % 3600) / 60;&lt;br /&gt;
 int64 seconds = totalSeconds % 60;&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Интервал: &amp;quot; + days + &amp;quot; дней, &amp;quot; + hours + &amp;quot; часов, &amp;quot; + minutes + &amp;quot; минут, &amp;quot; + seconds + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_filesystem&amp;diff=3502</id>
		<title>Класс filesystem</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_filesystem&amp;diff=3502"/>
		<updated>2026-04-27T06:37:40Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс предоставляет интерфейс для взаимодействия с файловой системой операционной системы. Позволяет выполнять операции с файлами и директориями, получать информацию о них, а также управлять текущей рабочей директорией.&lt;br /&gt;
&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Методы==&lt;br /&gt;
 '''bool changeCurrentPath(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Изменяет текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к новой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если путь существует и текущая директория успешно изменена.&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если указанный путь не существует или не является директорией.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Если путь задан относительно, он объединяется с текущей директорией.&lt;br /&gt;
*Путь не должен содержать обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; – они автоматически заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Завершающие слеши автоматически удаляются из пути.&lt;br /&gt;
*Не поддерживает разрешение внутренних ссылок &amp;lt;code&amp;gt;/./&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;/../&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''string getCurrentPath() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Строка с абсолютным путём текущей директории, использующая разделители &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*При создании объекта &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt; текущая директория инициализируется рабочим каталогом приложения.&lt;br /&gt;
*Все обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; для единообразия.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getDirs() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех поддиректорий внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Массив строк с именами поддиректорий.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Специальные записи &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (текущая директория) и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (родительская директория) исключаются из результата.&lt;br /&gt;
*Возвращает пустой массив, если директорий нет или произошла ошибка чтения.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getFiles() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех файлов внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Массив строк с именами файлов.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*В результат включаются только файлы, директории исключаются.&lt;br /&gt;
*Возвращает пустой массив, если файлов нет или произошла ошибка чтения.&lt;br /&gt;
 '''bool isDir(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь директорией.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является директорией.&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не существует, не является директорией или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
*Абсолютные пути определяются наличием двоеточия &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt;) или начального слеша &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''bool isLink(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь символической ссылкой (symlink).&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является символической ссылкой (на Windows – репарс-точкой).&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не является ссылкой, не существует или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Кроссплатформенная поддержка: Windows (атрибут &amp;lt;code&amp;gt;FILE_ATTRIBUTE_REPARSE_POINT&amp;lt;/code&amp;gt;) и POSIX (флаг &amp;lt;code&amp;gt;S_IFLNK&amp;lt;/code&amp;gt;).&lt;br /&gt;
*Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
 '''int64 getSize(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Размер файла в байтах (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не существует, указан путь к директории или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется API-функция &amp;lt;code&amp;gt;GetFileSizeEx&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Для директорий возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int makeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Создаёт новую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к создаваемой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно создана.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка создания (например, недостаточно прав, путь не существует).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*'''Важно:''' Не поддерживает рекурсивное создание промежуточных директорий (отмечено в TODO).&lt;br /&gt;
*На Windows создаёт директорию с правами по умолчанию.&lt;br /&gt;
*На POSIX создаёт с правами &amp;lt;code&amp;gt;S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH&amp;lt;/code&amp;gt; (755: чтение/запись/исполнение для владельца, чтение/исполнение для группы и остальных).&lt;br /&gt;
 '''int removeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет пустую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно удалена.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (директория не пуста, не существует, недостаточно прав).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Удаляет только '''пустые''' директории.&lt;br /&gt;
*Не поддерживает рекурсивное удаление с содержимым.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;RemoveDirectoryW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int deleteFile(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемому файлу (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно удалён.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (файл не существует, недостаточно прав, указана директория).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;DeleteFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;unlink&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Для удаления директорий используйте &amp;lt;code&amp;gt;removeDir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int copyFile(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Копирует файл из одного местоположения в другое.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – путь к исходному файлу.&lt;br /&gt;
*&amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – путь к целевому файлу (не директории).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно скопирован.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка копирования (исходный файл не существует, недостаточно прав, целевой файл уже существует).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется API-функция &amp;lt;code&amp;gt;CopyFileW&amp;lt;/code&amp;gt; с параметром &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; (не перезаписывать существующий файл).&lt;br /&gt;
*На POSIX-системах копирование выполняется '''вручную''' побайтово через &amp;lt;code&amp;gt;fopen/fread/fwrite&amp;lt;/code&amp;gt;, так как стандартной функции копирования нет.&lt;br /&gt;
*Целевой файл не должен существовать (флаг &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; на Windows).&lt;br /&gt;
 '''int move(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Перемещает или переименовывает файл или директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – текущий путь к объекту.&lt;br /&gt;
*&amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – новый путь или имя объекта.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – объект успешно перемещён/переименован.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка операции (объект не существует, недостаточно прав).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Может использоваться как для файлов, так и для директорий.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;MoveFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Операция может выполняться в пределах одного тома/файловой системы.&lt;br /&gt;
 '''datetime getCreateDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время создания файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время создания.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*'''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату создания.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;createTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется поле &amp;lt;code&amp;gt;st_ctime&amp;lt;/code&amp;gt; (change time) – может отличаться от реального времени создания на некоторых файловых системах.&lt;br /&gt;
 '''datetime getModifyDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время последнего изменения файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время последней модификации.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Выбрасывает исключение, если не удаётся получить дату изменения.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;modifyTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется поле &amp;lt;code&amp;gt;st_mtime&amp;lt;/code&amp;gt; (modify time).&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_datetime&amp;diff=3501</id>
		<title>Класс datetime</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_datetime&amp;diff=3501"/>
		<updated>2026-04-27T06:37:04Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: Новая страница: «Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;. ==Конструкторы== ===Конструктор по умолчанию===...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Конструкторы==&lt;br /&gt;
===Конструктор по умолчанию===&lt;br /&gt;
 datetime dt();&lt;br /&gt;
Создает объект с текущей датой и временем.&lt;br /&gt;
===Конструктор копирования===&lt;br /&gt;
 datetime dt(other);&lt;br /&gt;
Создает копию существующего объекта datetime.&lt;br /&gt;
===Конструктор с параметрами===&lt;br /&gt;
 datetime dt(year, month, day, hour = 0, minute = 0, second = 0);&lt;br /&gt;
Создает объект с указанной датой и временем. &lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
 // Только дата&lt;br /&gt;
 datetime newYear = datetime(2024, 1, 1);&lt;br /&gt;
 &lt;br /&gt;
 // Дата и время&lt;br /&gt;
 datetime meeting = datetime(2024, 12, 25, 14, 30, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Полная спецификация&lt;br /&gt;
 datetime exact = datetime(2024, 6, 15, 9, 45, 30);&lt;br /&gt;
==Методы==&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_year() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает год (4 цифры).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_month() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает месяц (1-12).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_day() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает день месяца (1-31).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_hour() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает часы (0-23).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_minute() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает минуты (0-59).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_second() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает секунды (0-59).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 12, 25, 14, 30, 45);&lt;br /&gt;
 &lt;br /&gt;
 uint year = dt.year;    // 2024&lt;br /&gt;
 uint month = dt.month;  // 12&lt;br /&gt;
 uint day = dt.day;      // 25&lt;br /&gt;
 uint hour = dt.hour;    // 14&lt;br /&gt;
 uint minute = dt.minute; // 30&lt;br /&gt;
 uint second = dt.second; // 45&lt;br /&gt;
&amp;lt;code&amp;gt;bool setDate(year, month, day)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает дату. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверной дате.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setDate(2024, 2, 29); // true (високосный год)&lt;br /&gt;
 bool invalid = dt.setDate(2023, 2, 29); // false (не високосный)&lt;br /&gt;
&amp;lt;code&amp;gt;bool setTime(hour, minute, second)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает время. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверном времени.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
cpp&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setTime(23, 59, 59); // true&lt;br /&gt;
 bool invalid = dt.setTime(25, 0, 0);   // false (часы &amp;gt; 23)&lt;br /&gt;
==Арифметические операции==&lt;br /&gt;
Вычитание дат&lt;br /&gt;
 int64 difference = dt1 - dt2;&lt;br /&gt;
Возвращает разницу в секундах.&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = datetime(2024, 1, 2, 0, 0, 0);&lt;br /&gt;
 int64 diff = end - start; // 86400 секунд (1 день)&lt;br /&gt;
Сложение с секундами&lt;br /&gt;
 datetime result = dt + seconds;&lt;br /&gt;
 datetime result = seconds + dt; // обратный порядок&lt;br /&gt;
 dt += seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Добавить 2 часа&lt;br /&gt;
 datetime later = dt + 7200;&lt;br /&gt;
 dt += 7200;&lt;br /&gt;
 &lt;br /&gt;
 // Обратный порядок&lt;br /&gt;
 datetime same = 7200 + dt;&lt;br /&gt;
Вычитание секунд&lt;br /&gt;
 datetime result = dt - seconds;&lt;br /&gt;
 datetime result = seconds - dt; // обратный порядок&lt;br /&gt;
 dt -= seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Вычесть 30 минут&lt;br /&gt;
 datetime earlier = dt - 1800;&lt;br /&gt;
 dt -= 1800;&lt;br /&gt;
===Операции сравнения===&lt;br /&gt;
&amp;lt;code&amp;gt;bool opEquals(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка равенства дат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;bool opLess(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка что дата раньше.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;int opCmp(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сравнение с возвратом -1 (меньше), 0 (равно), 1 (больше).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt1 = datetime(2024, 1, 1);&lt;br /&gt;
 datetime dt2 = datetime(2024, 1, 2);&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 &amp;lt; dt2) {&lt;br /&gt;
     // dt1 раньше dt2&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 == dt2) {&lt;br /&gt;
     // даты равны&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int result = dt1.opCmp(dt2); // -1&lt;br /&gt;
==Практические примеры==&lt;br /&gt;
Пример 1: Таймер выполнения&lt;br /&gt;
 datetime startTime;&lt;br /&gt;
 &lt;br /&gt;
 // Выполняем некоторую операцию&lt;br /&gt;
 for (int i = 0; i &amp;lt; 1000000; i++) &lt;br /&gt;
 {&lt;br /&gt;
     // какая-то работа&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 datetime endTime;&lt;br /&gt;
 int64 elapsed = endTime - startTime;&lt;br /&gt;
 print(&amp;quot;Операция заняла: &amp;quot; + elapsed + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
Пример 2: Расчет дат событий&lt;br /&gt;
 // Дата начала проекта&lt;br /&gt;
 datetime projectStart = datetime(2024, 1, 15);&lt;br /&gt;
 &lt;br /&gt;
 // Напоминание за 3 дня до дедлайна&lt;br /&gt;
 datetime deadline = datetime(2024, 3, 1);&lt;br /&gt;
 datetime reminder = deadline - 3 * 86400; // 3 дня в секундах&lt;br /&gt;
 &lt;br /&gt;
 // Продление срока на 2 недели&lt;br /&gt;
 datetime extendedDeadline = deadline + 14 * 86400;&lt;br /&gt;
Пример 3: Проверка рабочего времени&lt;br /&gt;
 datetime currentTime;&lt;br /&gt;
 &lt;br /&gt;
 // Создаем время начала и конца рабочего дня&lt;br /&gt;
 datetime workStart = datetime(currentTime.year, currentTime.month, &lt;br /&gt;
                              currentTime.day, 9, 0, 0);&lt;br /&gt;
 datetime workEnd = workStart + 8 * 3600; // 8 часов&lt;br /&gt;
 &lt;br /&gt;
 if (currentTime &amp;gt;= workStart &amp;amp;&amp;amp; currentTime &amp;lt;= workEnd) &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Рабочее время&amp;quot;);&lt;br /&gt;
 } &lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Вне рабочего времени&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
Пример 4: Валидация даты&lt;br /&gt;
 bool createAppointment(uint year, uint month, uint day, uint hour) &lt;br /&gt;
 {&lt;br /&gt;
     datetime appointment;&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность даты&lt;br /&gt;
     if (!appointment.setDate(year, month, day)) {&lt;br /&gt;
         print(&amp;quot;Неверная дата!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность времени&lt;br /&gt;
     if (!appointment.setTime(hour, 0, 0)) {&lt;br /&gt;
         print(&amp;quot;Неверное время!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем что дата не в прошлом&lt;br /&gt;
     datetime now;&lt;br /&gt;
     if (appointment &amp;lt; now) {&lt;br /&gt;
         print(&amp;quot;Дата не может быть в прошлом!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     print(&amp;quot;Встреча создана: &amp;quot; + appointment.year + &amp;quot;-&amp;quot; + appointment.month + &amp;quot;-&amp;quot; + appointment.day);&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;br /&gt;
Пример 5: Разбивка интервала времени&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = start + 365 * 86400; // +1 год&lt;br /&gt;
 &lt;br /&gt;
 int64 totalSeconds = end - start;&lt;br /&gt;
 int64 days = totalSeconds / 86400;&lt;br /&gt;
 int64 hours = (totalSeconds % 86400) / 3600;&lt;br /&gt;
 int64 minutes = (totalSeconds % 3600) / 60;&lt;br /&gt;
 int64 seconds = totalSeconds % 60;&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Интервал: &amp;quot; + days + &amp;quot; дней, &amp;quot; + hours + &amp;quot; часов, &amp;quot; + minutes + &amp;quot; минут, &amp;quot; + seconds + &amp;quot; секунд&amp;quot;);&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_file&amp;diff=3500</id>
		<title>Класс file</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_file&amp;diff=3500"/>
		<updated>2026-04-27T06:35:00Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс предоставляет интерфейс для работы с файлами: открытие, закрытие, чтение и запись данных различных типов, позиционирование внутри файла. Поддерживает как текстовый, так и бинарный режимы работы.&lt;br /&gt;
&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.4.5&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
 '''bool mostSignificantByteFirst'''&lt;br /&gt;
'''Назначение:''' Определяет порядок байтов (endianness) при чтении и записи числовых значений.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:''' Отсутствует (свойство).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – используется порядок '''Big-endian''' (старший байт первый).&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; (по умолчанию) – используется порядок '''Little-endian''' (младший байт первый).&lt;br /&gt;
* Влияет на методы &amp;lt;code&amp;gt;readInt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readUInt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readFloat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readDouble&amp;lt;/code&amp;gt; и соответствующие методы записи.&lt;br /&gt;
* Может изменяться в любой момент до выполнения операций чтения/записи.&lt;br /&gt;
&lt;br /&gt;
== Методы ==&lt;br /&gt;
 '''int open(const string &amp;amp;in filename, const string &amp;amp;in mode)'''&lt;br /&gt;
'''Назначение:''' Открывает файл для чтения и/или записи.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;filename&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
* &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt; – режим открытия файла:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;r&amp;quot;&amp;lt;/code&amp;gt; – открыть для чтения (только чтение).&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;w&amp;quot;&amp;lt;/code&amp;gt; – открыть для записи (создаёт новый или перезаписывает существующий).&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;a&amp;quot;&amp;lt;/code&amp;gt; – открыть для добавления (запись в конец файла).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно открыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка открытия (файл не существует, недостаточно прав, неверный режим).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Перед открытием нового файла автоматически закрывает ранее открытый.&lt;br /&gt;
* На Windows автоматически добавляет флаг &amp;lt;code&amp;gt;&amp;quot;b&amp;quot;&amp;lt;/code&amp;gt; (бинарный режим) для предотвращения преобразования &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На Windows CE пути преобразуются в абсолютные относительно директории приложения.&lt;br /&gt;
* Если режим не поддерживается (например, запись при &amp;lt;code&amp;gt;AS_WRITE_OPS == 0&amp;lt;/code&amp;gt;), возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int close()'''&lt;br /&gt;
'''Назначение:''' Закрывает открытый файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно закрыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл уже был закрыт или не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Автоматически вызывается в деструкторе объекта.&lt;br /&gt;
* После закрытия файла дальнейшие операции чтения/записи будут возвращать ошибки.&lt;br /&gt;
&lt;br /&gt;
 '''int getSize() const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Размер файла в байтах (тип &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Для определения размера сохраняет текущую позицию, перемещается в конец файла и возвращается обратно.&lt;br /&gt;
&lt;br /&gt;
 '''bool isEndOfFile() const'''&lt;br /&gt;
'''Назначение:''' Проверяет, достигнут ли конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – достигнут конец файла или файл не открыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – не достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует стандартную функцию &amp;lt;code&amp;gt;feof()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
 '''int getPos() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую позицию в файле.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Текущая позиция в байтах от начала файла.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;ftell()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int setPos(int pos)'''&lt;br /&gt;
'''Назначение:''' Устанавливает текущую позицию в файле от начала.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;pos&amp;lt;/code&amp;gt; – абсолютная позиция в байтах от начала файла.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – позиция успешно установлена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или позиция вне допустимого диапазона.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;fseek(SEEK_SET)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int movePos(int delta)'''&lt;br /&gt;
'''Назначение:''' Смещает текущую позицию в файле относительно текущего положения.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;delta&amp;lt;/code&amp;gt; – смещение в байтах (положительное – вперёд, отрицательное – назад).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – позиция успешно изменена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или смещение выходит за границы.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;fseek(SEEK_CUR)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''string readString(uint length)'''&lt;br /&gt;
'''Назначение:''' Читает указанное количество символов из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; – количество символов (байт) для чтения.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка с прочитанными данными (реальная длина может быть меньше &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt;, если достигнут конец файла).&lt;br /&gt;
* Пустая строка – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Возвращает все прочитанные байты как есть (включая нулевые символы).&lt;br /&gt;
* Размер результирующей строки соответствует количеству реально прочитанных байт.&lt;br /&gt;
&lt;br /&gt;
 '''string readLine()'''&lt;br /&gt;
'''Назначение:''' Читает одну строку из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка, содержащая прочитанную строку (без символа &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Пустая строка – если достигнут конец файла или файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает до символа перевода строки (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) или до заполнения внутреннего буфера (255 символов).&lt;br /&gt;
* Поддерживает чтение длинных строк – операция повторяется до обнаружения &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; или конца файла.&lt;br /&gt;
* Символ &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; не включается в результат.&lt;br /&gt;
&lt;br /&gt;
 '''int64 readInt(uint bytes)'''&lt;br /&gt;
'''Назначение:''' Читает знаковое целое число из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для чтения (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное целое число (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Поддерживает автоматическое расширение знака (sign extension) для отрицательных чисел.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Младшие байты заполняются нулями, если &amp;lt;code&amp;gt;bytes &amp;lt; 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для отрицательных чисел старшие байты заполняются &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''uint64 readUInt(uint bytes)'''&lt;br /&gt;
'''Назначение:''' Читает беззнаковое целое число из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для чтения (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное беззнаковое целое число (тип &amp;lt;code&amp;gt;uint64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Не выполняет расширение знака.&lt;br /&gt;
* Младшие байты заполняются нулями, если &amp;lt;code&amp;gt;bytes &amp;lt; 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''float readFloat()'''&lt;br /&gt;
'''Назначение:''' Читает число с плавающей точкой (32 бита) из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное число типа &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0.0f&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает ровно 4 байта.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Использует объединение (union) для битового преобразования.&lt;br /&gt;
&lt;br /&gt;
 '''double readDouble()'''&lt;br /&gt;
'''Назначение:''' Читает число с плавающей точкой двойной точности (64 бита) из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное число типа &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает ровно 8 байт.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Использует объединение (union) для битового преобразования.&lt;br /&gt;
&lt;br /&gt;
== Методы записи ==&lt;br /&gt;
 '''int writeString(const string &amp;amp;in str)'''&lt;br /&gt;
'''Назначение:''' Записывает строку в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; – строка для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает строку целиком, включая все символы (без завершающего нуля).&lt;br /&gt;
&lt;br /&gt;
 '''int writeInt(int64 val, uint bytes)'''&lt;br /&gt;
'''Назначение:''' Записывает знаковое целое число в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для записи (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Записываются только младшие &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; байт числа.&lt;br /&gt;
&lt;br /&gt;
 '''int writeUInt(uint64 val, uint bytes)'''&lt;br /&gt;
'''Назначение:''' Записывает беззнаковое целое число в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для записи (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Записываются только младшие &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; байт числа.&lt;br /&gt;
&lt;br /&gt;
 '''int writeFloat(float val)'''&lt;br /&gt;
'''Назначение:''' Записывает число с плавающей точкой (32 бита) в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает ровно 4 байта.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int writeDouble(double val)'''&lt;br /&gt;
'''Назначение:''' Записывает число с плавающей точкой двойной точности (64 бита) в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает ровно 8 байт.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
 // Создание и открытие файла для записи&lt;br /&gt;
 file f;&lt;br /&gt;
 f.mostSignificantByteFirst = false; // Little-endian&lt;br /&gt;
 &lt;br /&gt;
 int result = f.open(&amp;quot;data.bin&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 if (result == 0) &lt;br /&gt;
 {&lt;br /&gt;
     f.writeString(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
     f.writeInt(12345, 4);&lt;br /&gt;
     f.writeFloat(3.14159f);&lt;br /&gt;
     f.close();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Открытие файла для чтения&lt;br /&gt;
 file f2;&lt;br /&gt;
 f2.mostSignificantByteFirst = false;&lt;br /&gt;
 f2.open(&amp;quot;data.bin&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 if (!f2.isEndOfFile()) &lt;br /&gt;
 {&lt;br /&gt;
     string str = f2.readLine();&lt;br /&gt;
     int64 num = f2.readInt(4);&lt;br /&gt;
     float pi = f2.readFloat();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 f2.close();&lt;br /&gt;
 &lt;br /&gt;
 // Чтение бинарных данных с Big-endian порядком&lt;br /&gt;
 file f3;&lt;br /&gt;
 f3.mostSignificantByteFirst = true; // Network byte order&lt;br /&gt;
 f3.open(&amp;quot;network_data.bin&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
 uint64 value = f3.readUInt(4); // Читает 4 байта как Big-endian&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_filesystem&amp;diff=3499</id>
		<title>Класс filesystem</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_filesystem&amp;diff=3499"/>
		<updated>2026-04-27T06:34:16Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: Новая страница: «Класс предоставляет интерфейс для взаимодействия с файловой системой операционной сис...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс предоставляет интерфейс для взаимодействия с файловой системой операционной системы. Позволяет выполнять операции с файлами и директориями, получать информацию о них, а также управлять текущей рабочей директорией.&lt;br /&gt;
&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
==Методы==&lt;br /&gt;
 '''bool changeCurrentPath(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Изменяет текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к новой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если путь существует и текущая директория успешно изменена.&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если указанный путь не существует или не является директорией.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Если путь задан относительно, он объединяется с текущей директорией.&lt;br /&gt;
*Путь не должен содержать обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; – они автоматически заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Завершающие слеши автоматически удаляются из пути.&lt;br /&gt;
*Не поддерживает разрешение внутренних ссылок &amp;lt;code&amp;gt;/./&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;/../&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''string getCurrentPath() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Строка с абсолютным путём текущей директории, использующая разделители &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*При создании объекта &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt; текущая директория инициализируется рабочим каталогом приложения.&lt;br /&gt;
*Все обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; для единообразия.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getDirs() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех поддиректорий внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Массив строк с именами поддиректорий.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Специальные записи &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (текущая директория) и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (родительская директория) исключаются из результата.&lt;br /&gt;
*Возвращает пустой массив, если директорий нет или произошла ошибка чтения.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getFiles() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех файлов внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Массив строк с именами файлов.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*В результат включаются только файлы, директории исключаются.&lt;br /&gt;
*Возвращает пустой массив, если файлов нет или произошла ошибка чтения.&lt;br /&gt;
 '''bool isDir(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь директорией.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является директорией.&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не существует, не является директорией или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
*Абсолютные пути определяются наличием двоеточия &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt;) или начального слеша &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''bool isLink(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь символической ссылкой (symlink).&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является символической ссылкой (на Windows – репарс-точкой).&lt;br /&gt;
*&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не является ссылкой, не существует или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Кроссплатформенная поддержка: Windows (атрибут &amp;lt;code&amp;gt;FILE_ATTRIBUTE_REPARSE_POINT&amp;lt;/code&amp;gt;) и POSIX (флаг &amp;lt;code&amp;gt;S_IFLNK&amp;lt;/code&amp;gt;).&lt;br /&gt;
*Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
 '''int64 getSize(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Размер файла в байтах (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не существует, указан путь к директории или произошла ошибка.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется API-функция &amp;lt;code&amp;gt;GetFileSizeEx&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Для директорий возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int makeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Создаёт новую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к создаваемой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно создана.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка создания (например, недостаточно прав, путь не существует).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*'''Важно:''' Не поддерживает рекурсивное создание промежуточных директорий (отмечено в TODO).&lt;br /&gt;
*На Windows создаёт директорию с правами по умолчанию.&lt;br /&gt;
*На POSIX создаёт с правами &amp;lt;code&amp;gt;S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH&amp;lt;/code&amp;gt; (755: чтение/запись/исполнение для владельца, чтение/исполнение для группы и остальных).&lt;br /&gt;
 '''int removeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет пустую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемой директории (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно удалена.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (директория не пуста, не существует, недостаточно прав).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Удаляет только '''пустые''' директории.&lt;br /&gt;
*Не поддерживает рекурсивное удаление с содержимым.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;RemoveDirectoryW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int deleteFile(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемому файлу (относительный или абсолютный).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно удалён.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (файл не существует, недостаточно прав, указана директория).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;DeleteFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;unlink&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Для удаления директорий используйте &amp;lt;code&amp;gt;removeDir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int copyFile(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Копирует файл из одного местоположения в другое.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – путь к исходному файлу.&lt;br /&gt;
*&amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – путь к целевому файлу (не директории).&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно скопирован.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка копирования (исходный файл не существует, недостаточно прав, целевой файл уже существует).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*На Windows используется API-функция &amp;lt;code&amp;gt;CopyFileW&amp;lt;/code&amp;gt; с параметром &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; (не перезаписывать существующий файл).&lt;br /&gt;
*На POSIX-системах копирование выполняется '''вручную''' побайтово через &amp;lt;code&amp;gt;fopen/fread/fwrite&amp;lt;/code&amp;gt;, так как стандартной функции копирования нет.&lt;br /&gt;
*Целевой файл не должен существовать (флаг &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; на Windows).&lt;br /&gt;
 '''int move(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Перемещает или переименовывает файл или директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – текущий путь к объекту.&lt;br /&gt;
*&amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – новый путь или имя объекта.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – объект успешно перемещён/переименован.&lt;br /&gt;
*&amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка операции (объект не существует, недостаточно прав).&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Может использоваться как для файлов, так и для директорий.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;MoveFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt;.&lt;br /&gt;
*Операция может выполняться в пределах одного тома/файловой системы.&lt;br /&gt;
 '''datetime getCreateDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время создания файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время создания.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*'''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату создания.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;createTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется поле &amp;lt;code&amp;gt;st_ctime&amp;lt;/code&amp;gt; (change time) – может отличаться от реального времени создания на некоторых файловых системах.&lt;br /&gt;
 '''datetime getModifyDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время последнего изменения файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
*&amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
*Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время последней модификации.&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
*Выбрасывает исключение, если не удаётся получить дату изменения.&lt;br /&gt;
*На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;modifyTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
*На POSIX-системах используется поле &amp;lt;code&amp;gt;st_mtime&amp;lt;/code&amp;gt; (modify time).&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_file&amp;diff=3498</id>
		<title>Класс file</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_file&amp;diff=3498"/>
		<updated>2026-04-27T06:29:43Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс предоставляет интерфейс для работы с файлами: открытие, закрытие, чтение и запись данных различных типов, позиционирование внутри файла. Поддерживает как текстовый, так и бинарный режимы работы.&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
 '''bool mostSignificantByteFirst'''&lt;br /&gt;
'''Назначение:''' Определяет порядок байтов (endianness) при чтении и записи числовых значений.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:''' Отсутствует (свойство).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – используется порядок '''Big-endian''' (старший байт первый).&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; (по умолчанию) – используется порядок '''Little-endian''' (младший байт первый).&lt;br /&gt;
* Влияет на методы &amp;lt;code&amp;gt;readInt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readUInt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readFloat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readDouble&amp;lt;/code&amp;gt; и соответствующие методы записи.&lt;br /&gt;
* Может изменяться в любой момент до выполнения операций чтения/записи.&lt;br /&gt;
&lt;br /&gt;
== Методы ==&lt;br /&gt;
 '''int open(const string &amp;amp;in filename, const string &amp;amp;in mode)'''&lt;br /&gt;
'''Назначение:''' Открывает файл для чтения и/или записи.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;filename&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
* &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt; – режим открытия файла:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;r&amp;quot;&amp;lt;/code&amp;gt; – открыть для чтения (только чтение).&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;w&amp;quot;&amp;lt;/code&amp;gt; – открыть для записи (создаёт новый или перезаписывает существующий).&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;a&amp;quot;&amp;lt;/code&amp;gt; – открыть для добавления (запись в конец файла).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно открыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка открытия (файл не существует, недостаточно прав, неверный режим).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Перед открытием нового файла автоматически закрывает ранее открытый.&lt;br /&gt;
* На Windows автоматически добавляет флаг &amp;lt;code&amp;gt;&amp;quot;b&amp;quot;&amp;lt;/code&amp;gt; (бинарный режим) для предотвращения преобразования &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На Windows CE пути преобразуются в абсолютные относительно директории приложения.&lt;br /&gt;
* Если режим не поддерживается (например, запись при &amp;lt;code&amp;gt;AS_WRITE_OPS == 0&amp;lt;/code&amp;gt;), возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int close()'''&lt;br /&gt;
'''Назначение:''' Закрывает открытый файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно закрыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл уже был закрыт или не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Автоматически вызывается в деструкторе объекта.&lt;br /&gt;
* После закрытия файла дальнейшие операции чтения/записи будут возвращать ошибки.&lt;br /&gt;
&lt;br /&gt;
 '''int getSize() const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Размер файла в байтах (тип &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Для определения размера сохраняет текущую позицию, перемещается в конец файла и возвращается обратно.&lt;br /&gt;
&lt;br /&gt;
 '''bool isEndOfFile() const'''&lt;br /&gt;
'''Назначение:''' Проверяет, достигнут ли конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – достигнут конец файла или файл не открыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – не достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует стандартную функцию &amp;lt;code&amp;gt;feof()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
 '''int getPos() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую позицию в файле.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Текущая позиция в байтах от начала файла.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;ftell()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int setPos(int pos)'''&lt;br /&gt;
'''Назначение:''' Устанавливает текущую позицию в файле от начала.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;pos&amp;lt;/code&amp;gt; – абсолютная позиция в байтах от начала файла.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – позиция успешно установлена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или позиция вне допустимого диапазона.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;fseek(SEEK_SET)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int movePos(int delta)'''&lt;br /&gt;
'''Назначение:''' Смещает текущую позицию в файле относительно текущего положения.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;delta&amp;lt;/code&amp;gt; – смещение в байтах (положительное – вперёд, отрицательное – назад).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – позиция успешно изменена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или смещение выходит за границы.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;fseek(SEEK_CUR)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''string readString(uint length)'''&lt;br /&gt;
'''Назначение:''' Читает указанное количество символов из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; – количество символов (байт) для чтения.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка с прочитанными данными (реальная длина может быть меньше &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt;, если достигнут конец файла).&lt;br /&gt;
* Пустая строка – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Возвращает все прочитанные байты как есть (включая нулевые символы).&lt;br /&gt;
* Размер результирующей строки соответствует количеству реально прочитанных байт.&lt;br /&gt;
&lt;br /&gt;
 '''string readLine()'''&lt;br /&gt;
'''Назначение:''' Читает одну строку из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка, содержащая прочитанную строку (без символа &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Пустая строка – если достигнут конец файла или файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает до символа перевода строки (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) или до заполнения внутреннего буфера (255 символов).&lt;br /&gt;
* Поддерживает чтение длинных строк – операция повторяется до обнаружения &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; или конца файла.&lt;br /&gt;
* Символ &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; не включается в результат.&lt;br /&gt;
&lt;br /&gt;
 '''int64 readInt(uint bytes)'''&lt;br /&gt;
'''Назначение:''' Читает знаковое целое число из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для чтения (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное целое число (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Поддерживает автоматическое расширение знака (sign extension) для отрицательных чисел.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Младшие байты заполняются нулями, если &amp;lt;code&amp;gt;bytes &amp;lt; 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для отрицательных чисел старшие байты заполняются &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''uint64 readUInt(uint bytes)'''&lt;br /&gt;
'''Назначение:''' Читает беззнаковое целое число из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для чтения (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное беззнаковое целое число (тип &amp;lt;code&amp;gt;uint64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Не выполняет расширение знака.&lt;br /&gt;
* Младшие байты заполняются нулями, если &amp;lt;code&amp;gt;bytes &amp;lt; 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''float readFloat()'''&lt;br /&gt;
'''Назначение:''' Читает число с плавающей точкой (32 бита) из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное число типа &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0.0f&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает ровно 4 байта.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Использует объединение (union) для битового преобразования.&lt;br /&gt;
&lt;br /&gt;
 '''double readDouble()'''&lt;br /&gt;
'''Назначение:''' Читает число с плавающей точкой двойной точности (64 бита) из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное число типа &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает ровно 8 байт.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Использует объединение (union) для битового преобразования.&lt;br /&gt;
&lt;br /&gt;
== Методы записи ==&lt;br /&gt;
 '''int writeString(const string &amp;amp;in str)'''&lt;br /&gt;
'''Назначение:''' Записывает строку в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; – строка для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает строку целиком, включая все символы (без завершающего нуля).&lt;br /&gt;
&lt;br /&gt;
 '''int writeInt(int64 val, uint bytes)'''&lt;br /&gt;
'''Назначение:''' Записывает знаковое целое число в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для записи (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Записываются только младшие &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; байт числа.&lt;br /&gt;
&lt;br /&gt;
 '''int writeUInt(uint64 val, uint bytes)'''&lt;br /&gt;
'''Назначение:''' Записывает беззнаковое целое число в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для записи (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Записываются только младшие &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; байт числа.&lt;br /&gt;
&lt;br /&gt;
 '''int writeFloat(float val)'''&lt;br /&gt;
'''Назначение:''' Записывает число с плавающей точкой (32 бита) в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает ровно 4 байта.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int writeDouble(double val)'''&lt;br /&gt;
'''Назначение:''' Записывает число с плавающей точкой двойной точности (64 бита) в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает ровно 8 байт.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
 // Создание и открытие файла для записи&lt;br /&gt;
 file f;&lt;br /&gt;
 f.mostSignificantByteFirst = false; // Little-endian&lt;br /&gt;
 &lt;br /&gt;
 int result = f.open(&amp;quot;data.bin&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 if (result == 0) &lt;br /&gt;
 {&lt;br /&gt;
     f.writeString(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
     f.writeInt(12345, 4);&lt;br /&gt;
     f.writeFloat(3.14159f);&lt;br /&gt;
     f.close();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Открытие файла для чтения&lt;br /&gt;
 file f2;&lt;br /&gt;
 f2.mostSignificantByteFirst = false;&lt;br /&gt;
 f2.open(&amp;quot;data.bin&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 if (!f2.isEndOfFile()) &lt;br /&gt;
 {&lt;br /&gt;
     string str = f2.readLine();&lt;br /&gt;
     int64 num = f2.readInt(4);&lt;br /&gt;
     float pi = f2.readFloat();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 f2.close();&lt;br /&gt;
 &lt;br /&gt;
 // Чтение бинарных данных с Big-endian порядком&lt;br /&gt;
 file f3;&lt;br /&gt;
 f3.mostSignificantByteFirst = true; // Network byte order&lt;br /&gt;
 f3.open(&amp;quot;network_data.bin&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
 uint64 value = f3.readUInt(4); // Читает 4 байта как Big-endian&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_file&amp;diff=3497</id>
		<title>Класс file</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_file&amp;diff=3497"/>
		<updated>2026-04-27T06:29:01Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: Новая страница: «Класс предоставляет интерфейс для работы с файлами: открытие, закрытие, чтение и запись...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Класс предоставляет интерфейс для работы с файлами: открытие, закрытие, чтение и запись данных различных типов, позиционирование внутри файла. Поддерживает как текстовый, так и бинарный режимы работы.&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
 '''bool mostSignificantByteFirst'''&lt;br /&gt;
'''Назначение:''' Определяет порядок байтов (endianness) при чтении и записи числовых значений.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:''' Отсутствует (свойство).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – используется порядок '''Big-endian''' (старший байт первый).&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; (по умолчанию) – используется порядок '''Little-endian''' (младший байт первый).&lt;br /&gt;
* Влияет на методы &amp;lt;code&amp;gt;readInt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readUInt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readFloat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;readDouble&amp;lt;/code&amp;gt; и соответствующие методы записи.&lt;br /&gt;
* Может изменяться в любой момент до выполнения операций чтения/записи.&lt;br /&gt;
&lt;br /&gt;
== Методы ==&lt;br /&gt;
 '''int open(const string &amp;amp;in filename, const string &amp;amp;in mode)'''&lt;br /&gt;
'''Назначение:''' Открывает файл для чтения и/или записи.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;filename&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
* &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt; – режим открытия файла:&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;r&amp;quot;&amp;lt;/code&amp;gt; – открыть для чтения (только чтение).&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;w&amp;quot;&amp;lt;/code&amp;gt; – открыть для записи (создаёт новый или перезаписывает существующий).&lt;br /&gt;
** &amp;lt;code&amp;gt;&amp;quot;a&amp;quot;&amp;lt;/code&amp;gt; – открыть для добавления (запись в конец файла).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно открыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка открытия (файл не существует, недостаточно прав, неверный режим).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Перед открытием нового файла автоматически закрывает ранее открытый.&lt;br /&gt;
* На Windows автоматически добавляет флаг &amp;lt;code&amp;gt;&amp;quot;b&amp;quot;&amp;lt;/code&amp;gt; (бинарный режим) для предотвращения преобразования &amp;lt;code&amp;gt;\r\n&amp;lt;/code&amp;gt; в &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На Windows CE пути преобразуются в абсолютные относительно директории приложения.&lt;br /&gt;
* Если режим не поддерживается (например, запись при &amp;lt;code&amp;gt;AS_WRITE_OPS == 0&amp;lt;/code&amp;gt;), возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int close()'''&lt;br /&gt;
'''Назначение:''' Закрывает открытый файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно закрыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл уже был закрыт или не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Автоматически вызывается в деструкторе объекта.&lt;br /&gt;
* После закрытия файла дальнейшие операции чтения/записи будут возвращать ошибки.&lt;br /&gt;
&lt;br /&gt;
 '''int getSize() const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Размер файла в байтах (тип &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Для определения размера сохраняет текущую позицию, перемещается в конец файла и возвращается обратно.&lt;br /&gt;
&lt;br /&gt;
 '''bool isEndOfFile() const'''&lt;br /&gt;
'''Назначение:''' Проверяет, достигнут ли конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – достигнут конец файла или файл не открыт.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – не достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует стандартную функцию &amp;lt;code&amp;gt;feof()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
 '''int getPos() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую позицию в файле.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Текущая позиция в байтах от начала файла.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;ftell()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int setPos(int pos)'''&lt;br /&gt;
'''Назначение:''' Устанавливает текущую позицию в файле от начала.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;pos&amp;lt;/code&amp;gt; – абсолютная позиция в байтах от начала файла.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – позиция успешно установлена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или позиция вне допустимого диапазона.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;fseek(SEEK_SET)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int movePos(int delta)'''&lt;br /&gt;
'''Назначение:''' Смещает текущую позицию в файле относительно текущего положения.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;delta&amp;lt;/code&amp;gt; – смещение в байтах (положительное – вперёд, отрицательное – назад).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – позиция успешно изменена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – файл не открыт или смещение выходит за границы.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Использует функцию &amp;lt;code&amp;gt;fseek(SEEK_CUR)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''string readString(uint length)'''&lt;br /&gt;
'''Назначение:''' Читает указанное количество символов из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; – количество символов (байт) для чтения.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка с прочитанными данными (реальная длина может быть меньше &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt;, если достигнут конец файла).&lt;br /&gt;
* Пустая строка – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Возвращает все прочитанные байты как есть (включая нулевые символы).&lt;br /&gt;
* Размер результирующей строки соответствует количеству реально прочитанных байт.&lt;br /&gt;
&lt;br /&gt;
 '''string readLine()'''&lt;br /&gt;
'''Назначение:''' Читает одну строку из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка, содержащая прочитанную строку (без символа &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Пустая строка – если достигнут конец файла или файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает до символа перевода строки (&amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;) или до заполнения внутреннего буфера (255 символов).&lt;br /&gt;
* Поддерживает чтение длинных строк – операция повторяется до обнаружения &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; или конца файла.&lt;br /&gt;
* Символ &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; не включается в результат.&lt;br /&gt;
&lt;br /&gt;
 '''int64 readInt(uint bytes)'''&lt;br /&gt;
'''Назначение:''' Читает знаковое целое число из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для чтения (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное целое число (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Поддерживает автоматическое расширение знака (sign extension) для отрицательных чисел.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Младшие байты заполняются нулями, если &amp;lt;code&amp;gt;bytes &amp;lt; 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для отрицательных чисел старшие байты заполняются &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''uint64 readUInt(uint bytes)'''&lt;br /&gt;
'''Назначение:''' Читает беззнаковое целое число из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для чтения (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное беззнаковое целое число (тип &amp;lt;code&amp;gt;uint64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Не выполняет расширение знака.&lt;br /&gt;
* Младшие байты заполняются нулями, если &amp;lt;code&amp;gt;bytes &amp;lt; 8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''float readFloat()'''&lt;br /&gt;
'''Назначение:''' Читает число с плавающей точкой (32 бита) из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное число типа &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0.0f&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает ровно 4 байта.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Использует объединение (union) для битового преобразования.&lt;br /&gt;
&lt;br /&gt;
 '''double readDouble()'''&lt;br /&gt;
'''Назначение:''' Читает число с плавающей точкой двойной точности (64 бита) из файла.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Прочитанное число типа &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; – если файл не открыт или достигнут конец файла.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Читает ровно 8 байт.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Использует объединение (union) для битового преобразования.&lt;br /&gt;
&lt;br /&gt;
== Методы записи ==&lt;br /&gt;
 '''int writeString(const string &amp;amp;in str)'''&lt;br /&gt;
'''Назначение:''' Записывает строку в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt; – строка для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает строку целиком, включая все символы (без завершающего нуля).&lt;br /&gt;
&lt;br /&gt;
 '''int writeInt(int64 val, uint bytes)'''&lt;br /&gt;
'''Назначение:''' Записывает знаковое целое число в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для записи (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Записываются только младшие &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; байт числа.&lt;br /&gt;
&lt;br /&gt;
 '''int writeUInt(uint64 val, uint bytes)'''&lt;br /&gt;
'''Назначение:''' Записывает беззнаковое целое число в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
* &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; – количество байт для записи (1–8). Если &amp;lt;code&amp;gt;bytes &amp;gt; 8&amp;lt;/code&amp;gt;, используется 8.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Записываются только младшие &amp;lt;code&amp;gt;bytes&amp;lt;/code&amp;gt; байт числа.&lt;br /&gt;
&lt;br /&gt;
 '''int writeFloat(float val)'''&lt;br /&gt;
'''Назначение:''' Записывает число с плавающей точкой (32 бита) в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает ровно 4 байта.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''int writeDouble(double val)'''&lt;br /&gt;
'''Назначение:''' Записывает число с плавающей точкой двойной точности (64 бита) в файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt; – значение для записи.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Количество записанных байт (0 или 1 в терминах &amp;lt;code&amp;gt;fwrite&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – если файл не открыт.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Записывает ровно 8 байт.&lt;br /&gt;
* Порядок байт определяется свойством &amp;lt;code&amp;gt;mostSignificantByteFirst&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
 // Создание и открытие файла для записи&lt;br /&gt;
 file f;&lt;br /&gt;
 f.mostSignificantByteFirst = false; // Little-endian&lt;br /&gt;
 &lt;br /&gt;
 int result = f.open(&amp;quot;data.bin&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 if (result == 0) &lt;br /&gt;
 {&lt;br /&gt;
     f.writeString(&amp;quot;Hello, World!&amp;quot;);&lt;br /&gt;
     f.writeInt(12345, 4);&lt;br /&gt;
     f.writeFloat(3.14159f);&lt;br /&gt;
     f.close();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Открытие файла для чтения&lt;br /&gt;
 file f2;&lt;br /&gt;
 f2.mostSignificantByteFirst = false;&lt;br /&gt;
 f2.open(&amp;quot;data.bin&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 if (!f2.isEndOfFile()) &lt;br /&gt;
 {&lt;br /&gt;
     string str = f2.readLine();&lt;br /&gt;
     int64 num = f2.readInt(4);&lt;br /&gt;
     float pi = f2.readFloat();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 f2.close();&lt;br /&gt;
 &lt;br /&gt;
 // Чтение бинарных данных с Big-endian порядком&lt;br /&gt;
 file f3;&lt;br /&gt;
 f3.mostSignificantByteFirst = true; // Network byte order&lt;br /&gt;
 f3.open(&amp;quot;network_data.bin&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
 uint64 value = f3.readUInt(4); // Читает 4 байта как Big-endian&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3496</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3496"/>
		<updated>2026-04-27T06:19:12Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Класс filesystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Математические и тригонометрические функции ==&lt;br /&gt;
&lt;br /&gt;
===Преобразование IEEE битов===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сравнение с допуском===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тригонометрические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Гиперболические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Экспоненциальные и логарифмические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Степенные функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Функции округления и остатка ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Специализированные функции==&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с узлами===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с окнами ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с временем===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с событиями===&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы со строками===&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Другие функции===&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
==Класс file==&lt;br /&gt;
Класс доступен начиная с версии 1.4.5 AgavaSCADA/AgavaPLC.&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 '''int open(const string&amp;amp; filename, const string&amp;amp; mode)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Открытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции: 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|const string&amp;amp; filename - путь до файла&lt;br /&gt;
|-&lt;br /&gt;
|const string&amp;amp; mode - режим открытия файла.&lt;br /&gt;
|}&lt;br /&gt;
 '''int close()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Закрытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции. 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''int getSize() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Получение размера файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Размер файла в байтах&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''bool isEndOfFile() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
| Получение признака конца файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|true - обнаружен конец файла.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''string readString(uint length)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|uint length - длина считываемой строки&lt;br /&gt;
|}&lt;br /&gt;
 '''string readLine()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| Считывание производится до тех пор, пока не будет обнаружен символ '\n' или конец файла&lt;br /&gt;
|}&lt;br /&gt;
 '''int64 readInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого числа со знаком.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''uint64 readUInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого беззнакового числа.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''float readFloat()'''&lt;br /&gt;
'''Назначение:''' чтение целого вещественного числа одинарной точности.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
double readDouble()&lt;br /&gt;
&lt;br /&gt;
int writeString(const string &amp;amp;in)&lt;br /&gt;
&lt;br /&gt;
int writeInt(int64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeUInt(uint64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeFloat(float)&lt;br /&gt;
&lt;br /&gt;
int writeDouble(double)&lt;br /&gt;
&lt;br /&gt;
int getPos() const&lt;br /&gt;
&lt;br /&gt;
int setPos(int)&lt;br /&gt;
&lt;br /&gt;
int movePos(int)&lt;br /&gt;
&lt;br /&gt;
===Поля===&lt;br /&gt;
bool mostSignificantByteFirst.&lt;br /&gt;
&lt;br /&gt;
== Класс filesystem ==&lt;br /&gt;
Класс предоставляет интерфейс для взаимодействия с файловой системой операционной системы. Позволяет выполнять операции с файлами и директориями, получать информацию о них, а также управлять текущей рабочей директорией.&lt;br /&gt;
&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Методы ===&lt;br /&gt;
 '''bool changeCurrentPath(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Изменяет текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к новой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если путь существует и текущая директория успешно изменена.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если указанный путь не существует или не является директорией.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Если путь задан относительно, он объединяется с текущей директорией.&lt;br /&gt;
* Путь не должен содержать обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; – они автоматически заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Завершающие слеши автоматически удаляются из пути.&lt;br /&gt;
* Не поддерживает разрешение внутренних ссылок &amp;lt;code&amp;gt;/./&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;/../&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''string getCurrentPath() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка с абсолютным путём текущей директории, использующая разделители &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* При создании объекта &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt; текущая директория инициализируется рабочим каталогом приложения.&lt;br /&gt;
* Все обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; для единообразия.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getDirs() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех поддиректорий внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами поддиректорий.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Специальные записи &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (текущая директория) и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (родительская директория) исключаются из результата.&lt;br /&gt;
* Возвращает пустой массив, если директорий нет или произошла ошибка чтения.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getFiles() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех файлов внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами файлов.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* В результат включаются только файлы, директории исключаются.&lt;br /&gt;
* Возвращает пустой массив, если файлов нет или произошла ошибка чтения.&lt;br /&gt;
 '''bool isDir(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь директорией.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является директорией.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не существует, не является директорией или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
* Абсолютные пути определяются наличием двоеточия &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt;) или начального слеша &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''bool isLink(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь символической ссылкой (symlink).&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является символической ссылкой (на Windows – репарс-точкой).&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не является ссылкой, не существует или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Кроссплатформенная поддержка: Windows (атрибут &amp;lt;code&amp;gt;FILE_ATTRIBUTE_REPARSE_POINT&amp;lt;/code&amp;gt;) и POSIX (флаг &amp;lt;code&amp;gt;S_IFLNK&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
 '''int64 getSize(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Размер файла в байтах (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не существует, указан путь к директории или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;GetFileSizeEx&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для директорий возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int makeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Создаёт новую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к создаваемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно создана.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка создания (например, недостаточно прав, путь не существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Важно:''' Не поддерживает рекурсивное создание промежуточных директорий (отмечено в TODO).&lt;br /&gt;
* На Windows создаёт директорию с правами по умолчанию.&lt;br /&gt;
* На POSIX создаёт с правами &amp;lt;code&amp;gt;S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH&amp;lt;/code&amp;gt; (755: чтение/запись/исполнение для владельца, чтение/исполнение для группы и остальных).&lt;br /&gt;
 '''int removeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет пустую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно удалена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (директория не пуста, не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Удаляет только '''пустые''' директории.&lt;br /&gt;
* Не поддерживает рекурсивное удаление с содержимым.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;RemoveDirectoryW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int deleteFile(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемому файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно удалён.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (файл не существует, недостаточно прав, указана директория).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;DeleteFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;unlink&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для удаления директорий используйте &amp;lt;code&amp;gt;removeDir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int copyFile(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Копирует файл из одного местоположения в другое.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – путь к исходному файлу.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – путь к целевому файлу (не директории).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно скопирован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка копирования (исходный файл не существует, недостаточно прав, целевой файл уже существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;CopyFileW&amp;lt;/code&amp;gt; с параметром &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; (не перезаписывать существующий файл).&lt;br /&gt;
* На POSIX-системах копирование выполняется '''вручную''' побайтово через &amp;lt;code&amp;gt;fopen/fread/fwrite&amp;lt;/code&amp;gt;, так как стандартной функции копирования нет.&lt;br /&gt;
* Целевой файл не должен существовать (флаг &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; на Windows).&lt;br /&gt;
 '''int move(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Перемещает или переименовывает файл или директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – текущий путь к объекту.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – новый путь или имя объекта.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – объект успешно перемещён/переименован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка операции (объект не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Может использоваться как для файлов, так и для директорий.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;MoveFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Операция может выполняться в пределах одного тома/файловой системы.&lt;br /&gt;
 '''datetime getCreateDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время создания файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время создания.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату создания.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;createTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_ctime&amp;lt;/code&amp;gt; (change time) – может отличаться от реального времени создания на некоторых файловых системах.&lt;br /&gt;
 '''datetime getModifyDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время последнего изменения файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время последней модификации.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату изменения.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;modifyTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_mtime&amp;lt;/code&amp;gt; (modify time).&lt;br /&gt;
&lt;br /&gt;
==Класс datetime==&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Конструкторы===&lt;br /&gt;
&lt;br /&gt;
====Конструктор по умолчанию====&lt;br /&gt;
 datetime dt();&lt;br /&gt;
Создает объект с текущей датой и временем.&lt;br /&gt;
&lt;br /&gt;
====Конструктор копирования====&lt;br /&gt;
 datetime dt(other);&lt;br /&gt;
Создает копию существующего объекта datetime.&lt;br /&gt;
&lt;br /&gt;
====Конструктор с параметрами====&lt;br /&gt;
 datetime dt(year, month, day, hour = 0, minute = 0, second = 0);&lt;br /&gt;
Создает объект с указанной датой и временем.&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
 // Только дата&lt;br /&gt;
 datetime newYear = datetime(2024, 1, 1);&lt;br /&gt;
 &lt;br /&gt;
 // Дата и время&lt;br /&gt;
 datetime meeting = datetime(2024, 12, 25, 14, 30, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Полная спецификация&lt;br /&gt;
 datetime exact = datetime(2024, 6, 15, 9, 45, 30);&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_year() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает год (4 цифры).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_month() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает месяц (1-12).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_day() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает день месяца (1-31).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_hour() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает часы (0-23).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_minute() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает минуты (0-59).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_second() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает секунды (0-59).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 12, 25, 14, 30, 45);&lt;br /&gt;
 &lt;br /&gt;
 uint year = dt.year;    // 2024&lt;br /&gt;
 uint month = dt.month;  // 12&lt;br /&gt;
 uint day = dt.day;      // 25&lt;br /&gt;
 uint hour = dt.hour;    // 14&lt;br /&gt;
 uint minute = dt.minute; // 30&lt;br /&gt;
 uint second = dt.second; // 45&lt;br /&gt;
&amp;lt;code&amp;gt;bool setDate(year, month, day)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает дату. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверной дате.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setDate(2024, 2, 29); // true (високосный год)&lt;br /&gt;
 bool invalid = dt.setDate(2023, 2, 29); // false (не високосный)&lt;br /&gt;
&amp;lt;code&amp;gt;bool setTime(hour, minute, second)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает время. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверном времени.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
cpp&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setTime(23, 59, 59); // true&lt;br /&gt;
 bool invalid = dt.setTime(25, 0, 0);   // false (часы &amp;gt; 23)&lt;br /&gt;
&lt;br /&gt;
===Арифметические операции===&lt;br /&gt;
Вычитание дат&lt;br /&gt;
 int64 difference = dt1 - dt2;&lt;br /&gt;
Возвращает разницу в секундах.&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = datetime(2024, 1, 2, 0, 0, 0);&lt;br /&gt;
 int64 diff = end - start; // 86400 секунд (1 день)&lt;br /&gt;
Сложение с секундами&lt;br /&gt;
 datetime result = dt + seconds;&lt;br /&gt;
 datetime result = seconds + dt; // обратный порядок&lt;br /&gt;
 dt += seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Добавить 2 часа&lt;br /&gt;
 datetime later = dt + 7200;&lt;br /&gt;
 dt += 7200;&lt;br /&gt;
 &lt;br /&gt;
 // Обратный порядок&lt;br /&gt;
 datetime same = 7200 + dt;&lt;br /&gt;
Вычитание секунд&lt;br /&gt;
 datetime result = dt - seconds;&lt;br /&gt;
 datetime result = seconds - dt; // обратный порядок&lt;br /&gt;
 dt -= seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Вычесть 30 минут&lt;br /&gt;
 datetime earlier = dt - 1800;&lt;br /&gt;
 dt -= 1800;&lt;br /&gt;
&lt;br /&gt;
===Операции сравнения ===&lt;br /&gt;
&amp;lt;code&amp;gt;bool opEquals(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка равенства дат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;bool opLess(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка что дата раньше.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;int opCmp(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сравнение с возвратом -1 (меньше), 0 (равно), 1 (больше).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt1 = datetime(2024, 1, 1);&lt;br /&gt;
 datetime dt2 = datetime(2024, 1, 2);&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 &amp;lt; dt2) {&lt;br /&gt;
     // dt1 раньше dt2&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 == dt2) {&lt;br /&gt;
     // даты равны&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int result = dt1.opCmp(dt2); // -1&lt;br /&gt;
&lt;br /&gt;
===Практические примеры ===&lt;br /&gt;
Пример 1: Таймер выполнения&lt;br /&gt;
 datetime startTime;&lt;br /&gt;
 &lt;br /&gt;
 // Выполняем некоторую операцию&lt;br /&gt;
 for (int i = 0; i &amp;lt; 1000000; i++) &lt;br /&gt;
 {&lt;br /&gt;
     // какая-то работа&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 datetime endTime;&lt;br /&gt;
 int64 elapsed = endTime - startTime;&lt;br /&gt;
 print(&amp;quot;Операция заняла: &amp;quot; + elapsed + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
Пример 2: Расчет дат событий&lt;br /&gt;
 // Дата начала проекта&lt;br /&gt;
 datetime projectStart = datetime(2024, 1, 15);&lt;br /&gt;
 &lt;br /&gt;
 // Напоминание за 3 дня до дедлайна&lt;br /&gt;
 datetime deadline = datetime(2024, 3, 1);&lt;br /&gt;
 datetime reminder = deadline - 3 * 86400; // 3 дня в секундах&lt;br /&gt;
 &lt;br /&gt;
 // Продление срока на 2 недели&lt;br /&gt;
 datetime extendedDeadline = deadline + 14 * 86400;&lt;br /&gt;
Пример 3: Проверка рабочего времени&lt;br /&gt;
 datetime currentTime;&lt;br /&gt;
 &lt;br /&gt;
 // Создаем время начала и конца рабочего дня&lt;br /&gt;
 datetime workStart = datetime(currentTime.year, currentTime.month, &lt;br /&gt;
                              currentTime.day, 9, 0, 0);&lt;br /&gt;
 datetime workEnd = workStart + 8 * 3600; // 8 часов&lt;br /&gt;
 &lt;br /&gt;
 if (currentTime &amp;gt;= workStart &amp;amp;&amp;amp; currentTime &amp;lt;= workEnd) &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Рабочее время&amp;quot;);&lt;br /&gt;
 } &lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Вне рабочего времени&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
Пример 4: Валидация даты&lt;br /&gt;
 bool createAppointment(uint year, uint month, uint day, uint hour) &lt;br /&gt;
 {&lt;br /&gt;
     datetime appointment;&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность даты&lt;br /&gt;
     if (!appointment.setDate(year, month, day)) {&lt;br /&gt;
         print(&amp;quot;Неверная дата!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность времени&lt;br /&gt;
     if (!appointment.setTime(hour, 0, 0)) {&lt;br /&gt;
         print(&amp;quot;Неверное время!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем что дата не в прошлом&lt;br /&gt;
     datetime now;&lt;br /&gt;
     if (appointment &amp;lt; now) {&lt;br /&gt;
         print(&amp;quot;Дата не может быть в прошлом!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     print(&amp;quot;Встреча создана: &amp;quot; + appointment.year + &amp;quot;-&amp;quot; + appointment.month + &amp;quot;-&amp;quot; + appointment.day);&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;br /&gt;
Пример 5: Разбивка интервала времени&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = start + 365 * 86400; // +1 год&lt;br /&gt;
 &lt;br /&gt;
 int64 totalSeconds = end - start;&lt;br /&gt;
 int64 days = totalSeconds / 86400;&lt;br /&gt;
 int64 hours = (totalSeconds % 86400) / 3600;&lt;br /&gt;
 int64 minutes = (totalSeconds % 3600) / 60;&lt;br /&gt;
 int64 seconds = totalSeconds % 60;&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Интервал: &amp;quot; + days + &amp;quot; дней, &amp;quot; + hours + &amp;quot; часов, &amp;quot; + minutes + &amp;quot; минут, &amp;quot; + seconds + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
===Пример использования скрипта для решения задачи===&lt;br /&gt;
Приведенный ниже пример демонстрирует один из вариантов решения реальной практической задачи. Для реализации необходимого алгоритма работы задействованы узлы, взаимодействующие с входами / выходами контроллера или хранящие значения, и скрипт С++.&lt;br /&gt;
&lt;br /&gt;
На вход скрипта подаются значения некоего сигнала (Signal) и уставки (Constant). В том случае, если сигнал больше уставки, замыкается релейный выход (out0). Соотношение между сигналом и уставкой переводится в проценты и записывается в переменную Percent. Если это соотношение становится меньше определенного значения, то соответствующее сообщение записывается в переменную Alert.&lt;br /&gt;
&lt;br /&gt;
Текст скрипта:&lt;br /&gt;
 &amp;lt;br /&amp;gt;bool main (float signal_val, float constant_val)  // функция получает значения сигнала и уставки&lt;br /&gt;
 {&lt;br /&gt;
   float ratio;             // переменная, в которой будет храниться соотношение сигнала и уставки&lt;br /&gt;
   ratio = signal_val / constant_val; // вычисление соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  percent_write(ratio);             // вызов функции записи в узлы, с передачей в нее соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  if ( signal_val &amp;gt; constant_val)&lt;br /&gt;
   {&lt;br /&gt;
      return true;                   // если сигнал больше уставки, на выход скрипта приходит true&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      return false;               // если сигнал не больше уставки, на выход скрипта приходит false&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;br /&amp;gt;void percent_write (double ratio) // функция записи в узлы&lt;br /&gt;
 {&lt;br /&gt;
   string message = &amp;quot;Значение в пределах нормы&amp;quot;; // текстовое сообщение по умолчанию&lt;br /&gt;
   double percent = ratio * 100;                 // вычисляется процентное соотношение&lt;br /&gt;
 &lt;br /&gt;
   if ( percent &amp;lt; 50 )&lt;br /&gt;
   {&lt;br /&gt;
     message = &amp;quot;Значение ниже нормы!&amp;quot;;           // если процентное соотношение меньше 50&lt;br /&gt;
                                                 // то текст сообщения меняется                                         &lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // запись текстового сообщения в нужный узел&lt;br /&gt;
   SetNodeValueAsString(&amp;quot;/Конфигурация/Станция/Сигналы/Alert&amp;quot;, message);&lt;br /&gt;
 &lt;br /&gt;
   // запись процентного соотношения в нужный узел                                            &lt;br /&gt;
   SetNodeValueAsFloat(&amp;quot;/Конфигурация/Станция/Сигналы/Percent&amp;quot;, percent);                                              &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3495</id>
		<title>Перечень изменений AgavaSCADA/AgavaPLC 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3495"/>
		<updated>2026-04-27T05:39:51Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* 1.6.33-rc335f5d9dacf от 2026-04-01 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные изменения в сравнении с версией 1.2:&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания программ на языке C++ в соответствии с подходом, описанным в стандарте МЭК 61131-3.&lt;br /&gt;
# Продолжение развития объектной модели и возможности разработки программ, начатых в версии &amp;lt;code&amp;gt;AS 1.5&amp;lt;/code&amp;gt;. [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
# Добавлена поддержка локального и онлайн (удаленного) отладчика.&lt;br /&gt;
# Для редактирования текстов программ, функций и классов внедрен новый, удобный и функциональный текстовый редактор, подобный распространенному VSCode.&lt;br /&gt;
# Транспорты MQTT, SNMP, МЭК 60870-5-101, МЭК 60870-5-104 портированы на ПК с ОС Linux x64 и контроллеры АГАВА.&lt;br /&gt;
# Реализован новый архиватор в БД PostgreSQL.&lt;br /&gt;
# Добавлена поддержка ресурсов и библиотек ресурсов.&lt;br /&gt;
# Добавлена Web-визуализация. См. пример &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Разработан ряд примеров, демонстрирующих новые возможности: &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PIDRegulator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Wdt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AgavaAnalogInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WidgetAgavaInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Pump&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; и другие.&lt;br /&gt;
Также запланировано добавление новых возможностей:&lt;br /&gt;
# Поддержка языка ST МЭК 61131-3  (Structured text).&lt;br /&gt;
# Поддержка распределенных проектов.&lt;br /&gt;
# Поддержка сохранения в проекте информации о целевой системе.&lt;br /&gt;
# Конфигурирование целевых устройств из проекта.&lt;br /&gt;
# Создание расширений для среды разработки с помощью SDK.&lt;br /&gt;
Перевод разработанных ранее проектов на актуальную версию описан в документе [[Миграция проектов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== 1.6.34-r1005c4072459 от 2026-04-24 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Восстановлена работа узла &amp;lt;code&amp;gt;Транспорт OPC UA&amp;lt;/code&amp;gt;. Восстановлена обработка операций после чтения и перед записью.&lt;br /&gt;
# Дополнена валидация узла &amp;lt;code&amp;gt;Тег OPC UA&amp;lt;/code&amp;gt;. '''В связи с обширной переделкой транспорта и тега изменены настройки свойства &amp;lt;code&amp;gt;Тип значения&amp;lt;/code&amp;gt;, для ранее созданных проектов требуется ревизия значений данного свойства тегов.'''&lt;br /&gt;
# Исправлены ошибки в работе узла &amp;lt;code&amp;gt;Сигнал комплексный&amp;lt;/code&amp;gt;. Также реализована выдача сигнала обновления значения при изменении значений свойств во время исполнения.&lt;br /&gt;
# Исправлен запуск и валидация узла &amp;lt;code&amp;gt;Монитор событий комплексный&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализована работа архиваторов, графика исторического и отчетов со свойствами узлов. Теперь архивация значений свойств работает корректно.&lt;br /&gt;
# Доработана объектная модель: для класса &amp;lt;code&amp;gt;NodeProperty&amp;lt;/code&amp;gt; добавлены перегрузки &amp;lt;code&amp;gt;SetValue(ResourceLink)&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;SetValue(Color)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны архиваторы &amp;lt;code&amp;gt;PostgreSQL&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;SQLite&amp;lt;/code&amp;gt; - отключена запись изменений свойств всех узлов коллекции (ошибочно введенная ранее функция).&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Виджет &amp;quot;Условное изображение&amp;quot;&amp;lt;/code&amp;gt; - исправлена работа свойства &amp;lt;code&amp;gt;Видимость&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Узел типа &amp;lt;code&amp;gt;Система сигнализации&amp;lt;/code&amp;gt; внесен в объектную модель. Зарегистрирован метод &amp;lt;code&amp;gt;void SystemAlarming::AcknowledgeAll()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлены ошибки в методах &amp;lt;code&amp;gt;BasicNode::GetPath()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::GetName()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::SetName()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::GetDescription()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicNode::SetDescription()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка некорректной остановки &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt; серверов.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при закрытии проекта.&lt;br /&gt;
# Исправлена ошибка копирования экземпляров классов.&lt;br /&gt;
# Исправлена ошибка, возникавшая при вставке узлов экземпляров из другого проекта.&lt;br /&gt;
# Устранена критическая ошибка в системе проверки прав, возникавшая при проверке проекта.&lt;br /&gt;
# Исправлена критическая ошибка создания узла типа &amp;lt;code&amp;gt;Логгер PostgreSQL&amp;lt;/code&amp;gt;.&lt;br /&gt;
# При валидации проекта добавлены предупреждения о кириллических символах в именах узлов.&lt;br /&gt;
# Доработана компиляция проекта -  изменено отображение замечаний об исключениях. Теперь исключение, возникающее при компиляции такого проекта, отображается как ошибка для большей заметности. Устранены неинформативные замечания этапа компиляции.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;Visualization/DynamicWidgets&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан пример &amp;lt;code&amp;gt;Visualization/WidgetAgavaInput&amp;lt;/code&amp;gt; - добавлена демонстрация вызова метода виджета из кнопки на форме.&lt;br /&gt;
# Пример &amp;lt;code&amp;gt;Transports/ModbusMasterSlave&amp;lt;/code&amp;gt; дополнен демонстрацией работы TCP Master/Slave.&lt;br /&gt;
&lt;br /&gt;
=== Разное ===&lt;br /&gt;
&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;ASLauncher&amp;lt;/code&amp;gt; - доработана утилита конфигурирования - настройки сети и времени для ОС Windows.&lt;br /&gt;
&lt;br /&gt;
== 1.6.33-rc335f5d9dacf от 2026-04-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработан выполнение алгоритмов C++: &lt;br /&gt;
#* Возвращён вызов виртуальных методов BasicSource. &lt;br /&gt;
#* Реализована защита от рекурсии в методах BasicSource.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; - зарегистрированы конструкторы и методы работы с типами uint64, uint32.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Отключена возможность множественных подключений к транспорту в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; :&lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Восстановлена работа в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт УПД&amp;lt;/code&amp;gt;: &lt;br /&gt;
## Исправлена работа со свойством &amp;lt;code&amp;gt;Идентификаторы ведущих&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Добавлено отслеживание активного подключения в режиме &amp;lt;code&amp;gt;Slave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Зарегистрирован класс [[Класс any|any]].&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Retain накопитель&amp;lt;/code&amp;gt; - реализована возможность сохранения через задержку.&lt;br /&gt;
# Добавлена возможность связывания свойств экземпляров с свойствами других узлов.&lt;br /&gt;
# Добавлены типы (u)int64 для связи со свойствами экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в команде &amp;quot;Показать в графическом представлении&amp;quot;.&lt;br /&gt;
# Доработано контекстное меню дерева проекта: &lt;br /&gt;
#* Исправлена критическая ошибка в команде &amp;quot;Выделить&amp;quot; для виджетов.&lt;br /&gt;
#* Пункт &amp;quot;Выделить&amp;quot; перемещен на уровень выше.&lt;br /&gt;
#* Добавлено действие &amp;quot;Выделить&amp;quot; на двойной клик по виджетам.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при открытии диалога &amp;quot;Настройки&amp;quot; для графиков.&lt;br /&gt;
# Устранены назойливые сообщения загрузки плагинов и регистрации узлов при проверке проекта.&lt;br /&gt;
# Добавлена возможность восстановления связей между узлами при вставке фрагментов из других проектов.&lt;br /&gt;
# Исправлена ошибка многократной установки ошибок в редактор кода, приводившая к сильному замедлению работы при большом количестве открытых окон редактора.&lt;br /&gt;
# Реализовано отображение содержимого массивов и указателей (хэндлов) в режиме отладки.&lt;br /&gt;
# Добавлены файловые ассоциации на файл проекта для быстрого открытия проекта в среде разработки с помощью двойного клика по .asp файлу.&lt;br /&gt;
# '''Отключен вызов сеттеров свойств при установке значений свойств в среде разработки.'''&lt;br /&gt;
# Отключено кеширование композиций в среде разработки.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при установке значения свойства типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; у экземпляра после сборки проекта.&lt;br /&gt;
# Доработано контекстное меню дерева проекта и контекстное меню графического предаставления - добавлены иконки элементов контекстного меню &amp;lt;code&amp;gt;Добавить узел&amp;lt;/code&amp;gt;, изменен порядок команд для более удобного их использования.&lt;br /&gt;
# Изменена горячая клавиша создания проекта на &amp;lt;code&amp;gt;Ctrl+Shift+N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Добавлено логгирование для системного и межстанционного транспортов.&lt;br /&gt;
# Убрана поддержка IPv6 в системном транспорте и межстанционном транспорте для работы на встраиваемых системах без IPv6.&lt;br /&gt;
# Исправлена критическая ошибка в BasicNode, иногда приводившая к крахам при одновременном доступе к объекту из разных задач.&lt;br /&gt;
&lt;br /&gt;
== 1.6.32-r79b12a16bbd7 от 2026-03-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Класс &amp;lt;code&amp;gt;WindowForm&amp;lt;/code&amp;gt; добавлен в объектную модель.&lt;br /&gt;
# Отключена возможность добавления узлов типа &amp;lt;code&amp;gt;Задача ПЛК&amp;lt;/code&amp;gt; как устаревшего функционала. Вместо него будет добавлена возможность создавать программы на языках FBD, CFC, SFC.&lt;br /&gt;
# Реализовано автоматическое создание конструкторов по умолчанию для классов из ОМ при отсутствии пользовательского.&lt;br /&gt;
# Исправлен запуск сигналов.&lt;br /&gt;
# Устранены утечки памяти при сохранении проекта в .bin.&lt;br /&gt;
# Внутренняя реорганизация обработчиков событий OperationsInput, OperationsOutput в узле &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен TransportModbusRtuIdr2.&lt;br /&gt;
# В действии &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; исправлена работа форматтера &amp;lt;code&amp;gt;$$pd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан редактор графического представления: добавлена сетка, [[Универсальная среда разработки Agava#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5 .D1.8F.D0.BA.D0.BE.D1.80.D0.B5.D0.B9|линейки, якоря]], функции выравнивания виджетов.&lt;br /&gt;
# Исправлена ошибка, вызывавшая двойной вызов обработчиков событий мыши для окон.&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при удалении виджетов.&lt;br /&gt;
# Добавлено приветственное окно со списком последних открытых проектов и таблицей примеров.&lt;br /&gt;
# Исправлена некритическая ошибка, возникавшая при закрытии фрейма.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при закрытии окна с кешированными композициями.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-rac6da98668fb от 2025-12-26 ==&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
# Добавлен пример  &amp;lt;code&amp;gt;Controllers/PLC70_Submodules&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-r9e81e0333260 от 2025-12-25 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания конструкторов вида Classname(const string &amp;amp;in path) в дереве.&lt;br /&gt;
# Исправлена ошибка в вызове обработчика &amp;lt;code&amp;gt;OnWheel&amp;lt;/code&amp;gt; у виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Корзина субмодулей&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Уменьшено время ожидания ответа субмодуля с 1000 мс до 25 мс.&lt;br /&gt;
#* Реализована поддержка слотов G/H/I/K для ПЛК-70. &lt;br /&gt;
#* Реализовано создание узлов для каналов субмодулей в дереве проекта. '''Обратите внимание, проекты, использующие прежнюю структуру субмодулей, не совместимы с версией AgavaSCADA/AgavaPLC 1.6.31!'''&lt;br /&gt;
#* Исправлена валидация слотов на уровне субмодуля. Добавлена проверка на занятость одного слота несколькими субмодулями с формированием сообщения об ошибке.&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-60&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлено ограничение значений подсветки экрана и индикаторов, добавлена валидация соответствующих свойств узлов.&lt;br /&gt;
#* Реализована установка яркости подсветки экрана и состояния светодиодов согласно настроек в проекте.&lt;br /&gt;
# Доработан транспорт OPC UA: &lt;br /&gt;
#* Добавлена поддержка типа double.&lt;br /&gt;
#* Устранены критические ошибки при повторном запуске транспорта и при записи в read-only тэги.&lt;br /&gt;
#* Добавлено уведомление пользователя о некорректных тэгах.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;: исправлено форматирование значений типа double - число знаков после запятой теперь зависит от шага значения.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена потенциальная ошибка сохранения проекта при открытии в проводнике папки с проектом.&lt;br /&gt;
# Изменен мастер создания проектов: для проектов для &amp;lt;code&amp;gt;ПЛК-70.А&amp;lt;/code&amp;gt;, создаваемых с помощью мастера, используется узел &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt; в предыдущей версии.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при запуске на ПК среды исполнения без проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.30-rb3d3b577ed29 от 2025-12-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Ядро ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена работа системного транспорта: устранена ошибка взаимодействия с другими станциями.&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка с обработкой вложенных групп в узле типа &amp;lt;code&amp;gt;Приложение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;NodeProperty&amp;lt;/code&amp;gt;: изменена регистрация класса, устранены критические ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработано редактирование свойств типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt;: добавлен сброс значения, позволяющий удалить ранее установленное значение.&lt;br /&gt;
# Доработан редактирование свойств типа &amp;lt;code&amp;gt;NodeLink&amp;lt;/code&amp;gt;: исправлена ошибка при работе с узлами с одними цифрами в имени.&lt;br /&gt;
# Доработано окно свойств: свойства типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt; принимают перетаскивание узлов.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Стек вызовов&amp;lt;/code&amp;gt;: при двойном клике по элементам таблицы открывается редактор кода.&lt;br /&gt;
# Доработан редактор кода: добавлены маркеры ошибок компиляции.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Ошибки&amp;lt;/code&amp;gt;: при двойном клике на ошибке выполняется открытие редактора кода.&lt;br /&gt;
# '''Добавлена возможность поиска по проекту. Панель поиска вызывается комбинацией клавиш &amp;lt;code&amp;gt;Ctrl+Shift+F&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Доработано окно тревог: добавлено сообщение &amp;quot;Активных тревог нет&amp;quot; в центре таблицы при отсутствии активных тревог.&lt;br /&gt;
&lt;br /&gt;
== 1.6.29-rf17ce9e25c7a от 2025-11-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;SetNodeValueAsUInt(string strNodePath, uint32_t uiValue)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Требовать квитирование&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана система тревог: добавлены обработчики событий &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;OnActiveEventsAcknowledged&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан архиватор SQLite: изменен алгоритм прореживания в режиме &amp;lt;code&amp;gt;Процент от среднего значения&amp;lt;/code&amp;gt; — теперь среднее вычисляется по последним N значениям.   Добавлено свойство &amp;lt;code&amp;gt;Размер окна среднего (N)&amp;lt;/code&amp;gt; для настройки ширины окна. Также добавлена опция &amp;lt;code&amp;gt;Процент от среднего (окно по времени)&amp;lt;/code&amp;gt;, в которой среднее рассчитывается по значениям за временной интервал, равный параметру &amp;lt;code&amp;gt;Интервал архивирования&amp;lt;/code&amp;gt;.  Исправлено отсутствие таблицы &amp;lt;code&amp;gt;SignalInfo&amp;lt;/code&amp;gt; при ротации БД.&lt;br /&gt;
# Доработана система тревог: добавлено свойство &amp;lt;code&amp;gt;Использовать цвет группы&amp;lt;/code&amp;gt; для отображения элементов в окне тревог.   Добавлено сохранение событий квитирования.&lt;br /&gt;
# Доработано окно смены пароля: добавлена поддержка свойства &amp;lt;code&amp;gt;Запретить смену пароля&amp;lt;/code&amp;gt; у узла пользователя.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;void sleep(ms)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Изменена логика работы функции &amp;lt;code&amp;gt;LaunchProcess&amp;lt;/code&amp;gt;, которая теперь выполняет запуск в блокирующем режиме, то есть функция завершится после завершения запущенного процесса.&lt;br /&gt;
# Исправлена ошибка в узле &amp;lt;code&amp;gt;Операция Таймер&amp;lt;/code&amp;gt;. Теперь выключенные действия в обработчике &amp;lt;code&amp;gt;OnTimerFinished&amp;lt;/code&amp;gt; не исполняются.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Упорядочен вывод сообщений в окно Сообщения. Устранен вывод служебных сообщений.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.28-r7aa0d6dc2386 от 2025-11-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработано действие Смена пароля пользователя - пользователи с запретом смены пароля блокируются в списке выбора.&lt;br /&gt;
# Исправлена критическая ошибка в системе проверки прав, возникающая при некорректной конфигурации системы. Дополнена валидация системы для уведомления о некорректной конфигурации.&lt;br /&gt;
# Доработана стандартная библиотека: реализованы функции &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetInterfaceAddresses(string)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetNetworkInterfaces()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запретить изменение пароля&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована работа со значениями типа SignalValue.&lt;br /&gt;
# Доработаны приложения - реализована выдача значений типа SignalValue для свойств экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в виджетах &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt;, возникавшая при удалении источника из списка.&lt;br /&gt;
# Добавлено сохранение типа узла в его тег в XML проекте.&lt;br /&gt;
# Изменено редактирование узлов &amp;lt;code&amp;gt;Операция скрипт С++&amp;lt;/code&amp;gt;, размещенных в обработчиках. Теперь это работает почти как в версии 1.2, но переход к редактору возможен только по нажатию ОК. При закрытии диалога контейнера добавлено закрытие окна редактора кода для вложенного узла.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, демонстрирующий применение ООП в проекте.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;, демонстрирующие принцип построения распределенных проектов.&lt;br /&gt;
&lt;br /&gt;
== 1.6.27-r8573369cf034 от 2025-10-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработана [[Узлы проекта AgavaSCADA/AgavaPLC#Композиция|композиция многослойная]]: добавлено свойство &amp;lt;code&amp;gt;ActionsOnLoad&amp;lt;/code&amp;gt;.&lt;br /&gt;
# В стандартную  библиотеку добавлена поддержка класса &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено чтение свойств типа &amp;lt;code&amp;gt;NColor&amp;lt;/code&amp;gt;  [[Свойства узлов в AgavaSCADA/AgavaPLC#NColor|через преобразование в int]].&lt;br /&gt;
# Устранены критические ошибки в системных функциях поиска файлов, возникавшие при работе с разрушенными файловыми системами.&lt;br /&gt;
# Добавлены функции &amp;lt;code&amp;gt;bool isnan(float value)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void LaunchProcess(string strFilePath)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.26-rfd1b5cbbf1fc от 2025-10-23 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Для узлов &amp;lt;code&amp;gt;RetainStorage&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;StorageDrive&amp;lt;/code&amp;gt; реализовано онлайн создание свойств.&lt;br /&gt;
# Доработаны методы &amp;lt;code&amp;gt;BasicSignal::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSignal::UpdateValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::UpdateValue&amp;lt;/code&amp;gt; - реализована выдача кодов [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|ошибок]].&lt;br /&gt;
# Доработаны архиваторы &amp;lt;code&amp;gt;SQLite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PostreSQL&amp;lt;/code&amp;gt; - добавлена возможность прореживания записи в БД.&lt;br /&gt;
# Выполнен рестайлинг окон проверки подлинности пользователя и смены пароля пользователя.&lt;br /&gt;
# Доработаны библиотеки ресурсов - исправлена работа с русскими символами.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Текущий&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана логика работы операторов &amp;lt;code&amp;gt;SignalValue operator&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SignalValue operator||&amp;lt;/code&amp;gt; - реализована генерация соответствующих событий при ошибках исполнения. Реализовано более простое и корректное сравнение значений. Изменен режим сравнения аргументов типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно с композицией: исправлена работа с свойством &amp;lt;code&amp;gt;CurrentCompositionDesc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;: устранена ошибка &amp;quot;Illegal Data Address&amp;quot; в режиме &amp;quot;Сервер&amp;quot; при создании нескольких блоков регистров.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск метода экземпляра&amp;lt;/code&amp;gt;: добавлена возможность передачи аргументов.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлен форматтер &amp;lt;code&amp;gt;$$ns&amp;lt;/code&amp;gt; - шифр узла.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt;: для вложенных действий типа &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; передается ссылка на себя для работы с форматтерами.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена критическая ошибка, возникавшая при кликах по свойствам только для чтения типа bool узлов в дереве проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.25-r97ac006e3905 от 2025-10-15 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;bool isnan(double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int LoadComposition(string, string, int)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена возможность размещения пользовательских виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Не показывать в списке&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в действии &amp;lt;code&amp;gt;Закрытие окна&amp;lt;/code&amp;gt;, возникавшая при закрытии нескольких окон подряд на активном экране.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Тренд&amp;lt;/code&amp;gt; графика исторического: в свойство &amp;lt;code&amp;gt;Использовать описание и шифр&amp;lt;/code&amp;gt; добавлен вариант &amp;lt;code&amp;gt;Вышестоящий узел сигнала&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена отдельная иконка для аварий. Исправлена работа свойства &amp;lt;code&amp;gt;Включить воспроизведение звуков&amp;lt;/code&amp;gt; на контроллерах.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: исправлена ошибка, при возникновении которой при деактивации события выводился текст активации.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при редактировании свойств типа &amp;lt;code&amp;gt;Узел&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Устранено &amp;quot;зависание&amp;quot; среды разработки при онлайн отладке и просмотре значений переменных из отлаживаемой программы.&lt;br /&gt;
# Доработано окно редактирования свойств типа &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;: добавлена возможность перемещения элементов.&lt;br /&gt;
# Доработано окно редактирования списка привилегий у роли: добавлена поддержка клавиши Del, реализовано сохранение и восстановление геометрии окна, реализовано удаление множества элементов.&lt;br /&gt;
# Доработано окно ошибок: двойной клик по ошибке выделяет в дереве проекта узел, вызвавший ошибку.&lt;br /&gt;
# Исправлено повторное открытие окна настройки привилегий.&lt;br /&gt;
# Доработана библиотека ресурсов: сохранение теперь выполняется только при наличии изменений.&lt;br /&gt;
&lt;br /&gt;
== 1.6.24-r93067f2c1dd1 от 2025-10-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;double rand(double, double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена поддержка команды &amp;lt;code&amp;gt;Сброс&amp;lt;/code&amp;gt; для действия &amp;lt;code&amp;gt;Команда узлу&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Контроллер событий&amp;lt;/code&amp;gt; переименован в &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Для монитора событий добавлено свойство &amp;lt;code&amp;gt;Блокировка работы&amp;lt;/code&amp;gt;, добавлен обработчик &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt;, вызывающийся после удаления всех активных тревог.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Регистр Modbus&amp;lt;/code&amp;gt; - добавлена поддержка онлайн создания свойств.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Транспорт Modbus&amp;lt;/code&amp;gt;: в режиме работы Slave устранена критическая ошибка, если не было указано свойство &amp;quot;Узел для чтения/записи&amp;quot;. Добавлено соответствующее предупреждение при сборке проекта.&lt;br /&gt;
# Добавлена поддержка связывания свойств экземпляров через аргументы типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Поведение при блокировании&amp;lt;/code&amp;gt;. Добавлена проверка значений контролируемых узлов при старте проекта.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан текстовый редактор кода: добавлена обработка нажатия клавиши &amp;lt;code&amp;gt;F9&amp;lt;/code&amp;gt; для добавления/удаления точек останова. Значительно ускорено открытие текстов программ в редакторе.&lt;br /&gt;
# Доработан отладчик: добавлено человеко-читаемое представление значений типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Дополнен пример &amp;lt;code&amp;gt;TestEventsAlarms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.23-ra13bff0d25ce от 2025-09-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлено восстановление свойств экземпляров объектов из retain.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt; - реализован арбитраж чтения/записи с помощью приоритетов.&lt;br /&gt;
# Исправлено некорректное позиционирование окон авторизации пользователя, выбора интервала графика или журнала и др. в проектах с составными фреймами, содержащими множество окон.&lt;br /&gt;
# Реализована запись во все источники узла &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка в редактировании свойств типа &amp;lt;code&amp;gt;Цвет&amp;lt;/code&amp;gt;, из-за которой иногда некорректно сохранялось значение альфа канала.&lt;br /&gt;
# Исправлена ошибка использования одной библиотеки ресурсов в разных проектах.&lt;br /&gt;
&lt;br /&gt;
== 1.6.22-r2d092373a7c2 от 2025-09-24 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Исправлены критические ошибки обращения к свойствам экземпляров объектов при выполнении программ.&lt;br /&gt;
# Исправлена ошибка первичного отображения окна тревог.&lt;br /&gt;
# Устранены ошибки в работе субмодулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранены ошибки компиляции проектов, использующих субмодули.&lt;br /&gt;
&lt;br /&gt;
== 1 1.6.21-rb7d9d1301bf0 от 2025-09-18 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств для виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализована проверка свойства &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; у действий перед выполнением.&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств экземпляров объектов и связывания их с методами и инициализации значениями.&lt;br /&gt;
# AS/PLC 2.38.&lt;br /&gt;
# Реализована возможность игнорирования ошибок связи при работе транспорта &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; (свойство &amp;lt;code&amp;gt;Действие при превышении порога ошибок 2&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Реализована инициализация значения сигнала простого значением связанного источника при запуске.&lt;br /&gt;
# Реализован кэш методов экземпляров объектов.&lt;br /&gt;
# Изменен механизм определения IP-адресов станции.&lt;br /&gt;
&lt;br /&gt;
=== 1.2 Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлена возможность выбора свойств узлов как источников для операций.&lt;br /&gt;
# Реализовано отображение признака &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; узлов в окне выбора узлов.&lt;br /&gt;
# Дополнена валидация виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.20-r0ad724e1e636 от 2025-08-08 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int StoreMessage(int iMessageLevel, string strMessage, string strGroup).&amp;lt;/code&amp;gt;&lt;br /&gt;
# Добавлена возможность вызова методов экземпляров объектов из действий.&lt;br /&gt;
# Исправлено выполнение действия &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;, теперь возможно создание событий из обработчиков.&lt;br /&gt;
# В тренды графиков добавлено свойство &amp;lt;code&amp;gt;Единицы измерения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен межстанционный транспорт. Для станций добавлено свойство &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt;. Станция с ролью &amp;lt;code&amp;gt;Клиент&amp;lt;/code&amp;gt; производит подключение к удаленным станциям с ролью &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt; и уведомляет об изменениях источников и сигналов.&lt;br /&gt;
# Устранена ошибочная генерация нескольких дублирующихся событий при работе контроллеров событий.&lt;br /&gt;
# В окне &amp;lt;code&amp;gt;Фильтр&amp;lt;/code&amp;gt; виджета &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; размер элементов теперь зависит от свойства системы тревог &amp;lt;code&amp;gt;Размер кнопки&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* добавлена [[Транспорты AgavaSCADA/AgavaPLC#Этап 2. Объединение команд записи (функции 15 и 16)|группировка команд записи]] для функций 15 и 16;&lt;br /&gt;
#* реализована [[Транспорты AgavaSCADA/AgavaPLC#Этап 1. Дедупликация при постановке в очередь|дедупликация команд записи]].&lt;br /&gt;
# Доработан транспорт OPC-UA: &lt;br /&gt;
#* исправлены типы свойств;&lt;br /&gt;
#* сервер теперь привязывается к порту, указанному в свойстве &amp;lt;code&amp;gt;Адрес&amp;lt;/code&amp;gt; (ранее всегда использовался 4840).&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка при перетаскивании разделителя столбцов.&lt;br /&gt;
# Свойство &amp;quot;Аргументы&amp;quot; программы сделано скрытым.&lt;br /&gt;
# Добавлена возможность размещения определений классов в приложении в подгруппах любой вложенности.&lt;br /&gt;
&lt;br /&gt;
== 1.6.19-r89b594033f4d от 2025-09-02 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Реализовано определение локальной станции для запуска проекта.&lt;br /&gt;
# Исправлен запуск узла типа &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# В мастер создания проектов добавлена поддержка АГАВА ПЛК-70.А.&lt;br /&gt;
# Исправлена конвертация виджетов &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt; при обновлении проекта с версии 1.2.&lt;br /&gt;
# Исправлена ошибка в окне настройки исторического графика, связанная с одновременным удалением нескольких трендов.&lt;br /&gt;
# Доработана проверка проекта перед сохранением конфигурации. При обнаружении критических ошибок - отказ сохранения.&lt;br /&gt;
# Добавлена проверки станций на использование адреса 127.0.0.1, на дублирующиеся IP-адреса.&lt;br /&gt;
&lt;br /&gt;
== 1.6.18-r4a325427448b от 2025-08-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработана установка аргументов в вызываемые методы экземпляров (добавлен тип &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; для некоторых сценариев).&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлен узел типа &amp;lt;code&amp;gt;Счетчик&amp;lt;/code&amp;gt;, хранящий признак активного подключения к устройству с заданным Modbus адресом.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Реализовано множественное подключение клиентов в режиме работы &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Доработан режим &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;: добавлена возможность настройки таймаута активности клиента и максимального количества подключений к серверу.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Шаблонная композиция&amp;lt;/code&amp;gt; убран из списка доступных типов для группы &amp;quot;Композиции&amp;quot;.&lt;br /&gt;
# Исправлена критическая ошибка, изредка возникавшая при переключении окон.&lt;br /&gt;
# Исправлена ошибка выполнения действия Закрытие окна.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена функция просмотра и редактирования списка источников формы.&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== 1.6.17-r1f70359a00b4 от 2025-08-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка передачи аргументов типов &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; в методы классов.&lt;br /&gt;
# Исправлено связывание свойств экземпляров базовых типов с узлами проекта.&lt;br /&gt;
# Доработан вызов методов типа &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; классов для исключения критических ошибок.&lt;br /&gt;
# Для кривых графиков изменена толщина линии по умолчанию на &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в команде &amp;lt;code&amp;gt;Сохранить архив проекта&amp;lt;/code&amp;gt; - устранено ошибочное создание дубликатов некоторых используемых проектом файлов.&lt;br /&gt;
# Доработано восстановление &amp;lt;code&amp;gt;retain&amp;lt;/code&amp;gt; - добавлена возможность восстановления в свойства экземпляров классов.&lt;br /&gt;
# Изменена конвертация &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; в другие типы.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены ошибки работы отладчика с точками останова в методах и свойствах классов.&lt;br /&gt;
# Изменен уровень ошибок компиляции при поиске путей в проекте (Get/SetNodeValueAs...  и др.) с &amp;lt;code&amp;gt;Ошибка&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;Предупреждение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализовано связывание виджетов со свойствами узлов путем перетаскивания.&lt;br /&gt;
# Добавлено местное (inplace) редактирование свойств типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; в диалоге редактирования сопоставлений, например в окне редактирования сопоставлений виджета &amp;lt;code&amp;gt;Выпадающий список&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Уточнено сообщение об ошибочном открытии проекта из папки &amp;lt;code&amp;gt;.autosave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно выбора узлов - кнопка &amp;lt;code&amp;gt;ОК&amp;lt;/code&amp;gt; теперь является кнопкой по умолчанию.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример SQLiteDecimation, демонстрирующий возможности прореживания при записи архива SQLite.&lt;br /&gt;
# Доработан пример TestEventsAlarms.&lt;br /&gt;
&lt;br /&gt;
== 1.6.16-r4dc07fc875a4 от 2025-07-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработан системный транспорт &amp;lt;code&amp;gt;TransportSystem2&amp;lt;/code&amp;gt; - изменена процедура остановка сервера для устранения незавершенных соединений.&lt;br /&gt;
# Доработаны виджеты &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; - исправлена работа с источником.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск процесса&amp;lt;/code&amp;gt; - исправлен запуск процесса.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлено обновление BuildNo и даты сборки проекта.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Убрано диалоговое окно с сообщением о частых попытках перезапуска при выходе.&lt;br /&gt;
# При запуске приложений из `.desktop` файлов добавлена проверка, что логирование в указанные файлы возможно.&lt;br /&gt;
# В файлы логов добавлена информация о версии приложения.&lt;br /&gt;
&lt;br /&gt;
== 1.6.15-r710146e4389e от 2025-07-09 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Узел Система тревог - добавлены настройки окна тревог (ширина, высота, перенос строк в сообщениях).&lt;br /&gt;
# Исправлена ошибка в проверке прав на закрытие фрейма, из-за чего в некоторых проектах без системы проверки прав закрытие фрейма не работало.&lt;br /&gt;
# Виджет &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; - исправлена ошибка при работе с диалогом ожидания.&lt;br /&gt;
# Действие &amp;lt;code&amp;gt;Авторизация пользователя&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt;. Действие с включенным свойством &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt; будет отображать окно авторизации без возможности смены пользователя.&lt;br /&gt;
# Реализована возможность инициализации свойств экземпляров объектов постоянными значениями, задаваемыми в среде разработки (доступны типы bool, int, uint, long, ulong, double, string).&lt;br /&gt;
# Для транспортов &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; добавлена очистка очереди команд при (ре)старте обмена.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена поддержка нового системного транспорта. Для подключения к панелям оператора и контроллерам из среды разработки необходимо обновить среду исполнения до версии 1.6.15 или более новой.&lt;br /&gt;
# Добавлена иконка для приложения [[Универсальная среда разработки Agava]] (впервые с версии 1.0!).&lt;br /&gt;
# Исправлены критические ошибки в webvisu из-за отсутствия qml модулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Откорректировано оформление окна авторизации с целью улучшения привлекательности.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LayersDemo&amp;lt;/code&amp;gt;. Пример &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; дополнен демонстрацией webvisu.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;OpcUaDemo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OpcUaClientDemo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Версия переведена в стабильную стадию.'''&lt;br /&gt;
&lt;br /&gt;
== 1.6.14-r1c61c35c3da4 от 2025-06-20 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность регулирования частоты обновления форм и экранов с композициями. Добавлено свойство &amp;quot;Интервал обновления&amp;quot; для экранов и композиций.&lt;br /&gt;
# У виджета &amp;quot;График&amp;quot; изменен форматтер оси времени по умолчанию с &amp;quot;dd.MM.yy hh:mm:ss&amp;quot; на &amp;quot;dd.MM.yyyy hh:mm:ss&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизирован вывод информации на экран - исключена повторная отрисовка виджетов, при записи значений в их свойства из скриптов и программ.&lt;br /&gt;
# Реализовано профилирование вызова базовых методов и работы с контекстами.&lt;br /&gt;
# Реализован вывод информации о перерисовке виджетов в консоль с настройкой через файл as.ini.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;WindowUpdateRate&amp;lt;/code&amp;gt;, демонстрирующий возможность ограничения частоты обновления окон.&lt;br /&gt;
&lt;br /&gt;
== 1.6.13-r13248581de39 от 2025-06-17 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка функции &amp;quot;Просмотр событий&amp;quot;, из-за которой некорректно выдавались события в проектах без логгеров.&lt;br /&gt;
# Реализовано копирование станций ПК-40, ПК-50, ПК-60.&lt;br /&gt;
# Устранено сохранение в архив проекта файлов .bi?, хранящихся в подпапках, начинающихся с точки. Например .autosave, .backup&lt;br /&gt;
# Разрешено добавление приложений к станциям ПО-40, ПО-50, ПО-60.&lt;br /&gt;
# Убрана зависимость от библиотеки libclang.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Реализован вывод информации о регионах перерисовки окон в консоль с настройкой через файл as.ini.&lt;br /&gt;
# Доработаны методы BasicSignal::GetValue, BasicSignal::SetValue для корректного обращения к узлам проекта.&lt;br /&gt;
# Исправлена ошибка в работе со светодиодами станции ПК-40.&lt;br /&gt;
# Исправлено создание BasicSource(&amp;quot;path&amp;quot;), BasicSignal(&amp;quot;path&amp;quot;), BasicWidget(&amp;quot;path&amp;quot;) в программах. Теперь появилась возможность доступа ко всем свойствам узла проекта, а не только к свойствам, определенным в BasicNode.&lt;br /&gt;
# Добавлена проверка типа при создании экземпляра BasicSource (ОМ).&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Разработан пример &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, демонстрирующий работу со светодиодами ПО-50 из программы с использованием объектной модели.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен скрипт для восстановления &amp;lt;code&amp;gt;explorer.exe&amp;lt;/code&amp;gt; в качестве оболочки рабочего стола после установки ASLauncher.&lt;br /&gt;
&lt;br /&gt;
== 1.6.12-r17b244111a8c от 2025-05-30 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка, возникавшая при перемещении узлов в дереве проекта, из-за которой перемещаемые узлы пропадали.&lt;br /&gt;
# Добавлено текстовое описание при появлении окна с ошибками, например при сохранении проекта.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Операция Пара условий&amp;lt;/code&amp;gt; - исправлены имена свойств. В проектах версии 1.2 операция не работала в режиме проверки двух условий. '''Необходимо проверить корректность настроек при переходе с версии 1.2.'''&lt;br /&gt;
# Исправлена ошибка определения уровня логгеров при вызове команды &amp;lt;code&amp;gt;Просмотр событий&amp;lt;/code&amp;gt;, из-за которой при наличии в проекте логгеров с уровнями логгирования &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; в окно событий не попадали события ниже уровнем.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизация узла &amp;lt;code&amp;gt;Транспорт TCP&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована система журналирования.&lt;br /&gt;
&lt;br /&gt;
== 1.6.8-r915d8d477fa4 от 2025-05-14 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
# Исправлено несоответствие настроек узла &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt; и фактически исполняемых команд. '''При обновлении на эту версию необходимо проверить корректность настроек всех улов типа &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3494</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3494"/>
		<updated>2026-04-24T12:25:08Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Класс filesystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Математические и тригонометрические функции ==&lt;br /&gt;
&lt;br /&gt;
===Преобразование IEEE битов===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сравнение с допуском===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тригонометрические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Гиперболические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Экспоненциальные и логарифмические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Степенные функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Функции округления и остатка ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Специализированные функции==&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с узлами===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с окнами ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с временем===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с событиями===&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы со строками===&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Другие функции===&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
==Класс file==&lt;br /&gt;
Класс доступен начиная с версии 1.4.5 AgavaSCADA/AgavaPLC.&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 '''int open(const string&amp;amp; filename, const string&amp;amp; mode)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Открытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции: 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|const string&amp;amp; filename - путь до файла&lt;br /&gt;
|-&lt;br /&gt;
|const string&amp;amp; mode - режим открытия файла.&lt;br /&gt;
|}&lt;br /&gt;
 '''int close()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Закрытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции. 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''int getSize() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Получение размера файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Размер файла в байтах&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''bool isEndOfFile() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
| Получение признака конца файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|true - обнаружен конец файла.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''string readString(uint length)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|uint length - длина считываемой строки&lt;br /&gt;
|}&lt;br /&gt;
 '''string readLine()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| Считывание производится до тех пор, пока не будет обнаружен символ '\n' или конец файла&lt;br /&gt;
|}&lt;br /&gt;
 '''int64 readInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого числа со знаком.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''uint64 readUInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого беззнакового числа.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''float readFloat()'''&lt;br /&gt;
'''Назначение:''' чтение целого вещественного числа одинарной точности.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
double readDouble()&lt;br /&gt;
&lt;br /&gt;
int writeString(const string &amp;amp;in)&lt;br /&gt;
&lt;br /&gt;
int writeInt(int64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeUInt(uint64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeFloat(float)&lt;br /&gt;
&lt;br /&gt;
int writeDouble(double)&lt;br /&gt;
&lt;br /&gt;
int getPos() const&lt;br /&gt;
&lt;br /&gt;
int setPos(int)&lt;br /&gt;
&lt;br /&gt;
int movePos(int)&lt;br /&gt;
&lt;br /&gt;
===Поля===&lt;br /&gt;
bool mostSignificantByteFirst.&lt;br /&gt;
&lt;br /&gt;
== Класс filesystem ==&lt;br /&gt;
Класс предоставляет интерфейс для взаимодействия с файловой системой операционной системы. Позволяет выполнять операции с файлами и директориями, получать информацию о них, а также управлять текущей рабочей директорией.&lt;br /&gt;
&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Методы ===&lt;br /&gt;
 '''bool changeCurrentPath(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Изменяет текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к новой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если путь существует и текущая директория успешно изменена.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если указанный путь не существует или не является директорией.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Если путь задан относительно, он объединяется с текущей директорией.&lt;br /&gt;
* Путь не должен содержать обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; – они автоматически заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Завершающие слеши автоматически удаляются из пути.&lt;br /&gt;
* Не поддерживает разрешение внутренних ссылок &amp;lt;code&amp;gt;/./&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;/../&amp;lt;/code&amp;gt; (отмечено в TODO).&lt;br /&gt;
 '''string getCurrentPath() const'''&lt;br /&gt;
'''Назначение:''' Возвращает текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка с абсолютным путём текущей директории, использующая разделители &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* При создании объекта &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt; текущая директория инициализируется рабочим каталогом приложения.&lt;br /&gt;
* Все обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; для единообразия.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getDirs() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех поддиректорий внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами поддиректорий.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Специальные записи &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (текущая директория) и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (родительская директория) исключаются из результата.&lt;br /&gt;
* Возвращает пустой массив, если директорий нет или произошла ошибка чтения.&lt;br /&gt;
 '''array&amp;lt;string&amp;gt; @getFiles() const'''&lt;br /&gt;
'''Назначение:''' Получает список всех файлов внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами файлов.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* В результат включаются только файлы, директории исключаются.&lt;br /&gt;
* Возвращает пустой массив, если файлов нет или произошла ошибка чтения.&lt;br /&gt;
 '''bool isDir(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь директорией.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является директорией.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не существует, не является директорией или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
* Абсолютные пути определяются наличием двоеточия &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt;) или начального слеша &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''bool isLink(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь символической ссылкой (symlink).&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является символической ссылкой (на Windows – репарс-точкой).&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не является ссылкой, не существует или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Кроссплатформенная поддержка: Windows (атрибут &amp;lt;code&amp;gt;FILE_ATTRIBUTE_REPARSE_POINT&amp;lt;/code&amp;gt;) и POSIX (флаг &amp;lt;code&amp;gt;S_IFLNK&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
 '''int64 getSize(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Размер файла в байтах (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не существует, указан путь к директории или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;GetFileSizeEx&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для директорий возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int makeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Создаёт новую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к создаваемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно создана.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка создания (например, недостаточно прав, путь не существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Важно:''' Не поддерживает рекурсивное создание промежуточных директорий (отмечено в TODO).&lt;br /&gt;
* На Windows создаёт директорию с правами по умолчанию.&lt;br /&gt;
* На POSIX создаёт с правами &amp;lt;code&amp;gt;S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH&amp;lt;/code&amp;gt; (755: чтение/запись/исполнение для владельца, чтение/исполнение для группы и остальных).&lt;br /&gt;
 '''int removeDir(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет пустую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно удалена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (директория не пуста, не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Удаляет только '''пустые''' директории.&lt;br /&gt;
* Не поддерживает рекурсивное удаление с содержимым (отмечено в TODO).&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;RemoveDirectoryW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int deleteFile(const string &amp;amp;in path)'''&lt;br /&gt;
'''Назначение:''' Удаляет файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемому файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно удалён.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (файл не существует, недостаточно прав, указана директория).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;DeleteFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;unlink&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для удаления директорий используйте &amp;lt;code&amp;gt;removeDir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 '''int copyFile(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Копирует файл из одного местоположения в другое.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – путь к исходному файлу.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – путь к целевому файлу (не директории).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно скопирован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка копирования (исходный файл не существует, недостаточно прав, целевой файл уже существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;CopyFileW&amp;lt;/code&amp;gt; с параметром &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; (не перезаписывать существующий файл).&lt;br /&gt;
* На POSIX-системах копирование выполняется '''вручную''' побайтово через &amp;lt;code&amp;gt;fopen/fread/fwrite&amp;lt;/code&amp;gt;, так как стандартной функции копирования нет.&lt;br /&gt;
* Целевой файл не должен существовать (флаг &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; на Windows).&lt;br /&gt;
 '''int move(const string &amp;amp;in source, const string &amp;amp;in target)'''&lt;br /&gt;
'''Назначение:''' Перемещает или переименовывает файл или директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – текущий путь к объекту.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – новый путь или имя объекта.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – объект успешно перемещён/переименован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка операции (объект не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Может использоваться как для файлов, так и для директорий.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;MoveFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Операция может выполняться в пределах одного тома/файловой системы.&lt;br /&gt;
 '''datetime getCreateDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время создания файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время создания.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату создания.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;createTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_ctime&amp;lt;/code&amp;gt; (change time) – может отличаться от реального времени создания на некоторых файловых системах.&lt;br /&gt;
 '''datetime getModifyDateTime(const string &amp;amp;in path) const'''&lt;br /&gt;
'''Назначение:''' Возвращает дату и время последнего изменения файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время последней модификации.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату изменения.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;modifyTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_mtime&amp;lt;/code&amp;gt; (modify time).&lt;br /&gt;
&lt;br /&gt;
==Класс datetime==&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Конструкторы===&lt;br /&gt;
&lt;br /&gt;
====Конструктор по умолчанию====&lt;br /&gt;
 datetime dt();&lt;br /&gt;
Создает объект с текущей датой и временем.&lt;br /&gt;
&lt;br /&gt;
====Конструктор копирования====&lt;br /&gt;
 datetime dt(other);&lt;br /&gt;
Создает копию существующего объекта datetime.&lt;br /&gt;
&lt;br /&gt;
====Конструктор с параметрами====&lt;br /&gt;
 datetime dt(year, month, day, hour = 0, minute = 0, second = 0);&lt;br /&gt;
Создает объект с указанной датой и временем.&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
 // Только дата&lt;br /&gt;
 datetime newYear = datetime(2024, 1, 1);&lt;br /&gt;
 &lt;br /&gt;
 // Дата и время&lt;br /&gt;
 datetime meeting = datetime(2024, 12, 25, 14, 30, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Полная спецификация&lt;br /&gt;
 datetime exact = datetime(2024, 6, 15, 9, 45, 30);&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_year() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает год (4 цифры).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_month() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает месяц (1-12).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_day() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает день месяца (1-31).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_hour() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает часы (0-23).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_minute() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает минуты (0-59).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_second() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает секунды (0-59).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 12, 25, 14, 30, 45);&lt;br /&gt;
 &lt;br /&gt;
 uint year = dt.year;    // 2024&lt;br /&gt;
 uint month = dt.month;  // 12&lt;br /&gt;
 uint day = dt.day;      // 25&lt;br /&gt;
 uint hour = dt.hour;    // 14&lt;br /&gt;
 uint minute = dt.minute; // 30&lt;br /&gt;
 uint second = dt.second; // 45&lt;br /&gt;
&amp;lt;code&amp;gt;bool setDate(year, month, day)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает дату. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверной дате.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setDate(2024, 2, 29); // true (високосный год)&lt;br /&gt;
 bool invalid = dt.setDate(2023, 2, 29); // false (не високосный)&lt;br /&gt;
&amp;lt;code&amp;gt;bool setTime(hour, minute, second)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает время. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверном времени.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
cpp&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setTime(23, 59, 59); // true&lt;br /&gt;
 bool invalid = dt.setTime(25, 0, 0);   // false (часы &amp;gt; 23)&lt;br /&gt;
&lt;br /&gt;
===Арифметические операции===&lt;br /&gt;
Вычитание дат&lt;br /&gt;
 int64 difference = dt1 - dt2;&lt;br /&gt;
Возвращает разницу в секундах.&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = datetime(2024, 1, 2, 0, 0, 0);&lt;br /&gt;
 int64 diff = end - start; // 86400 секунд (1 день)&lt;br /&gt;
Сложение с секундами&lt;br /&gt;
 datetime result = dt + seconds;&lt;br /&gt;
 datetime result = seconds + dt; // обратный порядок&lt;br /&gt;
 dt += seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Добавить 2 часа&lt;br /&gt;
 datetime later = dt + 7200;&lt;br /&gt;
 dt += 7200;&lt;br /&gt;
 &lt;br /&gt;
 // Обратный порядок&lt;br /&gt;
 datetime same = 7200 + dt;&lt;br /&gt;
Вычитание секунд&lt;br /&gt;
 datetime result = dt - seconds;&lt;br /&gt;
 datetime result = seconds - dt; // обратный порядок&lt;br /&gt;
 dt -= seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Вычесть 30 минут&lt;br /&gt;
 datetime earlier = dt - 1800;&lt;br /&gt;
 dt -= 1800;&lt;br /&gt;
&lt;br /&gt;
===Операции сравнения ===&lt;br /&gt;
&amp;lt;code&amp;gt;bool opEquals(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка равенства дат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;bool opLess(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка что дата раньше.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;int opCmp(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сравнение с возвратом -1 (меньше), 0 (равно), 1 (больше).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt1 = datetime(2024, 1, 1);&lt;br /&gt;
 datetime dt2 = datetime(2024, 1, 2);&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 &amp;lt; dt2) {&lt;br /&gt;
     // dt1 раньше dt2&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 == dt2) {&lt;br /&gt;
     // даты равны&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int result = dt1.opCmp(dt2); // -1&lt;br /&gt;
&lt;br /&gt;
===Практические примеры ===&lt;br /&gt;
Пример 1: Таймер выполнения&lt;br /&gt;
 datetime startTime;&lt;br /&gt;
 &lt;br /&gt;
 // Выполняем некоторую операцию&lt;br /&gt;
 for (int i = 0; i &amp;lt; 1000000; i++) &lt;br /&gt;
 {&lt;br /&gt;
     // какая-то работа&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 datetime endTime;&lt;br /&gt;
 int64 elapsed = endTime - startTime;&lt;br /&gt;
 print(&amp;quot;Операция заняла: &amp;quot; + elapsed + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
Пример 2: Расчет дат событий&lt;br /&gt;
 // Дата начала проекта&lt;br /&gt;
 datetime projectStart = datetime(2024, 1, 15);&lt;br /&gt;
 &lt;br /&gt;
 // Напоминание за 3 дня до дедлайна&lt;br /&gt;
 datetime deadline = datetime(2024, 3, 1);&lt;br /&gt;
 datetime reminder = deadline - 3 * 86400; // 3 дня в секундах&lt;br /&gt;
 &lt;br /&gt;
 // Продление срока на 2 недели&lt;br /&gt;
 datetime extendedDeadline = deadline + 14 * 86400;&lt;br /&gt;
Пример 3: Проверка рабочего времени&lt;br /&gt;
 datetime currentTime;&lt;br /&gt;
 &lt;br /&gt;
 // Создаем время начала и конца рабочего дня&lt;br /&gt;
 datetime workStart = datetime(currentTime.year, currentTime.month, &lt;br /&gt;
                              currentTime.day, 9, 0, 0);&lt;br /&gt;
 datetime workEnd = workStart + 8 * 3600; // 8 часов&lt;br /&gt;
 &lt;br /&gt;
 if (currentTime &amp;gt;= workStart &amp;amp;&amp;amp; currentTime &amp;lt;= workEnd) &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Рабочее время&amp;quot;);&lt;br /&gt;
 } &lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Вне рабочего времени&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
Пример 4: Валидация даты&lt;br /&gt;
 bool createAppointment(uint year, uint month, uint day, uint hour) &lt;br /&gt;
 {&lt;br /&gt;
     datetime appointment;&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность даты&lt;br /&gt;
     if (!appointment.setDate(year, month, day)) {&lt;br /&gt;
         print(&amp;quot;Неверная дата!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность времени&lt;br /&gt;
     if (!appointment.setTime(hour, 0, 0)) {&lt;br /&gt;
         print(&amp;quot;Неверное время!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем что дата не в прошлом&lt;br /&gt;
     datetime now;&lt;br /&gt;
     if (appointment &amp;lt; now) {&lt;br /&gt;
         print(&amp;quot;Дата не может быть в прошлом!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     print(&amp;quot;Встреча создана: &amp;quot; + appointment.year + &amp;quot;-&amp;quot; + appointment.month + &amp;quot;-&amp;quot; + appointment.day);&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;br /&gt;
Пример 5: Разбивка интервала времени&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = start + 365 * 86400; // +1 год&lt;br /&gt;
 &lt;br /&gt;
 int64 totalSeconds = end - start;&lt;br /&gt;
 int64 days = totalSeconds / 86400;&lt;br /&gt;
 int64 hours = (totalSeconds % 86400) / 3600;&lt;br /&gt;
 int64 minutes = (totalSeconds % 3600) / 60;&lt;br /&gt;
 int64 seconds = totalSeconds % 60;&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Интервал: &amp;quot; + days + &amp;quot; дней, &amp;quot; + hours + &amp;quot; часов, &amp;quot; + minutes + &amp;quot; минут, &amp;quot; + seconds + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
===Пример использования скрипта для решения задачи===&lt;br /&gt;
Приведенный ниже пример демонстрирует один из вариантов решения реальной практической задачи. Для реализации необходимого алгоритма работы задействованы узлы, взаимодействующие с входами / выходами контроллера или хранящие значения, и скрипт С++.&lt;br /&gt;
&lt;br /&gt;
На вход скрипта подаются значения некоего сигнала (Signal) и уставки (Constant). В том случае, если сигнал больше уставки, замыкается релейный выход (out0). Соотношение между сигналом и уставкой переводится в проценты и записывается в переменную Percent. Если это соотношение становится меньше определенного значения, то соответствующее сообщение записывается в переменную Alert.&lt;br /&gt;
&lt;br /&gt;
Текст скрипта:&lt;br /&gt;
 &amp;lt;br /&amp;gt;bool main (float signal_val, float constant_val)  // функция получает значения сигнала и уставки&lt;br /&gt;
 {&lt;br /&gt;
   float ratio;             // переменная, в которой будет храниться соотношение сигнала и уставки&lt;br /&gt;
   ratio = signal_val / constant_val; // вычисление соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  percent_write(ratio);             // вызов функции записи в узлы, с передачей в нее соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  if ( signal_val &amp;gt; constant_val)&lt;br /&gt;
   {&lt;br /&gt;
      return true;                   // если сигнал больше уставки, на выход скрипта приходит true&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      return false;               // если сигнал не больше уставки, на выход скрипта приходит false&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;br /&amp;gt;void percent_write (double ratio) // функция записи в узлы&lt;br /&gt;
 {&lt;br /&gt;
   string message = &amp;quot;Значение в пределах нормы&amp;quot;; // текстовое сообщение по умолчанию&lt;br /&gt;
   double percent = ratio * 100;                 // вычисляется процентное соотношение&lt;br /&gt;
 &lt;br /&gt;
   if ( percent &amp;lt; 50 )&lt;br /&gt;
   {&lt;br /&gt;
     message = &amp;quot;Значение ниже нормы!&amp;quot;;           // если процентное соотношение меньше 50&lt;br /&gt;
                                                 // то текст сообщения меняется                                         &lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // запись текстового сообщения в нужный узел&lt;br /&gt;
   SetNodeValueAsString(&amp;quot;/Конфигурация/Станция/Сигналы/Alert&amp;quot;, message);&lt;br /&gt;
 &lt;br /&gt;
   // запись процентного соотношения в нужный узел                                            &lt;br /&gt;
   SetNodeValueAsFloat(&amp;quot;/Конфигурация/Станция/Сигналы/Percent&amp;quot;, percent);                                              &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3493</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3493"/>
		<updated>2026-04-24T12:24:04Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Класс filesystem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Математические и тригонометрические функции ==&lt;br /&gt;
&lt;br /&gt;
===Преобразование IEEE битов===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сравнение с допуском===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тригонометрические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Гиперболические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Экспоненциальные и логарифмические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Степенные функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Функции округления и остатка ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Специализированные функции==&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с узлами===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с окнами ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с временем===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с событиями===&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы со строками===&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Другие функции===&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
==Класс file==&lt;br /&gt;
Класс доступен начиная с версии 1.4.5 AgavaSCADA/AgavaPLC.&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 '''int open(const string&amp;amp; filename, const string&amp;amp; mode)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Открытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции: 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|const string&amp;amp; filename - путь до файла&lt;br /&gt;
|-&lt;br /&gt;
|const string&amp;amp; mode - режим открытия файла.&lt;br /&gt;
|}&lt;br /&gt;
 '''int close()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Закрытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции. 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''int getSize() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Получение размера файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Размер файла в байтах&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''bool isEndOfFile() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
| Получение признака конца файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|true - обнаружен конец файла.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''string readString(uint length)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|uint length - длина считываемой строки&lt;br /&gt;
|}&lt;br /&gt;
 '''string readLine()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| Считывание производится до тех пор, пока не будет обнаружен символ '\n' или конец файла&lt;br /&gt;
|}&lt;br /&gt;
 '''int64 readInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого числа со знаком.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''uint64 readUInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого беззнакового числа.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''float readFloat()'''&lt;br /&gt;
'''Назначение:''' чтение целого вещественного числа одинарной точности.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
double readDouble()&lt;br /&gt;
&lt;br /&gt;
int writeString(const string &amp;amp;in)&lt;br /&gt;
&lt;br /&gt;
int writeInt(int64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeUInt(uint64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeFloat(float)&lt;br /&gt;
&lt;br /&gt;
int writeDouble(double)&lt;br /&gt;
&lt;br /&gt;
int getPos() const&lt;br /&gt;
&lt;br /&gt;
int setPos(int)&lt;br /&gt;
&lt;br /&gt;
int movePos(int)&lt;br /&gt;
&lt;br /&gt;
===Поля===&lt;br /&gt;
bool mostSignificantByteFirst.&lt;br /&gt;
&lt;br /&gt;
== Класс filesystem ==&lt;br /&gt;
Класс предоставляет интерфейс для взаимодействия с файловой системой операционной системы. Позволяет выполнять операции с файлами и директориями, получать информацию о них, а также управлять текущей рабочей директорией.&lt;br /&gt;
&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Методы ===&lt;br /&gt;
 bool changeCurrentPath(const string &amp;amp;in path)&lt;br /&gt;
'''Назначение:''' Изменяет текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к новой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если путь существует и текущая директория успешно изменена.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если указанный путь не существует или не является директорией.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Если путь задан относительно, он объединяется с текущей директорией.&lt;br /&gt;
* Путь не должен содержать обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; – они автоматически заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Завершающие слеши автоматически удаляются из пути.&lt;br /&gt;
* Не поддерживает разрешение внутренних ссылок &amp;lt;code&amp;gt;/./&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;/../&amp;lt;/code&amp;gt; (отмечено в TODO).&lt;br /&gt;
 string getCurrentPath() const&lt;br /&gt;
'''Назначение:''' Возвращает текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка с абсолютным путём текущей директории, использующая разделители &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* При создании объекта &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt; текущая директория инициализируется рабочим каталогом приложения.&lt;br /&gt;
* Все обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; для единообразия.&lt;br /&gt;
 array&amp;lt;string&amp;gt; @getDirs() const&lt;br /&gt;
'''Назначение:''' Получает список всех поддиректорий внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами поддиректорий.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Специальные записи &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (текущая директория) и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (родительская директория) исключаются из результата.&lt;br /&gt;
* Возвращает пустой массив, если директорий нет или произошла ошибка чтения.&lt;br /&gt;
 array&amp;lt;string&amp;gt; @getFiles() const&lt;br /&gt;
'''Назначение:''' Получает список всех файлов внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами файлов.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* В результат включаются только файлы, директории исключаются.&lt;br /&gt;
* Возвращает пустой массив, если файлов нет или произошла ошибка чтения.&lt;br /&gt;
 bool isDir(const string &amp;amp;in path) const&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь директорией.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является директорией.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не существует, не является директорией или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
* Абсолютные пути определяются наличием двоеточия &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt;) или начального слеша &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
 bool isLink(const string &amp;amp;in path) const&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь символической ссылкой (symlink).&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является символической ссылкой (на Windows – репарс-точкой).&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не является ссылкой, не существует или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Кроссплатформенная поддержка: Windows (атрибут &amp;lt;code&amp;gt;FILE_ATTRIBUTE_REPARSE_POINT&amp;lt;/code&amp;gt;) и POSIX (флаг &amp;lt;code&amp;gt;S_IFLNK&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
 int64 getSize(const string &amp;amp;in path) const&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Размер файла в байтах (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не существует, указан путь к директории или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;GetFileSizeEx&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для директорий возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
 int makeDir(const string &amp;amp;in path)&lt;br /&gt;
'''Назначение:''' Создаёт новую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к создаваемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно создана.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка создания (например, недостаточно прав, путь не существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Важно:''' Не поддерживает рекурсивное создание промежуточных директорий (отмечено в TODO).&lt;br /&gt;
* На Windows создаёт директорию с правами по умолчанию.&lt;br /&gt;
* На POSIX создаёт с правами &amp;lt;code&amp;gt;S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH&amp;lt;/code&amp;gt; (755: чтение/запись/исполнение для владельца, чтение/исполнение для группы и остальных).&lt;br /&gt;
 int removeDir(const string &amp;amp;in path)&lt;br /&gt;
'''Назначение:''' Удаляет пустую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно удалена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (директория не пуста, не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Удаляет только '''пустые''' директории.&lt;br /&gt;
* Не поддерживает рекурсивное удаление с содержимым (отмечено в TODO).&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;RemoveDirectoryW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 int deleteFile(const string &amp;amp;in path)&lt;br /&gt;
'''Назначение:''' Удаляет файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемому файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно удалён.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (файл не существует, недостаточно прав, указана директория).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;DeleteFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;unlink&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для удаления директорий используйте &amp;lt;code&amp;gt;removeDir&amp;lt;/code&amp;gt;.&lt;br /&gt;
 int copyFile(const string &amp;amp;in source, const string &amp;amp;in target)&lt;br /&gt;
'''Назначение:''' Копирует файл из одного местоположения в другое.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – путь к исходному файлу.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – путь к целевому файлу (не директории).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно скопирован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка копирования (исходный файл не существует, недостаточно прав, целевой файл уже существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;CopyFileW&amp;lt;/code&amp;gt; с параметром &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; (не перезаписывать существующий файл).&lt;br /&gt;
* На POSIX-системах копирование выполняется '''вручную''' побайтово через &amp;lt;code&amp;gt;fopen/fread/fwrite&amp;lt;/code&amp;gt;, так как стандартной функции копирования нет.&lt;br /&gt;
* Целевой файл не должен существовать (флаг &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; на Windows).&lt;br /&gt;
 int move(const string &amp;amp;in source, const string &amp;amp;in target)&lt;br /&gt;
'''Назначение:''' Перемещает или переименовывает файл или директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – текущий путь к объекту.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – новый путь или имя объекта.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – объект успешно перемещён/переименован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка операции (объект не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Может использоваться как для файлов, так и для директорий.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;MoveFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Операция может выполняться в пределах одного тома/файловой системы.&lt;br /&gt;
 datetime getCreateDateTime(const string &amp;amp;in path) const&lt;br /&gt;
'''Назначение:''' Возвращает дату и время создания файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время создания.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату создания.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;createTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_ctime&amp;lt;/code&amp;gt; (change time) – может отличаться от реального времени создания на некоторых файловых системах.&lt;br /&gt;
 datetime getModifyDateTime(const string &amp;amp;in path) const&lt;br /&gt;
'''Назначение:''' Возвращает дату и время последнего изменения файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время последней модификации.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату изменения.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;modifyTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_mtime&amp;lt;/code&amp;gt; (modify time).&lt;br /&gt;
&lt;br /&gt;
==Класс datetime==&lt;br /&gt;
Класс доступен начиная с версии &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Конструкторы===&lt;br /&gt;
&lt;br /&gt;
====Конструктор по умолчанию====&lt;br /&gt;
 datetime dt();&lt;br /&gt;
Создает объект с текущей датой и временем.&lt;br /&gt;
&lt;br /&gt;
====Конструктор копирования====&lt;br /&gt;
 datetime dt(other);&lt;br /&gt;
Создает копию существующего объекта datetime.&lt;br /&gt;
&lt;br /&gt;
====Конструктор с параметрами====&lt;br /&gt;
 datetime dt(year, month, day, hour = 0, minute = 0, second = 0);&lt;br /&gt;
Создает объект с указанной датой и временем.&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
 // Только дата&lt;br /&gt;
 datetime newYear = datetime(2024, 1, 1);&lt;br /&gt;
 &lt;br /&gt;
 // Дата и время&lt;br /&gt;
 datetime meeting = datetime(2024, 12, 25, 14, 30, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Полная спецификация&lt;br /&gt;
 datetime exact = datetime(2024, 6, 15, 9, 45, 30);&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_year() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает год (4 цифры).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_month() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает месяц (1-12).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_day() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает день месяца (1-31).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_hour() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает часы (0-23).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_minute() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает минуты (0-59).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_second() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает секунды (0-59).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 12, 25, 14, 30, 45);&lt;br /&gt;
 &lt;br /&gt;
 uint year = dt.year;    // 2024&lt;br /&gt;
 uint month = dt.month;  // 12&lt;br /&gt;
 uint day = dt.day;      // 25&lt;br /&gt;
 uint hour = dt.hour;    // 14&lt;br /&gt;
 uint minute = dt.minute; // 30&lt;br /&gt;
 uint second = dt.second; // 45&lt;br /&gt;
&amp;lt;code&amp;gt;bool setDate(year, month, day)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает дату. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверной дате.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setDate(2024, 2, 29); // true (високосный год)&lt;br /&gt;
 bool invalid = dt.setDate(2023, 2, 29); // false (не високосный)&lt;br /&gt;
&amp;lt;code&amp;gt;bool setTime(hour, minute, second)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает время. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверном времени.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
cpp&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setTime(23, 59, 59); // true&lt;br /&gt;
 bool invalid = dt.setTime(25, 0, 0);   // false (часы &amp;gt; 23)&lt;br /&gt;
&lt;br /&gt;
===Арифметические операции===&lt;br /&gt;
Вычитание дат&lt;br /&gt;
 int64 difference = dt1 - dt2;&lt;br /&gt;
Возвращает разницу в секундах.&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = datetime(2024, 1, 2, 0, 0, 0);&lt;br /&gt;
 int64 diff = end - start; // 86400 секунд (1 день)&lt;br /&gt;
Сложение с секундами&lt;br /&gt;
 datetime result = dt + seconds;&lt;br /&gt;
 datetime result = seconds + dt; // обратный порядок&lt;br /&gt;
 dt += seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Добавить 2 часа&lt;br /&gt;
 datetime later = dt + 7200;&lt;br /&gt;
 dt += 7200;&lt;br /&gt;
 &lt;br /&gt;
 // Обратный порядок&lt;br /&gt;
 datetime same = 7200 + dt;&lt;br /&gt;
Вычитание секунд&lt;br /&gt;
 datetime result = dt - seconds;&lt;br /&gt;
 datetime result = seconds - dt; // обратный порядок&lt;br /&gt;
 dt -= seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Вычесть 30 минут&lt;br /&gt;
 datetime earlier = dt - 1800;&lt;br /&gt;
 dt -= 1800;&lt;br /&gt;
&lt;br /&gt;
===Операции сравнения ===&lt;br /&gt;
&amp;lt;code&amp;gt;bool opEquals(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка равенства дат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;bool opLess(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка что дата раньше.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;int opCmp(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сравнение с возвратом -1 (меньше), 0 (равно), 1 (больше).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt1 = datetime(2024, 1, 1);&lt;br /&gt;
 datetime dt2 = datetime(2024, 1, 2);&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 &amp;lt; dt2) {&lt;br /&gt;
     // dt1 раньше dt2&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 == dt2) {&lt;br /&gt;
     // даты равны&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int result = dt1.opCmp(dt2); // -1&lt;br /&gt;
&lt;br /&gt;
===Практические примеры ===&lt;br /&gt;
Пример 1: Таймер выполнения&lt;br /&gt;
 datetime startTime;&lt;br /&gt;
 &lt;br /&gt;
 // Выполняем некоторую операцию&lt;br /&gt;
 for (int i = 0; i &amp;lt; 1000000; i++) &lt;br /&gt;
 {&lt;br /&gt;
     // какая-то работа&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 datetime endTime;&lt;br /&gt;
 int64 elapsed = endTime - startTime;&lt;br /&gt;
 print(&amp;quot;Операция заняла: &amp;quot; + elapsed + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
Пример 2: Расчет дат событий&lt;br /&gt;
 // Дата начала проекта&lt;br /&gt;
 datetime projectStart = datetime(2024, 1, 15);&lt;br /&gt;
 &lt;br /&gt;
 // Напоминание за 3 дня до дедлайна&lt;br /&gt;
 datetime deadline = datetime(2024, 3, 1);&lt;br /&gt;
 datetime reminder = deadline - 3 * 86400; // 3 дня в секундах&lt;br /&gt;
 &lt;br /&gt;
 // Продление срока на 2 недели&lt;br /&gt;
 datetime extendedDeadline = deadline + 14 * 86400;&lt;br /&gt;
Пример 3: Проверка рабочего времени&lt;br /&gt;
 datetime currentTime;&lt;br /&gt;
 &lt;br /&gt;
 // Создаем время начала и конца рабочего дня&lt;br /&gt;
 datetime workStart = datetime(currentTime.year, currentTime.month, &lt;br /&gt;
                              currentTime.day, 9, 0, 0);&lt;br /&gt;
 datetime workEnd = workStart + 8 * 3600; // 8 часов&lt;br /&gt;
 &lt;br /&gt;
 if (currentTime &amp;gt;= workStart &amp;amp;&amp;amp; currentTime &amp;lt;= workEnd) &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Рабочее время&amp;quot;);&lt;br /&gt;
 } &lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Вне рабочего времени&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
Пример 4: Валидация даты&lt;br /&gt;
 bool createAppointment(uint year, uint month, uint day, uint hour) &lt;br /&gt;
 {&lt;br /&gt;
     datetime appointment;&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность даты&lt;br /&gt;
     if (!appointment.setDate(year, month, day)) {&lt;br /&gt;
         print(&amp;quot;Неверная дата!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность времени&lt;br /&gt;
     if (!appointment.setTime(hour, 0, 0)) {&lt;br /&gt;
         print(&amp;quot;Неверное время!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем что дата не в прошлом&lt;br /&gt;
     datetime now;&lt;br /&gt;
     if (appointment &amp;lt; now) {&lt;br /&gt;
         print(&amp;quot;Дата не может быть в прошлом!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     print(&amp;quot;Встреча создана: &amp;quot; + appointment.year + &amp;quot;-&amp;quot; + appointment.month + &amp;quot;-&amp;quot; + appointment.day);&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;br /&gt;
Пример 5: Разбивка интервала времени&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = start + 365 * 86400; // +1 год&lt;br /&gt;
 &lt;br /&gt;
 int64 totalSeconds = end - start;&lt;br /&gt;
 int64 days = totalSeconds / 86400;&lt;br /&gt;
 int64 hours = (totalSeconds % 86400) / 3600;&lt;br /&gt;
 int64 minutes = (totalSeconds % 3600) / 60;&lt;br /&gt;
 int64 seconds = totalSeconds % 60;&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Интервал: &amp;quot; + days + &amp;quot; дней, &amp;quot; + hours + &amp;quot; часов, &amp;quot; + minutes + &amp;quot; минут, &amp;quot; + seconds + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
===Пример использования скрипта для решения задачи===&lt;br /&gt;
Приведенный ниже пример демонстрирует один из вариантов решения реальной практической задачи. Для реализации необходимого алгоритма работы задействованы узлы, взаимодействующие с входами / выходами контроллера или хранящие значения, и скрипт С++.&lt;br /&gt;
&lt;br /&gt;
На вход скрипта подаются значения некоего сигнала (Signal) и уставки (Constant). В том случае, если сигнал больше уставки, замыкается релейный выход (out0). Соотношение между сигналом и уставкой переводится в проценты и записывается в переменную Percent. Если это соотношение становится меньше определенного значения, то соответствующее сообщение записывается в переменную Alert.&lt;br /&gt;
&lt;br /&gt;
Текст скрипта:&lt;br /&gt;
 &amp;lt;br /&amp;gt;bool main (float signal_val, float constant_val)  // функция получает значения сигнала и уставки&lt;br /&gt;
 {&lt;br /&gt;
   float ratio;             // переменная, в которой будет храниться соотношение сигнала и уставки&lt;br /&gt;
   ratio = signal_val / constant_val; // вычисление соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  percent_write(ratio);             // вызов функции записи в узлы, с передачей в нее соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  if ( signal_val &amp;gt; constant_val)&lt;br /&gt;
   {&lt;br /&gt;
      return true;                   // если сигнал больше уставки, на выход скрипта приходит true&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      return false;               // если сигнал не больше уставки, на выход скрипта приходит false&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;br /&amp;gt;void percent_write (double ratio) // функция записи в узлы&lt;br /&gt;
 {&lt;br /&gt;
   string message = &amp;quot;Значение в пределах нормы&amp;quot;; // текстовое сообщение по умолчанию&lt;br /&gt;
   double percent = ratio * 100;                 // вычисляется процентное соотношение&lt;br /&gt;
 &lt;br /&gt;
   if ( percent &amp;lt; 50 )&lt;br /&gt;
   {&lt;br /&gt;
     message = &amp;quot;Значение ниже нормы!&amp;quot;;           // если процентное соотношение меньше 50&lt;br /&gt;
                                                 // то текст сообщения меняется                                         &lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // запись текстового сообщения в нужный узел&lt;br /&gt;
   SetNodeValueAsString(&amp;quot;/Конфигурация/Станция/Сигналы/Alert&amp;quot;, message);&lt;br /&gt;
 &lt;br /&gt;
   // запись процентного соотношения в нужный узел                                            &lt;br /&gt;
   SetNodeValueAsFloat(&amp;quot;/Конфигурация/Станция/Сигналы/Percent&amp;quot;, percent);                                              &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3492</id>
		<title>Описание языка С++ в AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_%D0%A1%2B%2B_%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3492"/>
		<updated>2026-04-24T12:19:47Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Поля */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данное описание содержит базовое руководство по созданию программ на языке С++ и их использовании в [[Универсальная среда разработки|среде разработки Agava]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительные документы ==&lt;br /&gt;
&lt;br /&gt;
* [[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
* [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Основы синтаксиса ==&lt;br /&gt;
Все программы на языке С++ состоят из отдельных действий. Каждое действие заканчивается точкой с запятой:&lt;br /&gt;
 int x;&lt;br /&gt;
 x = 1;&lt;br /&gt;
 int y = x + 2;&lt;br /&gt;
Для повышения удобства работы с кодом можно оставлять в нем комментарии, которые не используются при работе программы и предназначены для улучшения читаемости кода. Перед комментариями ставится «//»:&lt;br /&gt;
 bool x = true;&lt;br /&gt;
 // bool x = false;&lt;br /&gt;
 // вторая строка не будет выполняться в программе&lt;br /&gt;
&lt;br /&gt;
== Переменные ==&lt;br /&gt;
Переменные – объекты, хранящиеся в памяти, над которыми и производятся действия в программе. &lt;br /&gt;
&lt;br /&gt;
Для начала работы с переменной необходимо инициализировать ее, указав тип и имя, а затем, при необходимости, присвоить ей значение:&lt;br /&gt;
 bool a = true;&lt;br /&gt;
 int b = 1;&lt;br /&gt;
 double c = 1.1;&lt;br /&gt;
 string d = “строка”;&lt;br /&gt;
 &lt;br /&gt;
 int f; // переменная инициализирована, значение не присвоено&lt;br /&gt;
 f = 1; // присвоение значения&lt;br /&gt;
Ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, для автоматического присвоения типа переменной исходя из инициализируемого значения.&lt;br /&gt;
 auto a = true;&lt;br /&gt;
 auto b = 1;&lt;br /&gt;
&lt;br /&gt;
=== Строки ===&lt;br /&gt;
Строка – массив байтов или 16-битных слов. Обычно строки используются для хранения текста, но также могут хранить любые двоичные данные. Текст, хранящийся в строке, заключается в двойные кавычки.&lt;br /&gt;
&lt;br /&gt;
При работе со строками доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|uint length()&lt;br /&gt;
|Возвращает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|void resize(uint)&lt;br /&gt;
|Устанавливает  длину строки&lt;br /&gt;
|-&lt;br /&gt;
|bool isEmpty()&lt;br /&gt;
|Возвращает  истину, если строка пуста, т. е. длина равна нулю&lt;br /&gt;
|-&lt;br /&gt;
|string substr(uint start = 0, int count =  -1)&lt;br /&gt;
|Возвращает  строку с содержимым, начинающимся с start, и количеством байтов, заданным параметром count. Аргументы по умолчанию  вернут всю строку как новую строку&lt;br /&gt;
|-&lt;br /&gt;
|void insert(uint pos, const string  &amp;amp;in other)&lt;br /&gt;
|Вставляет  другую строку string  на позиции pos в исходной строке&lt;br /&gt;
|-&lt;br /&gt;
|void erase(uint pos, int count = -1)&lt;br /&gt;
|Удаляет  количество символов count  из строки, начиная с позиции pos &lt;br /&gt;
|-&lt;br /&gt;
|int findFirst(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение значения str  в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findFirstOf(const string &amp;amp;in str, uint start = 0)&lt;br /&gt;
|Находит первое вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|int findLast(const string &amp;amp;in str,  int start = -1)&lt;br /&gt;
|Находит последнее вхождение значения str  в строке&lt;br /&gt;
|-&lt;br /&gt;
|int findLastOf(const string &amp;amp;in str, int start = -1)&lt;br /&gt;
|Находит последнее вхождение одного из символов в str в строке, начиная с символа под номером start. Если вхождения не найдено, будет возвращено  отрицательное значение&lt;br /&gt;
|-&lt;br /&gt;
|string formatInt(int64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование int в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatUInt(uint64 val, const string &amp;amp;in options = &amp;quot;&amp;quot;, uint width=0)&lt;br /&gt;
|Преобразование uint в строку&lt;br /&gt;
|-&lt;br /&gt;
|string formatFloat(double val, const string &amp;amp;in options=&amp;quot;&amp;quot;, uint width=0, uint precision=0)&lt;br /&gt;
|Преобразование float и double в строку&lt;br /&gt;
|-&lt;br /&gt;
|int64 parseInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в int64&lt;br /&gt;
|-&lt;br /&gt;
|uint64 parseUInt(const string &amp;amp;in str, uint base=10, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в uint64&lt;br /&gt;
|-&lt;br /&gt;
|double parseFloat(const string &amp;amp;in str, uint &amp;amp;out byteCount=0)&lt;br /&gt;
|Преобразование строки в double&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для строк:&lt;br /&gt;
 string str = “ABCDEF”;          // инициализирована строка str&lt;br /&gt;
 &lt;br /&gt;
 int a = str.length();           // a равно 6&lt;br /&gt;
 int b = str.findFirst(“CD”, 0); // b равно 2&lt;br /&gt;
 &lt;br /&gt;
 str.erase(1, 3);  // str равно “AEF”&lt;br /&gt;
&lt;br /&gt;
 string str = &amp;quot;НАСОС1&amp;quot;;&lt;br /&gt;
 string substrToRemove = &amp;quot;НАСОС&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 int pos = str.findFirst(substrToRemove);&lt;br /&gt;
 &lt;br /&gt;
 if (pos &amp;gt;= 0)&lt;br /&gt;
 {&lt;br /&gt;
     str.erase(pos, substrToRemove.length());   // Теперь str содержит &amp;quot;1&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Массивы ===&lt;br /&gt;
Массив — многоэлементный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора. Используется в том случае, если вам необходимо сгруппировать несколько элементов одного типа:&lt;br /&gt;
 array &amp;lt;int&amp;gt; a = {2, 5, 10, 15, 20};  // инициализирован массив a с пятью элементами&lt;br /&gt;
 int x = a [0];       // x становится равен элементу массива а под номером 0 (2)&lt;br /&gt;
 int y = a [4];       // y становится равен элементу массива а под номером 4 (20)&lt;br /&gt;
 arr [3] = 11;        // элемент массива а под номером 3 становится равен 11&lt;br /&gt;
 int z = arr [3];      // z становится равен элементу массива а под номером 3 (11)&lt;br /&gt;
Важно помнить, что нумерация членов массива начинается с 0.&lt;br /&gt;
&lt;br /&gt;
При работе с массивами доступны следующие функции:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
|-&lt;br /&gt;
|length()&lt;br /&gt;
|Возвращает  длину массива&lt;br /&gt;
|-&lt;br /&gt;
|resize(uint)&lt;br /&gt;
|Устанавливает  новую длину массива&lt;br /&gt;
|-&lt;br /&gt;
|reverse()&lt;br /&gt;
|Меняет  порядок элементов в массиве на обратный&lt;br /&gt;
|-&lt;br /&gt;
|insertAt(uint index, const T&amp;amp;  in value)&lt;br /&gt;
|Вставляет  новый элемент в массив по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|insertLast(const T&amp;amp; in)&lt;br /&gt;
|Добавляет  элемент в конец массива&lt;br /&gt;
|-&lt;br /&gt;
|removeAt(uint index)&lt;br /&gt;
|Удаляет  элемент по указанному индексу&lt;br /&gt;
|-&lt;br /&gt;
|removeLast()&lt;br /&gt;
|Удаляет последний элемент массива&lt;br /&gt;
|-&lt;br /&gt;
|removeRange(uint start, uint  count)&lt;br /&gt;
|Удаляет  количество элементов count,  начиная с элемента номер start&lt;br /&gt;
|-&lt;br /&gt;
|sortAsc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке возрастания&lt;br /&gt;
|-&lt;br /&gt;
|sortDesc ()&lt;br /&gt;
|Сортирует  элементы в массиве в порядке убывания&lt;br /&gt;
|-&lt;br /&gt;
|find (const T &amp;amp;in)&lt;br /&gt;
|Возвращает индекс первого элемента, который имеет то же  значение, что и желаемое. Если совпадений не найдено, возвращает  отрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
Пример работы с функциями для массивов:&lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
   array&amp;lt;int&amp;gt; arr = {1,2,3}; // 1,2,3&lt;br /&gt;
   arr.insertLast(0);        // 1,2,3,0&lt;br /&gt;
   arr.insertAt(2,4);        // 1,2,4,3,0&lt;br /&gt;
   arr.removeAt(1);          // 1,4,3,0&lt;br /&gt;
   arr.sortAsc();            // 0,1,3,4&lt;br /&gt;
   int sum = 0;&lt;br /&gt;
 &lt;br /&gt;
   for( uint n = 0; n &amp;lt; arr.length(); n++ )&lt;br /&gt;
     sum += arr[n];&lt;br /&gt;
 &lt;br /&gt;
   return sum;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Перечисления ===&lt;br /&gt;
Перечисление — это тип данных, где любое значение определяется как символьная константа. Оно позволяет представить семейства целочисленных констант (например, коды ошибок) в текстовом виде вместо числового. Использование перечислений помогает улучшить читаемость кода, поскольку не нужно искать в руководстве, что означает числовое значение.&lt;br /&gt;
&lt;br /&gt;
Значения перечислений объявляются путем их объявления в операторе перечисления. Если для константы перечисления не указано конкретное значение, она будет принимать значение предыдущей константы плюс 1. Первая константа получит значение 0, если не указано иное.&lt;br /&gt;
 enum Errors&lt;br /&gt;
 {&lt;br /&gt;
     NoError,         // = 0&lt;br /&gt;
     ReadError = 2,    // = 2&lt;br /&gt;
     WriteError,       // = 3&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // теперь к константам перечисления можно обращаться через текстовое значение, например&lt;br /&gt;
 // int a = NoError;&lt;br /&gt;
&lt;br /&gt;
=== Типы переменных ===&lt;br /&gt;
Доступны логические, целочисленные, строковые переменные и переменные с плавающей запятой.&lt;br /&gt;
&lt;br /&gt;
Логические переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|bool&lt;br /&gt;
|false (0)&lt;br /&gt;
|true (1)&lt;br /&gt;
|}&lt;br /&gt;
Целочисленные переменные&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Мин. значение&lt;br /&gt;
!Макс. значение&lt;br /&gt;
|-&lt;br /&gt;
|int8&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|127&lt;br /&gt;
|-&lt;br /&gt;
|int16&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 32 768&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|32 767&lt;br /&gt;
|-&lt;br /&gt;
|int&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;- 2 147 483 648&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|2 147 483 647&lt;br /&gt;
|-&lt;br /&gt;
|int64&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-  9 223 372 036 854 775 808&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|9 223 372 036 854 775  807&lt;br /&gt;
|-&lt;br /&gt;
|uint8&lt;br /&gt;
|0&lt;br /&gt;
|255&lt;br /&gt;
|-&lt;br /&gt;
|uint16&lt;br /&gt;
|0&lt;br /&gt;
|65 535&lt;br /&gt;
|-&lt;br /&gt;
|uint&lt;br /&gt;
|0&lt;br /&gt;
|4 294 967 295&lt;br /&gt;
|-&lt;br /&gt;
|uint64&lt;br /&gt;
|0&lt;br /&gt;
|18 446 744 073 709 551  615&lt;br /&gt;
|}&lt;br /&gt;
Переменные с плавающей запятой&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Тип&lt;br /&gt;
!Диапазон значений&lt;br /&gt;
!Наименьшее значение&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|± 3.402823466 e+38&lt;br /&gt;
|1.175494351 e-38&lt;br /&gt;
|-&lt;br /&gt;
|double&lt;br /&gt;
|± 1.79769313486231 e+308&lt;br /&gt;
|2.22507385850720 e-308&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Операторы ==&lt;br /&gt;
Доступны операторы сравнения, логические, побитовые, арифметические, приращений и индексации.&lt;br /&gt;
&lt;br /&gt;
=== Операторы сравнения ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Равно&lt;br /&gt;
|==&lt;br /&gt;
|x == y&lt;br /&gt;
|true, если x равно y&lt;br /&gt;
|-&lt;br /&gt;
|Не  равно&lt;br /&gt;
|!=&lt;br /&gt;
|x != y&lt;br /&gt;
|true, если x не равно y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше&lt;br /&gt;
|&amp;lt; &lt;br /&gt;
|x &amp;lt; y&lt;br /&gt;
|true, если x меньше y&lt;br /&gt;
|-&lt;br /&gt;
|Больше&lt;br /&gt;
|&amp;gt; &lt;br /&gt;
|x &amp;gt; y&lt;br /&gt;
|true, если x больше  y&lt;br /&gt;
|-&lt;br /&gt;
|Меньше  или равно&lt;br /&gt;
|&amp;lt;=&lt;br /&gt;
|x &amp;lt;= y&lt;br /&gt;
|true, если x меньше  или равно y&lt;br /&gt;
|-&lt;br /&gt;
|Больше  или равно&lt;br /&gt;
|&amp;gt;=&lt;br /&gt;
|x &amp;gt;= y&lt;br /&gt;
|true, если x больше  или равно y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  НЕ&lt;br /&gt;
|!&lt;br /&gt;
|!x&lt;br /&gt;
|true, если x – false и false, если x – true&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  И&lt;br /&gt;
|&amp;amp;&amp;amp;&lt;br /&gt;
|x &amp;amp;&amp;amp; y&lt;br /&gt;
|true, если x и  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x || y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|true, если x или  y – true, в противном случае – false&lt;br /&gt;
|-&lt;br /&gt;
|Логическое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|true, если x или  y – true (но не одновременно), в противном  случае – false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Побитовые операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  И&lt;br /&gt;
|&amp;amp;&lt;br /&gt;
|x &amp;amp; y&lt;br /&gt;
|Каждый  бит в x И каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИЛИ&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;x | y&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Каждый  бит в x ИЛИ каждый соответствующий ему бит в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовое  ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR)&lt;br /&gt;
|^&lt;br /&gt;
|x ^ y&lt;br /&gt;
|Каждый  бит в x XOR с каждым соответствующим ему битом в y&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг влево&lt;br /&gt;
|&amp;lt;&amp;lt; &lt;br /&gt;
|x &amp;lt;&amp;lt; y&lt;br /&gt;
|Все  биты в x смещаются влево на y бит&lt;br /&gt;
|-&lt;br /&gt;
|Побитовый  сдвиг вправо&lt;br /&gt;
|&amp;gt;&amp;gt; &lt;br /&gt;
|x &amp;gt;&amp;gt; y&lt;br /&gt;
|Все  биты в x смещаются вправо на y бит&lt;br /&gt;
|}&lt;br /&gt;
'''Пример'''&lt;br /&gt;
 float RegistersToFloat(uint16 r0, uint16 r1)&lt;br /&gt;
 {&lt;br /&gt;
     // Создаем массив байтов в little-endian порядке&lt;br /&gt;
     array&amp;lt;uint8&amp;gt; bytes(4);&lt;br /&gt;
    &lt;br /&gt;
     // Little-endian (наиболее распространенный)&lt;br /&gt;
     bytes[0] = r0 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[1] = (r0 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
     bytes[2] = r1 &amp;amp; 0xFF;&lt;br /&gt;
     bytes[3] = (r1 &amp;gt;&amp;gt; 8) &amp;amp; 0xFF;&lt;br /&gt;
 &lt;br /&gt;
      // Преобразуем байты в uint32, затем в float&lt;br /&gt;
     uint32 resultBits = 0;   &lt;br /&gt;
 &lt;br /&gt;
     for (uint i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
     {&lt;br /&gt;
         resultBits |= uint32(bytes[i]) &amp;lt;&amp;lt; (i * 8);&lt;br /&gt;
     }   &lt;br /&gt;
 &lt;br /&gt;
     return fpFromIEEE(resultBits);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Арифметические операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Сложение&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x + y&lt;br /&gt;
|Складываем  x и y&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x – y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение&lt;br /&gt;
|*&lt;br /&gt;
|x * y&lt;br /&gt;
|Умножаем x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление&lt;br /&gt;
|/&lt;br /&gt;
|x / y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|-&lt;br /&gt;
|Присваивание&lt;br /&gt;
|=&lt;br /&gt;
|x = y&lt;br /&gt;
|Присваиваем  значение y переменной  x&lt;br /&gt;
|-&lt;br /&gt;
|Сложение  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;+=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x += y&lt;br /&gt;
|Добавляем y к x&lt;br /&gt;
|-&lt;br /&gt;
|Вычитание  с присваиванием&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;-=&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|x -= y&lt;br /&gt;
|Вычитаем y из x&lt;br /&gt;
|-&lt;br /&gt;
|Умножение  с присваиванием&lt;br /&gt;
|*=&lt;br /&gt;
|x  *= y&lt;br /&gt;
|Умножаем  x на y&lt;br /&gt;
|-&lt;br /&gt;
|Деление  с присваиванием&lt;br /&gt;
|/=&lt;br /&gt;
|x /= y&lt;br /&gt;
|Делим x на y&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Операторы приращений ===&lt;br /&gt;
Операция инкремента увеличивает значение на 1, декремента – уменьшает на 1.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Преинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Инкремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Предекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--х&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Декремент  х, затем вычисление х&lt;br /&gt;
|-&lt;br /&gt;
|Постинкремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;++&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х++&lt;br /&gt;
|Вычисление  х, затем инкремент х&lt;br /&gt;
|-&lt;br /&gt;
|Постдекремент&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|х--&lt;br /&gt;
|Вычисление  х, затем декремент х&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Оператор индексации ===&lt;br /&gt;
Используется для доступа к элементу.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Оператор&lt;br /&gt;
!Символ&lt;br /&gt;
!Пример&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|Индексация&lt;br /&gt;
|[ ]&lt;br /&gt;
|arr [0]&lt;br /&gt;
|Обращение  к нулевому элементу массива arr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Блоки выражений и область видимости переменных ==&lt;br /&gt;
Блоки выражений используются в условиях, циклах и функциях. При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренним / вложенным блок. Каждый блок заключается в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Внешние блоки не имеют доступа к переменным внутренних блоков.&lt;br /&gt;
 {&lt;br /&gt;
     int a;&lt;br /&gt;
     float b;&lt;br /&gt;
     {&lt;br /&gt;
       float a = 1.0; // Отменить объявление внешней переменной&lt;br /&gt;
                      // но только в пределах внутреннего блока&lt;br /&gt;
       b = a;         // переменные из внешних блоков все еще доступны&lt;br /&gt;
       int c;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // a снова становится целочисленной переменной, b теперь равна 1.0, c здесь недоступна&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Условия ==&lt;br /&gt;
&lt;br /&gt;
=== Операторы if/else ===&lt;br /&gt;
Позволяют выбрать выполнение нужных действий, в зависимости от выбранного условия, указанного в скобках:&lt;br /&gt;
 if (x == 1)&lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х равно 1&lt;br /&gt;
 }&lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
   // эти действия выполнятся, если х не равно 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Условное выражение (тернарный оператор) ===&lt;br /&gt;
Более короткая запись оператора выбора if/else:&lt;br /&gt;
 x = 1 ? y = true : y = false;        // если х равно 1, тогда y равен true, иначе y равен false&lt;br /&gt;
&lt;br /&gt;
=== Оператор switch ===&lt;br /&gt;
Является альтернативой if/else для тех случаев, когда необходимо сделать множественный выбор:&lt;br /&gt;
 switch(x)&lt;br /&gt;
 {&lt;br /&gt;
   case 0:&lt;br /&gt;
     // эти действия выполнятся, если х равно 0&lt;br /&gt;
     break;  // каждый case всегда должен заканчивать оператором break&lt;br /&gt;
   case 1:&lt;br /&gt;
     // эти действия выполнятся, если х равно 1&lt;br /&gt;
     break;&lt;br /&gt;
   case 2:&lt;br /&gt;
     // эти действия выполнятся, если х равно 2&lt;br /&gt;
     break;&lt;br /&gt;
   default:&lt;br /&gt;
     // Эти действия выполнятся, если x не равен ни одному из предыдущих значений case&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
== Циклы ==&lt;br /&gt;
&lt;br /&gt;
=== Цикл while ===&lt;br /&gt;
Цикл выполняется, пока условие в скобках истинно:&lt;br /&gt;
 x = 0;&lt;br /&gt;
 &lt;br /&gt;
 while (x &amp;lt; 5)&lt;br /&gt;
 {&lt;br /&gt;
     // это действие будет выполняться, пока х меньше 5&lt;br /&gt;
     x++;  // при каждом выполнении цикла увеличиваем х на 1&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Цикл do while ===&lt;br /&gt;
Цикл похож на while, но, в отличии от него, цикл в любом случае выполнится хотя бы один раз (или больше, если при последующих проверках условие будет истинно):&lt;br /&gt;
 x = 10;&lt;br /&gt;
 &lt;br /&gt;
 do&lt;br /&gt;
 {&lt;br /&gt;
    // это действие выполнится один раз, так как условие изначально ложно&lt;br /&gt;
 }&lt;br /&gt;
 while (x &amp;lt; 5);&lt;br /&gt;
&lt;br /&gt;
=== Цикл for ===&lt;br /&gt;
Цикл for обычно используется как счетчик и хорошо подходит, когда известно необходимое количество итераций. В скобках через точку с запятой указывается переменная, условие, инкремент / декремент для переменной:&lt;br /&gt;
 for ( int x = 0; x &amp;lt; 5; x ++ )&lt;br /&gt;
 {&lt;br /&gt;
     // при каждом выполнении этих действий переменная х будет увеличивать на 1&lt;br /&gt;
     // действия будут выполняться пока х меньше 5&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Функции ==&lt;br /&gt;
Функция — это последовательность действия для выполнения определенного задания. Объявление функции похоже на объявление переменной: необходимо указать тип возвращаемого значения (либо void, если функция ничего не возвращает) и название функции. После этого ставятся двойные скобки, в которых находятся аргументы функции (либо пустые скобки, если аргументы отсутствуют). Действия, выполняемые функцией, заключаются в фигурные скобки.&lt;br /&gt;
&lt;br /&gt;
Любой код в операции «Скрипт С++» должен находиться в функции. При использовании нескольких функций в скрипте будет выполняться только первая, остальные должны быть вызваны из нее:&lt;br /&gt;
 void main ()&lt;br /&gt;
 {&lt;br /&gt;
   int x = 1;&lt;br /&gt;
   function ();  // вызов функции, программа переходит в void function()&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, x);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void function ()&lt;br /&gt;
 {&lt;br /&gt;
   SetNodeValueAsInt(“/Конфигурация/Станция/Сигналы/Constant2”, 5);&lt;br /&gt;
   // теперь программа возвращается обратно в void main()&lt;br /&gt;
 }&lt;br /&gt;
После выполнения данного скрипта значение сигнала Constant1 станет равно 5, а Constant2 равно 1.&lt;br /&gt;
&lt;br /&gt;
Если переменная была объявлена в функции, то она не будет доступна за ее пределами.&lt;br /&gt;
&lt;br /&gt;
=== Функции с параметрами ===&lt;br /&gt;
Параметр функции — это переменная, которая используется в функции, и значение которой предоставляет вызывающий функцию объект.&lt;br /&gt;
&lt;br /&gt;
Параметры указываются при объявлении функции в круглых скобках:&lt;br /&gt;
 void summ (int x, int y)  // в функцию передаются параметры х = 1 и y = 2&lt;br /&gt;
 {&lt;br /&gt;
   int z = x + y;  // z равно 3&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Возврат значения ===&lt;br /&gt;
Для передачи значения из скрипта можно указать необходимое значение в действии return, указав тип функции такой же, как у возвращаемого значения:&lt;br /&gt;
 bool R_Output (bool x, bool y)&lt;br /&gt;
 {&lt;br /&gt;
   bool z = false;&lt;br /&gt;
   z = x &amp;amp;&amp;amp; y;&lt;br /&gt;
 &lt;br /&gt;
   return z; // z передается на выход скрипта&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Математические и тригонометрические функции ==&lt;br /&gt;
&lt;br /&gt;
===Преобразование IEEE битов===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fpFromIEEE(uint bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 32-битное IEEE-754 представление в число float&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint fpToIEEE(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число float в 32-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - исходное число&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;double fpFromIEEE(uint64 bits)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует 64-битное IEEE-754 представление в число double&lt;br /&gt;
|&amp;lt;code&amp;gt;bits&amp;lt;/code&amp;gt; (uint64) - битовое представление&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;uint64 fpToIEEE(double value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преобразует число double в 64-битное IEEE-754 представление&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (double) - исходное число&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Сравнение с допуском===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(float a, float b, float epsilon = 0.00001f)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа float с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (float) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (float) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (float, опционально) - погрешность (по умолчанию 0.00001)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool closeTo(double a, double b, double epsilon = 0.0000000001)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнивает два числа double с заданной погрешностью&lt;br /&gt;
|&amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; (double) - первое число&lt;br /&gt;
&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; (double) - второе число&lt;br /&gt;
&amp;lt;code&amp;gt;epsilon&amp;lt;/code&amp;gt; (double, опционально) - погрешность (по умолчанию 1e-10)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тригонометрические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cos(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет косинус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sin(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет синус угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tan(float angle)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет тангенс угла&lt;br /&gt;
|&amp;lt;code&amp;gt;angle&amp;lt;/code&amp;gt; (float) - угол в радианах&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float acos(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арккосинус (обратный косинус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float asin(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арксинус (обратный синус)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение в диапазоне [-1, 1]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan(float value)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс (обратный тангенс)&lt;br /&gt;
|&amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float atan2(float y, float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет арктангенс двух переменных&lt;br /&gt;
|&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; (float) - координата Y&lt;br /&gt;
&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - координата X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Гиперболические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float cosh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический косинус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sinh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический синус&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float tanh(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет гиперболический тангенс&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Экспоненциальные и логарифмические функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет натуральный логарифм (по основанию e)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float log10(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет десятичный логарифм (по основанию 10)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение &amp;gt; 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Степенные функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float pow(float base, float exponent)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Возводит число в степень&lt;br /&gt;
|&amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; (float) - основание&lt;br /&gt;
&amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; (float) - показатель степени&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float sqrt(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет квадратный корень&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - неотрицательное значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Функции округления и остатка ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Функция&lt;br /&gt;
!Действие&lt;br /&gt;
!Аргументы&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float ceil(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вверх до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float abs(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Вычисляет абсолютное значение (модуль)&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float floor(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Округляет вниз до ближайшего целого&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float fraction(float x)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Выделяет дробную часть числа&lt;br /&gt;
|&amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (float) - значение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Специализированные функции==&lt;br /&gt;
Специализированные функции среды разработки, доступные для использования в скриптах, приведены в таблицах ниже.&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с узлами===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|float GetNodeValueAsFloat(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsFloat(string strNodePath, float fValue)&lt;br /&gt;
|Установить значение узла  в float по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|int GetNodeValueAsInt(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void  SetNodeValueAsInt(string strNodePath, int iValue)&lt;br /&gt;
|Установить значение узла  в int по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|string  GetNodeValueAsString(string strNodePath)&lt;br /&gt;
|Получить значение узла в  виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
| void SetNodeValueAsString(string  strNodePath, string strValue)&lt;br /&gt;
|Установить значение узла  в виде string по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool GetNodeValueAsBool(string  strNodePath)&lt;br /&gt;
|Получить значение узла в  виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|void SetNodeValueAsBool(string  strNodePath, bool bValue)&lt;br /&gt;
|Установить значение узла  в виде bool по заданному пути&lt;br /&gt;
|-&lt;br /&gt;
|bool  NodeValueIsError(string strNodePath)&lt;br /&gt;
|Проверка значения узла на  ошибку&lt;br /&gt;
|-&lt;br /&gt;
|void StartNode(string  strNodePath)&lt;br /&gt;
|Запуск узла по заданному  пути&lt;br /&gt;
|-&lt;br /&gt;
|void StopNode(string  strNodePath)&lt;br /&gt;
|Остановка узла по  заданному пути&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с окнами ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;void CloseWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Закрыть окно по заданному пути на дисплее с номером iDisplay&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void ShowWindow(string  strNodePath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Отобразить окно по  заданному пути на дисплее с номером iDisplay. &lt;br /&gt;
Координаты - абсолютные, установленные в свойствах окна.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int LoadComposition(string strWindowPath, string strCompositionPath, int iDisplay)&amp;lt;/code&amp;gt;&lt;br /&gt;
|Загрузить композицию strCompositionPath в окно strWindowPath на дисплее с номером iDisplay.&lt;br /&gt;
&amp;lt;code&amp;gt;AS 1.6.25+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с временем===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Определение функции&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|int GetCurrentTime()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года)&lt;br /&gt;
|-&lt;br /&gt;
|uint64 GetCurrentTimeMs()&lt;br /&gt;
|Получение текущего  времени в UNIX формате (количество миллисекунд с 01 января 1970  года) (&amp;lt;code&amp;gt;AS 1.2.55+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AS 1.6.1+&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|int GetLocalTime()&lt;br /&gt;
| Получение текущего  времени в UNIX формате (количество секунд с 01 января 1970  года) с учетом часового пояса&lt;br /&gt;
|-&lt;br /&gt;
|int GetHours(int  iTime)&lt;br /&gt;
| Получение текущего часа  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetMinutes(int iTime)&lt;br /&gt;
|Получение текущих минут  из времени в формате UNIX&lt;br /&gt;
|-&lt;br /&gt;
|int GetSeconds(int iTime)&lt;br /&gt;
|Получение текущих секунд  из времени в формате UNIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы с событиями===&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в группу &amp;quot;Системные&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
 '''int StoreMessage(int iMessageLevel, string strMessage, string strGroup)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Генерация информационного события (типа &amp;quot;сообщение&amp;quot;). Событие помещается в указанную при вызове группу.&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|0 - успешно, иначе код ошибки&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |'''Аргументы'''&lt;br /&gt;
|int iMessageLevel - уровень сообщения (1-наивысший): 1=FATAL, 2=ERROR, 3=WARNING, 4=NOTICE, 5=INFO, 6=TRACE, 7=DEBUG&lt;br /&gt;
|-&lt;br /&gt;
|string strMessage - текст сообщения&lt;br /&gt;
|-&lt;br /&gt;
|string strGroup - имя группы, в которую должно помещаться событие.&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
|функция доступна с версии &amp;lt;code&amp;gt;AS 1.6.20+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции для работы со строками===&lt;br /&gt;
 '''string EncodeMD5(string strText)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Кодирование строки в MD5 хэш&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|MD5 хэш параметра&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|string strText - исходная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| функция доступна с версии &amp;lt;code&amp;gt;AS 1.2.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Другие функции===&lt;br /&gt;
Проверка на nan.&lt;br /&gt;
 '''bool isnan(double)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запуск процесса в операционной системе.&lt;br /&gt;
 '''int LaunchProcess(string process)'''&lt;br /&gt;
Запуск производится в блокирующем режиме, то есть возврат из функции осуществляется по завершению процесса.&lt;br /&gt;
&lt;br /&gt;
==Класс file==&lt;br /&gt;
Класс доступен начиная с версии 1.4.5 AgavaSCADA/AgavaPLC.&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 '''int open(const string&amp;amp; filename, const string&amp;amp; mode)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Открытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции: 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |'''Аргументы'''&lt;br /&gt;
|const string&amp;amp; filename - путь до файла&lt;br /&gt;
|-&lt;br /&gt;
|const string&amp;amp; mode - режим открытия файла.&lt;br /&gt;
|}&lt;br /&gt;
 '''int close()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Закрытие файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Результат выполнения операции. 0 - успешно, -1 - ошибка.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''int getSize() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Получение размера файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Размер файла в байтах&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''bool isEndOfFile() const'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
| Получение признака конца файла&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|true - обнаружен конец файла.&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
 '''string readString(uint length)'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
|uint length - длина считываемой строки&lt;br /&gt;
|}&lt;br /&gt;
 '''string readLine()'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|'''Назначение'''&lt;br /&gt;
|Чтение строки&lt;br /&gt;
|-&lt;br /&gt;
|'''Возвращаемое значение'''&lt;br /&gt;
|Считанная строка&lt;br /&gt;
|-&lt;br /&gt;
|'''Аргументы'''&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|'''Примечания'''&lt;br /&gt;
| Считывание производится до тех пор, пока не будет обнаружен символ '\n' или конец файла&lt;br /&gt;
|}&lt;br /&gt;
 '''int64 readInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого числа со знаком.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''uint64 readUInt(uint)'''&lt;br /&gt;
'''Назначение:''' чтение целого беззнакового числа.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
 '''float readFloat()'''&lt;br /&gt;
'''Назначение:''' чтение целого вещественного числа одинарной точности.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение''': считанное значение.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Примечания''': отсутствуют.&lt;br /&gt;
&lt;br /&gt;
double readDouble()&lt;br /&gt;
&lt;br /&gt;
int writeString(const string &amp;amp;in)&lt;br /&gt;
&lt;br /&gt;
int writeInt(int64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeUInt(uint64, uint)&lt;br /&gt;
&lt;br /&gt;
int writeFloat(float)&lt;br /&gt;
&lt;br /&gt;
int writeDouble(double)&lt;br /&gt;
&lt;br /&gt;
int getPos() const&lt;br /&gt;
&lt;br /&gt;
int setPos(int)&lt;br /&gt;
&lt;br /&gt;
int movePos(int)&lt;br /&gt;
&lt;br /&gt;
===Поля===&lt;br /&gt;
bool mostSignificantByteFirst.&lt;br /&gt;
&lt;br /&gt;
== Класс filesystem ==&lt;br /&gt;
Класс предоставляет интерфейс для взаимодействия с файловой системой операционной системы. Позволяет выполнять операции с файлами и директориями, получать информацию о них, а также управлять текущей рабочей директорией.&lt;br /&gt;
&lt;br /&gt;
=== Методы ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;bool changeCurrentPath(const string &amp;amp;in path)&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Изменяет текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к новой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если путь существует и текущая директория успешно изменена.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если указанный путь не существует или не является директорией.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Если путь задан относительно, он объединяется с текущей директорией.&lt;br /&gt;
* Путь не должен содержать обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; – они автоматически заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Завершающие слеши автоматически удаляются из пути.&lt;br /&gt;
* Не поддерживает разрешение внутренних ссылок &amp;lt;code&amp;gt;/./&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;/../&amp;lt;/code&amp;gt; (отмечено в TODO).&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;string getCurrentPath() const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Возвращает текущую рабочую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Строка с абсолютным путём текущей директории, использующая разделители &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* При создании объекта &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt; текущая директория инициализируется рабочим каталогом приложения.&lt;br /&gt;
* Все обратные слеши &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; заменяются на &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; для единообразия.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; @getDirs() const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Получает список всех поддиректорий внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами поддиректорий.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Специальные записи &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; (текущая директория) и &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt; (родительская директория) исключаются из результата.&lt;br /&gt;
* Возвращает пустой массив, если директорий нет или произошла ошибка чтения.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; @getFiles() const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Получает список всех файлов внутри текущей директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:''' Отсутствуют.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Массив строк с именами файлов.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* В результат включаются только файлы, директории исключаются.&lt;br /&gt;
* Возвращает пустой массив, если файлов нет или произошла ошибка чтения.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;bool isDir(const string &amp;amp;in path) const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь директорией.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является директорией.&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не существует, не является директорией или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
* Абсолютные пути определяются наличием двоеточия &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;C:&amp;lt;/code&amp;gt;) или начального слеша &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;bool isLink(const string &amp;amp;in path) const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Проверяет, является ли указанный путь символической ссылкой (symlink).&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; – если объект существует и является символической ссылкой (на Windows – репарс-точкой).&lt;br /&gt;
* &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; – если объект не является ссылкой, не существует или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Кроссплатформенная поддержка: Windows (атрибут &amp;lt;code&amp;gt;FILE_ATTRIBUTE_REPARSE_POINT&amp;lt;/code&amp;gt;) и POSIX (флаг &amp;lt;code&amp;gt;S_IFLNK&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Относительные пути разрешаются относительно текущей директории.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;int64 getSize(const string &amp;amp;in path) const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Возвращает размер файла в байтах.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Размер файла в байтах (тип &amp;lt;code&amp;gt;int64&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – если файл не существует, указан путь к директории или произошла ошибка.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;GetFileSizeEx&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для директорий возвращает &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;int makeDir(const string &amp;amp;in path)&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Создаёт новую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к создаваемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно создана.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка создания (например, недостаточно прав, путь не существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Важно:''' Не поддерживает рекурсивное создание промежуточных директорий (отмечено в TODO).&lt;br /&gt;
* На Windows создаёт директорию с правами по умолчанию.&lt;br /&gt;
* На POSIX создаёт с правами &amp;lt;code&amp;gt;S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH&amp;lt;/code&amp;gt; (755: чтение/запись/исполнение для владельца, чтение/исполнение для группы и остальных).&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;int removeDir(const string &amp;amp;in path)&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Удаляет пустую директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемой директории (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – директория успешно удалена.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (директория не пуста, не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Удаляет только '''пустые''' директории.&lt;br /&gt;
* Не поддерживает рекурсивное удаление с содержимым (отмечено в TODO).&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;RemoveDirectoryW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rmdir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;int deleteFile(const string &amp;amp;in path)&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Удаляет файл.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к удаляемому файлу (относительный или абсолютный).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно удалён.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка удаления (файл не существует, недостаточно прав, указана директория).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;DeleteFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;unlink&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Для удаления директорий используйте &amp;lt;code&amp;gt;removeDir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;int copyFile(const string &amp;amp;in source, const string &amp;amp;in target)&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Копирует файл из одного местоположения в другое.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – путь к исходному файлу.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – путь к целевому файлу (не директории).&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – файл успешно скопирован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка копирования (исходный файл не существует, недостаточно прав, целевой файл уже существует).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* На Windows используется API-функция &amp;lt;code&amp;gt;CopyFileW&amp;lt;/code&amp;gt; с параметром &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; (не перезаписывать существующий файл).&lt;br /&gt;
* На POSIX-системах копирование выполняется '''вручную''' побайтово через &amp;lt;code&amp;gt;fopen/fread/fwrite&amp;lt;/code&amp;gt;, так как стандартной функции копирования нет.&lt;br /&gt;
* Целевой файл не должен существовать (флаг &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; на Windows).&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;int move(const string &amp;amp;in source, const string &amp;amp;in target)&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Перемещает или переименовывает файл или директорию.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;source&amp;lt;/code&amp;gt; – текущий путь к объекту.&lt;br /&gt;
* &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; – новый путь или имя объекта.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; – объект успешно перемещён/переименован.&lt;br /&gt;
* &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; – ошибка операции (объект не существует, недостаточно прав).&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* Может использоваться как для файлов, так и для директорий.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;MoveFileW&amp;lt;/code&amp;gt;, на POSIX – &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Операция может выполняться в пределах одного тома/файловой системы.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;datetime getCreateDateTime(const string &amp;amp;in path) const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Возвращает дату и время создания файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время создания.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату создания.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;createTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_ctime&amp;lt;/code&amp;gt; (change time) – может отличаться от реального времени создания на некоторых файловых системах.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;datetime getModifyDateTime(const string &amp;amp;in path) const&amp;lt;/code&amp;gt; ====&lt;br /&gt;
'''Назначение:''' Возвращает дату и время последнего изменения файла или директории.&lt;br /&gt;
&lt;br /&gt;
'''Аргументы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt; – путь к объекту файловой системы.&lt;br /&gt;
&lt;br /&gt;
'''Возвращаемое значение:'''&lt;br /&gt;
&lt;br /&gt;
* Объект &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt;, содержащий дату и время последней модификации.&lt;br /&gt;
&lt;br /&gt;
'''Примечания:'''&lt;br /&gt;
&lt;br /&gt;
* '''Выбрасывает исключение''' в скриптовом контексте через &amp;lt;code&amp;gt;SetException&amp;lt;/code&amp;gt;, если не удаётся получить дату изменения.&lt;br /&gt;
* На Windows используется &amp;lt;code&amp;gt;GetFileTime&amp;lt;/code&amp;gt; с полем &amp;lt;code&amp;gt;modifyTm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* На POSIX-системах используется поле &amp;lt;code&amp;gt;st_mtime&amp;lt;/code&amp;gt; (modify time).&lt;br /&gt;
&lt;br /&gt;
==Класс datetime==&lt;br /&gt;
Класс доступен начиная с версии 1.6+.&lt;br /&gt;
&lt;br /&gt;
===Конструкторы===&lt;br /&gt;
&lt;br /&gt;
====Конструктор по умолчанию====&lt;br /&gt;
 datetime dt();&lt;br /&gt;
Создает объект с текущей датой и временем.&lt;br /&gt;
&lt;br /&gt;
====Конструктор копирования====&lt;br /&gt;
 datetime dt(other);&lt;br /&gt;
Создает копию существующего объекта datetime.&lt;br /&gt;
&lt;br /&gt;
====Конструктор с параметрами====&lt;br /&gt;
 datetime dt(year, month, day, hour = 0, minute = 0, second = 0);&lt;br /&gt;
Создает объект с указанной датой и временем.&lt;br /&gt;
'''Примеры:'''&lt;br /&gt;
 // Только дата&lt;br /&gt;
 datetime newYear = datetime(2024, 1, 1);&lt;br /&gt;
 &lt;br /&gt;
 // Дата и время&lt;br /&gt;
 datetime meeting = datetime(2024, 12, 25, 14, 30, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Полная спецификация&lt;br /&gt;
 datetime exact = datetime(2024, 6, 15, 9, 45, 30);&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_year() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает год (4 цифры).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_month() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает месяц (1-12).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_day() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает день месяца (1-31).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_hour() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает часы (0-23).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_minute() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает минуты (0-59).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;uint get_second() const&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возвращает секунды (0-59).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 12, 25, 14, 30, 45);&lt;br /&gt;
 &lt;br /&gt;
 uint year = dt.year;    // 2024&lt;br /&gt;
 uint month = dt.month;  // 12&lt;br /&gt;
 uint day = dt.day;      // 25&lt;br /&gt;
 uint hour = dt.hour;    // 14&lt;br /&gt;
 uint minute = dt.minute; // 30&lt;br /&gt;
 uint second = dt.second; // 45&lt;br /&gt;
&amp;lt;code&amp;gt;bool setDate(year, month, day)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает дату. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверной дате.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setDate(2024, 2, 29); // true (високосный год)&lt;br /&gt;
 bool invalid = dt.setDate(2023, 2, 29); // false (не високосный)&lt;br /&gt;
&amp;lt;code&amp;gt;bool setTime(hour, minute, second)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Устанавливает время. Возвращает &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; при успехе, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; при неверном времени.&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
&lt;br /&gt;
cpp&lt;br /&gt;
 datetime dt;&lt;br /&gt;
 bool success = dt.setTime(23, 59, 59); // true&lt;br /&gt;
 bool invalid = dt.setTime(25, 0, 0);   // false (часы &amp;gt; 23)&lt;br /&gt;
&lt;br /&gt;
===Арифметические операции===&lt;br /&gt;
Вычитание дат&lt;br /&gt;
 int64 difference = dt1 - dt2;&lt;br /&gt;
Возвращает разницу в секундах.&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = datetime(2024, 1, 2, 0, 0, 0);&lt;br /&gt;
 int64 diff = end - start; // 86400 секунд (1 день)&lt;br /&gt;
Сложение с секундами&lt;br /&gt;
 datetime result = dt + seconds;&lt;br /&gt;
 datetime result = seconds + dt; // обратный порядок&lt;br /&gt;
 dt += seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Добавить 2 часа&lt;br /&gt;
 datetime later = dt + 7200;&lt;br /&gt;
 dt += 7200;&lt;br /&gt;
 &lt;br /&gt;
 // Обратный порядок&lt;br /&gt;
 datetime same = 7200 + dt;&lt;br /&gt;
Вычитание секунд&lt;br /&gt;
 datetime result = dt - seconds;&lt;br /&gt;
 datetime result = seconds - dt; // обратный порядок&lt;br /&gt;
 dt -= seconds;&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt = datetime(2024, 1, 1, 10, 0, 0);&lt;br /&gt;
 &lt;br /&gt;
 // Вычесть 30 минут&lt;br /&gt;
 datetime earlier = dt - 1800;&lt;br /&gt;
 dt -= 1800;&lt;br /&gt;
&lt;br /&gt;
===Операции сравнения ===&lt;br /&gt;
&amp;lt;code&amp;gt;bool opEquals(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка равенства дат.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;bool opLess(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверка что дата раньше.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;int opCmp(other)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сравнение с возвратом -1 (меньше), 0 (равно), 1 (больше).&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 datetime dt1 = datetime(2024, 1, 1);&lt;br /&gt;
 datetime dt2 = datetime(2024, 1, 2);&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 &amp;lt; dt2) {&lt;br /&gt;
     // dt1 раньше dt2&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 if (dt1 == dt2) {&lt;br /&gt;
     // даты равны&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int result = dt1.opCmp(dt2); // -1&lt;br /&gt;
&lt;br /&gt;
===Практические примеры ===&lt;br /&gt;
Пример 1: Таймер выполнения&lt;br /&gt;
 datetime startTime;&lt;br /&gt;
 &lt;br /&gt;
 // Выполняем некоторую операцию&lt;br /&gt;
 for (int i = 0; i &amp;lt; 1000000; i++) &lt;br /&gt;
 {&lt;br /&gt;
     // какая-то работа&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 datetime endTime;&lt;br /&gt;
 int64 elapsed = endTime - startTime;&lt;br /&gt;
 print(&amp;quot;Операция заняла: &amp;quot; + elapsed + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
Пример 2: Расчет дат событий&lt;br /&gt;
 // Дата начала проекта&lt;br /&gt;
 datetime projectStart = datetime(2024, 1, 15);&lt;br /&gt;
 &lt;br /&gt;
 // Напоминание за 3 дня до дедлайна&lt;br /&gt;
 datetime deadline = datetime(2024, 3, 1);&lt;br /&gt;
 datetime reminder = deadline - 3 * 86400; // 3 дня в секундах&lt;br /&gt;
 &lt;br /&gt;
 // Продление срока на 2 недели&lt;br /&gt;
 datetime extendedDeadline = deadline + 14 * 86400;&lt;br /&gt;
Пример 3: Проверка рабочего времени&lt;br /&gt;
 datetime currentTime;&lt;br /&gt;
 &lt;br /&gt;
 // Создаем время начала и конца рабочего дня&lt;br /&gt;
 datetime workStart = datetime(currentTime.year, currentTime.month, &lt;br /&gt;
                              currentTime.day, 9, 0, 0);&lt;br /&gt;
 datetime workEnd = workStart + 8 * 3600; // 8 часов&lt;br /&gt;
 &lt;br /&gt;
 if (currentTime &amp;gt;= workStart &amp;amp;&amp;amp; currentTime &amp;lt;= workEnd) &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Рабочее время&amp;quot;);&lt;br /&gt;
 } &lt;br /&gt;
 else &lt;br /&gt;
 {&lt;br /&gt;
     print(&amp;quot;Вне рабочего времени&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
Пример 4: Валидация даты&lt;br /&gt;
 bool createAppointment(uint year, uint month, uint day, uint hour) &lt;br /&gt;
 {&lt;br /&gt;
     datetime appointment;&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность даты&lt;br /&gt;
     if (!appointment.setDate(year, month, day)) {&lt;br /&gt;
         print(&amp;quot;Неверная дата!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем корректность времени&lt;br /&gt;
     if (!appointment.setTime(hour, 0, 0)) {&lt;br /&gt;
         print(&amp;quot;Неверное время!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     // Проверяем что дата не в прошлом&lt;br /&gt;
     datetime now;&lt;br /&gt;
     if (appointment &amp;lt; now) {&lt;br /&gt;
         print(&amp;quot;Дата не может быть в прошлом!&amp;quot;);&lt;br /&gt;
         return false;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     print(&amp;quot;Встреча создана: &amp;quot; + appointment.year + &amp;quot;-&amp;quot; + appointment.month + &amp;quot;-&amp;quot; + appointment.day);&lt;br /&gt;
     return true;&lt;br /&gt;
 }&lt;br /&gt;
Пример 5: Разбивка интервала времени&lt;br /&gt;
 datetime start = datetime(2024, 1, 1, 0, 0, 0);&lt;br /&gt;
 datetime end = start + 365 * 86400; // +1 год&lt;br /&gt;
 &lt;br /&gt;
 int64 totalSeconds = end - start;&lt;br /&gt;
 int64 days = totalSeconds / 86400;&lt;br /&gt;
 int64 hours = (totalSeconds % 86400) / 3600;&lt;br /&gt;
 int64 minutes = (totalSeconds % 3600) / 60;&lt;br /&gt;
 int64 seconds = totalSeconds % 60;&lt;br /&gt;
 &lt;br /&gt;
 print(&amp;quot;Интервал: &amp;quot; + days + &amp;quot; дней, &amp;quot; + hours + &amp;quot; часов, &amp;quot; + minutes + &amp;quot; минут, &amp;quot; + seconds + &amp;quot; секунд&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
===Пример использования скрипта для решения задачи===&lt;br /&gt;
Приведенный ниже пример демонстрирует один из вариантов решения реальной практической задачи. Для реализации необходимого алгоритма работы задействованы узлы, взаимодействующие с входами / выходами контроллера или хранящие значения, и скрипт С++.&lt;br /&gt;
&lt;br /&gt;
На вход скрипта подаются значения некоего сигнала (Signal) и уставки (Constant). В том случае, если сигнал больше уставки, замыкается релейный выход (out0). Соотношение между сигналом и уставкой переводится в проценты и записывается в переменную Percent. Если это соотношение становится меньше определенного значения, то соответствующее сообщение записывается в переменную Alert.&lt;br /&gt;
&lt;br /&gt;
Текст скрипта:&lt;br /&gt;
 &amp;lt;br /&amp;gt;bool main (float signal_val, float constant_val)  // функция получает значения сигнала и уставки&lt;br /&gt;
 {&lt;br /&gt;
   float ratio;             // переменная, в которой будет храниться соотношение сигнала и уставки&lt;br /&gt;
   ratio = signal_val / constant_val; // вычисление соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  percent_write(ratio);             // вызов функции записи в узлы, с передачей в нее соотношения&lt;br /&gt;
 &amp;lt;br /&amp;gt;  if ( signal_val &amp;gt; constant_val)&lt;br /&gt;
   {&lt;br /&gt;
      return true;                   // если сигнал больше уставки, на выход скрипта приходит true&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      return false;               // если сигнал не больше уставки, на выход скрипта приходит false&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;br /&amp;gt;void percent_write (double ratio) // функция записи в узлы&lt;br /&gt;
 {&lt;br /&gt;
   string message = &amp;quot;Значение в пределах нормы&amp;quot;; // текстовое сообщение по умолчанию&lt;br /&gt;
   double percent = ratio * 100;                 // вычисляется процентное соотношение&lt;br /&gt;
 &lt;br /&gt;
   if ( percent &amp;lt; 50 )&lt;br /&gt;
   {&lt;br /&gt;
     message = &amp;quot;Значение ниже нормы!&amp;quot;;           // если процентное соотношение меньше 50&lt;br /&gt;
                                                 // то текст сообщения меняется                                         &lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   // запись текстового сообщения в нужный узел&lt;br /&gt;
   SetNodeValueAsString(&amp;quot;/Конфигурация/Станция/Сигналы/Alert&amp;quot;, message);&lt;br /&gt;
 &lt;br /&gt;
   // запись процентного соотношения в нужный узел                                            &lt;br /&gt;
   SetNodeValueAsFloat(&amp;quot;/Конфигурация/Станция/Сигналы/Percent&amp;quot;, percent);                                              &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Приоритет операций==&lt;br /&gt;
В выражениях первым всегда вычисляется оператор с наивысшим приоритетом. Унарные операторы имеют более высокий приоритет, чем другие операторы. Постоператоры имеют более высокий приоритет, чем преоператоры.&lt;br /&gt;
&lt;br /&gt;
В этой таблице показаны доступные унарные операторы, в порядке убывания приоритета.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;&lt;br /&gt;
|Оператор разрешения  области видимости&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| Оператор индексации&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Постинкремент и  декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
|Доступ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;++ --&amp;lt;/code&amp;gt;&lt;br /&gt;
|Преинкремент и декремент&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое НЕ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Унарный положительный и  отрицательный&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;&lt;br /&gt;
|Побитовое дополнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ссылка&lt;br /&gt;
|}&lt;br /&gt;
Эта таблица показывает приоритет бинарных и тернарных операторов в порядке убывания.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Символ&lt;br /&gt;
!Операция&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;**&amp;lt;/code&amp;gt;&lt;br /&gt;
|Экспонента&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;* / %&amp;lt;/code&amp;gt;&lt;br /&gt;
|Умножить, разделить, по  модулю&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;+ -&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сложить и вычесть&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сдвиг влево, сдвиг  вправо и арифметический сдвиг вправо&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовый XOR&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Битовое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;= &amp;lt; &amp;gt;= &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Сравнение&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;== != is !is xor ^^&amp;lt;/code&amp;gt;&lt;br /&gt;
|Равенство, идентичность  и логическое исключающее ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;and &amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое И&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;or ||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|Логическое ИЛИ&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;?:&amp;lt;/code&amp;gt;&lt;br /&gt;
|Условие&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;= += -= *= /= %= **= &amp;amp;=&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|=  ^= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= &amp;gt;&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|Присваивание и составные  присваивания&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Зарезервированные ключевые слова==&lt;br /&gt;
Это ключевые слова, которые зарезервированы языком. Они не могут использоваться какими-либо идентификаторами, определенными скриптом.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|and&lt;br /&gt;
&lt;br /&gt;
abstract&lt;br /&gt;
&lt;br /&gt;
auto&lt;br /&gt;
&lt;br /&gt;
bool&lt;br /&gt;
&lt;br /&gt;
break&lt;br /&gt;
&lt;br /&gt;
case&lt;br /&gt;
&lt;br /&gt;
cast&lt;br /&gt;
&lt;br /&gt;
catch&lt;br /&gt;
&lt;br /&gt;
class&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
&lt;br /&gt;
continue&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
|double&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
enum&lt;br /&gt;
&lt;br /&gt;
explicit&lt;br /&gt;
&lt;br /&gt;
external&lt;br /&gt;
&lt;br /&gt;
false&lt;br /&gt;
&lt;br /&gt;
final&lt;br /&gt;
&lt;br /&gt;
float&lt;br /&gt;
&lt;br /&gt;
for&lt;br /&gt;
&lt;br /&gt;
from&lt;br /&gt;
&lt;br /&gt;
funcdef&lt;br /&gt;
&lt;br /&gt;
function&lt;br /&gt;
&lt;br /&gt;
get&lt;br /&gt;
|if&lt;br /&gt;
&lt;br /&gt;
import&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&lt;br /&gt;
inout&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
&lt;br /&gt;
interface&lt;br /&gt;
&lt;br /&gt;
int8&lt;br /&gt;
&lt;br /&gt;
int16&lt;br /&gt;
&lt;br /&gt;
int32&lt;br /&gt;
&lt;br /&gt;
int64&lt;br /&gt;
&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
mixin&lt;br /&gt;
&lt;br /&gt;
namespace&lt;br /&gt;
|not&lt;br /&gt;
&lt;br /&gt;
null&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
out&lt;br /&gt;
&lt;br /&gt;
override&lt;br /&gt;
&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
property&lt;br /&gt;
&lt;br /&gt;
protected&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
set&lt;br /&gt;
&lt;br /&gt;
shared&lt;br /&gt;
&lt;br /&gt;
super&lt;br /&gt;
&lt;br /&gt;
switch&lt;br /&gt;
|this&lt;br /&gt;
&lt;br /&gt;
true&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
&lt;br /&gt;
typedef&lt;br /&gt;
&lt;br /&gt;
uint&lt;br /&gt;
&lt;br /&gt;
uint8&lt;br /&gt;
&lt;br /&gt;
uint16&lt;br /&gt;
&lt;br /&gt;
uint32&lt;br /&gt;
&lt;br /&gt;
uint64&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
&lt;br /&gt;
while&lt;br /&gt;
&lt;br /&gt;
xor&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Ссылки==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%B7%D0%BB%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0_AgavaSCADA/AgavaPLC&amp;diff=3491</id>
		<title>Узлы проекта AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%B7%D0%BB%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0_AgavaSCADA/AgavaPLC&amp;diff=3491"/>
		<updated>2026-04-13T06:10:32Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Система тревог */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Узлы проекта ==&lt;br /&gt;
Узел - элементарная сущность проекта, осуществляющая хранение информации или реализующая определенный функционал. Каждый узел обладает набором [[Свойства узлов в AgavaSCADA/AgavaPLC|свойств]]. Все узлы, объединенные в иерархическую структуру, образуют проект.&lt;br /&gt;
&lt;br /&gt;
== Проект ==&lt;br /&gt;
[[Файл:AgavaPLC–Дерево проекта.png|мини|Рисунок 21 – Дерево проекта]]&lt;br /&gt;
Узел &amp;quot;Проект&amp;quot; (&amp;quot;Корневой узел&amp;quot;, &amp;quot;Корень&amp;quot;) предназначен для хранения общей информации о проекте и связывания других узлов проекта.&lt;br /&gt;
&lt;br /&gt;
== Станция ==&lt;br /&gt;
Станция – важнейший узел, управляющий работой собственных систем и выполняющий обмен данными с другими станциями. Физически станция представляет собой устройство, на котором исполняется проект (компьютер, панель оператора, МПР-60 или другое устройство).&lt;br /&gt;
&lt;br /&gt;
Для использования в проекте доступны несколько типов станций. например:&lt;br /&gt;
&lt;br /&gt;
* '''Станция''' - общий тип станции. Проекты с такой станцией могут выполняться на большинстве устройств - контроллеры, панели, персональные компьютеры. Чаще всего используется для проектов, предназначенных для выполнения на персональном компьютере.&lt;br /&gt;
* '''Панель ПО-40''' - специализированный тип для проектов на панелях оператора ПО-40. Станция такого типа по отношению к общему дополнительно предоставляет возможность управления оборудованием панели оператора (светодиоды индикации и др.), использования корзины субмодулей.&lt;br /&gt;
* '''Панель ПО-50''' - специализированный тип для проектов на панелях оператора ПО-50. Станция такого типа по отношению к общему дополнительно предоставляет возможность управления оборудованием панели оператора (светодиоды индикации и др.).&lt;br /&gt;
* '''Контроллер МПР-60''' - специализированный тип для проектов на программируемых реле МПР-60. Станция такого типа по отношению к общему дополнительно предоставляет возможность управления оборудованием устройства (светодиоды индикации и др.), использования корзины субмодулей.&lt;br /&gt;
* '''Контроллер ПЛК-70.A''' - специализированный тип для проектов, предназначенных для контроллеров АГАВА ПЛК-70.А. Станция такого типа по отношению к общему дополнительно предоставляет возможность управления оборудованием контроллера (светодиоды индикации и др.), использования корзины субмодулей.&lt;br /&gt;
&lt;br /&gt;
При построении больших проектов станций в проекте может быть несколько, и они могут выполнять разные задачи. Например, станция-сервер выполняет сбор и регистрацию данных, клиентские станции выполняют визуализацию данных на рабочих местах и т. д.&lt;br /&gt;
&lt;br /&gt;
Станции подчиняются узлы типа &amp;quot;Система&amp;quot; - Транспортная система, Система архивирования, Система визуализации и т. д.&lt;br /&gt;
&lt;br /&gt;
== Транспортная система ==&lt;br /&gt;
Транспортная система управляет передачей данных по различным каналам связи. Система управляет работой &amp;quot;Транспортов&amp;quot; - узлов, выполняющих обмен данными с устройствами по определенному протоколу.&lt;br /&gt;
&lt;br /&gt;
С одной стороны, транспортная система обращается непосредственно к сигналам и каналам устройства, а с другой стороны, представляет их в виде неких универсальных единиц – узлов-источников. Каждый источник однозначно соответствует определенному сигналу или параметру устройства.  При изменении сигнала меняется и значение источника.  При записи данных в источник производится подача команды устройству на установку определенного значения конкретного параметра.&lt;br /&gt;
&lt;br /&gt;
Транспортная система допускает использование нескольких транспортов, что дает возможность одновременного обмена данными с большим количеством устройств по разным протоколам.&lt;br /&gt;
&lt;br /&gt;
=== Транспорт ===&lt;br /&gt;
Транспорт предназначен для обмена данными с устройствами по определенному протоколу. Один транспорт, в зависимости от типа, позволяет обмениваться данными с одним или несколькими устройствами.&lt;br /&gt;
&lt;br /&gt;
Доступны для использования следующие виды транспортов:&lt;br /&gt;
&lt;br /&gt;
* Транспорт Modbus-TCP;&lt;br /&gt;
* Транспорт Modbus-RTU;&lt;br /&gt;
* Транспорт SNMP;&lt;br /&gt;
* Транспорт OPC UA;&lt;br /&gt;
* Транспорт OPC DA (только для Windows);&lt;br /&gt;
* Транспорт MQTT;&lt;br /&gt;
* Последовательный транспорт (устаревший);&lt;br /&gt;
* TCP/IP транспорт (устаревший).&lt;br /&gt;
Подробное описание транспортов приведено в отдельном документе &amp;quot;[[Транспорты AgavaSCADA/AgavaPLC]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Система визуализации==&lt;br /&gt;
{{Внимание|Тип=Восклицание желтый.png|Текст=Система визуализации недоступна в проектах для контроллеров МПР}}&lt;br /&gt;
 &lt;br /&gt;
Задачей этой системы является отображение данных в виде набора мнемонических схем (экранов, мнемосхем), а также предоставление пользователю возможности управления. &lt;br /&gt;
&lt;br /&gt;
Каждый экран позволяет в схематичном, понятном пользователю виде представить участок технологической схемы с отображением необходимых параметров технологического процесса.&lt;br /&gt;
&lt;br /&gt;
Изображение на экране строится с помощью окон, на которых размещаются объекты визуализации – виджеты. Виджетами могут быть текстовые метки, изображения, в том числе анимированные, элементы управления, графики и т. д. Виджеты можно объединять в слои для удобного управления отображением виджетов.&lt;br /&gt;
&lt;br /&gt;
Виджеты могут быть статическими и динамическими.  Динамические виджеты привязаны к одному или нескольким сигналам и их отображение зависит от значений этих сигналов. Статические виджеты не имеют привязки к сигналам и их изображение всегда постоянно.&lt;br /&gt;
&lt;br /&gt;
Для перехода по экранам, изменения значений параметров и иного управления служат специальные виджеты: кнопки управления, поля ввода и другие.&lt;br /&gt;
&lt;br /&gt;
Для повышения быстродействия и увеличения комфортности работы с системой система визуализации хранит в памяти кэш из нескольких последних открытых экранов. Когда при последовательном открытии экранов этот кэш заполняется, наиболее старые экраны удаляются из него.  Это связано с тем, что, как правило, в работе используются несколько одних и тех же экранов, которые отображают сводную информацию о техпроцессе и оператор в штатном режиме переключается только между ними. Сохраняя их в памяти, система ускоряет переключение между ними, поскольку при этом не требуется каждый раз создавать экран, все находящиеся на нем объекты и запускать процессы обновления параметров.&lt;br /&gt;
&lt;br /&gt;
Когда экран переходит в кэш, обновление параметров на нем прекращается для снижения нагрузки на центральный процессор. Если все же необходимо, чтобы экран всегда производил обновление данных (по разным причинам), даже находясь в кэше, необходимо в его настройках включить опцию «Постоянно обновляемый».&lt;br /&gt;
&lt;br /&gt;
Подчиненные типы узлов:&lt;br /&gt;
&lt;br /&gt;
*фрейм;&lt;br /&gt;
*окно;&lt;br /&gt;
*композиция.&lt;br /&gt;
&lt;br /&gt;
===Фрейм===&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры сложного фрейма, состоящего из двух форм и одного окна с многослойной композицией.png|мини|Рисунок 23 – Пример структуры сложного фрейма, состоящего из двух форм и одного окна с многослойной композицией]]&lt;br /&gt;
Фрейм – узел, предназначенный для группировки окон, отображаемых на определенном дисплее. Обеспечивает организацию окон в пространстве экрана, управление мониторами и границами отображения. &lt;br /&gt;
&lt;br /&gt;
Если необходимо отобразить информацию на нескольких дисплеях одновременно, то для каждого из них нужно использовать отдельный фрейм. Окон во фрейме может быть несколько, однако они не могут накладываться друг на друга.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Описание&lt;br /&gt;
!Допустимые значения&lt;br /&gt;
|-&lt;br /&gt;
|Позиция X&lt;br /&gt;
|XCoord&lt;br /&gt;
|int&lt;br /&gt;
|Координата X левого верхнего угла фрейма&lt;br /&gt;
|Целое число&lt;br /&gt;
|-&lt;br /&gt;
|Позиция Y&lt;br /&gt;
|YCoord&lt;br /&gt;
|int&lt;br /&gt;
|Координата Y левого верхнего угла фрейма&lt;br /&gt;
|Целое число&lt;br /&gt;
|-&lt;br /&gt;
|Ширина&lt;br /&gt;
|XSize&lt;br /&gt;
|int&lt;br /&gt;
|Ширина фрейма в пикселях&lt;br /&gt;
|Целое число &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|Высота&lt;br /&gt;
|YSize&lt;br /&gt;
|int&lt;br /&gt;
|Высота фрейма в пикселях&lt;br /&gt;
|Целое число &amp;gt; 0&lt;br /&gt;
|-&lt;br /&gt;
|Окна&lt;br /&gt;
|Windows&lt;br /&gt;
|NodesArray&lt;br /&gt;
|Список окон, принадлежащих фрейму&lt;br /&gt;
|Узлы типа: Window&lt;br /&gt;
|-&lt;br /&gt;
|Номер монитора&lt;br /&gt;
|DisplayNo&lt;br /&gt;
|int&lt;br /&gt;
|Номер монитора для отображения фрейма&lt;br /&gt;
|0 - по умолчанию&lt;br /&gt;
≥1 - конкретные мониторы&lt;br /&gt;
|-&lt;br /&gt;
|Тип границы&lt;br /&gt;
|BorderType&lt;br /&gt;
|enum&lt;br /&gt;
|Тип границы фрейма&lt;br /&gt;
|0: Не определен (ошибка)&lt;br /&gt;
1: Отсутствует&lt;br /&gt;
&lt;br /&gt;
2: Фиксированная&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Позиция и размеры (XCoord, YCoord, XSize, YSize) ====&lt;br /&gt;
&lt;br /&gt;
* '''Тип:''' int.&lt;br /&gt;
* '''Описание:''' Определяют положение и размеры фрейма на экране.&lt;br /&gt;
* '''Значения по умолчанию:''' (0, 0, 640, 480).&lt;br /&gt;
* '''Применение:''' Задание области экрана, которую занимает фрейм.&lt;br /&gt;
&lt;br /&gt;
==== Окна (Windows) ====&lt;br /&gt;
'''Тип:''' NodesArray.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Коллекция окон, которые управляются данным фреймом. Окна могут добавляться только из существующих узлов.&lt;br /&gt;
&lt;br /&gt;
'''Особенности:'''&lt;br /&gt;
&lt;br /&gt;
* Поддерживаются только узлы типа Window.&lt;br /&gt;
&lt;br /&gt;
==== Номер монитора (DisplayNo) ====&lt;br /&gt;
'''Тип:''' int.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет, на каком мониторе системы отображается фрейм. Значение 0 соответствует монитору по умолчанию.&lt;br /&gt;
&lt;br /&gt;
'''Использование:'''&lt;br /&gt;
&lt;br /&gt;
* 0 - основной монитор.&lt;br /&gt;
* 1, 2, ... - дополнительные мониторы.&lt;br /&gt;
* Свойство важно для многомониторных конфигураций.&lt;br /&gt;
&lt;br /&gt;
==== Тип границы (BorderType) ====&lt;br /&gt;
'''Тип:''' enum.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет тип обрамления фрейма. Влияет на внешний вид и поведение границ.&lt;br /&gt;
&lt;br /&gt;
'''Значения:'''&lt;br /&gt;
&lt;br /&gt;
* '''Отсутствует''' - фрейм без видимых границ.&lt;br /&gt;
* '''Фиксированная''' - стандартная граница окна.&lt;br /&gt;
* '''Не определен''' - используется только для обработки ошибок.&lt;br /&gt;
&lt;br /&gt;
==== Наследование привилегий ====&lt;br /&gt;
Фрейм автоматически добавляет доступные привилегии для работы с окнами:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;OpenWindow&amp;lt;/code&amp;gt; - привилегия на открытие окон.&lt;br /&gt;
* &amp;lt;code&amp;gt;CloseWindow&amp;lt;/code&amp;gt; - привилегия на закрытие окон.&lt;br /&gt;
&lt;br /&gt;
===Окна===&lt;br /&gt;
Окно – узел, осуществляющий отображение видеокадра (мнемонической схемы).&lt;br /&gt;
&lt;br /&gt;
Существуют несколько видов окон:&lt;br /&gt;
&lt;br /&gt;
1. «Форма», предназначенная для вывода простого набора данных без необходимости управления видимостью или внешним видом его элементов. Для вывода информации в такое окно кроме создания окна и добавления к нему виджетов ничего более не требуется.&lt;br /&gt;
[[Файл:AgavaPLC-Меню.png|мини|164x164пкс|Рисунок 24 — Внешний вид меню в среде исполнения]]&lt;br /&gt;
2. «Окно с композицией», предназначенное для вывода большого количества информации и позволяющее организовать группировку элементов по слоям, управлять внешним видом элементов, видимостью слоев и отдельных элементов, а также дающее возможность регулирования работы пользователя с элементами. Для вывода информации в такое окно нужно к окну привязать композицию, содержащую минимум один слой, в который уже добавляются виджеты.&lt;br /&gt;
&lt;br /&gt;
=== Форма ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Описание&lt;br /&gt;
!Допустимые значения&lt;br /&gt;
!Режим доступа&lt;br /&gt;
|-&lt;br /&gt;
|Модальность&lt;br /&gt;
|Modality&lt;br /&gt;
|enum&lt;br /&gt;
|Режим модальности окна&lt;br /&gt;
|0: Не определен (ошибка)&lt;br /&gt;
1: Немодальное&lt;br /&gt;
&lt;br /&gt;
2: Модальное (Фрейм)&lt;br /&gt;
&lt;br /&gt;
3: Модальное (Система)&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Тип границы&lt;br /&gt;
|BorderType&lt;br /&gt;
|enum&lt;br /&gt;
|Тип границы окна&lt;br /&gt;
|0: Не определен (ошибка)&lt;br /&gt;
1: Фиксированная&lt;br /&gt;
&lt;br /&gt;
2: Изменяемая&lt;br /&gt;
&lt;br /&gt;
3: Отсутствует&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Отображать строку заголовка&lt;br /&gt;
|TitleEnabled&lt;br /&gt;
|bool&lt;br /&gt;
|Отображать строку заголовка&lt;br /&gt;
|true/false&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Отображать кнопку &amp;quot;Закрыть&amp;quot;&lt;br /&gt;
|CloseEnabled&lt;br /&gt;
|bool&lt;br /&gt;
|Отображать кнопку &amp;quot;Закрыть&amp;quot;&lt;br /&gt;
|true/false&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Цвет фона&lt;br /&gt;
|BackgroundColor&lt;br /&gt;
|NColor&lt;br /&gt;
|Цвет фона окна&lt;br /&gt;
|Цвет в формате RGBA&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Затемнение&lt;br /&gt;
|NeedDarkenApplication&lt;br /&gt;
|bool&lt;br /&gt;
|Затемнение других окон приложения при открытии этого окна&lt;br /&gt;
|true/false&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Цвет затемнения&lt;br /&gt;
|ColorDarkenApplication&lt;br /&gt;
|NColor&lt;br /&gt;
|Цвет затемнения&lt;br /&gt;
|Цвет в формате RGBA&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Интервал обновления&lt;br /&gt;
|UpdateInterval&lt;br /&gt;
|int&lt;br /&gt;
|Интервал обновления виджетов, мс&lt;br /&gt;
|0 - без задержки&lt;br /&gt;
&amp;gt;0 - интервал в мс&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Действия OnShow&lt;br /&gt;
|ActionsOnShow&lt;br /&gt;
|NodesContainer&lt;br /&gt;
|Действия при показе окна&lt;br /&gt;
|Узлы типа: Action&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Действия OnClose&lt;br /&gt;
|ActionsOnClose&lt;br /&gt;
|NodesContainer&lt;br /&gt;
|Действия при закрытии окна&lt;br /&gt;
|Узлы типа: Action&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Модальность (Modality) ====&lt;br /&gt;
'''Тип:''' enum.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет поведение окна относительно других окон приложения.&lt;br /&gt;
&lt;br /&gt;
'''Значения:'''&lt;br /&gt;
&lt;br /&gt;
* '''Немодальное''' - позволяет взаимодействовать с другими окнами.&lt;br /&gt;
* '''Модальное (Фрейм)''' - блокирует взаимодействие с окнами в том же фрейме.&lt;br /&gt;
* '''Модальное (Система)''' - блокирует все окна приложения.&lt;br /&gt;
&lt;br /&gt;
==== Тип границы (BorderType) ====&lt;br /&gt;
'''Тип:''' enum.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет тип и поведение границ окна.&lt;br /&gt;
&lt;br /&gt;
'''Значения:'''&lt;br /&gt;
&lt;br /&gt;
* '''Фиксированная''' - окно нельзя изменять размер.&lt;br /&gt;
* '''Изменяемая''' - пользователь может изменять размер окна.&lt;br /&gt;
* '''Отсутствует''' - окно без видимых границ.&lt;br /&gt;
&lt;br /&gt;
==== Управление заголовком (TitleEnabled, CloseEnabled) ====&lt;br /&gt;
'''Тип:''' bool.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Контролируют отображение элементов заголовка окна.&lt;br /&gt;
&lt;br /&gt;
==== Фон и затемнение (BackgroundColor, NeedDarkenApplication, ColorDarkenApplication) ====&lt;br /&gt;
'''Тип:''' NColor, bool, NColor.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Управляют визуальным оформлением окна и его влиянием на другие окна.&lt;br /&gt;
&lt;br /&gt;
'''Особенности:'''&lt;br /&gt;
&lt;br /&gt;
* Затемнение применяется только при NeedDarkenApplication = true.&lt;br /&gt;
* Цвет затемнения по умолчанию: черный с прозрачностью 50%.&lt;br /&gt;
&lt;br /&gt;
==== Интервал обновления (UpdateInterval) ====&lt;br /&gt;
'''Тип:''' int.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет частоту обновления виджетов в окне.&lt;br /&gt;
&lt;br /&gt;
'''Рекомендации:'''&lt;br /&gt;
&lt;br /&gt;
* 0 - 100 мс для композиций с критичным временем отклика.&lt;br /&gt;
* 100 - 500 мс хорошо подходит для большинства случаев.&lt;br /&gt;
* более 1000 мс - для статических или редко меняющихся данных.&lt;br /&gt;
&lt;br /&gt;
==== Обработчики событий (ActionsOnShow, ActionsOnClose) ====&lt;br /&gt;
'''Тип:''' NodesContainer.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Коллекции действий, выполняемых при показе и закрытии окна.&lt;br /&gt;
&lt;br /&gt;
=== Окно с композицией ===&lt;br /&gt;
Данный узел имеет те же свойства, что и форма, а также собственные:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Описание&lt;br /&gt;
!Допустимые значения&lt;br /&gt;
!Режим доступа&lt;br /&gt;
|-&lt;br /&gt;
|Композиция&lt;br /&gt;
|CompositionId&lt;br /&gt;
|NodeLink&lt;br /&gt;
|Основная композиция окна&lt;br /&gt;
|Узлы типа: CompositionLayered, CompositionTemplated&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Описание текущей композиции&lt;br /&gt;
|CurrentCompositionDesc&lt;br /&gt;
|string&lt;br /&gt;
|Описание текущей загруженной композиции&lt;br /&gt;
|Автоматически формируется&lt;br /&gt;
|Только чтение&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Композиция (CompositionId) ====&lt;br /&gt;
'''Тип:''' NodeLink.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Ссылка на композицию, отображаемую в окне.&lt;br /&gt;
&lt;br /&gt;
'''Поддерживаемые типы:''' CompositionLayered, CompositionTemplated.&lt;br /&gt;
&lt;br /&gt;
==== Описание текущей композиции (CurrentCompositionDesc) ====&lt;br /&gt;
'''Тип:''' string.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Автоматически обновляемое описание загруженной композиции.&lt;br /&gt;
&lt;br /&gt;
'''Особенности:''' Свойство только для чтения, обновляется системой автоматически.[[Файл:AgavaPLC-Настройка меню в среде разработки.png|мини|226x226пкс|Рисунок 25 — Настройка меню в среде разработки]]&lt;br /&gt;
&lt;br /&gt;
===Композиция===&lt;br /&gt;
Композиция – узел, представляющий составленную при разработке проекта мнемоническую схему в виде набора элементов визуализации (виджетов), сгруппированных в один или несколько слоев.&lt;br /&gt;
&lt;br /&gt;
Композиция дает возможность организовать виджеты в слои, видимостью которых можно управлять во время работы проекта.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Описание&lt;br /&gt;
!Допустимые значения&lt;br /&gt;
!Режим доступа&lt;br /&gt;
|-&lt;br /&gt;
|Размеры&lt;br /&gt;
|Size&lt;br /&gt;
|NSize&lt;br /&gt;
|Размеры композиции&lt;br /&gt;
|Структура {ширина, высота}&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Кэширование&lt;br /&gt;
|Cacheable&lt;br /&gt;
|bool&lt;br /&gt;
|Кэширование данных композиции для быстрого повторного открытия&lt;br /&gt;
|true/false&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Источник интервала обновления&lt;br /&gt;
|UpdateIntervalSource&lt;br /&gt;
|enum&lt;br /&gt;
|Определяет источник интервала обновления виджетов&lt;br /&gt;
|0: Окно&lt;br /&gt;
1: Композиция&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Интервал обновления&lt;br /&gt;
|UpdateInterval&lt;br /&gt;
|int&lt;br /&gt;
|Интервал обновления виджетов в миллисекундах&lt;br /&gt;
|Целое число ≥ 0&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Действия OnLoad&lt;br /&gt;
|ActionsOnLoad&lt;br /&gt;
|NodesContainer&lt;br /&gt;
|Действия при загрузке композиции&lt;br /&gt;
|Узлы типа: Action&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Размеры (Size) ====&lt;br /&gt;
'''Тип:''' NSize (ширина, высота).&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет размеры композиции в пикселях. По умолчанию установлены значения 800x600.&lt;br /&gt;
&lt;br /&gt;
==== Кэширование (Cacheable) ====&lt;br /&gt;
'''Тип:''' bool.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Включает или отключает кэширование данных композиции. При включенном кэшировании композиция сохраняется в памяти для быстрого повторного открытия.&lt;br /&gt;
&lt;br /&gt;
'''Преимущества кэширования:'''&lt;br /&gt;
&lt;br /&gt;
* Быстрое переключение между композициями.&lt;br /&gt;
* Снижение нагрузки на систему при частом использовании.&lt;br /&gt;
* Сохранение состояния элементов.&lt;br /&gt;
&lt;br /&gt;
'''Рекомендации:''' Включать для часто используемых композиций, отключать для редко используемых или ресурсоемких.&lt;br /&gt;
&lt;br /&gt;
==== Источник интервала обновления (UpdateIntervalSource) ====&lt;br /&gt;
'''Тип:''' enum.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет, откуда виджеты композиции получают интервал обновления.&lt;br /&gt;
&lt;br /&gt;
'''Значения:'''&lt;br /&gt;
&lt;br /&gt;
* '''Окно''' - интервал обновления наследуется от родительского окна.&lt;br /&gt;
* '''Композиция''' - используется собственный интервал обновления композиции.&lt;br /&gt;
&lt;br /&gt;
'''Применение:''' Централизованное управление производительностью через окно или индивидуальная настройка для каждой композиции.&lt;br /&gt;
&lt;br /&gt;
==== Интервал обновления (UpdateInterval) ====&lt;br /&gt;
'''Тип:''' int.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Задает интервал обновления виджетов в миллисекундах. При значении 0 отрисовка виджетов выполняется без задержки (максимальная частота).&lt;br /&gt;
&lt;br /&gt;
'''Особенности:'''&lt;br /&gt;
&lt;br /&gt;
* 0 - обновление без задержек (может создать высокую нагрузку).&lt;br /&gt;
* &amp;gt; 0 - обновление с заданным интервалом.   Учитывается только при UpdateIntervalSource = &amp;quot;Композиция&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Рекомендации:'''&lt;br /&gt;
&lt;br /&gt;
* 0 - 100 мс для композиций с критичным временем отклика.&lt;br /&gt;
* 100 - 500 мс хорошо подходит для большинства случаев.&lt;br /&gt;
* более 1000 мс - для статических или редко меняющихся данных.&lt;br /&gt;
&lt;br /&gt;
==== Обработчик событий ActionsOnLoad ====&lt;br /&gt;
'''Тип:''' NodesContainer.&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Коллекции действий, выполняемых после загрузки композиции &amp;lt;code&amp;gt;AS 1.6.27+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Слой===&lt;br /&gt;
Слой – набор виджетов, объединенных каким-то общим структурным признаком. В многослойных композициях слой обеспечивает организацию виджетов в z-порядке, управление видимостью и взаимодействием с пользователем. С помошью свойства &amp;quot;Видимость&amp;quot; слоя можно управлять видимостью виджетов, размещенных на слое.&lt;br /&gt;
&lt;br /&gt;
Свойства&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Описание&lt;br /&gt;
!Допустимые значения&lt;br /&gt;
!Режим доступа&lt;br /&gt;
|-&lt;br /&gt;
|Z-Порядок&lt;br /&gt;
|ZOrder&lt;br /&gt;
|int&lt;br /&gt;
|Порядок слоя в композиции&lt;br /&gt;
|Целое число (чем выше значение, тем выше слой)&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Прозрачность для действий&lt;br /&gt;
|ActionTransparency&lt;br /&gt;
|enum&lt;br /&gt;
|Определяет поведение слоя при взаимодействии с пользователем&lt;br /&gt;
|0: Не определен (ошибка)&lt;br /&gt;
1: Непрозрачный&lt;br /&gt;
&lt;br /&gt;
2: Прозрачный&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|-&lt;br /&gt;
|Видимость&lt;br /&gt;
|Visible&lt;br /&gt;
|bool&lt;br /&gt;
|Видимость слоя и всех его виджетов&lt;br /&gt;
|true/false&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Z-Порядок (ZOrder) ====&lt;br /&gt;
'''Тип:''' int&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет порядок отображения слоя относительно других слоев в композиции. Слои с большим значением ZOrder отображаются поверх слоев с меньшим значением.&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
&lt;br /&gt;
* Фоновый слой: ZOrder = 1.&lt;br /&gt;
* Основной контент: ZOrder = 2.&lt;br /&gt;
* Контекстные виджеты: ZOrder = 3.&lt;br /&gt;
&lt;br /&gt;
==== Прозрачность для действий (ActionTransparency) ====&lt;br /&gt;
'''Тип:''' enum&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Управляет взаимодействием слоя с пользовательскими действиями (клики, наведения и т.д.)&lt;br /&gt;
&lt;br /&gt;
'''Значения:'''&lt;br /&gt;
&lt;br /&gt;
* '''Непрозрачный''' - слой полностью перехватывает пользовательские действия, элементы под ним недоступны, даже если они видимы.&lt;br /&gt;
* '''Прозрачный''' - пользовательские действия проходят сквозь слой к элементам ниже.&lt;br /&gt;
&lt;br /&gt;
Обратите внимание: если на слое размещается изображение с прозрачной областью, то такие виджеты не позволяют пользователю взаимодействовать с видимыми и размещенными под ним виджетами.&lt;br /&gt;
&lt;br /&gt;
==== Видимость (Visible) ====&lt;br /&gt;
'''Тип:''' bool&lt;br /&gt;
&lt;br /&gt;
'''Описание:''' Определяет видимость всего слоя и всех его дочерних виджетов. При значении false слой и все его содержимое становится невидимым.&lt;br /&gt;
&lt;br /&gt;
'''Применение:''' Временное скрытие виджетов или переключение их видимости.&lt;br /&gt;
&lt;br /&gt;
===Виджет===&lt;br /&gt;
Виджет – элемент визуализации, предназначенный для отображения информации в заданном виде.&lt;br /&gt;
&lt;br /&gt;
===Меню===&lt;br /&gt;
Меню – элемент визуализации, сочетающий в себе несколько виджетов «Кнопка». Используется для более удобного управления проектом (см. Рисунок 24).&lt;br /&gt;
&lt;br /&gt;
Для добавления меню, необходимо в среде разработки назначить [[Универсальная среда разработки#.D0.94.D0.B5.D0.B9.D1.81.D1.82.D0.B2.D0.B8.D0.B5 .C2.AB.D0.9E.D1.82.D0.BE.D0.B1.D1.80.D0.B0.D0.B6.D0.B5.D0.BD.D0.B8.D0.B5 .D0.BC.D0.B5.D0.BD.D1.8E.C2.BB|действие «Отображение меню»]] для кнопки (или любого другого виджета). После добавления действия необходимо выделить его и нажать на кнопку настроек на панели вверху окна действий. Открывшееся окно (см. Рисунок 25) содержит дерево со структурой меню, в который можно добавлять элементы двух типов:&lt;br /&gt;
&lt;br /&gt;
*меню – элемент, который позволяет группировать элементы меню, выводя их в виде раскрывающегося списка. На рисунках 24 и 25 этим элементом являются кнопки «Арочник» и «БПО».&lt;br /&gt;
*элемент меню – элемент, который предоставляет функционал, аналогичный [[Универсальная среда разработки#.D0.92.D0.B8.D0.B4.D0.B6.D0.B5.D1.82 .C2.AB.D0.9A.D0.BD.D0.BE.D0.BF.D0.BA.D0.B0.C2.BB|виджету «Кнопка»]]. Для добавления действия, выполняющегося при нажатии на элемент меню в среде исполнения, необходимо нажать на него ПКМ в дереве структуры меню и выбрать &amp;quot;Создать действие&amp;quot;. На рисунках 24 и 25 этим элементом являются кнопки «Котельная», «Котёл №1», «Котёл №2» и «Котёл №3».&lt;br /&gt;
&lt;br /&gt;
=== Создание многомониторных систем визуализации ===&lt;br /&gt;
AgavaSCADA предоставляет возможность реализации систем визуализации в составе проектов, использующих для отображения информации более одного дисплея.&lt;br /&gt;
&lt;br /&gt;
Для вывода информации в окнах на нескольких дисплеях в проект необходимо внести следующие корректировки относительно проекта, использующего только один дисплей:&lt;br /&gt;
&lt;br /&gt;
# Добавить дополнительные фреймы, чтобы их количество в проекте соответствовало количеству дисплеев. Каждому фрейму назначить порядковый номер, начиная с 1. Фреймы связываются с дисплеями по номеру.&lt;br /&gt;
# Добавить дополнительное окно (или окна, если в исходном фрейме их несколько или дополнительных фреймов больше одного).&lt;br /&gt;
# Добавить в дополнительные фреймы созданные на этапе 2 окна, чтобы повторить структуру основоного фрейма.&lt;br /&gt;
&lt;br /&gt;
Базовая настройка на этом закончена. После запуска такого проекта на двух или более дисплеях должны отображаться созданные окна.&lt;br /&gt;
&lt;br /&gt;
Если в проекте используется навигация по окнам, то необходимо в каждом окне, включенном в фрейм, скорректировать действия, размещаемые на кнопках, меню или друигх виджетах таким образом, чтобы действия открывали окна или загружали композиции в нужном окне.&lt;br /&gt;
&lt;br /&gt;
===Виджеты===&lt;br /&gt;
====Виджет «Текстовая метка»====&lt;br /&gt;
[[Файл:AgavaPLC–Примеры оформления виджетов типа &amp;quot;Текстовая метка&amp;quot;.png|мини|Рисунок 26 – Примеры оформления виджетов типа &amp;quot;Текстовая метка&amp;quot;]]&lt;br /&gt;
Виджет «Текстовая метка» – наиболее часто применяемый виджет, с помощью которого можно реализовать разные способы отображения текстовой информации.&lt;br /&gt;
&lt;br /&gt;
Виджет «Текстовая метка» может использоваться для отображения статичного текста, значений параметров (одного или нескольких) и их комбинаций.&lt;br /&gt;
&lt;br /&gt;
При необходимости отображения значений параметров они указываются в свойстве «Источник». Для задания определенного формата отображения используются спецификаторы формата в стиле языка «Си»:&lt;br /&gt;
&lt;br /&gt;
*%f – значение в виде числа с плавающей точкой;&lt;br /&gt;
* %s – строка;&lt;br /&gt;
*%i – целое число со знаком;&lt;br /&gt;
*%u – целое число без знака;&lt;br /&gt;
* %d – целое число со знаком в десятичной системе исчисления.&lt;br /&gt;
&lt;br /&gt;
Для разных типов свойств необходимо использовать строго определенные для них спецификаторы, с другими спецификаторами значения выводиться не будут.&lt;br /&gt;
&lt;br /&gt;
Для отображения знака «%» необходимо указать его дважды: «%%».&lt;br /&gt;
&lt;br /&gt;
===== Отображение нескольких значений =====&lt;br /&gt;
Одна текстовая метка может использоваться для отображения нескольких значений. Для этого все значения, которые нужно отобразить, указываются в свойстве «Источник», а в свойстве «Текст» указываются последовательно несколько спецификаторов формата соответственно порядку перечисления значений в свойстве «Источник».&lt;br /&gt;
&lt;br /&gt;
Пример: текстовая метка, отображающая текущую позицию в очереди:&lt;br /&gt;
&lt;br /&gt;
* Текст: &amp;lt;code&amp;gt;Позиция %i из %i&amp;lt;/code&amp;gt;&lt;br /&gt;
* Источник: два узла из проекта.&lt;br /&gt;
&lt;br /&gt;
=====Модификаторы спецификаторов формата=====&lt;br /&gt;
&lt;br /&gt;
======Модификатор минимальной ширины поля======&lt;br /&gt;
Целое число, расположенное между знаком % и кодом формата, играет роль модификатора минимальной ширины поля. Если указан модификатор минимальной ширины поля, то, чтобы ширина поля вывода была не меньше указанной минимальной величины, вывод при необходимости будет дополнен пробелами. Если же выводятся строки или числа, которые длиннее указанного минимума, то они все равно будут отображаться полностью. По умолчанию для дополнения используются пробелы. А если для этого надо использовать нули, то перед модификатором ширины поля следует поместить 0. Например, %05i означает, что любое число, количество цифр которого меньше пяти, будет дополнено таким количеством нулей, чтобы состоять из пяти цифр.&lt;br /&gt;
&lt;br /&gt;
Примеры&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Значение&lt;br /&gt;
!Спецификатор формата&lt;br /&gt;
!Выводимое значение&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%i&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%d&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%05i&lt;br /&gt;
|00010&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%f&lt;br /&gt;
|10.123000&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%.1f&lt;br /&gt;
| 10.1&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%10f&lt;br /&gt;
|&amp;lt;пробел&amp;gt;10.123000&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%012f&lt;br /&gt;
|00010.123000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
======Модификатор точности======&lt;br /&gt;
Модификатор точности следует за модификатором минимальной ширины поля (если таковой имеется). Он состоит из точки и расположенного за ней целого числа. Значение этого модификатора зависит от типа данных, к которым его применяют.&lt;br /&gt;
&lt;br /&gt;
Когда модификатор точности применяется к данным с плавающей точкой, для преобразования которых используются спецификаторы преобразования %f, %e или %E, то он определяет количество выводимых десятичных разрядов. Например, %10.4f означает, что ширина поля вывода будет не менее 10 символов, причем для десятичных разрядов будет отведено четыре позиции.&lt;br /&gt;
&lt;br /&gt;
Если модификатор точности применяется к %g или %G, то он определяет количество значащих цифр.&lt;br /&gt;
&lt;br /&gt;
Примененный к строкам, модификатор точности определяет максимальную длину поля. Например, %5.7s означает, что длина выводимой строки будет составлять минимум пять и максимум семь символов. Если строка окажется длиннее, чем максимальная длина поля, то конечные символы выводиться не будут.&lt;br /&gt;
&lt;br /&gt;
Если модификатор точности применяется к целым типам, то он определяет минимальное количество цифр, которые будут выведены для каждого из чисел. Чтобы получилось требуемое количество цифр, добавляется некоторое количество ведущих нулей.&lt;br /&gt;
&lt;br /&gt;
Примеры:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Значение&lt;br /&gt;
!Спецификатор формата&lt;br /&gt;
!Выводимое значение&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%f&lt;br /&gt;
|10.123000&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%.1f&lt;br /&gt;
|10.1&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%10.4f&lt;br /&gt;
|&amp;lt;пробел&amp;gt;&amp;lt;пробел&amp;gt;&amp;lt;пробел&amp;gt;10.1230&lt;br /&gt;
|-&lt;br /&gt;
|10.123&lt;br /&gt;
|%010.3f&lt;br /&gt;
|000010.123&lt;br /&gt;
|-&lt;br /&gt;
| Это простая проверка&lt;br /&gt;
|%10.15s&lt;br /&gt;
|Это простая про&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Виджет «Условная метка» ====&lt;br /&gt;
[[Файл:AgavaPLC–Список сопоставлений виджета &amp;quot;Условная метка&amp;quot;.png|мини|Рисунок 27 – Список сопоставлений виджета &amp;quot;Условная метка&amp;quot;|ссылка=Файл:AgavaPLC–Список_сопоставлений_виджета_%22Условная_метка%22.png]]&lt;br /&gt;
Виджет «Условная метка» позволяет изменять выводимую строку в соответствии с изменениями привязанной к ней переменной.&lt;br /&gt;
&lt;br /&gt;
Задать соответствие текста необходимому условию можно в свойстве «Список сопоставлений».&lt;br /&gt;
&lt;br /&gt;
==== Виджет «Изображение»====&lt;br /&gt;
Виджет «Изображение» предназначен для отображения на окнах статичных изображений форматов png, gif, jpg, bmp или анимированных изображений в формате gif. Отображаемая картинка выбирается в разделе «Оформление» - «Изображение». Она должна находиться в папке проекта.&lt;br /&gt;
&lt;br /&gt;
====Виджет «Условное изображение»====&lt;br /&gt;
[[Файл:AgavaPLC–Список сопоставлений виджета &amp;quot;Условное изображение&amp;quot;.png|мини|Рисунок 28 – Список сопоставлений виджета &amp;quot;Условное изображение&amp;quot;|ссылка=Файл:AgavaPLC–Список_сопоставлений_виджета_%22Условное_изображение%22.png]]&lt;br /&gt;
Виджет «Условное изображение» позволяет изменять отображаемое изображение в соответствии с изменениями привязанной к нему переменной.&lt;br /&gt;
&lt;br /&gt;
Задать соответствие изображения необходимому условию можно в свойстве «Список сопоставлений».&lt;br /&gt;
&lt;br /&gt;
====Виджет «Движущееся изображение»====&lt;br /&gt;
Виджет предназначен для отображения на окнах изображений, перемещающихся в пределах области виджета. В основном используются на экране спящего режима.&lt;br /&gt;
&lt;br /&gt;
Отображаемая картинка выбирается в разделе «Оформление» - «Изображение». Она должна находиться в папке проекта.&lt;br /&gt;
&lt;br /&gt;
====Виджет «Кнопка»====&lt;br /&gt;
Виджет «Кнопка» предназначен для реализации функций управления:&lt;br /&gt;
&lt;br /&gt;
*ввод данных;&lt;br /&gt;
*передача управляющих воздействий;&lt;br /&gt;
* смена режима работы АРМ или иного устройства, исполняющего проект.&lt;br /&gt;
&lt;br /&gt;
Выполнение всех функций виджета обеспечивается с помощью узлов типа «Действие», добавляемых в соответствующее свойство (см. раздел [[#Действия]]).&lt;br /&gt;
&lt;br /&gt;
====Виджет «Гистограмма»====&lt;br /&gt;
[[Файл:AgavaPLC–Виджет &amp;quot;Гистограмма&amp;quot;.png|мини|Рисунок 29 – Виджет &amp;quot;Гистограмма&amp;quot;|ссылка=Файл:AgavaPLC–Виджет_%22Гистограмма%22.png]]&lt;br /&gt;
Виджет предназначен для отображения значений сигналов в виде столбчатой диаграммы.&lt;br /&gt;
&lt;br /&gt;
Виджету необходимо задать источник (регистр/сигнал, с которого он будет получать данные), а также минимальное и максимальное значения.&lt;br /&gt;
&lt;br /&gt;
====Виджет «Исторический график»====&lt;br /&gt;
Виджет «Исторический график» предназначен для отображения графиков параметров на двухкоординатной области изображения с привязкой к осям времени и значений.&lt;br /&gt;
&lt;br /&gt;
Виджет может работать с данными, архивируемыми в БД, и напрямую с сигналами, значения которых вычисляются в ходе работы.  &lt;br /&gt;
&lt;br /&gt;
При работе с архивируемыми данными интервал обновления графика зависит от режима выдачи значения у базы данных: при выборе сохраняемых в БД он будет соответствовать интервалу архивирования, а при сохраненных в БД - интервалу сохранения БД на диск. Независимо от режима выдачи, график не может обновляться меньше чем за 300 мс.&lt;br /&gt;
&lt;br /&gt;
При работе напрямую с сигналами график обновляется при изменении значения сигнала, но также не чаще чем раз в 300 мс.&lt;br /&gt;
[[Файл:AgavaPLC–Экран «Архив» с виджетом «Исторический график».png|мини|Рисунок 30 – Виджет «Исторический график». Области кнопок-пиктограмм. В нижней части отображена легенда]]&lt;br /&gt;
Виджет «Исторический график» состоит из нескольких областей:&lt;br /&gt;
&lt;br /&gt;
*область осей Х, Y;&lt;br /&gt;
*область легенды, содержащей список кривых и их параметры (цвет кривой, наименование кривой, текущее значение, время последнего зарегистрированного значения);&lt;br /&gt;
*область вывода данных.&lt;br /&gt;
&lt;br /&gt;
На виджете имеются несколько областей, содержащих кнопки-пиктограммы управления внешним видом графика (см. Рисунок 28):&lt;br /&gt;
&lt;br /&gt;
#область пиктограмм графика;&lt;br /&gt;
#область пиктограмм оси времени (X);&lt;br /&gt;
#область пиктограмм оси значений (Y);&lt;br /&gt;
#область легенды.&lt;br /&gt;
&lt;br /&gt;
В области пиктограмм графика слева направо расположены следующие кнопки-пиктограммы:&lt;br /&gt;
&lt;br /&gt;
* кнопка переключения режима отображения точек на всех кривых;&lt;br /&gt;
* кнопка переключения видимости легенды;&lt;br /&gt;
*кнопка включения режима визирной линии.&lt;br /&gt;
&lt;br /&gt;
В области пиктограмм оси времени (X) слева направо расположены следующие кнопки-пиктограммы:&lt;br /&gt;
&lt;br /&gt;
*кнопка открытия окна выбора интервала времени для оси Х, текст кнопки отображает текущий выбранный интервал, например: 5М – 5 минут, 6Ч – 6 часов, 30М – 30 минут;&lt;br /&gt;
*кнопка-индикатор включения следящего режима.&lt;br /&gt;
&lt;br /&gt;
В области пиктограмм оси значений (Y) расположена кнопка-пиктограмма «A» – кнопка переключения режима автоматического масштабирования значений.&lt;br /&gt;
&lt;br /&gt;
=====Легенда=====&lt;br /&gt;
[[Файл:AgavaPLC–Легенда с четырьмя выключенными параметрами.png|мини|Рисунок 31 – Легенда с четырьмя выключенными параметрами]]&lt;br /&gt;
Легенда – специальная область в нижней части экрана архива, предназначенная для отображения параметров (наименование, текущее значение и т. д.) выводимых графиков в виде таблицы. Для ознакомления с примерным видом легенды см. Рисунок 31. Информация о каждом сигнале в легенде выводится в несколько колонок:&lt;br /&gt;
&lt;br /&gt;
*«Цвет» – индицирует цвет, которым выводится соответствующая кривая на графике, колонка «Цвет» позволяет нажатием переключать видимость соответствующей кривой на графике (см. Рисунок 29). Также в колонке &amp;quot;Цвет&amp;quot; отображается номер пера, которым выводится кривая параметра на графике;&lt;br /&gt;
* «Имя» («Наименование») – содержит наименование параметра;&lt;br /&gt;
*«Время» – содержит время последнего зарегистрированного значения параметра;&lt;br /&gt;
*«Значение» – содержит последнее зарегистрированное значение параметра.&lt;br /&gt;
&lt;br /&gt;
=====Режимы просмотра графиков=====&lt;br /&gt;
Пользователю доступно два режима просмотра графиков:&lt;br /&gt;
&lt;br /&gt;
*следящий режим;&lt;br /&gt;
*режим просмотра истории.&lt;br /&gt;
&lt;br /&gt;
В следящем режиме на графике всегда отображаются актуальные значения параметров, тренд периодически дочитывает поступившие данные из базы и обновляет графики. &lt;br /&gt;
&lt;br /&gt;
В режиме просмотра истории на графике отображаются исторические значения параметров. Просмотр истории технологического процесса осуществляется с помощью кнопок перемещения по осям и кнопок изменения масштаба.&lt;br /&gt;
&lt;br /&gt;
Режим просмотра истории включается автоматически при прокрутке графика назад по времени.&lt;br /&gt;
&lt;br /&gt;
=====Визирная линия=====&lt;br /&gt;
[[Файл:AgavaPLC–График в режиме просмотра истории с установленной визирной линией.png|мини|Рисунок 32 – График в режиме просмотра истории с установленной визирной линией]]&lt;br /&gt;
Для просмотра значений параметров в нужный момент времени служит визирная линия, отображаемая на графике как вертикальная линия.&lt;br /&gt;
&lt;br /&gt;
При щелчке левой кнопкой мыши (ЛКМ) в области графиков визирная линия будет отображена в выбранном месте графика.&lt;br /&gt;
&lt;br /&gt;
В точке пересечения визирной линии и кривых параметров отображаются значения этих параметров. Также в нижней части области графиков, возле оси времени, визирная линия отображает время.&lt;br /&gt;
&lt;br /&gt;
====Виджет «График кусочно-линейной функции»====&lt;br /&gt;
Виджет предназначен для отображения графика зависимости двух параметров, расположенном на осях X и Y.&lt;br /&gt;
[[Файл:AgavaPLC–Виджет «График кусочно-линейной функции». Области кнопок-пиктограмм..png|мини|Рисунок 33 – Виджет «График кусочно-линейной функции». Области кнопок-пиктограмм.]]&lt;br /&gt;
Виджет состоит из нескольких областей:&lt;br /&gt;
&lt;br /&gt;
*область осей Х, Y;&lt;br /&gt;
*область легенды, содержащей список кривых и их параметры (цвет кривой, наименование кривой, текущее значение, время последнего зарегистрированного значения);&lt;br /&gt;
*область вывода графика.&lt;br /&gt;
&lt;br /&gt;
На области вывода графика виджета имеются несколько областей, содержащих кнопки-пиктограммы управления внешним видом графика (см. Рисунок 33):&lt;br /&gt;
&lt;br /&gt;
#Область пиктограмм графика.&lt;br /&gt;
#Область пиктограмм оси первого параметра (X).&lt;br /&gt;
#Область пиктограмм оси второго параметра (Y).&lt;br /&gt;
&lt;br /&gt;
В области пиктограмм графика расположены следующие кнопки-пиктограммы:&lt;br /&gt;
&lt;br /&gt;
*кнопка переключения режима отображения точек на всех кривых;&lt;br /&gt;
*кнопка переключения видимости легенды;&lt;br /&gt;
*кнопка включения режима визирной линии.&lt;br /&gt;
&lt;br /&gt;
В области пиктограмм оси первого (X) и второго (Y) параметров расположены кнопки-пиктограммы «А» – кнопка переключения режима автоматического масштабирования значений.[[Файл:AgavaPLC–Виджет &amp;quot;Список событий&amp;quot;.png|мини|Рисунок 34 – Виджет &amp;quot;Список событий&amp;quot;|ссылка=Файл:AgavaPLC–Виджет_%22Список_событий%22.png]]&lt;br /&gt;
====Виджет «Список событий»====&lt;br /&gt;
[[Файл:AgavaPLC–Окно выбора интервала.png|мини|Рисунок 35 – Окно выбора интервала]]Виджет предназначен для отображения регистрируемых событий в работе.&lt;br /&gt;
&lt;br /&gt;
В верхней части виджета расположена панель управления (1).&lt;br /&gt;
&lt;br /&gt;
Панель управления содержит органы управления журналом:&lt;br /&gt;
&lt;br /&gt;
*кнопка отображения фильтра событий;&lt;br /&gt;
*кнопка включения следящего режима журнала;&lt;br /&gt;
*кнопка изменения интервала на один день назад;&lt;br /&gt;
*кнопка-индикатор выбора интервала, за который отображаются события;&lt;br /&gt;
*кнопка изменения интервала на один день вперед;&lt;br /&gt;
*кнопка вызова окна со списком активных тревог.&lt;br /&gt;
&lt;br /&gt;
Ниже панели управления, в основном поле экрана, расположена таблица, содержащая зарегистрированные события.&lt;br /&gt;
&lt;br /&gt;
Заголовок таблицы позволяет изменять порядок столбцов и включать сортировку по столбцам. Например, возможно включение сортировки событий сначала по времени, затем по группе. Заголовок таблицы имеет возможность отключения / включения отображения любого столбца.&lt;br /&gt;
&lt;br /&gt;
При большом количестве записей в правой части таблицы появляется полоса прокрутки, позволяющая пролистывать список событий.&lt;br /&gt;
&lt;br /&gt;
Нажатие на кнопку-индикатор выбора интервала вызывает окно выбора интервала (см. Рисунок 35):[[Файл:AgavaPLC–Окно &amp;quot;Фильтр&amp;quot;.png|мини|Рисунок 36 – Окно &amp;quot;Фильтр&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Фильтр%22.png]]После выбора нужного интервала для сохранения выбора необходимо нажать кнопку «ОК». После сохранения будут отображены зарегистрированные события за выбранный интервал.&lt;br /&gt;
Нажатие на кнопку отображения окна фильтра вызывает соответствующее окно. Окно фильтра позволяет изменить содержимое основного окна журнала событий путем выбора групп и подгрупп событий, перечисленных в окне фильтра (см. Рисунок 36).&lt;br /&gt;
&lt;br /&gt;
После выбора нужных групп и подгрупп для сохранения выбора необходимо нажать кнопку «ОК». После сохранения будут отображены зарегистрированные события, принадлежащих выбранным группам.&lt;br /&gt;
&lt;br /&gt;
====Виджет «Ввод значения»====&lt;br /&gt;
Виджет «Ввод значения» предназначен для отображения значения привязанного сигнала и его редактирования.&lt;br /&gt;
[[Файл:AgavaPLC–Виджет «Ввод значения» с отображением экранной цифровой клавиатуры.png|мини|Рисунок 37 – Виджет «Ввод значения» с отображением экранной цифровой клавиатуры|212x212пкс]]&lt;br /&gt;
После выбора узла для чтения/записи и соответствующего типа значения необходимо выбрать нужный тип ввода в разделе «Оформление».&lt;br /&gt;
&lt;br /&gt;
Доступны следующие типы ввода:&lt;br /&gt;
&lt;br /&gt;
*кнопки изменения – при нажатии на виджет появляются кнопки увеличения и уменьшения на заданный шаг изменения;&lt;br /&gt;
*кнопка редактирования – при нажатии на виджет появляется кнопка, при клике на которую открывается экранная цифровая клавиатура;&lt;br /&gt;
&lt;br /&gt;
Виджет имеет возможность проверки вводимых значений, при активации которой запись будет осуществляться только тогда, когда записываемое значение будет находиться в диапазоне между заданными минимальным и максимальными значениями.&lt;br /&gt;
&lt;br /&gt;
====Виджет «Выбор значения из списка»====&lt;br /&gt;
[[Файл:AgavaPLC–Виджет «Выбор значения из списка».png|мини|Рисунок 38 – Виджет «Выбор значения из списка»]]&lt;br /&gt;
Виджет «Выбор значения из списка» предназначен для отображения значения привязанного сигнала и его изменения в удобном для пользователя текстовом виде (см. Рисунок 37).&lt;br /&gt;
&lt;br /&gt;
С помощью свойства «Список сопоставлений» задается соответствие между значением сигнала и выводимой в виджете строкой.&lt;br /&gt;
&lt;br /&gt;
При нажатии на кнопку в правой части виджета отображается список всех сопоставлений. При выборе нужного элемента в списке в установленный узел производится запись нового значения.&lt;br /&gt;
&lt;br /&gt;
====Виджет «Флаг»====&lt;br /&gt;
[[Файл:AgavaPLC–Варианты внешнего вида виджета «Флаг».png|мини|Рисунок 39 – Варианты внешнего вида виджета «Флаг»]]&lt;br /&gt;
Виджет «Флаг» предназначен для отображения значения и изменения булевой переменной (true/false). Состояние true отображается в виде галочки (см. Рисунок 38).&lt;br /&gt;
&lt;br /&gt;
При нажатии на виджет значение переменной изменяется на противоположное.&lt;br /&gt;
&lt;br /&gt;
В случае, если флаг необходимо использовать только для отображения информации, поставьте галочку в свойстве «Отключен»&lt;br /&gt;
&lt;br /&gt;
====Виджет «Отчет»====&lt;br /&gt;
[[Файл:AgavaPLC–Виджет «Отчет» в режиме отображения сформированного отчета.png|мини|Рисунок 40 – Виджет «Отчет» в режиме отображения сформированного отчета]]&lt;br /&gt;
Виджет «Отчет» предназначен для формирования отчетов по заранее спроектированному макету.&lt;br /&gt;
&lt;br /&gt;
Подробный порядок создания и редактирования отчетов приведен в разделе [[#Отчеты]].&lt;br /&gt;
[[Файл:AgavaPLC–Окно выбора интервала отчета.png|мини|Рисунок 41 – Окно выбора интервала отчета]]&lt;br /&gt;
В верхней части виджета размещена панель управления, содержащая кнопки вызова команд:&lt;br /&gt;
&lt;br /&gt;
* печать сформированного отчета на установленном в системе принтере;&lt;br /&gt;
*сохранение сформированного отчета в файле формата PDF;&lt;br /&gt;
*переход к предыдущей странице отчета;&lt;br /&gt;
*переход к следующей странице отчета;&lt;br /&gt;
*масштабирование экрана по ширине листа отчета;&lt;br /&gt;
*масштабирование экрана по высоте листа отчета.&lt;br /&gt;
&lt;br /&gt;
При формировании отчета для изменения интервала времени, за который будет формироваться отчет, необходимо на панели управления щелкнуть кнопку выбора интервала (на ней отображается текущий выбранный интервал, например, «Начало суток без смещения – Конец суток без смещения»). Далее появится окно «Интервал», в котором можно выбрать начало и конец интервала (см. Рисунок 41). &lt;br /&gt;
&lt;br /&gt;
В качестве начала и конца интервала можно выбрать как конкретную дату по календарю, так относительную, например, «Начало дня», &amp;quot;Конец недели&amp;quot;. После выбора желаемого интервала необходимо нажать кнопку «ОК».&lt;br /&gt;
&lt;br /&gt;
Выбранный интервал отобразится на панели управления отчетом. Для формирования отчета за выбранный интервал необходимо нажать кнопку «Сформировать отчет». Через некоторое время, после загрузки данных из БД и их обработки, экран обновится и сформированный отчет за выбранный интервал будет отображен.&lt;br /&gt;
&lt;br /&gt;
{{Шаблон:Действия AgavaSCADA/AgavaPLC}}&lt;br /&gt;
&lt;br /&gt;
==Система тревог==&lt;br /&gt;
Система тревог предназначена для оповещения пользователя об обнаруженных нарушениях.&lt;br /&gt;
&lt;br /&gt;
Система содержит два типа узлов:&lt;br /&gt;
&lt;br /&gt;
*Группа событий.&lt;br /&gt;
*Контроллер событий.&lt;br /&gt;
&lt;br /&gt;
===Группа событий===&lt;br /&gt;
Группа событий – узел, предназначенный для взаимодействия с виджетом «Список событий». Группы событий позволяют группировать события по какому-то признаку, например по уровню тревоги (авария, предупреждение, квитирование и т.д.), технологическому участку и т.д.&lt;br /&gt;
&lt;br /&gt;
Для каждой группы можно выбрать свой цвет шрифта и фона, которые будут использоваться для вывода событий, принадлежащих этой группе в виджете &amp;quot;Список событий&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
В свойстве «Описание» группы событий указывается текст, который будет отображаться в фильтре списка событий.&lt;br /&gt;
&lt;br /&gt;
===Монитор событий===&lt;br /&gt;
Монитор событий (ранее - Контроллер событий) – узел, реализующий логику проверки соответствия выбранных сигналов контролируемым условиям. Контроллеры событий выполняют всю работу по проверке значений контролируемых параметров и выполнению соответствующих действий.&lt;br /&gt;
&lt;br /&gt;
Монитор событий проверяет значения заданных узлов на соответствие заданным условиям и при их совпадении выполняет заданные действия.&lt;br /&gt;
&lt;br /&gt;
В качестве действий можно указать не только действие &amp;quot;Создание события&amp;quot;, но и другие (см. раздел [[#Действия]]).&lt;br /&gt;
[[Файл:AgavaPLC-Cистема тревог.png|мини|Cистема тревог]]&lt;br /&gt;
&lt;br /&gt;
===Порядок настройки системы===&lt;br /&gt;
Порядок настройки системы тревог следующий:&lt;br /&gt;
#Добавить в проект систему тревог. Для этого нажать ПКМ по узлу «Станция» в дереве проекта, затем выбрать «Добавить узел» - «Система» - «Система тревог».&lt;br /&gt;
#Добавить узел «События» в систему тревог. Для этого нажать ПКМ по системе тревог в дереве проекта, затем выбрать «Добавить узел» - «Группа» - «События». При необходимости настроить цвет шрифта и фона, которые будут отображаться у события в окне тревог или журнале.&lt;br /&gt;
#Добавить нужные [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.93.D1.80.D1.83.D0.BF.D0.BF.D0.B0 .D1.81.D0.BE.D0.B1.D1.8B.D1.82.D0.B8.D0.B9|группы событий]] в узел «События». Для этого нажать ПКМ по узлу «События» в дереве проекта, затем выбрать «Добавить узел» - «Группа событий».&lt;br /&gt;
#Добавить [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.9A.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.BB.D0.B5.D1.80 .D1.81.D0.BE.D0.B1.D1.8B.D1.82.D0.B8.D0.B9|контроллеры событий]] в систему тревог. Для этого нажать ПКМ по системе тревог в дереве проекта, затем выбрать «Добавить узел» - «Контроллер событий».&lt;br /&gt;
#Добавить в свойство «Сигналы» контроллеров событий узлы, состояние которых необходимо контролировать.&lt;br /&gt;
#Задать для этих узлов контролируемые условия в соответствующем свойстве контроллера событий.&lt;br /&gt;
#Настроить [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.94.D0.B5.D0.B9.D1.81.D1.82.D0.B2.D0.B8.D1.8F|действия]], которые будут выполняться при выполнении контролируемого условия. Для вывода аварий, предупреждений или информационных сообщений необходимо добавить действие «Создание события».&lt;br /&gt;
# Настроить действие «Создание события». В его свойстве «Группа событий» указать группу из созданных в пункте 2. Ввести тексты сообщения активации и деактивации (при необходимости), указать уровень события. Теперь, при срабатывании контролируемого условия, будет появляться окно тревог с сообщением активации.&lt;br /&gt;
&lt;br /&gt;
=== Окно тревог ===&lt;br /&gt;
Окно тревог рпедназначено для отображения состояния активных тревог и управления ими.&lt;br /&gt;
&lt;br /&gt;
Данное окно отображается при любом изменении состояния обрабатываемых тревог:&lt;br /&gt;
&lt;br /&gt;
* появилось событие - отобразилось окно;&lt;br /&gt;
* квитировали событие - изменилось отображение события в окне;&lt;br /&gt;
* устранили первопричину - события пропали из окна.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;message_sender sender_info_hover no-select&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Если события были квитированы и окно тревог было закрыто, то при снятии причины тревоги окно будет отображено, индицируя факт изменения состояния тревог и их отсутствие в текущий момент.&lt;br /&gt;
&lt;br /&gt;
== Система архивирования==&lt;br /&gt;
Система архивирования предназначена для управления процессом сохранения значений параметров в базы данных. Параметры, сохраненные в базу данных, могут использоваться для построения графиков параметров и генерации отчетов.&lt;br /&gt;
&lt;br /&gt;
Архивация параметров производится с помощью архиваторов. Архиваторы SQLite и PostgreSQL могут выполнять [[Узлы проекта AgavaSCADA/AgavaPLC#Прореживание данных|прореживание данных]].&lt;br /&gt;
[[Файл:AgavaPLC-Настройка архиватора.png|мини|505x505пкс|Настройка архиватора]]&lt;br /&gt;
&lt;br /&gt;
===Порядок настройки системы===&lt;br /&gt;
Для сохранения истории изменения значений параметров в БД необходимо выполнить следующие действия: &lt;br /&gt;
&lt;br /&gt;
#Добавить в проект систему архивации. Для этого нажать ПКМ по узлу «Станция» в дереве проекта, затем выбрать «Добавить узел» - «Система» - «Система архивации».&lt;br /&gt;
#Добавить в систему архивации архиватор. Для этого нажать ПКМ по узлу «Система архивации» в дереве проекта, затем выбрать «Добавить узел» - «Архиватор в БД SQLite».&lt;br /&gt;
#Настроить параметры архиватора, такие как: путь до файла БД, интервал архивирования (как часто система архивации будет опрашивать значение параметра), интервал сохранения БД на диск (как часто эти значения будут записываться в постоянную память), разбиение БД (будет ли система архивации создавать новый файл БД каждые сутки), период хранения и режим выдачи значений для построения графика (сохраняемые значения будут обновляться с частотой интервала архивирования, а сохраненные - с частотой интервала сохранения).&lt;br /&gt;
#Добавить параметры в коннекторы база данных. Для этого необходимо открыть свойство архиватора «Коннекторы БД», выбрать «Создать новый» - «Коннектор БД». После этого нужно нажать по добавленному коннектору, открыть его свойство «Сигналы» и добавить параметр, значение которого необходимо сохранять в БД.&lt;br /&gt;
&lt;br /&gt;
=== Архиватор SQLite===&lt;br /&gt;
Архиватор SQLite предназначен для сохранения значений параметров в БД формата SQLite.&lt;br /&gt;
&lt;br /&gt;
Для извлечения и просмотра баз данных формата SQLite с устройств может использоваться программа «[[Архиватор]]».&lt;br /&gt;
&lt;br /&gt;
====Свойства узла &amp;quot;Архиватор SQLite&amp;quot;====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Доступ&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Путь до файла БД&lt;br /&gt;
|FilePath&lt;br /&gt;
|STRING&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Путь до файла БД. Абсолютный или относительный.&lt;br /&gt;
|-&lt;br /&gt;
|Интервал архивирования&lt;br /&gt;
|Interval&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Интервал архивирования, мс.&lt;br /&gt;
|-&lt;br /&gt;
|Период хранения&lt;br /&gt;
|Retention&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Период хранения, дней.&lt;br /&gt;
|-&lt;br /&gt;
|Разбиение БД&lt;br /&gt;
|DBSplitting&lt;br /&gt;
|BOOL&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Разбиение БД на файлы. При включении база данных будет разделяться на отдельные файлы, содержащие данные за одни сутки.&lt;br /&gt;
|-&lt;br /&gt;
|Интервал сохранения БД на диск&lt;br /&gt;
|StoringInterval&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Интервал сохранения БД на диск, мс.&lt;br /&gt;
|-&lt;br /&gt;
|Режим выдачи значений&lt;br /&gt;
|ValueReturnMode&lt;br /&gt;
|ENUM&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Режим выдачи значений. Режим &amp;quot;Сохраняемые в БД&amp;quot; — данные выдаются сразу после получения архиватором, возможно до фактического сохранения в БД. Режим &amp;quot;Сохраненные в БД&amp;quot; — данные выдаются только после фактической записи в БД на диск.&lt;br /&gt;
|-&lt;br /&gt;
|Коннекторы БД&lt;br /&gt;
|Signals&lt;br /&gt;
|NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Список коннекторов, содержащих сигналы для архивирования.&lt;br /&gt;
|-&lt;br /&gt;
|Текущий размер БД&lt;br /&gt;
|DBCurrentSize&lt;br /&gt;
|INT&lt;br /&gt;
|Только чтение&lt;br /&gt;
|Текущий размер БД, Мб.&lt;br /&gt;
|-&lt;br /&gt;
|Максимальный размер БД&lt;br /&gt;
|DBMaxSize&lt;br /&gt;
|INT&lt;br /&gt;
|Только чтение&lt;br /&gt;
|Максимальный размер БД, Мб.&lt;br /&gt;
|-&lt;br /&gt;
|Состояние БД&lt;br /&gt;
|DBStatus&lt;br /&gt;
|INT&lt;br /&gt;
|Только чтение&lt;br /&gt;
|Текущий статус операций SQLite (числовой код). Для расшифровки см. раздел [[Узлы проекта AgavaSCADA/AgavaPLC#Статусы операций SQLite|Статусы операций SQLite]].&lt;br /&gt;
|-&lt;br /&gt;
|Включить прореживание&lt;br /&gt;
|ThinningEnabled&lt;br /&gt;
|BOOL&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Включение режима прореживания архива. При включении применяется фильтрация по изменению значения.&lt;br /&gt;
|-&lt;br /&gt;
|Тип допуска&lt;br /&gt;
|ToleranceType&lt;br /&gt;
|ENUM&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Тип допуска для прореживания. Возможные значения: &amp;quot;[[Узлы проекта AgavaSCADA/AgavaPLC#Абсолютный допуск|Абсолютные единицы]]&amp;quot;, &amp;quot;[[Узлы проекта AgavaSCADA/AgavaPLC#Процент от последнего значения|Процент от последнего значения]]&amp;quot;, &amp;quot;[[Узлы проекта AgavaSCADA/AgavaPLC#Процент от среднего N последних|Процент от среднего значения]]&amp;quot; и &amp;quot;[[Узлы проекта AgavaSCADA/AgavaPLC#Процент от среднего по временному окну|Процент от среднего значения (окно по времени)]]&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Допуск&lt;br /&gt;
|ThinningTolerance&lt;br /&gt;
|FLOAT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Величина допуска: в абсолютных единицах для режима «Абсолютные единицы», в процентах для режимов «Процент от…».&lt;br /&gt;
|-&lt;br /&gt;
|Период обязательной записи (мс)&lt;br /&gt;
|MandatoryPeriod&lt;br /&gt;
|UINT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Максимальный интервал между записями данных в архив, даже если значение не изменилось.&lt;br /&gt;
|-&lt;br /&gt;
|Размер окна среднего (N)&lt;br /&gt;
|AverageWindowN&lt;br /&gt;
|UINT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|Количество последних значений для расчёта среднего. Используется только в режиме «Процент от среднего значения». В остальных режимах игнорируется.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Статусы операций SQLite ====&lt;br /&gt;
В ходе работы SQLite возвращает статус выполнения операций в виде целочисленных значений. Далее приведена расшифровка этих кодов и возможные пути разрешения ошибок.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Код&lt;br /&gt;
!Расшифровка&lt;br /&gt;
!Что предпринять чтобы починить?&lt;br /&gt;
|-&lt;br /&gt;
|'''0'''&lt;br /&gt;
|Операция выполнена успешно.&lt;br /&gt;
|Не ошибка. Действий не требуется.&lt;br /&gt;
|-&lt;br /&gt;
|'''1'''&lt;br /&gt;
|Общая ошибка выполнения операции.&lt;br /&gt;
|Повторите операцию. Проверьте доступность пути к базе и прав доступа, наличие свободного места на диске, отсутствие блокировки антивирусом/резервным копированием. Перезапустите приложение.&lt;br /&gt;
|-&lt;br /&gt;
|'''2'''&lt;br /&gt;
|Внутренняя ошибка SQLite (ошибка логики).&lt;br /&gt;
|Перезапустите приложение (при необходимости — ПК). Убедитесь, что не запущено несколько копий программы.&lt;br /&gt;
|-&lt;br /&gt;
|'''3'''&lt;br /&gt;
|Недостаточно прав для доступа к файлу или базе данных.&lt;br /&gt;
|Проверьте, что у пользователя или службы, от имени которой работает программа, есть разрешение на чтение и запись в каталог базы данных. Если база на сетевом диске — убедитесь, что доступ не заблокирован.&lt;br /&gt;
|-&lt;br /&gt;
|'''4'''&lt;br /&gt;
|Операция прервана внутренним процессом.&lt;br /&gt;
|Обычно это означает, что выполнение запроса было остановлено из-за внутреннего условия или сигнала прерывания. Повторите операцию. Если ошибка повторяется — перезапустите программу.&lt;br /&gt;
|-&lt;br /&gt;
|'''5'''&lt;br /&gt;
|Файл базы данных удерживается другой программой/процессом.&lt;br /&gt;
|Подождите 5–30 секунд и повторите операцию. Закройте другие копии программы/станции, отчёты, резервное копирование, антивирусное сканирование. Если база на сетевом диске — убедитесь, что её не открывают с других машин.&lt;br /&gt;
|-&lt;br /&gt;
|'''6'''&lt;br /&gt;
|Заблокирована таблица внутри базы.&lt;br /&gt;
|Дождитесь завершения текущей операции в программе. Закройте окна/отчёты, которые используют ту же таблицу. Если запущено несколько экземпляров на одной станции — оставьте один. Перезапустите программу.&lt;br /&gt;
|-&lt;br /&gt;
|'''7'''&lt;br /&gt;
|Недостаточно оперативной памяти.&lt;br /&gt;
|Закройте лишние приложения/тяжёлые отчёты и повторите. Перезапустите программу или ПК. Убедитесь, что хватает ОЗУ и места под файл подкачки. При систематическом повторении — используйте машину с большим объёмом памяти.&lt;br /&gt;
|-&lt;br /&gt;
|'''8'''&lt;br /&gt;
|Попытка записи в базу «только для чтения».&lt;br /&gt;
|Снимите атрибут «Только чтение» с файла .db и каталога. Проверьте права на запись (локально/на сетевой шаре). Убедитесь, что диск/том не смонтирован как «только чтение» и в настройках программы не выбран режим «только чтение».&lt;br /&gt;
|-&lt;br /&gt;
|'''9'''&lt;br /&gt;
|Операция была прервана системой/другим процессом.&lt;br /&gt;
|Повторите операцию и дождитесь завершения. Не закрывайте окно и не переключайте станцию во время выполнения. Убедитесь, что на станции не идут параллельно резервное копирование/антивирусное сканирование. Перезапустите приложение (при необходимости — ПК). Если повторяется — сохраните лог и время сбоя и обратитесь в поддержку.&lt;br /&gt;
|-&lt;br /&gt;
|'''10'''&lt;br /&gt;
|Ошибка чтения/записи на диск.&lt;br /&gt;
|Проверьте свободное место и доступ к диску; исключите блокировку антивирусом; проверьте доступность сетевого пути.&lt;br /&gt;
|-&lt;br /&gt;
|'''11'''&lt;br /&gt;
|Файл базы повреждён.&lt;br /&gt;
|Сделайте копию файла; восстановите из резервной копии. Если её нет — переименуйте/удалите базу (создастся заново; история будет потеряна).&lt;br /&gt;
|-&lt;br /&gt;
|'''12'''&lt;br /&gt;
|Запрошена неподдерживаемая низкоуровневая операция хранения.&lt;br /&gt;
|Если работа продолжается — действий не требуется. Если операция с базой данных не выполняется: перезапустите приложение; проверьте доступность диска/сетевого пути; по возможности временно перенесите базу на локальный диск.&lt;br /&gt;
|-&lt;br /&gt;
|'''13'''&lt;br /&gt;
|На диске закончилось место.&lt;br /&gt;
|Освободите место; уменьшите период хранения; включите разбиение БД на файлы.&lt;br /&gt;
|-&lt;br /&gt;
|'''14'''&lt;br /&gt;
|Не удаётся открыть файл базы.&lt;br /&gt;
|Проверьте путь и существование папки; права доступа; при необходимости укажите новый путь.&lt;br /&gt;
|-&lt;br /&gt;
|'''15'''&lt;br /&gt;
|Ошибка протокола блокировок (нарушен порядок совместного доступа).&lt;br /&gt;
|Закройте все окна/станции, которые используют базу. Подождите 30–60 секунд и запустите снова. Убедитесь, что не идут резервное копирование/антивирусное сканирование. Если база доступна по сети — временно скопируйте её на локальный диск и проверьте работу.&lt;br /&gt;
|-&lt;br /&gt;
|'''16'''&lt;br /&gt;
|Внутренняя ошибка SQLite (служебный код).&lt;br /&gt;
|Перезапустите приложение.&lt;br /&gt;
|-&lt;br /&gt;
|'''17'''&lt;br /&gt;
|Изменилась структура базы во время работы.&lt;br /&gt;
|Закройте другие экземпляры/станции, которые могли менять структуру. Перезапустите приложение. Если база обновлялась — дождитесь завершения обновления.&lt;br /&gt;
|-&lt;br /&gt;
|'''18'''&lt;br /&gt;
|Слишком большой блок данных.&lt;br /&gt;
|Уменьшите размер добавляемых данных.&lt;br /&gt;
|-&lt;br /&gt;
|'''19'''&lt;br /&gt;
|Нарушено ограничение данных (дубликат, пустое обязательное поле и т.п.).&lt;br /&gt;
|Проверьте вводимые значения: уникальные имена/ID, заполнение обязательных полей, корректные ссылки на объекты. Исправьте данные и повторите. Если источник данных внешний — исправьте файл/настройки импорта.&lt;br /&gt;
|-&lt;br /&gt;
|'''20'''&lt;br /&gt;
|Несовместимый тип данных (текст вместо числа и т.п.).&lt;br /&gt;
|Проверьте формат значений и региональные настройки (разделитель дроби, дата/время). Исправьте файл/настройки импорта или параметры тега и повторите.&lt;br /&gt;
|-&lt;br /&gt;
|'''21'''&lt;br /&gt;
|Ошибка использования библиотеки (ошибка приложения).&lt;br /&gt;
|Перезапустите приложение. Убедитесь, что не запускаете несколько конфликтующих копий.&lt;br /&gt;
|-&lt;br /&gt;
|'''22'''&lt;br /&gt;
|Файловая система/операционная система не поддерживает большие файлы/нужные функции.&lt;br /&gt;
|Вероятная причина — устаревшая файловая система или сетевое хранилище. Обратитесь к администратору для переноса базы на современную ФС/носитель. Как временная мера — уменьшите размер базы (сократите период хранения/включите ротацию).&lt;br /&gt;
|-&lt;br /&gt;
|'''23'''&lt;br /&gt;
|Отказ в авторизации (нет прав на действие).&lt;br /&gt;
|Войдите под учётной записью с нужными правами или запросите доступ у администратора. Если используется сеть — проверьте подключение и актуальность прав.&lt;br /&gt;
|-&lt;br /&gt;
|'''24'''&lt;br /&gt;
|Не используется (оставлен для обратной совместимости).&lt;br /&gt;
|Действий не требуется.&lt;br /&gt;
|-&lt;br /&gt;
|'''25'''&lt;br /&gt;
|Неверные параметры запроса (внутренняя ошибка приложения).&lt;br /&gt;
|Перезапустите приложение.&lt;br /&gt;
|-&lt;br /&gt;
|'''26'''&lt;br /&gt;
|Открыт файл, который не является базой данных.&lt;br /&gt;
|Проверьте путь и что выбран именно файл БД. Если файл повреждён — восстановите из резервной копии или создайте новую БД.&lt;br /&gt;
|-&lt;br /&gt;
|'''27'''&lt;br /&gt;
|Уведомление (информационное сообщение).&lt;br /&gt;
|Действий не требуется. В случае частых появлений кода проверьте логи базы данных для выяснения причины.&lt;br /&gt;
|-&lt;br /&gt;
|'''28'''&lt;br /&gt;
|Предупреждение (некритичная проблема).&lt;br /&gt;
|Действий не требуется. В случае частых появлений кода проверьте логи базы данных для выяснения причины.&lt;br /&gt;
|-&lt;br /&gt;
|'''100'''&lt;br /&gt;
|Доступна следующая строка данных.&lt;br /&gt;
|Не ошибка. Действий не требуется.&lt;br /&gt;
|-&lt;br /&gt;
|'''101'''&lt;br /&gt;
|Операция завершена, данных больше нет.&lt;br /&gt;
|Не ошибка. Действий не требуется.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Архиватор PostgreSQL ===&lt;br /&gt;
Архиватор PostgreSQL предназначен для сохранения значений параметров в базы данных под управлением сервера PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
=== Прореживание данных ===&lt;br /&gt;
Прореживание данных — это процесс фильтрации и уменьшения количества точек данных, сохраняемых в архиве. Вместо того чтобы записывать каждое полученное значение, система анализирует поток данных и сохраняет только те значения, которые представляют значимое изменение.&lt;br /&gt;
&lt;br /&gt;
'''Назначение прореживания'''&lt;br /&gt;
&lt;br /&gt;
Поток данных от датчиков и устройств зачастую содержит незначительные колебания (шум) или избыточные данные, когда параметр не меняется. Прореживание решает следующие задачи:&lt;br /&gt;
&lt;br /&gt;
* '''Снижение нагрузки на архив''': Меньшее количество записей означает более быструю работу базы данных.&lt;br /&gt;
* '''Ускорение отображения графиков''': Нужно обрабатывать меньше точек для построения трендов.&lt;br /&gt;
* '''Сохранение только значимых изменений''': Система отфильтровывает шум и оставляет только те изменения, которые важны для анализа технологического процесса.&lt;br /&gt;
'''Общий принцип работы'''&lt;br /&gt;
&lt;br /&gt;
Алгоритм прореживания работает по простому принципу:&lt;br /&gt;
&lt;br /&gt;
# SCADA-система получает новое значение от источника данных.&lt;br /&gt;
# Она сравнивает это значение с последним, которое было сохранено в архив.&lt;br /&gt;
# Если изменение превышает заранее настроенный '''допуск''' (tolerance), новое значение сохраняется.&lt;br /&gt;
# Если изменение меньше допуска, значение пропускается.&lt;br /&gt;
&lt;br /&gt;
Кроме того, существует параметр &amp;quot;'''Период обязательной записи&amp;quot;'''. Если с момента последней записи прошло больше времени, чем указано в этом параметре, новое значение будет сохранено '''независимо от его изменения'''. Это гарантирует, что записи в архив будут сохраняться не реже заданной периодичности, даже если сигнал не меняется. Ключевая идея: &amp;quot;'''Сохраняем только то, что заметно изменилось, но не реже, чем задано&amp;quot;.'''&lt;br /&gt;
&lt;br /&gt;
'''Как подобрать допуск?'''&lt;br /&gt;
&lt;br /&gt;
* '''Слишком малый допуск''' приведёт к записи избыточных данных, и архив будет быстро расти.&lt;br /&gt;
* '''Слишком большой допуск''' может привести к потере мелких, но значимых изменений в сигнале.&lt;br /&gt;
&lt;br /&gt;
Выбор правильного допуска — это компромисс между детализацией данных и размером архива.&lt;br /&gt;
==== Типы алгоритмов прореживания ====&lt;br /&gt;
В системе доступны несколько алгоритмов, которые определяют, как именно вычисляется «значимость» изменения. Выбор алгоритма зависит от характера сигнала и требований к точности данных.&lt;br /&gt;
&lt;br /&gt;
# [[Узлы проекта AgavaSCADA/AgavaPLC#Абсолютный допуск|Абсолютный допуск]]&lt;br /&gt;
# [[Узлы проекта AgavaSCADA/AgavaPLC#Процент от последнего значения|Процент от последнего значения]]&lt;br /&gt;
# [[Узлы проекта AgavaSCADA/AgavaPLC#Процент от среднего N последних|Процент от среднего N последних]]&lt;br /&gt;
# [[Узлы проекта AgavaSCADA/AgavaPLC#Процент от среднего по временному окну|Процент от среднего по временному окну]]&lt;br /&gt;
&lt;br /&gt;
'''Обозначения и определения'''&lt;br /&gt;
&lt;br /&gt;
В дальнейшем используются следующие обозначения (для числовых сигналов):&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;x_{in}&amp;lt;/math&amp;gt;​ — текущее измерение сигнала, полученное от источника данных к моменту обработки (кандидат на запись).&lt;br /&gt;
* &amp;lt;math&amp;gt;x_{ref}&amp;lt;/math&amp;gt; — последнее сохранённое числовое значение сигнала в архиве на момент обработки (опорное значение).&lt;br /&gt;
* &amp;lt;math&amp;gt;|\Delta| = |x_{in} - x_{ref}|&amp;lt;/math&amp;gt; — абсолютная величина изменения между текущим измерением и последним сохранённым значением.&lt;br /&gt;
* &amp;lt;math&amp;gt;\bar{x}_N&amp;lt;/math&amp;gt;​ — арифметическое среднее последних &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; сохранённых числовых значений.&lt;br /&gt;
* &amp;lt;math&amp;gt;\bar{x}_T&amp;lt;/math&amp;gt;​ — среднее всех сохранённых числовых значений, чьи метки времени попадают в временное окно длительности &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; миллисекунд.&lt;br /&gt;
* &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; — машинная точность для чисел двойной точности; используется для формальной проверки «близости к нулю».&lt;br /&gt;
* &amp;lt;math&amp;gt;tolerance&amp;lt;/math&amp;gt; — допуск: абсолютный (в физических единицах) или относительный (в процентах), в зависимости от выбранного алгоритма.&lt;br /&gt;
&lt;br /&gt;
'''Настройки в Свойствах архиватора, общие для всех типов прореживания'''&lt;br /&gt;
&lt;br /&gt;
* '''Включить прореживание''' — включает/выключает применение алгоритма прореживания при записи значений. При выключении все поступающие значения сохраняются без фильтрации.&lt;br /&gt;
* '''Тип допуска''' — выбирает алгоритм сравнения.&lt;br /&gt;
* '''Период обязательной записи (мс)''' — максимальный допустимый промежуток между двумя записями одного сигнала. Если за это время значимого изменения не произошло, ближайшее поступившее значение будет записано принудительно. 0 — отключить принудительную запись.&lt;br /&gt;
&lt;br /&gt;
===== Абсолютный допуск =====&lt;br /&gt;
'''Принцип:'''&lt;br /&gt;
&lt;br /&gt;
Новое значение сохраняется, если модуль изменения больше установленного порога в физических единицах.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;|\Delta| &amp;gt; tolerance&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Когда использовать:'''&lt;br /&gt;
&lt;br /&gt;
* Если диапазон сигнала стабилен и известен заранее.&lt;br /&gt;
* Для параметров вроде температуры, давления, уровня жидкости, где фиксированное изменение имеет одинаковую интерпретацию по всей шкале.&lt;br /&gt;
&lt;br /&gt;
'''Преимущества:'''&lt;br /&gt;
&lt;br /&gt;
* Обеспечивает предсказуемое и детерминированное поведение независимо от текущего масштаба значения.&lt;br /&gt;
* Не требует накопления или хранения дополнительных данных (окон/истории), вычислительно прост.&lt;br /&gt;
* Удобен при наличии нормативно заданных пределов точности в физических единицах.&lt;br /&gt;
&lt;br /&gt;
'''Ограничения:'''&lt;br /&gt;
&lt;br /&gt;
* Не масштабируется на широкий динамический диапазон: один и тот же порог может быть слишком грубым для малых значений и слишком чувствительным для больших.&lt;br /&gt;
* Требует аккуратного подбора порога под единицы измерения и разрешение датчика; при неверной калибровке возможны либо избыточные записи, либо потеря значимых мелких изменений.&lt;br /&gt;
* Не учитывает относительный контекст изменения (например, 1 единица при значении 10 и при значении 10 000 трактуется одинаково).&lt;br /&gt;
&lt;br /&gt;
'''Настройки в Свойствах архиватора:'''&lt;br /&gt;
&lt;br /&gt;
* '''Допуск''' — абсолютный порог в физических единицах сигнала. Определяет значение &amp;lt;math&amp;gt;tolerance&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Процент от последнего значения =====&lt;br /&gt;
'''Принцип:'''&lt;br /&gt;
&lt;br /&gt;
Новое значение сохраняется, если относительное изменение относительно последнего сохранённого превышает заданный процент.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\frac{|\Delta|}{|x_{ref}|} \times{100} &amp;gt; tolerance&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Когда использовать:'''&lt;br /&gt;
&lt;br /&gt;
* Для сигналов, где важна относительная динамика, а не абсолютные величины.&lt;br /&gt;
* Для показателей с большим динамическим диапазоном, где относительная точность должна быть сопоставима на всех уровнях.&lt;br /&gt;
&lt;br /&gt;
'''Преимущества:'''&lt;br /&gt;
&lt;br /&gt;
* Масштабируемость: одинаково интерпретирует относительные изменения на низких и высоких уровнях сигнала.&lt;br /&gt;
* Не требует хранения окна значений; использует только последнее сохранённое значение, поэтому вычислительно лёгок.&lt;br /&gt;
* Быстро и корректно реагирует на пропорциональные изменения процесса (проценты), поддерживая заданную относительную чувствительность.&lt;br /&gt;
&lt;br /&gt;
'''Ограничения:'''&lt;br /&gt;
&lt;br /&gt;
* В окрестности нуля относительная метрика становится нестабильной (см. [[Узлы проекта AgavaSCADA/AgavaPLC#Примечание к алгоритмам 'Процент от…'|примечание]]).&lt;br /&gt;
* При малых базовых значениях возможна повышенная чувствительность к шуму и микроколебаниям.&lt;br /&gt;
* Не подавляет высокочастотный шум сам по себе: при необходимости сочетать с обязательной записью по времени и корректной настройкой допуска.&lt;br /&gt;
&lt;br /&gt;
'''Настройки в Свойствах архиватора:'''&lt;br /&gt;
&lt;br /&gt;
* '''Допуск''' — относительный порог в процентах. Определяет значение &amp;lt;math&amp;gt;tolerance&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===== Процент от среднего N последних =====&lt;br /&gt;
'''Принцип:'''&lt;br /&gt;
&lt;br /&gt;
Новое значение сохраняется, если изменение больше заданного процента от среднего по последним N сохранённым значениям.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\frac{|\Delta|}{|\bar{x}_{N}|} \times{100} &amp;gt; tolerance&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Когда использовать:'''&lt;br /&gt;
&lt;br /&gt;
* Для сигналов с постоянным шумом или пульсациями, когда важно снижать чувствительность к случайным отклонениям.&lt;br /&gt;
* Для процессов с умеренной динамикой, где требуется устойчивость к «зубчатым» колебаниям.&lt;br /&gt;
&lt;br /&gt;
'''Преимущества:'''&lt;br /&gt;
&lt;br /&gt;
* Снижает чувствительность к высокочастотному шуму за счёт опоры на усреднение; сокращает объём записей на стационарных участках.&lt;br /&gt;
* Гибко настраивается параметром &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;: увеличение окна повышает устойчивость, уменьшение — повышает чувствительность и снижает задержку реакции.&lt;br /&gt;
&lt;br /&gt;
'''Ограничения:'''&lt;br /&gt;
&lt;br /&gt;
* В окрестности нуля относительная метрика становится нестабильной (см. [[Узлы проекта AgavaSCADA/AgavaPLC#Примечание к алгоритмам 'Процент от…'|примечание]]).&lt;br /&gt;
&lt;br /&gt;
* Инерционность: при резких скачках возможна задержка фиксации изменения, особенно при большом &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Усреднение может «сглаживать» и не фиксировать кратковременные, но важные пики; не подходит для задач, критичных к коротким экстремумам.&lt;br /&gt;
* Предполагает относительно стабильную частоту выборок; при сильно переменной частоте эффективная «временная» ширина окна становится непредсказуемой.&lt;br /&gt;
&lt;br /&gt;
'''Настройки в Свойствах архиватора:'''&lt;br /&gt;
&lt;br /&gt;
* '''Допуск''' — относительный порог в процентах. Определяет значение &amp;lt;math&amp;gt;tolerance&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* '''Размер окна среднего (&amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;)''' — число последних сохранённых значений, по которым считается среднее. Большее &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; повышает устойчивость к шуму, но увеличивает инерционность реакции.&lt;br /&gt;
&lt;br /&gt;
===== Процент от среднего по временному окну =====&lt;br /&gt;
'''Принцип:'''&lt;br /&gt;
&lt;br /&gt;
Похож на предыдущий, но среднее считается не по количеству точек, а по всем значениям за заданный интервал времени.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;\frac{|\Delta|}{|\bar{x}_{T}|} \times{100} &amp;gt; tolerance&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Когда использовать:'''&lt;br /&gt;
&lt;br /&gt;
* Для сигналов с непостоянной частотой измерений (событийные, неравномерные потоки).&lt;br /&gt;
* В случаях, когда важно учитывать реальную временную протяжённость усреднения независимо от плотности измерений.&lt;br /&gt;
&lt;br /&gt;
'''Преимущества:'''&lt;br /&gt;
&lt;br /&gt;
* Корректно работает при переменной частоте выборок: окно фиксируется по времени, а не по числу точек.&lt;br /&gt;
* Более реалистично оценивает тренд во времени на участках с неравномерными измерениями.&lt;br /&gt;
* Управляемый компромисс между подавлением шума и чувствительностью за счёт выбора длительности окна.&lt;br /&gt;
&lt;br /&gt;
'''Ограничения:'''&lt;br /&gt;
&lt;br /&gt;
* В окрестности нуля относительная метрика становится нестабильной (см. [[Узлы проекта AgavaSCADA/AgavaPLC#Примечание к алгоритмам 'Процент от…'|примечание]]).&lt;br /&gt;
&lt;br /&gt;
* Более высокая ресурсоёмкость: требуется хранить и периодически «очищать» значения по условию выхода из временного окна; потребление памяти зависит от фактической скорости поступления данных.&lt;br /&gt;
* Инерционность, присущая усреднению: возможна задержка фиксации коротких, но значимых пиковых изменений.&lt;br /&gt;
* Критичен выбор длительности окна: слишком малое окно даёт мало подавления шума, слишком большое — чрезмерную инерцию и риск пропуска кратких событий.&lt;br /&gt;
&lt;br /&gt;
'''Настройки в Свойствах архиватора:'''&lt;br /&gt;
&lt;br /&gt;
* '''Допуск''' — относительный порог в процентах. Определяет значение &amp;lt;math&amp;gt;tolerance&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* '''Интервал архивирования''' — длительность временного окна &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (мс), в пределах которого вычисляется среднее. При увеличении &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; растёт сглаживание и уменьшается чувствительность к кратким всплескам; при уменьшении — наоборот. Значения, чьи метки времени выходят за пределы окна, автоматически исключаются из расчёта.&lt;br /&gt;
&lt;br /&gt;
==== Примечание к алгоритмам 'Процент от…' ====&lt;br /&gt;
При малых опорных значениях система автоматически переходит в абсолютный режим, чтобы избежать деления на величину, близкую к нулю, и связанных с этим скачков чувствительности. Этот механизм применяется ко всем алгоритмам, использующим относительное сравнение: «Процент от последнего», «Процент от среднего N», «Процент от среднего по временному окну» и обеспечивает стабильность критерия при слабых сигналах.&lt;br /&gt;
&lt;br /&gt;
* Условия входа в режим абсолютного допуска:&lt;br /&gt;
** для «Процента от последнего»: &amp;lt;math&amp;gt;|x_{ref}| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
** для «Процента от среднего N»: &amp;lt;math&amp;gt;|\bar{x}_{N}| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;;&lt;br /&gt;
** для «Процента от среднего по времени»: &amp;lt;math&amp;gt;|\bar{x}_{T}| &amp;lt; \varepsilon&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Критерий в режиме абсолютного допуска: значение фиксируется, если &amp;lt;math&amp;gt;|\Delta| &amp;gt; tolerance&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Условие выхода: как только соответствующая базовая величина (&amp;lt;math&amp;gt;|x_{ref}|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;|\bar{x}_{N}|&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;|\bar{x}_{T}|&amp;lt;/math&amp;gt;) становится &amp;lt;math&amp;gt;\geq \varepsilon&amp;lt;/math&amp;gt;, система автоматически возвращается к относительному критерию.&lt;br /&gt;
* Трактовка &amp;lt;math&amp;gt;tolerance&amp;lt;/math&amp;gt;: используется то же значение настройки; в абсолютном режиме оно интерпретируется как порог в физических единицах сигнала.&lt;br /&gt;
&lt;br /&gt;
==== Сравнение алгоритмов прореживания данных ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Критерий&lt;br /&gt;
!Абсолютный&lt;br /&gt;
!% от последнего&lt;br /&gt;
!% от среднего N&lt;br /&gt;
!% от среднего по времени&lt;br /&gt;
|-&lt;br /&gt;
|Единицы допуска&lt;br /&gt;
|Физические&lt;br /&gt;
|Проценты&lt;br /&gt;
|Проценты&lt;br /&gt;
|Проценты&lt;br /&gt;
|-&lt;br /&gt;
|Устойчивость к шуму&lt;br /&gt;
|Низкая&lt;br /&gt;
|Средняя&lt;br /&gt;
|Высокая&lt;br /&gt;
|Высокая&lt;br /&gt;
|-&lt;br /&gt;
|Реакция на резкие скачки&lt;br /&gt;
|Быстрая&lt;br /&gt;
|Быстрая&lt;br /&gt;
|Задержка (при большом N)&lt;br /&gt;
|Задержка&lt;br /&gt;
|-&lt;br /&gt;
|Подходит при переменной частоте&lt;br /&gt;
|Да&lt;br /&gt;
|Да&lt;br /&gt;
|Нет&lt;br /&gt;
|Да&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Система журналирования==&lt;br /&gt;
Система ведения журналов событий предназначена для управления регистрацией и хранением событий. В базу данных записываются все системные события и события, генерируемые с помощью [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.A1.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0 .D1.82.D1.80.D0.B5.D0.B2.D0.BE.D0.B3|системы тревог]], которые соответствуют выбранному уровню сообщений.&lt;br /&gt;
&lt;br /&gt;
Для ведения журналов используются узлы типа &amp;quot;Логгер&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Порядок настройки системы===&lt;br /&gt;
Порядок настройки системы журналирования следующий:&lt;br /&gt;
&lt;br /&gt;
#Добавить и [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.9F.D0.BE.D1.80.D1.8F.D0.B4.D0.BE.D0.BA .D0.BD.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9.D0.BA.D0.B8 .D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D1.8B|настроить систему тревог]] для генерации событий.&lt;br /&gt;
#Добавить в проект систему журналирования. Для этого нажать ПКМ по узлу «Станция» в дереве проекта, затем выбрать «Добавить узел» - «Система» - «Система журналирования».&lt;br /&gt;
#Добавить в систему журналирования логгер. Для этого нажать ПКМ по узлу «Система архивации» в дереве проекта, затем нажать «Добавить узел» и выбрать нужный логгер.&lt;br /&gt;
#Настроить параметры логгера (см. разделы ниже).&lt;br /&gt;
&lt;br /&gt;
=== Логгер SQLite===&lt;br /&gt;
Логгер SQLite предназначен для сохранения событий, возникающих в ходе исполнения прикладной программы в СУБД SQLite.&lt;br /&gt;
&lt;br /&gt;
Логгер позволяет настраивать срок хранения событий, уровень сохраняемых событий и включать режим разбиения базы данных на отдельные файлы, содержащие данные только за одни сутки.&lt;br /&gt;
&lt;br /&gt;
Информацию о событиях в базе данных, которую ведет логгер, можно просмотреть с помощью виджета &amp;quot;Список событий&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Логгер файловый ===&lt;br /&gt;
Логгер файловый предназначен для сохранения журналов событий в текстовых файлах на накопителе. Логгер имеет минимальное количество настроек, и обычно используется для сохранения журнала событий в случае необходимости отладки работы прикладной программы без среды разработки.&lt;br /&gt;
&lt;br /&gt;
===Логгер SMS===&lt;br /&gt;
Логгер SMS предназначен для SMS информирования с помощью субмодуля GRPS или внешнего GPRS модема. &lt;br /&gt;
&lt;br /&gt;
Принцип работы логгера следующий:&lt;br /&gt;
&lt;br /&gt;
#Логгер принимает возникающие события, фильтрует их согласно установленного уровня событий и выбранных групп.&lt;br /&gt;
#События, прошедшие фильтрацию, форматируются согласно установленного шаблона.&lt;br /&gt;
#Отформатированные сообщения отправляются через подключенный модем в виде SMS сообщения. Отправка сообщений производится на телефонные номера, записанные в телефонной книге на SIM-карте.&lt;br /&gt;
&lt;br /&gt;
==Система проверки прав пользователей==&lt;br /&gt;
[[Файл:AgavaPLC-Окно привилегий.png|мини|494x494пкс|Окно привилегий]]&lt;br /&gt;
Система реализует механизм контроля доступа к узлам проекта и их функциях на основе ролей. Узлы при выполнении действий проверяют наличие установленных привилегий у авторизованного в данный момент пользователя. &lt;br /&gt;
&lt;br /&gt;
=== Роли и пользователи ===&lt;br /&gt;
Система содержит в себе две подсистемы:&lt;br /&gt;
*Пользователи. Подсистема определяет пользователей, каждому из которых назначается логин/пароль и одна или несколько ролей.&lt;br /&gt;
*Роли. Роли хранят наборы доступных привилегий.&lt;br /&gt;
Отношения между пользователями, ролями и привилегиями можно описать следующим образом:&lt;br /&gt;
&lt;br /&gt;
* Один пользователь может иметь несколько ролей.&lt;br /&gt;
* Одну роль могут иметь несколько пользователей.&lt;br /&gt;
* Одна роль может иметь несколько привилегий.&lt;br /&gt;
* Одна привилегия может принадлежать нескольким ролям.&lt;br /&gt;
&lt;br /&gt;
=== Привилегии ===&lt;br /&gt;
[[Файл:AgavaPLC-Система проверки прав пользователей.png|мини|Система проверки прав пользователей]]&lt;br /&gt;
Для узлов системы доступна установка следующих привилегий:&lt;br /&gt;
&lt;br /&gt;
Все узлы: &lt;br /&gt;
&lt;br /&gt;
*Чтение значения.&lt;br /&gt;
*Запись значения.&lt;br /&gt;
Окна и фреймы:&lt;br /&gt;
*Открытие окна.&lt;br /&gt;
*Закрытие окна.&lt;br /&gt;
&lt;br /&gt;
При установке привилегий на какой-либо узел, все подчиненные узлы получают те же привилегии с флагом &amp;quot;унаследована&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Если привилегия не установлена, то считается что действие, регулируемое привилегией, запрещено.&lt;br /&gt;
&lt;br /&gt;
Значение унаследованных привилегий можно переопределить с помощью явного задания привилегии.&lt;br /&gt;
===Порядок настройки системы===&lt;br /&gt;
Привилегии настраиваются в отдельном окне привилегий, доступном в меню &amp;quot;Вид&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Порядок настройки системы проверки прав следующий:&lt;br /&gt;
&lt;br /&gt;
#Добавить в проект систему проверки прав пользователей. Для этого нажать ПКМ по узлу «Станция» в дереве проекта, затем выбрать «Добавить узел» - «Система» - «Система проверки прав пользователей».&lt;br /&gt;
#Добавить в систему проверки прав пользователей узел «Роль». Для этого нажать ПКМ по узлу «Система проверки прав пользователей» в дереве проекта, затем выбрать «Добавить узел» - «Роли».&lt;br /&gt;
#Добавить в узел «Роли» необходимые роли. Для этого нажать ПКМ по узлу «Роли» в дереве проекта, затем выбрать «Добавить узел» - «Роль».&lt;br /&gt;
#Для каждой роли настроить привилегии в окне привилегий. Для этого необходимо нажать «Вид» - «Открыть привилегии». В открывшемся окне в выпадающем списке «Пользователь / роль» выбрать нужную роль. Затем, нажимая ПКМ по узлам и выбирая «Добавить привилегию» настроить все необходимые ограничения для данной роли.&lt;br /&gt;
#Добавить в систему проверки прав пользователей узел «Пользователи». Для этого нажать ПКМ по узлу «Система проверки прав пользователей» в дереве проекта, затем выбрать «Добавить узел» - «Пользователи».&lt;br /&gt;
#Добавить в узел «Пользователи» необходимых пользователей. Для этого нажать ПКМ по узлу «Пользователи» в дереве проекта, затем выбрать «Добавить узел» - «Пользователи».&lt;br /&gt;
#Для каждого пользователя указать имя и пароль, которые будут использоваться при авторизации, и выбрать одну или несколько ролей.&lt;br /&gt;
&lt;br /&gt;
== Сигналы, источники и операции ==&lt;br /&gt;
Регистры и другие узлы, добавленные в группу «Сигналы», являются внутренними для проекта и могут менять свои значения только с помощь скриптов или других узлов, с которыми они связаны.&lt;br /&gt;
&lt;br /&gt;
Сигналы содержат в себе несколько подгрупп.&lt;br /&gt;
&lt;br /&gt;
=== Сигнал===&lt;br /&gt;
Сигнал - специальный тип узла, хранящий значение узла типа &amp;quot;источник&amp;quot;. Сигналы могут использоваться для хранения значений нескольких источников, модифицировать их, обладать дополнительными полями и т. д.&lt;br /&gt;
&lt;br /&gt;
Сигналы некоторых типов позволяют модифицировать исходное значение источников. Принцип обработки значения источника или сигнала с помощью операций: &lt;br /&gt;
&lt;br /&gt;
Первичное значение поступает на вход операции, производится вычисление. Если есть еще операции, то вычисленное значение после первой операции передается на вход второй. И так далее по всем операциям. Если операций больше нет, вычисленное значение устанавливается в качестве значения узла. &lt;br /&gt;
&lt;br /&gt;
Все операции выполняются в порядке, в котором они заданы в соответствующих свойствах.&lt;br /&gt;
&lt;br /&gt;
====Сигнал простой====&lt;br /&gt;
Узел типа &amp;quot;Сигнал простой&amp;quot; предназначен для хранения и обработки значения источника, или другого сигнала или операции. Позволяет произвести какие-либо действия с этим значением с помощью добавления нужных операций в свойство «Операции после чтения».&lt;br /&gt;
&lt;br /&gt;
====Постоянная ====&lt;br /&gt;
Узел типа &amp;quot;Постоянная&amp;quot; предназначен для хранения данных выбранного формата и позволяет изменять их в ходе выполнения программы. Связывание с источником не предусмотрено. Изменение осуществляется с помощью специализированных функций или блока установки значения в задаче ПЛК.&lt;br /&gt;
&lt;br /&gt;
====Массив====&lt;br /&gt;
Массив - совокупность каких-либо объектов, указанных в свойстве «Входные значения». Нумерация объектов в массиве начинается с 0. Может использоваться для взаимодействия с демультиплексором.&lt;br /&gt;
&lt;br /&gt;
====Сигнал комплексный====&lt;br /&gt;
Сигнал используется для взаимодействия с виджетом «Цифровой индикатор». Позволяет контролировать входное значение и генерировать события переходу входного значения через уставки.&lt;br /&gt;
&lt;br /&gt;
Содержит в себе свойства для настройки следующих параметров:&lt;br /&gt;
&lt;br /&gt;
*ВАУ – верхняя аварийная уставка;&lt;br /&gt;
*ВПУ - верхняя предаварийная уставка;&lt;br /&gt;
*НПУ - нижняя предаварийная уставка;&lt;br /&gt;
*НАУ – нижняя аварийная уставка;&lt;br /&gt;
*ФНЧ – фильтр низких частот.&lt;br /&gt;
&lt;br /&gt;
===Источник===&lt;br /&gt;
Источник - специальный тип узлов, предназначенных для передачи данных от внешних устройств.&lt;br /&gt;
&lt;br /&gt;
====Регистр Modbus====&lt;br /&gt;
Регистр Modbus используется для приема и передачи данных по протоколам Modbus-RTU, Modbus-TCP. Данный тип узов также может использоваться для организации работы некоторых алгоритмов программы (например для взаимодействия с контроллером событий).&lt;br /&gt;
&lt;br /&gt;
====Источник индексный====&lt;br /&gt;
Узел типа &amp;quot;Источник индексный&amp;quot; используется для обработки данных, полученных по протоколу Upd, а так же в массивах для индексации значений.&lt;br /&gt;
&lt;br /&gt;
===Операция===&lt;br /&gt;
[[Файл:AgavaPLC-Входные значения операций.png|мини|Входные значения операций]]&lt;br /&gt;
Узлы типа &amp;quot;Операция&amp;quot; используются для реализации вычислительных алгоритмов в задаче ПЛК или отдельно, при их размещении в группе &amp;quot;Сигналы&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
В качестве входных значений операций выбираются константные числа, другие узлы группы «Сигналы», регистры или блоки задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
====Операция «Сложение»====&lt;br /&gt;
Выходным значением является сумма входных значений. В качестве входных значений можно выбирать как узлы, так и конкретные числа формата int или double.&lt;br /&gt;
&lt;br /&gt;
====Операция «Вычитание»====&lt;br /&gt;
Выходным значением является разность первого входного значения и суммы всех последующих значений. В качестве входных значений можно выбирать как узлы, так и конкретные числа формата int или double.&lt;br /&gt;
&lt;br /&gt;
====Операция «Умножение»====&lt;br /&gt;
Выходным значением является произведение значений всех входных значений. В качестве входных значений можно выбирать как узлы, так и конкретные числа формата int или double.&lt;br /&gt;
&lt;br /&gt;
====Операция «Деление»====&lt;br /&gt;
Выходным значением является результат от деления первого входного значения на произведение всех последующих значений. В качестве входных значений можно выбирать как узлы, так и конкретные числа формата int или double.&lt;br /&gt;
&lt;br /&gt;
====Операция «Условие»====&lt;br /&gt;
Узел типа &amp;quot;Операция условие&amp;quot; предназначен для сравнения значений двух узлов. Для условия задаются сравниваемые параметры и выбирается режим сравнения. В качестве входных значений можно выбирать как узлы, так и конкретные числа формата int или double.&lt;br /&gt;
&lt;br /&gt;
====Операция «Пара условий»====&lt;br /&gt;
[[Файл:AgavaPLC-Операция «Пара условий».png|мини|Операция «Пара условий»]]&lt;br /&gt;
Операция содержит в себе два условия. Для каждого условия задаются индивидуальные сравнимаемые параметры и выбирается режим сравнения.&lt;br /&gt;
&lt;br /&gt;
Выходное значение операции зависит от ее режима проверки – при выбранном режиме «Логическое ИЛИ» выходное значение равно логической «1» если одно из условий равно «1», при «Логическом И»- если оба условия равны «1».&lt;br /&gt;
&lt;br /&gt;
====Операция «Логическое ИЛИ»====&lt;br /&gt;
Если одно из входных значений становится равно логической «1» (контакты замкнуты), то выходное значение становится логической «1» (выход включен).&lt;br /&gt;
&lt;br /&gt;
====Операция «Логическое И»====&lt;br /&gt;
Если все входные значения становятся равны логической «1», выходное значение становится логической «1» (выход включен).&lt;br /&gt;
&lt;br /&gt;
====Операция «Логическое НЕ»====&lt;br /&gt;
Если входное значение блока становится равно логическому «0», то выходное значение становится логической «1», и наоборот.&lt;br /&gt;
&lt;br /&gt;
====Операция «Таймер»====&lt;br /&gt;
Таймер предназначен для выполнения каких-либо [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.94.D0.B5.D0.B9.D1.81.D1.82.D0.B2.D0.B8.D1.8F|действий]] через одинаковые промежутки времени (например запись значения в узел). Промежуток между исполнениями действий задается в свойстве «Интервал срабатывания», а сами действия в свойстве «Действия OnTimer». Для работы операции ее необходимо добавить в свойство «Узлы» [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B8|задачи]] с периодическим или разовым режимом выполнения.&lt;br /&gt;
&lt;br /&gt;
====Операция «Мультиплексор»====&lt;br /&gt;
Мультплексор осуществляет перевод нескольких булевых переменных в целочисленное значение по формуле: «выход = вход1 + вход2*2^1 + вход3*2^2 + ...». &lt;br /&gt;
&lt;br /&gt;
Например если в качестве входных значений указаны два регистра, то выходное значение мультиплексора будет формироваться следующим образом:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Значение регистра 1&lt;br /&gt;
!Значение регистра 2&lt;br /&gt;
!Выходное значение&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Операция «Демультиплексор»====&lt;br /&gt;
Демультиплексор осуществляет перевод целочисленных значений из массива в несколько булевых переменных, при этом включается выход, номер которого соответствует числу из массива (например первый элемент массива равен 5, на пятом выходе появится значение true). Нумерация выходов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
====Операция «Генератор случайного числа»====&lt;br /&gt;
Выходным значением является случайное число в диапазоне между указанным минимальным и максимальным значениями. Для работы операции ее необходимо добавить в свойство «Узлы» [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B8|задачи]] с периодическим или разовым режимом выполнения.&lt;br /&gt;
&lt;br /&gt;
====Операция «Скрипт С++»====&lt;br /&gt;
Операция «Скрипт С++» предназначена для реализации разнообразных алгоритмов на языке С++. Операция предусматривает реализацию одной или нескольких функций, выполняющих необходимые пользователю действия. &lt;br /&gt;
&lt;br /&gt;
Для выполнения скрипта, можно добавить в свойство «Узлы» [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.97.D0.B0.D0.B4.D0.B0.D1.87.D0.B8|задачи]] с периодическим или разовым режимом выполнения. Другим способом вызова срабатывания скрипта является добавление его в [[Узлы проекта AgavaSCADA/AgavaPLC#.D0.94.D0.B5.D0.B9.D1.81.D1.82.D0.B2.D0.B8.D0.B5 .C2.AB.D0.92.D1.8B.D0.BF.D0.BE.D0.BB.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5 .D1.81.D0.BA.D1.80.D0.B8.D0.BF.D1.82.D0.B0.C2.BB|действие «Выполнение скрипта»]].&lt;br /&gt;
&lt;br /&gt;
Пример скрипта, выполняющего получение значения определенного узла и запись измененного значения в другой узел:&lt;br /&gt;
 float val()&lt;br /&gt;
 {&lt;br /&gt;
     float f = GetNodeValueAsFloat(&amp;quot;/Конфигурация1/stationSimple1/Signals1/Random2&amp;quot;);&lt;br /&gt;
     float f1 = f*100.0;&lt;br /&gt;
     SetNodeValueAsFloat(&amp;quot;/Конфигурация1/stationSimple1/Signals1/Constant3&amp;quot;, f1);&lt;br /&gt;
     return f*10.0;&lt;br /&gt;
 }&lt;br /&gt;
Приведенный выше скрипт возвращает исходное значение, умноженное на 10. Возвращаемое таким образом значение записывается в выход операции для возможности считывания в других операциях, скриптах и т. д.&lt;br /&gt;
&lt;br /&gt;
Скрипты могут возвращать значения следующих типов:&lt;br /&gt;
&lt;br /&gt;
*void;&lt;br /&gt;
*float;&lt;br /&gt;
*double;&lt;br /&gt;
*int.&lt;br /&gt;
&lt;br /&gt;
Подробное описание реализации языка С++ в AgavaSCADA/AgavaPLC приведено на странице &amp;quot;[[Описание языка С++ в AgavaPLC]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Объект===&lt;br /&gt;
Узлы типа &amp;quot;Объект&amp;quot; предназначены для взаимодействия с аппаратными компонентами контроллера. Для всех объектов, являющихся субмодулями, необходимо указать слот, в котором они установлены. Доступ к значениям входов/выходов субмодуля осуществляется через его вложенные узлы.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК процессорный модуль''' &lt;br /&gt;
&lt;br /&gt;
Предоставляет возможность регулирования подсветки экрана; включения и отключения индикаторов работы, аварии и программы.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК субмодуль DI'''&lt;br /&gt;
&lt;br /&gt;
Позволяет получать доступ к значениям входов субмодуля DI.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК субмодуль R'''&lt;br /&gt;
&lt;br /&gt;
Позволяет управлять значениями выходов субмодуля R.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК субмодуль SIM'''&lt;br /&gt;
&lt;br /&gt;
Позволяет управлять значениями выходов субмодуля SIM.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК субмодуль DO6'''&lt;br /&gt;
&lt;br /&gt;
Позволяет управлять значениями выходов субмодуля DO6.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК субмодуль AI'''&lt;br /&gt;
&lt;br /&gt;
Позволяет получать доступ к значениям входов субмодуля AI и задавать их тип.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК субмодуль AIO'''&lt;br /&gt;
&lt;br /&gt;
Позволяет получать доступ к значениям входов субмодуля AIO, управлять значениями выходов и задавать тип входов и выходов.&lt;br /&gt;
&lt;br /&gt;
'''ПЛК субмодуль TMP'''&lt;br /&gt;
&lt;br /&gt;
Позволяет получать доступ к значениям входов субмодуля TMP и задавать их тип.&lt;br /&gt;
&lt;br /&gt;
==Задачи==&lt;br /&gt;
Группа «Задачи» предназначена для группировки узлов типа «Задача», которые используются для циклического или разового выполнения созданных пользователем алгоритмов.&lt;br /&gt;
&lt;br /&gt;
===Задача ПЛК===&lt;br /&gt;
Данный узел предоставляет возможности для связывания между собой других узлов (таких как сигналы, субмодули ПЛК, постоянные и т. д.) в удобной графической форме (см. Рисунок 64). Для перехода к редактору необходимо щелкнуть правой кнопкой мыши на задачу ПЛК и выбрать в открывшемся контекстном меню команду «Открыть графическое представление» или дважды щелкнуть левой кнопкой мыши на задаче ПЛК в дереве проекта.&lt;br /&gt;
&lt;br /&gt;
Рисунок 64 – Окно графического редактирования задачи «ПЛК-60»&lt;br /&gt;
&lt;br /&gt;
Панель инструментов задачи ПЛК, расположенная в верхней части окна, содержит следующие элементы (см. Рисунок 16):&lt;br /&gt;
&lt;br /&gt;
*Выпадающий список выбора режима подписи портов.&lt;br /&gt;
*Выпадающий список выбора режима подписи блоков.&lt;br /&gt;
*Кнопка запуска режима симулятора.&lt;br /&gt;
*Кнопка запуска онлайн отладки.&lt;br /&gt;
*Кнопка печати задачи.&lt;br /&gt;
*Инструменты управления симуляцией.&lt;br /&gt;
&lt;br /&gt;
Добавлять узлы в задачу можно перетаскиванием мышью из окна функциональных блоков или из окна дерева проекта. Для связывания узлов между собой необходимо, зажав левую кнопку мыши на выходе одного узла, протянуть линию ко входу другого и затем отпустить левую кнопку мыши для соединения блоков. &lt;br /&gt;
&lt;br /&gt;
Созданную связь можно удалить, выделив ее левой кнопкой мыши и нажав клавишу &amp;quot;Del&amp;quot;. Связь можно &amp;quot;разорвать&amp;quot;, то есть добавить разрыв, нажав по ней правой кнопкой мыши и выбрав в контекстном меню команду «Добавить разрыв». &lt;br /&gt;
&lt;br /&gt;
Для выделения нескольких блоков рамкой зажмите клавишу &amp;quot;Shift&amp;quot; и выделяйте блоки мышью с нажатой левой кнопкой.&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК предоставляет возможности для проведения тестирования и отладки проекта, описанные в разделе [[#Проверка и отладка проекта]].&lt;br /&gt;
&lt;br /&gt;
====Блоки задачи ПЛК====&lt;br /&gt;
Помимо операций, описанных в разделе [[#Операция]], для реализации алгоритмов в задачу ПЛК можно добавлять блоки, описанные ниже.&lt;br /&gt;
&lt;br /&gt;
'''Функциональный блок'''&lt;br /&gt;
&lt;br /&gt;
Используется для выделения каких-либо действий в отдельный блок, для упрощения понимания работы алгоритма программы. Содержит входы, выходы и блоки, обеспечивающие работу внутренней логики. Позволяет проводить изолированную отладку, при которой значения на входах функционального блока вручную задаются пользователем. Блок, работающий в данном режиме выделяется черной рамкой. Для включения изолированной отладки необходимо открыть блок и нажать кнопку «Изолированная отладка» на панели управления задачей.&lt;br /&gt;
&lt;br /&gt;
'''Блок установки значения'''&lt;br /&gt;
&lt;br /&gt;
Блок осуществляет запись значения, поданного на вход in0, в узел, указанный в свойстве «Узел для чтения/записи»&lt;br /&gt;
&lt;br /&gt;
'''Блок задержки'''&lt;br /&gt;
&lt;br /&gt;
Блок задержки используется для создания задержки передачи значения с входа блока на выход на один цикл обработки задачи.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Битовое OR»'''&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения будет произведена операция &amp;quot;ИЛИ&amp;quot; над каждым битом значения в отдельности. Например: 1010 OR 0110 = 1110&lt;br /&gt;
&lt;br /&gt;
'''Блок «Логическое И»'''&lt;br /&gt;
&lt;br /&gt;
Если все входные значения становятся равны логической «1», выходное значение становится логической «1» (выход включен).&lt;br /&gt;
&lt;br /&gt;
'''Блок «Битовое AND»'''&lt;br /&gt;
&lt;br /&gt;
Для вычисления значения будет произведена операция &amp;quot;И&amp;quot; над каждым битом значения в отдельности. Если все биты, стоящие на одинаковых позициях в двоичных представлениях значений, поступающих на входы блока, равны логической «1», то на выходе элемента в этой позиции появляется логическая «1» (выход включен). Например: 1010 AND 0110 = 0010&lt;br /&gt;
&lt;br /&gt;
'''Блок «Логическое НЕ»'''&lt;br /&gt;
&lt;br /&gt;
Если входное значение блока становится равно логическому «0», то выходное значение становится логической «1», и наоборот.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Битовое XOR»'''&lt;br /&gt;
&lt;br /&gt;
Если только на один из входов блока функции поступает логическая «1», то на выходе элемента появляется логическая «1». Если на входы блока функции поступают целочисленные значения, то операция будет произведена над каждым битом значения в отдельности. Например: 1010 XOR 0110 = 1100&lt;br /&gt;
&lt;br /&gt;
'''Блок «Битовое SHR»'''&lt;br /&gt;
&lt;br /&gt;
Побитовый логический сдвиг вправо используется для выполнения операции побитового логического сдвига операнда X вправо на N бит с дополнением нулями слева.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Битовое SHL»'''&lt;br /&gt;
&lt;br /&gt;
Побитовый логический сдвиг влево используется для выполнения операции побитового логического сдвига операнда X влево на N бит с дополнением нулями справа.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Таймер»'''&lt;br /&gt;
&lt;br /&gt;
Таймер предназначен для выполнения каких-либо действий (см. раздел 4.6) через одинаковые промежутки времени (например запись значения в узел).&lt;br /&gt;
&lt;br /&gt;
'''Блок «Мультиплексор»'''&lt;br /&gt;
&lt;br /&gt;
Мультплексор осуществляет перевод нескольких булевых переменных в целочисленное значение по формуле: «выход = вход1 + вход2*2^1 + вход3*2^2 + ...»&lt;br /&gt;
&lt;br /&gt;
'''Блок «Демультиплексор»'''&lt;br /&gt;
&lt;br /&gt;
Демультиплексор осуществляет перевод целочисленных значений из массива в несколько булевых переменных, при этом включается выход, номер которого соответствует числу из массива (например первый элемент массива равен 5, на пятом выходе появится значение true). Нумерация выходов начинается с нуля.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Генератор случайного числа»'''&lt;br /&gt;
&lt;br /&gt;
Выходным значением является случайное число в диапазоне между указанным минимальным и максимальным значениями.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Скрипт С++»'''&lt;br /&gt;
&lt;br /&gt;
Операция «Скрипт С++» предназначена для реализации разнообразных алгоритмов на языке С++. Операция предусматривает реализацию одной или нескольких функций, выполняющих необходимые пользователю действия. Для выполнения скрипта, необходимо добавить его в качестве узла для задачи или задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Пример скрипта, выполняющего получение значения определенного узла и запись измененного значения в другой узел:&lt;br /&gt;
 float val()&lt;br /&gt;
 {&lt;br /&gt;
     float f = GetNodeValueAsFloat(&amp;quot;/Конфигурация1/stationSimple1/Signals1/Random2&amp;quot;);&lt;br /&gt;
     float f1 = f*100.0;&lt;br /&gt;
     SetNodeValueAsFloat(&amp;quot;/Конфигурация1/stationSimple1/Signals1/Constant3&amp;quot;, f1);&lt;br /&gt;
     return f*10.0;&lt;br /&gt;
 }&lt;br /&gt;
Приведенный выше скрипт возвращает исходное значение, умноженное на 10. Возвращаемое таким образом значение записывается в выход операции для возможности считывания в других операциях, скриптах и т. д.&lt;br /&gt;
&lt;br /&gt;
Скрипты могут возвращать значения следующих типов:&lt;br /&gt;
&lt;br /&gt;
* void;&lt;br /&gt;
*float;&lt;br /&gt;
*double;&lt;br /&gt;
*int.&lt;br /&gt;
&lt;br /&gt;
Подробное описание реализации языка С++ в AgavaSCADA/AgavaPLC приведено на странице &amp;quot;[[Описание языка С++ в AgavaPLC]]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Таймер с задержкой»'''&lt;br /&gt;
&lt;br /&gt;
Таймер с задержкой используется для операции задержки передачи и/или отключения сигнала. На выходе таймера появится сигнал логической «1» с задержкой относительно фронта входного сигнала продолжительностью равной интервалу включения и выключится по спаду входного сигнала с задержкой продолжительностью равной интервалу выключения. В том случае, если необходимо использовать блок только как таймер с задержкой включения (отключения) интервал выключения (включения) устанавливается равным 0.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Генератор прямоугольных импульсов»'''&lt;br /&gt;
&lt;br /&gt;
Генератор прямоугольных импульсов используется для формирования прямоугольных импульсов пульсации. На выходе генератора формируются импульсы с заданными параметрами длительности включенного и отключенного импульса на время действия управляющего сигнала на входе (сигнал логической «1»).&lt;br /&gt;
&lt;br /&gt;
'''Блок «Триггер RS»'''&lt;br /&gt;
&lt;br /&gt;
RS-триггер с приоритетом выключения используется для переключения с фиксацией состояния во время поступления коротких импульсов на соответствующий вход. На выходе появится логическая «1» по фронту сигнала на входе Set, которая будет сброшена в «0», при поступлении импульса на вход Reset.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Триггер SR»'''&lt;br /&gt;
&lt;br /&gt;
SR-триггер с приоритетом включения используется для переключения с фиксацией состояния в случае поступления коротких импульсов на соответствующий вход. На выходе появится логическая «1» по фронту сигнала на входе Set, которая будет сброшена в «0», при поступлении импульса на вход Reset.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Детектор переднего фронта импульса»'''&lt;br /&gt;
&lt;br /&gt;
Детектор переднего фронта импульса используется в случае необходимости иметь реакцию на изменение состояния дискретного входного сигнала. На выходе генерируется единичный импульс при изменении состояния входа из «0» в «1».&lt;br /&gt;
&lt;br /&gt;
'''Блок «Детектор заднего фронта импульса»'''&lt;br /&gt;
&lt;br /&gt;
Детектор заднего фронта импульса используется в случае необходимости иметь реакцию на изменение состояния дискретного входного сигнала. На выходе генерируется единичный импульс при изменении состояния входа из «1» в «0».&lt;br /&gt;
&lt;br /&gt;
'''Блок «D-триггер»'''&lt;br /&gt;
&lt;br /&gt;
D-триггер используется для формирования импульса включения выхода на интервал времени импульса на входе D, выходной интервал будет синхронизирован с тактовой частотой на входе С. На выходе Q триггера появится сигнал логической «1» по фронту тактовых импульсов на входе С при наличии сигнала логической «1» на входе D. Возврат выхода в сигнал логического «0» произойдет по фронту тактовых импульсов на входе С при наличии сигнала логического «0» на входе D. Вход Set принудительно устанавливает выход в состояние логической «1». Вход Reset является приоритетным и устанавливает выход в состояние логического «0».&lt;br /&gt;
&lt;br /&gt;
'''Блок «Селектор»'''&lt;br /&gt;
&lt;br /&gt;
Если на вход Value подается логическая «1», то результатом выполнения операции блока на выходе является входной сигнал ValueT. Если же Value равен логической «0», то результатом выполнения операции блока на выходе является входной сигнал ValueF.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Больше чем»'''&lt;br /&gt;
&lt;br /&gt;
На выход подается логическая «1», если значение in0 больше чем значение in1.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Равенство»'''&lt;br /&gt;
&lt;br /&gt;
На выход подается логическая «1», если значение in0 равно значению in1.&lt;br /&gt;
&lt;br /&gt;
'''Блок «Абсолютное значение числа»'''&lt;br /&gt;
&lt;br /&gt;
Результатом операции функции на выходе является модуль подаваемого на вход значения. Если число на входе положительное, то на выход подается само число, если отрицательное – положительное число, получаемое от перемены его знака с «-» на «+».&lt;br /&gt;
&lt;br /&gt;
'''Блок «Возведение в степень»'''&lt;br /&gt;
&lt;br /&gt;
Результатом операции функции на выходе является значение, равное значению in0, возведенному в степень значения N.&lt;br /&gt;
&lt;br /&gt;
'''Блок «PID-регулятор»'''&lt;br /&gt;
&lt;br /&gt;
Регулятор PID применяется для поддержания заданного значения параметра. На вход Pv подается текущее значение регулируемой величины, на Sp – ее заданное значение. С помощью изменения коэффициентов ПИД регулятора kP, kI и kD достигается оптимальный режим работы. Min задает минимальное значение на выходе, Max – максимальное. time - период регулятора (в мс.).&lt;br /&gt;
&lt;br /&gt;
'''Блок «PWM-регулятор»'''&lt;br /&gt;
&lt;br /&gt;
Применяется для преобразования аналогового сигнала в дискретный с помощью ШИМ. На вход in подается текущее значение регулируемой величины, Min задает минимальное значение на входе, Max – максимальное. time - период регулятора (в мс.)&lt;br /&gt;
&lt;br /&gt;
==Устройства==&lt;br /&gt;
Группа «Устройства» предназначена для группировки узлов типа &amp;quot;Устройство&amp;quot;, выполняющие разнообразные задачи, например работа с внешними накопителями и ПЗУ. &lt;br /&gt;
&lt;br /&gt;
Retain-накопитель дает возможность хранить значения регистров, постоянных и сигналов в постоянной памяти контроллера, что позволяет им сохранять свои значения после отключения питания.&lt;br /&gt;
&lt;br /&gt;
Для сохранения переменных необходимо перечислить их в свойстве «Узлы» и указать путь сохранения на выбранном накопителе.&lt;br /&gt;
&lt;br /&gt;
== Отчеты==&lt;br /&gt;
{{Внимание|Тип=Восклицание желтый.png|Текст=Данный узел доступен только при  исполнении проекта на настольном компьютере. На панелях оператора и контроллерах МПР этот узел не доступен.}}&lt;br /&gt;
Отчет – технологический документ, содержащий информацию о ходе производственного процесса, обработанную по заложенным в отчет алгоритмам. Отчеты формируются на основе макетов (статической части отчетов) путем добавления в них свойств и значений заданных параметров технологического процесса, которые формируются (выбираются из базы данных технологических параметров и проходят соответствующую обработку) по алгоритмам, размещенным в этих шаблонах.&lt;br /&gt;
&lt;br /&gt;
Данные для отчета предоставляет выборка, осуществляющая получение данных и их обработку из базы данных.&lt;br /&gt;
&lt;br /&gt;
===Создание нового отчета===&lt;br /&gt;
Создание любого отчета производится в два этапа.&lt;br /&gt;
&lt;br /&gt;
#Создание необходимых узлов в конфигурации: сам отчет и необходимое количество выборок.&lt;br /&gt;
#Составление макета отчета.&lt;br /&gt;
&lt;br /&gt;
Создание узла типа «Отчет» в конфигурации и выборок для него производится аналогично созданию узлов других типов. К станции добавляется узел типа «Отчеты» с помощью команды контекстного меню «Добавить узел», далее к узлу типа «Отчеты» добавляется отчет и к отчету добавляется необходимое количество выборок.&lt;br /&gt;
&lt;br /&gt;
Выборка – специальный узел, предназначенный для выборки данных из архива и их обработки для последующего отображения в отчете.&lt;br /&gt;
&lt;br /&gt;
Перед переходом к редактированию макета желательно проделать следующие операции:&lt;br /&gt;
&lt;br /&gt;
*в свойстве отчета «Путь к файлу отчета» установить имя файла, в котором будет храниться макет отчета;&lt;br /&gt;
* в свойстве «Источники» выборки (выборок) отчета установить перечень архивных сигналов (коннекторов), которые будут выводиться в отчете.&lt;br /&gt;
&lt;br /&gt;
===Редактирование макета отчета===&lt;br /&gt;
[[Файл:AgavaPLC–Редактор макета отчета.png|мини|Рисунок 42 – Редактор макета отчета]]&lt;br /&gt;
Для редактирования макета отчета необходимо переключиться из редактора конфигурации в редактор макета отчета с помощью команды «Открыть редактор макета отчета», доступной из контекстного меню дерева конфигурации, отображаемого при щелчке правой кнопкой мыши на узле типа «Отчет».&lt;br /&gt;
&lt;br /&gt;
В окне редактора расположены:&lt;br /&gt;
&lt;br /&gt;
*панели инструментов;&lt;br /&gt;
* панель объектов отчета;&lt;br /&gt;
*окно «Инспектор объектов»;&lt;br /&gt;
*окно «Инспектор данных»;&lt;br /&gt;
*окно «Инспектор скриптов»;&lt;br /&gt;
*область построения макета отчета;&lt;br /&gt;
*окно «Структура отчета».&lt;br /&gt;
&lt;br /&gt;
Редактор макета позволяет вызывать команды сочетаниями клавиш:&lt;br /&gt;
&lt;br /&gt;
*Ctrl + N – новый макет;&lt;br /&gt;
*Ctrl + O – загрузить макет;&lt;br /&gt;
*Ctrl + S – сохранить макет;&lt;br /&gt;
*Ctrl + Shift + S – сохранить макет под новым именем;&lt;br /&gt;
*Ctrl + P – предварительный просмотр;&lt;br /&gt;
*Ctrl + Z – отмена изменений;&lt;br /&gt;
*Ctrl + Shift + Z – возврат отмененных изменений;&lt;br /&gt;
* Ctrl + C – копировать объект;&lt;br /&gt;
*Ctrl + X – вырезать объект;&lt;br /&gt;
*Ctrl + V – вставить объект;&lt;br /&gt;
*Ctrl + Стрелки – переместить выделенный объект;&lt;br /&gt;
*Shift + Стрелки – изменить размер выделенных объектов;&lt;br /&gt;
*Del – удалить выделенные объекты;&lt;br /&gt;
*Shift + левая кнопка мыши – создать область выделения.&lt;br /&gt;
&lt;br /&gt;
====Окно «Инспектор объектов»====&lt;br /&gt;
Окно «Инспектор объектов» содержит список свойств выделенного объекта и предназначено для их редактирования.&lt;br /&gt;
&lt;br /&gt;
====Окно «Инспектор данных»====&lt;br /&gt;
Окно «Инспектор данных» содержит список доступных для использования источников данных (выборок) и предназначено для заполнения блока «Данные» элементами соответствующего типа.&lt;br /&gt;
&lt;br /&gt;
====Окно «Инспектор скриптов»====&lt;br /&gt;
Окно «Инспектор скриптов» содержит список доступных для использования в отчете скриптов.&lt;br /&gt;
&lt;br /&gt;
====Окно «Структура отчета»====&lt;br /&gt;
Окно «Структура отчет» отображает структуру отчета в виде дерева связанных элементов.&lt;br /&gt;
&lt;br /&gt;
===Элементы отчета===&lt;br /&gt;
Для составления макета отчета доступны следующие элементы:&lt;br /&gt;
&lt;br /&gt;
*текст;&lt;br /&gt;
*данные;&lt;br /&gt;
*изображение;&lt;br /&gt;
*фигура;&lt;br /&gt;
*компоновка (Layout).&lt;br /&gt;
&lt;br /&gt;
====Текст====&lt;br /&gt;
Элемент «Текст» служит для вывода надписей или содержимого полей источников данных.&lt;br /&gt;
&lt;br /&gt;
Объект «Текст» обладает очень широкими возможностями. Он умеет отображать текст, рамку, заливку. Текст может быть отображен любым шрифтом любого размера, цвета и стиля. Большинство настроек делаются визуально с помощью панелей инструментов.&lt;br /&gt;
&lt;br /&gt;
Одна из самых главных особенностей этого универсального объекта – это возможность отображения не только статичного текста, но и текста с применением вычисляемых выражений. Причем, выражения могут располагаться в объекте вперемешку с текстом. Рассмотрим простой пример – поместим в объект «Текст» следующую строку: «Привет! Сегодня $S{now()}».&lt;br /&gt;
&lt;br /&gt;
Если запустить отчет на построение, мы увидим приблизительно следующее: «Привет! Сегодня 2018­08­03». В процессе построения отчета выражение в тексте, заключенное $S{}, было вычислено и полученное значение вставлено обратно в текст. Объект «Текст» может содержать любое количество выражений, смешанных с обычным текстом. В скобки можно заключать и одиночные переменные, и выражения, например, $S{1+2*(3+4)}. В выражениях можно использовать константы, переменные ($V{}), функции, поля БД ($D{}).&lt;br /&gt;
&lt;br /&gt;
Свойства элемента «Текст»:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|alignment&lt;br /&gt;
|Выравнивание текста по вертикали и горизонтали&lt;br /&gt;
|-&lt;br /&gt;
|angle&lt;br /&gt;
|Поворот надписи&lt;br /&gt;
|-&lt;br /&gt;
|autoHeight&lt;br /&gt;
|Автоматический подбор высоты&lt;br /&gt;
|-&lt;br /&gt;
|autoWidth&lt;br /&gt;
|Автоматический подбор ширины&lt;br /&gt;
|-&lt;br /&gt;
|backgroundColor&lt;br /&gt;
|Цвет заливки&lt;br /&gt;
|-&lt;br /&gt;
|backgroundMode&lt;br /&gt;
|Режим заливки&lt;br /&gt;
|-&lt;br /&gt;
| backgroundOpacity&lt;br /&gt;
|Прозрачность заливки&lt;br /&gt;
|-&lt;br /&gt;
|borders&lt;br /&gt;
|Границы&lt;br /&gt;
|-&lt;br /&gt;
|content&lt;br /&gt;
|Содержимое объекта «Текст»&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|Шрифт&lt;br /&gt;
|-&lt;br /&gt;
|fontColor&lt;br /&gt;
|Цвет шрифта&lt;br /&gt;
|-&lt;br /&gt;
| foregroundOpacity&lt;br /&gt;
|Прозрачность шрифта&lt;br /&gt;
|-&lt;br /&gt;
|geometry&lt;br /&gt;
|Размер и расположение объекта&lt;br /&gt;
|-&lt;br /&gt;
|itemLocation&lt;br /&gt;
|Расположение объекта (страница или бэнд)&lt;br /&gt;
|-&lt;br /&gt;
|margin&lt;br /&gt;
|Отступы&lt;br /&gt;
|-&lt;br /&gt;
|objectName&lt;br /&gt;
| Имя объекта&lt;br /&gt;
|-&lt;br /&gt;
|stretchToMaxHeight&lt;br /&gt;
|Установка значения высоты самого высокого объекта на бэнде&lt;br /&gt;
|-&lt;br /&gt;
|trimValue&lt;br /&gt;
|Удаление  пробелов в начале и в конце надписи&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для редактирования свойства «Content» используется диалоговое окно «Text Item Editor», вызов которого осуществляется двойным щелчком левой кнопки мыши на элементе «Текст».&lt;br /&gt;
&lt;br /&gt;
Свойство «Content» может содержать: &lt;br /&gt;
&lt;br /&gt;
*текст;&lt;br /&gt;
*значения переменных;&lt;br /&gt;
*значения полей из набора данных;&lt;br /&gt;
*значения, формируемые посредством исполнения скрипта.&lt;br /&gt;
&lt;br /&gt;
Для вывода значений переменных используется синтаксис «$V{имяПеременной}» (без кавычек), для вывода значения поля данных – «$D{имяНабораДанных.ИмяПеременной}», для вывода результата исполнения скрипта – «$S{телоСкрипта}».&lt;br /&gt;
&lt;br /&gt;
==== Изображение ====&lt;br /&gt;
Элемент для вывода изображений:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|autoSize&lt;br /&gt;
|Подгонять размер под размер изображения&lt;br /&gt;
|-&lt;br /&gt;
|borders&lt;br /&gt;
|Границы&lt;br /&gt;
|-&lt;br /&gt;
|content  &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|datasource&lt;br /&gt;
|Источник данных&lt;br /&gt;
|-&lt;br /&gt;
|field&lt;br /&gt;
|Поле данных&lt;br /&gt;
|-&lt;br /&gt;
|geometry&lt;br /&gt;
|Размер и расположение&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|Изображение&lt;br /&gt;
|-&lt;br /&gt;
| itemLocation&lt;br /&gt;
|Расположение объекта (страница или бэнд)&lt;br /&gt;
|-&lt;br /&gt;
|objectName&lt;br /&gt;
|Имя объекта&lt;br /&gt;
|-&lt;br /&gt;
| stretchToMaxHeight&lt;br /&gt;
|Устанавливать значение высоты самого высокого объекта на  бэнде&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Фигура====&lt;br /&gt;
Элемент для вывода фигур:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|borders&lt;br /&gt;
|Границы&lt;br /&gt;
|-&lt;br /&gt;
| geometry&lt;br /&gt;
|Размер и расположение&lt;br /&gt;
|-&lt;br /&gt;
|itemLocation&lt;br /&gt;
|Расположение объекта (страница или бэнд)&lt;br /&gt;
|-&lt;br /&gt;
|lineWidth&lt;br /&gt;
|Толщина линии&lt;br /&gt;
|-&lt;br /&gt;
|objectName&lt;br /&gt;
|Имя объекта&lt;br /&gt;
|-&lt;br /&gt;
|opacity&lt;br /&gt;
|Прозрачность&lt;br /&gt;
|-&lt;br /&gt;
|penStyle&lt;br /&gt;
|Стиль линии&lt;br /&gt;
|-&lt;br /&gt;
|shape&lt;br /&gt;
|Фигура&lt;br /&gt;
|-&lt;br /&gt;
|shapeBrush&lt;br /&gt;
|Стиль заливки&lt;br /&gt;
|-&lt;br /&gt;
|shapeBrushColor&lt;br /&gt;
|Цвет заливки&lt;br /&gt;
|-&lt;br /&gt;
|shapeColor&lt;br /&gt;
|Цвет фигуры&lt;br /&gt;
|-&lt;br /&gt;
|stretchToMaxHeight&lt;br /&gt;
|Устанавливать значение высоты самого высокого объекта на  бэнде&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Горизонтальная компоновка (Layout)====&lt;br /&gt;
Элемент, позволяющий объединять несколько элементов в группу:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|borders&lt;br /&gt;
|Границы&lt;br /&gt;
|-&lt;br /&gt;
|geometry&lt;br /&gt;
|Размер и расположение&lt;br /&gt;
|-&lt;br /&gt;
|itemLocation&lt;br /&gt;
|Расположение объекта (страница или бэнд)&lt;br /&gt;
|-&lt;br /&gt;
|objectName&lt;br /&gt;
|Имя объекта&lt;br /&gt;
|-&lt;br /&gt;
|stretchToMaxHeight&lt;br /&gt;
|Устанавливать значение высоты самого высокого объекта на  бэнде&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Разделы отчета (бэнды) ===&lt;br /&gt;
Бэнд предназначен для размещения других элементов отчета. Бэнд может быть нескольких типов:&lt;br /&gt;
&lt;br /&gt;
*Report Header – заголовок отчета;&lt;br /&gt;
*Report Footer – завершение отчета;&lt;br /&gt;
*Page Header – верхний колонтитул страницы отчета;&lt;br /&gt;
*Page Footer – нижний колонтитул страницы отчета;&lt;br /&gt;
*Data – данные отчета;&lt;br /&gt;
* SubDetail – подчиненные данные отчета;&lt;br /&gt;
*SubDetailHeader – заголовок подчиненных данных;&lt;br /&gt;
*SubDetailFooter – завершение подчиненных данных;&lt;br /&gt;
*GroupHeader – заголовок группы;&lt;br /&gt;
*GroupFooter – завершение группы.&lt;br /&gt;
&lt;br /&gt;
Бэнды применяются для логической группировки объектов. К примеру, размещение объекта на элементе «Данные» типа «Page Header», приводит к отображению этого объекта в верхней части каждой страницы готового отчета. Аналогичным образом «Page Footer» выводится внизу каждой страницы со всеми лежащими на нем объектами.&lt;br /&gt;
&lt;br /&gt;
Общие для всех элементов «Данные» свойства:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|autoHeight&lt;br /&gt;
|Автоматический подбор высоты&lt;br /&gt;
|-&lt;br /&gt;
|backgroundColor&lt;br /&gt;
|Цвет заливки бэнда&lt;br /&gt;
|-&lt;br /&gt;
|borders&lt;br /&gt;
|Границы&lt;br /&gt;
|-&lt;br /&gt;
|geometry&lt;br /&gt;
|Размер&lt;br /&gt;
|-&lt;br /&gt;
|keepBottomSpace&lt;br /&gt;
|Сохранение отступа от нижней границы бэнда&lt;br /&gt;
|-&lt;br /&gt;
|objectName&lt;br /&gt;
|Имя объекта&lt;br /&gt;
|-&lt;br /&gt;
|printIfEmpty&lt;br /&gt;
|Отображение пустого бэнда&lt;br /&gt;
|-&lt;br /&gt;
|splittable&lt;br /&gt;
|Разделение  бэнда, если он не влезает на страницу&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Report Footer:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|maxScalePercent&lt;br /&gt;
|Максимальный процент, на который можно уменьшить бенд, если он не влезает на страницу. Если бэнд даже после сжатия&lt;br /&gt;
&lt;br /&gt;
не влезает на страницу, он будет перенесен полностью или частично  – в зависимости от настроек бэнда&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Data:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|datasource&lt;br /&gt;
|Источник данных. Data-бэнд будет сформирован для каждой строки в источнике данных&lt;br /&gt;
|-&lt;br /&gt;
|keepFooterTogether&lt;br /&gt;
|Если Report Footer не влезает на страницу, то он будет перенесен на следующую страницу совместно с последним&lt;br /&gt;
&lt;br /&gt;
экземпляром Data-бэнда&lt;br /&gt;
|-&lt;br /&gt;
|sliceLastRow&lt;br /&gt;
| Указывает генератору отчетов на то, можно ли разрезать последний экземпляр Data-бэнда или его нужно перенести&lt;br /&gt;
&lt;br /&gt;
целиком&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Бэнды данного типа предназначены для вывода на печать данных из наборов. Набор данных - это заранее неизвестное количество строк (записей), каждая из которых содержит определенное количество колонок (полей).&lt;br /&gt;
&lt;br /&gt;
SubDetail:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|datasource&lt;br /&gt;
| Источник данных. SubDetail-бэнд будет сформирован для каждой строки в источнике данных&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
SubDetailHeader, SubDetailFooter:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|printAlways&lt;br /&gt;
| Печатать, даже если SubDetail пустой&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
GroupHeader:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
! Описание&lt;br /&gt;
|-&lt;br /&gt;
|groupFieldName&lt;br /&gt;
|Поле, по которому осуществляется группировка. Экземпляр GroupHeader будет формироваться при смене значения в этом  поле&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Функции===&lt;br /&gt;
==== Агрегатные функции ====&lt;br /&gt;
Агрегатные функции предназначены для обработки значений, содержащихся в резделах Data и SubDetail.&lt;br /&gt;
&lt;br /&gt;
===== AVG - вычисление среднего значения =====&lt;br /&gt;
Пример использования:&lt;br /&gt;
 $S{AVG(&amp;quot;TextItem4&amp;quot;,&amp;quot;DataBand1&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
===== SUM - вычисление суммы значений =====&lt;br /&gt;
Пример использования:&lt;br /&gt;
 $S{SUM(&amp;quot;TextItem8&amp;quot;,&amp;quot;DataBand1&amp;quot;);}&lt;br /&gt;
&lt;br /&gt;
===== MIN =====&lt;br /&gt;
&lt;br /&gt;
===== MAX =====&lt;br /&gt;
&lt;br /&gt;
===== COUNT =====&lt;br /&gt;
&lt;br /&gt;
==== Числовые функции ====&lt;br /&gt;
&lt;br /&gt;
===== numberFormat - форматирование числа =====&lt;br /&gt;
Синтаксис:&lt;br /&gt;
 numberFormat(значение, 'формат', точность)&lt;br /&gt;
Форматы:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'f'&amp;lt;/code&amp;gt; — фиксированная запись (например, &amp;lt;code&amp;gt;&amp;quot;123.45&amp;quot;&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;'g'&amp;lt;/code&amp;gt; — общий формат (автоматически выбирает между &amp;lt;code&amp;gt;'f'&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;'e'&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;'e'&amp;lt;/code&amp;gt; — экспоненциальная запись (например, &amp;lt;code&amp;gt;&amp;quot;1.2345e+02&amp;quot;&amp;lt;/code&amp;gt;);&lt;br /&gt;
&lt;br /&gt;
Пример использования:&lt;br /&gt;
 $S{numberFormat($D{fetcharchiverdata1.ArchiversSourceConnector0 (среднее)}, 'f', 3)}       -&amp;gt; 123.495&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_AgavaPLC_1.6.png&amp;diff=3490</id>
		<title>Файл:Иерархия классов объектной модели AgavaPLC 1.6.png</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_AgavaPLC_1.6.png&amp;diff=3490"/>
		<updated>2026-04-10T09:03:32Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: TaushkanovKV загрузил новую версию Файл:Иерархия классов объектной модели AgavaPLC 1.6.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3489</id>
		<title>Транспорты AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3489"/>
		<updated>2026-04-10T08:51:50Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Режим Slave (ведомый) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Транспорты Modbus-RTU, Modbus-TCP==&lt;br /&gt;
Данные виды транспортов предназначены для приема и передачи данных по протоколу Modbus. Поддерживаются последовательные и Ethernet подключения.&lt;br /&gt;
===Узлы===&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; - транспорт, работающий по последовательным линиям связи.&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt; - транспорт, работающий по ethernet.&lt;br /&gt;
*&amp;lt;code&amp;gt;Modbus регистр&amp;lt;/code&amp;gt; - источник, хранящий значение регистра.&lt;br /&gt;
====Транспорт Modbus-RTU====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по последовательным линиям связи RS-485, RS-422, RS-232.&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
* Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Транспорт Modbus-TCP====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по линиям связи Ethernet.&lt;br /&gt;
=====Доступные дочерние узлы =====&lt;br /&gt;
*Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Modbus регистр====&lt;br /&gt;
Узел-источник, хранящий значение регистра.&lt;br /&gt;
&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
Нет&lt;br /&gt;
&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Доступ&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Устройство&lt;br /&gt;
|DeviceAddr&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция чтения&lt;br /&gt;
|ReadFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр чтения&lt;br /&gt;
|ReadRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Размер регистра&lt;br /&gt;
|ParamSize&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Приоритет&lt;br /&gt;
|Priority&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция записи&lt;br /&gt;
|WriteFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр записи&lt;br /&gt;
|WriteRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Тип значения&lt;br /&gt;
|ValueType&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Порядок байт&lt;br /&gt;
|ByteOrder&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции после чтения&lt;br /&gt;
|OperationsOnRead&lt;br /&gt;
|NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции перед записью&lt;br /&gt;
|OperationsOnWrite&lt;br /&gt;
| NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Узел для чтения/записи&lt;br /&gt;
|SourceId&lt;br /&gt;
|NODE&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|}Устройство&lt;br /&gt;
&lt;br /&gt;
Функция чтения&lt;br /&gt;
&lt;br /&gt;
Регистр чтения&lt;br /&gt;
&lt;br /&gt;
Размер регистра&lt;br /&gt;
&lt;br /&gt;
Приоритет&lt;br /&gt;
&lt;br /&gt;
Функция записи&lt;br /&gt;
&lt;br /&gt;
Регистр записи&lt;br /&gt;
&lt;br /&gt;
Тип значения&lt;br /&gt;
&lt;br /&gt;
Порядок байт&lt;br /&gt;
&lt;br /&gt;
Операции после чтения&lt;br /&gt;
&lt;br /&gt;
Операции перед записью&lt;br /&gt;
&lt;br /&gt;
Узел для чтения/записи&lt;br /&gt;
&lt;br /&gt;
===Работа транспорта===&lt;br /&gt;
Транспорты могут работать в двух режимах: &lt;br /&gt;
&lt;br /&gt;
* Ведущий (Master).&lt;br /&gt;
* Ведомый (Slave).&lt;br /&gt;
&lt;br /&gt;
====Режим Master (ведущий)====&lt;br /&gt;
[[Файл:AgavaPLC-Cхема работы Modbus мастера.png|мини|Cхема работы Modbus мастера]]&lt;br /&gt;
В режиме Master транспорт ведет обмен со связанными устройствами - запрашивает значения определенных регистров, записывает в регистры устройств значения, получаемые из виджетов или других узлов проекта. В этом режиме применяется [[Транспорты AgavaSCADA/AgavaPLC#Оптимизации операций записи в Modbus|оптимизация команд записи]].&lt;br /&gt;
&lt;br /&gt;
Схема работы транспорта в режиме Master приведена на схеме.&lt;br /&gt;
&lt;br /&gt;
Работа транспорта Modbus в этом режиме строится на следующих принципах:&lt;br /&gt;
&lt;br /&gt;
* Обмен данными ведется циклами «Запрос — Ответ».&lt;br /&gt;
* Транспорт в  этом режиме - Ведущий, то есть единственное устройство в сети, которое инициирует передачу данных. &lt;br /&gt;
* Ведомые (Slave) устройства никогда не начинают обмен самостоятельно, они только отвечают на запросы.&lt;br /&gt;
&lt;br /&gt;
===== Цикл «Запрос — Ответ» =====&lt;br /&gt;
Работа транспорта в этом режиме организована как последовательные циклы:&lt;br /&gt;
&lt;br /&gt;
# Формирование запроса: Master создает кадр, куда входит: адрес ведомого, код функции и данные (с какого адреса, сколько регистров).&lt;br /&gt;
# Отправка: Master передает кадр в шину (RS-485 или Ethernet).&lt;br /&gt;
# Ожидание: Master включает таймер ожидания ответа.&lt;br /&gt;
# Прием ответа: Если Slave с указанным адресом получил команду без ошибок, он отправляет ответный кадр.&lt;br /&gt;
# Тайм-аут: Если за отведенное время ответа нет, Master фиксирует ошибку (связь потеряна) и переходит к опросу следующего устройства или повторяет запрос.&lt;br /&gt;
&lt;br /&gt;
===== Управление таймингами =====&lt;br /&gt;
Master жестко контролирует паузы в сети:&lt;br /&gt;
&lt;br /&gt;
* Между отправкой запроса и приемом ответа: Master выдерживает минимальную паузу на смену направления передачи (для RS-485).&lt;br /&gt;
* Таймаут ожидания ответа: Задается в настройках Master. Если Slave медленный, Master не будет ждать вечно — он прерывает ожидание ответа и переходит к следующей транзакции.&lt;br /&gt;
* Межкадровая задержка: Master выдерживает паузу настраиваемой длительности между отправкой разных запросов, чтобы Slave успел обработать команду.&lt;br /&gt;
&lt;br /&gt;
===== Адресация =====&lt;br /&gt;
&lt;br /&gt;
* Master отправляет запрос строго конкретному Slave (адрес от 1 до 247).&lt;br /&gt;
* Широковещательный адрес (0): Master может отправить команду всем Slave сразу (например, «запустить моторы»). В этом режиме ведомые не отвечают, чтобы не создать коллизию в шине. В данный момент не поддерживается.&lt;br /&gt;
&lt;br /&gt;
===== Обработка ошибок =====&lt;br /&gt;
Master проверяет:&lt;br /&gt;
&lt;br /&gt;
* Контрольную сумму ответа (CRC) (только &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Код исключения: Не вернул ли Slave код ошибки (например, 0x02 — неверный адрес регистра).&lt;br /&gt;
&lt;br /&gt;
====Режим Slave (ведомый)====&lt;br /&gt;
[[Файл:AgavaPLC-Схема работы Modbus slave.png|мини|Схема работы Modbus slave]]&lt;br /&gt;
В режиме Slave транспорт ведет обмен со связанными устройствами в пассивном режиме - принимает запросы от ведущих и выдает ответы.&lt;br /&gt;
&lt;br /&gt;
Схема работы транспорта в режиме Slave приведена на рисунке.&lt;br /&gt;
&lt;br /&gt;
В режиме Slave транспорт Modbus работает как '''сервер''', ожидающий входящие запросы от внешнего ведущего устройства (Master). Транспорт не инициирует обмен самостоятельно, а только обрабатывает команды, полученные от Master: отдаёт значения указанных регистров или записывает в свои регистры принятые данные. Полученные значения могут передаваться в виджеты или другие узлы проекта.&lt;br /&gt;
&lt;br /&gt;
Работа транспорта Modbus в этом режиме строится на следующих принципах:&lt;br /&gt;
&lt;br /&gt;
* Транспорт в этом режиме — '''Ведомый (Slave)''', то есть отвечает только на запросы внешнего ведущего устройства.&lt;br /&gt;
* Обмен данными инициируется исключительно Master.&lt;br /&gt;
* Транспорт не опрашивает другие устройства и не формирует запросы самостоятельно.&lt;br /&gt;
&lt;br /&gt;
===== Цикл «Запрос — Ответ» =====&lt;br /&gt;
Работа транспорта в этом режиме организована как обработка входящих запросов:&lt;br /&gt;
&lt;br /&gt;
# '''Ожидание запроса:''' Slave находится в режиме приёма и прослушивает шину (RS-485 или Ethernet).&lt;br /&gt;
# '''Приём запроса:''' При получении кадра Slave проверяет, предназначен ли запрос ему (по адресу ведомого).&lt;br /&gt;
# '''Проверка целостности:''' Slave вычисляет контрольную сумму (CRC для Modbus-RTU) и проверяет корректность структуры кадра.&lt;br /&gt;
# '''Обработка команды:''' Если запрос адресован данному Slave и не содержит ошибок, транспорт выполняет требуемую операцию:&lt;br /&gt;
#* '''Чтение:''' извлекает значения из внутренних регистров (например, полученных от виджетов).&lt;br /&gt;
#* '''Запись:''' записывает принятые данные в указанные регистры.&lt;br /&gt;
# '''Формирование ответа:''' Slave формирует ответный кадр, куда входит: адрес ведомого, код функции и запрошенные данные (для чтения) или подтверждение (для записи).&lt;br /&gt;
# '''Отправка ответа:''' Slave передаёт ответ в шину.&lt;br /&gt;
# '''Обработка ошибок:''' При обнаружении любой ошибки (неверная контрольная сумма, неверный адрес регистра, неверный код функции) Slave формирует '''кадр исключения''' с соответствующим кодом ошибки или игнорирует запрос (в зависимости от настроек).&lt;br /&gt;
&lt;br /&gt;
===== Управление таймингами =====&lt;br /&gt;
В режиме Slave транспорт соблюдает временные параметры, заданные ведущим устройством:&lt;br /&gt;
&lt;br /&gt;
* '''Таймаут ожидания ответа:''' Настраивается на стороне Master. Slave не контролирует время между запросами — он отвечает в рамках разумного времени, определяемого его производительностью.&lt;br /&gt;
* '''Межкадровая задержка:''' Slave использует этот интервал (3.5 символа для RTU) для определения границ кадров. Если пауза между байтами превышает 3.5 символа, Slave считает кадр завершённым и начинает его обработку.&lt;br /&gt;
* '''Время обработки запроса:''' Slave обрабатывает запрос и отправляет ответ. Задержка между приёмом запроса и отправкой ответа должна быть минимальной (обычно несколько миллисекунд), но допустима в пределах, установленных Master в настройках таймаута.&lt;br /&gt;
* '''Пауза перед ответом:''' Для полудуплексных линий (RS-485) Slave перед отправкой ответа выдерживает минимальную технологическую паузу для смены направления передачи.&lt;br /&gt;
&lt;br /&gt;
===== Адресация =====&lt;br /&gt;
&lt;br /&gt;
* Каждый Slave в сети должен иметь '''уникальный адрес''' в диапазоне от 1 до 247. Адрес настраивается в конфигурации транспорта.&lt;br /&gt;
* Если пришедший запрос содержит '''широковещательный адрес (0)''', Slave обрабатывает команду (например, запись в регистры), но '''не отправляет ответ'''. В данный момент не поддерживается.&lt;br /&gt;
* Запросы, адресованные другому Slave, игнорируются.&lt;br /&gt;
&lt;br /&gt;
===== Обработка ошибок =====&lt;br /&gt;
Slave проверяет каждый входящий запрос по следующим критериям:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Проверка&lt;br /&gt;
!Действие при ошибке&lt;br /&gt;
|-&lt;br /&gt;
|'''Контрольная сумма (CRC для RTU)'''&lt;br /&gt;
|Кадр отбрасывается, ответ не отправляется (Master получит таймаут)&lt;br /&gt;
|-&lt;br /&gt;
|'''Адрес ведомого'''&lt;br /&gt;
|Если адрес не совпадает — кадр игнорируется&lt;br /&gt;
|-&lt;br /&gt;
|'''Код функции'''&lt;br /&gt;
|Если функция не поддерживается — отправляется исключение с кодом &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt; (Illegal Function)&lt;br /&gt;
|-&lt;br /&gt;
|'''Адрес регистра'''&lt;br /&gt;
|Если адрес выходит за допустимые пределы — отправляется исключение &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; (Illegal Data Address)&lt;br /&gt;
|-&lt;br /&gt;
|'''Количество регистров'''&lt;br /&gt;
|Если запрашиваемое количество превышает допустимое — отправляется исключение &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt; (Illegal Data Value)&lt;br /&gt;
|-&lt;br /&gt;
|'''Значение данных'''&lt;br /&gt;
|Если записываемое значение недопустимо — отправляется исключение &amp;lt;code&amp;gt;0x03&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
При успешной обработке запроса Slave отправляет '''положительный ответ''' — кадр, содержащий подтверждение выполнения операции или запрошенные данные.&lt;br /&gt;
&lt;br /&gt;
===Оптимизации операций записи в Modbus===&lt;br /&gt;
&lt;br /&gt;
*'''Цель''': уменьшить трафик и задержки и ускорить достижение согласованного состояния на устройстве.&lt;br /&gt;
*'''Область применения''': операции записи функций 5/6/15/16; чтение не оптимизируется.&lt;br /&gt;
&lt;br /&gt;
==== Модель команды и терминология====&lt;br /&gt;
&lt;br /&gt;
*'''Что содержит команда''': идентификатор устройства (&amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;), номер функции (&amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt;), адрес или диапазон адресов, и полезную нагрузку (значения для записи).&lt;br /&gt;
**Для функций 5 и 6 записывается один адрес.&lt;br /&gt;
**Для функций 15 и 16 может записываться непрерывный диапазон адресов.&lt;br /&gt;
*При сравнении двух команд '''одинаковыми командами''' считаются те, у которых полностью совпадают &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, функция и адрес регистра.&lt;br /&gt;
*'''Смежными диапазонами''' являются диапазоны, между которыми нет разрыва — один начинается сразу после другого. Примеры: смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..8&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;10..10&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;11..15&amp;lt;/code&amp;gt;. Не смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;6..8&amp;lt;/code&amp;gt; (разрыв), &amp;lt;code&amp;gt;3..7&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..9&amp;lt;/code&amp;gt; (перекрытие).&lt;br /&gt;
*'''Неподтверждённой записью''', является та, которая находится в очереди и ещё не была отправлена драйвером на устройство.&lt;br /&gt;
&lt;br /&gt;
====Этап 1. Дедупликация при постановке в очередь ====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': убрать лишние повторные записи одного и того же адреса, если между ними не было попытки отправки на устройство.&lt;br /&gt;
*'''Принцип дедупликации''': Если в очереди уже есть неподтверждённая запись для того же &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, той же функции и того же адреса, то новая запись заменяет значение в существующей, а сама в очередь не добавляется.&lt;br /&gt;
*'''Что не дедуплицируется''':&lt;br /&gt;
**Разные адреса, разные функции или разные устройства.&lt;br /&gt;
**Операции чтения.&lt;br /&gt;
**Объединение диапазонов — отдельный механизм (см. Этап 2).&lt;br /&gt;
*'''Эффект''':&lt;br /&gt;
**Снижается нагрузка на канал и устройство при частых обновлениях одного тега.&lt;br /&gt;
**В устройство уходит самое свежее значение на момент отправки.&lt;br /&gt;
&lt;br /&gt;
==== Этап 2. Объединение команд записи (функции 15 и 16)====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': сократить число запросов, объединив записи в соседние адреса в один непрерывный блок.&lt;br /&gt;
*'''Что объединяется''':&lt;br /&gt;
**Функция 15 (Write Multiple Coils): катушки с непрерывными адресами.&lt;br /&gt;
**Функция 16 (Write Multiple Registers): регистры хранения с непрерывными адресами.&lt;br /&gt;
**Только записи с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и одинаковой функцией (15 или 16).&lt;br /&gt;
*'''Условия объединения''': Несколько записей с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и функцией 15 или 16, чьи адресные диапазоны идут подряд без разрывов, объединяются в одну запись с общим диапазоном от минимального до максимального адреса.&lt;br /&gt;
*'''Формирование буфера значений''':&lt;br /&gt;
**Для 15: формируется массив булевых значений по адресам в объединённом диапазоне.&lt;br /&gt;
**Для 16: формируется массив 16-битных слов по адресам в объединённом диапазоне.&lt;br /&gt;
***32-битные типы (Int32/UInt32/Float32) занимают два 16-битных слова.&lt;br /&gt;
*** Соблюдается заданный порядок слов (Normal/Inverse).&lt;br /&gt;
**Если для одного адреса есть несколько кандидатов, берётся самое свежее значение на момент отправки.&lt;br /&gt;
*'''Порядок и атомарность''':&lt;br /&gt;
**Адреса в блоке упорядочиваются по возрастанию.&lt;br /&gt;
**Отправка выполняется одной операцией: &amp;lt;code&amp;gt;writeCoils&amp;lt;/code&amp;gt; (15) или &amp;lt;code&amp;gt;writeRegisters&amp;lt;/code&amp;gt; (16).&lt;br /&gt;
**Логирование отражает одну агрегированную запись.&lt;br /&gt;
*'''Что не объединяется''':&lt;br /&gt;
**Разные &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; или разные функции (15 и 16 не смешиваются).&lt;br /&gt;
**Диапазоны с разрывами.&lt;br /&gt;
**Операции чтения и иные типы команд.&lt;br /&gt;
&lt;br /&gt;
====Ограничения====&lt;br /&gt;
&lt;br /&gt;
#Ограничение длины кадра устройства/драйвера может приводить к разбиению больших блоков.&lt;br /&gt;
#Объединение выполняется на этапе подготовки к отправке; до него действует дедупликация.&lt;br /&gt;
# При ошибке статусы возвращаются для всей агрегированной операции, повторы — по общей логике.&lt;br /&gt;
&lt;br /&gt;
====Примеры====&lt;br /&gt;
&lt;br /&gt;
*'''Дедупликация''':&lt;br /&gt;
**Три записи в один регистр: 10 → 20 → 30. В очереди остаётся одна запись; отправляется значение 30.&lt;br /&gt;
**Две записи в разные регистры: обе будут отправлены независимо.&lt;br /&gt;
**Записи в один адрес, но с разными функциями (например, 5 и 15): считаются разными и отправляются раздельно.&lt;br /&gt;
*'''Объединение 15/16''':&lt;br /&gt;
**Функция 16: записи 40010..40011 и 40012 объединяются в 40010..40012 и уходят одной операцией.&lt;br /&gt;
**Функция 15: записи катушек 1..4 и 5..8 объединяются в 1..8 и отправляются одной операцией.&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_OPC_UA}}&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_SNMP}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3488</id>
		<title>Транспорты AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3488"/>
		<updated>2026-04-10T08:40:40Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Режимы работы транспорта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Транспорты Modbus-RTU, Modbus-TCP==&lt;br /&gt;
Данные виды транспортов предназначены для приема и передачи данных по протоколу Modbus. Поддерживаются последовательные и Ethernet подключения.&lt;br /&gt;
===Узлы===&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; - транспорт, работающий по последовательным линиям связи.&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt; - транспорт, работающий по ethernet.&lt;br /&gt;
*&amp;lt;code&amp;gt;Modbus регистр&amp;lt;/code&amp;gt; - источник, хранящий значение регистра.&lt;br /&gt;
====Транспорт Modbus-RTU====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по последовательным линиям связи RS-485, RS-422, RS-232.&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
* Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Транспорт Modbus-TCP====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по линиям связи Ethernet.&lt;br /&gt;
=====Доступные дочерние узлы =====&lt;br /&gt;
*Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Modbus регистр====&lt;br /&gt;
Узел-источник, хранящий значение регистра.&lt;br /&gt;
&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
Нет&lt;br /&gt;
&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Доступ&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Устройство&lt;br /&gt;
|DeviceAddr&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция чтения&lt;br /&gt;
|ReadFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр чтения&lt;br /&gt;
|ReadRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Размер регистра&lt;br /&gt;
|ParamSize&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Приоритет&lt;br /&gt;
|Priority&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция записи&lt;br /&gt;
|WriteFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр записи&lt;br /&gt;
|WriteRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Тип значения&lt;br /&gt;
|ValueType&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Порядок байт&lt;br /&gt;
|ByteOrder&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции после чтения&lt;br /&gt;
|OperationsOnRead&lt;br /&gt;
|NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции перед записью&lt;br /&gt;
|OperationsOnWrite&lt;br /&gt;
| NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Узел для чтения/записи&lt;br /&gt;
|SourceId&lt;br /&gt;
|NODE&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|}Устройство&lt;br /&gt;
&lt;br /&gt;
Функция чтения&lt;br /&gt;
&lt;br /&gt;
Регистр чтения&lt;br /&gt;
&lt;br /&gt;
Размер регистра&lt;br /&gt;
&lt;br /&gt;
Приоритет&lt;br /&gt;
&lt;br /&gt;
Функция записи&lt;br /&gt;
&lt;br /&gt;
Регистр записи&lt;br /&gt;
&lt;br /&gt;
Тип значения&lt;br /&gt;
&lt;br /&gt;
Порядок байт&lt;br /&gt;
&lt;br /&gt;
Операции после чтения&lt;br /&gt;
&lt;br /&gt;
Операции перед записью&lt;br /&gt;
&lt;br /&gt;
Узел для чтения/записи&lt;br /&gt;
&lt;br /&gt;
===Работа транспорта===&lt;br /&gt;
Транспорты могут работать в двух режимах: &lt;br /&gt;
&lt;br /&gt;
* Ведущий (Master).&lt;br /&gt;
* Ведомый (Slave).&lt;br /&gt;
&lt;br /&gt;
====Режим Master (ведущий)====&lt;br /&gt;
[[Файл:AgavaPLC-Cхема работы Modbus мастера.png|мини|Cхема работы Modbus мастера]]&lt;br /&gt;
В режиме Master транспорт ведет обмен со связанными устройствами - запрашивает значения определенных регистров, записывает в регистры устройств значения, получаемые из виджетов или других узлов проекта. В этом режиме применяется [[Транспорты AgavaSCADA/AgavaPLC#Оптимизации операций записи в Modbus|оптимизация команд записи]].&lt;br /&gt;
&lt;br /&gt;
Схема работы транспорта в режиме Master приведена на схеме.&lt;br /&gt;
&lt;br /&gt;
Работа транспорта Modbus в этом режиме строится на следующих принципах:&lt;br /&gt;
&lt;br /&gt;
* Обмен данными ведется циклами «Запрос — Ответ».&lt;br /&gt;
* Транспорт в  этом режиме - Ведущий, то есть единственное устройство в сети, которое инициирует передачу данных. &lt;br /&gt;
* Ведомые (Slave) устройства никогда не начинают обмен самостоятельно, они только отвечают на запросы.&lt;br /&gt;
&lt;br /&gt;
===== Цикл «Запрос — Ответ» =====&lt;br /&gt;
Работа транспорта в этом режиме организована как последовательные циклы:&lt;br /&gt;
&lt;br /&gt;
# Формирование запроса: Master создает кадр, куда входит: адрес ведомого, код функции и данные (с какого адреса, сколько регистров).&lt;br /&gt;
# Отправка: Master передает кадр в шину (RS-485 или Ethernet).&lt;br /&gt;
# Ожидание: Master включает таймер ожидания ответа.&lt;br /&gt;
# Прием ответа: Если Slave с указанным адресом получил команду без ошибок, он отправляет ответный кадр.&lt;br /&gt;
# Тайм-аут: Если за отведенное время ответа нет, Master фиксирует ошибку (связь потеряна) и переходит к опросу следующего устройства или повторяет запрос.&lt;br /&gt;
&lt;br /&gt;
===== Управление таймингами =====&lt;br /&gt;
Master жестко контролирует паузы в сети:&lt;br /&gt;
&lt;br /&gt;
* Между отправкой запроса и приемом ответа: Master выдерживает минимальную паузу на смену направления передачи (для RS-485).&lt;br /&gt;
* Таймаут ожидания ответа: Задается в настройках Master. Если Slave медленный, Master не будет ждать вечно — он прерывает ожидание ответа и переходит к следующей транзакции.&lt;br /&gt;
* Межкадровая задержка: Master выдерживает паузу настраиваемой длительности между отправкой разных запросов, чтобы Slave успел обработать команду.&lt;br /&gt;
&lt;br /&gt;
===== Адресация =====&lt;br /&gt;
&lt;br /&gt;
* Master отправляет запрос строго конкретному Slave (адрес от 1 до 247).&lt;br /&gt;
* Широковещательный адрес (0): Master может отправить команду всем Slave сразу (например, «запустить моторы»). В этом режиме ведомые не отвечают, чтобы не создать коллизию в шине. В данный момент не поддерживается.&lt;br /&gt;
&lt;br /&gt;
===== Обработка ошибок =====&lt;br /&gt;
Master проверяет:&lt;br /&gt;
&lt;br /&gt;
* Контрольную сумму ответа (CRC) (только &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Код исключения: Не вернул ли Slave код ошибки (например, 0x02 — неверный адрес регистра).&lt;br /&gt;
&lt;br /&gt;
====Режим Slave (ведомый)====&lt;br /&gt;
[[Файл:AgavaPLC-Схема работы Modbus slave.png|мини|Схема работы Modbus slave]]&lt;br /&gt;
В режиме Slave транспорт ведет обмен со связанными устройствами в пассивном режиме - принимает запросы от ведущих и выдает ответы.&lt;br /&gt;
&lt;br /&gt;
Схема работы транспорта в режиме Slave приведена на схеме.&lt;br /&gt;
&lt;br /&gt;
===Оптимизации операций записи в Modbus===&lt;br /&gt;
&lt;br /&gt;
*'''Цель''': уменьшить трафик и задержки и ускорить достижение согласованного состояния на устройстве.&lt;br /&gt;
*'''Область применения''': операции записи функций 5/6/15/16; чтение не оптимизируется.&lt;br /&gt;
&lt;br /&gt;
==== Модель команды и терминология====&lt;br /&gt;
&lt;br /&gt;
*'''Что содержит команда''': идентификатор устройства (&amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;), номер функции (&amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt;), адрес или диапазон адресов, и полезную нагрузку (значения для записи).&lt;br /&gt;
**Для функций 5 и 6 записывается один адрес.&lt;br /&gt;
**Для функций 15 и 16 может записываться непрерывный диапазон адресов.&lt;br /&gt;
*При сравнении двух команд '''одинаковыми командами''' считаются те, у которых полностью совпадают &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, функция и адрес регистра.&lt;br /&gt;
*'''Смежными диапазонами''' являются диапазоны, между которыми нет разрыва — один начинается сразу после другого. Примеры: смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..8&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;10..10&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;11..15&amp;lt;/code&amp;gt;. Не смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;6..8&amp;lt;/code&amp;gt; (разрыв), &amp;lt;code&amp;gt;3..7&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..9&amp;lt;/code&amp;gt; (перекрытие).&lt;br /&gt;
*'''Неподтверждённой записью''', является та, которая находится в очереди и ещё не была отправлена драйвером на устройство.&lt;br /&gt;
&lt;br /&gt;
====Этап 1. Дедупликация при постановке в очередь ====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': убрать лишние повторные записи одного и того же адреса, если между ними не было попытки отправки на устройство.&lt;br /&gt;
*'''Принцип дедупликации''': Если в очереди уже есть неподтверждённая запись для того же &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, той же функции и того же адреса, то новая запись заменяет значение в существующей, а сама в очередь не добавляется.&lt;br /&gt;
*'''Что не дедуплицируется''':&lt;br /&gt;
**Разные адреса, разные функции или разные устройства.&lt;br /&gt;
**Операции чтения.&lt;br /&gt;
**Объединение диапазонов — отдельный механизм (см. Этап 2).&lt;br /&gt;
*'''Эффект''':&lt;br /&gt;
**Снижается нагрузка на канал и устройство при частых обновлениях одного тега.&lt;br /&gt;
**В устройство уходит самое свежее значение на момент отправки.&lt;br /&gt;
&lt;br /&gt;
==== Этап 2. Объединение команд записи (функции 15 и 16)====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': сократить число запросов, объединив записи в соседние адреса в один непрерывный блок.&lt;br /&gt;
*'''Что объединяется''':&lt;br /&gt;
**Функция 15 (Write Multiple Coils): катушки с непрерывными адресами.&lt;br /&gt;
**Функция 16 (Write Multiple Registers): регистры хранения с непрерывными адресами.&lt;br /&gt;
**Только записи с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и одинаковой функцией (15 или 16).&lt;br /&gt;
*'''Условия объединения''': Несколько записей с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и функцией 15 или 16, чьи адресные диапазоны идут подряд без разрывов, объединяются в одну запись с общим диапазоном от минимального до максимального адреса.&lt;br /&gt;
*'''Формирование буфера значений''':&lt;br /&gt;
**Для 15: формируется массив булевых значений по адресам в объединённом диапазоне.&lt;br /&gt;
**Для 16: формируется массив 16-битных слов по адресам в объединённом диапазоне.&lt;br /&gt;
***32-битные типы (Int32/UInt32/Float32) занимают два 16-битных слова.&lt;br /&gt;
*** Соблюдается заданный порядок слов (Normal/Inverse).&lt;br /&gt;
**Если для одного адреса есть несколько кандидатов, берётся самое свежее значение на момент отправки.&lt;br /&gt;
*'''Порядок и атомарность''':&lt;br /&gt;
**Адреса в блоке упорядочиваются по возрастанию.&lt;br /&gt;
**Отправка выполняется одной операцией: &amp;lt;code&amp;gt;writeCoils&amp;lt;/code&amp;gt; (15) или &amp;lt;code&amp;gt;writeRegisters&amp;lt;/code&amp;gt; (16).&lt;br /&gt;
**Логирование отражает одну агрегированную запись.&lt;br /&gt;
*'''Что не объединяется''':&lt;br /&gt;
**Разные &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; или разные функции (15 и 16 не смешиваются).&lt;br /&gt;
**Диапазоны с разрывами.&lt;br /&gt;
**Операции чтения и иные типы команд.&lt;br /&gt;
&lt;br /&gt;
====Ограничения====&lt;br /&gt;
&lt;br /&gt;
#Ограничение длины кадра устройства/драйвера может приводить к разбиению больших блоков.&lt;br /&gt;
#Объединение выполняется на этапе подготовки к отправке; до него действует дедупликация.&lt;br /&gt;
# При ошибке статусы возвращаются для всей агрегированной операции, повторы — по общей логике.&lt;br /&gt;
&lt;br /&gt;
====Примеры====&lt;br /&gt;
&lt;br /&gt;
*'''Дедупликация''':&lt;br /&gt;
**Три записи в один регистр: 10 → 20 → 30. В очереди остаётся одна запись; отправляется значение 30.&lt;br /&gt;
**Две записи в разные регистры: обе будут отправлены независимо.&lt;br /&gt;
**Записи в один адрес, но с разными функциями (например, 5 и 15): считаются разными и отправляются раздельно.&lt;br /&gt;
*'''Объединение 15/16''':&lt;br /&gt;
**Функция 16: записи 40010..40011 и 40012 объединяются в 40010..40012 и уходят одной операцией.&lt;br /&gt;
**Функция 15: записи катушек 1..4 и 5..8 объединяются в 1..8 и отправляются одной операцией.&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_OPC_UA}}&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_SNMP}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3487</id>
		<title>Класс SystemAlarming</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3487"/>
		<updated>2026-04-10T08:36:36Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;br /&gt;
Класс SystemAlarming представляет собой узел типа &amp;lt;code&amp;gt;Система тревог&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс доступен в версии &amp;lt;code&amp;gt;AS 1.6.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предок: [[Описание базовых классов AgavaSCADA/AgavaPLC#BasicNode|BasicNode]].&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Методы ===&lt;br /&gt;
 '''void SystemAlarming::AcknowledgeAll()'''          ///&amp;lt; Квитирование всех активных тревог&lt;br /&gt;
Метод выполняет квитирование всех активных тревог, отображаемых в окне тревог.&lt;br /&gt;
&lt;br /&gt;
Результат - &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
 void FunctionCpp()&lt;br /&gt;
 {&lt;br /&gt;
     static SystemAlarming@ sysal = SystemAlarming(&amp;quot;/Project/Station/SystemAlarming&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     sysal.AcknowledgeAll();&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3486</id>
		<title>Транспорты AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3486"/>
		<updated>2026-04-10T08:22:17Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Режимы работы транспорта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Транспорты Modbus-RTU, Modbus-TCP==&lt;br /&gt;
Данные виды транспортов предназначены для приема и передачи данных по протоколу Modbus. Поддерживаются последовательные и Ethernet подключения.&lt;br /&gt;
===Узлы===&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; - транспорт, работающий по последовательным линиям связи.&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt; - транспорт, работающий по ethernet.&lt;br /&gt;
*&amp;lt;code&amp;gt;Modbus регистр&amp;lt;/code&amp;gt; - источник, хранящий значение регистра.&lt;br /&gt;
====Транспорт Modbus-RTU====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по последовательным линиям связи RS-485, RS-422, RS-232.&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
* Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Транспорт Modbus-TCP====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по линиям связи Ethernet.&lt;br /&gt;
=====Доступные дочерние узлы =====&lt;br /&gt;
*Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Modbus регистр====&lt;br /&gt;
Узел-источник, хранящий значение регистра.&lt;br /&gt;
&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
Нет&lt;br /&gt;
&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Доступ&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Устройство&lt;br /&gt;
|DeviceAddr&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция чтения&lt;br /&gt;
|ReadFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр чтения&lt;br /&gt;
|ReadRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Размер регистра&lt;br /&gt;
|ParamSize&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Приоритет&lt;br /&gt;
|Priority&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция записи&lt;br /&gt;
|WriteFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр записи&lt;br /&gt;
|WriteRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Тип значения&lt;br /&gt;
|ValueType&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Порядок байт&lt;br /&gt;
|ByteOrder&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции после чтения&lt;br /&gt;
|OperationsOnRead&lt;br /&gt;
|NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции перед записью&lt;br /&gt;
|OperationsOnWrite&lt;br /&gt;
| NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Узел для чтения/записи&lt;br /&gt;
|SourceId&lt;br /&gt;
|NODE&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|}Устройство&lt;br /&gt;
&lt;br /&gt;
Функция чтения&lt;br /&gt;
&lt;br /&gt;
Регистр чтения&lt;br /&gt;
&lt;br /&gt;
Размер регистра&lt;br /&gt;
&lt;br /&gt;
Приоритет&lt;br /&gt;
&lt;br /&gt;
Функция записи&lt;br /&gt;
&lt;br /&gt;
Регистр записи&lt;br /&gt;
&lt;br /&gt;
Тип значения&lt;br /&gt;
&lt;br /&gt;
Порядок байт&lt;br /&gt;
&lt;br /&gt;
Операции после чтения&lt;br /&gt;
&lt;br /&gt;
Операции перед записью&lt;br /&gt;
&lt;br /&gt;
Узел для чтения/записи&lt;br /&gt;
&lt;br /&gt;
===Режимы работы транспорта===&lt;br /&gt;
&lt;br /&gt;
====Режим Master (ведущий)====&lt;br /&gt;
[[Файл:AgavaPLC-Cхема работы Modbus мастера.png|мини|Cхема работы Modbus мастера]]&lt;br /&gt;
В режиме Master транспорт ведет обмен со связанными устройствами - запрашивает значения определенных регистров, записывает в регистры устройств значения, получаемые из виджетов или других узлов проекта. В этом режиме применяется [[Транспорты AgavaSCADA/AgavaPLC#Оптимизации операций записи в Modbus|оптимизация команд записи]].&lt;br /&gt;
&lt;br /&gt;
Схема работы транспорта в режиме Master приведена на схеме.&lt;br /&gt;
&lt;br /&gt;
====Режим Slave (ведомый)====&lt;br /&gt;
[[Файл:AgavaPLC-Схема работы Modbus slave.png|мини|Схема работы Modbus slave]]&lt;br /&gt;
В режиме Slave транспорт ведет обмен со связанными устройствами в пассивном режиме - принимает запросы от ведущих и выдает ответы.&lt;br /&gt;
&lt;br /&gt;
Схема работы транспорта в режиме Slave приведена на схеме.&lt;br /&gt;
&lt;br /&gt;
===Оптимизации операций записи в Modbus===&lt;br /&gt;
&lt;br /&gt;
*'''Цель''': уменьшить трафик и задержки и ускорить достижение согласованного состояния на устройстве.&lt;br /&gt;
*'''Область применения''': операции записи функций 5/6/15/16; чтение не оптимизируется.&lt;br /&gt;
&lt;br /&gt;
==== Модель команды и терминология====&lt;br /&gt;
&lt;br /&gt;
*'''Что содержит команда''': идентификатор устройства (&amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;), номер функции (&amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt;), адрес или диапазон адресов, и полезную нагрузку (значения для записи).&lt;br /&gt;
**Для функций 5 и 6 записывается один адрес.&lt;br /&gt;
**Для функций 15 и 16 может записываться непрерывный диапазон адресов.&lt;br /&gt;
*При сравнении двух команд '''одинаковыми командами''' считаются те, у которых полностью совпадают &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, функция и адрес регистра.&lt;br /&gt;
*'''Смежными диапазонами''' являются диапазоны, между которыми нет разрыва — один начинается сразу после другого. Примеры: смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..8&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;10..10&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;11..15&amp;lt;/code&amp;gt;. Не смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;6..8&amp;lt;/code&amp;gt; (разрыв), &amp;lt;code&amp;gt;3..7&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..9&amp;lt;/code&amp;gt; (перекрытие).&lt;br /&gt;
*'''Неподтверждённой записью''', является та, которая находится в очереди и ещё не была отправлена драйвером на устройство.&lt;br /&gt;
&lt;br /&gt;
====Этап 1. Дедупликация при постановке в очередь ====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': убрать лишние повторные записи одного и того же адреса, если между ними не было попытки отправки на устройство.&lt;br /&gt;
*'''Принцип дедупликации''': Если в очереди уже есть неподтверждённая запись для того же &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, той же функции и того же адреса, то новая запись заменяет значение в существующей, а сама в очередь не добавляется.&lt;br /&gt;
*'''Что не дедуплицируется''':&lt;br /&gt;
**Разные адреса, разные функции или разные устройства.&lt;br /&gt;
**Операции чтения.&lt;br /&gt;
**Объединение диапазонов — отдельный механизм (см. Этап 2).&lt;br /&gt;
*'''Эффект''':&lt;br /&gt;
**Снижается нагрузка на канал и устройство при частых обновлениях одного тега.&lt;br /&gt;
**В устройство уходит самое свежее значение на момент отправки.&lt;br /&gt;
&lt;br /&gt;
==== Этап 2. Объединение команд записи (функции 15 и 16)====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': сократить число запросов, объединив записи в соседние адреса в один непрерывный блок.&lt;br /&gt;
*'''Что объединяется''':&lt;br /&gt;
**Функция 15 (Write Multiple Coils): катушки с непрерывными адресами.&lt;br /&gt;
**Функция 16 (Write Multiple Registers): регистры хранения с непрерывными адресами.&lt;br /&gt;
**Только записи с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и одинаковой функцией (15 или 16).&lt;br /&gt;
*'''Условия объединения''': Несколько записей с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и функцией 15 или 16, чьи адресные диапазоны идут подряд без разрывов, объединяются в одну запись с общим диапазоном от минимального до максимального адреса.&lt;br /&gt;
*'''Формирование буфера значений''':&lt;br /&gt;
**Для 15: формируется массив булевых значений по адресам в объединённом диапазоне.&lt;br /&gt;
**Для 16: формируется массив 16-битных слов по адресам в объединённом диапазоне.&lt;br /&gt;
***32-битные типы (Int32/UInt32/Float32) занимают два 16-битных слова.&lt;br /&gt;
*** Соблюдается заданный порядок слов (Normal/Inverse).&lt;br /&gt;
**Если для одного адреса есть несколько кандидатов, берётся самое свежее значение на момент отправки.&lt;br /&gt;
*'''Порядок и атомарность''':&lt;br /&gt;
**Адреса в блоке упорядочиваются по возрастанию.&lt;br /&gt;
**Отправка выполняется одной операцией: &amp;lt;code&amp;gt;writeCoils&amp;lt;/code&amp;gt; (15) или &amp;lt;code&amp;gt;writeRegisters&amp;lt;/code&amp;gt; (16).&lt;br /&gt;
**Логирование отражает одну агрегированную запись.&lt;br /&gt;
*'''Что не объединяется''':&lt;br /&gt;
**Разные &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; или разные функции (15 и 16 не смешиваются).&lt;br /&gt;
**Диапазоны с разрывами.&lt;br /&gt;
**Операции чтения и иные типы команд.&lt;br /&gt;
&lt;br /&gt;
====Ограничения====&lt;br /&gt;
&lt;br /&gt;
#Ограничение длины кадра устройства/драйвера может приводить к разбиению больших блоков.&lt;br /&gt;
#Объединение выполняется на этапе подготовки к отправке; до него действует дедупликация.&lt;br /&gt;
# При ошибке статусы возвращаются для всей агрегированной операции, повторы — по общей логике.&lt;br /&gt;
&lt;br /&gt;
====Примеры====&lt;br /&gt;
&lt;br /&gt;
*'''Дедупликация''':&lt;br /&gt;
**Три записи в один регистр: 10 → 20 → 30. В очереди остаётся одна запись; отправляется значение 30.&lt;br /&gt;
**Две записи в разные регистры: обе будут отправлены независимо.&lt;br /&gt;
**Записи в один адрес, но с разными функциями (например, 5 и 15): считаются разными и отправляются раздельно.&lt;br /&gt;
*'''Объединение 15/16''':&lt;br /&gt;
**Функция 16: записи 40010..40011 и 40012 объединяются в 40010..40012 и уходят одной операцией.&lt;br /&gt;
**Функция 15: записи катушек 1..4 и 5..8 объединяются в 1..8 и отправляются одной операцией.&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_OPC_UA}}&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_SNMP}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_Modbus_slave.png&amp;diff=3485</id>
		<title>Файл:AgavaPLC-Схема работы Modbus slave.png</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_Modbus_slave.png&amp;diff=3485"/>
		<updated>2026-04-10T08:21:58Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AgavaPLC-Схема работы Modbus slave&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3484</id>
		<title>Транспорты AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3484"/>
		<updated>2026-04-10T08:18:16Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Транспорты Modbus-RTU, Modbus-TCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Транспорты Modbus-RTU, Modbus-TCP==&lt;br /&gt;
Данные виды транспортов предназначены для приема и передачи данных по протоколу Modbus. Поддерживаются последовательные и Ethernet подключения.&lt;br /&gt;
===Узлы===&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; - транспорт, работающий по последовательным линиям связи.&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt; - транспорт, работающий по ethernet.&lt;br /&gt;
*&amp;lt;code&amp;gt;Modbus регистр&amp;lt;/code&amp;gt; - источник, хранящий значение регистра.&lt;br /&gt;
====Транспорт Modbus-RTU====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по последовательным линиям связи RS-485, RS-422, RS-232.&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
* Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Транспорт Modbus-TCP====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по линиям связи Ethernet.&lt;br /&gt;
=====Доступные дочерние узлы =====&lt;br /&gt;
*Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
====Modbus регистр====&lt;br /&gt;
Узел-источник, хранящий значение регистра.&lt;br /&gt;
&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
Нет&lt;br /&gt;
&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Доступ&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Устройство&lt;br /&gt;
|DeviceAddr&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция чтения&lt;br /&gt;
|ReadFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр чтения&lt;br /&gt;
|ReadRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Размер регистра&lt;br /&gt;
|ParamSize&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Приоритет&lt;br /&gt;
|Priority&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция записи&lt;br /&gt;
|WriteFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр записи&lt;br /&gt;
|WriteRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Тип значения&lt;br /&gt;
|ValueType&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Порядок байт&lt;br /&gt;
|ByteOrder&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции после чтения&lt;br /&gt;
|OperationsOnRead&lt;br /&gt;
|NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции перед записью&lt;br /&gt;
|OperationsOnWrite&lt;br /&gt;
| NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Узел для чтения/записи&lt;br /&gt;
|SourceId&lt;br /&gt;
|NODE&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|}Устройство&lt;br /&gt;
&lt;br /&gt;
Функция чтения&lt;br /&gt;
&lt;br /&gt;
Регистр чтения&lt;br /&gt;
&lt;br /&gt;
Размер регистра&lt;br /&gt;
&lt;br /&gt;
Приоритет&lt;br /&gt;
&lt;br /&gt;
Функция записи&lt;br /&gt;
&lt;br /&gt;
Регистр записи&lt;br /&gt;
&lt;br /&gt;
Тип значения&lt;br /&gt;
&lt;br /&gt;
Порядок байт&lt;br /&gt;
&lt;br /&gt;
Операции после чтения&lt;br /&gt;
&lt;br /&gt;
Операции перед записью&lt;br /&gt;
&lt;br /&gt;
Узел для чтения/записи&lt;br /&gt;
&lt;br /&gt;
===Режимы работы транспорта===&lt;br /&gt;
&lt;br /&gt;
====Режим Master (ведущий)====&lt;br /&gt;
[[Файл:AgavaPLC-Cхема работы Modbus мастера.png|мини|Cхема работы Modbus мастера]]&lt;br /&gt;
В режиме Master транспорт ведет обмен со связанными устройствами - запрашивает значения определенных регистров, записывает в регистры устройств значения, получаемые из виджетов или других узлов проекта. В этом режиме применяется [[Транспорты AgavaSCADA/AgavaPLC#Оптимизации операций записи в Modbus|оптимизация команд записи]].&lt;br /&gt;
&lt;br /&gt;
Схема работы транспорта в режиме Master приведена на схеме.&lt;br /&gt;
&lt;br /&gt;
====Режим Slave (ведомый)====&lt;br /&gt;
&lt;br /&gt;
===Оптимизации операций записи в Modbus===&lt;br /&gt;
&lt;br /&gt;
*'''Цель''': уменьшить трафик и задержки и ускорить достижение согласованного состояния на устройстве.&lt;br /&gt;
*'''Область применения''': операции записи функций 5/6/15/16; чтение не оптимизируется.&lt;br /&gt;
&lt;br /&gt;
==== Модель команды и терминология====&lt;br /&gt;
&lt;br /&gt;
*'''Что содержит команда''': идентификатор устройства (&amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;), номер функции (&amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt;), адрес или диапазон адресов, и полезную нагрузку (значения для записи).&lt;br /&gt;
**Для функций 5 и 6 записывается один адрес.&lt;br /&gt;
**Для функций 15 и 16 может записываться непрерывный диапазон адресов.&lt;br /&gt;
*При сравнении двух команд '''одинаковыми командами''' считаются те, у которых полностью совпадают &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, функция и адрес регистра.&lt;br /&gt;
*'''Смежными диапазонами''' являются диапазоны, между которыми нет разрыва — один начинается сразу после другого. Примеры: смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..8&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;10..10&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;11..15&amp;lt;/code&amp;gt;. Не смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;6..8&amp;lt;/code&amp;gt; (разрыв), &amp;lt;code&amp;gt;3..7&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..9&amp;lt;/code&amp;gt; (перекрытие).&lt;br /&gt;
*'''Неподтверждённой записью''', является та, которая находится в очереди и ещё не была отправлена драйвером на устройство.&lt;br /&gt;
&lt;br /&gt;
====Этап 1. Дедупликация при постановке в очередь ====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': убрать лишние повторные записи одного и того же адреса, если между ними не было попытки отправки на устройство.&lt;br /&gt;
*'''Принцип дедупликации''': Если в очереди уже есть неподтверждённая запись для того же &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, той же функции и того же адреса, то новая запись заменяет значение в существующей, а сама в очередь не добавляется.&lt;br /&gt;
*'''Что не дедуплицируется''':&lt;br /&gt;
**Разные адреса, разные функции или разные устройства.&lt;br /&gt;
**Операции чтения.&lt;br /&gt;
**Объединение диапазонов — отдельный механизм (см. Этап 2).&lt;br /&gt;
*'''Эффект''':&lt;br /&gt;
**Снижается нагрузка на канал и устройство при частых обновлениях одного тега.&lt;br /&gt;
**В устройство уходит самое свежее значение на момент отправки.&lt;br /&gt;
&lt;br /&gt;
==== Этап 2. Объединение команд записи (функции 15 и 16)====&lt;br /&gt;
&lt;br /&gt;
*'''Назначение''': сократить число запросов, объединив записи в соседние адреса в один непрерывный блок.&lt;br /&gt;
*'''Что объединяется''':&lt;br /&gt;
**Функция 15 (Write Multiple Coils): катушки с непрерывными адресами.&lt;br /&gt;
**Функция 16 (Write Multiple Registers): регистры хранения с непрерывными адресами.&lt;br /&gt;
**Только записи с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и одинаковой функцией (15 или 16).&lt;br /&gt;
*'''Условия объединения''': Несколько записей с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и функцией 15 или 16, чьи адресные диапазоны идут подряд без разрывов, объединяются в одну запись с общим диапазоном от минимального до максимального адреса.&lt;br /&gt;
*'''Формирование буфера значений''':&lt;br /&gt;
**Для 15: формируется массив булевых значений по адресам в объединённом диапазоне.&lt;br /&gt;
**Для 16: формируется массив 16-битных слов по адресам в объединённом диапазоне.&lt;br /&gt;
***32-битные типы (Int32/UInt32/Float32) занимают два 16-битных слова.&lt;br /&gt;
*** Соблюдается заданный порядок слов (Normal/Inverse).&lt;br /&gt;
**Если для одного адреса есть несколько кандидатов, берётся самое свежее значение на момент отправки.&lt;br /&gt;
*'''Порядок и атомарность''':&lt;br /&gt;
**Адреса в блоке упорядочиваются по возрастанию.&lt;br /&gt;
**Отправка выполняется одной операцией: &amp;lt;code&amp;gt;writeCoils&amp;lt;/code&amp;gt; (15) или &amp;lt;code&amp;gt;writeRegisters&amp;lt;/code&amp;gt; (16).&lt;br /&gt;
**Логирование отражает одну агрегированную запись.&lt;br /&gt;
*'''Что не объединяется''':&lt;br /&gt;
**Разные &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; или разные функции (15 и 16 не смешиваются).&lt;br /&gt;
**Диапазоны с разрывами.&lt;br /&gt;
**Операции чтения и иные типы команд.&lt;br /&gt;
&lt;br /&gt;
====Ограничения====&lt;br /&gt;
&lt;br /&gt;
#Ограничение длины кадра устройства/драйвера может приводить к разбиению больших блоков.&lt;br /&gt;
#Объединение выполняется на этапе подготовки к отправке; до него действует дедупликация.&lt;br /&gt;
# При ошибке статусы возвращаются для всей агрегированной операции, повторы — по общей логике.&lt;br /&gt;
&lt;br /&gt;
====Примеры====&lt;br /&gt;
&lt;br /&gt;
*'''Дедупликация''':&lt;br /&gt;
**Три записи в один регистр: 10 → 20 → 30. В очереди остаётся одна запись; отправляется значение 30.&lt;br /&gt;
**Две записи в разные регистры: обе будут отправлены независимо.&lt;br /&gt;
**Записи в один адрес, но с разными функциями (например, 5 и 15): считаются разными и отправляются раздельно.&lt;br /&gt;
*'''Объединение 15/16''':&lt;br /&gt;
**Функция 16: записи 40010..40011 и 40012 объединяются в 40010..40012 и уходят одной операцией.&lt;br /&gt;
**Функция 15: записи катушек 1..4 и 5..8 объединяются в 1..8 и отправляются одной операцией.&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_OPC_UA}}&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_SNMP}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3483</id>
		<title>Транспорты AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A2%D1%80%D0%B0%D0%BD%D1%81%D0%BF%D0%BE%D1%80%D1%82%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3483"/>
		<updated>2026-04-10T08:13:30Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Транспорты Modbus-RTU, Modbus-TCP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Транспорты Modbus-RTU, Modbus-TCP==&lt;br /&gt;
Данные виды транспортов предназначены для приема и передачи данных по протоколу Modbus. Поддерживаются последовательные и Ethernet подключения, а также [[Транспорты AgavaSCADA/AgavaPLC#Оптимизации операций записи в Modbus|некоторые оптимизации команд записи]].&lt;br /&gt;
===Узлы===&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; - транспорт, работающий по последовательным линиям связи.&lt;br /&gt;
*&amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt; - транспорт, работающий по ethernet.&lt;br /&gt;
*&amp;lt;code&amp;gt;Modbus регистр&amp;lt;/code&amp;gt; - источник, хранящий значение регистра.&lt;br /&gt;
====Транспорт Modbus-RTU====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по последовательным линиям связи RS-485, RS-422, RS-232.&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
*Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
==== Транспорт Modbus-TCP ====&lt;br /&gt;
Узел, представляющий транспорт Modbus, работающий по линиям связи Ethernet.&lt;br /&gt;
=====Доступные дочерние узлы=====&lt;br /&gt;
*Группа узлов.&lt;br /&gt;
*Modbus регистр.&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
&lt;br /&gt;
==== Modbus регистр ====&lt;br /&gt;
Узел-источник, хранящий значение регистра.&lt;br /&gt;
&lt;br /&gt;
===== Доступные дочерние узлы =====&lt;br /&gt;
Нет&lt;br /&gt;
&lt;br /&gt;
=====Свойства=====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Наименование свойства&lt;br /&gt;
!Идентификатор&lt;br /&gt;
!Тип&lt;br /&gt;
!Доступ&lt;br /&gt;
!Описание&lt;br /&gt;
|-&lt;br /&gt;
|Устройство&lt;br /&gt;
|DeviceAddr&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция чтения&lt;br /&gt;
|ReadFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр чтения&lt;br /&gt;
|ReadRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Размер регистра&lt;br /&gt;
|ParamSize&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Приоритет&lt;br /&gt;
|Priority&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Функция записи&lt;br /&gt;
|WriteFunction&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Регистр записи&lt;br /&gt;
|WriteRegister&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Тип значения&lt;br /&gt;
|ValueType&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Порядок байт&lt;br /&gt;
|ByteOrder&lt;br /&gt;
|INT&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции после чтения&lt;br /&gt;
|OperationsOnRead&lt;br /&gt;
|NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Операции перед записью&lt;br /&gt;
|OperationsOnWrite&lt;br /&gt;
|NODESARRAY&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Узел для чтения/записи&lt;br /&gt;
|SourceId&lt;br /&gt;
|NODE&lt;br /&gt;
|Чтение / запись&lt;br /&gt;
|&lt;br /&gt;
|}Устройство&lt;br /&gt;
&lt;br /&gt;
Функция чтения&lt;br /&gt;
&lt;br /&gt;
Регистр чтения&lt;br /&gt;
&lt;br /&gt;
Размер регистра&lt;br /&gt;
&lt;br /&gt;
Приоритет&lt;br /&gt;
&lt;br /&gt;
Функция записи&lt;br /&gt;
&lt;br /&gt;
Регистр записи&lt;br /&gt;
&lt;br /&gt;
Тип значения&lt;br /&gt;
&lt;br /&gt;
Порядок байт&lt;br /&gt;
&lt;br /&gt;
Операции после чтения&lt;br /&gt;
&lt;br /&gt;
Операции перед записью&lt;br /&gt;
&lt;br /&gt;
Узел для чтения/записи&lt;br /&gt;
&lt;br /&gt;
=== Режимы работы транспорта ===&lt;br /&gt;
&lt;br /&gt;
==== Режим Master (ведущий) ====&lt;br /&gt;
[[Файл:AgavaPLC-Cхема работы Modbus мастера.png|мини|Cхема работы Modbus мастера]]&lt;br /&gt;
Схема работы транспорта в режиме Master приведена на схеме.&lt;br /&gt;
&lt;br /&gt;
==== Режим Slave (ведомый) ====&lt;br /&gt;
&lt;br /&gt;
=== Оптимизации операций записи в Modbus ===&lt;br /&gt;
&lt;br /&gt;
* '''Цель''': уменьшить трафик и задержки и ускорить достижение согласованного состояния на устройстве.&lt;br /&gt;
* '''Область применения''': операции записи функций 5/6/15/16; чтение не оптимизируется.&lt;br /&gt;
&lt;br /&gt;
==== Модель команды и терминология ====&lt;br /&gt;
&lt;br /&gt;
* '''Что содержит команда''': идентификатор устройства (&amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;), номер функции (&amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt;), адрес или диапазон адресов, и полезную нагрузку (значения для записи).&lt;br /&gt;
** Для функций 5 и 6 записывается один адрес.&lt;br /&gt;
** Для функций 15 и 16 может записываться непрерывный диапазон адресов.&lt;br /&gt;
* При сравнении двух команд '''одинаковыми командами''' считаются те, у которых полностью совпадают &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, функция и адрес регистра.&lt;br /&gt;
* '''Смежными диапазонами''' являются диапазоны, между которыми нет разрыва — один начинается сразу после другого. Примеры: смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..8&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;10..10&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;11..15&amp;lt;/code&amp;gt;. Не смежные — &amp;lt;code&amp;gt;1..4&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;6..8&amp;lt;/code&amp;gt; (разрыв), &amp;lt;code&amp;gt;3..7&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;5..9&amp;lt;/code&amp;gt; (перекрытие).&lt;br /&gt;
* '''Неподтверждённой записью''', является та, которая находится в очереди и ещё не была отправлена драйвером на устройство.&lt;br /&gt;
&lt;br /&gt;
==== Этап 1. Дедупликация при постановке в очередь ====&lt;br /&gt;
&lt;br /&gt;
* '''Назначение''': убрать лишние повторные записи одного и того же адреса, если между ними не было попытки отправки на устройство.&lt;br /&gt;
* '''Принцип дедупликации''': Если в очереди уже есть неподтверждённая запись для того же &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt;, той же функции и того же адреса, то новая запись заменяет значение в существующей, а сама в очередь не добавляется.&lt;br /&gt;
* '''Что не дедуплицируется''':&lt;br /&gt;
** Разные адреса, разные функции или разные устройства.&lt;br /&gt;
** Операции чтения.&lt;br /&gt;
** Объединение диапазонов — отдельный механизм (см. Этап 2).&lt;br /&gt;
* '''Эффект''':&lt;br /&gt;
** Снижается нагрузка на канал и устройство при частых обновлениях одного тега.&lt;br /&gt;
** В устройство уходит самое свежее значение на момент отправки.&lt;br /&gt;
&lt;br /&gt;
==== Этап 2. Объединение команд записи (функции 15 и 16) ====&lt;br /&gt;
&lt;br /&gt;
* '''Назначение''': сократить число запросов, объединив записи в соседние адреса в один непрерывный блок.&lt;br /&gt;
* '''Что объединяется''':&lt;br /&gt;
** Функция 15 (Write Multiple Coils): катушки с непрерывными адресами.&lt;br /&gt;
** Функция 16 (Write Multiple Registers): регистры хранения с непрерывными адресами.&lt;br /&gt;
** Только записи с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и одинаковой функцией (15 или 16).&lt;br /&gt;
* '''Условия объединения''': Несколько записей с одинаковыми &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; и функцией 15 или 16, чьи адресные диапазоны идут подряд без разрывов, объединяются в одну запись с общим диапазоном от минимального до максимального адреса.&lt;br /&gt;
* '''Формирование буфера значений''':&lt;br /&gt;
** Для 15: формируется массив булевых значений по адресам в объединённом диапазоне.&lt;br /&gt;
** Для 16: формируется массив 16-битных слов по адресам в объединённом диапазоне.&lt;br /&gt;
*** 32-битные типы (Int32/UInt32/Float32) занимают два 16-битных слова.&lt;br /&gt;
*** Соблюдается заданный порядок слов (Normal/Inverse).&lt;br /&gt;
** Если для одного адреса есть несколько кандидатов, берётся самое свежее значение на момент отправки.&lt;br /&gt;
* '''Порядок и атомарность''':&lt;br /&gt;
** Адреса в блоке упорядочиваются по возрастанию.&lt;br /&gt;
** Отправка выполняется одной операцией: &amp;lt;code&amp;gt;writeCoils&amp;lt;/code&amp;gt; (15) или &amp;lt;code&amp;gt;writeRegisters&amp;lt;/code&amp;gt; (16).&lt;br /&gt;
** Логирование отражает одну агрегированную запись.&lt;br /&gt;
* '''Что не объединяется''':&lt;br /&gt;
** Разные &amp;lt;code&amp;gt;Slave ID&amp;lt;/code&amp;gt; или разные функции (15 и 16 не смешиваются).&lt;br /&gt;
** Диапазоны с разрывами.&lt;br /&gt;
** Операции чтения и иные типы команд.&lt;br /&gt;
&lt;br /&gt;
==== Ограничения ====&lt;br /&gt;
&lt;br /&gt;
# Ограничение длины кадра устройства/драйвера может приводить к разбиению больших блоков.&lt;br /&gt;
# Объединение выполняется на этапе подготовки к отправке; до него действует дедупликация.&lt;br /&gt;
# При ошибке статусы возвращаются для всей агрегированной операции, повторы — по общей логике.&lt;br /&gt;
&lt;br /&gt;
==== Примеры ====&lt;br /&gt;
&lt;br /&gt;
* '''Дедупликация''':&lt;br /&gt;
** Три записи в один регистр: 10 → 20 → 30. В очереди остаётся одна запись; отправляется значение 30.&lt;br /&gt;
** Две записи в разные регистры: обе будут отправлены независимо.&lt;br /&gt;
** Записи в один адрес, но с разными функциями (например, 5 и 15): считаются разными и отправляются раздельно.&lt;br /&gt;
* '''Объединение 15/16''':&lt;br /&gt;
** Функция 16: записи 40010..40011 и 40012 объединяются в 40010..40012 и уходят одной операцией.&lt;br /&gt;
** Функция 15: записи катушек 1..4 и 5..8 объединяются в 1..8 и отправляются одной операцией.&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_OPC_UA}}&lt;br /&gt;
{{Шаблон:AgavaSCADA_плагин_SNMP}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-C%D1%85%D0%B5%D0%BC%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_Modbus_%D0%BC%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B0.png&amp;diff=3482</id>
		<title>Файл:AgavaPLC-Cхема работы Modbus мастера.png</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-C%D1%85%D0%B5%D0%BC%D0%B0_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_Modbus_%D0%BC%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B0.png&amp;diff=3482"/>
		<updated>2026-04-10T08:12:33Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AgavaPLC-Cхема работы Modbus мастера&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3481</id>
		<title>Класс SystemAlarming</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3481"/>
		<updated>2026-04-10T06:38:29Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* 4.1 Методы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;br /&gt;
Класс SystemAlarming представляет собой узел типа &amp;lt;code&amp;gt;Система тревог&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс доступен в версии &amp;lt;code&amp;gt;AS 1.6.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предок: [[Описание базовых классов AgavaSCADA/AgavaPLC#BasicNode|BasicNode]].&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Методы ===&lt;br /&gt;
 '''void SystemAlarming::AcknowldgeAll()'''          ///&amp;lt; Квитирование всех активных тревог&lt;br /&gt;
Метод выполняет квитирование всех активных тревог, отображаемых в окне тревог.&lt;br /&gt;
&lt;br /&gt;
Результат - &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3480</id>
		<title>Класс SystemAlarming</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3480"/>
		<updated>2026-04-10T06:21:05Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;br /&gt;
Класс SystemAlarming представляет собой узел типа &amp;lt;code&amp;gt;Система тревог&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Класс доступен в версии &amp;lt;code&amp;gt;AS 1.6.34+&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предок: [[Описание базовых классов AgavaSCADA/AgavaPLC#BasicNode|BasicNode]].&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Методы ===&lt;br /&gt;
 '''void AcknowldgeAll()'''          ///&amp;lt; Квитирование всех активных тревог&lt;br /&gt;
Метод выполняет квитирование всех активных тревог, отображаемых в окне тревог.&lt;br /&gt;
&lt;br /&gt;
Результат - &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3479</id>
		<title>Класс SystemAlarming</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_SystemAlarming&amp;diff=3479"/>
		<updated>2026-04-10T06:17:44Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: Создана пустая страница&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=ASLauncher&amp;diff=3478</id>
		<title>ASLauncher</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=ASLauncher&amp;diff=3478"/>
		<updated>2026-04-08T10:06:23Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ASLauncher - менеджер рабочего стола AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
ASLauncher предназначен для использования совместно со средой исполнения и позволяет заменить собой штатную оболочку Windows. &lt;br /&gt;
&lt;br /&gt;
ASLauncher реализует следующие функции:&lt;br /&gt;
&lt;br /&gt;
* автозапуск AgavaSCADA;&lt;br /&gt;
* замена рабочего стола Windows;&lt;br /&gt;
* программный сторожевой таймер.&lt;br /&gt;
&lt;br /&gt;
== Автозапуск AgavaSCADA ==&lt;br /&gt;
Для настройки автозапуска AgavaSCADA при включении компьютера можно воспользоваться штатными функциями операционной системы Windows, либо использовать утилиту ASLauncher, способную выполнять автозапуск AgavaSCADA и позволяющую заменить стандартную оболочку Windows.&lt;br /&gt;
&lt;br /&gt;
== Замена оболочки рабочего стола Windows 10 ==&lt;br /&gt;
Для настройки ASLauncher в качестве оболочки рабочего стола Windows 10 необходимо внести изменения в реестр операционной системы. Вызовем стандартную утилиту '''«Редактор реестра»''' с помощью сочетания клавиш &amp;lt;code&amp;gt;Win + R&amp;lt;/code&amp;gt;, указав в качестве выполняемой программы &amp;lt;code&amp;gt;regedit&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Внимание:''' Перед внесением изменений в реестр рекомендуется создать резервную копию.&lt;br /&gt;
&lt;br /&gt;
=== Настройка автозапуска ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Чтобы ASLauncher автоматически запускался при старте операционной системы, необходимо добавить соответствующую запись в реестр. В '''«Редакторе реестра»''' перейдите в папку: &amp;lt;code&amp;gt;Компьютер\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run&amp;lt;/code&amp;gt;&lt;br /&gt;
# В правой части окна нажмите правой кнопкой мыши и выберите '''«Создать»''' → '''«Строковый параметр»'''. Присвойте ему имя &amp;lt;code&amp;gt;ASLauncher&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Для созданного параметра необходимо указать путь до исполняемого файла. Нажмите правой кнопкой мыши на записи &amp;lt;code&amp;gt;ASLauncher&amp;lt;/code&amp;gt; и выберите пункт '''«Изменить...»'''. В поле '''«Значение»''' введите полный путь до исполняемого файла (например, &amp;lt;code&amp;gt;C:\AgavaSCADA-1.2\bin\aslauncher.exe&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Установка ASLauncher в качестве стандартной оболочки рабочего стола ===&lt;br /&gt;
&lt;br /&gt;
# Чтобы сделать ASLauncher оболочкой рабочего стола по умолчанию, в '''«Редакторе реестра»''' перейдите в папку: &amp;lt;code&amp;gt;Компьютер\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon&amp;lt;/code&amp;gt;&lt;br /&gt;
# Найдите параметр &amp;lt;code&amp;gt;Shell&amp;lt;/code&amp;gt; (по умолчанию его значение — &amp;lt;code&amp;gt;explorer.exe&amp;lt;/code&amp;gt;). Если такого параметра нет, создайте новый '''«Строковый параметр»''' с именем &amp;lt;code&amp;gt;Shell&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Нажмите дважды на параметре &amp;lt;code&amp;gt;Shell&amp;lt;/code&amp;gt; и замените его значение на полный путь до исполняемого файла ASLauncher (например, &amp;lt;code&amp;gt;C:\AgavaSCADA-1.2\bin\aslauncher.exe&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Отключение Error Reporting ===&lt;br /&gt;
&lt;br /&gt;
# Для отключения отправки отчетов об ошибках, в '''«Редакторе реестра»''' перейдите к следующему разделу: &amp;lt;code&amp;gt;Компьютер\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting&amp;lt;/code&amp;gt;&lt;br /&gt;
# В правой части окна найдите параметр &amp;lt;code&amp;gt;Disabled&amp;lt;/code&amp;gt; типа &amp;lt;code&amp;gt;DWORD (32-бит)&amp;lt;/code&amp;gt;. Если такого параметра нет, создайте его, нажав правой кнопкой мыши, выбрав '''«Создать»''' → '''«Параметр DWORD (32 бита)»''' и присвоив ему имя '''Disabled'''.&lt;br /&gt;
# Дважды щелкните по параметру &amp;lt;code&amp;gt;Disabled&amp;lt;/code&amp;gt; и установите значение '''1''' в поле '''«Значение»'''. Нажмите '''«ОК»''' для сохранения изменений.&lt;br /&gt;
&lt;br /&gt;
=== Примечание ===&lt;br /&gt;
&lt;br /&gt;
# После внесения всех изменений перезагрузите компьютер, чтобы они вступили в силу.&lt;br /&gt;
# В результате замены стандартной оболочки рабочего стола Windows на ASLauncher, для пользователя блокируются все штатные функции Windows — запуск установленных программ, все операции с файлами на дисках и т. д. ASLauncher предоставляет пользователю собственный рабочий стол со следующими функциями:&lt;br /&gt;
#* Запуск среды исполнения.&lt;br /&gt;
#* Перезагрузка и выключение АРМ.&lt;br /&gt;
#* Просмотр текущей даты и времени.&lt;br /&gt;
#* Запуск штатной оболочки Windows.&lt;br /&gt;
&lt;br /&gt;
=== Отключение ASLauncher как оболочки рабочего стола Windows 10 ===&lt;br /&gt;
&lt;br /&gt;
== Конфигурирование ASLauncher, версия 1.2 ==&lt;br /&gt;
Все настройки ASLauncher хранятся в файле aslauncher.ini, размещаемом в папке с исполняемыми файлами AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
Пример содержимого файла приведен ниже:&lt;br /&gt;
 [General]&lt;br /&gt;
 ProcessFile=&amp;quot;C:/AavaSCADA-1.2/bin/rtu.exe&amp;quot;&lt;br /&gt;
 Wallpaper=&amp;quot;C:/Images/wallpaper.png&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Описание параметров и значений &amp;lt;code&amp;gt;.ini&amp;lt;/code&amp;gt; файла ===&lt;br /&gt;
Секция &amp;lt;code&amp;gt;[General]&amp;lt;/code&amp;gt; содержит основные настройки приложения.&lt;br /&gt;
* Параметр&amp;lt;code&amp;gt;Wallpaper&amp;lt;/code&amp;gt;&lt;br /&gt;
**'''Описание''': Задает путь к изображению, используемому в качестве обоев рабочего стола.&lt;br /&gt;
**'''Тип''': Файл.&lt;br /&gt;
**'''Формат''': Абсолютный путь.&lt;br /&gt;
**'''Пример значения''': &amp;lt;code&amp;gt;Wallpaper=&amp;quot;C:/Images/wallpaper.png&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Параметр&amp;lt;code&amp;gt;ProcessFile&amp;lt;/code&amp;gt;&lt;br /&gt;
**'''Описание''': Задает путь до исполняемого файла (обычно rtu.exe), запускаемого при старте ASLauncher.&lt;br /&gt;
**'''Тип''': Файл.&lt;br /&gt;
**'''Формат''': Абсолютный путь.&lt;br /&gt;
**'''Пример значения''': &amp;lt;code&amp;gt;ProcessFile=&amp;quot;C:/AavaSCADA-1.2/bin/rtu.exe&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Конфигурирование ASLauncher, версия 1.5 ==&lt;br /&gt;
&lt;br /&gt;
=== Описание конфигурационного файла и его параметров ===&lt;br /&gt;
Данный раздел описывает структуру и назначение конфигурационного файла формата &amp;lt;code&amp;gt;.ini&amp;lt;/code&amp;gt;, используемого в нашем приложении. Этот файл содержит настройки для обоев рабочего стола и путей к лог-файлам приложения и связанных процессов.&lt;br /&gt;
&lt;br /&gt;
==== Общая структура &amp;lt;code&amp;gt;.ini&amp;lt;/code&amp;gt; файла ====&lt;br /&gt;
Файл &amp;lt;code&amp;gt;.ini&amp;lt;/code&amp;gt; состоит из разделов и пар параметр-значение:&lt;br /&gt;
&lt;br /&gt;
* '''Разделы''': обозначаются названием в квадратных скобках, например, &amp;lt;code&amp;gt;[General]&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Параметры и значения''': пары вида &amp;lt;code&amp;gt;Параметр=Значение&amp;lt;/code&amp;gt;, определяющие настройку.&lt;br /&gt;
&lt;br /&gt;
Образец общей структуры &amp;lt;code&amp;gt;.ini&amp;lt;/code&amp;gt; файла:&lt;br /&gt;
 [SectionName]&lt;br /&gt;
 Key1=Value1&lt;br /&gt;
 Key2=Value2&lt;br /&gt;
&lt;br /&gt;
==== Описание параметров и значений &amp;lt;code&amp;gt;.ini&amp;lt;/code&amp;gt; файла ====&lt;br /&gt;
Секция &amp;lt;code&amp;gt;[General]&amp;lt;/code&amp;gt; содержит основные настройки приложения.&lt;br /&gt;
&lt;br /&gt;
* Параметр&amp;lt;code&amp;gt;Wallpaper&amp;lt;/code&amp;gt;&lt;br /&gt;
**'''Описание''': Задает путь к изображению, используемому в качестве обоев рабочего стола.&lt;br /&gt;
** '''Тип''': Файл.&lt;br /&gt;
** '''Формат''': Абсолютный путь.&lt;br /&gt;
** '''Пример значения''': &amp;lt;code&amp;gt;Wallpaper=/home/user/Images/wallpaper.png&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Параметр&amp;lt;code&amp;gt;ProcessErrorLogFile&amp;lt;/code&amp;gt;&lt;br /&gt;
**'''Описание''': Указывает путь к файлу, в который записываются ошибки основного процесса приложения.&lt;br /&gt;
** '''Тип''': Файл.&lt;br /&gt;
** '''Формат''': Абсолютный путь.&lt;br /&gt;
** '''Пример значения''': &amp;lt;code&amp;gt;ProcessErrorLogFile=/var/log/rtu/rtu_process_error.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Параметр&amp;lt;code&amp;gt;ProcessStandardLogFile&amp;lt;/code&amp;gt;&lt;br /&gt;
**'''Описание''': Указывает путь к файлу, в который записывается стандартный вывод основного процесса приложения.&lt;br /&gt;
** '''Тип''': Файл.&lt;br /&gt;
** '''Формат''': Абсолютный путь.&lt;br /&gt;
** '''Пример значения''': &amp;lt;code&amp;gt;ProcessStandardLogFile=/var/log/rtu/rtu_process_standard.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Параметр&amp;lt;code&amp;gt;ASLauncherLogsDir&amp;lt;/code&amp;gt;&lt;br /&gt;
**'''Описание''': Задает директорию для хранения файлов логирования ASLauncher и приложений рабочего стола.&lt;br /&gt;
** '''Тип''': Директория.&lt;br /&gt;
** '''Формат''': Абсолютный путь.&lt;br /&gt;
** '''Пример значения''': &amp;lt;code&amp;gt;ASLauncherLogsDir=/var/log/aslauncher&amp;lt;/code&amp;gt;&lt;br /&gt;
* Параметр&amp;lt;code&amp;gt;DesktopEntriesDir&amp;lt;/code&amp;gt;&lt;br /&gt;
**'''Описание''': Задает директорию, в которой хранятся файлы записей рабочих столов (Desktop Entries) в формате &amp;lt;code&amp;gt;.desktop&amp;lt;/code&amp;gt;. Эти файлы используются для запуска приложений и отображения их в меню или на панели запуска.&lt;br /&gt;
** '''Тип''': Директория.&lt;br /&gt;
** '''Формат''': Абсолютный путь.&lt;br /&gt;
** '''Пример значения''': &amp;lt;code&amp;gt;DesktopEntriesDir=/usr/share/aslauncher&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Примечание ====&lt;br /&gt;
&lt;br /&gt;
* Все описанные параметры, за исключением &amp;lt;code&amp;gt;Wallpaper&amp;lt;/code&amp;gt;, являются обязательными и должны иметь корректные значения для запуска и штатной работы программы. Параметр &amp;lt;code&amp;gt;Wallpaper&amp;lt;/code&amp;gt; является необязательным и в случае его отсутствия фон рабочего стола будет залит черным цветом.&lt;br /&gt;
&lt;br /&gt;
* Убедитесь, что все указанные пути существуют и имеют соответствующие права доступа для чтения и записи.&lt;br /&gt;
&lt;br /&gt;
* Используйте абсолютные пути для обеспечения корректной работы независимо от текущей директории.&lt;br /&gt;
&lt;br /&gt;
=== Документация для &amp;lt;code&amp;gt;.desktop&amp;lt;/code&amp;gt; файлов ===&lt;br /&gt;
Файлы с расширением &amp;lt;code&amp;gt;.desktop&amp;lt;/code&amp;gt; используются для описания приложений и их поведения в системе. Они позволяют интегрировать приложения в графическую оболочку, определяя, как они отображаются на рабочем столе, какие иконки используют, и как запускаются.&lt;br /&gt;
&lt;br /&gt;
==== Общая структура &amp;lt;code&amp;gt;.desktop&amp;lt;/code&amp;gt; файла ====&lt;br /&gt;
Файл состоит из секции &amp;lt;code&amp;gt;[Desktop Entry]&amp;lt;/code&amp;gt; и набора ключей с соответствующими значениями. Пример файла:&lt;br /&gt;
 [Desktop Entry]&lt;br /&gt;
 Name=MyApp&lt;br /&gt;
 Process=/usr/bin/myapp&lt;br /&gt;
 Arguments=--mode test&lt;br /&gt;
 Icon=/usr/share/icons/myapp.png&lt;br /&gt;
 Type=Application&lt;br /&gt;
 AutoLaunch=true&lt;br /&gt;
 AutoRestartOnCrash=true&lt;br /&gt;
 User=myuser&lt;br /&gt;
 PasswordPrompt=false&lt;br /&gt;
&lt;br /&gt;
==== Примечания ====&lt;br /&gt;
&lt;br /&gt;
* Для некоторых параметров используются значения типа 'Логическое значение'. Возможные варианты значений для данного типа: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; — для истинных значений и &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; — для ложных.&lt;br /&gt;
* Параметры и значения чувствительны к регистру — убедитесь, что вы используете правильный регистр для каждого ключа.&lt;br /&gt;
* Убедитесь, что все указанные пути существуют и доступны для чтения/запуска.&lt;br /&gt;
* Если иконка не отображается, значит, по меньшей мере одна пара параметр-значение содержит ошибку. Чтобы исправить это, проверьте файлы логирования ASLauncher — информация, которая поможет выявить и исправить эту ошибку, будет отображена там.&lt;br /&gt;
&lt;br /&gt;
==== Описание ключей и значений &amp;lt;code&amp;gt;.desktop&amp;lt;/code&amp;gt; файла ====&lt;br /&gt;
&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Отображаемое имя приложения в меню или панели запуска.&lt;br /&gt;
#* '''Формат''': Строка.&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;Name=MyApp&amp;lt;/code&amp;gt;&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;Process&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Путь к исполняемому файлу приложения.&lt;br /&gt;
#* '''Формат''': Абсолютный путь.&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;Process=/usr/bin/myapp&amp;lt;/code&amp;gt;&lt;br /&gt;
# Ключ &amp;lt;code&amp;gt;Arguments&amp;lt;/code&amp;gt;&lt;br /&gt;
#* '''Описание''': Аргументы командной строки, передаваемые приложению при запуске.&lt;br /&gt;
#* '''Формат''': Строка с аргументами, разделенными пробелами.&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;Arguments=--mode test --verbose&amp;lt;/code&amp;gt;&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;Icon&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Путь к файлу иконки или имя иконки из темы значков.&lt;br /&gt;
#* '''Формат''': Абсолютный путь.&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;Icon=/usr/share/icons/hicolor/48x48/apps/myapp.png&amp;lt;/code&amp;gt;&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;Type&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Тип записи, определяет, как система будет обрабатывать файл.&lt;br /&gt;
#* '''Возможные значения''': &amp;lt;code&amp;gt;Application&amp;lt;/code&amp;gt; — исполняемое приложение.&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;Type=Application&amp;lt;/code&amp;gt;&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;AutoLaunch&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Указывает, должно ли приложение запускаться автоматически при входе пользователя в систему.&lt;br /&gt;
#* '''Формат''': Логическое значение.&lt;br /&gt;
#* '''[Если] Параметр отсутствует''': Значение по умолчанию — &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;AutoLaunch=true&amp;lt;/code&amp;gt;&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;AutoRestartOnCrash&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Определяет, будет ли приложение автоматически перезапущено в случае сбоя или аварийного завершения.&lt;br /&gt;
#* '''Формат''': Логическое значение.&lt;br /&gt;
#* '''[Если] Параметр отсутствует''': Значение по умолчанию — &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;AutoRestartOnCrash=true&amp;lt;/code&amp;gt;&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;User&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Имя пользователя, от имени которого должно запускаться приложение.&lt;br /&gt;
#* '''Формат''': Строка.&lt;br /&gt;
#* '''[Если] Параметр отсутствует''': Приложение запускается из-под пользователя &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;User=john_doe&amp;lt;/code&amp;gt;&lt;br /&gt;
# Параметр&amp;lt;code&amp;gt;PasswordPrompt&amp;lt;/code&amp;gt;&lt;br /&gt;
#*'''Описание''': Указывает, необходимо ли запрашивать пароль при запуске приложения.&lt;br /&gt;
#* '''Формат''': Имя пользователя, пароль аккаунта которого должен быть введён.&lt;br /&gt;
#* '''Возможные значения''': &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; — будет запрошен пароль &amp;lt;code&amp;gt;123asd890&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* '''[Если] Параметр отсутствует:''' Пароль не запрашивается.&lt;br /&gt;
#* '''Пример значения''': &amp;lt;code&amp;gt;PasswordPrompt=default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Дополнительные утилиты ==&lt;br /&gt;
Данные утилиты доступны с версии &amp;lt;code&amp;gt;AS 1.5+&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Конфигуратор системы - SystemConfigurator ===&lt;br /&gt;
Утилита предназначена для настройки параметров системы, на которой работает среда исполнения AgavaSCADA:&lt;br /&gt;
&lt;br /&gt;
* Системные дата и время.&lt;br /&gt;
* Параметры основного сетевого адаптера.&lt;br /&gt;
&lt;br /&gt;
=== Утилита обновления проекта - UpdateManager ===&lt;br /&gt;
Утилита предназначена для обновления проекта, загружаемого средой исполнения.&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D1%85_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3477</id>
		<title>Описание базовых классов AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D1%85_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_AgavaSCADA/AgavaPLC&amp;diff=3477"/>
		<updated>2026-04-07T03:54:25Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: TaushkanovKV переименовал страницу Описание базовых классов AgavaSCADA/AgavaPLC в Базовые классы AgavaSCADA/AgavaPLC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Базовые классы AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3476</id>
		<title>Базовые классы AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B_AgavaSCADA/AgavaPLC&amp;diff=3476"/>
		<updated>2026-04-07T03:54:25Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: TaushkanovKV переименовал страницу Описание базовых классов AgavaSCADA/AgavaPLC в Базовые классы AgavaSCADA/AgavaPLC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данном документе описываются свойства, поля и методы базовых классов AgavaPLC/AgavaSCADA, взаимодействие с которыми доступно в функциях, классах и программах приложений.&lt;br /&gt;
[[Файл:Иерархия классов объектной модели AgavaPLC 1.6.png|альт=|мини|Иерархия классов объектной модели AgavaPLC 1.6]]&lt;br /&gt;
Данный документ применим к AgavaSCADA/AgavaPLC версии 1.5 и старше (новее).&lt;br /&gt;
&lt;br /&gt;
==BasicNode==&lt;br /&gt;
Базовый класс для всех узлов проекта.&lt;br /&gt;
&lt;br /&gt;
Предок: нет.&lt;br /&gt;
&lt;br /&gt;
=== Конструкторы ===&lt;br /&gt;
 BasicNode::BasicNode()               ///&amp;lt; Конструктор по умолчанию&lt;br /&gt;
 BasicNode::BasicNode(string path)    ///&amp;lt; Создание узла по пути в проекте&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 string BasicNode::GetName()          ///&amp;lt; Получение имени узла&lt;br /&gt;
 string BasicNode::GetShortName()     ///&amp;lt; Получение шифра узла&lt;br /&gt;
 string BasicNode::GetDescription()   ///&amp;lt; Получение описания узла&lt;br /&gt;
&lt;br /&gt;
 void BasicNode::SetName(string name)&lt;br /&gt;
 void BasicNode::SetShortName(string shortname)&lt;br /&gt;
 void BasicNode::SetDescription(string description)&lt;br /&gt;
&lt;br /&gt;
 string BasicNode::GetPath()          ///&amp;lt; Получение пути узла в проекте&lt;br /&gt;
&lt;br /&gt;
 void BasicNode::Start()              ///&amp;lt; Запуск узла&lt;br /&gt;
 void BasicNode::Stop()               ///&amp;lt; Остановка узла&lt;br /&gt;
&lt;br /&gt;
 NodeProperty@ BasicNode::GetProperty(string&amp;amp; prop)     ///&amp;lt; Получение указателя на свойство узла&lt;br /&gt;
 void BasicNode::PropertyValueUpdated(string&amp;amp; prop)     ///&amp;lt; Сигнализация об обновлении значения свойства&lt;br /&gt;
&lt;br /&gt;
=== Свойства ===&lt;br /&gt;
{|style=&amp;quot;width:75%&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Имя&lt;br /&gt;
!style=&amp;quot;width:25%&amp;quot;|Описание&lt;br /&gt;
!style=&amp;quot;width:10%&amp;quot;|Тип&lt;br /&gt;
!style=&amp;quot;width:15%&amp;quot;|Доступ&lt;br /&gt;
!Внутренний идентификатор&lt;br /&gt;
|-&lt;br /&gt;
|Id&lt;br /&gt;
|Идентификатор узла&lt;br /&gt;
|int&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|CONFIGNODE_PARAM_ID&lt;br /&gt;
|-&lt;br /&gt;
|Name&lt;br /&gt;
|Имя узла&lt;br /&gt;
|string&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|CONFIGNODE_PARAM_NAME&lt;br /&gt;
|-&lt;br /&gt;
|Description&lt;br /&gt;
|Описание узла&lt;br /&gt;
|string&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|CONFIGNODE_PARAM_DESCRIPTION&lt;br /&gt;
|-&lt;br /&gt;
|ShortName&lt;br /&gt;
|Шифр узла&lt;br /&gt;
|string&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|CONFIGNODE_PARAM_SHORTNAME&lt;br /&gt;
|-&lt;br /&gt;
|NodeDisabled&lt;br /&gt;
|Узел выключен&lt;br /&gt;
|bool&lt;br /&gt;
|Чтение/Запись&lt;br /&gt;
|CONFIGNODE_PARAM_DISABLED&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==SignalValue==&lt;br /&gt;
Класс, хранящий значение, передаваемое между узлами.&lt;br /&gt;
&lt;br /&gt;
Предок: нет.&lt;br /&gt;
&lt;br /&gt;
=== Конструкторы ===&lt;br /&gt;
 SignalValue::SignalValue(string value)&lt;br /&gt;
 SignalValue::SignalValue(int value)&lt;br /&gt;
 SignalValue::SignalValue(double value)&lt;br /&gt;
 SignalValue::SignalValue(bool value)&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 string SignalValue::ToString()   ///&amp;lt; Преобразовать значение в строку&lt;br /&gt;
 int SignalValue::ToInt()         ///&amp;lt; Преобразовать значение в int&lt;br /&gt;
 double SignalValue::ToDouble()   ///&amp;lt; Преобразовать значение в double&lt;br /&gt;
 bool SignalValue::ToBool()       ///&amp;lt; Преобразовать значение в bool&lt;br /&gt;
&lt;br /&gt;
 void SignalValue::SetValue(string&amp;amp; value)&lt;br /&gt;
 void SignalValue::SetValue(int value)&lt;br /&gt;
 void SignalValue::SetValue(double value)&lt;br /&gt;
 void SignalValue::SetValue(bool value)&lt;br /&gt;
&lt;br /&gt;
 bool SignalValue::IsNumber()     ///&amp;lt; Значение является числовым&lt;br /&gt;
 bool SignalValue::IsError()      ///&amp;lt; Значение является ошибкой&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
 '''void fnIncrementSource(BasicSource_t &amp;amp;source)'''&lt;br /&gt;
 {&lt;br /&gt;
     SignalValue sv = source.GetValue();&lt;br /&gt;
     &lt;br /&gt;
     if (sv.IsNumber() == true)&lt;br /&gt;
     {&lt;br /&gt;
         int iVal = sv.ToInt();&lt;br /&gt;
         iVal++;&lt;br /&gt;
 &lt;br /&gt;
         sv = SignalValue(iVal);&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
         sv = SignalValue(0);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     source.SetValue(sv);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== NodeProperty ==&lt;br /&gt;
Класс, предоставляющий доступ к свойствам узлов.&lt;br /&gt;
&lt;br /&gt;
Предок: нет.&lt;br /&gt;
&lt;br /&gt;
=== Конструкторы ===&lt;br /&gt;
 NodeProperty::NodeProperty()&lt;br /&gt;
 NodeProperty::NodeProperty(NodeProperty&amp;amp; other)&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 string NodeProperty::GetName()         ///&amp;lt; Получение имени свойства&lt;br /&gt;
 string NodeProperty::GetShortName()    ///&amp;lt; Получение шифра свойства&lt;br /&gt;
 string NodeProperty::GetDescription()  ///&amp;lt; Получение описания свойства&lt;br /&gt;
 string NodeProperty::GetTitle()        ///&amp;lt; Получение заголовка свойства&lt;br /&gt;
&lt;br /&gt;
 string NodeProperty::ToString()        ///&amp;lt; Преобразование значения свойства в строку&lt;br /&gt;
 int NodeProperty::ToInt()              ///&amp;lt; Преобразование значения свойства в число типа int&lt;br /&gt;
 double NodeProperty::ToDouble()        ///&amp;lt; Преобразование значения свойства в число типа double&lt;br /&gt;
 bool NodeProperty::ToBool()            ///&amp;lt; Преобразование значения свойства в булевское значение&lt;br /&gt;
&lt;br /&gt;
 int NodeProperty::SetValue(string val) ///&amp;lt; Установка значения свойства&lt;br /&gt;
 int NodeProperty::SetValue(int val)    ///&amp;lt; Установка значения свойства&lt;br /&gt;
 int NodeProperty::SetValue(double val) ///&amp;lt; Установка значения свойства&lt;br /&gt;
 int NodeProperty::SetValue(bool val)   ///&amp;lt; Установка значения свойства&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
 BasicNode node(&amp;quot;/Root/node&amp;quot;);&lt;br /&gt;
 NodeProperty@ prop = node.GetProperty(&amp;quot;ShortName&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 string sn2 = prop.ToString();&lt;br /&gt;
 prop.SetValue(string(sn2+&amp;quot;ShortName1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
== BasicSource ==&lt;br /&gt;
Предок: [[Описание базовых классов AgavaSCADA/AgavaPLC#BasicNode|BasicNode]].&lt;br /&gt;
===Методы===&lt;br /&gt;
 '''SignalValue BasicSource::GetValue()'''          ///&amp;lt; Получение значения.&lt;br /&gt;
Метод производит получение значения источника.&lt;br /&gt;
&lt;br /&gt;
Результат - значение типа [[Описание базовых классов AgavaSCADA/AgavaPLC#SignalValue|SignalValue]].&lt;br /&gt;
&lt;br /&gt;
 '''int BasicSource::SetValue(SignalValue sv)'''    ///&amp;lt; Установка собственного значения с установкой значений связанных узлов (в транспорте).&lt;br /&gt;
Метод производит установку нового значения источника. Если источник связан с транспортом, то транспорт выполнит передачу нового значения в связанное с ним внешнее устройство.&lt;br /&gt;
&lt;br /&gt;
Результат - [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|код выполнения операции]].&lt;br /&gt;
&lt;br /&gt;
 '''int BasicSource::UpdateValue(SignalValue sv)''' ///&amp;lt; Установка собственного значения.&lt;br /&gt;
Метод производит установку нового значения источника без передачи значения транспорту.&lt;br /&gt;
&lt;br /&gt;
Результат - [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|код выполнения операции]].&lt;br /&gt;
&lt;br /&gt;
==BasicSignal==&lt;br /&gt;
Предок:  [[#BasicSource|BasicSource]].&lt;br /&gt;
===Методы===&lt;br /&gt;
 '''SignalValue BasicSignal::GetValue()'''          ///&amp;lt; Получение значения.&lt;br /&gt;
Метод производит получение значения сигнала.&lt;br /&gt;
&lt;br /&gt;
Результат - значение типа [[Описание базовых классов AgavaSCADA/AgavaPLC#SignalValue|SignalValue]].&lt;br /&gt;
&lt;br /&gt;
 '''int BasicSignal::SetValue(SignalValue sv)'''    ///&amp;lt; Установка собственного значения с установкой значений связанных узлов (источников).&lt;br /&gt;
Метод производит установку нового значения сигнала. Если сигнал связан с источником (или несколькими источниками), то будет выполнена передача нового значения в источник(-и).&lt;br /&gt;
&lt;br /&gt;
Результат - [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|код выполнения операции]].&lt;br /&gt;
&lt;br /&gt;
 '''int BasicSignal::UpdateValue(SignalValue sv)''' ///&amp;lt; Установка собственного значения.&lt;br /&gt;
Метод производит установку нового значения источника без передачи значения источнику.&lt;br /&gt;
&lt;br /&gt;
Результат - [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|код выполнения операции]].&lt;br /&gt;
&lt;br /&gt;
==ModbusRegister==&lt;br /&gt;
Предок: [[#BasicSource|BasicSource]].&lt;br /&gt;
===Поля===&lt;br /&gt;
 uint8  m_ucDeviceNo        ///&amp;lt; Номер устройства.&lt;br /&gt;
 uint8  m_ucReadFunctionNo  ///&amp;lt; Номер функции чтения.&lt;br /&gt;
 uint16 m_wReadRegisterNo   ///&amp;lt; Номер регистра чтения.&lt;br /&gt;
 uint8  m_ucWriteFunctionNo ///&amp;lt; Номер функции записи.&lt;br /&gt;
 uint16 m_wWriteRegisterNo  ///&amp;lt; Номер регистра записи.&lt;br /&gt;
 uint8  m_ucSize            ///&amp;lt; Размер регистра в битах.&lt;br /&gt;
 uint8  m_ucPriority        ///&amp;lt; Приоритет. Не используется.&lt;br /&gt;
===Методы===&lt;br /&gt;
 int BasicSource::WriteValue(SignalValue sv) ///&amp;lt; Установка собственного значения с записью значения в устройство.&lt;br /&gt;
==BasicWidget==&lt;br /&gt;
Предок: [[Описание базовых классов AgavaSCADA/AgavaPLC#BasicNode|BasicNode]].&lt;br /&gt;
&lt;br /&gt;
Подробное описание обработчиков и методов рисования приведено в документе [[Описание классов для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 void BasicWidget::Repaint()                ///&amp;lt; Перерисовка виджета&lt;br /&gt;
&lt;br /&gt;
=== Обработчики ===&lt;br /&gt;
 void BasicWidget::OnPaint(Painter@ painter)              ///&amp;lt; Обработчик отрисовки виджета&lt;br /&gt;
 void BasicWidget::OnMousePress([[Описание классов для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC#MouseEvent|MouseEvent]]@ event)        ///&amp;lt; Обработчик нажатия кнопки мыши&lt;br /&gt;
 void BasicWidget::OnMouseRelease(MouseEvent@ event)      ///&amp;lt; Обработчик отпускания кнопки мыши&lt;br /&gt;
 void BasicWidget::OnMouseDoubleClick(MouseEvent@ event)  ///&amp;lt; Обработчик двойного нажатия кнопки мыши&lt;br /&gt;
 void BasicWidget::OnMouseMove(MouseEvent@ event)         ///&amp;lt; Обработчик перемещения курсора мыши над виджетом&lt;br /&gt;
 void BasicWidget::OnMouseEnter()                         ///&amp;lt; Обработчик входа курсора мыши в область над виджетом&lt;br /&gt;
 void BasicWidget::OnMouseLeave()                         ///&amp;lt; Обработчик выхода курсора мыши из области над виджетом&lt;br /&gt;
 void BasicWidget::OnWheel(WheelEvent@ event)             ///&amp;lt; Обработчик прокрутки колеса мыши при нахождении курсора мыши в области над виджетом&lt;br /&gt;
&lt;br /&gt;
== BasicWindow ==&lt;br /&gt;
Предок: [[Описание базовых классов AgavaSCADA/AgavaPLC#BasicWidget|BasicWidget]].&lt;br /&gt;
&lt;br /&gt;
Подробное описание обработчиков и методов рисования приведено в документе [[Описание классов для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
===Методы===&lt;br /&gt;
 void BasicWindow::Show()  ///&amp;lt; Отображение окна.&lt;br /&gt;
 void BasicWindow::Hide()  ///&amp;lt; Сокрытие окна.&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%BE%D0%BC_AgavaSCADA/AgavaPLC&amp;diff=3475</id>
		<title>Описание классов для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%BE%D0%BC_AgavaSCADA/AgavaPLC&amp;diff=3475"/>
		<updated>2026-04-07T03:41:36Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: TaushkanovKV переименовал страницу Описание классов для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC в Классы для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#перенаправление [[Классы для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%BE%D0%BC_AgavaSCADA/AgavaPLC&amp;diff=3474</id>
		<title>Классы для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%B8_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%BE%D0%BC_AgavaSCADA/AgavaPLC&amp;diff=3474"/>
		<updated>2026-04-07T03:41:36Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: TaushkanovKV переименовал страницу Описание классов для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC в Классы для рисования и работы с графическим интерфейсом AgavaSCADA/AgavaPLC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Обзор ==&lt;br /&gt;
Данное описание предназначено для использования с системами версии 1.6+. Ниже описываются инструменты, реализующие вывод графических примитивов, инструменты рисования и обработки событий.&lt;br /&gt;
&lt;br /&gt;
== Основные классы и структуры ==&lt;br /&gt;
&lt;br /&gt;
=== Rect ===&lt;br /&gt;
Прямоугольная область с координатами и размерами.&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Rect()&amp;lt;/code&amp;gt; - пустой прямоугольник&lt;br /&gt;
* &amp;lt;code&amp;gt;Rect(int x, int y, int w, int h)&amp;lt;/code&amp;gt; - с заданными параметрами&lt;br /&gt;
&lt;br /&gt;
'''Свойства:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;int x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int y&amp;lt;/code&amp;gt; - координаты верхнего левого угла&lt;br /&gt;
* &amp;lt;code&amp;gt;int width&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int height&amp;lt;/code&amp;gt; - размеры&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Rect rect(10, 20, 100, 50);  // x=10, y=20, width=100, height=50&lt;br /&gt;
 Rect area = Rect(0, 0, 800, 600);&lt;br /&gt;
&lt;br /&gt;
=== Point ===&lt;br /&gt;
Точка в 2D-пространстве.&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Point()&amp;lt;/code&amp;gt; - точка (0,0)&lt;br /&gt;
* &amp;lt;code&amp;gt;Point(int x, int y)&amp;lt;/code&amp;gt; - с заданными координатами&lt;br /&gt;
&lt;br /&gt;
'''Свойства:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;int x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int y&amp;lt;/code&amp;gt; - координаты&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Point start(0, 0);&lt;br /&gt;
 Point end(100, 100);&lt;br /&gt;
 Point center = Point(50, 50);&lt;br /&gt;
&lt;br /&gt;
=== Color ===&lt;br /&gt;
Цвет в формате RGBA.&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Color()&amp;lt;/code&amp;gt; - черный непрозрачный&lt;br /&gt;
* &amp;lt;code&amp;gt;Color(int r, int g, int b, int a = 255)&amp;lt;/code&amp;gt; - с компонентами цвета&lt;br /&gt;
&lt;br /&gt;
'''Свойства:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;int r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int g&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int b&amp;lt;/code&amp;gt; - цветовые компоненты (0-255)&lt;br /&gt;
* &amp;lt;code&amp;gt;int a&amp;lt;/code&amp;gt; - альфа-канал (0-255), где 255 - полностью непрозрачный&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Color red(255, 0, 0);        // Красный&lt;br /&gt;
 Color blue(0, 0, 255, 128);  // Синий полупрозрачный&lt;br /&gt;
 Color white(255, 255, 255);  // Белый&lt;br /&gt;
&lt;br /&gt;
=== Font ===&lt;br /&gt;
Описание шрифта для текста.&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Font()&amp;lt;/code&amp;gt; - шрифт по умолчанию&lt;br /&gt;
* &amp;lt;code&amp;gt;Font(int size, string name, bool italic = false, bool bold = false, bool underline = false, bool strikethrough = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Свойства:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;int size&amp;lt;/code&amp;gt; - размер шрифта&lt;br /&gt;
* &amp;lt;code&amp;gt;string name&amp;lt;/code&amp;gt; - название шрифта&lt;br /&gt;
* &amp;lt;code&amp;gt;bool italic&amp;lt;/code&amp;gt; - курсив&lt;br /&gt;
* &amp;lt;code&amp;gt;bool bold&amp;lt;/code&amp;gt; - жирный&lt;br /&gt;
* &amp;lt;code&amp;gt;bool underline&amp;lt;/code&amp;gt; - подчеркнутый&lt;br /&gt;
* &amp;lt;code&amp;gt;bool strikethrough&amp;lt;/code&amp;gt; - зачеркнутый&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Font defaultFont;&lt;br /&gt;
 Font titleFont(24, &amp;quot;Arial&amp;quot;, false, true);           // Жирный Arial 24px&lt;br /&gt;
 Font italicFont(12, &amp;quot;Times New Roman&amp;quot;, true);       // Курсивный&lt;br /&gt;
&lt;br /&gt;
=== Pen ===&lt;br /&gt;
Инструмент для рисования линий и контуров.&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Pen()&amp;lt;/code&amp;gt; - перо по умолчанию&lt;br /&gt;
* &amp;lt;code&amp;gt;Pen(int size, Color color, LineType lineType = LineType::Solid)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Свойства:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;int size&amp;lt;/code&amp;gt; - толщина линии&lt;br /&gt;
* &amp;lt;code&amp;gt;Color color&amp;lt;/code&amp;gt; - цвет&lt;br /&gt;
* &amp;lt;code&amp;gt;LineType lineType&amp;lt;/code&amp;gt; - тип линии&lt;br /&gt;
&lt;br /&gt;
'''Перечисление LineType:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Undefined&amp;lt;/code&amp;gt; - неопределенный тип&lt;br /&gt;
* &amp;lt;code&amp;gt;Solid&amp;lt;/code&amp;gt; - сплошная линия&lt;br /&gt;
* &amp;lt;code&amp;gt;Dash&amp;lt;/code&amp;gt; - пунктирная линия&lt;br /&gt;
* &amp;lt;code&amp;gt;Dot&amp;lt;/code&amp;gt; - точечная линия&lt;br /&gt;
* &amp;lt;code&amp;gt;DashDot&amp;lt;/code&amp;gt; - штрих-пунктирная&lt;br /&gt;
* &amp;lt;code&amp;gt;DashDotDot&amp;lt;/code&amp;gt; - штрих-две точки&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Pen thinRed(1, Color(255, 0, 0), LineType::Solid);&lt;br /&gt;
 Pen thickBlue(3, Color(0, 0, 255), LineType::Dash);&lt;br /&gt;
 Pen dottedBlack(2, Color(0, 0, 0), LineType::Dot);&lt;br /&gt;
&lt;br /&gt;
=== ResourceLink ===&lt;br /&gt;
Ссылка на ресурсы (изображения, звуковый файлы).&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ResourceLink()&amp;lt;/code&amp;gt; - пустая ссылка&lt;br /&gt;
* &amp;lt;code&amp;gt;ResourceLink(const string &amp;amp;in path)&amp;lt;/code&amp;gt; - из файлового пути&lt;br /&gt;
* &amp;lt;code&amp;gt;ResourceLink(const string &amp;amp;in lib, const string &amp;amp;in res)&amp;lt;/code&amp;gt; - из библиотеки ресурсов&lt;br /&gt;
&lt;br /&gt;
'''Методы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;string GetFilePath() const&amp;lt;/code&amp;gt; - путь к файлу&lt;br /&gt;
* &amp;lt;code&amp;gt;string GetFullFilePath() const&amp;lt;/code&amp;gt; - полный путь&lt;br /&gt;
* &amp;lt;code&amp;gt;string GetLibraryName() const&amp;lt;/code&amp;gt; - имя библиотеки&lt;br /&gt;
* &amp;lt;code&amp;gt;string GetResourceName() const&amp;lt;/code&amp;gt; - имя ресурса&lt;br /&gt;
* &amp;lt;code&amp;gt;bool IsValid()&amp;lt;/code&amp;gt; - проверка валидности&lt;br /&gt;
* &amp;lt;code&amp;gt;bool IsEmpty()&amp;lt;/code&amp;gt; - проверка на пустоту&lt;br /&gt;
* &amp;lt;code&amp;gt;LinkType GetLinkType() const&amp;lt;/code&amp;gt; - тип ссылки&lt;br /&gt;
* &amp;lt;code&amp;gt;string ToString()&amp;lt;/code&amp;gt; - строковое представление&lt;br /&gt;
&lt;br /&gt;
'''Перечисление LinkType:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Undefined&amp;lt;/code&amp;gt; - неопределенный тип&lt;br /&gt;
* &amp;lt;code&amp;gt;Resource&amp;lt;/code&amp;gt; - ресурс из библиотеки&lt;br /&gt;
* &amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt; - файл из файловой системы&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 ResourceLink fileImage(&amp;quot;images/background.png&amp;quot;);&lt;br /&gt;
 ResourceLink libImage(&amp;quot;textures&amp;quot;, &amp;quot;wood_pattern&amp;quot;);&lt;br /&gt;
 ResourceLink invalidLink;&lt;br /&gt;
 &lt;br /&gt;
 if (fileImage.IsValid()) &lt;br /&gt;
 {&lt;br /&gt;
     string path = fileImage.GetFilePath();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Gradient ===&lt;br /&gt;
Градиентная заливка.&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Gradient()&amp;lt;/code&amp;gt; - градиент по умолчанию&lt;br /&gt;
* &amp;lt;code&amp;gt;Gradient(GradientType type)&amp;lt;/code&amp;gt; - с указанием типа&lt;br /&gt;
&lt;br /&gt;
'''Свойства:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;GradientType type&amp;lt;/code&amp;gt; - тип градиента&lt;br /&gt;
* &amp;lt;code&amp;gt;Point start&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Point end&amp;lt;/code&amp;gt; - начальная и конечная точки (для линейного)&lt;br /&gt;
* &amp;lt;code&amp;gt;Point center&amp;lt;/code&amp;gt; - центр (для радиального)&lt;br /&gt;
* &amp;lt;code&amp;gt;float radius&amp;lt;/code&amp;gt; - радиус (для радиального)&lt;br /&gt;
* &amp;lt;code&amp;gt;Point focal&amp;lt;/code&amp;gt; - фокальная точка&lt;br /&gt;
* &amp;lt;code&amp;gt;Point centerConical&amp;lt;/code&amp;gt; - центр конического градиента&lt;br /&gt;
* &amp;lt;code&amp;gt;float angle&amp;lt;/code&amp;gt; - угол&lt;br /&gt;
&lt;br /&gt;
'''Методы для работы с цветовыми остановками:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;void AddColorStop(float position, Color color)&amp;lt;/code&amp;gt; - добавить цветовую остановку&lt;br /&gt;
* &amp;lt;code&amp;gt;void ClearColorStops()&amp;lt;/code&amp;gt; - очистить все остановки&lt;br /&gt;
* &amp;lt;code&amp;gt;int GetColorStopCount() const&amp;lt;/code&amp;gt; - количество остановок&lt;br /&gt;
* &amp;lt;code&amp;gt;void GetColorStop(int index, float&amp;amp; out position, Color&amp;amp; out color) const&amp;lt;/code&amp;gt; - получить остановку&lt;br /&gt;
* &amp;lt;code&amp;gt;void SetColorStop(int index, float position, Color color)&amp;lt;/code&amp;gt; - установить остановку&lt;br /&gt;
&lt;br /&gt;
'''Перечисление GradientType:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Linear&amp;lt;/code&amp;gt; - линейный градиент&lt;br /&gt;
* &amp;lt;code&amp;gt;Radial&amp;lt;/code&amp;gt; - радиальный градиент&lt;br /&gt;
* &amp;lt;code&amp;gt;Conical&amp;lt;/code&amp;gt; - конический градиент&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Gradient linearGrad(GradientType::Linear);&lt;br /&gt;
 linearGrad.start = Point(0, 0);&lt;br /&gt;
 linearGrad.end = Point(100, 0);&lt;br /&gt;
 linearGrad.AddColorStop(0.0, Color(255, 0, 0));    // Красный в начале&lt;br /&gt;
 linearGrad.AddColorStop(1.0, Color(0, 0, 255));    // Синий в конце&lt;br /&gt;
 &lt;br /&gt;
 Gradient radialGrad(GradientType::Radial);&lt;br /&gt;
 radialGrad.center = Point(50, 50);&lt;br /&gt;
 radialGrad.radius = 50;&lt;br /&gt;
&lt;br /&gt;
=== Brush ===&lt;br /&gt;
Инструмент заливки.&lt;br /&gt;
&lt;br /&gt;
'''Конструкторы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Brush()&amp;lt;/code&amp;gt; - кисть по умолчанию&lt;br /&gt;
* &amp;lt;code&amp;gt;Brush(Color color, BrushStyle style = BrushStyle::SolidPattern)&amp;lt;/code&amp;gt; - сплошной цвет&lt;br /&gt;
* &amp;lt;code&amp;gt;Brush(Gradient gradient, BrushStyle style = BrushStyle::LinearGradientPattern)&amp;lt;/code&amp;gt; - градиент&lt;br /&gt;
* &amp;lt;code&amp;gt;Brush(ResourceLink texture, BrushStyle style = BrushStyle::TexturePattern)&amp;lt;/code&amp;gt; - текстура&lt;br /&gt;
&lt;br /&gt;
'''Свойства:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;BrushStyle style&amp;lt;/code&amp;gt; - стиль кисти&lt;br /&gt;
* &amp;lt;code&amp;gt;Color color&amp;lt;/code&amp;gt; - цвет (для SolidPattern)&lt;br /&gt;
* &amp;lt;code&amp;gt;Gradient gradient&amp;lt;/code&amp;gt; - градиент&lt;br /&gt;
* &amp;lt;code&amp;gt;ResourceLink texture&amp;lt;/code&amp;gt; - текстура&lt;br /&gt;
&lt;br /&gt;
'''Перечисление BrushStyle:'''&lt;br /&gt;
&lt;br /&gt;
* '''Сплошные и пустые:''' &amp;lt;code&amp;gt;NoBrush&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SolidPattern&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Плотность заливки:''' &amp;lt;code&amp;gt;Dense1Pattern&amp;lt;/code&amp;gt; - &amp;lt;code&amp;gt;Dense7Pattern&amp;lt;/code&amp;gt; (от самой плотной до самой редкой)&lt;br /&gt;
* '''Линейные паттерны:''' &amp;lt;code&amp;gt;HorPattern&amp;lt;/code&amp;gt; (горизонтальные линии), &amp;lt;code&amp;gt;VerPattern&amp;lt;/code&amp;gt; (вертикальные линии), &amp;lt;code&amp;gt;CrossPattern&amp;lt;/code&amp;gt; (сетка)&lt;br /&gt;
* '''Диагональные паттерны:''' &amp;lt;code&amp;gt;BDiagPattern&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;FDiagPattern&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DiagCrossPattern&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Специальные:''' &amp;lt;code&amp;gt;LinearGradientPattern&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RadialGradientPattern&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ConicalGradientPattern&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TexturePattern&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Brush solidRed(Color(255, 0, 0));&lt;br /&gt;
 Brush gradientBrush(linearGrad);  // Градиентная кисть&lt;br /&gt;
 Brush textureBrush(textureLink, BrushStyle::TexturePattern);&lt;br /&gt;
 Brush patternBrush(Color(0, 0, 0), BrushStyle::CrossPattern);  // Сетка&lt;br /&gt;
&lt;br /&gt;
=== Alignment ===&lt;br /&gt;
Флаги выравнивания текста.&lt;br /&gt;
&lt;br /&gt;
'''Значения:'''&lt;br /&gt;
&lt;br /&gt;
* '''Горизонтальное:''' &amp;lt;code&amp;gt;AlignLeft&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AlignRight&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AlignHCenter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AlignJustify&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AlignAbsolute&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Вертикальное:''' &amp;lt;code&amp;gt;AlignTop&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AlignBottom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AlignVCenter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AlignBaseline&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''Комбинированные:''' &amp;lt;code&amp;gt;AlignCenter&amp;lt;/code&amp;gt; (центр по горизонтали и вертикали)&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 Alignment leftTop = Alignment::AlignLeft | Alignment::AlignTop;&lt;br /&gt;
 Alignment center = Alignment::AlignCenter;&lt;br /&gt;
 Alignment rightBottom = Alignment::AlignRight | Alignment::AlignBottom;&lt;br /&gt;
&lt;br /&gt;
== Класс Painter ==&lt;br /&gt;
Основной класс для рисования, предоставляющий широкий набор графических операций.&lt;br /&gt;
&lt;br /&gt;
=== Методы рисования фигур ===&lt;br /&gt;
'''Дуги и секторы'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawArc(const Rect &amp;amp;in, int startAngle, int spanAngle)&amp;lt;/code&amp;gt; - дуга в прямоугольнике&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawArc(int x, int y, int w, int h, int startAngle, int spanAngle)&amp;lt;/code&amp;gt; - дуга с координатами&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawChord()&amp;lt;/code&amp;gt; - хорда (замкнутая дуга)&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawPie()&amp;lt;/code&amp;gt; - сектор круга&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 painter.DrawArc(Rect(10, 10, 100, 100), 45, 90);  // Дуга от 45 до 135 градусов&lt;br /&gt;
 painter.DrawPie(50, 50, 80, 80, 0, 90);          // Сектор 90 градусов&lt;br /&gt;
'''Эллипсы и окружности'''&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawEllipse(const Rect &amp;amp;in)&amp;lt;/code&amp;gt; - эллипс в прямоугольнике&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawEllipse(int x, int y, int w, int h)&amp;lt;/code&amp;gt; - эллипс с координатами&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawEllipse(const Point &amp;amp;in center, int rx, int ry)&amp;lt;/code&amp;gt; - эллипс из центра&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 painter.DrawEllipse(Rect(0, 0, 200, 100));      // Эллипс&lt;br /&gt;
 painter.DrawEllipse(Point(100, 100), 50, 50);   // Окружность&lt;br /&gt;
'''Линии и точки'''&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawLine(int x1, int y1, int x2, int y2)&amp;lt;/code&amp;gt; - линия между точками&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawLine(const Point &amp;amp;in start, const Point &amp;amp;in end)&amp;lt;/code&amp;gt; - линия между точками&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawPoint(const Point &amp;amp;in)&amp;lt;/code&amp;gt; - точка&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawPoint(int x, int y)&amp;lt;/code&amp;gt; - точка с координатами&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 painter.DrawLine(0, 0, 100, 100);                    // Диагональная линия&lt;br /&gt;
 painter.DrawLine(Point(10, 10), Point(50, 50));      // Линия между точками&lt;br /&gt;
 painter.DrawPoint(25, 25);                           // Точка&lt;br /&gt;
'''Прямоугольники'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawRect(const Rect &amp;amp;in)&amp;lt;/code&amp;gt; - прямоугольник&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawRect(int x, int y, int w, int h)&amp;lt;/code&amp;gt; - прямоугольник с координатами&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawRoundedRect(const Rect &amp;amp;in, double xRadius, double yRadius)&amp;lt;/code&amp;gt; - скругленный прямоугольник&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawRoundedRect(int x, int y, int w, int h, double xRadius, double yRadius)&amp;lt;/code&amp;gt; - скругленный с координатами&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 painter.DrawRect(Rect(10, 10, 100, 50));            // Прямоугольник&lt;br /&gt;
 painter.DrawRoundedRect(20, 20, 80, 40, 10, 10);   // Скругленный прямоугольник&lt;br /&gt;
'''Изображения'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawImage(const Rect &amp;amp;in target, const ResourceLink &amp;amp;in image, const Rect &amp;amp;in source)&amp;lt;/code&amp;gt; - изображение с областью&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawImage(const Point &amp;amp;in pos, const ResourceLink &amp;amp;in image, const Rect &amp;amp;in source)&amp;lt;/code&amp;gt; - изображение в позиции с областью&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawImage(const Rect &amp;amp;in target, const ResourceLink &amp;amp;in image)&amp;lt;/code&amp;gt; - изображение в прямоугольник&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawImage(const Point &amp;amp;in pos, const ResourceLink &amp;amp;in image)&amp;lt;/code&amp;gt; - изображение в позиции&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 ResourceLink img(&amp;quot;images/icon.png&amp;quot;);&lt;br /&gt;
 painter.DrawImage(Point(0, 0), img);                           // Рисуем в позиции (0,0)&lt;br /&gt;
 painter.DrawImage(Rect(10, 10, 32, 32), img);                 // Масштабируем в прямоугольник&lt;br /&gt;
 painter.DrawImage(Rect(0, 0, 64, 64), img, Rect(0, 0, 32, 32)); // Часть изображения&lt;br /&gt;
'''Текст'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawText(const Point &amp;amp;in pos, const string &amp;amp;in text)&amp;lt;/code&amp;gt; - текст в позиции&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawText(int x, int y, const string &amp;amp;in text)&amp;lt;/code&amp;gt; - текст с координатами&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawText(const Rect &amp;amp;in rect, int alignment, const string &amp;amp;in text)&amp;lt;/code&amp;gt; - текст в прямоугольнике с выравниванием&lt;br /&gt;
* &amp;lt;code&amp;gt;DrawText(int x, int y, int w, int h, int alignment, const string &amp;amp;in text)&amp;lt;/code&amp;gt; - текст в области с выравниванием&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 painter.DrawText(Point(10, 10), &amp;quot;Hello World&amp;quot;);                    // Простой текст&lt;br /&gt;
 painter.DrawText(Rect(0, 0, 200, 50), Alignment::AlignCenter, &amp;quot;Centered Text&amp;quot;);  // Выровненный текст&lt;br /&gt;
&lt;br /&gt;
=== Методы заливки и очистки ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;EraseRect(const Rect &amp;amp;in)&amp;lt;/code&amp;gt; - очистить прямоугольную область&lt;br /&gt;
* &amp;lt;code&amp;gt;EraseRect(int x, int y, int w, int h)&amp;lt;/code&amp;gt; - очистить область с координатами&lt;br /&gt;
* &amp;lt;code&amp;gt;FillRect(const Rect &amp;amp;in, const Brush &amp;amp;in)&amp;lt;/code&amp;gt; - залить прямоугольник кистью&lt;br /&gt;
* &amp;lt;code&amp;gt;FillRect(int x, int y, int w, int h, const Brush &amp;amp;in)&amp;lt;/code&amp;gt; - залить область кистью&lt;br /&gt;
* &amp;lt;code&amp;gt;FillRect(const Rect &amp;amp;in, const Color &amp;amp;in)&amp;lt;/code&amp;gt; - залить прямоугольник цветом&lt;br /&gt;
* &amp;lt;code&amp;gt;FillRect(int x, int y, int w, int h, const Color &amp;amp;in)&amp;lt;/code&amp;gt; - залить область цветом&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 painter.FillRect(Rect(0, 0, 100, 100), Color(255, 0, 0));      // Красный прямоугольник&lt;br /&gt;
 painter.FillRect(10, 10, 50, 50, gradientBrush);              // Градиентная заливка&lt;br /&gt;
 painter.EraseRect(5, 5, 10, 10);                              // Очистить область&lt;br /&gt;
&lt;br /&gt;
=== Управление состоянием ===&lt;br /&gt;
'''Геттеры и сеттеры стилей'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Brush GetBackground()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void SetBackground(const Brush &amp;amp;in)&amp;lt;/code&amp;gt; - фон&lt;br /&gt;
* &amp;lt;code&amp;gt;Brush GetBrush()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void SetBrush(const Brush &amp;amp;in)&amp;lt;/code&amp;gt; - кисть заливки&lt;br /&gt;
* &amp;lt;code&amp;gt;Point GetBrushOrigin()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void SetBrushOrigin(const Point &amp;amp;in)&amp;lt;/code&amp;gt; - начало координат кисти&lt;br /&gt;
* &amp;lt;code&amp;gt;Font GetFont()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void SetFont(const Font &amp;amp;in)&amp;lt;/code&amp;gt; - шрифт текста&lt;br /&gt;
* &amp;lt;code&amp;gt;Pen GetPen()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void SetPen(const Pen &amp;amp;in)&amp;lt;/code&amp;gt; - перо для линий&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 // Установка стилей&lt;br /&gt;
 painter.SetPen(Pen(2, Color(0, 0, 0)));&lt;br /&gt;
 painter.SetBrush(Brush(Color(255, 255, 0)));&lt;br /&gt;
 painter.SetFont(Font(12, &amp;quot;Arial&amp;quot;, false, true));&lt;br /&gt;
 &lt;br /&gt;
 // Получение текущих стилей&lt;br /&gt;
 Pen currentPen = painter.GetPen();&lt;br /&gt;
 Brush currentBrush = painter.GetBrush();&lt;br /&gt;
&lt;br /&gt;
=== Трансформации и clipping ===&lt;br /&gt;
'''Трансформации'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;void ResetTransform()&amp;lt;/code&amp;gt; - сброс всех трансформаций&lt;br /&gt;
* &amp;lt;code&amp;gt;void Rotate(double angle)&amp;lt;/code&amp;gt; - поворот на угол (в градусах)&lt;br /&gt;
* &amp;lt;code&amp;gt;void Scale(double sx, double sy)&amp;lt;/code&amp;gt; - масштабирование&lt;br /&gt;
* &amp;lt;code&amp;gt;void Shear(double sh, double sv)&amp;lt;/code&amp;gt; - наклон/скос&lt;br /&gt;
* &amp;lt;code&amp;gt;void Translate(const Point &amp;amp;in)&amp;lt;/code&amp;gt; - смещение&lt;br /&gt;
* &amp;lt;code&amp;gt;void Save()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void Restore()&amp;lt;/code&amp;gt; - сохранение/восстановление состояния&lt;br /&gt;
&lt;br /&gt;
'''Clipping (область отсечения)'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bool HasClipping()&amp;lt;/code&amp;gt; - проверка наличия области отсечения&lt;br /&gt;
* &amp;lt;code&amp;gt;void SetClipRect(const Rect &amp;amp;in, int operation = 1)&amp;lt;/code&amp;gt; - установка прямоугольной области отсечения&lt;br /&gt;
* &amp;lt;code&amp;gt;void SetClipRect(int x, int y, int w, int h, int operation = 1)&amp;lt;/code&amp;gt; - установка области с координатами&lt;br /&gt;
* &amp;lt;code&amp;gt;void SetClipping(bool enable)&amp;lt;/code&amp;gt; - включить/выключить отсечение&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 // Трансформации&lt;br /&gt;
 painter.Save();                          // Сохраняем состояние&lt;br /&gt;
 painter.Translate(Point(100, 100));      // Смещаем начало координат&lt;br /&gt;
 painter.Rotate(45);                      // Поворачиваем на 45 градусов&lt;br /&gt;
 painter.Scale(1.5, 1.0);                 // Масштабируем&lt;br /&gt;
 // Рисуем трансформированные объекты&lt;br /&gt;
 painter.Restore();                       // Восстанавливаем состояние&lt;br /&gt;
 &lt;br /&gt;
 // Clipping&lt;br /&gt;
 painter.SetClipRect(Rect(50, 50, 100, 100));  // Устанавливаем область отсечения&lt;br /&gt;
 // Все рисование будет обрезано по этой области&lt;br /&gt;
&lt;br /&gt;
=== Вспомогательные методы ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bool HasClipping()&amp;lt;/code&amp;gt; - проверка наличия clipping&lt;br /&gt;
* &amp;lt;code&amp;gt;int GetLayoutDirection()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void SetLayoutDirection(int)&amp;lt;/code&amp;gt; - направление layout (LTR/RTL)&lt;br /&gt;
* &amp;lt;code&amp;gt;double GetOpacity()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void SetOpacity(double)&amp;lt;/code&amp;gt; - прозрачность (0.0-1.0)&lt;br /&gt;
* &amp;lt;code&amp;gt;Rect GetBoundingRect(const Rect &amp;amp;in, int alignment, const string &amp;amp;in text)&amp;lt;/code&amp;gt; - вычисление ограничивающего прямоугольника для текста&lt;br /&gt;
* &amp;lt;code&amp;gt;Rect GetBoundingRect(int x, int y, int w, int h, int alignment, const string &amp;amp;in text)&amp;lt;/code&amp;gt; - вычисление с координатами&lt;br /&gt;
&lt;br /&gt;
'''Пример:'''&lt;br /&gt;
 // Вычисление размера текста&lt;br /&gt;
 Rect textBounds = painter.GetBoundingRect(Rect(0, 0, 0, 0), Alignment::AlignLeft, &amp;quot;Sample Text&amp;quot;);&lt;br /&gt;
 int textWidth = textBounds.width;&lt;br /&gt;
 int textHeight = textBounds.height;&lt;br /&gt;
 &lt;br /&gt;
 // Установка прозрачности&lt;br /&gt;
 painter.SetOpacity(0.5);  // Полупрозрачное рисование&lt;br /&gt;
&lt;br /&gt;
=== Полный пример использования Painter ===&lt;br /&gt;
 // Создание инструментов&lt;br /&gt;
 Pen borderPen(2, Color(0, 0, 0), LineType::Solid);&lt;br /&gt;
 Brush fillBrush(Color(255, 255, 0));&lt;br /&gt;
 Font textFont(14, &amp;quot;Arial&amp;quot;, false, true);&lt;br /&gt;
 &lt;br /&gt;
 // Настройка painter&lt;br /&gt;
 painter.SetPen(borderPen);&lt;br /&gt;
 painter.SetBrush(fillBrush);&lt;br /&gt;
 painter.SetFont(textFont);&lt;br /&gt;
 &lt;br /&gt;
 // Рисование&lt;br /&gt;
 painter.DrawRect(Rect(10, 10, 100, 50));                    // Прямоугольник&lt;br /&gt;
 painter.DrawEllipse(Point(150, 35), 25, 15);               // Эллипс&lt;br /&gt;
 painter.DrawLine(Point(200, 10), Point(250, 60));          // Линия&lt;br /&gt;
 painter.DrawText(Point(15, 15), &amp;quot;Hello World&amp;quot;);            // Текст&lt;br /&gt;
 &lt;br /&gt;
 // Градиентная заливка&lt;br /&gt;
 Gradient grad(GradientType::Linear);&lt;br /&gt;
 grad.start = Point(0, 0);&lt;br /&gt;
 grad.end = Point(100, 0);&lt;br /&gt;
 grad.AddColorStop(0.0, Color(255, 0, 0));&lt;br /&gt;
 grad.AddColorStop(1.0, Color(0, 0, 255));&lt;br /&gt;
 Brush gradBrush(grad);&lt;br /&gt;
 painter.SetBrush(gradBrush);&lt;br /&gt;
 painter.FillRect(Rect(300, 10, 100, 50), gradBrush);&lt;br /&gt;
&lt;br /&gt;
== Обработка событий ==&lt;br /&gt;
&lt;br /&gt;
=== MouseEvent ===&lt;br /&gt;
Событие мыши.&lt;br /&gt;
&lt;br /&gt;
'''Методы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MouseButton button() const&amp;lt;/code&amp;gt; - нажатая кнопка&lt;br /&gt;
* &amp;lt;code&amp;gt;Point pos() const&amp;lt;/code&amp;gt; - позиция курсора&lt;br /&gt;
* &amp;lt;code&amp;gt;int x() const&amp;lt;/code&amp;gt; - координата X&lt;br /&gt;
* &amp;lt;code&amp;gt;int y() const&amp;lt;/code&amp;gt; - координата Y&lt;br /&gt;
&lt;br /&gt;
'''Перечисление MouseButton:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;NoButton&amp;lt;/code&amp;gt; - нет нажатой кнопки&lt;br /&gt;
* &amp;lt;code&amp;gt;LeftButton&amp;lt;/code&amp;gt; - левая кнопка мыши&lt;br /&gt;
* &amp;lt;code&amp;gt;RightButton&amp;lt;/code&amp;gt; - правая кнопка мыши&lt;br /&gt;
* &amp;lt;code&amp;gt;MiddleButton&amp;lt;/code&amp;gt; - средняя кнопка мыши&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 void OnMouseClick(MouseEvent@ event) &lt;br /&gt;
 {&lt;br /&gt;
     if (event.button() == MouseButton::LeftButton) &lt;br /&gt;
     {&lt;br /&gt;
         Point clickPos = event.pos();&lt;br /&gt;
         int x = event.x();&lt;br /&gt;
         int y = event.y();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== WheelEvent ===&lt;br /&gt;
Событие колесика мыши.&lt;br /&gt;
&lt;br /&gt;
'''Методы:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;int angleDelta() const&amp;lt;/code&amp;gt; - угол поворота колесика (положительный - вверх, отрицательный - вниз)&lt;br /&gt;
&lt;br /&gt;
'''Пример использования:'''&lt;br /&gt;
 void OnWheel(WheelEvent@ event) &lt;br /&gt;
 {&lt;br /&gt;
     int delta = event.angleDelta();&lt;br /&gt;
     &lt;br /&gt;
     if (delta &amp;gt; 0) &lt;br /&gt;
     {&lt;br /&gt;
         // Прокрутка вверх&lt;br /&gt;
     } &lt;br /&gt;
     else &lt;br /&gt;
     {&lt;br /&gt;
         // Прокрутка вниз&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3473</id>
		<title>Перечень изменений AgavaSCADA/AgavaPLC 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3473"/>
		<updated>2026-04-06T06:28:08Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* 1.6.33-rc335f5d9dacf от 2026-04-01 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные изменения в сравнении с версией 1.2:&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания программ на языке C++ в соответствии с подходом, описанным в стандарте МЭК 61131-3.&lt;br /&gt;
# Продолжение развития объектной модели и возможности разработки программ, начатых в версии &amp;lt;code&amp;gt;AS 1.5&amp;lt;/code&amp;gt;. [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
# Добавлена поддержка локального и онлайн (удаленного) отладчика.&lt;br /&gt;
# Для редактирования текстов программ, функций и классов внедрен новый, удобный и функциональный текстовый редактор, подобный распространенному VSCode.&lt;br /&gt;
# Транспорты MQTT, SNMP, МЭК 60870-5-101, МЭК 60870-5-104 портированы на ПК с ОС Linux x64 и контроллеры АГАВА.&lt;br /&gt;
# Реализован новый архиватор в БД PostgreSQL.&lt;br /&gt;
# Добавлена поддержка ресурсов и библиотек ресурсов.&lt;br /&gt;
# Добавлена Web-визуализация. См. пример &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Разработан ряд примеров, демонстрирующих новые возможности: &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PIDRegulator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Wdt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AgavaAnalogInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WidgetAgavaInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Pump&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; и другие.&lt;br /&gt;
Также запланировано добавление новых возможностей:&lt;br /&gt;
# Поддержка языка ST МЭК 61131-3  (Structured text).&lt;br /&gt;
# Поддержка распределенных проектов.&lt;br /&gt;
# Поддержка сохранения в проекте информации о целевой системе.&lt;br /&gt;
# Конфигурирование целевых устройств из проекта.&lt;br /&gt;
# Создание расширений для среды разработки с помощью SDK.&lt;br /&gt;
Перевод разработанных ранее проектов на актуальную версию описан в документе [[Миграция проектов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== 1.6.33-rc335f5d9dacf от 2026-04-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработан выполнение алгоритмов C++: &lt;br /&gt;
#* Возвращён вызов виртуальных методов BasicSource. &lt;br /&gt;
#* Реализована защита от рекурсии в методах BasicSource.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; - зарегистрированы конструкторы и методы работы с типами uint64, uint32.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Отключена возможность множественных подключений к транспорту в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; :&lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Восстановлена работа в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт УПД&amp;lt;/code&amp;gt;: &lt;br /&gt;
## Исправлена работа со свойством &amp;lt;code&amp;gt;Идентификаторы ведущих&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Добавлено отслеживание активного подключения в режиме &amp;lt;code&amp;gt;Slave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Зарегистрирован класс [[Класс any|any]].&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Retain накопитель&amp;lt;/code&amp;gt; - реализована возможность сохранения через задержку.&lt;br /&gt;
# Добавлена возможность связывания свойств экземпляров с свойствами других узлов.&lt;br /&gt;
# Добавлены типы (u)int64 для связи со свойствами экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в команде &amp;quot;Показать в графическом представлении&amp;quot;.&lt;br /&gt;
# Доработано контекстное меню дерева проекта: &lt;br /&gt;
#* Исправлена критическая ошибка в команде &amp;quot;Выделить&amp;quot; для виджетов.&lt;br /&gt;
#* Пункт &amp;quot;Выделить&amp;quot; перемещен на уровень выше.&lt;br /&gt;
#* Добавлено действие &amp;quot;Выделить&amp;quot; на двойной клик по виджетам.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при открытии диалога &amp;quot;Настройки&amp;quot; для графиков.&lt;br /&gt;
# Устранены назойливые сообщения загрузки плагинов и регистрации узлов при проверке проекта.&lt;br /&gt;
# Добавлена возможность восстановления связей между узлами при вставке фрагментов из других проектов.&lt;br /&gt;
# Исправлена ошибка многократной установки ошибок в редактор кода, приводившая к сильному замедлению работы при большом количестве открытых окон редактора.&lt;br /&gt;
# Реализовано отображение содержимого массивов и указателей (хэндлов) в режиме отладки.&lt;br /&gt;
# Добавлены файловые ассоциации на файл проекта для быстрого открытия проекта в среде разработки с помощью двойного клика по .asp файлу.&lt;br /&gt;
# '''Отключен вызов сеттеров свойств при установке значений свойств в среде разработки.'''&lt;br /&gt;
# Отключено кеширование композиций в среде разработки.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при установке значения свойства типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; у экземпляра после сборки проекта.&lt;br /&gt;
# Доработано контекстное меню дерева проекта и контекстное меню графического предаставления - добавлены иконки элементов контекстного меню &amp;lt;code&amp;gt;Добавить узел&amp;lt;/code&amp;gt;, изменен порядок команд для более удобного их использования.&lt;br /&gt;
# Изменена горячая клавиша создания проекта на &amp;lt;code&amp;gt;Ctrl+Shift+N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Добавлено логгирование для системного и межстанционного транспортов.&lt;br /&gt;
# Убрана поддержка IPv6 в системном транспорте и межстанционном транспорте для работы на встраиваемых системах без IPv6.&lt;br /&gt;
# Исправлена критическая ошибка в BasicNode, иногда приводившая к крахам при одновременном доступе к объекту из разных задач.&lt;br /&gt;
&lt;br /&gt;
== 1.6.32-r79b12a16bbd7 от 2026-03-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Класс &amp;lt;code&amp;gt;WindowForm&amp;lt;/code&amp;gt; добавлен в объектную модель.&lt;br /&gt;
# Отключена возможность добавления узлов типа &amp;lt;code&amp;gt;Задача ПЛК&amp;lt;/code&amp;gt; как устаревшего функционала. Вместо него будет добавлена возможность создавать программы на языках FBD, CFC, SFC.&lt;br /&gt;
# Реализовано автоматическое создание конструкторов по умолчанию для классов из ОМ при отсутствии пользовательского.&lt;br /&gt;
# Исправлен запуск сигналов.&lt;br /&gt;
# Устранены утечки памяти при сохранении проекта в .bin.&lt;br /&gt;
# Внутренняя реорганизация обработчиков событий OperationsInput, OperationsOutput в узле &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен TransportModbusRtuIdr2.&lt;br /&gt;
# В действии &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; исправлена работа форматтера &amp;lt;code&amp;gt;$$pd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан редактор графического представления: добавлена сетка, [[Универсальная среда разработки Agava#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5 .D1.8F.D0.BA.D0.BE.D1.80.D0.B5.D0.B9|линейки, якоря]], функции выравнивания виджетов.&lt;br /&gt;
# Исправлена ошибка, вызывавшая двойной вызов обработчиков событий мыши для окон.&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при удалении виджетов.&lt;br /&gt;
# Добавлено приветственное окно со списком последних открытых проектов и таблицей примеров.&lt;br /&gt;
# Исправлена некритическая ошибка, возникавшая при закрытии фрейма.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при закрытии окна с кешированными композициями.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-rac6da98668fb от 2025-12-26 ==&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
# Добавлен пример  &amp;lt;code&amp;gt;Controllers/PLC70_Submodules&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-r9e81e0333260 от 2025-12-25 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания конструкторов вида Classname(const string &amp;amp;in path) в дереве.&lt;br /&gt;
# Исправлена ошибка в вызове обработчика &amp;lt;code&amp;gt;OnWheel&amp;lt;/code&amp;gt; у виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Корзина субмодулей&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Уменьшено время ожидания ответа субмодуля с 1000 мс до 25 мс.&lt;br /&gt;
#* Реализована поддержка слотов G/H/I/K для ПЛК-70. &lt;br /&gt;
#* Реализовано создание узлов для каналов субмодулей в дереве проекта. '''Обратите внимание, проекты, использующие прежнюю структуру субмодулей, не совместимы с версией AgavaSCADA/AgavaPLC 1.6.31!'''&lt;br /&gt;
#* Исправлена валидация слотов на уровне субмодуля. Добавлена проверка на занятость одного слота несколькими субмодулями с формированием сообщения об ошибке.&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-60&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлено ограничение значений подсветки экрана и индикаторов, добавлена валидация соответствующих свойств узлов.&lt;br /&gt;
#* Реализована установка яркости подсветки экрана и состояния светодиодов согласно настроек в проекте.&lt;br /&gt;
# Доработан транспорт OPC UA: &lt;br /&gt;
#* Добавлена поддержка типа double.&lt;br /&gt;
#* Устранены критические ошибки при повторном запуске транспорта и при записи в read-only тэги.&lt;br /&gt;
#* Добавлено уведомление пользователя о некорректных тэгах.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;: исправлено форматирование значений типа double - число знаков после запятой теперь зависит от шага значения.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена потенциальная ошибка сохранения проекта при открытии в проводнике папки с проектом.&lt;br /&gt;
# Изменен мастер создания проектов: для проектов для &amp;lt;code&amp;gt;ПЛК-70.А&amp;lt;/code&amp;gt;, создаваемых с помощью мастера, используется узел &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt; в предыдущей версии.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при запуске на ПК среды исполнения без проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.30-rb3d3b577ed29 от 2025-12-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Ядро ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена работа системного транспорта: устранена ошибка взаимодействия с другими станциями.&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка с обработкой вложенных групп в узле типа &amp;lt;code&amp;gt;Приложение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;NodeProperty&amp;lt;/code&amp;gt;: изменена регистрация класса, устранены критические ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработано редактирование свойств типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt;: добавлен сброс значения, позволяющий удалить ранее установленное значение.&lt;br /&gt;
# Доработан редактирование свойств типа &amp;lt;code&amp;gt;NodeLink&amp;lt;/code&amp;gt;: исправлена ошибка при работе с узлами с одними цифрами в имени.&lt;br /&gt;
# Доработано окно свойств: свойства типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt; принимают перетаскивание узлов.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Стек вызовов&amp;lt;/code&amp;gt;: при двойном клике по элементам таблицы открывается редактор кода.&lt;br /&gt;
# Доработан редактор кода: добавлены маркеры ошибок компиляции.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Ошибки&amp;lt;/code&amp;gt;: при двойном клике на ошибке выполняется открытие редактора кода.&lt;br /&gt;
# '''Добавлена возможность поиска по проекту. Панель поиска вызывается комбинацией клавиш &amp;lt;code&amp;gt;Ctrl+Shift+F&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Доработано окно тревог: добавлено сообщение &amp;quot;Активных тревог нет&amp;quot; в центре таблицы при отсутствии активных тревог.&lt;br /&gt;
&lt;br /&gt;
== 1.6.29-rf17ce9e25c7a от 2025-11-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;SetNodeValueAsUInt(string strNodePath, uint32_t uiValue)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Требовать квитирование&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана система тревог: добавлены обработчики событий &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;OnActiveEventsAcknowledged&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан архиватор SQLite: изменен алгоритм прореживания в режиме &amp;lt;code&amp;gt;Процент от среднего значения&amp;lt;/code&amp;gt; — теперь среднее вычисляется по последним N значениям.   Добавлено свойство &amp;lt;code&amp;gt;Размер окна среднего (N)&amp;lt;/code&amp;gt; для настройки ширины окна. Также добавлена опция &amp;lt;code&amp;gt;Процент от среднего (окно по времени)&amp;lt;/code&amp;gt;, в которой среднее рассчитывается по значениям за временной интервал, равный параметру &amp;lt;code&amp;gt;Интервал архивирования&amp;lt;/code&amp;gt;.  Исправлено отсутствие таблицы &amp;lt;code&amp;gt;SignalInfo&amp;lt;/code&amp;gt; при ротации БД.&lt;br /&gt;
# Доработана система тревог: добавлено свойство &amp;lt;code&amp;gt;Использовать цвет группы&amp;lt;/code&amp;gt; для отображения элементов в окне тревог.   Добавлено сохранение событий квитирования.&lt;br /&gt;
# Доработано окно смены пароля: добавлена поддержка свойства &amp;lt;code&amp;gt;Запретить смену пароля&amp;lt;/code&amp;gt; у узла пользователя.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;void sleep(ms)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Изменена логика работы функции &amp;lt;code&amp;gt;LaunchProcess&amp;lt;/code&amp;gt;, которая теперь выполняет запуск в блокирующем режиме, то есть функция завершится после завершения запущенного процесса.&lt;br /&gt;
# Исправлена ошибка в узле &amp;lt;code&amp;gt;Операция Таймер&amp;lt;/code&amp;gt;. Теперь выключенные действия в обработчике &amp;lt;code&amp;gt;OnTimerFinished&amp;lt;/code&amp;gt; не исполняются.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Упорядочен вывод сообщений в окно Сообщения. Устранен вывод служебных сообщений.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.28-r7aa0d6dc2386 от 2025-11-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработано действие Смена пароля пользователя - пользователи с запретом смены пароля блокируются в списке выбора.&lt;br /&gt;
# Исправлена критическая ошибка в системе проверки прав, возникающая при некорректной конфигурации системы. Дополнена валидация системы для уведомления о некорректной конфигурации.&lt;br /&gt;
# Доработана стандартная библиотека: реализованы функции &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetInterfaceAddresses(string)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetNetworkInterfaces()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запретить изменение пароля&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована работа со значениями типа SignalValue.&lt;br /&gt;
# Доработаны приложения - реализована выдача значений типа SignalValue для свойств экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в виджетах &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt;, возникавшая при удалении источника из списка.&lt;br /&gt;
# Добавлено сохранение типа узла в его тег в XML проекте.&lt;br /&gt;
# Изменено редактирование узлов &amp;lt;code&amp;gt;Операция скрипт С++&amp;lt;/code&amp;gt;, размещенных в обработчиках. Теперь это работает почти как в версии 1.2, но переход к редактору возможен только по нажатию ОК. При закрытии диалога контейнера добавлено закрытие окна редактора кода для вложенного узла.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, демонстрирующий применение ООП в проекте.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;, демонстрирующие принцип построения распределенных проектов.&lt;br /&gt;
&lt;br /&gt;
== 1.6.27-r8573369cf034 от 2025-10-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработана [[Узлы проекта AgavaSCADA/AgavaPLC#Композиция|композиция многослойная]]: добавлено свойство &amp;lt;code&amp;gt;ActionsOnLoad&amp;lt;/code&amp;gt;.&lt;br /&gt;
# В стандартную  библиотеку добавлена поддержка класса &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено чтение свойств типа &amp;lt;code&amp;gt;NColor&amp;lt;/code&amp;gt;  [[Свойства узлов в AgavaSCADA/AgavaPLC#NColor|через преобразование в int]].&lt;br /&gt;
# Устранены критические ошибки в системных функциях поиска файлов, возникавшие при работе с разрушенными файловыми системами.&lt;br /&gt;
# Добавлены функции &amp;lt;code&amp;gt;bool isnan(float value)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void LaunchProcess(string strFilePath)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.26-rfd1b5cbbf1fc от 2025-10-23 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Для узлов &amp;lt;code&amp;gt;RetainStorage&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;StorageDrive&amp;lt;/code&amp;gt; реализовано онлайн создание свойств.&lt;br /&gt;
# Доработаны методы &amp;lt;code&amp;gt;BasicSignal::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSignal::UpdateValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::UpdateValue&amp;lt;/code&amp;gt; - реализована выдача кодов [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|ошибок]].&lt;br /&gt;
# Доработаны архиваторы &amp;lt;code&amp;gt;SQLite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PostreSQL&amp;lt;/code&amp;gt; - добавлена возможность прореживания записи в БД.&lt;br /&gt;
# Выполнен рестайлинг окон проверки подлинности пользователя и смены пароля пользователя.&lt;br /&gt;
# Доработаны библиотеки ресурсов - исправлена работа с русскими символами.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Текущий&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана логика работы операторов &amp;lt;code&amp;gt;SignalValue operator&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SignalValue operator||&amp;lt;/code&amp;gt; - реализована генерация соответствующих событий при ошибках исполнения. Реализовано более простое и корректное сравнение значений. Изменен режим сравнения аргументов типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно с композицией: исправлена работа с свойством &amp;lt;code&amp;gt;CurrentCompositionDesc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;: устранена ошибка &amp;quot;Illegal Data Address&amp;quot; в режиме &amp;quot;Сервер&amp;quot; при создании нескольких блоков регистров.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск метода экземпляра&amp;lt;/code&amp;gt;: добавлена возможность передачи аргументов.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлен форматтер &amp;lt;code&amp;gt;$$ns&amp;lt;/code&amp;gt; - шифр узла.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt;: для вложенных действий типа &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; передается ссылка на себя для работы с форматтерами.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена критическая ошибка, возникавшая при кликах по свойствам только для чтения типа bool узлов в дереве проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.25-r97ac006e3905 от 2025-10-15 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;bool isnan(double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int LoadComposition(string, string, int)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена возможность размещения пользовательских виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Не показывать в списке&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в действии &amp;lt;code&amp;gt;Закрытие окна&amp;lt;/code&amp;gt;, возникавшая при закрытии нескольких окон подряд на активном экране.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Тренд&amp;lt;/code&amp;gt; графика исторического: в свойство &amp;lt;code&amp;gt;Использовать описание и шифр&amp;lt;/code&amp;gt; добавлен вариант &amp;lt;code&amp;gt;Вышестоящий узел сигнала&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена отдельная иконка для аварий. Исправлена работа свойства &amp;lt;code&amp;gt;Включить воспроизведение звуков&amp;lt;/code&amp;gt; на контроллерах.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: исправлена ошибка, при возникновении которой при деактивации события выводился текст активации.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при редактировании свойств типа &amp;lt;code&amp;gt;Узел&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Устранено &amp;quot;зависание&amp;quot; среды разработки при онлайн отладке и просмотре значений переменных из отлаживаемой программы.&lt;br /&gt;
# Доработано окно редактирования свойств типа &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;: добавлена возможность перемещения элементов.&lt;br /&gt;
# Доработано окно редактирования списка привилегий у роли: добавлена поддержка клавиши Del, реализовано сохранение и восстановление геометрии окна, реализовано удаление множества элементов.&lt;br /&gt;
# Доработано окно ошибок: двойной клик по ошибке выделяет в дереве проекта узел, вызвавший ошибку.&lt;br /&gt;
# Исправлено повторное открытие окна настройки привилегий.&lt;br /&gt;
# Доработана библиотека ресурсов: сохранение теперь выполняется только при наличии изменений.&lt;br /&gt;
&lt;br /&gt;
== 1.6.24-r93067f2c1dd1 от 2025-10-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;double rand(double, double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена поддержка команды &amp;lt;code&amp;gt;Сброс&amp;lt;/code&amp;gt; для действия &amp;lt;code&amp;gt;Команда узлу&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Контроллер событий&amp;lt;/code&amp;gt; переименован в &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Для монитора событий добавлено свойство &amp;lt;code&amp;gt;Блокировка работы&amp;lt;/code&amp;gt;, добавлен обработчик &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt;, вызывающийся после удаления всех активных тревог.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Регистр Modbus&amp;lt;/code&amp;gt; - добавлена поддержка онлайн создания свойств.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Транспорт Modbus&amp;lt;/code&amp;gt;: в режиме работы Slave устранена критическая ошибка, если не было указано свойство &amp;quot;Узел для чтения/записи&amp;quot;. Добавлено соответствующее предупреждение при сборке проекта.&lt;br /&gt;
# Добавлена поддержка связывания свойств экземпляров через аргументы типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Поведение при блокировании&amp;lt;/code&amp;gt;. Добавлена проверка значений контролируемых узлов при старте проекта.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан текстовый редактор кода: добавлена обработка нажатия клавиши &amp;lt;code&amp;gt;F9&amp;lt;/code&amp;gt; для добавления/удаления точек останова. Значительно ускорено открытие текстов программ в редакторе.&lt;br /&gt;
# Доработан отладчик: добавлено человеко-читаемое представление значений типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Дополнен пример &amp;lt;code&amp;gt;TestEventsAlarms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.23-ra13bff0d25ce от 2025-09-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлено восстановление свойств экземпляров объектов из retain.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt; - реализован арбитраж чтения/записи с помощью приоритетов.&lt;br /&gt;
# Исправлено некорректное позиционирование окон авторизации пользователя, выбора интервала графика или журнала и др. в проектах с составными фреймами, содержащими множество окон.&lt;br /&gt;
# Реализована запись во все источники узла &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка в редактировании свойств типа &amp;lt;code&amp;gt;Цвет&amp;lt;/code&amp;gt;, из-за которой иногда некорректно сохранялось значение альфа канала.&lt;br /&gt;
# Исправлена ошибка использования одной библиотеки ресурсов в разных проектах.&lt;br /&gt;
&lt;br /&gt;
== 1.6.22-r2d092373a7c2 от 2025-09-24 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Исправлены критические ошибки обращения к свойствам экземпляров объектов при выполнении программ.&lt;br /&gt;
# Исправлена ошибка первичного отображения окна тревог.&lt;br /&gt;
# Устранены ошибки в работе субмодулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранены ошибки компиляции проектов, использующих субмодули.&lt;br /&gt;
&lt;br /&gt;
== 1 1.6.21-rb7d9d1301bf0 от 2025-09-18 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств для виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализована проверка свойства &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; у действий перед выполнением.&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств экземпляров объектов и связывания их с методами и инициализации значениями.&lt;br /&gt;
# AS/PLC 2.38.&lt;br /&gt;
# Реализована возможность игнорирования ошибок связи при работе транспорта &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; (свойство &amp;lt;code&amp;gt;Действие при превышении порога ошибок 2&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Реализована инициализация значения сигнала простого значением связанного источника при запуске.&lt;br /&gt;
# Реализован кэш методов экземпляров объектов.&lt;br /&gt;
# Изменен механизм определения IP-адресов станции.&lt;br /&gt;
&lt;br /&gt;
=== 1.2 Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлена возможность выбора свойств узлов как источников для операций.&lt;br /&gt;
# Реализовано отображение признака &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; узлов в окне выбора узлов.&lt;br /&gt;
# Дополнена валидация виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.20-r0ad724e1e636 от 2025-08-08 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int StoreMessage(int iMessageLevel, string strMessage, string strGroup).&amp;lt;/code&amp;gt;&lt;br /&gt;
# Добавлена возможность вызова методов экземпляров объектов из действий.&lt;br /&gt;
# Исправлено выполнение действия &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;, теперь возможно создание событий из обработчиков.&lt;br /&gt;
# В тренды графиков добавлено свойство &amp;lt;code&amp;gt;Единицы измерения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен межстанционный транспорт. Для станций добавлено свойство &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt;. Станция с ролью &amp;lt;code&amp;gt;Клиент&amp;lt;/code&amp;gt; производит подключение к удаленным станциям с ролью &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt; и уведомляет об изменениях источников и сигналов.&lt;br /&gt;
# Устранена ошибочная генерация нескольких дублирующихся событий при работе контроллеров событий.&lt;br /&gt;
# В окне &amp;lt;code&amp;gt;Фильтр&amp;lt;/code&amp;gt; виджета &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; размер элементов теперь зависит от свойства системы тревог &amp;lt;code&amp;gt;Размер кнопки&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* добавлена [[Транспорты AgavaSCADA/AgavaPLC#Этап 2. Объединение команд записи (функции 15 и 16)|группировка команд записи]] для функций 15 и 16;&lt;br /&gt;
#* реализована [[Транспорты AgavaSCADA/AgavaPLC#Этап 1. Дедупликация при постановке в очередь|дедупликация команд записи]].&lt;br /&gt;
# Доработан транспорт OPC-UA: &lt;br /&gt;
#* исправлены типы свойств;&lt;br /&gt;
#* сервер теперь привязывается к порту, указанному в свойстве &amp;lt;code&amp;gt;Адрес&amp;lt;/code&amp;gt; (ранее всегда использовался 4840).&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка при перетаскивании разделителя столбцов.&lt;br /&gt;
# Свойство &amp;quot;Аргументы&amp;quot; программы сделано скрытым.&lt;br /&gt;
# Добавлена возможность размещения определений классов в приложении в подгруппах любой вложенности.&lt;br /&gt;
&lt;br /&gt;
== 1.6.19-r89b594033f4d от 2025-09-02 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Реализовано определение локальной станции для запуска проекта.&lt;br /&gt;
# Исправлен запуск узла типа &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# В мастер создания проектов добавлена поддержка АГАВА ПЛК-70.А.&lt;br /&gt;
# Исправлена конвертация виджетов &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt; при обновлении проекта с версии 1.2.&lt;br /&gt;
# Исправлена ошибка в окне настройки исторического графика, связанная с одновременным удалением нескольких трендов.&lt;br /&gt;
# Доработана проверка проекта перед сохранением конфигурации. При обнаружении критических ошибок - отказ сохранения.&lt;br /&gt;
# Добавлена проверки станций на использование адреса 127.0.0.1, на дублирующиеся IP-адреса.&lt;br /&gt;
&lt;br /&gt;
== 1.6.18-r4a325427448b от 2025-08-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработана установка аргументов в вызываемые методы экземпляров (добавлен тип &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; для некоторых сценариев).&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлен узел типа &amp;lt;code&amp;gt;Счетчик&amp;lt;/code&amp;gt;, хранящий признак активного подключения к устройству с заданным Modbus адресом.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Реализовано множественное подключение клиентов в режиме работы &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Доработан режим &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;: добавлена возможность настройки таймаута активности клиента и максимального количества подключений к серверу.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Шаблонная композиция&amp;lt;/code&amp;gt; убран из списка доступных типов для группы &amp;quot;Композиции&amp;quot;.&lt;br /&gt;
# Исправлена критическая ошибка, изредка возникавшая при переключении окон.&lt;br /&gt;
# Исправлена ошибка выполнения действия Закрытие окна.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена функция просмотра и редактирования списка источников формы.&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== 1.6.17-r1f70359a00b4 от 2025-08-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка передачи аргументов типов &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; в методы классов.&lt;br /&gt;
# Исправлено связывание свойств экземпляров базовых типов с узлами проекта.&lt;br /&gt;
# Доработан вызов методов типа &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; классов для исключения критических ошибок.&lt;br /&gt;
# Для кривых графиков изменена толщина линии по умолчанию на &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в команде &amp;lt;code&amp;gt;Сохранить архив проекта&amp;lt;/code&amp;gt; - устранено ошибочное создание дубликатов некоторых используемых проектом файлов.&lt;br /&gt;
# Доработано восстановление &amp;lt;code&amp;gt;retain&amp;lt;/code&amp;gt; - добавлена возможность восстановления в свойства экземпляров классов.&lt;br /&gt;
# Изменена конвертация &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; в другие типы.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены ошибки работы отладчика с точками останова в методах и свойствах классов.&lt;br /&gt;
# Изменен уровень ошибок компиляции при поиске путей в проекте (Get/SetNodeValueAs...  и др.) с &amp;lt;code&amp;gt;Ошибка&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;Предупреждение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализовано связывание виджетов со свойствами узлов путем перетаскивания.&lt;br /&gt;
# Добавлено местное (inplace) редактирование свойств типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; в диалоге редактирования сопоставлений, например в окне редактирования сопоставлений виджета &amp;lt;code&amp;gt;Выпадающий список&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Уточнено сообщение об ошибочном открытии проекта из папки &amp;lt;code&amp;gt;.autosave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно выбора узлов - кнопка &amp;lt;code&amp;gt;ОК&amp;lt;/code&amp;gt; теперь является кнопкой по умолчанию.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример SQLiteDecimation, демонстрирующий возможности прореживания при записи архива SQLite.&lt;br /&gt;
# Доработан пример TestEventsAlarms.&lt;br /&gt;
&lt;br /&gt;
== 1.6.16-r4dc07fc875a4 от 2025-07-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработан системный транспорт &amp;lt;code&amp;gt;TransportSystem2&amp;lt;/code&amp;gt; - изменена процедура остановка сервера для устранения незавершенных соединений.&lt;br /&gt;
# Доработаны виджеты &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; - исправлена работа с источником.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск процесса&amp;lt;/code&amp;gt; - исправлен запуск процесса.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлено обновление BuildNo и даты сборки проекта.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Убрано диалоговое окно с сообщением о частых попытках перезапуска при выходе.&lt;br /&gt;
# При запуске приложений из `.desktop` файлов добавлена проверка, что логирование в указанные файлы возможно.&lt;br /&gt;
# В файлы логов добавлена информация о версии приложения.&lt;br /&gt;
&lt;br /&gt;
== 1.6.15-r710146e4389e от 2025-07-09 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Узел Система тревог - добавлены настройки окна тревог (ширина, высота, перенос строк в сообщениях).&lt;br /&gt;
# Исправлена ошибка в проверке прав на закрытие фрейма, из-за чего в некоторых проектах без системы проверки прав закрытие фрейма не работало.&lt;br /&gt;
# Виджет &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; - исправлена ошибка при работе с диалогом ожидания.&lt;br /&gt;
# Действие &amp;lt;code&amp;gt;Авторизация пользователя&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt;. Действие с включенным свойством &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt; будет отображать окно авторизации без возможности смены пользователя.&lt;br /&gt;
# Реализована возможность инициализации свойств экземпляров объектов постоянными значениями, задаваемыми в среде разработки (доступны типы bool, int, uint, long, ulong, double, string).&lt;br /&gt;
# Для транспортов &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; добавлена очистка очереди команд при (ре)старте обмена.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена поддержка нового системного транспорта. Для подключения к панелям оператора и контроллерам из среды разработки необходимо обновить среду исполнения до версии 1.6.15 или более новой.&lt;br /&gt;
# Добавлена иконка для приложения [[Универсальная среда разработки Agava]] (впервые с версии 1.0!).&lt;br /&gt;
# Исправлены критические ошибки в webvisu из-за отсутствия qml модулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Откорректировано оформление окна авторизации с целью улучшения привлекательности.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LayersDemo&amp;lt;/code&amp;gt;. Пример &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; дополнен демонстрацией webvisu.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;OpcUaDemo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OpcUaClientDemo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Версия переведена в стабильную стадию.'''&lt;br /&gt;
&lt;br /&gt;
== 1.6.14-r1c61c35c3da4 от 2025-06-20 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность регулирования частоты обновления форм и экранов с композициями. Добавлено свойство &amp;quot;Интервал обновления&amp;quot; для экранов и композиций.&lt;br /&gt;
# У виджета &amp;quot;График&amp;quot; изменен форматтер оси времени по умолчанию с &amp;quot;dd.MM.yy hh:mm:ss&amp;quot; на &amp;quot;dd.MM.yyyy hh:mm:ss&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизирован вывод информации на экран - исключена повторная отрисовка виджетов, при записи значений в их свойства из скриптов и программ.&lt;br /&gt;
# Реализовано профилирование вызова базовых методов и работы с контекстами.&lt;br /&gt;
# Реализован вывод информации о перерисовке виджетов в консоль с настройкой через файл as.ini.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;WindowUpdateRate&amp;lt;/code&amp;gt;, демонстрирующий возможность ограничения частоты обновления окон.&lt;br /&gt;
&lt;br /&gt;
== 1.6.13-r13248581de39 от 2025-06-17 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка функции &amp;quot;Просмотр событий&amp;quot;, из-за которой некорректно выдавались события в проектах без логгеров.&lt;br /&gt;
# Реализовано копирование станций ПК-40, ПК-50, ПК-60.&lt;br /&gt;
# Устранено сохранение в архив проекта файлов .bi?, хранящихся в подпапках, начинающихся с точки. Например .autosave, .backup&lt;br /&gt;
# Разрешено добавление приложений к станциям ПО-40, ПО-50, ПО-60.&lt;br /&gt;
# Убрана зависимость от библиотеки libclang.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Реализован вывод информации о регионах перерисовки окон в консоль с настройкой через файл as.ini.&lt;br /&gt;
# Доработаны методы BasicSignal::GetValue, BasicSignal::SetValue для корректного обращения к узлам проекта.&lt;br /&gt;
# Исправлена ошибка в работе со светодиодами станции ПК-40.&lt;br /&gt;
# Исправлено создание BasicSource(&amp;quot;path&amp;quot;), BasicSignal(&amp;quot;path&amp;quot;), BasicWidget(&amp;quot;path&amp;quot;) в программах. Теперь появилась возможность доступа ко всем свойствам узла проекта, а не только к свойствам, определенным в BasicNode.&lt;br /&gt;
# Добавлена проверка типа при создании экземпляра BasicSource (ОМ).&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Разработан пример &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, демонстрирующий работу со светодиодами ПО-50 из программы с использованием объектной модели.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен скрипт для восстановления &amp;lt;code&amp;gt;explorer.exe&amp;lt;/code&amp;gt; в качестве оболочки рабочего стола после установки ASLauncher.&lt;br /&gt;
&lt;br /&gt;
== 1.6.12-r17b244111a8c от 2025-05-30 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка, возникавшая при перемещении узлов в дереве проекта, из-за которой перемещаемые узлы пропадали.&lt;br /&gt;
# Добавлено текстовое описание при появлении окна с ошибками, например при сохранении проекта.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Операция Пара условий&amp;lt;/code&amp;gt; - исправлены имена свойств. В проектах версии 1.2 операция не работала в режиме проверки двух условий. '''Необходимо проверить корректность настроек при переходе с версии 1.2.'''&lt;br /&gt;
# Исправлена ошибка определения уровня логгеров при вызове команды &amp;lt;code&amp;gt;Просмотр событий&amp;lt;/code&amp;gt;, из-за которой при наличии в проекте логгеров с уровнями логгирования &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; в окно событий не попадали события ниже уровнем.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизация узла &amp;lt;code&amp;gt;Транспорт TCP&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована система журналирования.&lt;br /&gt;
&lt;br /&gt;
== 1.6.8-r915d8d477fa4 от 2025-05-14 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
# Исправлено несоответствие настроек узла &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt; и фактически исполняемых команд. '''При обновлении на эту версию необходимо проверить корректность настроек всех улов типа &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3472</id>
		<title>Перечень изменений AgavaSCADA/AgavaPLC 1.6</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%87%D0%B5%D0%BD%D1%8C_%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_AgavaSCADA/AgavaPLC_1.6&amp;diff=3472"/>
		<updated>2026-04-06T06:27:12Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные изменения в сравнении с версией 1.2:&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания программ на языке C++ в соответствии с подходом, описанным в стандарте МЭК 61131-3.&lt;br /&gt;
# Продолжение развития объектной модели и возможности разработки программ, начатых в версии &amp;lt;code&amp;gt;AS 1.5&amp;lt;/code&amp;gt;. [[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
# Добавлена поддержка локального и онлайн (удаленного) отладчика.&lt;br /&gt;
# Для редактирования текстов программ, функций и классов внедрен новый, удобный и функциональный текстовый редактор, подобный распространенному VSCode.&lt;br /&gt;
# Транспорты MQTT, SNMP, МЭК 60870-5-101, МЭК 60870-5-104 портированы на ПК с ОС Linux x64 и контроллеры АГАВА.&lt;br /&gt;
# Реализован новый архиватор в БД PostgreSQL.&lt;br /&gt;
# Добавлена поддержка ресурсов и библиотек ресурсов.&lt;br /&gt;
# Добавлена Web-визуализация. См. пример &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Разработан ряд примеров, демонстрирующих новые возможности: &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PIDRegulator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Wdt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AgavaAnalogInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WidgetAgavaInput&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Pump&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; и другие.&lt;br /&gt;
Также запланировано добавление новых возможностей:&lt;br /&gt;
# Поддержка языка ST МЭК 61131-3  (Structured text).&lt;br /&gt;
# Поддержка распределенных проектов.&lt;br /&gt;
# Поддержка сохранения в проекте информации о целевой системе.&lt;br /&gt;
# Конфигурирование целевых устройств из проекта.&lt;br /&gt;
# Создание расширений для среды разработки с помощью SDK.&lt;br /&gt;
Перевод разработанных ранее проектов на актуальную версию описан в документе [[Миграция проектов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== 1.6.33-rc335f5d9dacf от 2026-04-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработан выполнение алгоритмов C++: &lt;br /&gt;
#* Возвращён вызов виртуальных методов BasicSource. &lt;br /&gt;
#* Реализована защита от рекурсии в методах BasicSource.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; - зарегистрированы конструкторы и методы работы с типами uint64, uint32.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Отключена возможность множественных подключений к транспорту в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt; :&lt;br /&gt;
#* Функция записи по умолчанию установлена на 0.&lt;br /&gt;
#* Восстановлена работа в режиме &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт УПД&amp;lt;/code&amp;gt;: &lt;br /&gt;
## Исправлена работа со свойством &amp;lt;code&amp;gt;Идентификаторы ведущих&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Добавлено отслеживание активного подключения в режиме &amp;lt;code&amp;gt;Slave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Зарегистрирован класс any.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Retain накопитель&amp;lt;/code&amp;gt; - реализована возможность сохранения через задержку.&lt;br /&gt;
# Добавлена возможность связывания свойств экземпляров с свойствами других узлов.&lt;br /&gt;
# Добавлены типы (u)int64 для связи со свойствами экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в команде &amp;quot;Показать в графическом представлении&amp;quot;.&lt;br /&gt;
# Доработано контекстное меню дерева проекта: &lt;br /&gt;
#* Исправлена критическая ошибка в команде &amp;quot;Выделить&amp;quot; для виджетов.&lt;br /&gt;
#* Пункт &amp;quot;Выделить&amp;quot; перемещен на уровень выше.&lt;br /&gt;
#* Добавлено действие &amp;quot;Выделить&amp;quot; на двойной клик по виджетам.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при открытии диалога &amp;quot;Настройки&amp;quot; для графиков.&lt;br /&gt;
# Устранены назойливые сообщения загрузки плагинов и регистрации узлов при проверке проекта.&lt;br /&gt;
# Добавлена возможность восстановления связей между узлами при вставке фрагментов из других проектов.&lt;br /&gt;
# Исправлена ошибка многократной установки ошибок в редактор кода, приводившая к сильному замедлению работы при большом количестве открытых окон редактора.&lt;br /&gt;
# Реализовано отображение содержимого массивов и указателей (хэндлов) в режиме отладки.&lt;br /&gt;
# Добавлены файловые ассоциации на файл проекта для быстрого открытия проекта в среде разработки с помощью двойного клика по .asp файлу.&lt;br /&gt;
# '''Отключен вызов сеттеров свойств при установке значений свойств в среде разработки.'''&lt;br /&gt;
# Отключено кеширование композиций в среде разработки.&lt;br /&gt;
# Исправлена критическая ошибка, возникавшая при установке значения свойства типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; у экземпляра после сборки проекта.&lt;br /&gt;
# Доработано контекстное меню дерева проекта и контекстное меню графического предаставления - добавлены иконки элементов контекстного меню &amp;lt;code&amp;gt;Добавить узел&amp;lt;/code&amp;gt;, изменен порядок команд для более удобного их использования.&lt;br /&gt;
# Изменена горячая клавиша создания проекта на &amp;lt;code&amp;gt;Ctrl+Shift+N&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Добавлено логгирование для системного и межстанционного транспортов.&lt;br /&gt;
# Убрана поддержка IPv6 в системном транспорте и межстанционном транспорте для работы на встраиваемых системах без IPv6.&lt;br /&gt;
# Исправлена критическая ошибка в BasicNode, иногда приводившая к крахам при одновременном доступе к объекту из разных задач.&lt;br /&gt;
&lt;br /&gt;
== 1.6.32-r79b12a16bbd7 от 2026-03-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Класс &amp;lt;code&amp;gt;WindowForm&amp;lt;/code&amp;gt; добавлен в объектную модель.&lt;br /&gt;
# Отключена возможность добавления узлов типа &amp;lt;code&amp;gt;Задача ПЛК&amp;lt;/code&amp;gt; как устаревшего функционала. Вместо него будет добавлена возможность создавать программы на языках FBD, CFC, SFC.&lt;br /&gt;
# Реализовано автоматическое создание конструкторов по умолчанию для классов из ОМ при отсутствии пользовательского.&lt;br /&gt;
# Исправлен запуск сигналов.&lt;br /&gt;
# Устранены утечки памяти при сохранении проекта в .bin.&lt;br /&gt;
# Внутренняя реорганизация обработчиков событий OperationsInput, OperationsOutput в узле &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен TransportModbusRtuIdr2.&lt;br /&gt;
# В действии &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; исправлена работа форматтера &amp;lt;code&amp;gt;$$pd&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан редактор графического представления: добавлена сетка, [[Универсальная среда разработки Agava#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5 .D1.8F.D0.BA.D0.BE.D1.80.D0.B5.D0.B9|линейки, якоря]], функции выравнивания виджетов.&lt;br /&gt;
# Исправлена ошибка, вызывавшая двойной вызов обработчиков событий мыши для окон.&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при удалении виджетов.&lt;br /&gt;
# Добавлено приветственное окно со списком последних открытых проектов и таблицей примеров.&lt;br /&gt;
# Исправлена некритическая ошибка, возникавшая при закрытии фрейма.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка, связанная с утечкой памяти при закрытии окна с кешированными композициями.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-rac6da98668fb от 2025-12-26 ==&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
# Добавлен пример  &amp;lt;code&amp;gt;Controllers/PLC70_Submodules&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.31-r9e81e0333260 от 2025-12-25 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность создания конструкторов вида Classname(const string &amp;amp;in path) в дереве.&lt;br /&gt;
# Исправлена ошибка в вызове обработчика &amp;lt;code&amp;gt;OnWheel&amp;lt;/code&amp;gt; у виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Корзина субмодулей&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Уменьшено время ожидания ответа субмодуля с 1000 мс до 25 мс.&lt;br /&gt;
#* Реализована поддержка слотов G/H/I/K для ПЛК-70. &lt;br /&gt;
#* Реализовано создание узлов для каналов субмодулей в дереве проекта. '''Обратите внимание, проекты, использующие прежнюю структуру субмодулей, не совместимы с версией AgavaSCADA/AgavaPLC 1.6.31!'''&lt;br /&gt;
#* Исправлена валидация слотов на уровне субмодуля. Добавлена проверка на занятость одного слота несколькими субмодулями с формированием сообщения об ошибке.&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-50&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-60&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлено ограничение значений подсветки экрана и индикаторов, добавлена валидация соответствующих свойств узлов.&lt;br /&gt;
#* Реализована установка яркости подсветки экрана и состояния светодиодов согласно настроек в проекте.&lt;br /&gt;
# Доработан транспорт OPC UA: &lt;br /&gt;
#* Добавлена поддержка типа double.&lt;br /&gt;
#* Устранены критические ошибки при повторном запуске транспорта и при записи в read-only тэги.&lt;br /&gt;
#* Добавлено уведомление пользователя о некорректных тэгах.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;: исправлено форматирование значений типа double - число знаков после запятой теперь зависит от шага значения.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена потенциальная ошибка сохранения проекта при открытии в проводнике папки с проектом.&lt;br /&gt;
# Изменен мастер создания проектов: для проектов для &amp;lt;code&amp;gt;ПЛК-70.А&amp;lt;/code&amp;gt;, создаваемых с помощью мастера, используется узел &amp;lt;code&amp;gt;Станция ПК-70&amp;lt;/code&amp;gt; вместо &amp;lt;code&amp;gt;Станция ПК-40&amp;lt;/code&amp;gt; в предыдущей версии.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при запуске на ПК среды исполнения без проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.30-rb3d3b577ed29 от 2025-12-05 ==&lt;br /&gt;
&lt;br /&gt;
=== Ядро ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена работа системного транспорта: устранена ошибка взаимодействия с другими станциями.&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка с обработкой вложенных групп в узле типа &amp;lt;code&amp;gt;Приложение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан класс &amp;lt;code&amp;gt;NodeProperty&amp;lt;/code&amp;gt;: изменена регистрация класса, устранены критические ошибки.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработано редактирование свойств типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt;: добавлен сброс значения, позволяющий удалить ранее установленное значение.&lt;br /&gt;
# Доработан редактирование свойств типа &amp;lt;code&amp;gt;NodeLink&amp;lt;/code&amp;gt;: исправлена ошибка при работе с узлами с одними цифрами в имени.&lt;br /&gt;
# Доработано окно свойств: свойства типа &amp;lt;code&amp;gt;ValueLink&amp;lt;/code&amp;gt; принимают перетаскивание узлов.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Стек вызовов&amp;lt;/code&amp;gt;: при двойном клике по элементам таблицы открывается редактор кода.&lt;br /&gt;
# Доработан редактор кода: добавлены маркеры ошибок компиляции.&lt;br /&gt;
# Доработано окно &amp;lt;code&amp;gt;Ошибки&amp;lt;/code&amp;gt;: при двойном клике на ошибке выполняется открытие редактора кода.&lt;br /&gt;
# '''Добавлена возможность поиска по проекту. Панель поиска вызывается комбинацией клавиш &amp;lt;code&amp;gt;Ctrl+Shift+F&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Доработано окно тревог: добавлено сообщение &amp;quot;Активных тревог нет&amp;quot; в центре таблицы при отсутствии активных тревог.&lt;br /&gt;
&lt;br /&gt;
== 1.6.29-rf17ce9e25c7a от 2025-11-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;SetNodeValueAsUInt(string strNodePath, uint32_t uiValue)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Требовать квитирование&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана система тревог: добавлены обработчики событий &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;OnActiveEventsAcknowledged&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан архиватор SQLite: изменен алгоритм прореживания в режиме &amp;lt;code&amp;gt;Процент от среднего значения&amp;lt;/code&amp;gt; — теперь среднее вычисляется по последним N значениям.   Добавлено свойство &amp;lt;code&amp;gt;Размер окна среднего (N)&amp;lt;/code&amp;gt; для настройки ширины окна. Также добавлена опция &amp;lt;code&amp;gt;Процент от среднего (окно по времени)&amp;lt;/code&amp;gt;, в которой среднее рассчитывается по значениям за временной интервал, равный параметру &amp;lt;code&amp;gt;Интервал архивирования&amp;lt;/code&amp;gt;.  Исправлено отсутствие таблицы &amp;lt;code&amp;gt;SignalInfo&amp;lt;/code&amp;gt; при ротации БД.&lt;br /&gt;
# Доработана система тревог: добавлено свойство &amp;lt;code&amp;gt;Использовать цвет группы&amp;lt;/code&amp;gt; для отображения элементов в окне тревог.   Добавлено сохранение событий квитирования.&lt;br /&gt;
# Доработано окно смены пароля: добавлена поддержка свойства &amp;lt;code&amp;gt;Запретить смену пароля&amp;lt;/code&amp;gt; у узла пользователя.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;void sleep(ms)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Изменена логика работы функции &amp;lt;code&amp;gt;LaunchProcess&amp;lt;/code&amp;gt;, которая теперь выполняет запуск в блокирующем режиме, то есть функция завершится после завершения запущенного процесса.&lt;br /&gt;
# Исправлена ошибка в узле &amp;lt;code&amp;gt;Операция Таймер&amp;lt;/code&amp;gt;. Теперь выключенные действия в обработчике &amp;lt;code&amp;gt;OnTimerFinished&amp;lt;/code&amp;gt; не исполняются.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Упорядочен вывод сообщений в окно Сообщения. Устранен вывод служебных сообщений.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.28-r7aa0d6dc2386 от 2025-11-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработано действие Смена пароля пользователя - пользователи с запретом смены пароля блокируются в списке выбора.&lt;br /&gt;
# Исправлена критическая ошибка в системе проверки прав, возникающая при некорректной конфигурации системы. Дополнена валидация системы для уведомления о некорректной конфигурации.&lt;br /&gt;
# Доработана стандартная библиотека: реализованы функции &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetInterfaceAddresses(string)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;array&amp;lt;string&amp;gt; GetNetworkInterfaces()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запретить изменение пароля&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована работа со значениями типа SignalValue.&lt;br /&gt;
# Доработаны приложения - реализована выдача значений типа SignalValue для свойств экземпляров.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена критическая ошибка в виджетах &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt;, возникавшая при удалении источника из списка.&lt;br /&gt;
# Добавлено сохранение типа узла в его тег в XML проекте.&lt;br /&gt;
# Изменено редактирование узлов &amp;lt;code&amp;gt;Операция скрипт С++&amp;lt;/code&amp;gt;, размещенных в обработчиках. Теперь это работает почти как в версии 1.2, но переход к редактору возможен только по нажатию ОК. При закрытии диалога контейнера добавлено закрытие окна редактора кода для вложенного узла.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;AIParameter&amp;lt;/code&amp;gt;, демонстрирующий применение ООП в проекте.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;DistributedDemoServer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DistributedDemoClient&amp;lt;/code&amp;gt;, демонстрирующие принцип построения распределенных проектов.&lt;br /&gt;
&lt;br /&gt;
== 1.6.27-r8573369cf034 от 2025-10-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Доработана [[Узлы проекта AgavaSCADA/AgavaPLC#Композиция|композиция многослойная]]: добавлено свойство &amp;lt;code&amp;gt;ActionsOnLoad&amp;lt;/code&amp;gt;.&lt;br /&gt;
# В стандартную  библиотеку добавлена поддержка класса &amp;lt;code&amp;gt;filesystem&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено чтение свойств типа &amp;lt;code&amp;gt;NColor&amp;lt;/code&amp;gt;  [[Свойства узлов в AgavaSCADA/AgavaPLC#NColor|через преобразование в int]].&lt;br /&gt;
# Устранены критические ошибки в системных функциях поиска файлов, возникавшие при работе с разрушенными файловыми системами.&lt;br /&gt;
# Добавлены функции &amp;lt;code&amp;gt;bool isnan(float value)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;void LaunchProcess(string strFilePath)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.26-rfd1b5cbbf1fc от 2025-10-23 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Для узлов &amp;lt;code&amp;gt;RetainStorage&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;StorageDrive&amp;lt;/code&amp;gt; реализовано онлайн создание свойств.&lt;br /&gt;
# Доработаны методы &amp;lt;code&amp;gt;BasicSignal::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSignal::UpdateValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::SetValue&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BasicSource::UpdateValue&amp;lt;/code&amp;gt; - реализована выдача кодов [[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC|ошибок]].&lt;br /&gt;
# Доработаны архиваторы &amp;lt;code&amp;gt;SQLite&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PostreSQL&amp;lt;/code&amp;gt; - добавлена возможность прореживания записи в БД.&lt;br /&gt;
# Выполнен рестайлинг окон проверки подлинности пользователя и смены пароля пользователя.&lt;br /&gt;
# Доработаны библиотеки ресурсов - исправлена работа с русскими символами.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Текущий&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработана логика работы операторов &amp;lt;code&amp;gt;SignalValue operator&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SignalValue operator||&amp;lt;/code&amp;gt; - реализована генерация соответствующих событий при ошибках исполнения. Реализовано более простое и корректное сравнение значений. Изменен режим сравнения аргументов типа &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно с композицией: исправлена работа с свойством &amp;lt;code&amp;gt;CurrentCompositionDesc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;: устранена ошибка &amp;quot;Illegal Data Address&amp;quot; в режиме &amp;quot;Сервер&amp;quot; при создании нескольких блоков регистров.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск метода экземпляра&amp;lt;/code&amp;gt;: добавлена возможность передачи аргументов.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: добавлен форматтер &amp;lt;code&amp;gt;$$ns&amp;lt;/code&amp;gt; - шифр узла.&lt;br /&gt;
# Доработан виджет &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt;: для вложенных действий типа &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt; передается ссылка на себя для работы с форматтерами.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена критическая ошибка, возникавшая при кликах по свойствам только для чтения типа bool узлов в дереве проекта.&lt;br /&gt;
&lt;br /&gt;
== 1.6.25-r97ac006e3905 от 2025-10-15 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;bool isnan(double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int LoadComposition(string, string, int)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлено действие &amp;lt;code&amp;gt;Смена пароля пользователя&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена возможность размещения пользовательских виджетов.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Пользователь&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Не показывать в списке&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в действии &amp;lt;code&amp;gt;Закрытие окна&amp;lt;/code&amp;gt;, возникавшая при закрытии нескольких окон подряд на активном экране.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Тренд&amp;lt;/code&amp;gt; графика исторического: в свойство &amp;lt;code&amp;gt;Использовать описание и шифр&amp;lt;/code&amp;gt; добавлен вариант &amp;lt;code&amp;gt;Вышестоящий узел сигнала&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно тревог: добавлена отдельная иконка для аварий. Исправлена работа свойства &amp;lt;code&amp;gt;Включить воспроизведение звуков&amp;lt;/code&amp;gt; на контроллерах.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;: исправлена ошибка, при возникновении которой при деактивации события выводился текст активации.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка при редактировании свойств типа &amp;lt;code&amp;gt;Узел&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Устранено &amp;quot;зависание&amp;quot; среды разработки при онлайн отладке и просмотре значений переменных из отлаживаемой программы.&lt;br /&gt;
# Доработано окно редактирования свойств типа &amp;lt;code&amp;gt;Список узлов&amp;lt;/code&amp;gt;: добавлена возможность перемещения элементов.&lt;br /&gt;
# Доработано окно редактирования списка привилегий у роли: добавлена поддержка клавиши Del, реализовано сохранение и восстановление геометрии окна, реализовано удаление множества элементов.&lt;br /&gt;
# Доработано окно ошибок: двойной клик по ошибке выделяет в дереве проекта узел, вызвавший ошибку.&lt;br /&gt;
# Исправлено повторное открытие окна настройки привилегий.&lt;br /&gt;
# Доработана библиотека ресурсов: сохранение теперь выполняется только при наличии изменений.&lt;br /&gt;
&lt;br /&gt;
== 1.6.24-r93067f2c1dd1 от 2025-10-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;double rand(double, double)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлена поддержка команды &amp;lt;code&amp;gt;Сброс&amp;lt;/code&amp;gt; для действия &amp;lt;code&amp;gt;Команда узлу&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Контроллер событий&amp;lt;/code&amp;gt; переименован в &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;. &lt;br /&gt;
# Для монитора событий добавлено свойство &amp;lt;code&amp;gt;Блокировка работы&amp;lt;/code&amp;gt;, добавлен обработчик &amp;lt;code&amp;gt;OnActiveEventsCleared&amp;lt;/code&amp;gt;, вызывающийся после удаления всех активных тревог.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Регистр Modbus&amp;lt;/code&amp;gt; - добавлена поддержка онлайн создания свойств.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Транспорт Modbus&amp;lt;/code&amp;gt;: в режиме работы Slave устранена критическая ошибка, если не было указано свойство &amp;quot;Узел для чтения/записи&amp;quot;. Добавлено соответствующее предупреждение при сборке проекта.&lt;br /&gt;
# Добавлена поддержка связывания свойств экземпляров через аргументы типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработан &amp;lt;code&amp;gt;Монитор событий&amp;lt;/code&amp;gt;: добавлено свойство &amp;lt;code&amp;gt;Поведение при блокировании&amp;lt;/code&amp;gt;. Добавлена проверка значений контролируемых узлов при старте проекта.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Доработан текстовый редактор кода: добавлена обработка нажатия клавиши &amp;lt;code&amp;gt;F9&amp;lt;/code&amp;gt; для добавления/удаления точек останова. Значительно ускорено открытие текстов программ в редакторе.&lt;br /&gt;
# Доработан отладчик: добавлено человеко-читаемое представление значений типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Дополнен пример &amp;lt;code&amp;gt;TestEventsAlarms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.23-ra13bff0d25ce от 2025-09-29 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Добавлено восстановление свойств экземпляров объектов из retain.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt; - реализован арбитраж чтения/записи с помощью приоритетов.&lt;br /&gt;
# Исправлено некорректное позиционирование окон авторизации пользователя, выбора интервала графика или журнала и др. в проектах с составными фреймами, содержащими множество окон.&lt;br /&gt;
# Реализована запись во все источники узла &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка в редактировании свойств типа &amp;lt;code&amp;gt;Цвет&amp;lt;/code&amp;gt;, из-за которой иногда некорректно сохранялось значение альфа канала.&lt;br /&gt;
# Исправлена ошибка использования одной библиотеки ресурсов в разных проектах.&lt;br /&gt;
&lt;br /&gt;
== 1.6.22-r2d092373a7c2 от 2025-09-24 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
# Исправлены критические ошибки обращения к свойствам экземпляров объектов при выполнении программ.&lt;br /&gt;
# Исправлена ошибка первичного отображения окна тревог.&lt;br /&gt;
# Устранены ошибки в работе субмодулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранены ошибки компиляции проектов, использующих субмодули.&lt;br /&gt;
&lt;br /&gt;
== 1 1.6.21-rb7d9d1301bf0 от 2025-09-18 ==&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств для виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализована проверка свойства &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; у действий перед выполнением.&lt;br /&gt;
# Исправлена ошибка &amp;quot;онлайн&amp;quot; создания свойств экземпляров объектов и связывания их с методами и инициализации значениями.&lt;br /&gt;
# AS/PLC 2.38.&lt;br /&gt;
# Реализована возможность игнорирования ошибок связи при работе транспорта &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; (свойство &amp;lt;code&amp;gt;Действие при превышении порога ошибок 2&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Реализована инициализация значения сигнала простого значением связанного источника при запуске.&lt;br /&gt;
# Реализован кэш методов экземпляров объектов.&lt;br /&gt;
# Изменен механизм определения IP-адресов станции.&lt;br /&gt;
&lt;br /&gt;
=== 1.2 Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлена возможность выбора свойств узлов как источников для операций.&lt;br /&gt;
# Реализовано отображение признака &amp;lt;code&amp;gt;Отключен&amp;lt;/code&amp;gt; узлов в окне выбора узлов.&lt;br /&gt;
# Дополнена валидация виджета &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 1.6.20-r0ad724e1e636 от 2025-08-08 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена функция &amp;lt;code&amp;gt;int StoreMessage(int iMessageLevel, string strMessage, string strGroup).&amp;lt;/code&amp;gt;&lt;br /&gt;
# Добавлена возможность вызова методов экземпляров объектов из действий.&lt;br /&gt;
# Исправлено выполнение действия &amp;lt;code&amp;gt;Создание события&amp;lt;/code&amp;gt;, теперь возможно создание событий из обработчиков.&lt;br /&gt;
# В тренды графиков добавлено свойство &amp;lt;code&amp;gt;Единицы измерения&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Добавлен межстанционный транспорт. Для станций добавлено свойство &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt;. Станция с ролью &amp;lt;code&amp;gt;Клиент&amp;lt;/code&amp;gt; производит подключение к удаленным станциям с ролью &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt; и уведомляет об изменениях источников и сигналов.&lt;br /&gt;
# Устранена ошибочная генерация нескольких дублирующихся событий при работе контроллеров событий.&lt;br /&gt;
# В окне &amp;lt;code&amp;gt;Фильтр&amp;lt;/code&amp;gt; виджета &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; размер элементов теперь зависит от свойства системы тревог &amp;lt;code&amp;gt;Размер кнопки&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработаны транспорты &amp;lt;code&amp;gt;Modbus&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* добавлена [[Транспорты AgavaSCADA/AgavaPLC#Этап 2. Объединение команд записи (функции 15 и 16)|группировка команд записи]] для функций 15 и 16;&lt;br /&gt;
#* реализована [[Транспорты AgavaSCADA/AgavaPLC#Этап 1. Дедупликация при постановке в очередь|дедупликация команд записи]].&lt;br /&gt;
# Доработан транспорт OPC-UA: &lt;br /&gt;
#* исправлены типы свойств;&lt;br /&gt;
#* сервер теперь привязывается к порту, указанному в свойстве &amp;lt;code&amp;gt;Адрес&amp;lt;/code&amp;gt; (ранее всегда использовался 4840).&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Устранена ошибка при перетаскивании разделителя столбцов.&lt;br /&gt;
# Свойство &amp;quot;Аргументы&amp;quot; программы сделано скрытым.&lt;br /&gt;
# Добавлена возможность размещения определений классов в приложении в подгруппах любой вложенности.&lt;br /&gt;
&lt;br /&gt;
== 1.6.19-r89b594033f4d от 2025-09-02 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Реализовано определение локальной станции для запуска проекта.&lt;br /&gt;
# Исправлен запуск узла типа &amp;lt;code&amp;gt;Сигнал простой&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# В мастер создания проектов добавлена поддержка АГАВА ПЛК-70.А.&lt;br /&gt;
# Исправлена конвертация виджетов &amp;lt;code&amp;gt;Ввод значения&amp;lt;/code&amp;gt; при обновлении проекта с версии 1.2.&lt;br /&gt;
# Исправлена ошибка в окне настройки исторического графика, связанная с одновременным удалением нескольких трендов.&lt;br /&gt;
# Доработана проверка проекта перед сохранением конфигурации. При обнаружении критических ошибок - отказ сохранения.&lt;br /&gt;
# Добавлена проверки станций на использование адреса 127.0.0.1, на дублирующиеся IP-адреса.&lt;br /&gt;
&lt;br /&gt;
== 1.6.18-r4a325427448b от 2025-08-06 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработана установка аргументов в вызываемые методы экземпляров (добавлен тип &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; для некоторых сценариев).&lt;br /&gt;
# Доработаны узлы &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Транспорт Modbus-RTU&amp;lt;/code&amp;gt;: &lt;br /&gt;
#* Добавлен узел типа &amp;lt;code&amp;gt;Счетчик&amp;lt;/code&amp;gt;, хранящий признак активного подключения к устройству с заданным Modbus адресом.&lt;br /&gt;
# Доработан узел &amp;lt;code&amp;gt;Транспорт Modbus-TCP&amp;lt;/code&amp;gt;:&lt;br /&gt;
#* Реализовано множественное подключение клиентов в режиме работы &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* Доработан режим &amp;lt;code&amp;gt;Сервер&amp;lt;/code&amp;gt;: добавлена возможность настройки таймаута активности клиента и максимального количества подключений к серверу.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Шаблонная композиция&amp;lt;/code&amp;gt; убран из списка доступных типов для группы &amp;quot;Композиции&amp;quot;.&lt;br /&gt;
# Исправлена критическая ошибка, изредка возникавшая при переключении окон.&lt;br /&gt;
# Исправлена ошибка выполнения действия Закрытие окна.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена функция просмотра и редактирования списка источников формы.&lt;br /&gt;
&lt;br /&gt;
# &lt;br /&gt;
&lt;br /&gt;
== 1.6.17-r1f70359a00b4 от 2025-08-01 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка передачи аргументов типов &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; в методы классов.&lt;br /&gt;
# Исправлено связывание свойств экземпляров базовых типов с узлами проекта.&lt;br /&gt;
# Доработан вызов методов типа &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; классов для исключения критических ошибок.&lt;br /&gt;
# Для кривых графиков изменена толщина линии по умолчанию на &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Исправлена ошибка в команде &amp;lt;code&amp;gt;Сохранить архив проекта&amp;lt;/code&amp;gt; - устранено ошибочное создание дубликатов некоторых используемых проектом файлов.&lt;br /&gt;
# Доработано восстановление &amp;lt;code&amp;gt;retain&amp;lt;/code&amp;gt; - добавлена возможность восстановления в свойства экземпляров классов.&lt;br /&gt;
# Изменена конвертация &amp;lt;code&amp;gt;Result&amp;lt;/code&amp;gt; в другие типы.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлены ошибки работы отладчика с точками останова в методах и свойствах классов.&lt;br /&gt;
# Изменен уровень ошибок компиляции при поиске путей в проекте (Get/SetNodeValueAs...  и др.) с &amp;lt;code&amp;gt;Ошибка&amp;lt;/code&amp;gt; на &amp;lt;code&amp;gt;Предупреждение&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Реализовано связывание виджетов со свойствами узлов путем перетаскивания.&lt;br /&gt;
# Добавлено местное (inplace) редактирование свойств типа &amp;lt;code&amp;gt;SignalValue&amp;lt;/code&amp;gt; в диалоге редактирования сопоставлений, например в окне редактирования сопоставлений виджета &amp;lt;code&amp;gt;Выпадающий список&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Уточнено сообщение об ошибочном открытии проекта из папки &amp;lt;code&amp;gt;.autosave&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Доработано окно выбора узлов - кнопка &amp;lt;code&amp;gt;ОК&amp;lt;/code&amp;gt; теперь является кнопкой по умолчанию.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример SQLiteDecimation, демонстрирующий возможности прореживания при записи архива SQLite.&lt;br /&gt;
# Доработан пример TestEventsAlarms.&lt;br /&gt;
&lt;br /&gt;
== 1.6.16-r4dc07fc875a4 от 2025-07-18 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Доработан системный транспорт &amp;lt;code&amp;gt;TransportSystem2&amp;lt;/code&amp;gt; - изменена процедура остановка сервера для устранения незавершенных соединений.&lt;br /&gt;
# Доработаны виджеты &amp;lt;code&amp;gt;Гистограмма&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Кнопка&amp;lt;/code&amp;gt; - исправлена работа с источником.&lt;br /&gt;
# Доработано действие &amp;lt;code&amp;gt;Запуск процесса&amp;lt;/code&amp;gt; - исправлен запуск процесса.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Восстановлено обновление BuildNo и даты сборки проекта.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Убрано диалоговое окно с сообщением о частых попытках перезапуска при выходе.&lt;br /&gt;
# При запуске приложений из `.desktop` файлов добавлена проверка, что логирование в указанные файлы возможно.&lt;br /&gt;
# В файлы логов добавлена информация о версии приложения.&lt;br /&gt;
&lt;br /&gt;
== 1.6.15-r710146e4389e от 2025-07-09 ==&lt;br /&gt;
&lt;br /&gt;
=== Узлы ===&lt;br /&gt;
&lt;br /&gt;
# Узел Система тревог - добавлены настройки окна тревог (ширина, высота, перенос строк в сообщениях).&lt;br /&gt;
# Исправлена ошибка в проверке прав на закрытие фрейма, из-за чего в некоторых проектах без системы проверки прав закрытие фрейма не работало.&lt;br /&gt;
# Виджет &amp;lt;code&amp;gt;Список событий&amp;lt;/code&amp;gt; - исправлена ошибка при работе с диалогом ожидания.&lt;br /&gt;
# Действие &amp;lt;code&amp;gt;Авторизация пользователя&amp;lt;/code&amp;gt; - добавлено свойство &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt;. Действие с включенным свойством &amp;lt;code&amp;gt;Запрашивать пароль&amp;lt;/code&amp;gt; будет отображать окно авторизации без возможности смены пользователя.&lt;br /&gt;
# Реализована возможность инициализации свойств экземпляров объектов постоянными значениями, задаваемыми в среде разработки (доступны типы bool, int, uint, long, ulong, double, string).&lt;br /&gt;
# Для транспортов &amp;lt;code&amp;gt;Modbus-RTU&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Modbus-TCP&amp;lt;/code&amp;gt; добавлена очистка очереди команд при (ре)старте обмена.&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена поддержка нового системного транспорта. Для подключения к панелям оператора и контроллерам из среды разработки необходимо обновить среду исполнения до версии 1.6.15 или более новой.&lt;br /&gt;
# Добавлена иконка для приложения [[Универсальная среда разработки Agava]] (впервые с версии 1.0!).&lt;br /&gt;
# Исправлены критические ошибки в webvisu из-за отсутствия qml модулей.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Откорректировано оформление окна авторизации с целью улучшения привлекательности.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LayersDemo&amp;lt;/code&amp;gt;. Пример &amp;lt;code&amp;gt;MultiImageLabel&amp;lt;/code&amp;gt; дополнен демонстрацией webvisu.&lt;br /&gt;
# Добавлены примеры &amp;lt;code&amp;gt;OpcUaDemo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OpcUaClientDemo&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Версия переведена в стабильную стадию.'''&lt;br /&gt;
&lt;br /&gt;
== 1.6.14-r1c61c35c3da4 от 2025-06-20 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Добавлена возможность регулирования частоты обновления форм и экранов с композициями. Добавлено свойство &amp;quot;Интервал обновления&amp;quot; для экранов и композиций.&lt;br /&gt;
# У виджета &amp;quot;График&amp;quot; изменен форматтер оси времени по умолчанию с &amp;quot;dd.MM.yy hh:mm:ss&amp;quot; на &amp;quot;dd.MM.yyyy hh:mm:ss&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизирован вывод информации на экран - исключена повторная отрисовка виджетов, при записи значений в их свойства из скриптов и программ.&lt;br /&gt;
# Реализовано профилирование вызова базовых методов и работы с контекстами.&lt;br /&gt;
# Реализован вывод информации о перерисовке виджетов в консоль с настройкой через файл as.ini.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен пример &amp;lt;code&amp;gt;WindowUpdateRate&amp;lt;/code&amp;gt;, демонстрирующий возможность ограничения частоты обновления окон.&lt;br /&gt;
&lt;br /&gt;
== 1.6.13-r13248581de39 от 2025-06-17 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка функции &amp;quot;Просмотр событий&amp;quot;, из-за которой некорректно выдавались события в проектах без логгеров.&lt;br /&gt;
# Реализовано копирование станций ПК-40, ПК-50, ПК-60.&lt;br /&gt;
# Устранено сохранение в архив проекта файлов .bi?, хранящихся в подпапках, начинающихся с точки. Например .autosave, .backup&lt;br /&gt;
# Разрешено добавление приложений к станциям ПО-40, ПО-50, ПО-60.&lt;br /&gt;
# Убрана зависимость от библиотеки libclang.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Реализован вывод информации о регионах перерисовки окон в консоль с настройкой через файл as.ini.&lt;br /&gt;
# Доработаны методы BasicSignal::GetValue, BasicSignal::SetValue для корректного обращения к узлам проекта.&lt;br /&gt;
# Исправлена ошибка в работе со светодиодами станции ПК-40.&lt;br /&gt;
# Исправлено создание BasicSource(&amp;quot;path&amp;quot;), BasicSignal(&amp;quot;path&amp;quot;), BasicWidget(&amp;quot;path&amp;quot;) в программах. Теперь появилась возможность доступа ко всем свойствам узла проекта, а не только к свойствам, определенным в BasicNode.&lt;br /&gt;
# Добавлена проверка типа при создании экземпляра BasicSource (ОМ).&lt;br /&gt;
&lt;br /&gt;
=== Примеры ===&lt;br /&gt;
&lt;br /&gt;
# Разработан пример &amp;lt;code&amp;gt;Leds&amp;lt;/code&amp;gt;, демонстрирующий работу со светодиодами ПО-50 из программы с использованием объектной модели.&lt;br /&gt;
&lt;br /&gt;
=== ASLauncher ===&lt;br /&gt;
&lt;br /&gt;
# Добавлен скрипт для восстановления &amp;lt;code&amp;gt;explorer.exe&amp;lt;/code&amp;gt; в качестве оболочки рабочего стола после установки ASLauncher.&lt;br /&gt;
&lt;br /&gt;
== 1.6.12-r17b244111a8c от 2025-05-30 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
&lt;br /&gt;
# Исправлена ошибка, возникавшая при перемещении узлов в дереве проекта, из-за которой перемещаемые узлы пропадали.&lt;br /&gt;
# Добавлено текстовое описание при появлении окна с ошибками, например при сохранении проекта.&lt;br /&gt;
# Узел &amp;lt;code&amp;gt;Операция Пара условий&amp;lt;/code&amp;gt; - исправлены имена свойств. В проектах версии 1.2 операция не работала в режиме проверки двух условий. '''Необходимо проверить корректность настроек при переходе с версии 1.2.'''&lt;br /&gt;
# Исправлена ошибка определения уровня логгеров при вызове команды &amp;lt;code&amp;gt;Просмотр событий&amp;lt;/code&amp;gt;, из-за которой при наличии в проекте логгеров с уровнями логгирования &amp;lt;code&amp;gt;INFO&amp;lt;/code&amp;gt; в окно событий не попадали события ниже уровнем.&lt;br /&gt;
&lt;br /&gt;
=== Среда исполнения ===&lt;br /&gt;
&lt;br /&gt;
# Оптимизация узла &amp;lt;code&amp;gt;Транспорт TCP&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Оптимизирована система журналирования.&lt;br /&gt;
&lt;br /&gt;
== 1.6.8-r915d8d477fa4 от 2025-05-14 ==&lt;br /&gt;
&lt;br /&gt;
=== Среда разработки ===&lt;br /&gt;
# Исправлено несоответствие настроек узла &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt; и фактически исполняемых команд. '''При обновлении на эту версию необходимо проверить корректность настроек всех улов типа &amp;lt;code&amp;gt;Действие &amp;quot;Команда узлу&amp;quot;&amp;lt;/code&amp;gt;.'''&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3471</id>
		<title>Универсальная среда разработки Agava</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3471"/>
		<updated>2026-03-27T09:49:45Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Режим симулятора */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Универсальная среда разработки предназначена для создания и редактирования программного обеспечения для панелей оператора АГАВА ПО, многоканальных программируемых реле АГАВА МПР-60 и систем диспетчеризации на базе SCADA-системы AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Универсальная среда разработки Agava имеет удобный и эргономичный пользовательский интерфейс со всеми инструментами, необходимыми для создания эффективных проектов-приложений, предназначенных для исполнения на ПК, панелях оператора или персональных компьютерах.&lt;br /&gt;
&lt;br /&gt;
Среда разработки совмещает редакторы текста, редакторы визуальных представлений объектов, компоновщики структуры, средства связывания объектов и других частей проекта, анализаторы проекта в одном приложении и дает пользователю возможность ведения эффективной разработки проектов-приложений от начала и до завершения в одной программе, без использования разнородных приложений-утилит и необходимости переключения между ними.&lt;br /&gt;
&lt;br /&gt;
=== Версии программного обеспечения ===&lt;br /&gt;
{{Внимание|Текст=При использовании среды разработки совместно с панелями оператора АГАВА ПО или многоканальными программируемыми реле АГАВА МПР-60 необходимо использовать соответствующую версию среды разработки|Тип=Восклицание синий.png}}&lt;br /&gt;
Для определения подходящей версии среды разработки необходимо определить версию среды исполнения, установленной в панели оператора или реле. Тип и версия среды исполнения указаны в системной утилите прибора. Например, &amp;quot;AgavaPLC 1.1&amp;quot;, &amp;quot;AgavaPLC 1.2&amp;quot;  и т.д. Для использования со средой исполнения AgavaPLC 1.1 необходимо использовать среду разработки версии 1.1, для среды исполнения AgavaPLC 1.2 необходима среда разработки версии 1.2 и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные статьи и документы ===&lt;br /&gt;
*[[Узлы проекта AgavaSCADA/AgavaPLC|Описание узлов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Свойства узлов в AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Транспорты AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание языка С++ в AgavaPLC|Описание языка С++ в AgavaSCADA/AgavaPLC]].&amp;lt;!-- Комментарий --&amp;gt;.&lt;br /&gt;
*[[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Рекомендации по разработке приложений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
Полный перечень всех документов, связанных с разработкой приложений на AgavaSCADA/AgavaPLC, приведен на странице [[:Категория:AgavaSCADA/AgavaPLC|категории AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Разработка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Создание нового проекта ===&lt;br /&gt;
Создание нового проекта в среде разработки осуществляется с помощью команды «Создать проект…» в меню «Файл». После вызова данной команды откроется диалоговое окно создания нового проекта (см. Рисунок 1).&lt;br /&gt;
[[Файл:AgavaPLC-Создание проекта.png|мини|Рисунок 1 - Окно &amp;quot;Создание нового проекта&amp;quot;]]&lt;br /&gt;
Для создания проекта необходимо в списке типов проектов выбрать необходимый, ввести имя проекта и путь для его сохранения, после чего нажать кнопку «Создать проект».&lt;br /&gt;
&lt;br /&gt;
Доступны несколько типов проектов:&lt;br /&gt;
&lt;br /&gt;
* «Пустой проект» – пустой проект, не содержащий никаких узлов. Данный тип можно использовать для создания произвольного проекта &amp;quot;с нуля&amp;quot;.&lt;br /&gt;
* «Локальный проект» – предварительно настроенный проект, содержащий необходимые подсистемы и предназначенный для реализации простой системы для одного устройства, при выборе данного типа пользователь имеет возможность выбрать нужные ему подсистемы и получить полностью рабочий проект в минимальной конфигурации.&lt;br /&gt;
* «Проект АГАВА ПО-40» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-40.&lt;br /&gt;
* «Проект АГАВА ПО-50» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-50.&lt;br /&gt;
* «Проект АГАВА МПР-60» - проект, предназначенный для исполнения на контроллере АГАВА МПР-60.&lt;br /&gt;
* «Проект АГАВА ПЛК-70.А» - проект, предназначенный для исполнения на контроллере АГАВА ПЛК-70.А.&lt;br /&gt;
&lt;br /&gt;
=== Редактирование существующего проекта ===&lt;br /&gt;
Редактирование существующего проекта начинается с открытия файла проекта путем вызова команды «Открыть…» в меню «Файл». После загрузки файла в основном окне среды разработки будут отображены свойства и параметры проекта (см. Рисунок 2).&lt;br /&gt;
[[Файл:AgavaPLC-Основное окно среды разработки.png|мини|Рисунок 2 – Основное окно среды разработки AgavaPLC с загруженным проектом]]&lt;br /&gt;
По умолчанию основное окно среды разработки содержит перечисленные ниже части:&lt;br /&gt;
&lt;br /&gt;
# Строка заголовка приложения, панель меню и панель инструментов.&lt;br /&gt;
# Окно дерева проекта. Предоставляет доступ ко всей структуре проекта (см. раздел [[Узлы проекта AgavaSCADA/AgavaPLC|Узлы проекта]]).&lt;br /&gt;
# Окно свойств (см. раздел [[#Редактирование свойств узлов]] ).&lt;br /&gt;
# Область для отображения содержимого, например графического представления окна, текста программы или задачи ПЛК.&lt;br /&gt;
# Область вспомогательных окон:&lt;br /&gt;
## Окно &amp;quot;Сообщения&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Ошибки&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Точки останова&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Ресурсы&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Глобальные переменные&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Выражения&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Стек вызовов&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Наблюдение&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Локальные переменные&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Поиск&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
После открытия проекта можно приступить к его редактированию.&lt;br /&gt;
&lt;br /&gt;
По завершению всех операций по редактированию необходимо выполнить проверку проекта на корректность с помощью команды «Проверить проект», расположенной в меню «Проект» (см. 6.1). &lt;br /&gt;
&lt;br /&gt;
=== Структура и состав проекта ===&lt;br /&gt;
Типичный проект содержит следующие части:&lt;br /&gt;
&lt;br /&gt;
* станция – важнейший объект, управляющий работой собственных подсистем и осуществляющий обмен данными с другими станциями;&lt;br /&gt;
* транспортная подсистема, выполняющая сбор данных с УСО;&lt;br /&gt;
* подсистема визуализации, обеспечивающая отображение информации в различных видах.&lt;br /&gt;
&lt;br /&gt;
Проект также может содержать следующие части:&lt;br /&gt;
&lt;br /&gt;
* подсистема архивирования, сохраняющая данные в БД для последующего извлечения и анализа;&lt;br /&gt;
* подсистема проверки прав пользователей, предназначенная для контроля доступа пользователя к объектам в режиме исполнения;&lt;br /&gt;
* подсистема тревог, предназначенная для оповещения пользователя об обнаруженных нарушениях;&lt;br /&gt;
* подсистема журналирования, выполняющая архивирование зарегистрированных событий в БД для последующего извлечения и анализа.&lt;br /&gt;
&lt;br /&gt;
Проект имеет древовидную структуру, вследствие чего все узлы связаны друг с другом. Узлы нижних уровней подчиняются узлам верхних уровней. К примеру, станции подчинены все подсистемы, а каждой подсистеме подчинены все узлы, которыми она управляет.&lt;br /&gt;
&lt;br /&gt;
Описание всех частей проекта и их узлов приведено в разделе 4.&lt;br /&gt;
&lt;br /&gt;
=== Разработка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC-Добавление узла в проект.png|мини|Рисунок 3 – Добавление узла в проект AgavaPLC]]&lt;br /&gt;
Перед началом разработки проекта рекомендуется проанализировать поставленную задачи и определить подсистемы, необходимые для её реализации. Взаимодействие с подсистемами осуществляется через дерево проекта (см. Рисунок 2), в которое добавляются нужные узлы. Для добавления нового узла, необходимо нажать правой кнопкой мыши на узел верхнего уровня, которому он подчинён, и выбрать в контекстном меню команду «Добавить узел».&lt;br /&gt;
&lt;br /&gt;
Основные части типовой программы и способы их реализации приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие с внешними устройствами ====&lt;br /&gt;
Реализуется через подсистему «Транспорты» в окне дерева проекта. Необходимо добавить в нее нужные протоколы, в зависимости от имеющейся конфигурации контроллера.&lt;br /&gt;
[[Файл:AgavaPLC-Транспорты.png|мини|Рисунок 4 - Транспорты в дереве проекта AgavaPLC]]&lt;br /&gt;
# Транспорт для обмена с субмодулями контроллера (для контроллеров с корзиной субмодулей). В качестве порта транспорта необходимо указать “/dev/ttyS0”. В проекте для МПР-60 присутствует по-умолчанию.&lt;br /&gt;
# Транспорт последовательный (для управления по RS-232, RS-485 и т.д.).&lt;br /&gt;
# Транспорт TCP/IP (для управления по Ethernet).&lt;br /&gt;
&lt;br /&gt;
К транспортам присоединяются либо регистры Modbus, либо субмодули. Для регистра задается адрес устройства, номер регистра, функция чтения/записи и другие параметры, при необходимости. Для субмодуля указывается слот, в котором он установлен, и тип аналоговых входов/выходов. &lt;br /&gt;
&lt;br /&gt;
==== Визуализация данных ====&lt;br /&gt;
Визуализация данных технологических процессов реализуется с помощью элементов подсистемы «Визуализация».&lt;br /&gt;
&lt;br /&gt;
Система визуализации недоступна в проектах для  контроллеров МПР.&lt;br /&gt;
[[Файл:AgavaPLC-Пример визуализации.png|мини|Рисунок 5 - Пример визуализации]]&lt;br /&gt;
Визуализация содержит одно или несколько окон, описанных ниже.&lt;br /&gt;
&lt;br /&gt;
# Форма, которая может использоваться как меню или панель инструментов. Также применяется в небольших проектах, в которых нет необходимости изменения выводимого набора виджетов.&lt;br /&gt;
# Окно с композицией, которое позволяет переключаться между различными экранами (например мнемосхемой, настройками, архивированием и т.д). Каждый из этих экранов реализуется на отдельной композиции.&lt;br /&gt;
&lt;br /&gt;
Процесс создания визуализации начинается с добавления нужных окон в группу «Окна» в дереве проекта. В том случае, если используется окно с композицией, необходимо задать ему отображаемую композицию по умолчанию, перед этим добавив ее в группу «Композиции». Созданные окна нужно добавить к одному фрейму, указав их в соответствующем свойстве фрейма.&lt;br /&gt;
&lt;br /&gt;
Редактирование содержимого окна или композиции осуществляется в его графическом представлении (см. раздел [[#Редактирование графического представления узла]]).&lt;br /&gt;
&lt;br /&gt;
Более подробное описание подсистемы визуализации приведено в разделе [[#Подсистема визуализации]].&lt;br /&gt;
&lt;br /&gt;
==== Пользовательские алгоритмы ====&lt;br /&gt;
Реализовать нужные алгоритмы работы программы можно с помощью различных инструментов, которые выбираются в зависимости от сложности проектов и навыков программиста:&lt;br /&gt;
&lt;br /&gt;
# Операции в группе «Сигналы» – отдельные логические операции. В основном используются для небольших проектов, не требующих сложных методов управления;&lt;br /&gt;
# Задачи ПЛК – графическое программирование с помощью связывания между собой различных функциональных блоков. Подходит для больших проектов. Реализуется в узле «Задача ПЛК» группы «Задачи». Подробное описание приведено в разделе [[#Задача ПЛК]]'''.'''&lt;br /&gt;
# Скрипты С++ – текстовое программирование на языке высокого уровня. Подходит для больших проектов. Реализуется с помощью операций «Скрипт С++», расположенных в группе «Сигналы» или в задаче ПЛК. Описание реализации языка С++ приведено на странице [[Описание языка С++ в AgavaPLC]].&lt;br /&gt;
=== Редактирование свойств узлов ===&lt;br /&gt;
Среда разработки обладает развитыми возможностями по редактированию свойств узлов. Описание доступных типов свойств приведно в статье [[Свойства узлов в AgavaPLC/AgavaSCADA]].&lt;br /&gt;
&lt;br /&gt;
==== Редактирование свойств узлов с помощью окна «Свойства» ====&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Свойства&amp;quot;.png|мини|Рисунок 6 – Окно «Свойства» виджета «Кнопка»]]&lt;br /&gt;
Редактирование свойств всех узлов осуществляется с помощью окна «Свойства».&lt;br /&gt;
&lt;br /&gt;
В окне «Свойства» в виде таблицы отображаются все доступные свойства узла, объединенные в группы. В левой колонке отображены наименования свойств, в правой отображены их значения. Свойства, недоступные для изменения, имеют наименование серого цвета. В нижней части окна расположена область подсказки, содержащая пояснение к выделенному свойству.&lt;br /&gt;
&lt;br /&gt;
===== Редактирование свойств группы узлов =====&lt;br /&gt;
В случае, когда необходимо изменить свойства у нескольких узлов, можно воспользоваться возможностью группового редактирования свойств. Для этого нужно выделить несколько узлов в дереве конфигурации либо на графическом представлении с помощью левой кнопки мыши и нажатой кнопки «Ctrl». При этом в окне свойств будут отображены только те свойства, что имеются у всех выделенных узлов. Далее можно изменить нужное свойство, при этом после завершения редактирования измененное значение будет установлено во всех выбранных узлах.&lt;br /&gt;
&lt;br /&gt;
==== Групповое редактирование свойств узлов ====&lt;br /&gt;
При необходимости редактирования разных свойств у большого количества узлов можно воспользоваться специальным окном «Список узлов».&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Список узлов&amp;quot;.png|мини|Рисунок 7 - Окно &amp;quot;Список узлов&amp;quot;]]&lt;br /&gt;
Открытие окна выполняется с помощью вызова команды «Открыть список узлов» в контекстном меню дерева конфигурации. Открытое окно содержит все узлы, вложенные в выбранные при вызове команды.&lt;br /&gt;
&lt;br /&gt;
Окно позволяет редактировать свойства непосредственно в ячейках таблицы, без переключения на окно «Свойства». Групповое редактирование свойств узлов через окно «Свойства» также доступно.&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на списке вызывает контекстное меню, содержащее команды:&lt;br /&gt;
&lt;br /&gt;
* “Свойства”;&lt;br /&gt;
* “Экспорт в *.txt”;&lt;br /&gt;
* “Импорт из *.txt”;&lt;br /&gt;
* “Удалить узел”.&lt;br /&gt;
&lt;br /&gt;
Команда «Свойства» открывает диалоговое окно выбора отображаемых свойств.&lt;br /&gt;
&lt;br /&gt;
Команды «Экспорт», «Импорт» выполняют экспорт списка свойств узлов в текстовый файл и импорт соответственно.&lt;br /&gt;
&lt;br /&gt;
Команда «Удалить узел» производит удаление выделенного узла (узлов).&lt;br /&gt;
&lt;br /&gt;
==== Функция групповой замены источников в узлах ====&lt;br /&gt;
При разработке сложных проектов может возникнуть необходимость заменить источники сразу в большом количестве узлов. Для этой цели используется функция групповой замены источников.  Необходимо перейти в редактирование свойств типа «Список источников», которое производится в соответствующем окне (см. Рисунок 8).&lt;br /&gt;
[[Файл:AgavaPLC-Окно редактирования свойств типа «Список источников».png|мини|Рисунок 8 - Окно редактирования свойств типа «Список источников»]]&lt;br /&gt;
Затем необходимо использовать функцию групповой замены (см. Рисунок 9), выделив нужные узлы, нажав на них правой кнопкой мыши и выбрав «Групповая замена».&lt;br /&gt;
[[Файл:AgavaPLC-Окно функции «Групповая замена».png|мини|Рисунок 9 - Окно функции «Групповая замена»]]&lt;br /&gt;
&lt;br /&gt;
=== Редактирование графического представления узла ===&lt;br /&gt;
Редактирование содержимого окон, слоев, форм, композиций и других элементов, предназначенных для отображения на экране, осуществляется в окне графического представления. Открытие окна возможно с помощью команды «Открыть графическое представление» в контекстном меню дерева конфигурации или двойного нажатия левой кнопки мыши для узлов следующих типов:&lt;br /&gt;
&lt;br /&gt;
* фрейм;&lt;br /&gt;
* форма;&lt;br /&gt;
* окно с композицией;&lt;br /&gt;
* слой.&lt;br /&gt;
&lt;br /&gt;
Открытое графическое представление выбранного узла может содержать все уже размещенные на нем элементы визуализации и (или) другие узлы и позволяет добавить новые.&lt;br /&gt;
[[Файл:AgavaPLC–Открытое графическое представление окна «winMain».png|мини|Рисунок 10 – Открытое графическое представление окна «winMain»]]&lt;br /&gt;
На рисунке 10 представлено графическое представление окна «winMain», обведенное пунктирной рамкой серого цвета, обозначающей внешнюю границу открытого узла. Тип рамки пользователь может выбрать по своему усмотрению, выбор производится в окне настроек среды разработки, доступном через команду «Настройки» в меню «Параметры».&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на пустом месте в открытом графическом представлении узла вызывает контекстное меню, содержащее команды удаления и вставки виджетов из буфера обмена, а также команды добавления новых виджетов доступных типов.&lt;br /&gt;
&lt;br /&gt;
Добавление новых виджетов также может осуществлять путем их перестаскивания в рабочую область из панели виджетов.&lt;br /&gt;
&lt;br /&gt;
Графическое представление позволяет перемещать выделенные виджеты кнопками перемещения курсора на клавиатуре, а также изменять их размеры кнопками перемещения курсора при нажатой кнопке Shift.&lt;br /&gt;
&lt;br /&gt;
==== Связывание источников и виджетов ====&lt;br /&gt;
Связывание виджетов и других узлов с источниками данных необходимо для того, чтобы виджеты или другие узлы могли отображать или обрабатывать значения, хранящиеся в источниках.&lt;br /&gt;
&lt;br /&gt;
Для связи виджетов с источниками данных можно воспользоваться обычным способом связывания через окно «Свойства». К примеру, связывание размещенного на форме виджета «Текстовая метка» с регистром Modbus осуществляется добавлением регистра Modbus в свойство виджета «Источник».&lt;br /&gt;
&lt;br /&gt;
Вместе с обычным способом связывания существует и другой, более быстрый способ. Для быстрого связывания регистра с виджетом достаточно нажать на регистр в дереве конфигурации левой кнопкой мыши и перенести его на виджет в открытом графическом представлении.&lt;br /&gt;
[[Файл:AgavaPLC–Связывание узла «sourceModbusRegister0» и виджета.png|мини|Рисунок 11 – Связывание узла «sourceModbusRegister0» и виджета]]&lt;br /&gt;
При помещении курсора над виджетом последний будет заштрихован сеткой зеленого или красного цвета, а курсор изменит свой вид на стрелку с квадратиком (см. рисунок 11).&lt;br /&gt;
&lt;br /&gt;
Зеленая штриховка виджета означает отсутствие связи выделенного виджета с источником данных, в этом случае связывание будет произведено. Красная штриховка говорит об ошибках связывания виджета и сигнала/источника.&lt;br /&gt;
&lt;br /&gt;
==== Редактирование многослойных композиций ====&lt;br /&gt;
Редактирование многослойных композиций принципиально не отличается от редактирования форм, кроме одного нюанса. Так как композиция может состоять из нескольких слоев, и виджеты на слоях могут располагаться один над другим, для использования наиболее удобного способа редактирования такой композиции можно воспользоваться возможностью открытия каждого слоя в отдельном окне.&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры композиции «Composition1», состоящей из трех слоев.png|мини|Рисунок 12 – Пример структуры композиции «Composition1», состоящей из трех слоев]]&lt;br /&gt;
Для открытия графического представления слоя нужно воспользоваться командой «Открыть графическое представление» аналогично открытию графического представления формы или композиции.&lt;br /&gt;
&lt;br /&gt;
Открыв одновременно композицию и слой, при редактировании слоя можно видеть, что содержимое композиции также изменяется и наоборот, при редактировании композиции изображение слоя будет изменяться.&lt;br /&gt;
&lt;br /&gt;
Слой обладает важным свойством «Прозрачность для действий». Данное свойство позволяет регулировать доступность виджетов, расположенных на нижележащих слоях, для действий пользователя. Например, если у верхнего слоя данное свойство выключено, то виджеты, расположенные на всех нижележащих слоях, будут недоступны для взаимодействия. Если же у верхнего слоя свойство включено, то виджеты нижележащего слоя будут доступны.&lt;br /&gt;
&lt;br /&gt;
==== Использование якорей ====&lt;br /&gt;
Данная возможность доступна с версии &amp;lt;code&amp;gt;AS 1.6.32+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При работе с графическими представлениями окон и композиций, содержащих большое количество виджетов, могут быть полезны якоря - создаваемые пользователем метки на размерных линейках.&lt;br /&gt;
[[Файл:AgavaPLC-Графическое представление-якоря.png|мини|AS 1.6.32+: Графическое представление формы с установленными якорями]]&lt;br /&gt;
Якоря позволяют контролировать положение групп виджетов благодаря связанным с ними линиям привязки. Линии привязки, позволяют быстрее выстраивать группы виджетов благодяря &amp;quot;прилипанию&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Создание якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Добавить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Удаление якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по якорю на размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Удалить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Созданные якоря можно перемещать по размерной линейке с помощью мыши.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение проекта ===&lt;br /&gt;
Для сохранения проекта на диск вызовите команду  «Файл-&amp;gt;Сохранить проект» или «Файл-&amp;gt;Сохранить проект как...», если необходимо сделать копию открытого проекта и продолжить работу в ней после сохранения.&lt;br /&gt;
&lt;br /&gt;
== Проверка и отладка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Эмуляция проекта ===&lt;br /&gt;
Проверить работоспособность проекта можно, не загружая его в контроллер. Для этого существует возможность запустить среду исполнения прямо на компьютере. &lt;br /&gt;
&lt;br /&gt;
Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Установить текущий проект как проект по умолчанию. Для этого необходимо вызвать команду &amp;quot;Проект-&amp;gt;Установить проект по умолчанию...&amp;quot;  и выбрать ранее сохраненный файл конфигурации.&lt;br /&gt;
# Запустить среду исполнения. Для этого нужно вызвать команду меню &amp;quot;Проект-&amp;gt;Запуск среды исполнения&amp;quot;. После этого будет выполнен запуск в новом окне среды исполнения.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг сигналов ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно &amp;quot;Наблюдение&amp;quot;.png|мини|Рисунок 14 – Окно &amp;quot;Наблюдение&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Наблюдение%22.png]]&lt;br /&gt;
Функция мониторинга сигналов позволяет наблюдать значения, хранящиеся в узлах проекта при исполнении проекта на целевом устройстве.&lt;br /&gt;
&lt;br /&gt;
Для запуска данной функции необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить среду исполнения.&lt;br /&gt;
# Вызвать команду меню «&amp;lt;code&amp;gt;Устройство → Подключение/отключение&amp;lt;/code&amp;gt;», в появившемся окне выбрать IP-адрес и порт устройства, значения узлов которого необходимо мониторить. При необходимости просмотра значений узлов и сигналов в режиме эмуляции проекта на персональном компьютере укажите адрес 127.0.0.1. Если необходимо просматривать значения узлов проекта, выполняющегося на контроллере или панели оператора, укажите IP-адрес контроллера или панели.&lt;br /&gt;
# Нажать кнопку «Подключение».&lt;br /&gt;
&lt;br /&gt;
Поле подключения к среде исполнения нужно добавить в окно &amp;quot;Наблюдение&amp;quot; узлы, значения которых необходимо наблюдать. Такие узлы должны иметь возможность чтения или записи значений – это регистры Modbus и другие узлы типа &amp;quot;Источник&amp;quot;, сигналы. &lt;br /&gt;
&lt;br /&gt;
Для добавления узлов в окно &amp;quot;Наблюдение&amp;quot; необходимо нажать на нужном узле в дереве проекта правой кнопкой мыши и выбрать команду «&amp;lt;code&amp;gt;Добавить в окно наблюдения&amp;lt;/code&amp;gt;». Выбранные узлы будут отображаться в окне «Наблюдение» вместе со считанными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг событий ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно просмотра событий.png|мини|Рисунок 15 – Окно просмотра событий]]Мониторинг событий позволяет наблюдать за исполнением проекта, работающего в устройстве. При включении мониторинга пользователь получает информацию о возникающих нефатальных ошибках и предупреждениях, возникающих в ходе исполнения проекта со следующими признаками:&lt;br /&gt;
&lt;br /&gt;
* метка времени, соответствующая времени возникновения события;&lt;br /&gt;
* степень важности события;&lt;br /&gt;
* тип события - информационное или события активирования, деактивирования и квитирования тревог;&lt;br /&gt;
* имя узла, сформировавшего событие.&lt;br /&gt;
* текст события.&lt;br /&gt;
&lt;br /&gt;
==== Использование мониторинга ====&lt;br /&gt;
Для старта мониторинга необходимо подключиться к нужному устройству способом, рассмотренным в разделе [[#Мониторинг сигналов]], а затем вызвать команду «&amp;lt;code&amp;gt;Устройство → Просмотр событий&amp;lt;/code&amp;gt;». В открывшемся окне будут выводиться все события, регистрируемые устройством. &lt;br /&gt;
&lt;br /&gt;
С помощью выпадающего списка в левом верхнем углу окна можно выбрать минимальный уровень выводимых событий.&lt;br /&gt;
&lt;br /&gt;
==== Фильтрация событий ====&lt;br /&gt;
''Функция доступна начиная с версии &amp;lt;code&amp;gt;AgavaSCADA/AgavaPLC 1.2.56+, 1.5.25+&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
В нижнем левом углу окна расположена область настройки фильтра событий, позволяющая фильтровать выводимые события по имени узла и тексту событий. При использовании фильтра возможно задание фильтра в виде:&lt;br /&gt;
&lt;br /&gt;
* простой строки, при этом в список попадают события, содержащие полное совпадение заданной строки; при задании строки возможно в(ы)ключение признака учета регистра символов в строке;&lt;br /&gt;
* регулярного выражения, при этом в список попадают события, удовлетворяющие введенное выражение. Правила составления регулярных выражений описаны на странице [[Использование регулярных выражений]].&lt;br /&gt;
&lt;br /&gt;
=== Отладка в задаче ПЛК ===&lt;br /&gt;
''Данный раздел актуален для версии &amp;lt;code&amp;gt;AS 1.2.61&amp;lt;/code&amp;gt; и старее. В версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt; используется [[Универсальная среда разработки Agava#Отладка проекта|современный пошаговый отладчик]].''&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК (см. раздел [[#Задача ПЛК]]) позволяет проводить тестирование проектов с помощью режима симулятора (на компьютере, без использования контроллера) или онлайн отладки (на контроллере).&lt;br /&gt;
&lt;br /&gt;
==== Управление отладкой ====&lt;br /&gt;
Управление режимом симуляции и онлайн отладкой осуществляется с помощью панели инструментов задачи ПЛК (см. рисунок 16).&lt;br /&gt;
&lt;br /&gt;
Панель инструментов содержит следующие элементы:&lt;br /&gt;
&lt;br /&gt;
* Кнопка «Запустить симуляцию».&lt;br /&gt;
* Кнопка «Сделать шаг на один цикл».&lt;br /&gt;
* Кнопка «Приостановить симуляцию» - ставит выполнение задачи на паузу.&lt;br /&gt;
* Кнопка «Остановить симуляцию» - сбрасывает состояние всех блоков к их состоянию по умолчанию.&lt;br /&gt;
* Список выбора периода выполнения задачи.&lt;br /&gt;
* Кнопка «Показать окно «Наблюдение».&lt;br /&gt;
&lt;br /&gt;
==== Режим симулятора ====&lt;br /&gt;
[[Файл:AgavaPLC-Панель инструментов задачи ПЛК.png|мини|Рисунок 16 - Панель инструментов задачи ПЛК]]&lt;br /&gt;
Режим симулятора позволяет провести тестирование работы алгоритмов проекта на компьютере. С помощью симуляции можно выявить ошибки в работе алгоритмов проекта до его загрузки в контроллер.&lt;br /&gt;
&lt;br /&gt;
Управление симуляцией осуществляется через команды на панели инструментов задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Для перехода в режим симуляции нажмите кнопку «Режим симулятора» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
После активации режима симуляции, для изменения значения входа дважды щелкните на нем левой кнопкой мыши и выберите нужный тип и значение. Текущие значения всех блоков, в соответствии с работой программы, будут отображаться в реальном времени.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме симулятора.png|мини|Рисунок 17 – Вид блоков задачи в режиме симулятора]]&lt;br /&gt;
Для выхода из режима симуляции повторно нажмите кнопку «Режим симуляции» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
==== Онлайн отладка ====&lt;br /&gt;
Режим онлайн отладки позволяет провести тестирование проекта, загруженного и исполняемого в контроллере. Для перехода в режим онлайн отладки загрузите конфигурацию в контроллер, подключитесь к нему, после чего нажмите кнопку «Онлайн отладка» на панели инструментов задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме онлайн отладки.png|мини|Рисунок 18 – Вид блоков задачи в режиме онлайн отладки]]&lt;br /&gt;
На рисунке 18 изображен вид задачи ПЛК в режиме онлайн отладки проекта, запущенного на МПР-60 с установленными субмодулями DI (входы) и R (выходы).&lt;br /&gt;
&lt;br /&gt;
Для онлайн отладки на панели инструментов недоступны кнопка «Приостановить симуляцию» и список выбора периода.&lt;br /&gt;
&lt;br /&gt;
== Компиляция проекта ==&lt;br /&gt;
Перед загрузкой проекта в контроллер или запуском эмуляции проекта необходимо откомпилировать проект и получить файл конфигурации, предназначенный для исполнения средой исполнения, установленной в контроллере или на персональном компьютере (в случае разработки системы диспетчеризации). Для этого необходимо вызвать команду меню &amp;quot;Проект-&amp;gt;Сохранить конфигурацию&amp;quot;, выбрать папку проекта и нажать кнопку &amp;quot;Сохранить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Проверка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Ошибки».png|мини|Рисунок 19 – Окно «Ошибки»]]&lt;br /&gt;
Перед сохранением проекта желательно выполнить его проверку на наличие ошибок с помощью команды «Проект-&amp;gt;Проверить проект». После проверки обнаруженные ошибки будут отображены в окне «Ошибки».&lt;br /&gt;
&lt;br /&gt;
Если отображение окна «Ошибки» выключено, его можно включить командой «Вид-&amp;gt;Показать окно ошибок».&lt;br /&gt;
&lt;br /&gt;
Для облегчения исправления обнаруженных ошибок окно поддерживает выполнение некоторых команд над обнаруженными ошибками, вызывать которые можно из контекстного меню, отображаемого щелчком правой кнопки мыши на строке c ошибкой в окне. Контекстное меню позволяет вызывать команду «Показать узел в дереве конфигурации», выполняющую соответствующее действие.&lt;br /&gt;
&lt;br /&gt;
Также щелчок левой кнопкой мыши на строке с ошибкой открывает окно «Свойства» и дает возможность изменить в нем все свойства узла, содержащего ошибку.&lt;br /&gt;
&lt;br /&gt;
==== Установка пароля на файл конфигурации ====&lt;br /&gt;
[[Файл:AgavaPLC–Установка пароля.png|мини|Рисунок 13 – Установка пароля]]&lt;br /&gt;
Файл конфигурации, загружаемый в контроллер или панель оператора, можно защитить паролем, чтобы предотвратить его несанкционированное изменение.&lt;br /&gt;
&lt;br /&gt;
Для установки пароля на файл конфигурации необходимо выбрать в дереве проекта узел «Конфигурация» и отредактировать его свойство «Пароль». Допускается использование любых цифр, букв и спецсимволов.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем при открытии файла конфигурации в среде разработки будет появляться окно с запросом пароля.&lt;br /&gt;
&lt;br /&gt;
== Загрузка проекта в устройство ==&lt;br /&gt;
Загрузка проекта в целевое устройство может быть осуществлена несколькими способами:&lt;br /&gt;
&lt;br /&gt;
* загрузка из среды разработки;&lt;br /&gt;
* загрузка с помощью USB-Flash накопителя (для панелей оператора);&lt;br /&gt;
* загрузка через браузер (для МПР-60).&lt;br /&gt;
&lt;br /&gt;
=== Загрузка из среды разработки ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Загрузка проекта в устройство» после подключения к контроллеру.png|мини|Рисунок 20 – Окно «Загрузка проекта в устройство» после подключения к контроллеру]]&lt;br /&gt;
Для загрузки проекта из среды разработки необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Создайте файл конфигурации.&lt;br /&gt;
# Выполните подключение целевого устройства к ПК по сети Ethernet.&lt;br /&gt;
# После подключения вызовите в среде разработки команду «Проект-&amp;gt;Загрузка проекта в устройство».&lt;br /&gt;
# В открывшемся окне будет отображен список файлов проекта, доступных для загрузки в целевое устройство.&lt;br /&gt;
# Выберите необходимые файлы и нажмите кнопку «Загрузить». После нажатия кнопки начнется процесс загрузки файлов, при этом в нижней части окна будет меняться состояние полосы прогресса, а также для каждого файла в таблице будет отображен результат загрузки.&lt;br /&gt;
# После окончания загрузки среда исполнения в целевом устройстве будет перезапущена и загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через USB-Flash (для ПО-40 и ПО-50) ===&lt;br /&gt;
Для загрузки проекта в устройство с помощью USB-Flash накопителя необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Подготовьте USB-Flash накопитель, предварительно отформатировав его в файловую систему FAT32.&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив в корень USB-Flash накопителя.&lt;br /&gt;
# Перейдите в системную утилиту, перезагрузив панель оператора, при загрузке во время однократного звукового сигнала нажмите на экран и удерживайте до повторного звукового сигнала. Введите пароль: 111111.&lt;br /&gt;
# Перейдите на вкладку «Обновление», затем подключите USB-Flash накопитель через переходник USB-OTG, выберите из списка загрузочный архив, нажать кнопку «Обновить». Дождитесь сообщения «Обновление успешно» и нажмите кнопку «ОК».&lt;br /&gt;
# Перейдите на вкладку «Перезапуск» и нажмите кнопку «Перезапуск».&lt;br /&gt;
После перезагрузки панели загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через браузер (для МПР-60) ===&lt;br /&gt;
Для загрузки проекта через браузер необходимо произвести следующие действия в указанном порядке.&lt;br /&gt;
&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив.&lt;br /&gt;
# Откройте системную утилиту, введя IP-адрес контроллера в адресную строку браузера.&lt;br /&gt;
# Перейдите на вкладку «Загрузка ПО».  Рисунок 71 - Вкладка системной утилиты «Загрузка ПО»&lt;br /&gt;
# Выберите на компьютере архив с проектом, который необходимо загрузить в контроллер.&lt;br /&gt;
# Нажмите кнопку «Загрузить».&lt;br /&gt;
# Дождитесь окончания загрузки файла и обновления проекта.&lt;br /&gt;
&lt;br /&gt;
== Отладка проекта ==&lt;br /&gt;
''Данный функционал доступен в версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;. Для версий &amp;lt;code&amp;gt;AS 1.2&amp;lt;/code&amp;gt; используйте мониторинг, [[Универсальная среда разработки Agava#Отладка в задаче ПЛК|отладку в задачах ПЛК]].''&lt;br /&gt;
&lt;br /&gt;
=== Локальная отладка ===&lt;br /&gt;
&lt;br /&gt;
=== Удаленная отладка ===&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3470</id>
		<title>Универсальная среда разработки Agava</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3470"/>
		<updated>2026-03-27T09:48:05Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Редактирование существующего проекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Универсальная среда разработки предназначена для создания и редактирования программного обеспечения для панелей оператора АГАВА ПО, многоканальных программируемых реле АГАВА МПР-60 и систем диспетчеризации на базе SCADA-системы AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Универсальная среда разработки Agava имеет удобный и эргономичный пользовательский интерфейс со всеми инструментами, необходимыми для создания эффективных проектов-приложений, предназначенных для исполнения на ПК, панелях оператора или персональных компьютерах.&lt;br /&gt;
&lt;br /&gt;
Среда разработки совмещает редакторы текста, редакторы визуальных представлений объектов, компоновщики структуры, средства связывания объектов и других частей проекта, анализаторы проекта в одном приложении и дает пользователю возможность ведения эффективной разработки проектов-приложений от начала и до завершения в одной программе, без использования разнородных приложений-утилит и необходимости переключения между ними.&lt;br /&gt;
&lt;br /&gt;
=== Версии программного обеспечения ===&lt;br /&gt;
{{Внимание|Текст=При использовании среды разработки совместно с панелями оператора АГАВА ПО или многоканальными программируемыми реле АГАВА МПР-60 необходимо использовать соответствующую версию среды разработки|Тип=Восклицание синий.png}}&lt;br /&gt;
Для определения подходящей версии среды разработки необходимо определить версию среды исполнения, установленной в панели оператора или реле. Тип и версия среды исполнения указаны в системной утилите прибора. Например, &amp;quot;AgavaPLC 1.1&amp;quot;, &amp;quot;AgavaPLC 1.2&amp;quot;  и т.д. Для использования со средой исполнения AgavaPLC 1.1 необходимо использовать среду разработки версии 1.1, для среды исполнения AgavaPLC 1.2 необходима среда разработки версии 1.2 и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные статьи и документы ===&lt;br /&gt;
*[[Узлы проекта AgavaSCADA/AgavaPLC|Описание узлов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Свойства узлов в AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Транспорты AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание языка С++ в AgavaPLC|Описание языка С++ в AgavaSCADA/AgavaPLC]].&amp;lt;!-- Комментарий --&amp;gt;.&lt;br /&gt;
*[[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Рекомендации по разработке приложений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
Полный перечень всех документов, связанных с разработкой приложений на AgavaSCADA/AgavaPLC, приведен на странице [[:Категория:AgavaSCADA/AgavaPLC|категории AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Разработка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Создание нового проекта ===&lt;br /&gt;
Создание нового проекта в среде разработки осуществляется с помощью команды «Создать проект…» в меню «Файл». После вызова данной команды откроется диалоговое окно создания нового проекта (см. Рисунок 1).&lt;br /&gt;
[[Файл:AgavaPLC-Создание проекта.png|мини|Рисунок 1 - Окно &amp;quot;Создание нового проекта&amp;quot;]]&lt;br /&gt;
Для создания проекта необходимо в списке типов проектов выбрать необходимый, ввести имя проекта и путь для его сохранения, после чего нажать кнопку «Создать проект».&lt;br /&gt;
&lt;br /&gt;
Доступны несколько типов проектов:&lt;br /&gt;
&lt;br /&gt;
* «Пустой проект» – пустой проект, не содержащий никаких узлов. Данный тип можно использовать для создания произвольного проекта &amp;quot;с нуля&amp;quot;.&lt;br /&gt;
* «Локальный проект» – предварительно настроенный проект, содержащий необходимые подсистемы и предназначенный для реализации простой системы для одного устройства, при выборе данного типа пользователь имеет возможность выбрать нужные ему подсистемы и получить полностью рабочий проект в минимальной конфигурации.&lt;br /&gt;
* «Проект АГАВА ПО-40» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-40.&lt;br /&gt;
* «Проект АГАВА ПО-50» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-50.&lt;br /&gt;
* «Проект АГАВА МПР-60» - проект, предназначенный для исполнения на контроллере АГАВА МПР-60.&lt;br /&gt;
* «Проект АГАВА ПЛК-70.А» - проект, предназначенный для исполнения на контроллере АГАВА ПЛК-70.А.&lt;br /&gt;
&lt;br /&gt;
=== Редактирование существующего проекта ===&lt;br /&gt;
Редактирование существующего проекта начинается с открытия файла проекта путем вызова команды «Открыть…» в меню «Файл». После загрузки файла в основном окне среды разработки будут отображены свойства и параметры проекта (см. Рисунок 2).&lt;br /&gt;
[[Файл:AgavaPLC-Основное окно среды разработки.png|мини|Рисунок 2 – Основное окно среды разработки AgavaPLC с загруженным проектом]]&lt;br /&gt;
По умолчанию основное окно среды разработки содержит перечисленные ниже части:&lt;br /&gt;
&lt;br /&gt;
# Строка заголовка приложения, панель меню и панель инструментов.&lt;br /&gt;
# Окно дерева проекта. Предоставляет доступ ко всей структуре проекта (см. раздел [[Узлы проекта AgavaSCADA/AgavaPLC|Узлы проекта]]).&lt;br /&gt;
# Окно свойств (см. раздел [[#Редактирование свойств узлов]] ).&lt;br /&gt;
# Область для отображения содержимого, например графического представления окна, текста программы или задачи ПЛК.&lt;br /&gt;
# Область вспомогательных окон:&lt;br /&gt;
## Окно &amp;quot;Сообщения&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Ошибки&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Точки останова&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Ресурсы&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Глобальные переменные&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Выражения&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Стек вызовов&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Наблюдение&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Локальные переменные&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Поиск&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
После открытия проекта можно приступить к его редактированию.&lt;br /&gt;
&lt;br /&gt;
По завершению всех операций по редактированию необходимо выполнить проверку проекта на корректность с помощью команды «Проверить проект», расположенной в меню «Проект» (см. 6.1). &lt;br /&gt;
&lt;br /&gt;
=== Структура и состав проекта ===&lt;br /&gt;
Типичный проект содержит следующие части:&lt;br /&gt;
&lt;br /&gt;
* станция – важнейший объект, управляющий работой собственных подсистем и осуществляющий обмен данными с другими станциями;&lt;br /&gt;
* транспортная подсистема, выполняющая сбор данных с УСО;&lt;br /&gt;
* подсистема визуализации, обеспечивающая отображение информации в различных видах.&lt;br /&gt;
&lt;br /&gt;
Проект также может содержать следующие части:&lt;br /&gt;
&lt;br /&gt;
* подсистема архивирования, сохраняющая данные в БД для последующего извлечения и анализа;&lt;br /&gt;
* подсистема проверки прав пользователей, предназначенная для контроля доступа пользователя к объектам в режиме исполнения;&lt;br /&gt;
* подсистема тревог, предназначенная для оповещения пользователя об обнаруженных нарушениях;&lt;br /&gt;
* подсистема журналирования, выполняющая архивирование зарегистрированных событий в БД для последующего извлечения и анализа.&lt;br /&gt;
&lt;br /&gt;
Проект имеет древовидную структуру, вследствие чего все узлы связаны друг с другом. Узлы нижних уровней подчиняются узлам верхних уровней. К примеру, станции подчинены все подсистемы, а каждой подсистеме подчинены все узлы, которыми она управляет.&lt;br /&gt;
&lt;br /&gt;
Описание всех частей проекта и их узлов приведено в разделе 4.&lt;br /&gt;
&lt;br /&gt;
=== Разработка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC-Добавление узла в проект.png|мини|Рисунок 3 – Добавление узла в проект AgavaPLC]]&lt;br /&gt;
Перед началом разработки проекта рекомендуется проанализировать поставленную задачи и определить подсистемы, необходимые для её реализации. Взаимодействие с подсистемами осуществляется через дерево проекта (см. Рисунок 2), в которое добавляются нужные узлы. Для добавления нового узла, необходимо нажать правой кнопкой мыши на узел верхнего уровня, которому он подчинён, и выбрать в контекстном меню команду «Добавить узел».&lt;br /&gt;
&lt;br /&gt;
Основные части типовой программы и способы их реализации приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие с внешними устройствами ====&lt;br /&gt;
Реализуется через подсистему «Транспорты» в окне дерева проекта. Необходимо добавить в нее нужные протоколы, в зависимости от имеющейся конфигурации контроллера.&lt;br /&gt;
[[Файл:AgavaPLC-Транспорты.png|мини|Рисунок 4 - Транспорты в дереве проекта AgavaPLC]]&lt;br /&gt;
# Транспорт для обмена с субмодулями контроллера (для контроллеров с корзиной субмодулей). В качестве порта транспорта необходимо указать “/dev/ttyS0”. В проекте для МПР-60 присутствует по-умолчанию.&lt;br /&gt;
# Транспорт последовательный (для управления по RS-232, RS-485 и т.д.).&lt;br /&gt;
# Транспорт TCP/IP (для управления по Ethernet).&lt;br /&gt;
&lt;br /&gt;
К транспортам присоединяются либо регистры Modbus, либо субмодули. Для регистра задается адрес устройства, номер регистра, функция чтения/записи и другие параметры, при необходимости. Для субмодуля указывается слот, в котором он установлен, и тип аналоговых входов/выходов. &lt;br /&gt;
&lt;br /&gt;
==== Визуализация данных ====&lt;br /&gt;
Визуализация данных технологических процессов реализуется с помощью элементов подсистемы «Визуализация».&lt;br /&gt;
&lt;br /&gt;
Система визуализации недоступна в проектах для  контроллеров МПР.&lt;br /&gt;
[[Файл:AgavaPLC-Пример визуализации.png|мини|Рисунок 5 - Пример визуализации]]&lt;br /&gt;
Визуализация содержит одно или несколько окон, описанных ниже.&lt;br /&gt;
&lt;br /&gt;
# Форма, которая может использоваться как меню или панель инструментов. Также применяется в небольших проектах, в которых нет необходимости изменения выводимого набора виджетов.&lt;br /&gt;
# Окно с композицией, которое позволяет переключаться между различными экранами (например мнемосхемой, настройками, архивированием и т.д). Каждый из этих экранов реализуется на отдельной композиции.&lt;br /&gt;
&lt;br /&gt;
Процесс создания визуализации начинается с добавления нужных окон в группу «Окна» в дереве проекта. В том случае, если используется окно с композицией, необходимо задать ему отображаемую композицию по умолчанию, перед этим добавив ее в группу «Композиции». Созданные окна нужно добавить к одному фрейму, указав их в соответствующем свойстве фрейма.&lt;br /&gt;
&lt;br /&gt;
Редактирование содержимого окна или композиции осуществляется в его графическом представлении (см. раздел [[#Редактирование графического представления узла]]).&lt;br /&gt;
&lt;br /&gt;
Более подробное описание подсистемы визуализации приведено в разделе [[#Подсистема визуализации]].&lt;br /&gt;
&lt;br /&gt;
==== Пользовательские алгоритмы ====&lt;br /&gt;
Реализовать нужные алгоритмы работы программы можно с помощью различных инструментов, которые выбираются в зависимости от сложности проектов и навыков программиста:&lt;br /&gt;
&lt;br /&gt;
# Операции в группе «Сигналы» – отдельные логические операции. В основном используются для небольших проектов, не требующих сложных методов управления;&lt;br /&gt;
# Задачи ПЛК – графическое программирование с помощью связывания между собой различных функциональных блоков. Подходит для больших проектов. Реализуется в узле «Задача ПЛК» группы «Задачи». Подробное описание приведено в разделе [[#Задача ПЛК]]'''.'''&lt;br /&gt;
# Скрипты С++ – текстовое программирование на языке высокого уровня. Подходит для больших проектов. Реализуется с помощью операций «Скрипт С++», расположенных в группе «Сигналы» или в задаче ПЛК. Описание реализации языка С++ приведено на странице [[Описание языка С++ в AgavaPLC]].&lt;br /&gt;
=== Редактирование свойств узлов ===&lt;br /&gt;
Среда разработки обладает развитыми возможностями по редактированию свойств узлов. Описание доступных типов свойств приведно в статье [[Свойства узлов в AgavaPLC/AgavaSCADA]].&lt;br /&gt;
&lt;br /&gt;
==== Редактирование свойств узлов с помощью окна «Свойства» ====&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Свойства&amp;quot;.png|мини|Рисунок 6 – Окно «Свойства» виджета «Кнопка»]]&lt;br /&gt;
Редактирование свойств всех узлов осуществляется с помощью окна «Свойства».&lt;br /&gt;
&lt;br /&gt;
В окне «Свойства» в виде таблицы отображаются все доступные свойства узла, объединенные в группы. В левой колонке отображены наименования свойств, в правой отображены их значения. Свойства, недоступные для изменения, имеют наименование серого цвета. В нижней части окна расположена область подсказки, содержащая пояснение к выделенному свойству.&lt;br /&gt;
&lt;br /&gt;
===== Редактирование свойств группы узлов =====&lt;br /&gt;
В случае, когда необходимо изменить свойства у нескольких узлов, можно воспользоваться возможностью группового редактирования свойств. Для этого нужно выделить несколько узлов в дереве конфигурации либо на графическом представлении с помощью левой кнопки мыши и нажатой кнопки «Ctrl». При этом в окне свойств будут отображены только те свойства, что имеются у всех выделенных узлов. Далее можно изменить нужное свойство, при этом после завершения редактирования измененное значение будет установлено во всех выбранных узлах.&lt;br /&gt;
&lt;br /&gt;
==== Групповое редактирование свойств узлов ====&lt;br /&gt;
При необходимости редактирования разных свойств у большого количества узлов можно воспользоваться специальным окном «Список узлов».&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Список узлов&amp;quot;.png|мини|Рисунок 7 - Окно &amp;quot;Список узлов&amp;quot;]]&lt;br /&gt;
Открытие окна выполняется с помощью вызова команды «Открыть список узлов» в контекстном меню дерева конфигурации. Открытое окно содержит все узлы, вложенные в выбранные при вызове команды.&lt;br /&gt;
&lt;br /&gt;
Окно позволяет редактировать свойства непосредственно в ячейках таблицы, без переключения на окно «Свойства». Групповое редактирование свойств узлов через окно «Свойства» также доступно.&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на списке вызывает контекстное меню, содержащее команды:&lt;br /&gt;
&lt;br /&gt;
* “Свойства”;&lt;br /&gt;
* “Экспорт в *.txt”;&lt;br /&gt;
* “Импорт из *.txt”;&lt;br /&gt;
* “Удалить узел”.&lt;br /&gt;
&lt;br /&gt;
Команда «Свойства» открывает диалоговое окно выбора отображаемых свойств.&lt;br /&gt;
&lt;br /&gt;
Команды «Экспорт», «Импорт» выполняют экспорт списка свойств узлов в текстовый файл и импорт соответственно.&lt;br /&gt;
&lt;br /&gt;
Команда «Удалить узел» производит удаление выделенного узла (узлов).&lt;br /&gt;
&lt;br /&gt;
==== Функция групповой замены источников в узлах ====&lt;br /&gt;
При разработке сложных проектов может возникнуть необходимость заменить источники сразу в большом количестве узлов. Для этой цели используется функция групповой замены источников.  Необходимо перейти в редактирование свойств типа «Список источников», которое производится в соответствующем окне (см. Рисунок 8).&lt;br /&gt;
[[Файл:AgavaPLC-Окно редактирования свойств типа «Список источников».png|мини|Рисунок 8 - Окно редактирования свойств типа «Список источников»]]&lt;br /&gt;
Затем необходимо использовать функцию групповой замены (см. Рисунок 9), выделив нужные узлы, нажав на них правой кнопкой мыши и выбрав «Групповая замена».&lt;br /&gt;
[[Файл:AgavaPLC-Окно функции «Групповая замена».png|мини|Рисунок 9 - Окно функции «Групповая замена»]]&lt;br /&gt;
&lt;br /&gt;
=== Редактирование графического представления узла ===&lt;br /&gt;
Редактирование содержимого окон, слоев, форм, композиций и других элементов, предназначенных для отображения на экране, осуществляется в окне графического представления. Открытие окна возможно с помощью команды «Открыть графическое представление» в контекстном меню дерева конфигурации или двойного нажатия левой кнопки мыши для узлов следующих типов:&lt;br /&gt;
&lt;br /&gt;
* фрейм;&lt;br /&gt;
* форма;&lt;br /&gt;
* окно с композицией;&lt;br /&gt;
* слой.&lt;br /&gt;
&lt;br /&gt;
Открытое графическое представление выбранного узла может содержать все уже размещенные на нем элементы визуализации и (или) другие узлы и позволяет добавить новые.&lt;br /&gt;
[[Файл:AgavaPLC–Открытое графическое представление окна «winMain».png|мини|Рисунок 10 – Открытое графическое представление окна «winMain»]]&lt;br /&gt;
На рисунке 10 представлено графическое представление окна «winMain», обведенное пунктирной рамкой серого цвета, обозначающей внешнюю границу открытого узла. Тип рамки пользователь может выбрать по своему усмотрению, выбор производится в окне настроек среды разработки, доступном через команду «Настройки» в меню «Параметры».&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на пустом месте в открытом графическом представлении узла вызывает контекстное меню, содержащее команды удаления и вставки виджетов из буфера обмена, а также команды добавления новых виджетов доступных типов.&lt;br /&gt;
&lt;br /&gt;
Добавление новых виджетов также может осуществлять путем их перестаскивания в рабочую область из панели виджетов.&lt;br /&gt;
&lt;br /&gt;
Графическое представление позволяет перемещать выделенные виджеты кнопками перемещения курсора на клавиатуре, а также изменять их размеры кнопками перемещения курсора при нажатой кнопке Shift.&lt;br /&gt;
&lt;br /&gt;
==== Связывание источников и виджетов ====&lt;br /&gt;
Связывание виджетов и других узлов с источниками данных необходимо для того, чтобы виджеты или другие узлы могли отображать или обрабатывать значения, хранящиеся в источниках.&lt;br /&gt;
&lt;br /&gt;
Для связи виджетов с источниками данных можно воспользоваться обычным способом связывания через окно «Свойства». К примеру, связывание размещенного на форме виджета «Текстовая метка» с регистром Modbus осуществляется добавлением регистра Modbus в свойство виджета «Источник».&lt;br /&gt;
&lt;br /&gt;
Вместе с обычным способом связывания существует и другой, более быстрый способ. Для быстрого связывания регистра с виджетом достаточно нажать на регистр в дереве конфигурации левой кнопкой мыши и перенести его на виджет в открытом графическом представлении.&lt;br /&gt;
[[Файл:AgavaPLC–Связывание узла «sourceModbusRegister0» и виджета.png|мини|Рисунок 11 – Связывание узла «sourceModbusRegister0» и виджета]]&lt;br /&gt;
При помещении курсора над виджетом последний будет заштрихован сеткой зеленого или красного цвета, а курсор изменит свой вид на стрелку с квадратиком (см. рисунок 11).&lt;br /&gt;
&lt;br /&gt;
Зеленая штриховка виджета означает отсутствие связи выделенного виджета с источником данных, в этом случае связывание будет произведено. Красная штриховка говорит об ошибках связывания виджета и сигнала/источника.&lt;br /&gt;
&lt;br /&gt;
==== Редактирование многослойных композиций ====&lt;br /&gt;
Редактирование многослойных композиций принципиально не отличается от редактирования форм, кроме одного нюанса. Так как композиция может состоять из нескольких слоев, и виджеты на слоях могут располагаться один над другим, для использования наиболее удобного способа редактирования такой композиции можно воспользоваться возможностью открытия каждого слоя в отдельном окне.&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры композиции «Composition1», состоящей из трех слоев.png|мини|Рисунок 12 – Пример структуры композиции «Composition1», состоящей из трех слоев]]&lt;br /&gt;
Для открытия графического представления слоя нужно воспользоваться командой «Открыть графическое представление» аналогично открытию графического представления формы или композиции.&lt;br /&gt;
&lt;br /&gt;
Открыв одновременно композицию и слой, при редактировании слоя можно видеть, что содержимое композиции также изменяется и наоборот, при редактировании композиции изображение слоя будет изменяться.&lt;br /&gt;
&lt;br /&gt;
Слой обладает важным свойством «Прозрачность для действий». Данное свойство позволяет регулировать доступность виджетов, расположенных на нижележащих слоях, для действий пользователя. Например, если у верхнего слоя данное свойство выключено, то виджеты, расположенные на всех нижележащих слоях, будут недоступны для взаимодействия. Если же у верхнего слоя свойство включено, то виджеты нижележащего слоя будут доступны.&lt;br /&gt;
&lt;br /&gt;
==== Использование якорей ====&lt;br /&gt;
Данная возможность доступна с версии &amp;lt;code&amp;gt;AS 1.6.32+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При работе с графическими представлениями окон и композиций, содержащих большое количество виджетов, могут быть полезны якоря - создаваемые пользователем метки на размерных линейках.&lt;br /&gt;
[[Файл:AgavaPLC-Графическое представление-якоря.png|мини|AS 1.6.32+: Графическое представление формы с установленными якорями]]&lt;br /&gt;
Якоря позволяют контролировать положение групп виджетов благодаря связанным с ними линиям привязки. Линии привязки, позволяют быстрее выстраивать группы виджетов благодяря &amp;quot;прилипанию&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Создание якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Добавить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Удаление якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по якорю на размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Удалить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Созданные якоря можно перемещать по размерной линейке с помощью мыши.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение проекта ===&lt;br /&gt;
Для сохранения проекта на диск вызовите команду  «Файл-&amp;gt;Сохранить проект» или «Файл-&amp;gt;Сохранить проект как...», если необходимо сделать копию открытого проекта и продолжить работу в ней после сохранения.&lt;br /&gt;
&lt;br /&gt;
== Проверка и отладка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Эмуляция проекта ===&lt;br /&gt;
Проверить работоспособность проекта можно, не загружая его в контроллер. Для этого существует возможность запустить среду исполнения прямо на компьютере. &lt;br /&gt;
&lt;br /&gt;
Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Установить текущий проект как проект по умолчанию. Для этого необходимо вызвать команду &amp;quot;Проект-&amp;gt;Установить проект по умолчанию...&amp;quot;  и выбрать ранее сохраненный файл конфигурации.&lt;br /&gt;
# Запустить среду исполнения. Для этого нужно вызвать команду меню &amp;quot;Проект-&amp;gt;Запуск среды исполнения&amp;quot;. После этого будет выполнен запуск в новом окне среды исполнения.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг сигналов ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно &amp;quot;Наблюдение&amp;quot;.png|мини|Рисунок 14 – Окно &amp;quot;Наблюдение&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Наблюдение%22.png]]&lt;br /&gt;
Функция мониторинга сигналов позволяет наблюдать значения, хранящиеся в узлах проекта при исполнении проекта на целевом устройстве.&lt;br /&gt;
&lt;br /&gt;
Для запуска данной функции необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить среду исполнения.&lt;br /&gt;
# Вызвать команду меню «&amp;lt;code&amp;gt;Устройство → Подключение/отключение&amp;lt;/code&amp;gt;», в появившемся окне выбрать IP-адрес и порт устройства, значения узлов которого необходимо мониторить. При необходимости просмотра значений узлов и сигналов в режиме эмуляции проекта на персональном компьютере укажите адрес 127.0.0.1. Если необходимо просматривать значения узлов проекта, выполняющегося на контроллере или панели оператора, укажите IP-адрес контроллера или панели.&lt;br /&gt;
# Нажать кнопку «Подключение».&lt;br /&gt;
&lt;br /&gt;
Поле подключения к среде исполнения нужно добавить в окно &amp;quot;Наблюдение&amp;quot; узлы, значения которых необходимо наблюдать. Такие узлы должны иметь возможность чтения или записи значений – это регистры Modbus и другие узлы типа &amp;quot;Источник&amp;quot;, сигналы. &lt;br /&gt;
&lt;br /&gt;
Для добавления узлов в окно &amp;quot;Наблюдение&amp;quot; необходимо нажать на нужном узле в дереве проекта правой кнопкой мыши и выбрать команду «&amp;lt;code&amp;gt;Добавить в окно наблюдения&amp;lt;/code&amp;gt;». Выбранные узлы будут отображаться в окне «Наблюдение» вместе со считанными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг событий ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно просмотра событий.png|мини|Рисунок 15 – Окно просмотра событий]]Мониторинг событий позволяет наблюдать за исполнением проекта, работающего в устройстве. При включении мониторинга пользователь получает информацию о возникающих нефатальных ошибках и предупреждениях, возникающих в ходе исполнения проекта со следующими признаками:&lt;br /&gt;
&lt;br /&gt;
* метка времени, соответствующая времени возникновения события;&lt;br /&gt;
* степень важности события;&lt;br /&gt;
* тип события - информационное или события активирования, деактивирования и квитирования тревог;&lt;br /&gt;
* имя узла, сформировавшего событие.&lt;br /&gt;
* текст события.&lt;br /&gt;
&lt;br /&gt;
==== Использование мониторинга ====&lt;br /&gt;
Для старта мониторинга необходимо подключиться к нужному устройству способом, рассмотренным в разделе [[#Мониторинг сигналов]], а затем вызвать команду «&amp;lt;code&amp;gt;Устройство → Просмотр событий&amp;lt;/code&amp;gt;». В открывшемся окне будут выводиться все события, регистрируемые устройством. &lt;br /&gt;
&lt;br /&gt;
С помощью выпадающего списка в левом верхнем углу окна можно выбрать минимальный уровень выводимых событий.&lt;br /&gt;
&lt;br /&gt;
==== Фильтрация событий ====&lt;br /&gt;
''Функция доступна начиная с версии &amp;lt;code&amp;gt;AgavaSCADA/AgavaPLC 1.2.56+, 1.5.25+&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
В нижнем левом углу окна расположена область настройки фильтра событий, позволяющая фильтровать выводимые события по имени узла и тексту событий. При использовании фильтра возможно задание фильтра в виде:&lt;br /&gt;
&lt;br /&gt;
* простой строки, при этом в список попадают события, содержащие полное совпадение заданной строки; при задании строки возможно в(ы)ключение признака учета регистра символов в строке;&lt;br /&gt;
* регулярного выражения, при этом в список попадают события, удовлетворяющие введенное выражение. Правила составления регулярных выражений описаны на странице [[Использование регулярных выражений]].&lt;br /&gt;
&lt;br /&gt;
=== Отладка в задаче ПЛК ===&lt;br /&gt;
''Данный раздел актуален для версии &amp;lt;code&amp;gt;AS 1.2.61&amp;lt;/code&amp;gt; и старее. В версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt; используется [[Универсальная среда разработки Agava#Отладка проекта|современный пошаговый отладчик]].''&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК (см. раздел [[#Задача ПЛК]]) позволяет проводить тестирование проектов с помощью режима симулятора (на компьютере, без использования контроллера) или онлайн отладки (на контроллере).&lt;br /&gt;
&lt;br /&gt;
==== Управление отладкой ====&lt;br /&gt;
Управление режимом симуляции и онлайн отладкой осуществляется с помощью панели инструментов задачи ПЛК (см. рисунок 16).&lt;br /&gt;
&lt;br /&gt;
Панель инструментов содержит следующие элементы:&lt;br /&gt;
&lt;br /&gt;
* Кнопка «Запустить симуляцию».&lt;br /&gt;
* Кнопка «Сделать шаг на один цикл».&lt;br /&gt;
* Кнопка «Приостановить симуляцию» - ставит выполнение задачи на паузу.&lt;br /&gt;
* Кнопка «Остановить симуляцию» - сбрасывает состояние всех блоков к их состоянию по умолчанию.&lt;br /&gt;
* Список выбора периода выполнения задачи.&lt;br /&gt;
* Кнопка «Показать окно «Наблюдение».&lt;br /&gt;
&lt;br /&gt;
==== Режим симулятора ====&lt;br /&gt;
Режим симулятора позволяет провести тестирование работы алгоритмов проекта на компьютере. С помощью симуляции можно выявить ошибки в работе алгоритмов проекта до его загрузки в контроллер.&lt;br /&gt;
&lt;br /&gt;
Управление симуляцией осуществляется через команды на панели инструментов задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Для перехода в режим симуляции нажмите кнопку «Режим симулятора» на панели управления задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC-Панель инструментов задачи ПЛК.png|мини|Рисунок 16 - Панель инструментов задачи ПЛК]]&lt;br /&gt;
После активации режима симуляции, для изменения значения входа дважды щелкните на нем левой кнопкой мыши и выберите нужный тип и значение. Текущие значения всех блоков, в соответствии с работой программы, будут отображаться в реальном времени.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме симулятора.png|мини|Рисунок 17 – Вид блоков задачи в режиме симулятора]]&lt;br /&gt;
Для выхода из режима симуляции повторно нажмите кнопку «Режим симуляции» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
==== Онлайн отладка ====&lt;br /&gt;
Режим онлайн отладки позволяет провести тестирование проекта, загруженного и исполняемого в контроллере. Для перехода в режим онлайн отладки загрузите конфигурацию в контроллер, подключитесь к нему, после чего нажмите кнопку «Онлайн отладка» на панели инструментов задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме онлайн отладки.png|мини|Рисунок 18 – Вид блоков задачи в режиме онлайн отладки]]&lt;br /&gt;
На рисунке 18 изображен вид задачи ПЛК в режиме онлайн отладки проекта, запущенного на МПР-60 с установленными субмодулями DI (входы) и R (выходы).&lt;br /&gt;
&lt;br /&gt;
Для онлайн отладки на панели инструментов недоступны кнопка «Приостановить симуляцию» и список выбора периода.&lt;br /&gt;
&lt;br /&gt;
== Компиляция проекта ==&lt;br /&gt;
Перед загрузкой проекта в контроллер или запуском эмуляции проекта необходимо откомпилировать проект и получить файл конфигурации, предназначенный для исполнения средой исполнения, установленной в контроллере или на персональном компьютере (в случае разработки системы диспетчеризации). Для этого необходимо вызвать команду меню &amp;quot;Проект-&amp;gt;Сохранить конфигурацию&amp;quot;, выбрать папку проекта и нажать кнопку &amp;quot;Сохранить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Проверка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Ошибки».png|мини|Рисунок 19 – Окно «Ошибки»]]&lt;br /&gt;
Перед сохранением проекта желательно выполнить его проверку на наличие ошибок с помощью команды «Проект-&amp;gt;Проверить проект». После проверки обнаруженные ошибки будут отображены в окне «Ошибки».&lt;br /&gt;
&lt;br /&gt;
Если отображение окна «Ошибки» выключено, его можно включить командой «Вид-&amp;gt;Показать окно ошибок».&lt;br /&gt;
&lt;br /&gt;
Для облегчения исправления обнаруженных ошибок окно поддерживает выполнение некоторых команд над обнаруженными ошибками, вызывать которые можно из контекстного меню, отображаемого щелчком правой кнопки мыши на строке c ошибкой в окне. Контекстное меню позволяет вызывать команду «Показать узел в дереве конфигурации», выполняющую соответствующее действие.&lt;br /&gt;
&lt;br /&gt;
Также щелчок левой кнопкой мыши на строке с ошибкой открывает окно «Свойства» и дает возможность изменить в нем все свойства узла, содержащего ошибку.&lt;br /&gt;
&lt;br /&gt;
==== Установка пароля на файл конфигурации ====&lt;br /&gt;
[[Файл:AgavaPLC–Установка пароля.png|мини|Рисунок 13 – Установка пароля]]&lt;br /&gt;
Файл конфигурации, загружаемый в контроллер или панель оператора, можно защитить паролем, чтобы предотвратить его несанкционированное изменение.&lt;br /&gt;
&lt;br /&gt;
Для установки пароля на файл конфигурации необходимо выбрать в дереве проекта узел «Конфигурация» и отредактировать его свойство «Пароль». Допускается использование любых цифр, букв и спецсимволов.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем при открытии файла конфигурации в среде разработки будет появляться окно с запросом пароля.&lt;br /&gt;
&lt;br /&gt;
== Загрузка проекта в устройство ==&lt;br /&gt;
Загрузка проекта в целевое устройство может быть осуществлена несколькими способами:&lt;br /&gt;
&lt;br /&gt;
* загрузка из среды разработки;&lt;br /&gt;
* загрузка с помощью USB-Flash накопителя (для панелей оператора);&lt;br /&gt;
* загрузка через браузер (для МПР-60).&lt;br /&gt;
&lt;br /&gt;
=== Загрузка из среды разработки ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Загрузка проекта в устройство» после подключения к контроллеру.png|мини|Рисунок 20 – Окно «Загрузка проекта в устройство» после подключения к контроллеру]]&lt;br /&gt;
Для загрузки проекта из среды разработки необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Создайте файл конфигурации.&lt;br /&gt;
# Выполните подключение целевого устройства к ПК по сети Ethernet.&lt;br /&gt;
# После подключения вызовите в среде разработки команду «Проект-&amp;gt;Загрузка проекта в устройство».&lt;br /&gt;
# В открывшемся окне будет отображен список файлов проекта, доступных для загрузки в целевое устройство.&lt;br /&gt;
# Выберите необходимые файлы и нажмите кнопку «Загрузить». После нажатия кнопки начнется процесс загрузки файлов, при этом в нижней части окна будет меняться состояние полосы прогресса, а также для каждого файла в таблице будет отображен результат загрузки.&lt;br /&gt;
# После окончания загрузки среда исполнения в целевом устройстве будет перезапущена и загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через USB-Flash (для ПО-40 и ПО-50) ===&lt;br /&gt;
Для загрузки проекта в устройство с помощью USB-Flash накопителя необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Подготовьте USB-Flash накопитель, предварительно отформатировав его в файловую систему FAT32.&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив в корень USB-Flash накопителя.&lt;br /&gt;
# Перейдите в системную утилиту, перезагрузив панель оператора, при загрузке во время однократного звукового сигнала нажмите на экран и удерживайте до повторного звукового сигнала. Введите пароль: 111111.&lt;br /&gt;
# Перейдите на вкладку «Обновление», затем подключите USB-Flash накопитель через переходник USB-OTG, выберите из списка загрузочный архив, нажать кнопку «Обновить». Дождитесь сообщения «Обновление успешно» и нажмите кнопку «ОК».&lt;br /&gt;
# Перейдите на вкладку «Перезапуск» и нажмите кнопку «Перезапуск».&lt;br /&gt;
После перезагрузки панели загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через браузер (для МПР-60) ===&lt;br /&gt;
Для загрузки проекта через браузер необходимо произвести следующие действия в указанном порядке.&lt;br /&gt;
&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив.&lt;br /&gt;
# Откройте системную утилиту, введя IP-адрес контроллера в адресную строку браузера.&lt;br /&gt;
# Перейдите на вкладку «Загрузка ПО».  Рисунок 71 - Вкладка системной утилиты «Загрузка ПО»&lt;br /&gt;
# Выберите на компьютере архив с проектом, который необходимо загрузить в контроллер.&lt;br /&gt;
# Нажмите кнопку «Загрузить».&lt;br /&gt;
# Дождитесь окончания загрузки файла и обновления проекта.&lt;br /&gt;
&lt;br /&gt;
== Отладка проекта ==&lt;br /&gt;
''Данный функционал доступен в версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;. Для версий &amp;lt;code&amp;gt;AS 1.2&amp;lt;/code&amp;gt; используйте мониторинг, [[Универсальная среда разработки Agava#Отладка в задаче ПЛК|отладку в задачах ПЛК]].''&lt;br /&gt;
&lt;br /&gt;
=== Локальная отладка ===&lt;br /&gt;
&lt;br /&gt;
=== Удаленная отладка ===&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3469</id>
		<title>Универсальная среда разработки Agava</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3469"/>
		<updated>2026-03-27T09:46:26Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Редактирование существующего проекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Универсальная среда разработки предназначена для создания и редактирования программного обеспечения для панелей оператора АГАВА ПО, многоканальных программируемых реле АГАВА МПР-60 и систем диспетчеризации на базе SCADA-системы AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Универсальная среда разработки Agava имеет удобный и эргономичный пользовательский интерфейс со всеми инструментами, необходимыми для создания эффективных проектов-приложений, предназначенных для исполнения на ПК, панелях оператора или персональных компьютерах.&lt;br /&gt;
&lt;br /&gt;
Среда разработки совмещает редакторы текста, редакторы визуальных представлений объектов, компоновщики структуры, средства связывания объектов и других частей проекта, анализаторы проекта в одном приложении и дает пользователю возможность ведения эффективной разработки проектов-приложений от начала и до завершения в одной программе, без использования разнородных приложений-утилит и необходимости переключения между ними.&lt;br /&gt;
&lt;br /&gt;
=== Версии программного обеспечения ===&lt;br /&gt;
{{Внимание|Текст=При использовании среды разработки совместно с панелями оператора АГАВА ПО или многоканальными программируемыми реле АГАВА МПР-60 необходимо использовать соответствующую версию среды разработки|Тип=Восклицание синий.png}}&lt;br /&gt;
Для определения подходящей версии среды разработки необходимо определить версию среды исполнения, установленной в панели оператора или реле. Тип и версия среды исполнения указаны в системной утилите прибора. Например, &amp;quot;AgavaPLC 1.1&amp;quot;, &amp;quot;AgavaPLC 1.2&amp;quot;  и т.д. Для использования со средой исполнения AgavaPLC 1.1 необходимо использовать среду разработки версии 1.1, для среды исполнения AgavaPLC 1.2 необходима среда разработки версии 1.2 и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные статьи и документы ===&lt;br /&gt;
*[[Узлы проекта AgavaSCADA/AgavaPLC|Описание узлов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Свойства узлов в AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Транспорты AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание языка С++ в AgavaPLC|Описание языка С++ в AgavaSCADA/AgavaPLC]].&amp;lt;!-- Комментарий --&amp;gt;.&lt;br /&gt;
*[[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Рекомендации по разработке приложений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
Полный перечень всех документов, связанных с разработкой приложений на AgavaSCADA/AgavaPLC, приведен на странице [[:Категория:AgavaSCADA/AgavaPLC|категории AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Разработка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Создание нового проекта ===&lt;br /&gt;
Создание нового проекта в среде разработки осуществляется с помощью команды «Создать проект…» в меню «Файл». После вызова данной команды откроется диалоговое окно создания нового проекта (см. Рисунок 1).&lt;br /&gt;
[[Файл:AgavaPLC-Создание проекта.png|мини|Рисунок 1 - Окно &amp;quot;Создание нового проекта&amp;quot;]]&lt;br /&gt;
Для создания проекта необходимо в списке типов проектов выбрать необходимый, ввести имя проекта и путь для его сохранения, после чего нажать кнопку «Создать проект».&lt;br /&gt;
&lt;br /&gt;
Доступны несколько типов проектов:&lt;br /&gt;
&lt;br /&gt;
* «Пустой проект» – пустой проект, не содержащий никаких узлов. Данный тип можно использовать для создания произвольного проекта &amp;quot;с нуля&amp;quot;.&lt;br /&gt;
* «Локальный проект» – предварительно настроенный проект, содержащий необходимые подсистемы и предназначенный для реализации простой системы для одного устройства, при выборе данного типа пользователь имеет возможность выбрать нужные ему подсистемы и получить полностью рабочий проект в минимальной конфигурации.&lt;br /&gt;
* «Проект АГАВА ПО-40» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-40.&lt;br /&gt;
* «Проект АГАВА ПО-50» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-50.&lt;br /&gt;
* «Проект АГАВА МПР-60» - проект, предназначенный для исполнения на контроллере АГАВА МПР-60.&lt;br /&gt;
* «Проект АГАВА ПЛК-70.А» - проект, предназначенный для исполнения на контроллере АГАВА ПЛК-70.А.&lt;br /&gt;
&lt;br /&gt;
=== Редактирование существующего проекта ===&lt;br /&gt;
Редактирование существующего проекта начинается с открытия файла проекта путем вызова команды «Открыть…» в меню «Файл». После загрузки файла в основном окне среды разработки будут отображены свойства и параметры проекта (см. Рисунок 2).&lt;br /&gt;
[[Файл:AgavaPLC-Основное окно среды разработки.png|мини|Рисунок 2 – Основное окно среды разработки AgavaPLC с загруженным проектом]]&lt;br /&gt;
По умолчанию основное окно среды разработки содержит перечисленные ниже части:&lt;br /&gt;
&lt;br /&gt;
# Строка заголовка приложения, панель меню и панель инструментов.&lt;br /&gt;
# Окно дерева проекта. Предоставляет доступ ко всей структуре проекта (см. раздел [[#Описание узлов]]).&lt;br /&gt;
# Окно свойств (см. раздел [[#Редактирование свойств узлов]] ).&lt;br /&gt;
# Область для отображения содержимого, например графического представления окна, текста программы или задачи ПЛК.&lt;br /&gt;
# Область вспомогательных окон:&lt;br /&gt;
## Окно &amp;quot;Сообщения&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Ошибки&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Точки останова&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Ресурсы&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Глобальные переменные&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Выражения&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Стек вызовов&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Наблюдение&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Локальные переменные&amp;quot;.&lt;br /&gt;
## Окно &amp;quot;Поиск&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
После открытия проекта можно приступить к его редактированию.&lt;br /&gt;
&lt;br /&gt;
По завершению всех операций по редактированию необходимо выполнить проверку проекта на корректность с помощью команды «Проверить проект», расположенной в меню «Проект» (см. 6.1). &lt;br /&gt;
&lt;br /&gt;
=== Структура и состав проекта ===&lt;br /&gt;
Типичный проект содержит следующие части:&lt;br /&gt;
&lt;br /&gt;
* станция – важнейший объект, управляющий работой собственных подсистем и осуществляющий обмен данными с другими станциями;&lt;br /&gt;
* транспортная подсистема, выполняющая сбор данных с УСО;&lt;br /&gt;
* подсистема визуализации, обеспечивающая отображение информации в различных видах.&lt;br /&gt;
&lt;br /&gt;
Проект также может содержать следующие части:&lt;br /&gt;
&lt;br /&gt;
* подсистема архивирования, сохраняющая данные в БД для последующего извлечения и анализа;&lt;br /&gt;
* подсистема проверки прав пользователей, предназначенная для контроля доступа пользователя к объектам в режиме исполнения;&lt;br /&gt;
* подсистема тревог, предназначенная для оповещения пользователя об обнаруженных нарушениях;&lt;br /&gt;
* подсистема журналирования, выполняющая архивирование зарегистрированных событий в БД для последующего извлечения и анализа.&lt;br /&gt;
&lt;br /&gt;
Проект имеет древовидную структуру, вследствие чего все узлы связаны друг с другом. Узлы нижних уровней подчиняются узлам верхних уровней. К примеру, станции подчинены все подсистемы, а каждой подсистеме подчинены все узлы, которыми она управляет.&lt;br /&gt;
&lt;br /&gt;
Описание всех частей проекта и их узлов приведено в разделе 4.&lt;br /&gt;
&lt;br /&gt;
=== Разработка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC-Добавление узла в проект.png|мини|Рисунок 3 – Добавление узла в проект AgavaPLC]]&lt;br /&gt;
Перед началом разработки проекта рекомендуется проанализировать поставленную задачи и определить подсистемы, необходимые для её реализации. Взаимодействие с подсистемами осуществляется через дерево проекта (см. Рисунок 2), в которое добавляются нужные узлы. Для добавления нового узла, необходимо нажать правой кнопкой мыши на узел верхнего уровня, которому он подчинён, и выбрать в контекстном меню команду «Добавить узел».&lt;br /&gt;
&lt;br /&gt;
Основные части типовой программы и способы их реализации приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие с внешними устройствами ====&lt;br /&gt;
Реализуется через подсистему «Транспорты» в окне дерева проекта. Необходимо добавить в нее нужные протоколы, в зависимости от имеющейся конфигурации контроллера.&lt;br /&gt;
[[Файл:AgavaPLC-Транспорты.png|мини|Рисунок 4 - Транспорты в дереве проекта AgavaPLC]]&lt;br /&gt;
# Транспорт для обмена с субмодулями контроллера (для контроллеров с корзиной субмодулей). В качестве порта транспорта необходимо указать “/dev/ttyS0”. В проекте для МПР-60 присутствует по-умолчанию.&lt;br /&gt;
# Транспорт последовательный (для управления по RS-232, RS-485 и т.д.).&lt;br /&gt;
# Транспорт TCP/IP (для управления по Ethernet).&lt;br /&gt;
&lt;br /&gt;
К транспортам присоединяются либо регистры Modbus, либо субмодули. Для регистра задается адрес устройства, номер регистра, функция чтения/записи и другие параметры, при необходимости. Для субмодуля указывается слот, в котором он установлен, и тип аналоговых входов/выходов. &lt;br /&gt;
&lt;br /&gt;
==== Визуализация данных ====&lt;br /&gt;
Визуализация данных технологических процессов реализуется с помощью элементов подсистемы «Визуализация».&lt;br /&gt;
&lt;br /&gt;
Система визуализации недоступна в проектах для  контроллеров МПР.&lt;br /&gt;
[[Файл:AgavaPLC-Пример визуализации.png|мини|Рисунок 5 - Пример визуализации]]&lt;br /&gt;
Визуализация содержит одно или несколько окон, описанных ниже.&lt;br /&gt;
&lt;br /&gt;
# Форма, которая может использоваться как меню или панель инструментов. Также применяется в небольших проектах, в которых нет необходимости изменения выводимого набора виджетов.&lt;br /&gt;
# Окно с композицией, которое позволяет переключаться между различными экранами (например мнемосхемой, настройками, архивированием и т.д). Каждый из этих экранов реализуется на отдельной композиции.&lt;br /&gt;
&lt;br /&gt;
Процесс создания визуализации начинается с добавления нужных окон в группу «Окна» в дереве проекта. В том случае, если используется окно с композицией, необходимо задать ему отображаемую композицию по умолчанию, перед этим добавив ее в группу «Композиции». Созданные окна нужно добавить к одному фрейму, указав их в соответствующем свойстве фрейма.&lt;br /&gt;
&lt;br /&gt;
Редактирование содержимого окна или композиции осуществляется в его графическом представлении (см. раздел [[#Редактирование графического представления узла]]).&lt;br /&gt;
&lt;br /&gt;
Более подробное описание подсистемы визуализации приведено в разделе [[#Подсистема визуализации]].&lt;br /&gt;
&lt;br /&gt;
==== Пользовательские алгоритмы ====&lt;br /&gt;
Реализовать нужные алгоритмы работы программы можно с помощью различных инструментов, которые выбираются в зависимости от сложности проектов и навыков программиста:&lt;br /&gt;
&lt;br /&gt;
# Операции в группе «Сигналы» – отдельные логические операции. В основном используются для небольших проектов, не требующих сложных методов управления;&lt;br /&gt;
# Задачи ПЛК – графическое программирование с помощью связывания между собой различных функциональных блоков. Подходит для больших проектов. Реализуется в узле «Задача ПЛК» группы «Задачи». Подробное описание приведено в разделе [[#Задача ПЛК]]'''.'''&lt;br /&gt;
# Скрипты С++ – текстовое программирование на языке высокого уровня. Подходит для больших проектов. Реализуется с помощью операций «Скрипт С++», расположенных в группе «Сигналы» или в задаче ПЛК. Описание реализации языка С++ приведено на странице [[Описание языка С++ в AgavaPLC]].&lt;br /&gt;
=== Редактирование свойств узлов ===&lt;br /&gt;
Среда разработки обладает развитыми возможностями по редактированию свойств узлов. Описание доступных типов свойств приведно в статье [[Свойства узлов в AgavaPLC/AgavaSCADA]].&lt;br /&gt;
&lt;br /&gt;
==== Редактирование свойств узлов с помощью окна «Свойства» ====&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Свойства&amp;quot;.png|мини|Рисунок 6 – Окно «Свойства» виджета «Кнопка»]]&lt;br /&gt;
Редактирование свойств всех узлов осуществляется с помощью окна «Свойства».&lt;br /&gt;
&lt;br /&gt;
В окне «Свойства» в виде таблицы отображаются все доступные свойства узла, объединенные в группы. В левой колонке отображены наименования свойств, в правой отображены их значения. Свойства, недоступные для изменения, имеют наименование серого цвета. В нижней части окна расположена область подсказки, содержащая пояснение к выделенному свойству.&lt;br /&gt;
&lt;br /&gt;
===== Редактирование свойств группы узлов =====&lt;br /&gt;
В случае, когда необходимо изменить свойства у нескольких узлов, можно воспользоваться возможностью группового редактирования свойств. Для этого нужно выделить несколько узлов в дереве конфигурации либо на графическом представлении с помощью левой кнопки мыши и нажатой кнопки «Ctrl». При этом в окне свойств будут отображены только те свойства, что имеются у всех выделенных узлов. Далее можно изменить нужное свойство, при этом после завершения редактирования измененное значение будет установлено во всех выбранных узлах.&lt;br /&gt;
&lt;br /&gt;
==== Групповое редактирование свойств узлов ====&lt;br /&gt;
При необходимости редактирования разных свойств у большого количества узлов можно воспользоваться специальным окном «Список узлов».&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Список узлов&amp;quot;.png|мини|Рисунок 7 - Окно &amp;quot;Список узлов&amp;quot;]]&lt;br /&gt;
Открытие окна выполняется с помощью вызова команды «Открыть список узлов» в контекстном меню дерева конфигурации. Открытое окно содержит все узлы, вложенные в выбранные при вызове команды.&lt;br /&gt;
&lt;br /&gt;
Окно позволяет редактировать свойства непосредственно в ячейках таблицы, без переключения на окно «Свойства». Групповое редактирование свойств узлов через окно «Свойства» также доступно.&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на списке вызывает контекстное меню, содержащее команды:&lt;br /&gt;
&lt;br /&gt;
* “Свойства”;&lt;br /&gt;
* “Экспорт в *.txt”;&lt;br /&gt;
* “Импорт из *.txt”;&lt;br /&gt;
* “Удалить узел”.&lt;br /&gt;
&lt;br /&gt;
Команда «Свойства» открывает диалоговое окно выбора отображаемых свойств.&lt;br /&gt;
&lt;br /&gt;
Команды «Экспорт», «Импорт» выполняют экспорт списка свойств узлов в текстовый файл и импорт соответственно.&lt;br /&gt;
&lt;br /&gt;
Команда «Удалить узел» производит удаление выделенного узла (узлов).&lt;br /&gt;
&lt;br /&gt;
==== Функция групповой замены источников в узлах ====&lt;br /&gt;
При разработке сложных проектов может возникнуть необходимость заменить источники сразу в большом количестве узлов. Для этой цели используется функция групповой замены источников.  Необходимо перейти в редактирование свойств типа «Список источников», которое производится в соответствующем окне (см. Рисунок 8).&lt;br /&gt;
[[Файл:AgavaPLC-Окно редактирования свойств типа «Список источников».png|мини|Рисунок 8 - Окно редактирования свойств типа «Список источников»]]&lt;br /&gt;
Затем необходимо использовать функцию групповой замены (см. Рисунок 9), выделив нужные узлы, нажав на них правой кнопкой мыши и выбрав «Групповая замена».&lt;br /&gt;
[[Файл:AgavaPLC-Окно функции «Групповая замена».png|мини|Рисунок 9 - Окно функции «Групповая замена»]]&lt;br /&gt;
&lt;br /&gt;
=== Редактирование графического представления узла ===&lt;br /&gt;
Редактирование содержимого окон, слоев, форм, композиций и других элементов, предназначенных для отображения на экране, осуществляется в окне графического представления. Открытие окна возможно с помощью команды «Открыть графическое представление» в контекстном меню дерева конфигурации или двойного нажатия левой кнопки мыши для узлов следующих типов:&lt;br /&gt;
&lt;br /&gt;
* фрейм;&lt;br /&gt;
* форма;&lt;br /&gt;
* окно с композицией;&lt;br /&gt;
* слой.&lt;br /&gt;
&lt;br /&gt;
Открытое графическое представление выбранного узла может содержать все уже размещенные на нем элементы визуализации и (или) другие узлы и позволяет добавить новые.&lt;br /&gt;
[[Файл:AgavaPLC–Открытое графическое представление окна «winMain».png|мини|Рисунок 10 – Открытое графическое представление окна «winMain»]]&lt;br /&gt;
На рисунке 10 представлено графическое представление окна «winMain», обведенное пунктирной рамкой серого цвета, обозначающей внешнюю границу открытого узла. Тип рамки пользователь может выбрать по своему усмотрению, выбор производится в окне настроек среды разработки, доступном через команду «Настройки» в меню «Параметры».&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на пустом месте в открытом графическом представлении узла вызывает контекстное меню, содержащее команды удаления и вставки виджетов из буфера обмена, а также команды добавления новых виджетов доступных типов.&lt;br /&gt;
&lt;br /&gt;
Добавление новых виджетов также может осуществлять путем их перестаскивания в рабочую область из панели виджетов.&lt;br /&gt;
&lt;br /&gt;
Графическое представление позволяет перемещать выделенные виджеты кнопками перемещения курсора на клавиатуре, а также изменять их размеры кнопками перемещения курсора при нажатой кнопке Shift.&lt;br /&gt;
&lt;br /&gt;
==== Связывание источников и виджетов ====&lt;br /&gt;
Связывание виджетов и других узлов с источниками данных необходимо для того, чтобы виджеты или другие узлы могли отображать или обрабатывать значения, хранящиеся в источниках.&lt;br /&gt;
&lt;br /&gt;
Для связи виджетов с источниками данных можно воспользоваться обычным способом связывания через окно «Свойства». К примеру, связывание размещенного на форме виджета «Текстовая метка» с регистром Modbus осуществляется добавлением регистра Modbus в свойство виджета «Источник».&lt;br /&gt;
&lt;br /&gt;
Вместе с обычным способом связывания существует и другой, более быстрый способ. Для быстрого связывания регистра с виджетом достаточно нажать на регистр в дереве конфигурации левой кнопкой мыши и перенести его на виджет в открытом графическом представлении.&lt;br /&gt;
[[Файл:AgavaPLC–Связывание узла «sourceModbusRegister0» и виджета.png|мини|Рисунок 11 – Связывание узла «sourceModbusRegister0» и виджета]]&lt;br /&gt;
При помещении курсора над виджетом последний будет заштрихован сеткой зеленого или красного цвета, а курсор изменит свой вид на стрелку с квадратиком (см. рисунок 11).&lt;br /&gt;
&lt;br /&gt;
Зеленая штриховка виджета означает отсутствие связи выделенного виджета с источником данных, в этом случае связывание будет произведено. Красная штриховка говорит об ошибках связывания виджета и сигнала/источника.&lt;br /&gt;
&lt;br /&gt;
==== Редактирование многослойных композиций ====&lt;br /&gt;
Редактирование многослойных композиций принципиально не отличается от редактирования форм, кроме одного нюанса. Так как композиция может состоять из нескольких слоев, и виджеты на слоях могут располагаться один над другим, для использования наиболее удобного способа редактирования такой композиции можно воспользоваться возможностью открытия каждого слоя в отдельном окне.&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры композиции «Composition1», состоящей из трех слоев.png|мини|Рисунок 12 – Пример структуры композиции «Composition1», состоящей из трех слоев]]&lt;br /&gt;
Для открытия графического представления слоя нужно воспользоваться командой «Открыть графическое представление» аналогично открытию графического представления формы или композиции.&lt;br /&gt;
&lt;br /&gt;
Открыв одновременно композицию и слой, при редактировании слоя можно видеть, что содержимое композиции также изменяется и наоборот, при редактировании композиции изображение слоя будет изменяться.&lt;br /&gt;
&lt;br /&gt;
Слой обладает важным свойством «Прозрачность для действий». Данное свойство позволяет регулировать доступность виджетов, расположенных на нижележащих слоях, для действий пользователя. Например, если у верхнего слоя данное свойство выключено, то виджеты, расположенные на всех нижележащих слоях, будут недоступны для взаимодействия. Если же у верхнего слоя свойство включено, то виджеты нижележащего слоя будут доступны.&lt;br /&gt;
&lt;br /&gt;
==== Использование якорей ====&lt;br /&gt;
Данная возможность доступна с версии &amp;lt;code&amp;gt;AS 1.6.32+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При работе с графическими представлениями окон и композиций, содержащих большое количество виджетов, могут быть полезны якоря - создаваемые пользователем метки на размерных линейках.&lt;br /&gt;
[[Файл:AgavaPLC-Графическое представление-якоря.png|мини|AS 1.6.32+: Графическое представление формы с установленными якорями]]&lt;br /&gt;
Якоря позволяют контролировать положение групп виджетов благодаря связанным с ними линиям привязки. Линии привязки, позволяют быстрее выстраивать группы виджетов благодяря &amp;quot;прилипанию&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Создание якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Добавить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Удаление якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по якорю на размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Удалить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Созданные якоря можно перемещать по размерной линейке с помощью мыши.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение проекта ===&lt;br /&gt;
Для сохранения проекта на диск вызовите команду  «Файл-&amp;gt;Сохранить проект» или «Файл-&amp;gt;Сохранить проект как...», если необходимо сделать копию открытого проекта и продолжить работу в ней после сохранения.&lt;br /&gt;
&lt;br /&gt;
== Проверка и отладка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Эмуляция проекта ===&lt;br /&gt;
Проверить работоспособность проекта можно, не загружая его в контроллер. Для этого существует возможность запустить среду исполнения прямо на компьютере. &lt;br /&gt;
&lt;br /&gt;
Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Установить текущий проект как проект по умолчанию. Для этого необходимо вызвать команду &amp;quot;Проект-&amp;gt;Установить проект по умолчанию...&amp;quot;  и выбрать ранее сохраненный файл конфигурации.&lt;br /&gt;
# Запустить среду исполнения. Для этого нужно вызвать команду меню &amp;quot;Проект-&amp;gt;Запуск среды исполнения&amp;quot;. После этого будет выполнен запуск в новом окне среды исполнения.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг сигналов ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно &amp;quot;Наблюдение&amp;quot;.png|мини|Рисунок 14 – Окно &amp;quot;Наблюдение&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Наблюдение%22.png]]&lt;br /&gt;
Функция мониторинга сигналов позволяет наблюдать значения, хранящиеся в узлах проекта при исполнении проекта на целевом устройстве.&lt;br /&gt;
&lt;br /&gt;
Для запуска данной функции необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить среду исполнения.&lt;br /&gt;
# Вызвать команду меню «&amp;lt;code&amp;gt;Устройство → Подключение/отключение&amp;lt;/code&amp;gt;», в появившемся окне выбрать IP-адрес и порт устройства, значения узлов которого необходимо мониторить. При необходимости просмотра значений узлов и сигналов в режиме эмуляции проекта на персональном компьютере укажите адрес 127.0.0.1. Если необходимо просматривать значения узлов проекта, выполняющегося на контроллере или панели оператора, укажите IP-адрес контроллера или панели.&lt;br /&gt;
# Нажать кнопку «Подключение».&lt;br /&gt;
&lt;br /&gt;
Поле подключения к среде исполнения нужно добавить в окно &amp;quot;Наблюдение&amp;quot; узлы, значения которых необходимо наблюдать. Такие узлы должны иметь возможность чтения или записи значений – это регистры Modbus и другие узлы типа &amp;quot;Источник&amp;quot;, сигналы. &lt;br /&gt;
&lt;br /&gt;
Для добавления узлов в окно &amp;quot;Наблюдение&amp;quot; необходимо нажать на нужном узле в дереве проекта правой кнопкой мыши и выбрать команду «&amp;lt;code&amp;gt;Добавить в окно наблюдения&amp;lt;/code&amp;gt;». Выбранные узлы будут отображаться в окне «Наблюдение» вместе со считанными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг событий ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно просмотра событий.png|мини|Рисунок 15 – Окно просмотра событий]]Мониторинг событий позволяет наблюдать за исполнением проекта, работающего в устройстве. При включении мониторинга пользователь получает информацию о возникающих нефатальных ошибках и предупреждениях, возникающих в ходе исполнения проекта со следующими признаками:&lt;br /&gt;
&lt;br /&gt;
* метка времени, соответствующая времени возникновения события;&lt;br /&gt;
* степень важности события;&lt;br /&gt;
* тип события - информационное или события активирования, деактивирования и квитирования тревог;&lt;br /&gt;
* имя узла, сформировавшего событие.&lt;br /&gt;
* текст события.&lt;br /&gt;
&lt;br /&gt;
==== Использование мониторинга ====&lt;br /&gt;
Для старта мониторинга необходимо подключиться к нужному устройству способом, рассмотренным в разделе [[#Мониторинг сигналов]], а затем вызвать команду «&amp;lt;code&amp;gt;Устройство → Просмотр событий&amp;lt;/code&amp;gt;». В открывшемся окне будут выводиться все события, регистрируемые устройством. &lt;br /&gt;
&lt;br /&gt;
С помощью выпадающего списка в левом верхнем углу окна можно выбрать минимальный уровень выводимых событий.&lt;br /&gt;
&lt;br /&gt;
==== Фильтрация событий ====&lt;br /&gt;
''Функция доступна начиная с версии &amp;lt;code&amp;gt;AgavaSCADA/AgavaPLC 1.2.56+, 1.5.25+&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
В нижнем левом углу окна расположена область настройки фильтра событий, позволяющая фильтровать выводимые события по имени узла и тексту событий. При использовании фильтра возможно задание фильтра в виде:&lt;br /&gt;
&lt;br /&gt;
* простой строки, при этом в список попадают события, содержащие полное совпадение заданной строки; при задании строки возможно в(ы)ключение признака учета регистра символов в строке;&lt;br /&gt;
* регулярного выражения, при этом в список попадают события, удовлетворяющие введенное выражение. Правила составления регулярных выражений описаны на странице [[Использование регулярных выражений]].&lt;br /&gt;
&lt;br /&gt;
=== Отладка в задаче ПЛК ===&lt;br /&gt;
''Данный раздел актуален для версии &amp;lt;code&amp;gt;AS 1.2.61&amp;lt;/code&amp;gt; и старее. В версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt; используется [[Универсальная среда разработки Agava#Отладка проекта|современный пошаговый отладчик]].''&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК (см. раздел [[#Задача ПЛК]]) позволяет проводить тестирование проектов с помощью режима симулятора (на компьютере, без использования контроллера) или онлайн отладки (на контроллере).&lt;br /&gt;
&lt;br /&gt;
==== Управление отладкой ====&lt;br /&gt;
Управление режимом симуляции и онлайн отладкой осуществляется с помощью панели инструментов задачи ПЛК (см. рисунок 16).&lt;br /&gt;
&lt;br /&gt;
Панель инструментов содержит следующие элементы:&lt;br /&gt;
&lt;br /&gt;
* Кнопка «Запустить симуляцию».&lt;br /&gt;
* Кнопка «Сделать шаг на один цикл».&lt;br /&gt;
* Кнопка «Приостановить симуляцию» - ставит выполнение задачи на паузу.&lt;br /&gt;
* Кнопка «Остановить симуляцию» - сбрасывает состояние всех блоков к их состоянию по умолчанию.&lt;br /&gt;
* Список выбора периода выполнения задачи.&lt;br /&gt;
* Кнопка «Показать окно «Наблюдение».&lt;br /&gt;
&lt;br /&gt;
==== Режим симулятора ====&lt;br /&gt;
Режим симулятора позволяет провести тестирование работы алгоритмов проекта на компьютере. С помощью симуляции можно выявить ошибки в работе алгоритмов проекта до его загрузки в контроллер.&lt;br /&gt;
&lt;br /&gt;
Управление симуляцией осуществляется через команды на панели инструментов задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Для перехода в режим симуляции нажмите кнопку «Режим симулятора» на панели управления задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC-Панель инструментов задачи ПЛК.png|мини|Рисунок 16 - Панель инструментов задачи ПЛК]]&lt;br /&gt;
После активации режима симуляции, для изменения значения входа дважды щелкните на нем левой кнопкой мыши и выберите нужный тип и значение. Текущие значения всех блоков, в соответствии с работой программы, будут отображаться в реальном времени.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме симулятора.png|мини|Рисунок 17 – Вид блоков задачи в режиме симулятора]]&lt;br /&gt;
Для выхода из режима симуляции повторно нажмите кнопку «Режим симуляции» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
==== Онлайн отладка ====&lt;br /&gt;
Режим онлайн отладки позволяет провести тестирование проекта, загруженного и исполняемого в контроллере. Для перехода в режим онлайн отладки загрузите конфигурацию в контроллер, подключитесь к нему, после чего нажмите кнопку «Онлайн отладка» на панели инструментов задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме онлайн отладки.png|мини|Рисунок 18 – Вид блоков задачи в режиме онлайн отладки]]&lt;br /&gt;
На рисунке 18 изображен вид задачи ПЛК в режиме онлайн отладки проекта, запущенного на МПР-60 с установленными субмодулями DI (входы) и R (выходы).&lt;br /&gt;
&lt;br /&gt;
Для онлайн отладки на панели инструментов недоступны кнопка «Приостановить симуляцию» и список выбора периода.&lt;br /&gt;
&lt;br /&gt;
== Компиляция проекта ==&lt;br /&gt;
Перед загрузкой проекта в контроллер или запуском эмуляции проекта необходимо откомпилировать проект и получить файл конфигурации, предназначенный для исполнения средой исполнения, установленной в контроллере или на персональном компьютере (в случае разработки системы диспетчеризации). Для этого необходимо вызвать команду меню &amp;quot;Проект-&amp;gt;Сохранить конфигурацию&amp;quot;, выбрать папку проекта и нажать кнопку &amp;quot;Сохранить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Проверка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Ошибки».png|мини|Рисунок 19 – Окно «Ошибки»]]&lt;br /&gt;
Перед сохранением проекта желательно выполнить его проверку на наличие ошибок с помощью команды «Проект-&amp;gt;Проверить проект». После проверки обнаруженные ошибки будут отображены в окне «Ошибки».&lt;br /&gt;
&lt;br /&gt;
Если отображение окна «Ошибки» выключено, его можно включить командой «Вид-&amp;gt;Показать окно ошибок».&lt;br /&gt;
&lt;br /&gt;
Для облегчения исправления обнаруженных ошибок окно поддерживает выполнение некоторых команд над обнаруженными ошибками, вызывать которые можно из контекстного меню, отображаемого щелчком правой кнопки мыши на строке c ошибкой в окне. Контекстное меню позволяет вызывать команду «Показать узел в дереве конфигурации», выполняющую соответствующее действие.&lt;br /&gt;
&lt;br /&gt;
Также щелчок левой кнопкой мыши на строке с ошибкой открывает окно «Свойства» и дает возможность изменить в нем все свойства узла, содержащего ошибку.&lt;br /&gt;
&lt;br /&gt;
==== Установка пароля на файл конфигурации ====&lt;br /&gt;
[[Файл:AgavaPLC–Установка пароля.png|мини|Рисунок 13 – Установка пароля]]&lt;br /&gt;
Файл конфигурации, загружаемый в контроллер или панель оператора, можно защитить паролем, чтобы предотвратить его несанкционированное изменение.&lt;br /&gt;
&lt;br /&gt;
Для установки пароля на файл конфигурации необходимо выбрать в дереве проекта узел «Конфигурация» и отредактировать его свойство «Пароль». Допускается использование любых цифр, букв и спецсимволов.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем при открытии файла конфигурации в среде разработки будет появляться окно с запросом пароля.&lt;br /&gt;
&lt;br /&gt;
== Загрузка проекта в устройство ==&lt;br /&gt;
Загрузка проекта в целевое устройство может быть осуществлена несколькими способами:&lt;br /&gt;
&lt;br /&gt;
* загрузка из среды разработки;&lt;br /&gt;
* загрузка с помощью USB-Flash накопителя (для панелей оператора);&lt;br /&gt;
* загрузка через браузер (для МПР-60).&lt;br /&gt;
&lt;br /&gt;
=== Загрузка из среды разработки ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Загрузка проекта в устройство» после подключения к контроллеру.png|мини|Рисунок 20 – Окно «Загрузка проекта в устройство» после подключения к контроллеру]]&lt;br /&gt;
Для загрузки проекта из среды разработки необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Создайте файл конфигурации.&lt;br /&gt;
# Выполните подключение целевого устройства к ПК по сети Ethernet.&lt;br /&gt;
# После подключения вызовите в среде разработки команду «Проект-&amp;gt;Загрузка проекта в устройство».&lt;br /&gt;
# В открывшемся окне будет отображен список файлов проекта, доступных для загрузки в целевое устройство.&lt;br /&gt;
# Выберите необходимые файлы и нажмите кнопку «Загрузить». После нажатия кнопки начнется процесс загрузки файлов, при этом в нижней части окна будет меняться состояние полосы прогресса, а также для каждого файла в таблице будет отображен результат загрузки.&lt;br /&gt;
# После окончания загрузки среда исполнения в целевом устройстве будет перезапущена и загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через USB-Flash (для ПО-40 и ПО-50) ===&lt;br /&gt;
Для загрузки проекта в устройство с помощью USB-Flash накопителя необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Подготовьте USB-Flash накопитель, предварительно отформатировав его в файловую систему FAT32.&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив в корень USB-Flash накопителя.&lt;br /&gt;
# Перейдите в системную утилиту, перезагрузив панель оператора, при загрузке во время однократного звукового сигнала нажмите на экран и удерживайте до повторного звукового сигнала. Введите пароль: 111111.&lt;br /&gt;
# Перейдите на вкладку «Обновление», затем подключите USB-Flash накопитель через переходник USB-OTG, выберите из списка загрузочный архив, нажать кнопку «Обновить». Дождитесь сообщения «Обновление успешно» и нажмите кнопку «ОК».&lt;br /&gt;
# Перейдите на вкладку «Перезапуск» и нажмите кнопку «Перезапуск».&lt;br /&gt;
После перезагрузки панели загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через браузер (для МПР-60) ===&lt;br /&gt;
Для загрузки проекта через браузер необходимо произвести следующие действия в указанном порядке.&lt;br /&gt;
&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив.&lt;br /&gt;
# Откройте системную утилиту, введя IP-адрес контроллера в адресную строку браузера.&lt;br /&gt;
# Перейдите на вкладку «Загрузка ПО».  Рисунок 71 - Вкладка системной утилиты «Загрузка ПО»&lt;br /&gt;
# Выберите на компьютере архив с проектом, который необходимо загрузить в контроллер.&lt;br /&gt;
# Нажмите кнопку «Загрузить».&lt;br /&gt;
# Дождитесь окончания загрузки файла и обновления проекта.&lt;br /&gt;
&lt;br /&gt;
== Отладка проекта ==&lt;br /&gt;
''Данный функционал доступен в версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;. Для версий &amp;lt;code&amp;gt;AS 1.2&amp;lt;/code&amp;gt; используйте мониторинг, [[Универсальная среда разработки Agava#Отладка в задаче ПЛК|отладку в задачах ПЛК]].''&lt;br /&gt;
&lt;br /&gt;
=== Локальная отладка ===&lt;br /&gt;
&lt;br /&gt;
=== Удаленная отладка ===&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BE%D0%BA%D0%BD%D0%BE_%D1%81%D1%80%D0%B5%D0%B4%D1%8B_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8.png&amp;diff=3468</id>
		<title>Файл:AgavaPLC-Основное окно среды разработки.png</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BE%D0%BA%D0%BD%D0%BE_%D1%81%D1%80%D0%B5%D0%B4%D1%8B_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8.png&amp;diff=3468"/>
		<updated>2026-03-27T09:42:19Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: TaushkanovKV загрузил новую версию Файл:AgavaPLC-Основное окно среды разработки.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основное окно среды разработки AgavaPLC с загруженным проектом&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3467</id>
		<title>Универсальная среда разработки Agava</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3467"/>
		<updated>2026-03-27T09:33:12Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Создание нового проекта */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Универсальная среда разработки предназначена для создания и редактирования программного обеспечения для панелей оператора АГАВА ПО, многоканальных программируемых реле АГАВА МПР-60 и систем диспетчеризации на базе SCADA-системы AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Универсальная среда разработки Agava имеет удобный и эргономичный пользовательский интерфейс со всеми инструментами, необходимыми для создания эффективных проектов-приложений, предназначенных для исполнения на ПК, панелях оператора или персональных компьютерах.&lt;br /&gt;
&lt;br /&gt;
Среда разработки совмещает редакторы текста, редакторы визуальных представлений объектов, компоновщики структуры, средства связывания объектов и других частей проекта, анализаторы проекта в одном приложении и дает пользователю возможность ведения эффективной разработки проектов-приложений от начала и до завершения в одной программе, без использования разнородных приложений-утилит и необходимости переключения между ними.&lt;br /&gt;
&lt;br /&gt;
=== Версии программного обеспечения ===&lt;br /&gt;
{{Внимание|Текст=При использовании среды разработки совместно с панелями оператора АГАВА ПО или многоканальными программируемыми реле АГАВА МПР-60 необходимо использовать соответствующую версию среды разработки|Тип=Восклицание синий.png}}&lt;br /&gt;
Для определения подходящей версии среды разработки необходимо определить версию среды исполнения, установленной в панели оператора или реле. Тип и версия среды исполнения указаны в системной утилите прибора. Например, &amp;quot;AgavaPLC 1.1&amp;quot;, &amp;quot;AgavaPLC 1.2&amp;quot;  и т.д. Для использования со средой исполнения AgavaPLC 1.1 необходимо использовать среду разработки версии 1.1, для среды исполнения AgavaPLC 1.2 необходима среда разработки версии 1.2 и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные статьи и документы ===&lt;br /&gt;
*[[Узлы проекта AgavaSCADA/AgavaPLC|Описание узлов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Свойства узлов в AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Транспорты AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание языка С++ в AgavaPLC|Описание языка С++ в AgavaSCADA/AgavaPLC]].&amp;lt;!-- Комментарий --&amp;gt;.&lt;br /&gt;
*[[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Рекомендации по разработке приложений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
Полный перечень всех документов, связанных с разработкой приложений на AgavaSCADA/AgavaPLC, приведен на странице [[:Категория:AgavaSCADA/AgavaPLC|категории AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Разработка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Создание нового проекта ===&lt;br /&gt;
Создание нового проекта в среде разработки осуществляется с помощью команды «Создать проект…» в меню «Файл». После вызова данной команды откроется диалоговое окно создания нового проекта (см. Рисунок 1).&lt;br /&gt;
[[Файл:AgavaPLC-Создание проекта.png|мини|Рисунок 1 - Окно &amp;quot;Создание нового проекта&amp;quot;]]&lt;br /&gt;
Для создания проекта необходимо в списке типов проектов выбрать необходимый, ввести имя проекта и путь для его сохранения, после чего нажать кнопку «Создать проект».&lt;br /&gt;
&lt;br /&gt;
Доступны несколько типов проектов:&lt;br /&gt;
&lt;br /&gt;
* «Пустой проект» – пустой проект, не содержащий никаких узлов. Данный тип можно использовать для создания произвольного проекта &amp;quot;с нуля&amp;quot;.&lt;br /&gt;
* «Локальный проект» – предварительно настроенный проект, содержащий необходимые подсистемы и предназначенный для реализации простой системы для одного устройства, при выборе данного типа пользователь имеет возможность выбрать нужные ему подсистемы и получить полностью рабочий проект в минимальной конфигурации.&lt;br /&gt;
* «Проект АГАВА ПО-40» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-40.&lt;br /&gt;
* «Проект АГАВА ПО-50» - проект, предназначенный для исполнения на панели оператора АГАВА ПО-50.&lt;br /&gt;
* «Проект АГАВА МПР-60» - проект, предназначенный для исполнения на контроллере АГАВА МПР-60.&lt;br /&gt;
* «Проект АГАВА ПЛК-70.А» - проект, предназначенный для исполнения на контроллере АГАВА ПЛК-70.А.&lt;br /&gt;
&lt;br /&gt;
=== Редактирование существующего проекта ===&lt;br /&gt;
Редактирование существующего проекта начинается с открытия файла проекта путем вызова команды «Открыть…» в меню «Файл». После загрузки файла в основном окне среды разработки будут отображены свойства и параметры проекта (см. Рисунок 2).&lt;br /&gt;
[[Файл:AgavaPLC-Основное окно среды разработки.png|мини|Рисунок 2 – Основное окно среды разработки AgavaPLC с загруженным проектом]]&lt;br /&gt;
По умолчанию основное окно среды разработки содержит перечисленные ниже части:&lt;br /&gt;
&lt;br /&gt;
# Строка заголовка приложения, панель меню и панель инструментов.&lt;br /&gt;
# Окно дерева проекта. Предоставляет доступ ко всей структуре проекта (см. раздел [[#Описание узлов]]).&lt;br /&gt;
# Окно свойств (см. раздел [[#Редактирование свойств узлов]] ).&lt;br /&gt;
# Область для отображения содержимого, например графического представления окна или задачи ПЛК.&lt;br /&gt;
# Область вспомогательных окон (окна наблюдения, ошибок и сообщений)&lt;br /&gt;
&lt;br /&gt;
После открытия проекта можно приступить к его редактированию.&lt;br /&gt;
&lt;br /&gt;
По завершению всех операций по редактированию необходимо выполнить проверку проекта на корректность с помощью команды «Проверить проект», расположенной в меню «Проект» (см. 6.1). &lt;br /&gt;
&lt;br /&gt;
=== Структура и состав проекта ===&lt;br /&gt;
Типичный проект содержит следующие части:&lt;br /&gt;
&lt;br /&gt;
* станция – важнейший объект, управляющий работой собственных подсистем и осуществляющий обмен данными с другими станциями;&lt;br /&gt;
* транспортная подсистема, выполняющая сбор данных с УСО;&lt;br /&gt;
* подсистема визуализации, обеспечивающая отображение информации в различных видах.&lt;br /&gt;
&lt;br /&gt;
Проект также может содержать следующие части:&lt;br /&gt;
&lt;br /&gt;
* подсистема архивирования, сохраняющая данные в БД для последующего извлечения и анализа;&lt;br /&gt;
* подсистема проверки прав пользователей, предназначенная для контроля доступа пользователя к объектам в режиме исполнения;&lt;br /&gt;
* подсистема тревог, предназначенная для оповещения пользователя об обнаруженных нарушениях;&lt;br /&gt;
* подсистема журналирования, выполняющая архивирование зарегистрированных событий в БД для последующего извлечения и анализа.&lt;br /&gt;
&lt;br /&gt;
Проект имеет древовидную структуру, вследствие чего все узлы связаны друг с другом. Узлы нижних уровней подчиняются узлам верхних уровней. К примеру, станции подчинены все подсистемы, а каждой подсистеме подчинены все узлы, которыми она управляет.&lt;br /&gt;
&lt;br /&gt;
Описание всех частей проекта и их узлов приведено в разделе 4.&lt;br /&gt;
&lt;br /&gt;
=== Разработка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC-Добавление узла в проект.png|мини|Рисунок 3 – Добавление узла в проект AgavaPLC]]&lt;br /&gt;
Перед началом разработки проекта рекомендуется проанализировать поставленную задачи и определить подсистемы, необходимые для её реализации. Взаимодействие с подсистемами осуществляется через дерево проекта (см. Рисунок 2), в которое добавляются нужные узлы. Для добавления нового узла, необходимо нажать правой кнопкой мыши на узел верхнего уровня, которому он подчинён, и выбрать в контекстном меню команду «Добавить узел».&lt;br /&gt;
&lt;br /&gt;
Основные части типовой программы и способы их реализации приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие с внешними устройствами ====&lt;br /&gt;
Реализуется через подсистему «Транспорты» в окне дерева проекта. Необходимо добавить в нее нужные протоколы, в зависимости от имеющейся конфигурации контроллера.&lt;br /&gt;
[[Файл:AgavaPLC-Транспорты.png|мини|Рисунок 4 - Транспорты в дереве проекта AgavaPLC]]&lt;br /&gt;
# Транспорт для обмена с субмодулями контроллера (для контроллеров с корзиной субмодулей). В качестве порта транспорта необходимо указать “/dev/ttyS0”. В проекте для МПР-60 присутствует по-умолчанию.&lt;br /&gt;
# Транспорт последовательный (для управления по RS-232, RS-485 и т.д.).&lt;br /&gt;
# Транспорт TCP/IP (для управления по Ethernet).&lt;br /&gt;
&lt;br /&gt;
К транспортам присоединяются либо регистры Modbus, либо субмодули. Для регистра задается адрес устройства, номер регистра, функция чтения/записи и другие параметры, при необходимости. Для субмодуля указывается слот, в котором он установлен, и тип аналоговых входов/выходов. &lt;br /&gt;
&lt;br /&gt;
==== Визуализация данных ====&lt;br /&gt;
Визуализация данных технологических процессов реализуется с помощью элементов подсистемы «Визуализация».&lt;br /&gt;
&lt;br /&gt;
Система визуализации недоступна в проектах для  контроллеров МПР.&lt;br /&gt;
[[Файл:AgavaPLC-Пример визуализации.png|мини|Рисунок 5 - Пример визуализации]]&lt;br /&gt;
Визуализация содержит одно или несколько окон, описанных ниже.&lt;br /&gt;
&lt;br /&gt;
# Форма, которая может использоваться как меню или панель инструментов. Также применяется в небольших проектах, в которых нет необходимости изменения выводимого набора виджетов.&lt;br /&gt;
# Окно с композицией, которое позволяет переключаться между различными экранами (например мнемосхемой, настройками, архивированием и т.д). Каждый из этих экранов реализуется на отдельной композиции.&lt;br /&gt;
&lt;br /&gt;
Процесс создания визуализации начинается с добавления нужных окон в группу «Окна» в дереве проекта. В том случае, если используется окно с композицией, необходимо задать ему отображаемую композицию по умолчанию, перед этим добавив ее в группу «Композиции». Созданные окна нужно добавить к одному фрейму, указав их в соответствующем свойстве фрейма.&lt;br /&gt;
&lt;br /&gt;
Редактирование содержимого окна или композиции осуществляется в его графическом представлении (см. раздел [[#Редактирование графического представления узла]]).&lt;br /&gt;
&lt;br /&gt;
Более подробное описание подсистемы визуализации приведено в разделе [[#Подсистема визуализации]].&lt;br /&gt;
&lt;br /&gt;
==== Пользовательские алгоритмы ====&lt;br /&gt;
Реализовать нужные алгоритмы работы программы можно с помощью различных инструментов, которые выбираются в зависимости от сложности проектов и навыков программиста:&lt;br /&gt;
&lt;br /&gt;
# Операции в группе «Сигналы» – отдельные логические операции. В основном используются для небольших проектов, не требующих сложных методов управления;&lt;br /&gt;
# Задачи ПЛК – графическое программирование с помощью связывания между собой различных функциональных блоков. Подходит для больших проектов. Реализуется в узле «Задача ПЛК» группы «Задачи». Подробное описание приведено в разделе [[#Задача ПЛК]]'''.'''&lt;br /&gt;
# Скрипты С++ – текстовое программирование на языке высокого уровня. Подходит для больших проектов. Реализуется с помощью операций «Скрипт С++», расположенных в группе «Сигналы» или в задаче ПЛК. Описание реализации языка С++ приведено на странице [[Описание языка С++ в AgavaPLC]].&lt;br /&gt;
=== Редактирование свойств узлов ===&lt;br /&gt;
Среда разработки обладает развитыми возможностями по редактированию свойств узлов. Описание доступных типов свойств приведно в статье [[Свойства узлов в AgavaPLC/AgavaSCADA]].&lt;br /&gt;
&lt;br /&gt;
==== Редактирование свойств узлов с помощью окна «Свойства» ====&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Свойства&amp;quot;.png|мини|Рисунок 6 – Окно «Свойства» виджета «Кнопка»]]&lt;br /&gt;
Редактирование свойств всех узлов осуществляется с помощью окна «Свойства».&lt;br /&gt;
&lt;br /&gt;
В окне «Свойства» в виде таблицы отображаются все доступные свойства узла, объединенные в группы. В левой колонке отображены наименования свойств, в правой отображены их значения. Свойства, недоступные для изменения, имеют наименование серого цвета. В нижней части окна расположена область подсказки, содержащая пояснение к выделенному свойству.&lt;br /&gt;
&lt;br /&gt;
===== Редактирование свойств группы узлов =====&lt;br /&gt;
В случае, когда необходимо изменить свойства у нескольких узлов, можно воспользоваться возможностью группового редактирования свойств. Для этого нужно выделить несколько узлов в дереве конфигурации либо на графическом представлении с помощью левой кнопки мыши и нажатой кнопки «Ctrl». При этом в окне свойств будут отображены только те свойства, что имеются у всех выделенных узлов. Далее можно изменить нужное свойство, при этом после завершения редактирования измененное значение будет установлено во всех выбранных узлах.&lt;br /&gt;
&lt;br /&gt;
==== Групповое редактирование свойств узлов ====&lt;br /&gt;
При необходимости редактирования разных свойств у большого количества узлов можно воспользоваться специальным окном «Список узлов».&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Список узлов&amp;quot;.png|мини|Рисунок 7 - Окно &amp;quot;Список узлов&amp;quot;]]&lt;br /&gt;
Открытие окна выполняется с помощью вызова команды «Открыть список узлов» в контекстном меню дерева конфигурации. Открытое окно содержит все узлы, вложенные в выбранные при вызове команды.&lt;br /&gt;
&lt;br /&gt;
Окно позволяет редактировать свойства непосредственно в ячейках таблицы, без переключения на окно «Свойства». Групповое редактирование свойств узлов через окно «Свойства» также доступно.&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на списке вызывает контекстное меню, содержащее команды:&lt;br /&gt;
&lt;br /&gt;
* “Свойства”;&lt;br /&gt;
* “Экспорт в *.txt”;&lt;br /&gt;
* “Импорт из *.txt”;&lt;br /&gt;
* “Удалить узел”.&lt;br /&gt;
&lt;br /&gt;
Команда «Свойства» открывает диалоговое окно выбора отображаемых свойств.&lt;br /&gt;
&lt;br /&gt;
Команды «Экспорт», «Импорт» выполняют экспорт списка свойств узлов в текстовый файл и импорт соответственно.&lt;br /&gt;
&lt;br /&gt;
Команда «Удалить узел» производит удаление выделенного узла (узлов).&lt;br /&gt;
&lt;br /&gt;
==== Функция групповой замены источников в узлах ====&lt;br /&gt;
При разработке сложных проектов может возникнуть необходимость заменить источники сразу в большом количестве узлов. Для этой цели используется функция групповой замены источников.  Необходимо перейти в редактирование свойств типа «Список источников», которое производится в соответствующем окне (см. Рисунок 8).&lt;br /&gt;
[[Файл:AgavaPLC-Окно редактирования свойств типа «Список источников».png|мини|Рисунок 8 - Окно редактирования свойств типа «Список источников»]]&lt;br /&gt;
Затем необходимо использовать функцию групповой замены (см. Рисунок 9), выделив нужные узлы, нажав на них правой кнопкой мыши и выбрав «Групповая замена».&lt;br /&gt;
[[Файл:AgavaPLC-Окно функции «Групповая замена».png|мини|Рисунок 9 - Окно функции «Групповая замена»]]&lt;br /&gt;
&lt;br /&gt;
=== Редактирование графического представления узла ===&lt;br /&gt;
Редактирование содержимого окон, слоев, форм, композиций и других элементов, предназначенных для отображения на экране, осуществляется в окне графического представления. Открытие окна возможно с помощью команды «Открыть графическое представление» в контекстном меню дерева конфигурации или двойного нажатия левой кнопки мыши для узлов следующих типов:&lt;br /&gt;
&lt;br /&gt;
* фрейм;&lt;br /&gt;
* форма;&lt;br /&gt;
* окно с композицией;&lt;br /&gt;
* слой.&lt;br /&gt;
&lt;br /&gt;
Открытое графическое представление выбранного узла может содержать все уже размещенные на нем элементы визуализации и (или) другие узлы и позволяет добавить новые.&lt;br /&gt;
[[Файл:AgavaPLC–Открытое графическое представление окна «winMain».png|мини|Рисунок 10 – Открытое графическое представление окна «winMain»]]&lt;br /&gt;
На рисунке 10 представлено графическое представление окна «winMain», обведенное пунктирной рамкой серого цвета, обозначающей внешнюю границу открытого узла. Тип рамки пользователь может выбрать по своему усмотрению, выбор производится в окне настроек среды разработки, доступном через команду «Настройки» в меню «Параметры».&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на пустом месте в открытом графическом представлении узла вызывает контекстное меню, содержащее команды удаления и вставки виджетов из буфера обмена, а также команды добавления новых виджетов доступных типов.&lt;br /&gt;
&lt;br /&gt;
Добавление новых виджетов также может осуществлять путем их перестаскивания в рабочую область из панели виджетов.&lt;br /&gt;
&lt;br /&gt;
Графическое представление позволяет перемещать выделенные виджеты кнопками перемещения курсора на клавиатуре, а также изменять их размеры кнопками перемещения курсора при нажатой кнопке Shift.&lt;br /&gt;
&lt;br /&gt;
==== Связывание источников и виджетов ====&lt;br /&gt;
Связывание виджетов и других узлов с источниками данных необходимо для того, чтобы виджеты или другие узлы могли отображать или обрабатывать значения, хранящиеся в источниках.&lt;br /&gt;
&lt;br /&gt;
Для связи виджетов с источниками данных можно воспользоваться обычным способом связывания через окно «Свойства». К примеру, связывание размещенного на форме виджета «Текстовая метка» с регистром Modbus осуществляется добавлением регистра Modbus в свойство виджета «Источник».&lt;br /&gt;
&lt;br /&gt;
Вместе с обычным способом связывания существует и другой, более быстрый способ. Для быстрого связывания регистра с виджетом достаточно нажать на регистр в дереве конфигурации левой кнопкой мыши и перенести его на виджет в открытом графическом представлении.&lt;br /&gt;
[[Файл:AgavaPLC–Связывание узла «sourceModbusRegister0» и виджета.png|мини|Рисунок 11 – Связывание узла «sourceModbusRegister0» и виджета]]&lt;br /&gt;
При помещении курсора над виджетом последний будет заштрихован сеткой зеленого или красного цвета, а курсор изменит свой вид на стрелку с квадратиком (см. рисунок 11).&lt;br /&gt;
&lt;br /&gt;
Зеленая штриховка виджета означает отсутствие связи выделенного виджета с источником данных, в этом случае связывание будет произведено. Красная штриховка говорит об ошибках связывания виджета и сигнала/источника.&lt;br /&gt;
&lt;br /&gt;
==== Редактирование многослойных композиций ====&lt;br /&gt;
Редактирование многослойных композиций принципиально не отличается от редактирования форм, кроме одного нюанса. Так как композиция может состоять из нескольких слоев, и виджеты на слоях могут располагаться один над другим, для использования наиболее удобного способа редактирования такой композиции можно воспользоваться возможностью открытия каждого слоя в отдельном окне.&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры композиции «Composition1», состоящей из трех слоев.png|мини|Рисунок 12 – Пример структуры композиции «Composition1», состоящей из трех слоев]]&lt;br /&gt;
Для открытия графического представления слоя нужно воспользоваться командой «Открыть графическое представление» аналогично открытию графического представления формы или композиции.&lt;br /&gt;
&lt;br /&gt;
Открыв одновременно композицию и слой, при редактировании слоя можно видеть, что содержимое композиции также изменяется и наоборот, при редактировании композиции изображение слоя будет изменяться.&lt;br /&gt;
&lt;br /&gt;
Слой обладает важным свойством «Прозрачность для действий». Данное свойство позволяет регулировать доступность виджетов, расположенных на нижележащих слоях, для действий пользователя. Например, если у верхнего слоя данное свойство выключено, то виджеты, расположенные на всех нижележащих слоях, будут недоступны для взаимодействия. Если же у верхнего слоя свойство включено, то виджеты нижележащего слоя будут доступны.&lt;br /&gt;
&lt;br /&gt;
==== Использование якорей ====&lt;br /&gt;
Данная возможность доступна с версии &amp;lt;code&amp;gt;AS 1.6.32+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При работе с графическими представлениями окон и композиций, содержащих большое количество виджетов, могут быть полезны якоря - создаваемые пользователем метки на размерных линейках.&lt;br /&gt;
[[Файл:AgavaPLC-Графическое представление-якоря.png|мини|AS 1.6.32+: Графическое представление формы с установленными якорями]]&lt;br /&gt;
Якоря позволяют контролировать положение групп виджетов благодаря связанным с ними линиям привязки. Линии привязки, позволяют быстрее выстраивать группы виджетов благодяря &amp;quot;прилипанию&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Создание якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Добавить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Удаление якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по якорю на размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Удалить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Созданные якоря можно перемещать по размерной линейке с помощью мыши.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение проекта ===&lt;br /&gt;
Для сохранения проекта на диск вызовите команду  «Файл-&amp;gt;Сохранить проект» или «Файл-&amp;gt;Сохранить проект как...», если необходимо сделать копию открытого проекта и продолжить работу в ней после сохранения.&lt;br /&gt;
&lt;br /&gt;
== Проверка и отладка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Эмуляция проекта ===&lt;br /&gt;
Проверить работоспособность проекта можно, не загружая его в контроллер. Для этого существует возможность запустить среду исполнения прямо на компьютере. &lt;br /&gt;
&lt;br /&gt;
Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Установить текущий проект как проект по умолчанию. Для этого необходимо вызвать команду &amp;quot;Проект-&amp;gt;Установить проект по умолчанию...&amp;quot;  и выбрать ранее сохраненный файл конфигурации.&lt;br /&gt;
# Запустить среду исполнения. Для этого нужно вызвать команду меню &amp;quot;Проект-&amp;gt;Запуск среды исполнения&amp;quot;. После этого будет выполнен запуск в новом окне среды исполнения.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг сигналов ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно &amp;quot;Наблюдение&amp;quot;.png|мини|Рисунок 14 – Окно &amp;quot;Наблюдение&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Наблюдение%22.png]]&lt;br /&gt;
Функция мониторинга сигналов позволяет наблюдать значения, хранящиеся в узлах проекта при исполнении проекта на целевом устройстве.&lt;br /&gt;
&lt;br /&gt;
Для запуска данной функции необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить среду исполнения.&lt;br /&gt;
# Вызвать команду меню «&amp;lt;code&amp;gt;Устройство → Подключение/отключение&amp;lt;/code&amp;gt;», в появившемся окне выбрать IP-адрес и порт устройства, значения узлов которого необходимо мониторить. При необходимости просмотра значений узлов и сигналов в режиме эмуляции проекта на персональном компьютере укажите адрес 127.0.0.1. Если необходимо просматривать значения узлов проекта, выполняющегося на контроллере или панели оператора, укажите IP-адрес контроллера или панели.&lt;br /&gt;
# Нажать кнопку «Подключение».&lt;br /&gt;
&lt;br /&gt;
Поле подключения к среде исполнения нужно добавить в окно &amp;quot;Наблюдение&amp;quot; узлы, значения которых необходимо наблюдать. Такие узлы должны иметь возможность чтения или записи значений – это регистры Modbus и другие узлы типа &amp;quot;Источник&amp;quot;, сигналы. &lt;br /&gt;
&lt;br /&gt;
Для добавления узлов в окно &amp;quot;Наблюдение&amp;quot; необходимо нажать на нужном узле в дереве проекта правой кнопкой мыши и выбрать команду «&amp;lt;code&amp;gt;Добавить в окно наблюдения&amp;lt;/code&amp;gt;». Выбранные узлы будут отображаться в окне «Наблюдение» вместе со считанными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг событий ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно просмотра событий.png|мини|Рисунок 15 – Окно просмотра событий]]Мониторинг событий позволяет наблюдать за исполнением проекта, работающего в устройстве. При включении мониторинга пользователь получает информацию о возникающих нефатальных ошибках и предупреждениях, возникающих в ходе исполнения проекта со следующими признаками:&lt;br /&gt;
&lt;br /&gt;
* метка времени, соответствующая времени возникновения события;&lt;br /&gt;
* степень важности события;&lt;br /&gt;
* тип события - информационное или события активирования, деактивирования и квитирования тревог;&lt;br /&gt;
* имя узла, сформировавшего событие.&lt;br /&gt;
* текст события.&lt;br /&gt;
&lt;br /&gt;
==== Использование мониторинга ====&lt;br /&gt;
Для старта мониторинга необходимо подключиться к нужному устройству способом, рассмотренным в разделе [[#Мониторинг сигналов]], а затем вызвать команду «&amp;lt;code&amp;gt;Устройство → Просмотр событий&amp;lt;/code&amp;gt;». В открывшемся окне будут выводиться все события, регистрируемые устройством. &lt;br /&gt;
&lt;br /&gt;
С помощью выпадающего списка в левом верхнем углу окна можно выбрать минимальный уровень выводимых событий.&lt;br /&gt;
&lt;br /&gt;
==== Фильтрация событий ====&lt;br /&gt;
''Функция доступна начиная с версии &amp;lt;code&amp;gt;AgavaSCADA/AgavaPLC 1.2.56+, 1.5.25+&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
В нижнем левом углу окна расположена область настройки фильтра событий, позволяющая фильтровать выводимые события по имени узла и тексту событий. При использовании фильтра возможно задание фильтра в виде:&lt;br /&gt;
&lt;br /&gt;
* простой строки, при этом в список попадают события, содержащие полное совпадение заданной строки; при задании строки возможно в(ы)ключение признака учета регистра символов в строке;&lt;br /&gt;
* регулярного выражения, при этом в список попадают события, удовлетворяющие введенное выражение. Правила составления регулярных выражений описаны на странице [[Использование регулярных выражений]].&lt;br /&gt;
&lt;br /&gt;
=== Отладка в задаче ПЛК ===&lt;br /&gt;
''Данный раздел актуален для версии &amp;lt;code&amp;gt;AS 1.2.61&amp;lt;/code&amp;gt; и старее. В версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt; используется [[Универсальная среда разработки Agava#Отладка проекта|современный пошаговый отладчик]].''&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК (см. раздел [[#Задача ПЛК]]) позволяет проводить тестирование проектов с помощью режима симулятора (на компьютере, без использования контроллера) или онлайн отладки (на контроллере).&lt;br /&gt;
&lt;br /&gt;
==== Управление отладкой ====&lt;br /&gt;
Управление режимом симуляции и онлайн отладкой осуществляется с помощью панели инструментов задачи ПЛК (см. рисунок 16).&lt;br /&gt;
&lt;br /&gt;
Панель инструментов содержит следующие элементы:&lt;br /&gt;
&lt;br /&gt;
* Кнопка «Запустить симуляцию».&lt;br /&gt;
* Кнопка «Сделать шаг на один цикл».&lt;br /&gt;
* Кнопка «Приостановить симуляцию» - ставит выполнение задачи на паузу.&lt;br /&gt;
* Кнопка «Остановить симуляцию» - сбрасывает состояние всех блоков к их состоянию по умолчанию.&lt;br /&gt;
* Список выбора периода выполнения задачи.&lt;br /&gt;
* Кнопка «Показать окно «Наблюдение».&lt;br /&gt;
&lt;br /&gt;
==== Режим симулятора ====&lt;br /&gt;
Режим симулятора позволяет провести тестирование работы алгоритмов проекта на компьютере. С помощью симуляции можно выявить ошибки в работе алгоритмов проекта до его загрузки в контроллер.&lt;br /&gt;
&lt;br /&gt;
Управление симуляцией осуществляется через команды на панели инструментов задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Для перехода в режим симуляции нажмите кнопку «Режим симулятора» на панели управления задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC-Панель инструментов задачи ПЛК.png|мини|Рисунок 16 - Панель инструментов задачи ПЛК]]&lt;br /&gt;
После активации режима симуляции, для изменения значения входа дважды щелкните на нем левой кнопкой мыши и выберите нужный тип и значение. Текущие значения всех блоков, в соответствии с работой программы, будут отображаться в реальном времени.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме симулятора.png|мини|Рисунок 17 – Вид блоков задачи в режиме симулятора]]&lt;br /&gt;
Для выхода из режима симуляции повторно нажмите кнопку «Режим симуляции» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
==== Онлайн отладка ====&lt;br /&gt;
Режим онлайн отладки позволяет провести тестирование проекта, загруженного и исполняемого в контроллере. Для перехода в режим онлайн отладки загрузите конфигурацию в контроллер, подключитесь к нему, после чего нажмите кнопку «Онлайн отладка» на панели инструментов задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме онлайн отладки.png|мини|Рисунок 18 – Вид блоков задачи в режиме онлайн отладки]]&lt;br /&gt;
На рисунке 18 изображен вид задачи ПЛК в режиме онлайн отладки проекта, запущенного на МПР-60 с установленными субмодулями DI (входы) и R (выходы).&lt;br /&gt;
&lt;br /&gt;
Для онлайн отладки на панели инструментов недоступны кнопка «Приостановить симуляцию» и список выбора периода.&lt;br /&gt;
&lt;br /&gt;
== Компиляция проекта ==&lt;br /&gt;
Перед загрузкой проекта в контроллер или запуском эмуляции проекта необходимо откомпилировать проект и получить файл конфигурации, предназначенный для исполнения средой исполнения, установленной в контроллере или на персональном компьютере (в случае разработки системы диспетчеризации). Для этого необходимо вызвать команду меню &amp;quot;Проект-&amp;gt;Сохранить конфигурацию&amp;quot;, выбрать папку проекта и нажать кнопку &amp;quot;Сохранить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Проверка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Ошибки».png|мини|Рисунок 19 – Окно «Ошибки»]]&lt;br /&gt;
Перед сохранением проекта желательно выполнить его проверку на наличие ошибок с помощью команды «Проект-&amp;gt;Проверить проект». После проверки обнаруженные ошибки будут отображены в окне «Ошибки».&lt;br /&gt;
&lt;br /&gt;
Если отображение окна «Ошибки» выключено, его можно включить командой «Вид-&amp;gt;Показать окно ошибок».&lt;br /&gt;
&lt;br /&gt;
Для облегчения исправления обнаруженных ошибок окно поддерживает выполнение некоторых команд над обнаруженными ошибками, вызывать которые можно из контекстного меню, отображаемого щелчком правой кнопки мыши на строке c ошибкой в окне. Контекстное меню позволяет вызывать команду «Показать узел в дереве конфигурации», выполняющую соответствующее действие.&lt;br /&gt;
&lt;br /&gt;
Также щелчок левой кнопкой мыши на строке с ошибкой открывает окно «Свойства» и дает возможность изменить в нем все свойства узла, содержащего ошибку.&lt;br /&gt;
&lt;br /&gt;
==== Установка пароля на файл конфигурации ====&lt;br /&gt;
[[Файл:AgavaPLC–Установка пароля.png|мини|Рисунок 13 – Установка пароля]]&lt;br /&gt;
Файл конфигурации, загружаемый в контроллер или панель оператора, можно защитить паролем, чтобы предотвратить его несанкционированное изменение.&lt;br /&gt;
&lt;br /&gt;
Для установки пароля на файл конфигурации необходимо выбрать в дереве проекта узел «Конфигурация» и отредактировать его свойство «Пароль». Допускается использование любых цифр, букв и спецсимволов.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем при открытии файла конфигурации в среде разработки будет появляться окно с запросом пароля.&lt;br /&gt;
&lt;br /&gt;
== Загрузка проекта в устройство ==&lt;br /&gt;
Загрузка проекта в целевое устройство может быть осуществлена несколькими способами:&lt;br /&gt;
&lt;br /&gt;
* загрузка из среды разработки;&lt;br /&gt;
* загрузка с помощью USB-Flash накопителя (для панелей оператора);&lt;br /&gt;
* загрузка через браузер (для МПР-60).&lt;br /&gt;
&lt;br /&gt;
=== Загрузка из среды разработки ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Загрузка проекта в устройство» после подключения к контроллеру.png|мини|Рисунок 20 – Окно «Загрузка проекта в устройство» после подключения к контроллеру]]&lt;br /&gt;
Для загрузки проекта из среды разработки необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Создайте файл конфигурации.&lt;br /&gt;
# Выполните подключение целевого устройства к ПК по сети Ethernet.&lt;br /&gt;
# После подключения вызовите в среде разработки команду «Проект-&amp;gt;Загрузка проекта в устройство».&lt;br /&gt;
# В открывшемся окне будет отображен список файлов проекта, доступных для загрузки в целевое устройство.&lt;br /&gt;
# Выберите необходимые файлы и нажмите кнопку «Загрузить». После нажатия кнопки начнется процесс загрузки файлов, при этом в нижней части окна будет меняться состояние полосы прогресса, а также для каждого файла в таблице будет отображен результат загрузки.&lt;br /&gt;
# После окончания загрузки среда исполнения в целевом устройстве будет перезапущена и загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через USB-Flash (для ПО-40 и ПО-50) ===&lt;br /&gt;
Для загрузки проекта в устройство с помощью USB-Flash накопителя необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Подготовьте USB-Flash накопитель, предварительно отформатировав его в файловую систему FAT32.&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив в корень USB-Flash накопителя.&lt;br /&gt;
# Перейдите в системную утилиту, перезагрузив панель оператора, при загрузке во время однократного звукового сигнала нажмите на экран и удерживайте до повторного звукового сигнала. Введите пароль: 111111.&lt;br /&gt;
# Перейдите на вкладку «Обновление», затем подключите USB-Flash накопитель через переходник USB-OTG, выберите из списка загрузочный архив, нажать кнопку «Обновить». Дождитесь сообщения «Обновление успешно» и нажмите кнопку «ОК».&lt;br /&gt;
# Перейдите на вкладку «Перезапуск» и нажмите кнопку «Перезапуск».&lt;br /&gt;
После перезагрузки панели загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через браузер (для МПР-60) ===&lt;br /&gt;
Для загрузки проекта через браузер необходимо произвести следующие действия в указанном порядке.&lt;br /&gt;
&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив.&lt;br /&gt;
# Откройте системную утилиту, введя IP-адрес контроллера в адресную строку браузера.&lt;br /&gt;
# Перейдите на вкладку «Загрузка ПО».  Рисунок 71 - Вкладка системной утилиты «Загрузка ПО»&lt;br /&gt;
# Выберите на компьютере архив с проектом, который необходимо загрузить в контроллер.&lt;br /&gt;
# Нажмите кнопку «Загрузить».&lt;br /&gt;
# Дождитесь окончания загрузки файла и обновления проекта.&lt;br /&gt;
&lt;br /&gt;
== Отладка проекта ==&lt;br /&gt;
''Данный функционал доступен в версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;. Для версий &amp;lt;code&amp;gt;AS 1.2&amp;lt;/code&amp;gt; используйте мониторинг, [[Универсальная среда разработки Agava#Отладка в задаче ПЛК|отладку в задачах ПЛК]].''&lt;br /&gt;
&lt;br /&gt;
=== Локальная отладка ===&lt;br /&gt;
&lt;br /&gt;
=== Удаленная отладка ===&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.png&amp;diff=3466</id>
		<title>Файл:AgavaPLC-Создание проекта.png</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:AgavaPLC-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.png&amp;diff=3466"/>
		<updated>2026-03-27T09:30:32Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: TaushkanovKV загрузил новую версию Файл:AgavaPLC-Создание проекта.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Окно &amp;quot;Создание нового проекта&amp;quot;&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3465</id>
		<title>Универсальная среда разработки Agava</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3465"/>
		<updated>2026-03-27T06:36:20Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Отладка в задаче ПЛК */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Универсальная среда разработки предназначена для создания и редактирования программного обеспечения для панелей оператора АГАВА ПО, многоканальных программируемых реле АГАВА МПР-60 и систем диспетчеризации на базе SCADA-системы AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Универсальная среда разработки Agava имеет удобный и эргономичный пользовательский интерфейс со всеми инструментами, необходимыми для создания эффективных проектов-приложений, предназначенных для исполнения на ПК, панелях оператора или персональных компьютерах.&lt;br /&gt;
&lt;br /&gt;
Среда разработки совмещает редакторы текста, редакторы визуальных представлений объектов, компоновщики структуры, средства связывания объектов и других частей проекта, анализаторы проекта в одном приложении и дает пользователю возможность ведения эффективной разработки проектов-приложений от начала и до завершения в одной программе, без использования разнородных приложений-утилит и необходимости переключения между ними.&lt;br /&gt;
&lt;br /&gt;
=== Версии программного обеспечения ===&lt;br /&gt;
{{Внимание|Текст=При использовании среды разработки совместно с панелями оператора АГАВА ПО или многоканальными программируемыми реле АГАВА МПР-60 необходимо использовать соответствующую версию среды разработки|Тип=Восклицание синий.png}}&lt;br /&gt;
Для определения подходящей версии среды разработки необходимо определить версию среды исполнения, установленной в панели оператора или реле. Тип и версия среды исполнения указаны в системной утилите прибора. Например, &amp;quot;AgavaPLC 1.1&amp;quot;, &amp;quot;AgavaPLC 1.2&amp;quot;  и т.д. Для использования со средой исполнения AgavaPLC 1.1 необходимо использовать среду разработки версии 1.1, для среды исполнения AgavaPLC 1.2 необходима среда разработки версии 1.2 и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные статьи и документы ===&lt;br /&gt;
*[[Узлы проекта AgavaSCADA/AgavaPLC|Описание узлов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Свойства узлов в AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Транспорты AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание языка С++ в AgavaPLC|Описание языка С++ в AgavaSCADA/AgavaPLC]].&amp;lt;!-- Комментарий --&amp;gt;.&lt;br /&gt;
*[[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Рекомендации по разработке приложений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
Полный перечень всех документов, связанных с разработкой приложений на AgavaSCADA/AgavaPLC, приведен на странице [[:Категория:AgavaSCADA/AgavaPLC|категории AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Разработка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Создание нового проекта ===&lt;br /&gt;
Создание нового проекта в среде разработки осуществляется с помощью команды «Создать проект…» в меню «Файл». После вызова данной команды откроется диалоговое окно создания нового проекта (см. Рисунок 1).&lt;br /&gt;
[[Файл:AgavaPLC-Создание проекта.png|мини|Рисунок 1 - Окно &amp;quot;Создание нового проекта&amp;quot;]]&lt;br /&gt;
Для создания проекта необходимо в списке типов проектов выбрать необходимый, ввести имя проекта и путь для его сохранения, после чего нажать кнопку «Создать проект».&lt;br /&gt;
&lt;br /&gt;
Доступны несколько типов проектов:&lt;br /&gt;
&lt;br /&gt;
* «Пустой проект» – пустой проект, не содержащий никаких узлов. Можно использвоать для создания произвольного проекта &amp;quot;с нуля&amp;quot;.&lt;br /&gt;
* «Локальный проект» – предварительно настроенный проект, содержащий необходимые подсистемы и предназначенный для реализации простой системы для одного устройства, при выборе данного типа пользователь имеет возможность выбрать нужные ему подсистемы и получить полностью рабочий проект в минимальной конфигурации.&lt;br /&gt;
* «Проект АГАВА МПР-60» - проект, предназначенный для исполнения на контроллере АГАВА МПР-60.&lt;br /&gt;
&lt;br /&gt;
=== Редактирование существующего проекта ===&lt;br /&gt;
Редактирование существующего проекта начинается с открытия файла проекта путем вызова команды «Открыть…» в меню «Файл». После загрузки файла в основном окне среды разработки будут отображены свойства и параметры проекта (см. Рисунок 2).&lt;br /&gt;
[[Файл:AgavaPLC-Основное окно среды разработки.png|мини|Рисунок 2 – Основное окно среды разработки AgavaPLC с загруженным проектом]]&lt;br /&gt;
По умолчанию основное окно среды разработки содержит перечисленные ниже части:&lt;br /&gt;
&lt;br /&gt;
# Строка заголовка приложения, панель меню и панель инструментов.&lt;br /&gt;
# Окно дерева проекта. Предоставляет доступ ко всей структуре проекта (см. раздел [[#Описание узлов]]).&lt;br /&gt;
# Окно свойств (см. раздел [[#Редактирование свойств узлов]] ).&lt;br /&gt;
# Область для отображения содержимого, например графического представления окна или задачи ПЛК.&lt;br /&gt;
# Область вспомогательных окон (окна наблюдения, ошибок и сообщений)&lt;br /&gt;
&lt;br /&gt;
После открытия проекта можно приступить к его редактированию.&lt;br /&gt;
&lt;br /&gt;
По завершению всех операций по редактированию необходимо выполнить проверку проекта на корректность с помощью команды «Проверить проект», расположенной в меню «Проект» (см. 6.1). &lt;br /&gt;
&lt;br /&gt;
=== Структура и состав проекта ===&lt;br /&gt;
Типичный проект содержит следующие части:&lt;br /&gt;
&lt;br /&gt;
* станция – важнейший объект, управляющий работой собственных подсистем и осуществляющий обмен данными с другими станциями;&lt;br /&gt;
* транспортная подсистема, выполняющая сбор данных с УСО;&lt;br /&gt;
* подсистема визуализации, обеспечивающая отображение информации в различных видах.&lt;br /&gt;
&lt;br /&gt;
Проект также может содержать следующие части:&lt;br /&gt;
&lt;br /&gt;
* подсистема архивирования, сохраняющая данные в БД для последующего извлечения и анализа;&lt;br /&gt;
* подсистема проверки прав пользователей, предназначенная для контроля доступа пользователя к объектам в режиме исполнения;&lt;br /&gt;
* подсистема тревог, предназначенная для оповещения пользователя об обнаруженных нарушениях;&lt;br /&gt;
* подсистема журналирования, выполняющая архивирование зарегистрированных событий в БД для последующего извлечения и анализа.&lt;br /&gt;
&lt;br /&gt;
Проект имеет древовидную структуру, вследствие чего все узлы связаны друг с другом. Узлы нижних уровней подчиняются узлам верхних уровней. К примеру, станции подчинены все подсистемы, а каждой подсистеме подчинены все узлы, которыми она управляет.&lt;br /&gt;
&lt;br /&gt;
Описание всех частей проекта и их узлов приведено в разделе 4.&lt;br /&gt;
&lt;br /&gt;
=== Разработка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC-Добавление узла в проект.png|мини|Рисунок 3 – Добавление узла в проект AgavaPLC]]&lt;br /&gt;
Перед началом разработки проекта рекомендуется проанализировать поставленную задачи и определить подсистемы, необходимые для её реализации. Взаимодействие с подсистемами осуществляется через дерево проекта (см. Рисунок 2), в которое добавляются нужные узлы. Для добавления нового узла, необходимо нажать правой кнопкой мыши на узел верхнего уровня, которому он подчинён, и выбрать в контекстном меню команду «Добавить узел».&lt;br /&gt;
&lt;br /&gt;
Основные части типовой программы и способы их реализации приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие с внешними устройствами ====&lt;br /&gt;
Реализуется через подсистему «Транспорты» в окне дерева проекта. Необходимо добавить в нее нужные протоколы, в зависимости от имеющейся конфигурации контроллера.&lt;br /&gt;
[[Файл:AgavaPLC-Транспорты.png|мини|Рисунок 4 - Транспорты в дереве проекта AgavaPLC]]&lt;br /&gt;
# Транспорт для обмена с субмодулями контроллера (для контроллеров с корзиной субмодулей). В качестве порта транспорта необходимо указать “/dev/ttyS0”. В проекте для МПР-60 присутствует по-умолчанию.&lt;br /&gt;
# Транспорт последовательный (для управления по RS-232, RS-485 и т.д.).&lt;br /&gt;
# Транспорт TCP/IP (для управления по Ethernet).&lt;br /&gt;
&lt;br /&gt;
К транспортам присоединяются либо регистры Modbus, либо субмодули. Для регистра задается адрес устройства, номер регистра, функция чтения/записи и другие параметры, при необходимости. Для субмодуля указывается слот, в котором он установлен, и тип аналоговых входов/выходов. &lt;br /&gt;
&lt;br /&gt;
==== Визуализация данных ====&lt;br /&gt;
Визуализация данных технологических процессов реализуется с помощью элементов подсистемы «Визуализация».&lt;br /&gt;
&lt;br /&gt;
Система визуализации недоступна в проектах для  контроллеров МПР.&lt;br /&gt;
[[Файл:AgavaPLC-Пример визуализации.png|мини|Рисунок 5 - Пример визуализации]]&lt;br /&gt;
Визуализация содержит одно или несколько окон, описанных ниже.&lt;br /&gt;
&lt;br /&gt;
# Форма, которая может использоваться как меню или панель инструментов. Также применяется в небольших проектах, в которых нет необходимости изменения выводимого набора виджетов.&lt;br /&gt;
# Окно с композицией, которое позволяет переключаться между различными экранами (например мнемосхемой, настройками, архивированием и т.д). Каждый из этих экранов реализуется на отдельной композиции.&lt;br /&gt;
&lt;br /&gt;
Процесс создания визуализации начинается с добавления нужных окон в группу «Окна» в дереве проекта. В том случае, если используется окно с композицией, необходимо задать ему отображаемую композицию по умолчанию, перед этим добавив ее в группу «Композиции». Созданные окна нужно добавить к одному фрейму, указав их в соответствующем свойстве фрейма.&lt;br /&gt;
&lt;br /&gt;
Редактирование содержимого окна или композиции осуществляется в его графическом представлении (см. раздел [[#Редактирование графического представления узла]]).&lt;br /&gt;
&lt;br /&gt;
Более подробное описание подсистемы визуализации приведено в разделе [[#Подсистема визуализации]].&lt;br /&gt;
&lt;br /&gt;
==== Пользовательские алгоритмы ====&lt;br /&gt;
Реализовать нужные алгоритмы работы программы можно с помощью различных инструментов, которые выбираются в зависимости от сложности проектов и навыков программиста:&lt;br /&gt;
&lt;br /&gt;
# Операции в группе «Сигналы» – отдельные логические операции. В основном используются для небольших проектов, не требующих сложных методов управления;&lt;br /&gt;
# Задачи ПЛК – графическое программирование с помощью связывания между собой различных функциональных блоков. Подходит для больших проектов. Реализуется в узле «Задача ПЛК» группы «Задачи». Подробное описание приведено в разделе [[#Задача ПЛК]]'''.'''&lt;br /&gt;
# Скрипты С++ – текстовое программирование на языке высокого уровня. Подходит для больших проектов. Реализуется с помощью операций «Скрипт С++», расположенных в группе «Сигналы» или в задаче ПЛК. Описание реализации языка С++ приведено на странице [[Описание языка С++ в AgavaPLC]].&lt;br /&gt;
=== Редактирование свойств узлов ===&lt;br /&gt;
Среда разработки обладает развитыми возможностями по редактированию свойств узлов. Описание доступных типов свойств приведно в статье [[Свойства узлов в AgavaPLC/AgavaSCADA]].&lt;br /&gt;
&lt;br /&gt;
==== Редактирование свойств узлов с помощью окна «Свойства» ====&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Свойства&amp;quot;.png|мини|Рисунок 6 – Окно «Свойства» виджета «Кнопка»]]&lt;br /&gt;
Редактирование свойств всех узлов осуществляется с помощью окна «Свойства».&lt;br /&gt;
&lt;br /&gt;
В окне «Свойства» в виде таблицы отображаются все доступные свойства узла, объединенные в группы. В левой колонке отображены наименования свойств, в правой отображены их значения. Свойства, недоступные для изменения, имеют наименование серого цвета. В нижней части окна расположена область подсказки, содержащая пояснение к выделенному свойству.&lt;br /&gt;
&lt;br /&gt;
===== Редактирование свойств группы узлов =====&lt;br /&gt;
В случае, когда необходимо изменить свойства у нескольких узлов, можно воспользоваться возможностью группового редактирования свойств. Для этого нужно выделить несколько узлов в дереве конфигурации либо на графическом представлении с помощью левой кнопки мыши и нажатой кнопки «Ctrl». При этом в окне свойств будут отображены только те свойства, что имеются у всех выделенных узлов. Далее можно изменить нужное свойство, при этом после завершения редактирования измененное значение будет установлено во всех выбранных узлах.&lt;br /&gt;
&lt;br /&gt;
==== Групповое редактирование свойств узлов ====&lt;br /&gt;
При необходимости редактирования разных свойств у большого количества узлов можно воспользоваться специальным окном «Список узлов».&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Список узлов&amp;quot;.png|мини|Рисунок 7 - Окно &amp;quot;Список узлов&amp;quot;]]&lt;br /&gt;
Открытие окна выполняется с помощью вызова команды «Открыть список узлов» в контекстном меню дерева конфигурации. Открытое окно содержит все узлы, вложенные в выбранные при вызове команды.&lt;br /&gt;
&lt;br /&gt;
Окно позволяет редактировать свойства непосредственно в ячейках таблицы, без переключения на окно «Свойства». Групповое редактирование свойств узлов через окно «Свойства» также доступно.&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на списке вызывает контекстное меню, содержащее команды:&lt;br /&gt;
&lt;br /&gt;
* “Свойства”;&lt;br /&gt;
* “Экспорт в *.txt”;&lt;br /&gt;
* “Импорт из *.txt”;&lt;br /&gt;
* “Удалить узел”.&lt;br /&gt;
&lt;br /&gt;
Команда «Свойства» открывает диалоговое окно выбора отображаемых свойств.&lt;br /&gt;
&lt;br /&gt;
Команды «Экспорт», «Импорт» выполняют экспорт списка свойств узлов в текстовый файл и импорт соответственно.&lt;br /&gt;
&lt;br /&gt;
Команда «Удалить узел» производит удаление выделенного узла (узлов).&lt;br /&gt;
&lt;br /&gt;
==== Функция групповой замены источников в узлах ====&lt;br /&gt;
При разработке сложных проектов может возникнуть необходимость заменить источники сразу в большом количестве узлов. Для этой цели используется функция групповой замены источников.  Необходимо перейти в редактирование свойств типа «Список источников», которое производится в соответствующем окне (см. Рисунок 8).&lt;br /&gt;
[[Файл:AgavaPLC-Окно редактирования свойств типа «Список источников».png|мини|Рисунок 8 - Окно редактирования свойств типа «Список источников»]]&lt;br /&gt;
Затем необходимо использовать функцию групповой замены (см. Рисунок 9), выделив нужные узлы, нажав на них правой кнопкой мыши и выбрав «Групповая замена».&lt;br /&gt;
[[Файл:AgavaPLC-Окно функции «Групповая замена».png|мини|Рисунок 9 - Окно функции «Групповая замена»]]&lt;br /&gt;
&lt;br /&gt;
=== Редактирование графического представления узла ===&lt;br /&gt;
Редактирование содержимого окон, слоев, форм, композиций и других элементов, предназначенных для отображения на экране, осуществляется в окне графического представления. Открытие окна возможно с помощью команды «Открыть графическое представление» в контекстном меню дерева конфигурации или двойного нажатия левой кнопки мыши для узлов следующих типов:&lt;br /&gt;
&lt;br /&gt;
* фрейм;&lt;br /&gt;
* форма;&lt;br /&gt;
* окно с композицией;&lt;br /&gt;
* слой.&lt;br /&gt;
&lt;br /&gt;
Открытое графическое представление выбранного узла может содержать все уже размещенные на нем элементы визуализации и (или) другие узлы и позволяет добавить новые.&lt;br /&gt;
[[Файл:AgavaPLC–Открытое графическое представление окна «winMain».png|мини|Рисунок 10 – Открытое графическое представление окна «winMain»]]&lt;br /&gt;
На рисунке 10 представлено графическое представление окна «winMain», обведенное пунктирной рамкой серого цвета, обозначающей внешнюю границу открытого узла. Тип рамки пользователь может выбрать по своему усмотрению, выбор производится в окне настроек среды разработки, доступном через команду «Настройки» в меню «Параметры».&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на пустом месте в открытом графическом представлении узла вызывает контекстное меню, содержащее команды удаления и вставки виджетов из буфера обмена, а также команды добавления новых виджетов доступных типов.&lt;br /&gt;
&lt;br /&gt;
Добавление новых виджетов также может осуществлять путем их перестаскивания в рабочую область из панели виджетов.&lt;br /&gt;
&lt;br /&gt;
Графическое представление позволяет перемещать выделенные виджеты кнопками перемещения курсора на клавиатуре, а также изменять их размеры кнопками перемещения курсора при нажатой кнопке Shift.&lt;br /&gt;
&lt;br /&gt;
==== Связывание источников и виджетов ====&lt;br /&gt;
Связывание виджетов и других узлов с источниками данных необходимо для того, чтобы виджеты или другие узлы могли отображать или обрабатывать значения, хранящиеся в источниках.&lt;br /&gt;
&lt;br /&gt;
Для связи виджетов с источниками данных можно воспользоваться обычным способом связывания через окно «Свойства». К примеру, связывание размещенного на форме виджета «Текстовая метка» с регистром Modbus осуществляется добавлением регистра Modbus в свойство виджета «Источник».&lt;br /&gt;
&lt;br /&gt;
Вместе с обычным способом связывания существует и другой, более быстрый способ. Для быстрого связывания регистра с виджетом достаточно нажать на регистр в дереве конфигурации левой кнопкой мыши и перенести его на виджет в открытом графическом представлении.&lt;br /&gt;
[[Файл:AgavaPLC–Связывание узла «sourceModbusRegister0» и виджета.png|мини|Рисунок 11 – Связывание узла «sourceModbusRegister0» и виджета]]&lt;br /&gt;
При помещении курсора над виджетом последний будет заштрихован сеткой зеленого или красного цвета, а курсор изменит свой вид на стрелку с квадратиком (см. рисунок 11).&lt;br /&gt;
&lt;br /&gt;
Зеленая штриховка виджета означает отсутствие связи выделенного виджета с источником данных, в этом случае связывание будет произведено. Красная штриховка говорит об ошибках связывания виджета и сигнала/источника.&lt;br /&gt;
&lt;br /&gt;
==== Редактирование многослойных композиций ====&lt;br /&gt;
Редактирование многослойных композиций принципиально не отличается от редактирования форм, кроме одного нюанса. Так как композиция может состоять из нескольких слоев, и виджеты на слоях могут располагаться один над другим, для использования наиболее удобного способа редактирования такой композиции можно воспользоваться возможностью открытия каждого слоя в отдельном окне.&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры композиции «Composition1», состоящей из трех слоев.png|мини|Рисунок 12 – Пример структуры композиции «Composition1», состоящей из трех слоев]]&lt;br /&gt;
Для открытия графического представления слоя нужно воспользоваться командой «Открыть графическое представление» аналогично открытию графического представления формы или композиции.&lt;br /&gt;
&lt;br /&gt;
Открыв одновременно композицию и слой, при редактировании слоя можно видеть, что содержимое композиции также изменяется и наоборот, при редактировании композиции изображение слоя будет изменяться.&lt;br /&gt;
&lt;br /&gt;
Слой обладает важным свойством «Прозрачность для действий». Данное свойство позволяет регулировать доступность виджетов, расположенных на нижележащих слоях, для действий пользователя. Например, если у верхнего слоя данное свойство выключено, то виджеты, расположенные на всех нижележащих слоях, будут недоступны для взаимодействия. Если же у верхнего слоя свойство включено, то виджеты нижележащего слоя будут доступны.&lt;br /&gt;
&lt;br /&gt;
==== Использование якорей ====&lt;br /&gt;
Данная возможность доступна с версии &amp;lt;code&amp;gt;AS 1.6.32+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При работе с графическими представлениями окон и композиций, содержащих большое количество виджетов, могут быть полезны якоря - создаваемые пользователем метки на размерных линейках.&lt;br /&gt;
[[Файл:AgavaPLC-Графическое представление-якоря.png|мини|AS 1.6.32+: Графическое представление формы с установленными якорями]]&lt;br /&gt;
Якоря позволяют контролировать положение групп виджетов благодаря связанным с ними линиям привязки. Линии привязки, позволяют быстрее выстраивать группы виджетов благодяря &amp;quot;прилипанию&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Создание якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Добавить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Удаление якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по якорю на размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Удалить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Созданные якоря можно перемещать по размерной линейке с помощью мыши.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение проекта ===&lt;br /&gt;
Для сохранения проекта на диск вызовите команду  «Файл-&amp;gt;Сохранить проект» или «Файл-&amp;gt;Сохранить проект как...», если необходимо сделать копию открытого проекта и продолжить работу в ней после сохранения.&lt;br /&gt;
&lt;br /&gt;
== Проверка и отладка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Эмуляция проекта ===&lt;br /&gt;
Проверить работоспособность проекта можно, не загружая его в контроллер. Для этого существует возможность запустить среду исполнения прямо на компьютере. &lt;br /&gt;
&lt;br /&gt;
Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Установить текущий проект как проект по умолчанию. Для этого необходимо вызвать команду &amp;quot;Проект-&amp;gt;Установить проект по умолчанию...&amp;quot;  и выбрать ранее сохраненный файл конфигурации.&lt;br /&gt;
# Запустить среду исполнения. Для этого нужно вызвать команду меню &amp;quot;Проект-&amp;gt;Запуск среды исполнения&amp;quot;. После этого будет выполнен запуск в новом окне среды исполнения.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг сигналов ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно &amp;quot;Наблюдение&amp;quot;.png|мини|Рисунок 14 – Окно &amp;quot;Наблюдение&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Наблюдение%22.png]]&lt;br /&gt;
Функция мониторинга сигналов позволяет наблюдать значения, хранящиеся в узлах проекта при исполнении проекта на целевом устройстве.&lt;br /&gt;
&lt;br /&gt;
Для запуска данной функции необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить среду исполнения.&lt;br /&gt;
# Вызвать команду меню «&amp;lt;code&amp;gt;Устройство → Подключение/отключение&amp;lt;/code&amp;gt;», в появившемся окне выбрать IP-адрес и порт устройства, значения узлов которого необходимо мониторить. При необходимости просмотра значений узлов и сигналов в режиме эмуляции проекта на персональном компьютере укажите адрес 127.0.0.1. Если необходимо просматривать значения узлов проекта, выполняющегося на контроллере или панели оператора, укажите IP-адрес контроллера или панели.&lt;br /&gt;
# Нажать кнопку «Подключение».&lt;br /&gt;
&lt;br /&gt;
Поле подключения к среде исполнения нужно добавить в окно &amp;quot;Наблюдение&amp;quot; узлы, значения которых необходимо наблюдать. Такие узлы должны иметь возможность чтения или записи значений – это регистры Modbus и другие узлы типа &amp;quot;Источник&amp;quot;, сигналы. &lt;br /&gt;
&lt;br /&gt;
Для добавления узлов в окно &amp;quot;Наблюдение&amp;quot; необходимо нажать на нужном узле в дереве проекта правой кнопкой мыши и выбрать команду «&amp;lt;code&amp;gt;Добавить в окно наблюдения&amp;lt;/code&amp;gt;». Выбранные узлы будут отображаться в окне «Наблюдение» вместе со считанными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг событий ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно просмотра событий.png|мини|Рисунок 15 – Окно просмотра событий]]Мониторинг событий позволяет наблюдать за исполнением проекта, работающего в устройстве. При включении мониторинга пользователь получает информацию о возникающих нефатальных ошибках и предупреждениях, возникающих в ходе исполнения проекта со следующими признаками:&lt;br /&gt;
&lt;br /&gt;
* метка времени, соответствующая времени возникновения события;&lt;br /&gt;
* степень важности события;&lt;br /&gt;
* тип события - информационное или события активирования, деактивирования и квитирования тревог;&lt;br /&gt;
* имя узла, сформировавшего событие.&lt;br /&gt;
* текст события.&lt;br /&gt;
&lt;br /&gt;
==== Использование мониторинга ====&lt;br /&gt;
Для старта мониторинга необходимо подключиться к нужному устройству способом, рассмотренным в разделе [[#Мониторинг сигналов]], а затем вызвать команду «&amp;lt;code&amp;gt;Устройство → Просмотр событий&amp;lt;/code&amp;gt;». В открывшемся окне будут выводиться все события, регистрируемые устройством. &lt;br /&gt;
&lt;br /&gt;
С помощью выпадающего списка в левом верхнем углу окна можно выбрать минимальный уровень выводимых событий.&lt;br /&gt;
&lt;br /&gt;
==== Фильтрация событий ====&lt;br /&gt;
''Функция доступна начиная с версии &amp;lt;code&amp;gt;AgavaSCADA/AgavaPLC 1.2.56+, 1.5.25+&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
В нижнем левом углу окна расположена область настройки фильтра событий, позволяющая фильтровать выводимые события по имени узла и тексту событий. При использовании фильтра возможно задание фильтра в виде:&lt;br /&gt;
&lt;br /&gt;
* простой строки, при этом в список попадают события, содержащие полное совпадение заданной строки; при задании строки возможно в(ы)ключение признака учета регистра символов в строке;&lt;br /&gt;
* регулярного выражения, при этом в список попадают события, удовлетворяющие введенное выражение. Правила составления регулярных выражений описаны на странице [[Использование регулярных выражений]].&lt;br /&gt;
&lt;br /&gt;
=== Отладка в задаче ПЛК ===&lt;br /&gt;
''Данный раздел актуален для версии &amp;lt;code&amp;gt;AS 1.2.61&amp;lt;/code&amp;gt; и старее. В версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt; используется [[Универсальная среда разработки Agava#Отладка проекта|современный пошаговый отладчик]].''&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК (см. раздел [[#Задача ПЛК]]) позволяет проводить тестирование проектов с помощью режима симулятора (на компьютере, без использования контроллера) или онлайн отладки (на контроллере).&lt;br /&gt;
&lt;br /&gt;
==== Управление отладкой ====&lt;br /&gt;
Управление режимом симуляции и онлайн отладкой осуществляется с помощью панели инструментов задачи ПЛК (см. рисунок 16).&lt;br /&gt;
&lt;br /&gt;
Панель инструментов содержит следующие элементы:&lt;br /&gt;
&lt;br /&gt;
* Кнопка «Запустить симуляцию».&lt;br /&gt;
* Кнопка «Сделать шаг на один цикл».&lt;br /&gt;
* Кнопка «Приостановить симуляцию» - ставит выполнение задачи на паузу.&lt;br /&gt;
* Кнопка «Остановить симуляцию» - сбрасывает состояние всех блоков к их состоянию по умолчанию.&lt;br /&gt;
* Список выбора периода выполнения задачи.&lt;br /&gt;
* Кнопка «Показать окно «Наблюдение».&lt;br /&gt;
&lt;br /&gt;
==== Режим симулятора ====&lt;br /&gt;
Режим симулятора позволяет провести тестирование работы алгоритмов проекта на компьютере. С помощью симуляции можно выявить ошибки в работе алгоритмов проекта до его загрузки в контроллер.&lt;br /&gt;
&lt;br /&gt;
Управление симуляцией осуществляется через команды на панели инструментов задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Для перехода в режим симуляции нажмите кнопку «Режим симулятора» на панели управления задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC-Панель инструментов задачи ПЛК.png|мини|Рисунок 16 - Панель инструментов задачи ПЛК]]&lt;br /&gt;
После активации режима симуляции, для изменения значения входа дважды щелкните на нем левой кнопкой мыши и выберите нужный тип и значение. Текущие значения всех блоков, в соответствии с работой программы, будут отображаться в реальном времени.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме симулятора.png|мини|Рисунок 17 – Вид блоков задачи в режиме симулятора]]&lt;br /&gt;
Для выхода из режима симуляции повторно нажмите кнопку «Режим симуляции» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
==== Онлайн отладка ====&lt;br /&gt;
Режим онлайн отладки позволяет провести тестирование проекта, загруженного и исполняемого в контроллере. Для перехода в режим онлайн отладки загрузите конфигурацию в контроллер, подключитесь к нему, после чего нажмите кнопку «Онлайн отладка» на панели инструментов задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме онлайн отладки.png|мини|Рисунок 18 – Вид блоков задачи в режиме онлайн отладки]]&lt;br /&gt;
На рисунке 18 изображен вид задачи ПЛК в режиме онлайн отладки проекта, запущенного на МПР-60 с установленными субмодулями DI (входы) и R (выходы).&lt;br /&gt;
&lt;br /&gt;
Для онлайн отладки на панели инструментов недоступны кнопка «Приостановить симуляцию» и список выбора периода.&lt;br /&gt;
&lt;br /&gt;
== Компиляция проекта ==&lt;br /&gt;
Перед загрузкой проекта в контроллер или запуском эмуляции проекта необходимо откомпилировать проект и получить файл конфигурации, предназначенный для исполнения средой исполнения, установленной в контроллере или на персональном компьютере (в случае разработки системы диспетчеризации). Для этого необходимо вызвать команду меню &amp;quot;Проект-&amp;gt;Сохранить конфигурацию&amp;quot;, выбрать папку проекта и нажать кнопку &amp;quot;Сохранить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Проверка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Ошибки».png|мини|Рисунок 19 – Окно «Ошибки»]]&lt;br /&gt;
Перед сохранением проекта желательно выполнить его проверку на наличие ошибок с помощью команды «Проект-&amp;gt;Проверить проект». После проверки обнаруженные ошибки будут отображены в окне «Ошибки».&lt;br /&gt;
&lt;br /&gt;
Если отображение окна «Ошибки» выключено, его можно включить командой «Вид-&amp;gt;Показать окно ошибок».&lt;br /&gt;
&lt;br /&gt;
Для облегчения исправления обнаруженных ошибок окно поддерживает выполнение некоторых команд над обнаруженными ошибками, вызывать которые можно из контекстного меню, отображаемого щелчком правой кнопки мыши на строке c ошибкой в окне. Контекстное меню позволяет вызывать команду «Показать узел в дереве конфигурации», выполняющую соответствующее действие.&lt;br /&gt;
&lt;br /&gt;
Также щелчок левой кнопкой мыши на строке с ошибкой открывает окно «Свойства» и дает возможность изменить в нем все свойства узла, содержащего ошибку.&lt;br /&gt;
&lt;br /&gt;
==== Установка пароля на файл конфигурации ====&lt;br /&gt;
[[Файл:AgavaPLC–Установка пароля.png|мини|Рисунок 13 – Установка пароля]]&lt;br /&gt;
Файл конфигурации, загружаемый в контроллер или панель оператора, можно защитить паролем, чтобы предотвратить его несанкционированное изменение.&lt;br /&gt;
&lt;br /&gt;
Для установки пароля на файл конфигурации необходимо выбрать в дереве проекта узел «Конфигурация» и отредактировать его свойство «Пароль». Допускается использование любых цифр, букв и спецсимволов.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем при открытии файла конфигурации в среде разработки будет появляться окно с запросом пароля.&lt;br /&gt;
&lt;br /&gt;
== Загрузка проекта в устройство ==&lt;br /&gt;
Загрузка проекта в целевое устройство может быть осуществлена несколькими способами:&lt;br /&gt;
&lt;br /&gt;
* загрузка из среды разработки;&lt;br /&gt;
* загрузка с помощью USB-Flash накопителя (для панелей оператора);&lt;br /&gt;
* загрузка через браузер (для МПР-60).&lt;br /&gt;
&lt;br /&gt;
=== Загрузка из среды разработки ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Загрузка проекта в устройство» после подключения к контроллеру.png|мини|Рисунок 20 – Окно «Загрузка проекта в устройство» после подключения к контроллеру]]&lt;br /&gt;
Для загрузки проекта из среды разработки необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Создайте файл конфигурации.&lt;br /&gt;
# Выполните подключение целевого устройства к ПК по сети Ethernet.&lt;br /&gt;
# После подключения вызовите в среде разработки команду «Проект-&amp;gt;Загрузка проекта в устройство».&lt;br /&gt;
# В открывшемся окне будет отображен список файлов проекта, доступных для загрузки в целевое устройство.&lt;br /&gt;
# Выберите необходимые файлы и нажмите кнопку «Загрузить». После нажатия кнопки начнется процесс загрузки файлов, при этом в нижней части окна будет меняться состояние полосы прогресса, а также для каждого файла в таблице будет отображен результат загрузки.&lt;br /&gt;
# После окончания загрузки среда исполнения в целевом устройстве будет перезапущена и загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через USB-Flash (для ПО-40 и ПО-50) ===&lt;br /&gt;
Для загрузки проекта в устройство с помощью USB-Flash накопителя необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Подготовьте USB-Flash накопитель, предварительно отформатировав его в файловую систему FAT32.&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив в корень USB-Flash накопителя.&lt;br /&gt;
# Перейдите в системную утилиту, перезагрузив панель оператора, при загрузке во время однократного звукового сигнала нажмите на экран и удерживайте до повторного звукового сигнала. Введите пароль: 111111.&lt;br /&gt;
# Перейдите на вкладку «Обновление», затем подключите USB-Flash накопитель через переходник USB-OTG, выберите из списка загрузочный архив, нажать кнопку «Обновить». Дождитесь сообщения «Обновление успешно» и нажмите кнопку «ОК».&lt;br /&gt;
# Перейдите на вкладку «Перезапуск» и нажмите кнопку «Перезапуск».&lt;br /&gt;
После перезагрузки панели загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через браузер (для МПР-60) ===&lt;br /&gt;
Для загрузки проекта через браузер необходимо произвести следующие действия в указанном порядке.&lt;br /&gt;
&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив.&lt;br /&gt;
# Откройте системную утилиту, введя IP-адрес контроллера в адресную строку браузера.&lt;br /&gt;
# Перейдите на вкладку «Загрузка ПО».  Рисунок 71 - Вкладка системной утилиты «Загрузка ПО»&lt;br /&gt;
# Выберите на компьютере архив с проектом, который необходимо загрузить в контроллер.&lt;br /&gt;
# Нажмите кнопку «Загрузить».&lt;br /&gt;
# Дождитесь окончания загрузки файла и обновления проекта.&lt;br /&gt;
&lt;br /&gt;
== Отладка проекта ==&lt;br /&gt;
''Данный функционал доступен в версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;. Для версий &amp;lt;code&amp;gt;AS 1.2&amp;lt;/code&amp;gt; используйте мониторинг, [[Универсальная среда разработки Agava#Отладка в задаче ПЛК|отладку в задачах ПЛК]].''&lt;br /&gt;
&lt;br /&gt;
=== Локальная отладка ===&lt;br /&gt;
&lt;br /&gt;
=== Удаленная отладка ===&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3464</id>
		<title>Универсальная среда разработки Agava</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3464"/>
		<updated>2026-03-27T06:35:25Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Загрузка через браузер (для МПР-60) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Универсальная среда разработки предназначена для создания и редактирования программного обеспечения для панелей оператора АГАВА ПО, многоканальных программируемых реле АГАВА МПР-60 и систем диспетчеризации на базе SCADA-системы AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Универсальная среда разработки Agava имеет удобный и эргономичный пользовательский интерфейс со всеми инструментами, необходимыми для создания эффективных проектов-приложений, предназначенных для исполнения на ПК, панелях оператора или персональных компьютерах.&lt;br /&gt;
&lt;br /&gt;
Среда разработки совмещает редакторы текста, редакторы визуальных представлений объектов, компоновщики структуры, средства связывания объектов и других частей проекта, анализаторы проекта в одном приложении и дает пользователю возможность ведения эффективной разработки проектов-приложений от начала и до завершения в одной программе, без использования разнородных приложений-утилит и необходимости переключения между ними.&lt;br /&gt;
&lt;br /&gt;
=== Версии программного обеспечения ===&lt;br /&gt;
{{Внимание|Текст=При использовании среды разработки совместно с панелями оператора АГАВА ПО или многоканальными программируемыми реле АГАВА МПР-60 необходимо использовать соответствующую версию среды разработки|Тип=Восклицание синий.png}}&lt;br /&gt;
Для определения подходящей версии среды разработки необходимо определить версию среды исполнения, установленной в панели оператора или реле. Тип и версия среды исполнения указаны в системной утилите прибора. Например, &amp;quot;AgavaPLC 1.1&amp;quot;, &amp;quot;AgavaPLC 1.2&amp;quot;  и т.д. Для использования со средой исполнения AgavaPLC 1.1 необходимо использовать среду разработки версии 1.1, для среды исполнения AgavaPLC 1.2 необходима среда разработки версии 1.2 и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные статьи и документы ===&lt;br /&gt;
*[[Узлы проекта AgavaSCADA/AgavaPLC|Описание узлов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Свойства узлов в AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Транспорты AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание языка С++ в AgavaPLC|Описание языка С++ в AgavaSCADA/AgavaPLC]].&amp;lt;!-- Комментарий --&amp;gt;.&lt;br /&gt;
*[[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Рекомендации по разработке приложений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
Полный перечень всех документов, связанных с разработкой приложений на AgavaSCADA/AgavaPLC, приведен на странице [[:Категория:AgavaSCADA/AgavaPLC|категории AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Разработка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Создание нового проекта ===&lt;br /&gt;
Создание нового проекта в среде разработки осуществляется с помощью команды «Создать проект…» в меню «Файл». После вызова данной команды откроется диалоговое окно создания нового проекта (см. Рисунок 1).&lt;br /&gt;
[[Файл:AgavaPLC-Создание проекта.png|мини|Рисунок 1 - Окно &amp;quot;Создание нового проекта&amp;quot;]]&lt;br /&gt;
Для создания проекта необходимо в списке типов проектов выбрать необходимый, ввести имя проекта и путь для его сохранения, после чего нажать кнопку «Создать проект».&lt;br /&gt;
&lt;br /&gt;
Доступны несколько типов проектов:&lt;br /&gt;
&lt;br /&gt;
* «Пустой проект» – пустой проект, не содержащий никаких узлов. Можно использвоать для создания произвольного проекта &amp;quot;с нуля&amp;quot;.&lt;br /&gt;
* «Локальный проект» – предварительно настроенный проект, содержащий необходимые подсистемы и предназначенный для реализации простой системы для одного устройства, при выборе данного типа пользователь имеет возможность выбрать нужные ему подсистемы и получить полностью рабочий проект в минимальной конфигурации.&lt;br /&gt;
* «Проект АГАВА МПР-60» - проект, предназначенный для исполнения на контроллере АГАВА МПР-60.&lt;br /&gt;
&lt;br /&gt;
=== Редактирование существующего проекта ===&lt;br /&gt;
Редактирование существующего проекта начинается с открытия файла проекта путем вызова команды «Открыть…» в меню «Файл». После загрузки файла в основном окне среды разработки будут отображены свойства и параметры проекта (см. Рисунок 2).&lt;br /&gt;
[[Файл:AgavaPLC-Основное окно среды разработки.png|мини|Рисунок 2 – Основное окно среды разработки AgavaPLC с загруженным проектом]]&lt;br /&gt;
По умолчанию основное окно среды разработки содержит перечисленные ниже части:&lt;br /&gt;
&lt;br /&gt;
# Строка заголовка приложения, панель меню и панель инструментов.&lt;br /&gt;
# Окно дерева проекта. Предоставляет доступ ко всей структуре проекта (см. раздел [[#Описание узлов]]).&lt;br /&gt;
# Окно свойств (см. раздел [[#Редактирование свойств узлов]] ).&lt;br /&gt;
# Область для отображения содержимого, например графического представления окна или задачи ПЛК.&lt;br /&gt;
# Область вспомогательных окон (окна наблюдения, ошибок и сообщений)&lt;br /&gt;
&lt;br /&gt;
После открытия проекта можно приступить к его редактированию.&lt;br /&gt;
&lt;br /&gt;
По завершению всех операций по редактированию необходимо выполнить проверку проекта на корректность с помощью команды «Проверить проект», расположенной в меню «Проект» (см. 6.1). &lt;br /&gt;
&lt;br /&gt;
=== Структура и состав проекта ===&lt;br /&gt;
Типичный проект содержит следующие части:&lt;br /&gt;
&lt;br /&gt;
* станция – важнейший объект, управляющий работой собственных подсистем и осуществляющий обмен данными с другими станциями;&lt;br /&gt;
* транспортная подсистема, выполняющая сбор данных с УСО;&lt;br /&gt;
* подсистема визуализации, обеспечивающая отображение информации в различных видах.&lt;br /&gt;
&lt;br /&gt;
Проект также может содержать следующие части:&lt;br /&gt;
&lt;br /&gt;
* подсистема архивирования, сохраняющая данные в БД для последующего извлечения и анализа;&lt;br /&gt;
* подсистема проверки прав пользователей, предназначенная для контроля доступа пользователя к объектам в режиме исполнения;&lt;br /&gt;
* подсистема тревог, предназначенная для оповещения пользователя об обнаруженных нарушениях;&lt;br /&gt;
* подсистема журналирования, выполняющая архивирование зарегистрированных событий в БД для последующего извлечения и анализа.&lt;br /&gt;
&lt;br /&gt;
Проект имеет древовидную структуру, вследствие чего все узлы связаны друг с другом. Узлы нижних уровней подчиняются узлам верхних уровней. К примеру, станции подчинены все подсистемы, а каждой подсистеме подчинены все узлы, которыми она управляет.&lt;br /&gt;
&lt;br /&gt;
Описание всех частей проекта и их узлов приведено в разделе 4.&lt;br /&gt;
&lt;br /&gt;
=== Разработка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC-Добавление узла в проект.png|мини|Рисунок 3 – Добавление узла в проект AgavaPLC]]&lt;br /&gt;
Перед началом разработки проекта рекомендуется проанализировать поставленную задачи и определить подсистемы, необходимые для её реализации. Взаимодействие с подсистемами осуществляется через дерево проекта (см. Рисунок 2), в которое добавляются нужные узлы. Для добавления нового узла, необходимо нажать правой кнопкой мыши на узел верхнего уровня, которому он подчинён, и выбрать в контекстном меню команду «Добавить узел».&lt;br /&gt;
&lt;br /&gt;
Основные части типовой программы и способы их реализации приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие с внешними устройствами ====&lt;br /&gt;
Реализуется через подсистему «Транспорты» в окне дерева проекта. Необходимо добавить в нее нужные протоколы, в зависимости от имеющейся конфигурации контроллера.&lt;br /&gt;
[[Файл:AgavaPLC-Транспорты.png|мини|Рисунок 4 - Транспорты в дереве проекта AgavaPLC]]&lt;br /&gt;
# Транспорт для обмена с субмодулями контроллера (для контроллеров с корзиной субмодулей). В качестве порта транспорта необходимо указать “/dev/ttyS0”. В проекте для МПР-60 присутствует по-умолчанию.&lt;br /&gt;
# Транспорт последовательный (для управления по RS-232, RS-485 и т.д.).&lt;br /&gt;
# Транспорт TCP/IP (для управления по Ethernet).&lt;br /&gt;
&lt;br /&gt;
К транспортам присоединяются либо регистры Modbus, либо субмодули. Для регистра задается адрес устройства, номер регистра, функция чтения/записи и другие параметры, при необходимости. Для субмодуля указывается слот, в котором он установлен, и тип аналоговых входов/выходов. &lt;br /&gt;
&lt;br /&gt;
==== Визуализация данных ====&lt;br /&gt;
Визуализация данных технологических процессов реализуется с помощью элементов подсистемы «Визуализация».&lt;br /&gt;
&lt;br /&gt;
Система визуализации недоступна в проектах для  контроллеров МПР.&lt;br /&gt;
[[Файл:AgavaPLC-Пример визуализации.png|мини|Рисунок 5 - Пример визуализации]]&lt;br /&gt;
Визуализация содержит одно или несколько окон, описанных ниже.&lt;br /&gt;
&lt;br /&gt;
# Форма, которая может использоваться как меню или панель инструментов. Также применяется в небольших проектах, в которых нет необходимости изменения выводимого набора виджетов.&lt;br /&gt;
# Окно с композицией, которое позволяет переключаться между различными экранами (например мнемосхемой, настройками, архивированием и т.д). Каждый из этих экранов реализуется на отдельной композиции.&lt;br /&gt;
&lt;br /&gt;
Процесс создания визуализации начинается с добавления нужных окон в группу «Окна» в дереве проекта. В том случае, если используется окно с композицией, необходимо задать ему отображаемую композицию по умолчанию, перед этим добавив ее в группу «Композиции». Созданные окна нужно добавить к одному фрейму, указав их в соответствующем свойстве фрейма.&lt;br /&gt;
&lt;br /&gt;
Редактирование содержимого окна или композиции осуществляется в его графическом представлении (см. раздел [[#Редактирование графического представления узла]]).&lt;br /&gt;
&lt;br /&gt;
Более подробное описание подсистемы визуализации приведено в разделе [[#Подсистема визуализации]].&lt;br /&gt;
&lt;br /&gt;
==== Пользовательские алгоритмы ====&lt;br /&gt;
Реализовать нужные алгоритмы работы программы можно с помощью различных инструментов, которые выбираются в зависимости от сложности проектов и навыков программиста:&lt;br /&gt;
&lt;br /&gt;
# Операции в группе «Сигналы» – отдельные логические операции. В основном используются для небольших проектов, не требующих сложных методов управления;&lt;br /&gt;
# Задачи ПЛК – графическое программирование с помощью связывания между собой различных функциональных блоков. Подходит для больших проектов. Реализуется в узле «Задача ПЛК» группы «Задачи». Подробное описание приведено в разделе [[#Задача ПЛК]]'''.'''&lt;br /&gt;
# Скрипты С++ – текстовое программирование на языке высокого уровня. Подходит для больших проектов. Реализуется с помощью операций «Скрипт С++», расположенных в группе «Сигналы» или в задаче ПЛК. Описание реализации языка С++ приведено на странице [[Описание языка С++ в AgavaPLC]].&lt;br /&gt;
=== Редактирование свойств узлов ===&lt;br /&gt;
Среда разработки обладает развитыми возможностями по редактированию свойств узлов. Описание доступных типов свойств приведно в статье [[Свойства узлов в AgavaPLC/AgavaSCADA]].&lt;br /&gt;
&lt;br /&gt;
==== Редактирование свойств узлов с помощью окна «Свойства» ====&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Свойства&amp;quot;.png|мини|Рисунок 6 – Окно «Свойства» виджета «Кнопка»]]&lt;br /&gt;
Редактирование свойств всех узлов осуществляется с помощью окна «Свойства».&lt;br /&gt;
&lt;br /&gt;
В окне «Свойства» в виде таблицы отображаются все доступные свойства узла, объединенные в группы. В левой колонке отображены наименования свойств, в правой отображены их значения. Свойства, недоступные для изменения, имеют наименование серого цвета. В нижней части окна расположена область подсказки, содержащая пояснение к выделенному свойству.&lt;br /&gt;
&lt;br /&gt;
===== Редактирование свойств группы узлов =====&lt;br /&gt;
В случае, когда необходимо изменить свойства у нескольких узлов, можно воспользоваться возможностью группового редактирования свойств. Для этого нужно выделить несколько узлов в дереве конфигурации либо на графическом представлении с помощью левой кнопки мыши и нажатой кнопки «Ctrl». При этом в окне свойств будут отображены только те свойства, что имеются у всех выделенных узлов. Далее можно изменить нужное свойство, при этом после завершения редактирования измененное значение будет установлено во всех выбранных узлах.&lt;br /&gt;
&lt;br /&gt;
==== Групповое редактирование свойств узлов ====&lt;br /&gt;
При необходимости редактирования разных свойств у большого количества узлов можно воспользоваться специальным окном «Список узлов».&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Список узлов&amp;quot;.png|мини|Рисунок 7 - Окно &amp;quot;Список узлов&amp;quot;]]&lt;br /&gt;
Открытие окна выполняется с помощью вызова команды «Открыть список узлов» в контекстном меню дерева конфигурации. Открытое окно содержит все узлы, вложенные в выбранные при вызове команды.&lt;br /&gt;
&lt;br /&gt;
Окно позволяет редактировать свойства непосредственно в ячейках таблицы, без переключения на окно «Свойства». Групповое редактирование свойств узлов через окно «Свойства» также доступно.&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на списке вызывает контекстное меню, содержащее команды:&lt;br /&gt;
&lt;br /&gt;
* “Свойства”;&lt;br /&gt;
* “Экспорт в *.txt”;&lt;br /&gt;
* “Импорт из *.txt”;&lt;br /&gt;
* “Удалить узел”.&lt;br /&gt;
&lt;br /&gt;
Команда «Свойства» открывает диалоговое окно выбора отображаемых свойств.&lt;br /&gt;
&lt;br /&gt;
Команды «Экспорт», «Импорт» выполняют экспорт списка свойств узлов в текстовый файл и импорт соответственно.&lt;br /&gt;
&lt;br /&gt;
Команда «Удалить узел» производит удаление выделенного узла (узлов).&lt;br /&gt;
&lt;br /&gt;
==== Функция групповой замены источников в узлах ====&lt;br /&gt;
При разработке сложных проектов может возникнуть необходимость заменить источники сразу в большом количестве узлов. Для этой цели используется функция групповой замены источников.  Необходимо перейти в редактирование свойств типа «Список источников», которое производится в соответствующем окне (см. Рисунок 8).&lt;br /&gt;
[[Файл:AgavaPLC-Окно редактирования свойств типа «Список источников».png|мини|Рисунок 8 - Окно редактирования свойств типа «Список источников»]]&lt;br /&gt;
Затем необходимо использовать функцию групповой замены (см. Рисунок 9), выделив нужные узлы, нажав на них правой кнопкой мыши и выбрав «Групповая замена».&lt;br /&gt;
[[Файл:AgavaPLC-Окно функции «Групповая замена».png|мини|Рисунок 9 - Окно функции «Групповая замена»]]&lt;br /&gt;
&lt;br /&gt;
=== Редактирование графического представления узла ===&lt;br /&gt;
Редактирование содержимого окон, слоев, форм, композиций и других элементов, предназначенных для отображения на экране, осуществляется в окне графического представления. Открытие окна возможно с помощью команды «Открыть графическое представление» в контекстном меню дерева конфигурации или двойного нажатия левой кнопки мыши для узлов следующих типов:&lt;br /&gt;
&lt;br /&gt;
* фрейм;&lt;br /&gt;
* форма;&lt;br /&gt;
* окно с композицией;&lt;br /&gt;
* слой.&lt;br /&gt;
&lt;br /&gt;
Открытое графическое представление выбранного узла может содержать все уже размещенные на нем элементы визуализации и (или) другие узлы и позволяет добавить новые.&lt;br /&gt;
[[Файл:AgavaPLC–Открытое графическое представление окна «winMain».png|мини|Рисунок 10 – Открытое графическое представление окна «winMain»]]&lt;br /&gt;
На рисунке 10 представлено графическое представление окна «winMain», обведенное пунктирной рамкой серого цвета, обозначающей внешнюю границу открытого узла. Тип рамки пользователь может выбрать по своему усмотрению, выбор производится в окне настроек среды разработки, доступном через команду «Настройки» в меню «Параметры».&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на пустом месте в открытом графическом представлении узла вызывает контекстное меню, содержащее команды удаления и вставки виджетов из буфера обмена, а также команды добавления новых виджетов доступных типов.&lt;br /&gt;
&lt;br /&gt;
Добавление новых виджетов также может осуществлять путем их перестаскивания в рабочую область из панели виджетов.&lt;br /&gt;
&lt;br /&gt;
Графическое представление позволяет перемещать выделенные виджеты кнопками перемещения курсора на клавиатуре, а также изменять их размеры кнопками перемещения курсора при нажатой кнопке Shift.&lt;br /&gt;
&lt;br /&gt;
==== Связывание источников и виджетов ====&lt;br /&gt;
Связывание виджетов и других узлов с источниками данных необходимо для того, чтобы виджеты или другие узлы могли отображать или обрабатывать значения, хранящиеся в источниках.&lt;br /&gt;
&lt;br /&gt;
Для связи виджетов с источниками данных можно воспользоваться обычным способом связывания через окно «Свойства». К примеру, связывание размещенного на форме виджета «Текстовая метка» с регистром Modbus осуществляется добавлением регистра Modbus в свойство виджета «Источник».&lt;br /&gt;
&lt;br /&gt;
Вместе с обычным способом связывания существует и другой, более быстрый способ. Для быстрого связывания регистра с виджетом достаточно нажать на регистр в дереве конфигурации левой кнопкой мыши и перенести его на виджет в открытом графическом представлении.&lt;br /&gt;
[[Файл:AgavaPLC–Связывание узла «sourceModbusRegister0» и виджета.png|мини|Рисунок 11 – Связывание узла «sourceModbusRegister0» и виджета]]&lt;br /&gt;
При помещении курсора над виджетом последний будет заштрихован сеткой зеленого или красного цвета, а курсор изменит свой вид на стрелку с квадратиком (см. рисунок 11).&lt;br /&gt;
&lt;br /&gt;
Зеленая штриховка виджета означает отсутствие связи выделенного виджета с источником данных, в этом случае связывание будет произведено. Красная штриховка говорит об ошибках связывания виджета и сигнала/источника.&lt;br /&gt;
&lt;br /&gt;
==== Редактирование многослойных композиций ====&lt;br /&gt;
Редактирование многослойных композиций принципиально не отличается от редактирования форм, кроме одного нюанса. Так как композиция может состоять из нескольких слоев, и виджеты на слоях могут располагаться один над другим, для использования наиболее удобного способа редактирования такой композиции можно воспользоваться возможностью открытия каждого слоя в отдельном окне.&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры композиции «Composition1», состоящей из трех слоев.png|мини|Рисунок 12 – Пример структуры композиции «Composition1», состоящей из трех слоев]]&lt;br /&gt;
Для открытия графического представления слоя нужно воспользоваться командой «Открыть графическое представление» аналогично открытию графического представления формы или композиции.&lt;br /&gt;
&lt;br /&gt;
Открыв одновременно композицию и слой, при редактировании слоя можно видеть, что содержимое композиции также изменяется и наоборот, при редактировании композиции изображение слоя будет изменяться.&lt;br /&gt;
&lt;br /&gt;
Слой обладает важным свойством «Прозрачность для действий». Данное свойство позволяет регулировать доступность виджетов, расположенных на нижележащих слоях, для действий пользователя. Например, если у верхнего слоя данное свойство выключено, то виджеты, расположенные на всех нижележащих слоях, будут недоступны для взаимодействия. Если же у верхнего слоя свойство включено, то виджеты нижележащего слоя будут доступны.&lt;br /&gt;
&lt;br /&gt;
==== Использование якорей ====&lt;br /&gt;
Данная возможность доступна с версии &amp;lt;code&amp;gt;AS 1.6.32+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При работе с графическими представлениями окон и композиций, содержащих большое количество виджетов, могут быть полезны якоря - создаваемые пользователем метки на размерных линейках.&lt;br /&gt;
[[Файл:AgavaPLC-Графическое представление-якоря.png|мини|AS 1.6.32+: Графическое представление формы с установленными якорями]]&lt;br /&gt;
Якоря позволяют контролировать положение групп виджетов благодаря связанным с ними линиям привязки. Линии привязки, позволяют быстрее выстраивать группы виджетов благодяря &amp;quot;прилипанию&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Создание якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Добавить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Удаление якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по якорю на размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Удалить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Созданные якоря можно перемещать по размерной линейке с помощью мыши.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение проекта ===&lt;br /&gt;
Для сохранения проекта на диск вызовите команду  «Файл-&amp;gt;Сохранить проект» или «Файл-&amp;gt;Сохранить проект как...», если необходимо сделать копию открытого проекта и продолжить работу в ней после сохранения.&lt;br /&gt;
&lt;br /&gt;
== Проверка и отладка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Эмуляция проекта ===&lt;br /&gt;
Проверить работоспособность проекта можно, не загружая его в контроллер. Для этого существует возможность запустить среду исполнения прямо на компьютере. &lt;br /&gt;
&lt;br /&gt;
Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Установить текущий проект как проект по умолчанию. Для этого необходимо вызвать команду &amp;quot;Проект-&amp;gt;Установить проект по умолчанию...&amp;quot;  и выбрать ранее сохраненный файл конфигурации.&lt;br /&gt;
# Запустить среду исполнения. Для этого нужно вызвать команду меню &amp;quot;Проект-&amp;gt;Запуск среды исполнения&amp;quot;. После этого будет выполнен запуск в новом окне среды исполнения.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг сигналов ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно &amp;quot;Наблюдение&amp;quot;.png|мини|Рисунок 14 – Окно &amp;quot;Наблюдение&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Наблюдение%22.png]]&lt;br /&gt;
Функция мониторинга сигналов позволяет наблюдать значения, хранящиеся в узлах проекта при исполнении проекта на целевом устройстве.&lt;br /&gt;
&lt;br /&gt;
Для запуска данной функции необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить среду исполнения.&lt;br /&gt;
# Вызвать команду меню «&amp;lt;code&amp;gt;Устройство → Подключение/отключение&amp;lt;/code&amp;gt;», в появившемся окне выбрать IP-адрес и порт устройства, значения узлов которого необходимо мониторить. При необходимости просмотра значений узлов и сигналов в режиме эмуляции проекта на персональном компьютере укажите адрес 127.0.0.1. Если необходимо просматривать значения узлов проекта, выполняющегося на контроллере или панели оператора, укажите IP-адрес контроллера или панели.&lt;br /&gt;
# Нажать кнопку «Подключение».&lt;br /&gt;
&lt;br /&gt;
Поле подключения к среде исполнения нужно добавить в окно &amp;quot;Наблюдение&amp;quot; узлы, значения которых необходимо наблюдать. Такие узлы должны иметь возможность чтения или записи значений – это регистры Modbus и другие узлы типа &amp;quot;Источник&amp;quot;, сигналы. &lt;br /&gt;
&lt;br /&gt;
Для добавления узлов в окно &amp;quot;Наблюдение&amp;quot; необходимо нажать на нужном узле в дереве проекта правой кнопкой мыши и выбрать команду «&amp;lt;code&amp;gt;Добавить в окно наблюдения&amp;lt;/code&amp;gt;». Выбранные узлы будут отображаться в окне «Наблюдение» вместе со считанными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг событий ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно просмотра событий.png|мини|Рисунок 15 – Окно просмотра событий]]Мониторинг событий позволяет наблюдать за исполнением проекта, работающего в устройстве. При включении мониторинга пользователь получает информацию о возникающих нефатальных ошибках и предупреждениях, возникающих в ходе исполнения проекта со следующими признаками:&lt;br /&gt;
&lt;br /&gt;
* метка времени, соответствующая времени возникновения события;&lt;br /&gt;
* степень важности события;&lt;br /&gt;
* тип события - информационное или события активирования, деактивирования и квитирования тревог;&lt;br /&gt;
* имя узла, сформировавшего событие.&lt;br /&gt;
* текст события.&lt;br /&gt;
&lt;br /&gt;
==== Использование мониторинга ====&lt;br /&gt;
Для старта мониторинга необходимо подключиться к нужному устройству способом, рассмотренным в разделе [[#Мониторинг сигналов]], а затем вызвать команду «&amp;lt;code&amp;gt;Устройство → Просмотр событий&amp;lt;/code&amp;gt;». В открывшемся окне будут выводиться все события, регистрируемые устройством. &lt;br /&gt;
&lt;br /&gt;
С помощью выпадающего списка в левом верхнем углу окна можно выбрать минимальный уровень выводимых событий.&lt;br /&gt;
&lt;br /&gt;
==== Фильтрация событий ====&lt;br /&gt;
''Функция доступна начиная с версии &amp;lt;code&amp;gt;AgavaSCADA/AgavaPLC 1.2.56+, 1.5.25+&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
В нижнем левом углу окна расположена область настройки фильтра событий, позволяющая фильтровать выводимые события по имени узла и тексту событий. При использовании фильтра возможно задание фильтра в виде:&lt;br /&gt;
&lt;br /&gt;
* простой строки, при этом в список попадают события, содержащие полное совпадение заданной строки; при задании строки возможно в(ы)ключение признака учета регистра символов в строке;&lt;br /&gt;
* регулярного выражения, при этом в список попадают события, удовлетворяющие введенное выражение. Правила составления регулярных выражений описаны на странице [[Использование регулярных выражений]].&lt;br /&gt;
&lt;br /&gt;
=== Отладка в задаче ПЛК ===&lt;br /&gt;
''Данный раздел актуален для версии &amp;lt;code&amp;gt;AS 1.2.61&amp;lt;/code&amp;gt; и старее. В версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt; используется другой, пошаговый отладчик.''&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК (см. раздел [[#Задача ПЛК]]) позволяет проводить тестирование проектов с помощью режима симулятора (на компьютере, без использования контроллера) или онлайн отладки (на контроллере).&lt;br /&gt;
&lt;br /&gt;
==== Управление отладкой ====&lt;br /&gt;
Управление режимом симуляции и онлайн отладкой осуществляется с помощью панели инструментов задачи ПЛК (см. рисунок 16).&lt;br /&gt;
&lt;br /&gt;
Панель инструментов содержит следующие элементы:&lt;br /&gt;
&lt;br /&gt;
* Кнопка «Запустить симуляцию».&lt;br /&gt;
* Кнопка «Сделать шаг на один цикл».&lt;br /&gt;
* Кнопка «Приостановить симуляцию» - ставит выполнение задачи на паузу.&lt;br /&gt;
* Кнопка «Остановить симуляцию» - сбрасывает состояние всех блоков к их состоянию по умолчанию.&lt;br /&gt;
* Список выбора периода выполнения задачи.&lt;br /&gt;
* Кнопка «Показать окно «Наблюдение».&lt;br /&gt;
&lt;br /&gt;
==== Режим симулятора ====&lt;br /&gt;
Режим симулятора позволяет провести тестирование работы алгоритмов проекта на компьютере. С помощью симуляции можно выявить ошибки в работе алгоритмов проекта до его загрузки в контроллер.&lt;br /&gt;
&lt;br /&gt;
Управление симуляцией осуществляется через команды на панели инструментов задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Для перехода в режим симуляции нажмите кнопку «Режим симулятора» на панели управления задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC-Панель инструментов задачи ПЛК.png|мини|Рисунок 16 - Панель инструментов задачи ПЛК]]&lt;br /&gt;
После активации режима симуляции, для изменения значения входа дважды щелкните на нем левой кнопкой мыши и выберите нужный тип и значение. Текущие значения всех блоков, в соответствии с работой программы, будут отображаться в реальном времени.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме симулятора.png|мини|Рисунок 17 – Вид блоков задачи в режиме симулятора]]&lt;br /&gt;
Для выхода из режима симуляции повторно нажмите кнопку «Режим симуляции» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
==== Онлайн отладка ====&lt;br /&gt;
Режим онлайн отладки позволяет провести тестирование проекта, загруженного и исполняемого в контроллере. Для перехода в режим онлайн отладки загрузите конфигурацию в контроллер, подключитесь к нему, после чего нажмите кнопку «Онлайн отладка» на панели инструментов задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме онлайн отладки.png|мини|Рисунок 18 – Вид блоков задачи в режиме онлайн отладки]]&lt;br /&gt;
На рисунке 18 изображен вид задачи ПЛК в режиме онлайн отладки проекта, запущенного на МПР-60 с установленными субмодулями DI (входы) и R (выходы).&lt;br /&gt;
&lt;br /&gt;
Для онлайн отладки на панели инструментов недоступны кнопка «Приостановить симуляцию» и список выбора периода.&lt;br /&gt;
&lt;br /&gt;
== Компиляция проекта ==&lt;br /&gt;
Перед загрузкой проекта в контроллер или запуском эмуляции проекта необходимо откомпилировать проект и получить файл конфигурации, предназначенный для исполнения средой исполнения, установленной в контроллере или на персональном компьютере (в случае разработки системы диспетчеризации). Для этого необходимо вызвать команду меню &amp;quot;Проект-&amp;gt;Сохранить конфигурацию&amp;quot;, выбрать папку проекта и нажать кнопку &amp;quot;Сохранить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Проверка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Ошибки».png|мини|Рисунок 19 – Окно «Ошибки»]]&lt;br /&gt;
Перед сохранением проекта желательно выполнить его проверку на наличие ошибок с помощью команды «Проект-&amp;gt;Проверить проект». После проверки обнаруженные ошибки будут отображены в окне «Ошибки».&lt;br /&gt;
&lt;br /&gt;
Если отображение окна «Ошибки» выключено, его можно включить командой «Вид-&amp;gt;Показать окно ошибок».&lt;br /&gt;
&lt;br /&gt;
Для облегчения исправления обнаруженных ошибок окно поддерживает выполнение некоторых команд над обнаруженными ошибками, вызывать которые можно из контекстного меню, отображаемого щелчком правой кнопки мыши на строке c ошибкой в окне. Контекстное меню позволяет вызывать команду «Показать узел в дереве конфигурации», выполняющую соответствующее действие.&lt;br /&gt;
&lt;br /&gt;
Также щелчок левой кнопкой мыши на строке с ошибкой открывает окно «Свойства» и дает возможность изменить в нем все свойства узла, содержащего ошибку.&lt;br /&gt;
&lt;br /&gt;
==== Установка пароля на файл конфигурации ====&lt;br /&gt;
[[Файл:AgavaPLC–Установка пароля.png|мини|Рисунок 13 – Установка пароля]]&lt;br /&gt;
Файл конфигурации, загружаемый в контроллер или панель оператора, можно защитить паролем, чтобы предотвратить его несанкционированное изменение.&lt;br /&gt;
&lt;br /&gt;
Для установки пароля на файл конфигурации необходимо выбрать в дереве проекта узел «Конфигурация» и отредактировать его свойство «Пароль». Допускается использование любых цифр, букв и спецсимволов.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем при открытии файла конфигурации в среде разработки будет появляться окно с запросом пароля.&lt;br /&gt;
&lt;br /&gt;
== Загрузка проекта в устройство ==&lt;br /&gt;
Загрузка проекта в целевое устройство может быть осуществлена несколькими способами:&lt;br /&gt;
&lt;br /&gt;
* загрузка из среды разработки;&lt;br /&gt;
* загрузка с помощью USB-Flash накопителя (для панелей оператора);&lt;br /&gt;
* загрузка через браузер (для МПР-60).&lt;br /&gt;
&lt;br /&gt;
=== Загрузка из среды разработки ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Загрузка проекта в устройство» после подключения к контроллеру.png|мини|Рисунок 20 – Окно «Загрузка проекта в устройство» после подключения к контроллеру]]&lt;br /&gt;
Для загрузки проекта из среды разработки необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Создайте файл конфигурации.&lt;br /&gt;
# Выполните подключение целевого устройства к ПК по сети Ethernet.&lt;br /&gt;
# После подключения вызовите в среде разработки команду «Проект-&amp;gt;Загрузка проекта в устройство».&lt;br /&gt;
# В открывшемся окне будет отображен список файлов проекта, доступных для загрузки в целевое устройство.&lt;br /&gt;
# Выберите необходимые файлы и нажмите кнопку «Загрузить». После нажатия кнопки начнется процесс загрузки файлов, при этом в нижней части окна будет меняться состояние полосы прогресса, а также для каждого файла в таблице будет отображен результат загрузки.&lt;br /&gt;
# После окончания загрузки среда исполнения в целевом устройстве будет перезапущена и загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через USB-Flash (для ПО-40 и ПО-50) ===&lt;br /&gt;
Для загрузки проекта в устройство с помощью USB-Flash накопителя необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Подготовьте USB-Flash накопитель, предварительно отформатировав его в файловую систему FAT32.&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив в корень USB-Flash накопителя.&lt;br /&gt;
# Перейдите в системную утилиту, перезагрузив панель оператора, при загрузке во время однократного звукового сигнала нажмите на экран и удерживайте до повторного звукового сигнала. Введите пароль: 111111.&lt;br /&gt;
# Перейдите на вкладку «Обновление», затем подключите USB-Flash накопитель через переходник USB-OTG, выберите из списка загрузочный архив, нажать кнопку «Обновить». Дождитесь сообщения «Обновление успешно» и нажмите кнопку «ОК».&lt;br /&gt;
# Перейдите на вкладку «Перезапуск» и нажмите кнопку «Перезапуск».&lt;br /&gt;
После перезагрузки панели загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через браузер (для МПР-60) ===&lt;br /&gt;
Для загрузки проекта через браузер необходимо произвести следующие действия в указанном порядке.&lt;br /&gt;
&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив.&lt;br /&gt;
# Откройте системную утилиту, введя IP-адрес контроллера в адресную строку браузера.&lt;br /&gt;
# Перейдите на вкладку «Загрузка ПО».  Рисунок 71 - Вкладка системной утилиты «Загрузка ПО»&lt;br /&gt;
# Выберите на компьютере архив с проектом, который необходимо загрузить в контроллер.&lt;br /&gt;
# Нажмите кнопку «Загрузить».&lt;br /&gt;
# Дождитесь окончания загрузки файла и обновления проекта.&lt;br /&gt;
&lt;br /&gt;
== Отладка проекта ==&lt;br /&gt;
''Данный функционал доступен в версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt;. Для версий &amp;lt;code&amp;gt;AS 1.2&amp;lt;/code&amp;gt; используйте мониторинг, [[Универсальная среда разработки Agava#Отладка в задаче ПЛК|отладку в задачах ПЛК]].''&lt;br /&gt;
&lt;br /&gt;
=== Локальная отладка ===&lt;br /&gt;
&lt;br /&gt;
=== Удаленная отладка ===&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
	<entry>
		<id>https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3463</id>
		<title>Универсальная среда разработки Agava</title>
		<link rel="alternate" type="text/html" href="https://docs.kb-agava.ru/index.php?title=%D0%A3%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_Agava&amp;diff=3463"/>
		<updated>2026-03-27T06:31:17Z</updated>

		<summary type="html">&lt;p&gt;TaushkanovKV: /* Отладка в задаче ПЛК */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Универсальная среда разработки предназначена для создания и редактирования программного обеспечения для панелей оператора АГАВА ПО, многоканальных программируемых реле АГАВА МПР-60 и систем диспетчеризации на базе SCADA-системы AgavaSCADA.&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
Универсальная среда разработки Agava имеет удобный и эргономичный пользовательский интерфейс со всеми инструментами, необходимыми для создания эффективных проектов-приложений, предназначенных для исполнения на ПК, панелях оператора или персональных компьютерах.&lt;br /&gt;
&lt;br /&gt;
Среда разработки совмещает редакторы текста, редакторы визуальных представлений объектов, компоновщики структуры, средства связывания объектов и других частей проекта, анализаторы проекта в одном приложении и дает пользователю возможность ведения эффективной разработки проектов-приложений от начала и до завершения в одной программе, без использования разнородных приложений-утилит и необходимости переключения между ними.&lt;br /&gt;
&lt;br /&gt;
=== Версии программного обеспечения ===&lt;br /&gt;
{{Внимание|Текст=При использовании среды разработки совместно с панелями оператора АГАВА ПО или многоканальными программируемыми реле АГАВА МПР-60 необходимо использовать соответствующую версию среды разработки|Тип=Восклицание синий.png}}&lt;br /&gt;
Для определения подходящей версии среды разработки необходимо определить версию среды исполнения, установленной в панели оператора или реле. Тип и версия среды исполнения указаны в системной утилите прибора. Например, &amp;quot;AgavaPLC 1.1&amp;quot;, &amp;quot;AgavaPLC 1.2&amp;quot;  и т.д. Для использования со средой исполнения AgavaPLC 1.1 необходимо использовать среду разработки версии 1.1, для среды исполнения AgavaPLC 1.2 необходима среда разработки версии 1.2 и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Дополнительные статьи и документы ===&lt;br /&gt;
*[[Узлы проекта AgavaSCADA/AgavaPLC|Описание узлов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Свойства узлов в AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Транспорты AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание языка С++ в AgavaPLC|Описание языка С++ в AgavaSCADA/AgavaPLC]].&amp;lt;!-- Комментарий --&amp;gt;.&lt;br /&gt;
*[[Объектная модель AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Описание базовых классов AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Коды ошибок и предупреждений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
*[[Рекомендации по разработке приложений AgavaSCADA/AgavaPLC]].&lt;br /&gt;
Полный перечень всех документов, связанных с разработкой приложений на AgavaSCADA/AgavaPLC, приведен на странице [[:Категория:AgavaSCADA/AgavaPLC|категории AgavaSCADA/AgavaPLC]].&lt;br /&gt;
&lt;br /&gt;
== Разработка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Создание нового проекта ===&lt;br /&gt;
Создание нового проекта в среде разработки осуществляется с помощью команды «Создать проект…» в меню «Файл». После вызова данной команды откроется диалоговое окно создания нового проекта (см. Рисунок 1).&lt;br /&gt;
[[Файл:AgavaPLC-Создание проекта.png|мини|Рисунок 1 - Окно &amp;quot;Создание нового проекта&amp;quot;]]&lt;br /&gt;
Для создания проекта необходимо в списке типов проектов выбрать необходимый, ввести имя проекта и путь для его сохранения, после чего нажать кнопку «Создать проект».&lt;br /&gt;
&lt;br /&gt;
Доступны несколько типов проектов:&lt;br /&gt;
&lt;br /&gt;
* «Пустой проект» – пустой проект, не содержащий никаких узлов. Можно использвоать для создания произвольного проекта &amp;quot;с нуля&amp;quot;.&lt;br /&gt;
* «Локальный проект» – предварительно настроенный проект, содержащий необходимые подсистемы и предназначенный для реализации простой системы для одного устройства, при выборе данного типа пользователь имеет возможность выбрать нужные ему подсистемы и получить полностью рабочий проект в минимальной конфигурации.&lt;br /&gt;
* «Проект АГАВА МПР-60» - проект, предназначенный для исполнения на контроллере АГАВА МПР-60.&lt;br /&gt;
&lt;br /&gt;
=== Редактирование существующего проекта ===&lt;br /&gt;
Редактирование существующего проекта начинается с открытия файла проекта путем вызова команды «Открыть…» в меню «Файл». После загрузки файла в основном окне среды разработки будут отображены свойства и параметры проекта (см. Рисунок 2).&lt;br /&gt;
[[Файл:AgavaPLC-Основное окно среды разработки.png|мини|Рисунок 2 – Основное окно среды разработки AgavaPLC с загруженным проектом]]&lt;br /&gt;
По умолчанию основное окно среды разработки содержит перечисленные ниже части:&lt;br /&gt;
&lt;br /&gt;
# Строка заголовка приложения, панель меню и панель инструментов.&lt;br /&gt;
# Окно дерева проекта. Предоставляет доступ ко всей структуре проекта (см. раздел [[#Описание узлов]]).&lt;br /&gt;
# Окно свойств (см. раздел [[#Редактирование свойств узлов]] ).&lt;br /&gt;
# Область для отображения содержимого, например графического представления окна или задачи ПЛК.&lt;br /&gt;
# Область вспомогательных окон (окна наблюдения, ошибок и сообщений)&lt;br /&gt;
&lt;br /&gt;
После открытия проекта можно приступить к его редактированию.&lt;br /&gt;
&lt;br /&gt;
По завершению всех операций по редактированию необходимо выполнить проверку проекта на корректность с помощью команды «Проверить проект», расположенной в меню «Проект» (см. 6.1). &lt;br /&gt;
&lt;br /&gt;
=== Структура и состав проекта ===&lt;br /&gt;
Типичный проект содержит следующие части:&lt;br /&gt;
&lt;br /&gt;
* станция – важнейший объект, управляющий работой собственных подсистем и осуществляющий обмен данными с другими станциями;&lt;br /&gt;
* транспортная подсистема, выполняющая сбор данных с УСО;&lt;br /&gt;
* подсистема визуализации, обеспечивающая отображение информации в различных видах.&lt;br /&gt;
&lt;br /&gt;
Проект также может содержать следующие части:&lt;br /&gt;
&lt;br /&gt;
* подсистема архивирования, сохраняющая данные в БД для последующего извлечения и анализа;&lt;br /&gt;
* подсистема проверки прав пользователей, предназначенная для контроля доступа пользователя к объектам в режиме исполнения;&lt;br /&gt;
* подсистема тревог, предназначенная для оповещения пользователя об обнаруженных нарушениях;&lt;br /&gt;
* подсистема журналирования, выполняющая архивирование зарегистрированных событий в БД для последующего извлечения и анализа.&lt;br /&gt;
&lt;br /&gt;
Проект имеет древовидную структуру, вследствие чего все узлы связаны друг с другом. Узлы нижних уровней подчиняются узлам верхних уровней. К примеру, станции подчинены все подсистемы, а каждой подсистеме подчинены все узлы, которыми она управляет.&lt;br /&gt;
&lt;br /&gt;
Описание всех частей проекта и их узлов приведено в разделе 4.&lt;br /&gt;
&lt;br /&gt;
=== Разработка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC-Добавление узла в проект.png|мини|Рисунок 3 – Добавление узла в проект AgavaPLC]]&lt;br /&gt;
Перед началом разработки проекта рекомендуется проанализировать поставленную задачи и определить подсистемы, необходимые для её реализации. Взаимодействие с подсистемами осуществляется через дерево проекта (см. Рисунок 2), в которое добавляются нужные узлы. Для добавления нового узла, необходимо нажать правой кнопкой мыши на узел верхнего уровня, которому он подчинён, и выбрать в контекстном меню команду «Добавить узел».&lt;br /&gt;
&lt;br /&gt;
Основные части типовой программы и способы их реализации приведены ниже.&lt;br /&gt;
&lt;br /&gt;
==== Взаимодействие с внешними устройствами ====&lt;br /&gt;
Реализуется через подсистему «Транспорты» в окне дерева проекта. Необходимо добавить в нее нужные протоколы, в зависимости от имеющейся конфигурации контроллера.&lt;br /&gt;
[[Файл:AgavaPLC-Транспорты.png|мини|Рисунок 4 - Транспорты в дереве проекта AgavaPLC]]&lt;br /&gt;
# Транспорт для обмена с субмодулями контроллера (для контроллеров с корзиной субмодулей). В качестве порта транспорта необходимо указать “/dev/ttyS0”. В проекте для МПР-60 присутствует по-умолчанию.&lt;br /&gt;
# Транспорт последовательный (для управления по RS-232, RS-485 и т.д.).&lt;br /&gt;
# Транспорт TCP/IP (для управления по Ethernet).&lt;br /&gt;
&lt;br /&gt;
К транспортам присоединяются либо регистры Modbus, либо субмодули. Для регистра задается адрес устройства, номер регистра, функция чтения/записи и другие параметры, при необходимости. Для субмодуля указывается слот, в котором он установлен, и тип аналоговых входов/выходов. &lt;br /&gt;
&lt;br /&gt;
==== Визуализация данных ====&lt;br /&gt;
Визуализация данных технологических процессов реализуется с помощью элементов подсистемы «Визуализация».&lt;br /&gt;
&lt;br /&gt;
Система визуализации недоступна в проектах для  контроллеров МПР.&lt;br /&gt;
[[Файл:AgavaPLC-Пример визуализации.png|мини|Рисунок 5 - Пример визуализации]]&lt;br /&gt;
Визуализация содержит одно или несколько окон, описанных ниже.&lt;br /&gt;
&lt;br /&gt;
# Форма, которая может использоваться как меню или панель инструментов. Также применяется в небольших проектах, в которых нет необходимости изменения выводимого набора виджетов.&lt;br /&gt;
# Окно с композицией, которое позволяет переключаться между различными экранами (например мнемосхемой, настройками, архивированием и т.д). Каждый из этих экранов реализуется на отдельной композиции.&lt;br /&gt;
&lt;br /&gt;
Процесс создания визуализации начинается с добавления нужных окон в группу «Окна» в дереве проекта. В том случае, если используется окно с композицией, необходимо задать ему отображаемую композицию по умолчанию, перед этим добавив ее в группу «Композиции». Созданные окна нужно добавить к одному фрейму, указав их в соответствующем свойстве фрейма.&lt;br /&gt;
&lt;br /&gt;
Редактирование содержимого окна или композиции осуществляется в его графическом представлении (см. раздел [[#Редактирование графического представления узла]]).&lt;br /&gt;
&lt;br /&gt;
Более подробное описание подсистемы визуализации приведено в разделе [[#Подсистема визуализации]].&lt;br /&gt;
&lt;br /&gt;
==== Пользовательские алгоритмы ====&lt;br /&gt;
Реализовать нужные алгоритмы работы программы можно с помощью различных инструментов, которые выбираются в зависимости от сложности проектов и навыков программиста:&lt;br /&gt;
&lt;br /&gt;
# Операции в группе «Сигналы» – отдельные логические операции. В основном используются для небольших проектов, не требующих сложных методов управления;&lt;br /&gt;
# Задачи ПЛК – графическое программирование с помощью связывания между собой различных функциональных блоков. Подходит для больших проектов. Реализуется в узле «Задача ПЛК» группы «Задачи». Подробное описание приведено в разделе [[#Задача ПЛК]]'''.'''&lt;br /&gt;
# Скрипты С++ – текстовое программирование на языке высокого уровня. Подходит для больших проектов. Реализуется с помощью операций «Скрипт С++», расположенных в группе «Сигналы» или в задаче ПЛК. Описание реализации языка С++ приведено на странице [[Описание языка С++ в AgavaPLC]].&lt;br /&gt;
=== Редактирование свойств узлов ===&lt;br /&gt;
Среда разработки обладает развитыми возможностями по редактированию свойств узлов. Описание доступных типов свойств приведно в статье [[Свойства узлов в AgavaPLC/AgavaSCADA]].&lt;br /&gt;
&lt;br /&gt;
==== Редактирование свойств узлов с помощью окна «Свойства» ====&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Свойства&amp;quot;.png|мини|Рисунок 6 – Окно «Свойства» виджета «Кнопка»]]&lt;br /&gt;
Редактирование свойств всех узлов осуществляется с помощью окна «Свойства».&lt;br /&gt;
&lt;br /&gt;
В окне «Свойства» в виде таблицы отображаются все доступные свойства узла, объединенные в группы. В левой колонке отображены наименования свойств, в правой отображены их значения. Свойства, недоступные для изменения, имеют наименование серого цвета. В нижней части окна расположена область подсказки, содержащая пояснение к выделенному свойству.&lt;br /&gt;
&lt;br /&gt;
===== Редактирование свойств группы узлов =====&lt;br /&gt;
В случае, когда необходимо изменить свойства у нескольких узлов, можно воспользоваться возможностью группового редактирования свойств. Для этого нужно выделить несколько узлов в дереве конфигурации либо на графическом представлении с помощью левой кнопки мыши и нажатой кнопки «Ctrl». При этом в окне свойств будут отображены только те свойства, что имеются у всех выделенных узлов. Далее можно изменить нужное свойство, при этом после завершения редактирования измененное значение будет установлено во всех выбранных узлах.&lt;br /&gt;
&lt;br /&gt;
==== Групповое редактирование свойств узлов ====&lt;br /&gt;
При необходимости редактирования разных свойств у большого количества узлов можно воспользоваться специальным окном «Список узлов».&lt;br /&gt;
[[Файл:AgavaPLC-Окно &amp;quot;Список узлов&amp;quot;.png|мини|Рисунок 7 - Окно &amp;quot;Список узлов&amp;quot;]]&lt;br /&gt;
Открытие окна выполняется с помощью вызова команды «Открыть список узлов» в контекстном меню дерева конфигурации. Открытое окно содержит все узлы, вложенные в выбранные при вызове команды.&lt;br /&gt;
&lt;br /&gt;
Окно позволяет редактировать свойства непосредственно в ячейках таблицы, без переключения на окно «Свойства». Групповое редактирование свойств узлов через окно «Свойства» также доступно.&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на списке вызывает контекстное меню, содержащее команды:&lt;br /&gt;
&lt;br /&gt;
* “Свойства”;&lt;br /&gt;
* “Экспорт в *.txt”;&lt;br /&gt;
* “Импорт из *.txt”;&lt;br /&gt;
* “Удалить узел”.&lt;br /&gt;
&lt;br /&gt;
Команда «Свойства» открывает диалоговое окно выбора отображаемых свойств.&lt;br /&gt;
&lt;br /&gt;
Команды «Экспорт», «Импорт» выполняют экспорт списка свойств узлов в текстовый файл и импорт соответственно.&lt;br /&gt;
&lt;br /&gt;
Команда «Удалить узел» производит удаление выделенного узла (узлов).&lt;br /&gt;
&lt;br /&gt;
==== Функция групповой замены источников в узлах ====&lt;br /&gt;
При разработке сложных проектов может возникнуть необходимость заменить источники сразу в большом количестве узлов. Для этой цели используется функция групповой замены источников.  Необходимо перейти в редактирование свойств типа «Список источников», которое производится в соответствующем окне (см. Рисунок 8).&lt;br /&gt;
[[Файл:AgavaPLC-Окно редактирования свойств типа «Список источников».png|мини|Рисунок 8 - Окно редактирования свойств типа «Список источников»]]&lt;br /&gt;
Затем необходимо использовать функцию групповой замены (см. Рисунок 9), выделив нужные узлы, нажав на них правой кнопкой мыши и выбрав «Групповая замена».&lt;br /&gt;
[[Файл:AgavaPLC-Окно функции «Групповая замена».png|мини|Рисунок 9 - Окно функции «Групповая замена»]]&lt;br /&gt;
&lt;br /&gt;
=== Редактирование графического представления узла ===&lt;br /&gt;
Редактирование содержимого окон, слоев, форм, композиций и других элементов, предназначенных для отображения на экране, осуществляется в окне графического представления. Открытие окна возможно с помощью команды «Открыть графическое представление» в контекстном меню дерева конфигурации или двойного нажатия левой кнопки мыши для узлов следующих типов:&lt;br /&gt;
&lt;br /&gt;
* фрейм;&lt;br /&gt;
* форма;&lt;br /&gt;
* окно с композицией;&lt;br /&gt;
* слой.&lt;br /&gt;
&lt;br /&gt;
Открытое графическое представление выбранного узла может содержать все уже размещенные на нем элементы визуализации и (или) другие узлы и позволяет добавить новые.&lt;br /&gt;
[[Файл:AgavaPLC–Открытое графическое представление окна «winMain».png|мини|Рисунок 10 – Открытое графическое представление окна «winMain»]]&lt;br /&gt;
На рисунке 10 представлено графическое представление окна «winMain», обведенное пунктирной рамкой серого цвета, обозначающей внешнюю границу открытого узла. Тип рамки пользователь может выбрать по своему усмотрению, выбор производится в окне настроек среды разработки, доступном через команду «Настройки» в меню «Параметры».&lt;br /&gt;
&lt;br /&gt;
Щелчок правой кнопкой мыши на пустом месте в открытом графическом представлении узла вызывает контекстное меню, содержащее команды удаления и вставки виджетов из буфера обмена, а также команды добавления новых виджетов доступных типов.&lt;br /&gt;
&lt;br /&gt;
Добавление новых виджетов также может осуществлять путем их перестаскивания в рабочую область из панели виджетов.&lt;br /&gt;
&lt;br /&gt;
Графическое представление позволяет перемещать выделенные виджеты кнопками перемещения курсора на клавиатуре, а также изменять их размеры кнопками перемещения курсора при нажатой кнопке Shift.&lt;br /&gt;
&lt;br /&gt;
==== Связывание источников и виджетов ====&lt;br /&gt;
Связывание виджетов и других узлов с источниками данных необходимо для того, чтобы виджеты или другие узлы могли отображать или обрабатывать значения, хранящиеся в источниках.&lt;br /&gt;
&lt;br /&gt;
Для связи виджетов с источниками данных можно воспользоваться обычным способом связывания через окно «Свойства». К примеру, связывание размещенного на форме виджета «Текстовая метка» с регистром Modbus осуществляется добавлением регистра Modbus в свойство виджета «Источник».&lt;br /&gt;
&lt;br /&gt;
Вместе с обычным способом связывания существует и другой, более быстрый способ. Для быстрого связывания регистра с виджетом достаточно нажать на регистр в дереве конфигурации левой кнопкой мыши и перенести его на виджет в открытом графическом представлении.&lt;br /&gt;
[[Файл:AgavaPLC–Связывание узла «sourceModbusRegister0» и виджета.png|мини|Рисунок 11 – Связывание узла «sourceModbusRegister0» и виджета]]&lt;br /&gt;
При помещении курсора над виджетом последний будет заштрихован сеткой зеленого или красного цвета, а курсор изменит свой вид на стрелку с квадратиком (см. рисунок 11).&lt;br /&gt;
&lt;br /&gt;
Зеленая штриховка виджета означает отсутствие связи выделенного виджета с источником данных, в этом случае связывание будет произведено. Красная штриховка говорит об ошибках связывания виджета и сигнала/источника.&lt;br /&gt;
&lt;br /&gt;
==== Редактирование многослойных композиций ====&lt;br /&gt;
Редактирование многослойных композиций принципиально не отличается от редактирования форм, кроме одного нюанса. Так как композиция может состоять из нескольких слоев, и виджеты на слоях могут располагаться один над другим, для использования наиболее удобного способа редактирования такой композиции можно воспользоваться возможностью открытия каждого слоя в отдельном окне.&lt;br /&gt;
[[Файл:AgavaPLC–Пример структуры композиции «Composition1», состоящей из трех слоев.png|мини|Рисунок 12 – Пример структуры композиции «Composition1», состоящей из трех слоев]]&lt;br /&gt;
Для открытия графического представления слоя нужно воспользоваться командой «Открыть графическое представление» аналогично открытию графического представления формы или композиции.&lt;br /&gt;
&lt;br /&gt;
Открыв одновременно композицию и слой, при редактировании слоя можно видеть, что содержимое композиции также изменяется и наоборот, при редактировании композиции изображение слоя будет изменяться.&lt;br /&gt;
&lt;br /&gt;
Слой обладает важным свойством «Прозрачность для действий». Данное свойство позволяет регулировать доступность виджетов, расположенных на нижележащих слоях, для действий пользователя. Например, если у верхнего слоя данное свойство выключено, то виджеты, расположенные на всех нижележащих слоях, будут недоступны для взаимодействия. Если же у верхнего слоя свойство включено, то виджеты нижележащего слоя будут доступны.&lt;br /&gt;
&lt;br /&gt;
==== Использование якорей ====&lt;br /&gt;
Данная возможность доступна с версии &amp;lt;code&amp;gt;AS 1.6.32+&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
При работе с графическими представлениями окон и композиций, содержащих большое количество виджетов, могут быть полезны якоря - создаваемые пользователем метки на размерных линейках.&lt;br /&gt;
[[Файл:AgavaPLC-Графическое представление-якоря.png|мини|AS 1.6.32+: Графическое представление формы с установленными якорями]]&lt;br /&gt;
Якоря позволяют контролировать положение групп виджетов благодаря связанным с ними линиям привязки. Линии привязки, позволяют быстрее выстраивать группы виджетов благодяря &amp;quot;прилипанию&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Создание якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Добавить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Удаление якоря выполняется следующими способами:&lt;br /&gt;
&lt;br /&gt;
* Двойным кликом левой кнопки мыши по якорю на размерной линейке.&lt;br /&gt;
* Кликом правой кнопки мыши на размерной линейке и выбором команды &amp;quot;Удалить якорь&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Созданные якоря можно перемещать по размерной линейке с помощью мыши.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение проекта ===&lt;br /&gt;
Для сохранения проекта на диск вызовите команду  «Файл-&amp;gt;Сохранить проект» или «Файл-&amp;gt;Сохранить проект как...», если необходимо сделать копию открытого проекта и продолжить работу в ней после сохранения.&lt;br /&gt;
&lt;br /&gt;
== Проверка и отладка проекта ==&lt;br /&gt;
&lt;br /&gt;
=== Эмуляция проекта ===&lt;br /&gt;
Проверить работоспособность проекта можно, не загружая его в контроллер. Для этого существует возможность запустить среду исполнения прямо на компьютере. &lt;br /&gt;
&lt;br /&gt;
Для этого необходимо:&lt;br /&gt;
&lt;br /&gt;
# Установить текущий проект как проект по умолчанию. Для этого необходимо вызвать команду &amp;quot;Проект-&amp;gt;Установить проект по умолчанию...&amp;quot;  и выбрать ранее сохраненный файл конфигурации.&lt;br /&gt;
# Запустить среду исполнения. Для этого нужно вызвать команду меню &amp;quot;Проект-&amp;gt;Запуск среды исполнения&amp;quot;. После этого будет выполнен запуск в новом окне среды исполнения.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг сигналов ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно &amp;quot;Наблюдение&amp;quot;.png|мини|Рисунок 14 – Окно &amp;quot;Наблюдение&amp;quot;|ссылка=Файл:AgavaPLC–Окно_%22Наблюдение%22.png]]&lt;br /&gt;
Функция мониторинга сигналов позволяет наблюдать значения, хранящиеся в узлах проекта при исполнении проекта на целевом устройстве.&lt;br /&gt;
&lt;br /&gt;
Для запуска данной функции необходимо:&lt;br /&gt;
&lt;br /&gt;
# Запустить среду исполнения.&lt;br /&gt;
# Вызвать команду меню «&amp;lt;code&amp;gt;Устройство → Подключение/отключение&amp;lt;/code&amp;gt;», в появившемся окне выбрать IP-адрес и порт устройства, значения узлов которого необходимо мониторить. При необходимости просмотра значений узлов и сигналов в режиме эмуляции проекта на персональном компьютере укажите адрес 127.0.0.1. Если необходимо просматривать значения узлов проекта, выполняющегося на контроллере или панели оператора, укажите IP-адрес контроллера или панели.&lt;br /&gt;
# Нажать кнопку «Подключение».&lt;br /&gt;
&lt;br /&gt;
Поле подключения к среде исполнения нужно добавить в окно &amp;quot;Наблюдение&amp;quot; узлы, значения которых необходимо наблюдать. Такие узлы должны иметь возможность чтения или записи значений – это регистры Modbus и другие узлы типа &amp;quot;Источник&amp;quot;, сигналы. &lt;br /&gt;
&lt;br /&gt;
Для добавления узлов в окно &amp;quot;Наблюдение&amp;quot; необходимо нажать на нужном узле в дереве проекта правой кнопкой мыши и выбрать команду «&amp;lt;code&amp;gt;Добавить в окно наблюдения&amp;lt;/code&amp;gt;». Выбранные узлы будут отображаться в окне «Наблюдение» вместе со считанными значениями.&lt;br /&gt;
&lt;br /&gt;
=== Мониторинг событий ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно просмотра событий.png|мини|Рисунок 15 – Окно просмотра событий]]Мониторинг событий позволяет наблюдать за исполнением проекта, работающего в устройстве. При включении мониторинга пользователь получает информацию о возникающих нефатальных ошибках и предупреждениях, возникающих в ходе исполнения проекта со следующими признаками:&lt;br /&gt;
&lt;br /&gt;
* метка времени, соответствующая времени возникновения события;&lt;br /&gt;
* степень важности события;&lt;br /&gt;
* тип события - информационное или события активирования, деактивирования и квитирования тревог;&lt;br /&gt;
* имя узла, сформировавшего событие.&lt;br /&gt;
* текст события.&lt;br /&gt;
&lt;br /&gt;
==== Использование мониторинга ====&lt;br /&gt;
Для старта мониторинга необходимо подключиться к нужному устройству способом, рассмотренным в разделе [[#Мониторинг сигналов]], а затем вызвать команду «&amp;lt;code&amp;gt;Устройство → Просмотр событий&amp;lt;/code&amp;gt;». В открывшемся окне будут выводиться все события, регистрируемые устройством. &lt;br /&gt;
&lt;br /&gt;
С помощью выпадающего списка в левом верхнем углу окна можно выбрать минимальный уровень выводимых событий.&lt;br /&gt;
&lt;br /&gt;
==== Фильтрация событий ====&lt;br /&gt;
''Функция доступна начиная с версии &amp;lt;code&amp;gt;AgavaSCADA/AgavaPLC 1.2.56+, 1.5.25+&amp;lt;/code&amp;gt;.''&lt;br /&gt;
&lt;br /&gt;
В нижнем левом углу окна расположена область настройки фильтра событий, позволяющая фильтровать выводимые события по имени узла и тексту событий. При использовании фильтра возможно задание фильтра в виде:&lt;br /&gt;
&lt;br /&gt;
* простой строки, при этом в список попадают события, содержащие полное совпадение заданной строки; при задании строки возможно в(ы)ключение признака учета регистра символов в строке;&lt;br /&gt;
* регулярного выражения, при этом в список попадают события, удовлетворяющие введенное выражение. Правила составления регулярных выражений описаны на странице [[Использование регулярных выражений]].&lt;br /&gt;
&lt;br /&gt;
=== Отладка в задаче ПЛК ===&lt;br /&gt;
''Данный раздел актуален для версии &amp;lt;code&amp;gt;AS 1.2.61&amp;lt;/code&amp;gt; и старее. В версиях &amp;lt;code&amp;gt;AS 1.6+&amp;lt;/code&amp;gt; используется другой, пошаговый отладчик.''&lt;br /&gt;
&lt;br /&gt;
Задача ПЛК (см. раздел [[#Задача ПЛК]]) позволяет проводить тестирование проектов с помощью режима симулятора (на компьютере, без использования контроллера) или онлайн отладки (на контроллере).&lt;br /&gt;
&lt;br /&gt;
==== Управление отладкой ====&lt;br /&gt;
Управление режимом симуляции и онлайн отладкой осуществляется с помощью панели инструментов задачи ПЛК (см. рисунок 16).&lt;br /&gt;
&lt;br /&gt;
Панель инструментов содержит следующие элементы:&lt;br /&gt;
&lt;br /&gt;
* Кнопка «Запустить симуляцию».&lt;br /&gt;
* Кнопка «Сделать шаг на один цикл».&lt;br /&gt;
* Кнопка «Приостановить симуляцию» - ставит выполнение задачи на паузу.&lt;br /&gt;
* Кнопка «Остановить симуляцию» - сбрасывает состояние всех блоков к их состоянию по умолчанию.&lt;br /&gt;
* Список выбора периода выполнения задачи.&lt;br /&gt;
* Кнопка «Показать окно «Наблюдение».&lt;br /&gt;
&lt;br /&gt;
==== Режим симулятора ====&lt;br /&gt;
Режим симулятора позволяет провести тестирование работы алгоритмов проекта на компьютере. С помощью симуляции можно выявить ошибки в работе алгоритмов проекта до его загрузки в контроллер.&lt;br /&gt;
&lt;br /&gt;
Управление симуляцией осуществляется через команды на панели инструментов задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
Для перехода в режим симуляции нажмите кнопку «Режим симулятора» на панели управления задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC-Панель инструментов задачи ПЛК.png|мини|Рисунок 16 - Панель инструментов задачи ПЛК]]&lt;br /&gt;
После активации режима симуляции, для изменения значения входа дважды щелкните на нем левой кнопкой мыши и выберите нужный тип и значение. Текущие значения всех блоков, в соответствии с работой программы, будут отображаться в реальном времени.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме симулятора.png|мини|Рисунок 17 – Вид блоков задачи в режиме симулятора]]&lt;br /&gt;
Для выхода из режима симуляции повторно нажмите кнопку «Режим симуляции» на панели управления задачи ПЛК.&lt;br /&gt;
&lt;br /&gt;
==== Онлайн отладка ====&lt;br /&gt;
Режим онлайн отладки позволяет провести тестирование проекта, загруженного и исполняемого в контроллере. Для перехода в режим онлайн отладки загрузите конфигурацию в контроллер, подключитесь к нему, после чего нажмите кнопку «Онлайн отладка» на панели инструментов задачи ПЛК.&lt;br /&gt;
[[Файл:AgavaPLC–Вид блоков задачи в режиме онлайн отладки.png|мини|Рисунок 18 – Вид блоков задачи в режиме онлайн отладки]]&lt;br /&gt;
На рисунке 18 изображен вид задачи ПЛК в режиме онлайн отладки проекта, запущенного на МПР-60 с установленными субмодулями DI (входы) и R (выходы).&lt;br /&gt;
&lt;br /&gt;
Для онлайн отладки на панели инструментов недоступны кнопка «Приостановить симуляцию» и список выбора периода.&lt;br /&gt;
&lt;br /&gt;
== Компиляция проекта ==&lt;br /&gt;
Перед загрузкой проекта в контроллер или запуском эмуляции проекта необходимо откомпилировать проект и получить файл конфигурации, предназначенный для исполнения средой исполнения, установленной в контроллере или на персональном компьютере (в случае разработки системы диспетчеризации). Для этого необходимо вызвать команду меню &amp;quot;Проект-&amp;gt;Сохранить конфигурацию&amp;quot;, выбрать папку проекта и нажать кнопку &amp;quot;Сохранить&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Проверка проекта ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Ошибки».png|мини|Рисунок 19 – Окно «Ошибки»]]&lt;br /&gt;
Перед сохранением проекта желательно выполнить его проверку на наличие ошибок с помощью команды «Проект-&amp;gt;Проверить проект». После проверки обнаруженные ошибки будут отображены в окне «Ошибки».&lt;br /&gt;
&lt;br /&gt;
Если отображение окна «Ошибки» выключено, его можно включить командой «Вид-&amp;gt;Показать окно ошибок».&lt;br /&gt;
&lt;br /&gt;
Для облегчения исправления обнаруженных ошибок окно поддерживает выполнение некоторых команд над обнаруженными ошибками, вызывать которые можно из контекстного меню, отображаемого щелчком правой кнопки мыши на строке c ошибкой в окне. Контекстное меню позволяет вызывать команду «Показать узел в дереве конфигурации», выполняющую соответствующее действие.&lt;br /&gt;
&lt;br /&gt;
Также щелчок левой кнопкой мыши на строке с ошибкой открывает окно «Свойства» и дает возможность изменить в нем все свойства узла, содержащего ошибку.&lt;br /&gt;
&lt;br /&gt;
==== Установка пароля на файл конфигурации ====&lt;br /&gt;
[[Файл:AgavaPLC–Установка пароля.png|мини|Рисунок 13 – Установка пароля]]&lt;br /&gt;
Файл конфигурации, загружаемый в контроллер или панель оператора, можно защитить паролем, чтобы предотвратить его несанкционированное изменение.&lt;br /&gt;
&lt;br /&gt;
Для установки пароля на файл конфигурации необходимо выбрать в дереве проекта узел «Конфигурация» и отредактировать его свойство «Пароль». Допускается использование любых цифр, букв и спецсимволов.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем при открытии файла конфигурации в среде разработки будет появляться окно с запросом пароля.&lt;br /&gt;
&lt;br /&gt;
== Загрузка проекта в устройство ==&lt;br /&gt;
Загрузка проекта в целевое устройство может быть осуществлена несколькими способами:&lt;br /&gt;
&lt;br /&gt;
* загрузка из среды разработки;&lt;br /&gt;
* загрузка с помощью USB-Flash накопителя (для панелей оператора);&lt;br /&gt;
* загрузка через браузер (для МПР-60).&lt;br /&gt;
&lt;br /&gt;
=== Загрузка из среды разработки ===&lt;br /&gt;
[[Файл:AgavaPLC–Окно «Загрузка проекта в устройство» после подключения к контроллеру.png|мини|Рисунок 20 – Окно «Загрузка проекта в устройство» после подключения к контроллеру]]&lt;br /&gt;
Для загрузки проекта из среды разработки необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Создайте файл конфигурации.&lt;br /&gt;
# Выполните подключение целевого устройства к ПК по сети Ethernet.&lt;br /&gt;
# После подключения вызовите в среде разработки команду «Проект-&amp;gt;Загрузка проекта в устройство».&lt;br /&gt;
# В открывшемся окне будет отображен список файлов проекта, доступных для загрузки в целевое устройство.&lt;br /&gt;
# Выберите необходимые файлы и нажмите кнопку «Загрузить». После нажатия кнопки начнется процесс загрузки файлов, при этом в нижней части окна будет меняться состояние полосы прогресса, а также для каждого файла в таблице будет отображен результат загрузки.&lt;br /&gt;
# После окончания загрузки среда исполнения в целевом устройстве будет перезапущена и загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через USB-Flash (для ПО-40 и ПО-50) ===&lt;br /&gt;
Для загрузки проекта в устройство с помощью USB-Flash накопителя необходимо произвести следующие действия в указанном порядке:&lt;br /&gt;
&lt;br /&gt;
# Подготовьте USB-Flash накопитель, предварительно отформатировав его в файловую систему FAT32.&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив в корень USB-Flash накопителя.&lt;br /&gt;
# Перейдите в системную утилиту, перезагрузив панель оператора, при загрузке во время однократного звукового сигнала нажмите на экран и удерживайте до повторного звукового сигнала. Введите пароль: 111111.&lt;br /&gt;
# Перейдите на вкладку «Обновление», затем подключите USB-Flash накопитель через переходник USB-OTG, выберите из списка загрузочный архив, нажать кнопку «Обновить». Дождитесь сообщения «Обновление успешно» и нажмите кнопку «ОК».&lt;br /&gt;
# Перейдите на вкладку «Перезапуск» и нажмите кнопку «Перезапуск».&lt;br /&gt;
После перезагрузки панели загруженный проект будет запущен.&lt;br /&gt;
&lt;br /&gt;
=== Загрузка через браузер (для МПР-60) ===&lt;br /&gt;
Для загрузки проекта через браузер необходимо произвести следующие действия в указанном порядке.&lt;br /&gt;
&lt;br /&gt;
# Вызовите в среде разработки команду «Подготовка архива для обновления» в меню «Проект».&lt;br /&gt;
# Сохраните архив.&lt;br /&gt;
# Откройте системную утилиту, введя IP-адрес контроллера в адресную строку браузера.&lt;br /&gt;
# Перейдите на вкладку «Загрузка ПО».  Рисунок 71 - Вкладка системной утилиты «Загрузка ПО»&lt;br /&gt;
# Выберите на компьютере архив с проектом, который необходимо загрузить в контроллер.&lt;br /&gt;
# Нажмите кнопку «Загрузить».&lt;br /&gt;
# Дождитесь окончания загрузки файла и обновления проекта.&lt;br /&gt;
&lt;br /&gt;
[[Категория:AgavaSCADA/AgavaPLC]]&lt;/div&gt;</summary>
		<author><name>TaushkanovKV</name></author>
	</entry>
</feed>