From OpenSCADAWiki
Jump to: navigation, search

1 Пользовательский язык программирования JavaLikeCalc

1.1 Элементы языка

Ключевые слова: if, else, while, for, in, break, continue, return, function, using.
Постоянные:

  • десятичные: цифры 0-9 (12, 111, 678);
  • восьмеричные: цифры 0-7 (012, 011, 076);
  • шестнадцатеричные: цифры 0-9, буквы a-f или A-F (0x12, 0XAB);
  • вещественные: 345.23, 2.1e5, 3.4E-5, 3e6;
  • логические: true, false;
  • строковые: "hello", без перехода на другую строку однако с поддержкой прямой конкатенации строковых констант.

Типы переменных:

  • целое: -263 ... 263, EVAL_INT(-9223372036854775807);
  • вещественное: 3.4*10308, EVAL_REAL(-1.79E308);
  • логическое: false, true, EVAL_BOOL(2);
  • строка: последовательность символов-байтов (0...255) любой длины, ограниченной объёмом памяти и хранилищем в БД; EVAL_STR("<EVAL>").

Встроенные константы: pi = 3.14159265..., e = 2.71828182..., EVAL_BOOL(2), EVAL_INT(-9223372036854775807), null,EVAL,EVAL_REAL(-1.79E308), EVAL_STR("<EVAL>")
Глобальные атрибуты параметров DAQ (начиная с подсистемы "DAQ" и в виде {Тип модуля DAQ}.{Объект контроллера}.{Параметр}.{Атрибут}).
Функции и параметры объектной модели OpenSCADA.

At.png The EVAL (Error VALue) variants and null are processed specially in conversion one to one depending on used the base type, that is you are free in use only null or EVAL for any cases.

1.2 Операции языка

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

СимволОписание
()Вызов функции.
{}Программные блоки.
++Инкремент (пост и пре).
--Декремент (пост и пре).
-Унарный минус.
!Логическое отрицание.
~Побитовое отрицание.
*Умножение.
/Деление.
%Остаток от целочисленного деления.
+Сложение
-Вычитание
<<Поразрядный сдвиг влево
>>Поразрядный сдвиг вправо
>Больше
>=Больше или равно
<Меньше
<=Меньше или равно
==Равно
!=Не равно
|Поразрядное "ИЛИ"
&Поразрядное "И"
^Поразрядное "Исключающее ИЛИ"
&&Логический "И"
||Логический "ИЛИ"
?:Условная операция "i=(i<0)?0:i;"
=Присваивание.
+=Присваивание со сложением.
-=Присваивание с вычитанием.
*=Присваивание с умножением.
/=Присваивание с делением.

1.3 Встроенные функции языка

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

  • double max(double x, double x1) — максимальное значение из x и x1;
  • double min(double x, double x1) — минимальное значение из x и x1;
  • string typeof(ElTp vl) — тип значения vl;
  • string tr(string base) — перевод базового base сообщения.

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

  • double sin(double x) — синус x;
  • double cos(double x) — косинус x;
  • double tan(double x) — тангенс x;
  • double sinh(double x) — синус гиперболический от x;
  • double cosh(double x) — косинус гиперболический от x;
  • double tanh(double x) — тангенс гиперболический от x;
  • double asin(double x) — арксинус от x;
  • double acos(double x) — арккосинус от x;
  • double atan(double x) — арктангенс от x;
  • double rand(double x) — случайное число от 0 до x;
  • double lg(double x) — десятичный логарифм от x;
  • double ln(double x) — натуральный логарифм от x;
  • double exp(double x) — экспонента от x;
  • double pow(double x, double x1) — возведение x в степень x1;
  • double sqrt(double x) — корень квадратный от x;
  • double abs(double x) — абсолютное значение от x;
  • double sign(double x) — знак числа x;
  • double ceil(double x) — округление числа x до большего целого;
  • double floor(double x) — округление числа x до меньшего целого.

1.4 Операторы языка

Общий перечень операторов языка:

  • var — оператор инициализации переменной; указание переменной без присваивания значения резервирует её со значением null-EVAL, что позволяет осуществлять одноразовую инициализацию сложных типов данных вроде объекта, через прямое сравнение и проверку на isEVal();
  • if — оператор условия "ЕСЛИ";
  • else — оператор условия "ИНАЧЕ";
  • while — определение цикла "ПОКА";
  • for — определение цикла "ДЛЯ";
  • in — разделитель цикла "ДЛЯ" для перебора свойств объекта;
  • break — прерывание выполнения цикла;
  • continue — продолжить выполнение цикла с начала;
  • function — определение внутренней функции;
  • using — позволяет установить область видимости внешних функций часто используемой библиотеки (using Special.FLibSYS;) для последующего обращения только по имени функции, не имеет эффекта для объектного доступа;
  • return — прерывание функции и возврат результата, который копируется в атрибут с флагом возврата (return 123;); в середине внутренней функции осуществляется её завершение с указанным результатом;
  • new — создание объекта, реализовано для: общий объект "Object", массив "Array" и регулярные выражения "RegExp";
  • delete — удаление/освобождение объекта или его свойств, при этом: внутренние переменные устанавливаются в null-EVAL, внешние заменяются пустым объектом, а свойства объекта очищаются.

1.4.1 Условные операторы

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

Условие внутри выражения строится на операциях '?' и ':'. В качестве примера можно записать следующее практическое выражение:

st_open = (pos >= 100) ? true : false;

Что читается как — если переменная pos больше или равна 100, то переменной st_open присваивается значение true, иначе — false.

Глобальное условие строится на основе условных операторов "if" и "else". В качестве примера можно привести тоже выражение, но записанное другим способом:

if(pos > 100) st_open = true; else st_open = false;

1.4.2 Циклы

Поддерживаются три типа циклов: while, for и for-in. Синтаксис циклов соответствует языкам программирования: C++, Java и JavaScript.

Цикл while, в общем, записывается следующим образом: while({условие}) {тело цикла};
Цикл for записывается следующим образом: for({пре-инициализ};{условие};{пост-вычисление}) {тело цикла};
Цикл for-in записывается следующим образом: for({переменная} in {объект}) {тело цикла};
Где:

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

1.4.3 Внутренние функции

Язык поддерживает определение и вызов внутренних функций. Для определения внутренней функции используется ключевое слово "function" и в целом определение имеет синтаксис: function {имяФ} ({пер1}, {пер2}, ... {перN}) { {тело функции} }. Определение внутренней функции внутри другой недопустимо однако допустим вызов ранее определённой.

Вызов внутренней функции осуществляется в типовой способ, как процедура {имяФ}({var1}, {var2}, ... {varN}); или как функция {перРез} = {имяФ}({пер1}, {пер2}, ... {перN});. Вызов внутренних функций допустим только после их декларации выше!

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

Оператор "return", в середине внутренней функции, осуществляет контролируемое её завершение и помещение указанной переменной, или результата выражения, как результат вызываемой внутренней функции.

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

function sum(a, b, c, d) { return a + ((b==null)?0:b) + ((c==null)?0:c) + ((d==null)?0:d); }
rez = sum(1, 2);

1.4.4 Специальные символы строковых переменных

Языком предусмотрена поддержка следующих специальных символов строковых переменных:

"\n" — перевод строки;
"\t" — символ табуляции;
"\b" — забой;
"\f" — перевод страницы;
"\r" — возврат каретки;
"\\" — сам символ '\';
"\041" — символ '!', записанный восьмеричным числом;
"\x21" — символ '!', записанный шестнадцатеричным числом.