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 Варіанти EVAL (Error VALue) і null опрацьовуються особливо через перетворення одного у інше залежно від використаного базового типу, тобто ви вільні у використанні лише null або EVAL у будь яких випадках.

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" — символ '!', записаний шістнадцятковим числом.