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