<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html class="client-nojs" dir="ltr" lang="en">
<head>
<meta charset="UTF-8" />
<title>Модулі/Обчислювач подібний до Java - OpenSCADAWiki</title>
<meta content="MediaWiki 1.26.4" name="generator" />
<link href="https://www.gnu.org/copyleft/fdl.html" rel="copyright" />
<link href="../../en/files/doc.css" rel="stylesheet" /></head>
<body><div class="floatright"><a href="../index.html"><img alt="OpenSCADA" src="../../en/files/index.png" /></a></div><div id="mw_header">
			<div class="mw-indicators">
</div>
			<h1 id="firstHeading" lang="uk">Модулі/Обчислювач подібний до Java</h1>
		</div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="uk"><div class="mw-pt-translate-header noprint" dir="ltr" lang="en">This page is a <span class="plainlinks"><a class="external text" href="http://oscada.org/wiki/index.php?title=Special:Translate&amp;group=page-Modules%2FJavaLikeCalc&amp;action=page&amp;filter=&amp;language=uk" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Modules/JavaLikeCalc" title="Modules/JavaLikeCalc">Modules/JavaLikeCalc</a> and the translation is 100% complete.</div><hr /><div class="mw-pt-languages" dir="ltr" lang="en"><div class="mw-pt-languages-list autonym"><a class="mw-pt-languages-ui mw-pt-progress mw-pt-progress--complete" href="../../en/Modules/JavaLikeCalc.html" title="Modules/JavaLikeCalc (100% translated)">English</a>&nbsp;• ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../ru/Modules/JavaLikeCalc.html" title="Модули/Вычислитель похожий на Java (85% translated)">mRussian</a>&nbsp;• ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">Українська</span></div></div>
<table class="wikitable">

<tr>
<th> Модуль </th>
<th> Ім'я </th>
<th> Версія </th>
<th> Ліцензія </th>
<th> Джерело </th>
<th> Мови </th>
<th> Платформи </th>
<th> Тип </th>
<th> Автор </th>
<th> Опис
</th></tr>

<tr>
<td> <a href="../Modules/JavaLikeCalc.html" title="Special:MyLanguage/Modules/JavaLikeCalc">JavaLikeCalc</a> </td>
<td> Обчислювач на мові подібній до Java
</td>
<td> 5.8 </td>
<td> GPL2 </td>
<td> daq_JavaLikeCalc.so </td>
<td> en,uk,ru,de </td>
<td> x86,x86_64,ARM
</td>
<td> DAQ </td>
<td> Роман Савоченко </td>
<td> Надає обчислювач та рушій бібліотек на мові подібній до Java. Користувач може створювати та модифікувати функції та їх бібліотеки.
</td></tr></table>
<p>Модуль джерела даних надає до OpenSCADA механізм створення функцій та їх бібліотек на мові подібній до Java. Опис функції на мові подібній до Java зводиться до обв'язки параметрів функції алгоритмом. Крім цього модуль наділено функціями безпосередніх обчислень шляхом створення об'єктів обчислювальних контролерів.
</p><p>Безпосередні обчислення забезпечуються створенням об'єкту контролеру та зв'язуванням його із функцією цього-ж модуля. Для зв'язування функції створюється кадр значень (контекст), над яким і виконуються періодичні обчислення.
</p><p>Модулем реалізуються функції горизонтального резервування, а саме — спільна робота з віддаленою станцією цього-ж рівня. Окрім синхронізації значень та архівів атрибутів параметрів, модулем здійснюється синхронізація значень обчислювальної функції, з метою безударного "підхоплення" алгоритмів.
</p><p>Параметри функції можуть вільно створюватися, видалятися або модифікуватися. Поточна версія модуля підтримує до 65535 параметрів функції, у підсумку із внутрішніми змінними. Вигляд редагування функцій у конфігураторі OpenSCADA показано на рисунку 1. <a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Рядки ім'я параметрів після першого опрацьовуються як допомога.
</p>
<div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:944px;"><a class="image" href="http://oscada.org/wiki/File:JavaLikeCalc_funcedit_uk.png"><img class="thumbimage" height="683" src="../files/JavaLikeCalc_funcedit_uk.png" width="942" /></a>  <div class="thumbcaption">Рис.1. Вигляд редагування функцій у конфігураторі OpenSCADA.</div></div></div></div>
<p>Після будь-якої зміни тексту програми або конфігурації параметрів, здійснюється перекомпіляція програми із повідомленням об'єктів значень <i>TValCfg</i>, пов'язаних з функцією. Компілятор мови побудовано із використанням відомого генератору граматики "Bison", який сумісний з не менш відомою утилітою "Yacc".
</p><p>Мова використовує неявне визначення локальних змінних, яке полягає у визначені нової змінної у випадку привласнення їй значення. Причому тип локальної змінної встановлюється у відповідності з типом значення, що привласнюється. Наприклад, вираз <b>Qr=Q0*Pi+0.01;</b> визначить змінну <b>Qr</b> з типом змінної <b>Q0</b>. А із реалізацією вбудованих функцій також додано оператор <b>var</b> для визначення змінних у області видимості функції замість глобальної.
</p><p>У роботі з різними типами ця мова використовує механізм автоматичного приведення типів у місцях, де подібне приведення є доцільним.
</p><p>Для коментування ділянок коду у мові передбачено символи "//" та "/* ... */". Все, що йде після "//", до кінця рядку, та між "/* ... */", ігнорується компілятором.
</p><p>У процесі генерації коду, компілятор мови здійснює оптимізацію за константам та приведення типів констант до потрібного типу. Під оптимізацією констант мається на увазі обчислення двох констант та вставка результату у код, у процесі побудови байт-коду. Наприклад, вираз <b>y=pi*10;</b> згорнеться у просте привласнення <b>y=31.4159;</b>. Під приведенням типів констант до потрібного типу мається на увазі формування константи у коді, яка виключає приведення типу в процесі виконання. Наприклад, вираз <b>y=x*"10";</b>, у випадку реального типу змінної <b>x</b>, перетвориться у <b>y=x*10;</b>.
</p><p>Вирази привласнення можуть записуватися через символ ',', наприклад:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">var1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">var2</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="nx">var4</span> <span class="o">=</span> <span class="nx">var1</span><span class="o">+</span><span class="nx">var2</span><span class="p">;</span>
<span class="k">for</span><span class="p">(</span><span class="nx">var1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">var2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">var3</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="nx">var1</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">var1</span><span class="o">++</span><span class="p">,</span> <span class="nx">var2</span><span class="o">++</span><span class="p">)</span> <span class="nx">var3</span><span class="o">++</span><span class="p">;</span>
</pre></div>
<p>Мова підтримує виклики зовнішніх та внутрішніх функцій. Ім'я будь-якої функції, взагалі, сприймається як символ, перевірка якого на належність до тієї або іншої категорії здійснюється у наступній послідовності:
</p>
<ul><li> не починається з крапки:
<ul><li> ключові слова (if, else, while, ...);</li>
<li> параметри-атрибути цієї функції;</li>
<li> іменовані-вбудовані постійні (EVAL, pi, e, ...) та постійні-об'єкти (SYS, arguments)</li>
<li> вбудовані функції (sin, cos, ...);</li>
<li> внутрішні, зовнішні функції, функції об'єкту та <a href="../User_API.html" title="Special:MyLanguage/Documents/User API">вузлів об'єктної моделі OpenSCADA</a>;</li>
<li> зареєстровані раніш автоматичні змінні;</li>
<li> глобальні атрибути параметрів DAQ та властивості змінних;</li>
<li> ключові слова (in, var);</li>
<li> створення нової автоматичної змінної, ім'я якої не має перетинатися з категоріями вище, починатися на цифру та містити символи операцій.</li></ul></li>
<li> починаються з крапки:
<ul><li> елементи шляху до властивості та функції об'єкту, ім'я яких не має починатися на цифру та містити символи операцій.</li></ul></li></ul>
<p>Виклик зовнішньої функції, як і глобального атрибуту параметру DAQ, записується у вигляді адреси до <a href="../User_API.html" title="Special:MyLanguage/Documents/User API">вузла об'єктної моделі OpenSCADA</a>: "DAQ.JavaLikeCalc.lib_techApp.klapNotLin". Для статичних функцій Ви можете наступним чином здійснювати динамічне підключення:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="kd">function</span> <span class="nx">klapNotLin</span> <span class="o">=</span> <span class="s2">"DAQ.JavaLikeCalc.lib_techApp.klapNotLin"</span><span class="p">;</span>
<span class="nx">rez</span> <span class="o">=</span> <span class="nx">klapNotLin</span><span class="p">(</span><span class="nx">prm1</span><span class="p">,</span> <span class="nx">prm2</span><span class="p">,</span> <span class="p">...,</span> <span class="nx">prmN</span><span class="p">);</span>
</pre></div>
<p>Для надання можливості написання користувацьких процедур управління різними компонентами OpenSCADA, цим модулем надається реалізація API прекомпіляції користувацьких процедур окремих компонентів OpenSCADA на мові подібної до Java. Такими компонентами, наприклад, є: шаблони параметрів <a href="../Program_manual.html#DAQ" title="Special:MyLanguage/Documents/Program manual">підсистеми "Збір даних"</a> та <a href="../Modules/VCAEngine.html" title="Special:MyLanguage/Modules/VCAEngine">середовище візуалізації та управління (СВУ)</a>.
</p>
<div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><a href="#.D0.9C.D0.BE.D0.B2.D0.B0_.D0.BF.D0.BE.D0.B4.D1.96.D0.B1.D0.BD.D0.B0_.D0.B4.D0.BE_Java"><span class="tocnumber">1</span> <span class="toctext">Мова подібна до Java</span></a>
<ul>
<li class="toclevel-2 tocsection-2"><a href="#.D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D0.B8_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="tocnumber">1.1</span> <span class="toctext">Елементи мови</span></a></li>
<li class="toclevel-2 tocsection-3"><a href="#.D0.9E.D0.BF.D0.B5.D1.80.D0.B0.D1.86.D1.96.D1.97_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="tocnumber">1.2</span> <span class="toctext">Операції мови</span></a></li>
<li class="toclevel-2 tocsection-4"><a href="#.D0.92.D0.B1.D1.83.D0.B4.D0.BE.D0.B2.D0.B0.D0.BD.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="tocnumber">1.3</span> <span class="toctext">Вбудовані функції мови</span></a></li>
<li class="toclevel-2 tocsection-5"><a href="#.D0.9E.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D0.B8_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="tocnumber">1.4</span> <span class="toctext">Оператори мови</span></a>
<ul>
<li class="toclevel-3 tocsection-6"><a href="#.D0.A3.D0.BC.D0.BE.D0.B2.D0.BD.D1.96_.D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D0.B8"><span class="tocnumber">1.4.1</span> <span class="toctext">Умовні оператори</span></a></li>
<li class="toclevel-3 tocsection-7"><a href="#.D0.A6.D0.B8.D0.BA.D0.BB.D0.B8"><span class="tocnumber">1.4.2</span> <span class="toctext">Цикли</span></a></li>
<li class="toclevel-3 tocsection-8"><a href="#.D0.92.D0.BD.D1.83.D1.82.D1.80.D1.96.D1.88.D0.BD.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97"><span class="tocnumber">1.4.3</span> <span class="toctext">Внутрішні функції</span></a></li>
<li class="toclevel-3 tocsection-9"><a href="#.D0.A1.D0.BF.D0.B5.D1.86.D1.96.D0.B0.D0.BB.D1.8C.D0.BD.D1.96_.D1.81.D0.B8.D0.BC.D0.B2.D0.BE.D0.BB.D0.B8_.D1.81.D1.82.D1.80.D0.BE.D0.BA.D0.BE.D0.B2.D0.B8.D1.85_.D0.B7.D0.BC.D1.96.D0.BD.D0.BD.D0.B8.D1.85"><span class="tocnumber">1.4.4</span> <span class="toctext">Спеціальні символи строкових змінних</span></a></li>
</ul>
</li>
<li class="toclevel-2 tocsection-10"><a href="#.D0.9E.D0.B1.27.D1.94.D0.BA.D1.82"><span class="tocnumber">1.5</span> <span class="toctext">Об'єкт</span></a></li>
<li class="toclevel-2 tocsection-11"><a href="#.D0.9F.D1.80.D0.B8.D0.BA.D0.BB.D0.B0.D0.B4.D0.B8_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.B8_.D0.BD.D0.B0_.D1.86.D1.96.D0.B9_.D0.BC.D0.BE.D0.B2.D1.96"><span class="tocnumber">1.6</span> <span class="toctext"><span>Приклади програми на цій мові</span></span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-12"><a href="#.D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.B5.D1.80.D1.83_.D1.82.D0.B0_.D0.B9.D0.BE.D0.B3.D0.BE_.D0.BA.D0.BE.D0.BD.D1.84.D1.96.D0.B3.D1.83.D1.80.D0.B0.D1.86.D1.96.D1.8F"><span class="tocnumber">2</span> <span class="toctext"><span>Об'єкт контролеру та його конфігурація</span></span></a></li>
<li class="toclevel-1 tocsection-13"><a href="#.D0.9F.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82.D1.83_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.B5.D1.80.D0.B0_.D1.82.D0.B0_.D0.B9.D0.BE.D0.B3.D0.BE_.D0.BA.D0.BE.D0.BD.D1.84.D1.96.D0.B3.D1.83.D1.80.D0.B0.D1.86.D1.96.D1.8F"><span class="tocnumber">3</span> <span class="toctext">Параметр об'єкту контролера та його конфігурація</span></a></li>
<li class="toclevel-1 tocsection-14"><a href="#.D0.91.D1.96.D0.B1.D0.BB.D1.96.D0.BE.D1.82.D0.B5.D0.BA.D0.B8_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D0.B9_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="tocnumber">4</span> <span class="toctext"><span>Бібліотеки функцій модуля</span></span></a></li>
<li class="toclevel-1 tocsection-15"><a href="#.D0.9A.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="tocnumber">5</span> <span class="toctext">Користувацькі функції модуля</span></a></li>
<li class="toclevel-1 tocsection-16"><a href="#API_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F"><span class="tocnumber">6</span> <span class="toctext">API користувацького програмування</span></a></li>
<li class="toclevel-1 tocsection-17"><a href="#.D0.A1.D0.B5.D1.80.D0.B2.D1.96.D1.81.D0.BD.D1.96_.D0.BA.D0.BE.D0.BC.D0.B0.D0.BD.D0.B4.D0.B8-.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D0.86.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.83_.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D1.96.D0.BD.D0.BD.D1.8F"><span class="tocnumber">7</span> <span class="toctext">Сервісні команди-функції Інтерфейсу Управління</span></a></li>
<li class="toclevel-1 tocsection-18"><a href="#.D0.9F.D1.80.D0.BE.D0.B4.D1.83.D0.BA.D1.82.D0.B8.D0.B2.D0.BD.D1.96.D1.81.D1.82.D1.8C"><span class="tocnumber">8</span> <span class="toctext"><span>Продуктивність</span></span></a></li>
<li class="toclevel-1 tocsection-19"><a href="#.D0.9F.D0.BE.D1.81.D0.B8.D0.BB.D0.B0.D0.BD.D0.BD.D1.8F"><span class="tocnumber">9</span> <span class="toctext">Посилання</span></a></li>
</ul>
</div>

<h2><span class="mw-headline" id=".D0.9C.D0.BE.D0.B2.D0.B0_.D0.BF.D0.BE.D0.B4.D1.96.D0.B1.D0.BD.D0.B0_.D0.B4.D0.BE_Java"><span class="mw-headline-number">1</span> Мова подібна до Java</span></h2>
<h3><span class="mw-headline" id=".D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D0.B8_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="mw-headline-number">1.1</span> Елементи мови</span></h3>
<p><i>Ключові слова:</i> <b>if</b>, <b>else</b>, <b>while</b>, <b>for</b>, <b>in</b>, <b>break</b>, <b>continue</b>, <b>return</b>, <b>function</b>, <b>using</b>.<br />
<i>Постійні:</i>
</p>
<ul><li> десяткові: цифри <b>0-9</b> (12, 111, 678);</li>
<li> вісімкові: цифри <b>0-7</b> (012, 011, 076);</li>
<li> шістнадцяткові: цифри <b>0-9</b>, літери <b>a-f</b> або <b>A-F</b> (0x12, 0XAB);</li>
<li> реальні: <b>345.23</b>, <b>2.1e5</b>, <b>3.4E-5</b>, <b>3e6</b>;</li>
<li> логічні: <b>true</b>, <b>false</b>;</li>
<li> строкові: <b>"hello"</b>, без переходу на наступний рядок однак з підтримкою прямої конкатенації строкових констант.</li></ul>
<p><i>Типи змінних:</i>
</p>
<ul><li> ціле: <b>-2<sup>63</sup></b> ... <b>2<sup>63</sup></b>, <b>EVAL_INT</b>(-9223372036854775807);</li>
<li> реальне: <b>3.4*10<sup>308</sup></b>, <b>EVAL_REAL</b>(-1.79E308);</li>
<li> логічне: <b>false</b>, <b>true</b>, <b>EVAL_BOOL</b>(2);</li>
<li> рядок: послідовність символів-байтів (0...255) будь якої довжини, обмеженої об'ємом пам'яті та сховищем у БД; <b>EVAL_STR</b>("&lt;EVAL&gt;").</li></ul>
<p><i>Вбудовані константи:</i> <b>pi</b> = 3.14159265..., <b>e</b> = 2.71828182..., <b>EVAL_BOOL</b>(2), <b>EVAL_INT</b>(-9223372036854775807), <b>null</b>,<b>EVAL</b>,<b>EVAL_REAL</b>(-1.79E308), <b>EVAL_STR</b>("&lt;EVAL&gt;")<br />
<i>Глобальні атрибути параметрів DAQ (починаючи з підсистеми DAQ та у вигляді <b>{Тип модуля DAQ}.{Об'єкт контролеру}.{Параметр}.{Атрибут}</b>).</i><br />
<i>Функції та параметри <a href="../User_API.html" title="Special:MyLanguage/Documents/User API">об'єктної моделі OpenSCADA</a>.</i>
</p><p><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Варіанти <b>EVAL</b> (Error VALue) і <b>null</b> опрацьовуються особливо через перетворення одного у інше залежно від використаного базового типу, тобто ви вільні у використанні лише <b>null</b> або <b>EVAL</b> у будь яких випадках.
</p>
<h3><span class="mw-headline" id=".D0.9E.D0.BF.D0.B5.D1.80.D0.B0.D1.86.D1.96.D1.97_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="mw-headline-number">1.2</span> Операції мови</span></h3>
<p>Операції, підтримувані мовою, представлено у таблиці нижче. Пріоритет операцій зменшується зверху донизу. Операції з однаковим пріоритетом входять до однієї групи кольору.
</p>
<table bgcolor="#FFFFF0" border="1" cellspacing="0">
<tr align="center" bgcolor="#83D8FF"><td><b>Символ</b></td><td><b>Опис</b></td></tr>
<tr bgcolor="#FFFFC0"><td>()</td><td>Виклик функції.</td></tr>
<tr><td>{}</td><td>Програмні блоки.</td></tr>
<tr><td>++</td><td>Інкремент (пост та пре).</td></tr>
<tr><td>--</td><td>Декремент (пост та пре).</td></tr>
<tr bgcolor="#FFFFC0"><td>-</td><td>Унарний мінус.</td></tr>
<tr bgcolor="#FFFFC0"><td>!</td><td>Логічне заперечення.</td></tr>
<tr bgcolor="#FFFFC0"><td>~</td><td>Побітове заперечення.</td></tr>
<tr><td>*</td><td>Множення.</td></tr>
<tr><td>/</td><td>Ділення.</td></tr>
<tr><td>%</td><td>Залишок від цілочисельного ділення.</td></tr>
<tr bgcolor="#FFFFC0"><td>+</td><td>Складання</td></tr>
<tr bgcolor="#FFFFC0"><td>-</td><td>Віднімання</td></tr>
<tr><td>&lt;&lt;</td><td>Порозрядний зсув ліворуч</td></tr>
<tr><td>&gt;&gt;</td><td>Порозрядний зсув праворуч</td></tr>
<tr bgcolor="#FFFFC0"><td>&gt;</td><td>Більше</td></tr>
<tr bgcolor="#FFFFC0"><td>&gt;=</td><td>Більше або дорівнює</td></tr>
<tr bgcolor="#FFFFC0"><td>&lt;</td><td>Менше</td></tr>
<tr bgcolor="#FFFFC0"><td>&lt;=</td><td>Менше або дорівнює</td></tr>
<tr bgcolor="#FFFFC0"><td>==</td><td>Дорівнює</td></tr>
<tr bgcolor="#FFFFC0"><td>!=</td><td>Не дорівнює</td></tr>
<tr><td>|</td><td>Порозрядне "АБО"</td></tr>
<tr><td>&amp;</td><td>Порозрядне "ТАК"</td></tr>
<tr><td>^</td><td>Порозрядне "Виключне АБО"</td></tr>
<tr bgcolor="#FFFFC0"><td>&amp;&amp;</td><td>Логічне "ТАК"</td></tr>
<tr bgcolor="#FFFFC0"><td>||</td><td>Логічне "АБО"</td></tr>
<tr><td>?:</td><td>Умовна операція "i=(i&lt;0)?0:i;"</td></tr>
<tr bgcolor="#FFFFC0"><td>=</td><td>Привласнення.</td></tr>
<tr bgcolor="#FFFFC0"><td>+=</td><td>Привласнення із складанням.</td></tr>
<tr bgcolor="#FFFFC0"><td>-=</td><td>Привласнення із відніманням.</td></tr>
<tr bgcolor="#FFFFC0"><td>*=</td><td>Привласнення із множенням.</td></tr>
<tr bgcolor="#FFFFC0"><td>/=</td><td>Привласнення із діленням.</td></tr>
</table>
<h3><span class="mw-headline" id=".D0.92.D0.B1.D1.83.D0.B4.D0.BE.D0.B2.D0.B0.D0.BD.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="mw-headline-number">1.3</span> Вбудовані функції мови</span></h3>
<p>Віртуальною машиною мови передбачено наступний набір вбудованих функцій загального призначення:
</p>
<ul><li> <i>double max(double x, double x1)</i> — максимальне значення із <i>x</i> та <i>x1</i>;</li>
<li> <i>double min(double x, double x1)</i> — мінімальне значення із <i>x</i> та <i>x1</i>;</li>
<li> <i>string typeof(ElTp vl)</i> — тип значення <i>vl</i>;</li>
<li> <i>string tr(string base)</i> — переклад базового <i>base</i> повідомлення.</li></ul>
<p>Для забезпечення високої швидкості роботи у математичних обчисленнях модуль надає вбудовані математичні функції, які викликаються на рівні команд віртуальної машини:
</p>
<ul><li> <i>double sin(double x)</i> — синус <i>x</i>;</li>
<li> <i>double cos(double x)</i> — косинус <i>x</i>;</li>
<li> <i>double tan(double x)</i> — тангенс <i>x</i>;</li>
<li> <i>double sinh(double x)</i> — синус гіперболічний від <i>x</i>;</li>
<li> <i>double cosh(double x)</i> — косинус гіперболічний від <i>x</i>;</li>
<li> <i>double tanh(double x)</i> — тангенс гіперболічний від <i>x</i>;</li>
<li> <i>double asin(double x)</i> — арксинус від <i>x</i>;</li>
<li> <i>double acos(double x)</i> — арккосинус від <i>x</i>;</li>
<li> <i>double atan(double x)</i> — арктангенс від <i>x</i>;</li>
<li> <i>double rand(double x)</i> — випадкове число від 0 до <i>x</i>;</li>
<li> <i>double lg(double x)</i> — десятковий логарифм від <i>x</i>;</li>
<li> <i>double ln(double x)</i> — натуральний логарифм від <i>x</i>;</li>
<li> <i>double exp(double x)</i> — експонента від <i>x</i>;</li>
<li> <i>double pow(double x, double x1)</i> — зведення <i>x</i> у степінь <i>x1</i>;</li>
<li> <i>double sqrt(double x)</i> — корінь квадратний від <i>x</i>;</li>
<li> <i>double abs(double x)</i> — абсолютне значення від <i>x</i>;</li>
<li> <i>double sign(double x)</i> — знак числа <i>x</i>;</li>
<li> <i>double ceil(double x)</i> — округлення числа <i>x</i> до більшого цілого;</li>
<li> <i>double floor(double x)</i> — округлення числа <i>x</i> до меншого цілого.</li></ul>
<h3><span class="mw-headline" id=".D0.9E.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D0.B8_.D0.BC.D0.BE.D0.B2.D0.B8"><span class="mw-headline-number">1.4</span> Оператори мови</span></h3>
<p>Загальний перелік операторів мови:
</p>
<ul><li> <i>var</i> — оператор ініціалізації змінної; визначення змінної без привласнення значення резервує її зі значенням <b>null</b>-<b>EVAL</b>, що дозволяє здійснити одноразову ініціалізацію складних типів даних на кшталт об'єкту, через пряме порівняння і перевірку із <i>isEVal()</i>;</li>
<li> <i>if</i> — оператор умови "ЯКЩО";</li>
<li> <i>else</i> — оператор умови "ІНАКШЕ";</li>
<li> <i>while</i> — визначення циклу "ПОКИ";</li>
<li> <i>for</i> — визначення циклу "ДЛЯ";</li>
<li> <i>in</i> — роздільник циклу "ДЛЯ" для перебору властивостей об'єкту;</li>
<li> <i>break</i> — переривання виконання циклу;</li>
<li> <i>continue</i> — продовжити виконання циклу з початку;</li>
<li> <i>function</i> — визначення внутрішньої функції;</li>
<li> <i>using</i> — дозволяє встановити простір видимості зовнішніх функцій часто використовної бібліотеки (<b>using Special.FLibSYS;</b>) для наступного звернення тільки за назвою функції, не має ефекту для об'єктного доступу;</li>
<li> <i>return</i> — переривання функції та повернення результату, який копіюється до атрибуту із ознакою повернення (<b>return 123;</b>); в середині внутрішньої функції здійснюється її завершення з визначеним результатом;</li>
<li> <i>new</i> — створення об'єкту, реалізовано для: загальний об'єкт "Object", масив "Array" та регулярні вирази "RegExp";</li>
<li> <i>delete</i> — видалення/звільнення об'єкту або його властивостей, при цьому: внутрішні змінні встановлюються у <b>null</b>-<b>EVAL</b>, зовнішні замінюються порожнім об'єктом, а властивості об'єкту очищуються.</li></ul>
<h4><span class="mw-headline" id=".D0.A3.D0.BC.D0.BE.D0.B2.D0.BD.D1.96_.D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D0.B8"><span class="mw-headline-number">1.4.1</span> Умовні оператори</span></h4>
<p>Мовою підтримуються два типи умов. Перший — це операції умови для використання всередині виразу, другий — глобальний, заснований на умовних операторах.
</p><p>Умова всередині виразу будується на операціях '?' та ':'. У якості прикладу можна записати наступний практичний вираз:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">st_open</span> <span class="o">=</span> <span class="p">(</span><span class="nx">pos</span> <span class="o">&gt;=</span> <span class="mi">100</span><span class="p">)</span> <span class="o">?</span> <span class="kc">true</span> <span class="o">:</span> <span class="kc">false</span><span class="p">;</span>
</pre></div>
<p>Що читається як — якщо змінна <i>pos</i> більша або дорівнює <b>100</b>, тоді змінній <i>st_open</i> привласнюється значення <b>true</b>, інакше — <b>false</b>.
</p><p>Глобальна умова будується на основі умовних операторів "if" та "else". У якості прикладу можна привести той-же вираз, але записаний у інший спосіб:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="p">(</span><span class="nx">pos</span> <span class="o">&gt;</span> <span class="mi">100</span><span class="p">)</span> <span class="nx">st_open</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="k">else</span> <span class="nx">st_open</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</pre></div>
<h4><span class="mw-headline" id=".D0.A6.D0.B8.D0.BA.D0.BB.D0.B8"><span class="mw-headline-number">1.4.2</span> Цикли</span></h4>
<p>Підтримується три типи циклів: <b>while</b>, <b>for</b> та <b>for-in</b>. Синтаксис циклів відповідає мовам програмування: C++, Java та JavaScript.
</p><p>Цикл <b>while</b>, загалом, записується наступним чином: <b>while({умова}) {тіло циклу};</b><br />
Цикл <b>for</b> записується наступним чином: <b>for({пре-ініціаліз};{умова};{пост-обчислення}) {тіло циклу};</b><br />
Цикл <b>for-in</b> записується наступним чином: <b>for({змінна} in {об'єкт}) {тіло циклу};</b><br />
Де:
</p>
<dl><dd><i>{умова}</i> — вираз, який визначає умову;</dd>
<dd><i>{тіло циклу}</i> — тіло циклу множинного виконання;</dd>
<dd><i>{пре-ініціаліз}</i> — вираз попередньої ініціалізації змінних циклу;</dd>
<dd><i>{пост-обчислення}</i> — вираз модифікації параметрів циклу після чергової ітерації;</dd>
<dd><i>{змінна}</i> — змінна, яка буде містити ім'я властивості об'єкта при переборі;</dd>
<dd><i>{об'єкт}</i> — об'єкт для якого здійснюється перебір властивостей.</dd></dl>
<h4><span class="mw-headline" id=".D0.92.D0.BD.D1.83.D1.82.D1.80.D1.96.D1.88.D0.BD.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97"><span class="mw-headline-number">1.4.3</span> Внутрішні функції</span></h4>
<p>Мова підтримує визначення та виклик внутрішніх функцій. Для визначення внутрішньої функції використовується ключове слово "function" та в цілому визначення має синтаксис: <b>function {ім'яФ} ({зм1}, {зм2}, ... {змN}) { {тіло функції} }</b>. Визначення внутрішньої функції всередині іншої недозволене однак дозволено виклик раніш визначеної.
</p><p>Виклик внутрішньої функції здійснюється у типовий спосіб, як процедура <b>{ім'яФ}({var1}, {var2}, ... {varN});</b> або як функція <b>{змРез} = {ім'яФ}({зм1}, {зм2}, ... {змN});</b>. Виклик внутрішніх функцій допустимий тільки після їх декларації вище!
</p><p>Всі змінні, визначені у основному тілі, недоступні всередині внутрішніх функцій і можуть бути передані через двобічні аргументи викликуваної внутрішньої функції або через аргументи основної функції. Всі змінні, визначені в середині внутрішньої функції, мають власний простір назв та недоступні із основного тіла, або будь якої іншої внутрішньої функції, та можуть бути передані в основне тіло через двобічні аргументи, результат викликуваної внутрішньої функції або через аргументи основної функції. Змінні внутрішньої функції реєструються для збереження/відновлення їх контексту після другого та більше входу до функції, тож вони цілковито підтримують рекурсивні виклики!
</p><p>Оператор "return", в середині внутрішньої функції, здійснює контрольоване її завершення та розташування вказаної змінної, або результату виразу, як результату викликуваної внутрішньої функції.
</p><p>Приклад типового визначення та використання внутрішньої функції наведено далі:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="kd">function</span> <span class="nx">sum</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">,</span> <span class="nx">c</span><span class="p">,</span> <span class="nx">d</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="p">((</span><span class="nx">b</span><span class="o">==</span><span class="kc">null</span><span class="p">)</span><span class="o">?</span><span class="mi">0</span><span class="o">:</span><span class="nx">b</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="nx">c</span><span class="o">==</span><span class="kc">null</span><span class="p">)</span><span class="o">?</span><span class="mi">0</span><span class="o">:</span><span class="nx">c</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="nx">d</span><span class="o">==</span><span class="kc">null</span><span class="p">)</span><span class="o">?</span><span class="mi">0</span><span class="o">:</span><span class="nx">d</span><span class="p">);</span> <span class="p">}</span>
<span class="nx">rez</span> <span class="o">=</span> <span class="nx">sum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</pre></div>
<h4><span class="mw-headline" id=".D0.A1.D0.BF.D0.B5.D1.86.D1.96.D0.B0.D0.BB.D1.8C.D0.BD.D1.96_.D1.81.D0.B8.D0.BC.D0.B2.D0.BE.D0.BB.D0.B8_.D1.81.D1.82.D1.80.D0.BE.D0.BA.D0.BE.D0.B2.D0.B8.D1.85_.D0.B7.D0.BC.D1.96.D0.BD.D0.BD.D0.B8.D1.85"><span class="mw-headline-number">1.4.4</span> Спеціальні символи строкових змінних</span></h4>
<p>Мовою передбачено підтримку наступних спеціальних символів строкових змінних:
</p>
<dl><dd>"\n" — переведення рядка;</dd>
<dd>"\t" — символ табуляції;</dd>
<dd>"\b" — забій;</dd>
<dd>"\f" — перевід сторінки;</dd>
<dd>"\r" — повернення каретки;</dd>
<dd>"\\" — сам символ '\';</dd>
<dd>"\041" — символ '!', записаний вісімковим числом;</dd>
<dd>"\x21" — символ '!', записаний шістнадцятковим числом.</dd></dl>
<p><br />
</p>
<h3><span class="mw-headline" id=".D0.9E.D0.B1.27.D1.94.D0.BA.D1.82"><span class="mw-headline-number">1.5</span> Об'єкт</span></h3>
<p>JavaLikeCalc надає підтримку типу даних об'єкт "Object". Об'єкт представляє собою асоціативний контейнер властивостей та функцій. Властивості можуть містити як дані чотирьох базових типів, так і інші об'єкти. Доступ до властивостей об'єкту може здійснюватися за посередництвом запису імен властивостей до об'єкту <i>obj.prop</i>, через крапку, а також за посередництвом включення імені властивості у квадратні дужки <i>obj["prop"]</i>. Очевидно, що перший механізм статичний, а другий дозволяє вказувати ім'я властивості через змінну. Ім'я властивості через крапку не має починатися на цифру та містити символи операцій, інакше, для першої цифри, має використовуватися <a href="../User_API.html" title="Special:MyLanguage/Documents/User API">префікс об'єкту</a> — <b>SYS.BD.SQLite.db_1s</b>, або здійснюватися запис у квадратних дужках — <b>SYS.BD.SQLite["1+s"]</b>, для символів операцій у назві. Видалити властивість об'єкту можна директивою "delete". Читання невизначеної властивості поверне <b>null</b>-<b>EVAL</b>. Створення об'єкту здійснюється за посередництвом ключового слова <i>new</i>: <b>varO = new Object()</b>. Базове визначення об'єкту не містить функцій. Операції копіювання об'єкту, насправді, роблять посилання на початковий об'єкт. При видаленні об'єкту здійснюється зменшення лічильника посилань, а за досягненням лічильника нуля, об'єкт видаляється фізично.
</p><p>Різні компоненти OpenSCADA можуть довизначати базовий об'єкт особливими властивостями та функціями. Стандартним розширенням об'єкту є масив "Array", який створюється командою <b>varO = new Array(prm1,prm2,prm3,...,prmN)</b>. Перелічені через кому параметри поміщаються до масиву у вихідній послідовності. Якщо параметр тільки один тоді масив ініціюється вказаною кількістю порожніх елементів. Особливістю масиву є те, що він працює із властивостями, як з індексами та основним механізмом звернення є включення індексу у квадратні дужки <i>arr[1]</i>. Масив зберігає властивості у власному контейнері одномірного масиву. Цифрові властивості масиву використовуються для доступу безпосередньо до масиву, а символьні працюють як властивості об'єкту. Детальніше про властивості та функції масиву можна прочитати за <a href="../User_API.html#Array" title="Special:MyLanguage/Documents/User API">посиланням</a>.
</p><p>Об'єкт регулярного виразу "RegExp" створюється командою <b>varO = new RegExp(pat, flg)</b>, де <i>pat</i> — шаблон регулярного виразу, а <i>flg</i> — ознаки пошуку. Об'єкт роботи із регулярними виразами оснований на бібліотеці "PCRE". При глобальному пошуку встановлюється атрибут об'єкту "lastIndex", що дозволяє продовжити пошук у наступному виклику функції. У випадку невдалого пошуку атрибут "lastIndex" скидається у нуль. Детальніше про властивості та функції об'єкту регулярного виразу можна прочитати за <a href="../User_API.html#RegExp" title="Special:MyLanguage/Documents/User API">посиланням</a>.
</p><p>Для довільного доступу до аргументів функції передбачено об'єкт аргументів, звернутися до якого можна за посередництвом символу "arguments". Цей об'єкт містить властивість "length" з кількістю аргументів у функції та дозволяє звернутися до значень аргументу за посередництвом його <b>номеру</b> або <b>ідентифікатору</b>. Розглянемо перебір аргументів по циклу:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">args</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Array</span><span class="p">();</span>
<span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span>
  <span class="nx">args</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">arguments</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</pre></div>
<p>Часткові властивості об'єкту мають і базові типи. Властивості та функції базових типів приведено нижче:
</p>
<ul><li> Нульовий тип, функції:
<ul><li> <i>bool isEVal();</i> — повертає "true".</li></ul></li></ul>
<ul><li> Логічний тип, функції:
<ul><li> <i>bool isEVal(); bool isNaN( );</i> — перевіряє значення на <b>null</b>-<b>EVAL</b>.</li>
<li> <i>string toString();</i> — надає значення у вигляді рядка "true" або "false".</li></ul></li></ul>
<dl><dd><ul><li> <i>real toReal();</i> — читає логічне значення як реальне число.</li>
<li> <i>int toInt();</i> — читає логічне значення як ціле число.</li></ul></dd></dl>
<ul><li> Ціле та реальне число:</li></ul>
<dl><dd><dl><dt> <i>Властивості:</i></dt></dl>
<ul><li> <i>MAX_VALUE</i> — максимальне значення;</li>
<li> <i>MIN_VALUE</i> — мінімальне значення;</li>
<li> <i>NaN</i> — недостовірне значення.</li></ul>
<dl><dt> <i>Функції:</i></dt></dl>
<ul><li> <i>bool isEVal(); bool isNaN( );</i> — перевіряє значення на <b>null</b>-<b>EVAL</b>, та не число для Реального.</li>
<li> <i>string toExponential( int numbs = -1 );</i> — повертає рядок відформатованого числа, у експоненціальній нотації та кількістю значущих цифр <i>numbs</i>. Якщо <i>numbs</i> відсутній то цифр буде стільки скільки потрібно.</li>
<li> <i>string toFixed( int numbs = 0, int len = 0, bool sign = false );</i> — повертає рядок відформатованого числа в нотації з фіксованою точкою та кількістю цифр після десяткової точки <i>numbs</i>, з мінімальною довжиною <i>len</i> та обов'язковим знаком <i>sign</i>. Якщо <i>numbs</i> відсутній то кількість цифр після десяткової точки дорівнює нулю.</li>
<li> <i>string toPrecision( int prec = -1 );</i> — повертає рядок відформатованого числа з кількістю значущих цифр <i>prec</i>. </li>
<li> <i>string toString( int base = 10, int len = -1, bool sign = false );</i> — повертає рядок відформатованого числа цілого типу з базою представлення <i>base</i> (2-36), з мінімальною довжиною <i>len</i> та обов'язковим знаком <i>sign</i>.</li>
<li> <i>real toReal();</i> — читає ціле-реальне значення як реальне число.</li>
<li> <i>int toInt();</i> — читає ціле-реальне значення як ціле число.</li></ul></dd></dl>
<ul><li> Рядок:</li></ul>
<dl><dd><dl><dt> <i>Властивості:</i></dt></dl>
<ul><li> <i>int length</i> — довжина рядка.</li></ul>
<dl><dt> <i>Функції:</i></dt></dl>
<ul><li> <i>bool isEVal();</i> — перевіряє значення на <b>null</b>-<b>EVAL</b>.</li>
<li> <i>bool isNaN( bool whole = true );</i> — перевіряє рядок на не число, та загалом <i>whole</i>.</li>
<li> <i>string charAt( int symb, string type = "" );</i> — дістає із рядка символ за номером <i>symb</i> типу <i>type</i>. Наступні типи символу підтримуються: ""-ASCII та простий одно байтовий, UTF-8, UTF-16, UTF-32. У випадку із UTF-8, позиція символу <i>symb</i> змінюється у позицію наступного символу оскільки довжина символів цього типу змінна.</li>
<li> <i>int charCodeAt( int symb, string type = "" );</i> — дістає із рядка код символу <i>symb</i> типу <i>type</i>. Наступні типи символу підтримуються: ""-ASCII та простий одно байтовий, UTF-8, UTF-16, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE. У випадку із UTF-8, позиція символу <i>symb</i> змінюється у позицію наступного символу оскільки довжина символів цього типу змінна.</li>
<li> <i>string concat( string val1, string val2, ... );</i> — повертає новий рядок, сформований шляхом приєднання значень <i>val1</i> та інші до початкового.</li>
<li> <i>int indexOf( string substr, int start = 0 );</i> — повертає позицію пошукового рядка <i>substr</i> у вихідному рядку, починаючи з позиції <i>start</i>. Якщо вихідна позиція не вказана то пошук починається з початку. Якщо шуканого рядка не знайдено то повертається "-1".</li>
<li> <i>int lastIndexOf( string substr, int start = {end} );</i> — повертає позицію шуканого рядка <i>substr</i> у вихідному рядку починаючи з позиції <i>start</i>, при пошуку з кінця. Якщо вихідна позиція не вказана то пошук починається з кінця. Якщо шуканого рядку не знайдено то повертається "-1".</li>
<li> <i>int search( string pat, string flg = "" );</i> — шукає у рядку за шаблоном <i>pat</i> та ознаками шаблону <i>flg</i>. Повертає положення знайденого рядку інакше "-1".</li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="kd">var</span> <span class="nx">rez</span> <span class="o">=</span> <span class="s2">"Java123Script"</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="s2">"script"</span><span class="p">,</span><span class="s2">"i"</span><span class="p">);</span>  <span class="c1">// rez = 7</span>
</pre></div>
<dl><dd><ul><li> <i>int search( RegExp pat );</i> — шукає у рядку за шаблоном "RegExp" <i>pat</i>. Повертає положення найденого підрядку інакше "-1".</li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="kd">var</span> <span class="nx">rez</span> <span class="o">=</span> <span class="s2">"Java123Script"</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span><span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">"script"</span><span class="p">,</span><span class="s2">"i"</span><span class="p">));</span>  <span class="c1">// rez = 7</span>
</pre></div>
<dl><dd><ul><li> <i>Array match( string pat, string flg = "" );</i> — шукає у рядку за шаблоном <i>pat</i> та ознаками шаблону <i>flg</i>. Повертає масив із знайденим підрядком (0) та підвиразами (&gt;1). Атрибут "index" масиву встановлюється у позицію знайденого підрядка. Атрибут "input" встановлюється у початковий рядок. Атрибут "err" встановлюється у код помилки операції.</li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="kd">var</span> <span class="nx">rez</span> <span class="o">=</span> <span class="s2">"1 плюс 2 плюс 3"</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="s2">"\\d+"</span><span class="p">,</span><span class="s2">"g"</span><span class="p">);</span>  <span class="c1">// rez = [1], [2], [3]</span>
</pre></div>
<dl><dd><ul><li> <i>Array match( TRegExp pat );</i> — шукає у рядку за шаблоном "RegExp" <i>pat</i>. Повертає масив зі знайденим підрядком (0) та підвиразами (&gt;1). Атрибут "index" масиву встановлюється у позицію знайденого підрядка. Атрибут "input" встановлюється у початковий рядок. Атрибут "err" встановлюється у код помилки операції.</li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="kd">var</span> <span class="nx">rez</span> <span class="o">=</span> <span class="s2">"1 плюс 2 плюс 3"</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">"\\d+"</span><span class="p">,</span><span class="s2">"g"</span><span class="p">));</span>  <span class="c1">// rez = [1], [2], [3]</span>
</pre></div>
<dl><dd><ul><li> <i>string slice( int beg, int end ); string substring( int beg, int end );</i> — повертає підрядок вилучений з початкового, починаючи з позиції <i>beg</i> та до <i>end</i> (не включаючи), нумерація з нуля. Якщо значення початку або кінця негативне, то відлік ведеться з кінця рядку. Якщо кінець не вказано, то кінцем є кінець рядку. Наприклад, конструкція <b>substring(-2)</b> поверне останні два символи рядку.</li>
<li> <i>Array split( string sep, int limit = 0 );</i> — повертає масив елементів рядку поділених <i>sep</i> та з обмеженням кількості елементів <i>limit</i> (0 без обмеження).</li>
<li> <i>Array split( RegExp pat, int limit = 0 );</i> — повертає масив елементів рядку поділених шаблоном "RegExp" <i>pat</i> та з обмеженням кількості елементів <i>limit</i> (0 без обмеження).</li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="nx">rez</span> <span class="o">=</span> <span class="s2">"1,2, 3 , 4 ,5"</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">"\\s*,\\s*"</span><span class="p">));</span>  <span class="c1">// rez = [1], [2], [3], [4], [5]</span>
</pre></div>
<dl><dd><ul><li> <i>string insert( int pos, string substr );</i> — вставляє підрядок <i>substr</i> у позицію <i>pos</i> поточного рядку.</li>
<li> <i>string replace( int pos, int n, string str );</i> — замінює підрядок з позиції <i>pos</i> та довжиною <i>n</i> у поточному рядку, на рядок <i>str</i>.</li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="nx">rez</span> <span class="o">=</span> <span class="s2">"Javascript"</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="s2">"67"</span><span class="p">);</span>  <span class="c1">// rez = "Java67ipt"</span>
</pre></div>
<dl><dd><ul><li> <i>string replace( string substr, string str );</i> — замінює всі підрядки <i>substr</i> на рядок <i>str</i>. </li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="nx">rez</span> <span class="o">=</span> <span class="s2">"123 321"</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="s2">"3"</span><span class="p">,</span><span class="s2">"55"</span><span class="p">);</span>  <span class="c1">// rez = "1255 5521"</span>
</pre></div>
<dl><dd><ul><li> <i>string replace( RegExp pat, string str );</i> — замінює підрядок за шаблоном <i>pat</i> на рядок <i>str</i>.</li></ul></dd></dl>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 30pt"><pre><span class="nx">rez</span> <span class="o">=</span> <span class="s2">"value = \"123\""</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">"\"([^\"]*)\""</span><span class="p">,</span><span class="s2">"g"</span><span class="p">),</span><span class="s2">"``$1''"</span><span class="p">));</span>  <span class="c1">// rez = "value = ``123''"</span>
</pre></div>
<dl><dd><ul><li> <i>real toReal();</i> — перетворює поточной рядок у реальне число.</li>
<li> <i>int toInt( int base = 10 );</i> — перетворює поточний рядок у ціле число, відповідно до основи <i>base</i> (від 2 до 36). Якщо основа дорівнює 0 тоді буде враховуватися префіксний запис для визначення основи (123-десяткове; 0123-вісімкове; 0x123-шістнадцяткове).</li>
<li> <i>string {parse,parseEnd}( int pos, string sep = ".", int off = {0,{length}}, bool mergeSepSymb = false );</i> — виокремлює із вихідного рядку елемент <i>pos</i> для роздільника елементів <i>sep</i> та від зміщення <i>off</i> (зупинка на початку наступного токену, або кінці для <i>parseEnd</i>). <i>mergeSepSymb</i> визначає дозвіл поєднання групи однакових символів у один роздільник. Результуюче зміщення поміщається назад до <i>off</i>. <i>parseEnd()</i> робить те саме, але з кінця.</li>
<li> <i>string parseLine( int pos, int off = 0 );</i> — виокремлює рядок з номером <i>pos</i> від зміщення <i>off</i> (зупинка на початку наступного токену). Результуюче зміщення поміщається назад до <i>off</i>.</li>
<li> <i>string parsePath( int pos, int offCmptbl = 0, int off = 0 );</i> — виділяє з початкового шляху елемент <i>pos</i> від зміщення <i>off</i> (зупинка на початку наступного токену) або <i>offCmtbl</i> (зупинка на наступному символі кінця поточного токену — для сумісності). Результуюче зміщення поміщається назад до <i>off</i> або <i>offCmtbl</i>.</li>
<li> <i>string parsePathEnd( int pos, int off = {length} );</i> — виділяє з кінця рядка початкового шляху елемент <i>pos</i> від зміщення <i>off</i> (зупинка на кінці наступного токену). Результуюче зміщення поміщається назад до <i>off</i>.</li>
<li> <i>string path2sep( string sep = "." );</i> — перетворює шлях у поточному рядку у рядок з розділювачем <i>sep</i>.</li>
<li> <i>string trim( string cfg = " \n\t\r" );</i> — обрізає рядок з початку та кінцю, для символів <i>cfg</i>.</li></ul></dd></dl>
<p><br />
Для доступу до <a href="../User_API.html" title="Special:MyLanguage/Documents/User API">системних об'єктів(вузлів) OpenSCADA</a> передбачено відповідний об'єкт, який створюється шляхом простого вказання точки входу "SYS" кореневого об'єкту OpenSCADA, а надалі, через крапку, вказуються вкладені об'єкти, відповідно до ієрархії. Наприклад, виклик функції запиту через вихідний транспорт здійснюється наступним чином: <b>SYS.Transport.Sockets.out_testModBus.messIO(Special.FLibSYS.strEnc2Bin("15 01 00 00 00 06 01 03 00 00 00 05"));</b>.
</p>
<h3><span class="mw-headline" id=".D0.9F.D1.80.D0.B8.D0.BA.D0.BB.D0.B0.D0.B4.D0.B8_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.B8_.D0.BD.D0.B0_.D1.86.D1.96.D0.B9_.D0.BC.D0.BE.D0.B2.D1.96"><span class="mw-headline-number">1.6</span> <span id="Examples" title="#Examples">Приклади програми на цій мові</span></span></h3>
<p>Наведемо декілька прикладів програм на мові подібній до Java:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="c1">//Модель ходу виконавчого механізму кульового крану</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="nx">st_close</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nx">com</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="p">(</span><span class="nx">st_open</span> <span class="o">&amp;&amp;</span> <span class="nx">com</span><span class="p">))</span>
<span class="p">{</span>
  <span class="nx">tmp_up</span> <span class="o">=</span> <span class="p">(</span><span class="nx">pos</span><span class="o">&gt;</span><span class="mi">0</span><span class="o">&amp;&amp;</span><span class="nx">pos</span><span class="o">&lt;</span><span class="mi">100</span><span class="p">)</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="p">(</span><span class="nx">tmp_up</span><span class="o">&gt;</span><span class="mi">0</span><span class="o">&amp;&amp;</span><span class="nx">lst_com</span><span class="o">==</span><span class="nx">com</span><span class="p">)</span> <span class="o">?</span> <span class="nx">tmp_up</span><span class="o">-</span><span class="mi">1</span><span class="o">/</span><span class="nx">frq</span> <span class="o">:</span> <span class="nx">t_up</span><span class="p">;</span>
  <span class="nx">pos</span> <span class="o">+=</span> <span class="p">(</span><span class="nx">tmp_up</span><span class="o">&gt;</span><span class="mi">0</span><span class="p">)</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="p">(</span><span class="mi">100</span><span class="o">*</span><span class="p">(</span><span class="nx">com</span><span class="o">?</span><span class="mi">1</span><span class="o">:-</span><span class="mi">1</span><span class="p">))</span><span class="o">/</span><span class="p">(</span><span class="nx">t_full</span><span class="o">*</span><span class="nx">frq</span><span class="p">);</span>
  <span class="nx">pos</span> <span class="o">=</span> <span class="p">(</span><span class="nx">pos</span><span class="o">&gt;</span><span class="mi">100</span><span class="p">)</span> <span class="o">?</span> <span class="mi">100</span> <span class="o">:</span> <span class="p">(</span><span class="nx">pos</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">)</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="nx">pos</span><span class="p">;</span>
  <span class="nx">st_open</span> <span class="o">=</span> <span class="p">(</span><span class="nx">pos</span><span class="o">&gt;=</span><span class="mi">100</span><span class="p">)</span> <span class="o">?</span> <span class="kc">true</span> <span class="o">:</span> <span class="kc">false</span><span class="p">;</span>
  <span class="nx">st_close</span> <span class="o">=</span> <span class="p">(</span><span class="nx">pos</span><span class="o">&lt;=</span><span class="mi">0</span><span class="p">)</span> <span class="o">?</span> <span class="kc">true</span> <span class="o">:</span> <span class="kc">false</span><span class="p">;</span>
  <span class="nx">lst_com</span> <span class="o">=</span> <span class="nx">com</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="c1">//Модель клапану</span>
<span class="nx">Qr</span> <span class="o">=</span> <span class="nx">Q0</span> <span class="o">+</span> <span class="nx">Q0</span><span class="o">*</span><span class="nx">Kpr</span><span class="o">*</span><span class="p">(</span><span class="nx">Pi</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="mf">0.01</span><span class="p">;</span>
<span class="nx">Sr</span> <span class="o">=</span> <span class="p">(</span><span class="nx">S_kl1</span><span class="o">*</span><span class="nx">l_kl1</span><span class="o">+</span><span class="nx">S_kl2</span><span class="o">*</span><span class="nx">l_kl2</span><span class="p">)</span><span class="o">/</span><span class="mi">100</span><span class="p">;</span>
<span class="nx">Ftmp</span> <span class="o">=</span> <span class="p">(</span><span class="nx">Pi</span><span class="o">&gt;</span><span class="mi">2</span><span class="o">*</span><span class="nx">Po</span><span class="p">)</span> <span class="o">?</span> <span class="nx">Pi</span><span class="o">*</span><span class="nx">pow</span><span class="p">(</span><span class="nx">Q0</span><span class="o">*</span><span class="mf">0.75</span><span class="o">/</span><span class="nx">Ti</span><span class="p">,</span><span class="mf">0.5</span><span class="p">)</span> <span class="o">:</span> <span class="p">(</span><span class="nx">Po</span><span class="o">&gt;</span><span class="mi">2</span><span class="o">*</span><span class="nx">Pi</span><span class="p">)</span> <span class="o">?</span> <span class="nx">Po</span><span class="o">*</span><span class="nx">pow</span><span class="p">(</span><span class="nx">Q0</span><span class="o">*</span><span class="mf">0.75</span><span class="o">/</span><span class="nx">To</span><span class="p">,</span><span class="mf">0.5</span><span class="p">)</span> <span class="o">:</span> <span class="nx">pow</span><span class="p">(</span><span class="nx">abs</span><span class="p">(</span><span class="nx">Q0</span><span class="o">*</span><span class="p">(</span><span class="nx">pow</span><span class="p">(</span><span class="nx">Pi</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="o">-</span><span class="nx">pow</span><span class="p">(</span><span class="nx">Po</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span><span class="o">/</span><span class="nx">Ti</span><span class="p">),</span><span class="mf">0.5</span><span class="p">);</span>
<span class="nx">Fi</span> <span class="o">-=</span> <span class="p">(</span><span class="nx">Fi</span><span class="o">-</span><span class="mi">7260</span><span class="o">*</span><span class="nx">Sr</span><span class="o">*</span><span class="nx">sign</span><span class="p">(</span><span class="nx">Pi</span><span class="o">-</span><span class="nx">Po</span><span class="p">)</span><span class="o">*</span><span class="nx">Ftmp</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mf">0.01</span><span class="o">*</span><span class="nx">lo</span><span class="o">*</span><span class="nx">frq</span><span class="p">);</span>
<span class="nx">Po</span> <span class="o">+=</span> <span class="mf">0.27</span><span class="o">*</span><span class="p">(</span><span class="nx">Fi</span><span class="o">-</span><span class="nx">Fo</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="nx">So</span><span class="o">*</span><span class="nx">lo</span><span class="o">*</span><span class="nx">Q0</span><span class="o">*</span><span class="nx">frq</span><span class="p">);</span>
<span class="nx">Po</span> <span class="o">=</span> <span class="p">(</span><span class="nx">Po</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">)</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="p">(</span><span class="nx">Po</span><span class="o">&gt;</span><span class="mi">100</span><span class="p">)</span> <span class="o">?</span> <span class="mi">100</span> <span class="o">:</span> <span class="nx">Po</span><span class="p">;</span>
<span class="nx">To</span> <span class="o">+=</span> <span class="p">(</span><span class="nx">abs</span><span class="p">(</span><span class="nx">Fi</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="nx">Ti</span><span class="o">*</span><span class="nx">pow</span><span class="p">(</span><span class="nx">Po</span><span class="o">/</span><span class="nx">Pi</span><span class="p">,</span><span class="mf">0.02</span><span class="p">)</span><span class="o">-</span><span class="nx">To</span><span class="p">)</span><span class="o">+</span><span class="p">(</span><span class="nx">Fwind</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="nx">Twind</span><span class="o">-</span><span class="nx">To</span><span class="p">)</span><span class="o">/</span><span class="nx">Riz</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="nx">Ct</span><span class="o">*</span><span class="nx">So</span><span class="o">*</span><span class="nx">lo</span><span class="o">*</span><span class="nx">Qr</span><span class="o">*</span><span class="nx">frq</span><span class="p">);</span>
</pre></div>
<h2><span class="mw-headline" id=".D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.B5.D1.80.D1.83_.D1.82.D0.B0_.D0.B9.D0.BE.D0.B3.D0.BE_.D0.BA.D0.BE.D0.BD.D1.84.D1.96.D0.B3.D1.83.D1.80.D0.B0.D1.86.D1.96.D1.8F"><span class="mw-headline-number">2</span> <span id="Controller" title="#Controller">Об'єкт контролеру та його конфігурація</span></span></h2>
<p>Об'єкт контролеру цього модуля, для забезпечення безпосередніх обчислень, пов'язується з функціями із бібліотек, побудованими за його допомогою, або з <a href="../DAQ.html#LogicLev" title="Special:MyLanguage/Documents/DAQ">шаблоном збору даних</a>. У випадку з шаблоном збору даних, додається можливість зовнішнього зв'язування, з іншими параметрами та атрибутами підсистеми "Збір даних". Для надання обчислювальних даних до OpenSCADA, у об'єкті контролеру можуть створюватися параметри. Приклад вкладки конфігурації об'єкту контролеру даного типу наведено на рисунку 2.
</p>
<div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:776px;"><a class="image" href="http://oscada.org/wiki/File:JavaLikeCalc_cntr_uk.png"><img class="thumbimage" height="691" src="../files/JavaLikeCalc_cntr_uk.png" width="774" /></a>  <div class="thumbcaption">Рис.2. Вкладка конфігурації об'єкта контролера.</div></div></div></div>
<p>За допомогою цієї вкладки можна встановити:
</p>
<ul><li> Стан об'єкту контролеру, а саме: статус, "Ввімкнено", "Виконується" та ім'я сховища, яке містить конфігурацію.</li>
<li> Ідентифікатор, ім'я та опис контролеру.</li>
<li> Стан "Ввімкнено" та "Виконується", у який переводити об'єкт контролеру при запуску.</li>
<li> Адреса обчислювальної функції або <a href="../Program_manual.html#DAQTmpl" title="Special:MyLanguage/Documents/Program manual">шаблону збору даних</a>.</li>
<li> Планування обчислення, пріоритет задачі опитування джерел даних та кількість ітерацій у одному циклі завдання обчислення.</li></ul>
<p>Вкладка "Обчислення" об'єкту контролеру (Рис. 3) містить параметри та текст програми, яка безпосередньо виконується контролером. Модулем передбачена обробка низки спеціальних параметрів, доступних у програмі контролеру:
</p>
<ul><li> <i>f_frq</i> — частота обчислення програми контролера, тільки читання.</li>
<li> <i>f_start</i> — ознака першого виконання програми контролера — запуск, тільки читання.</li>
<li> <i>f_stop</i> — ознака останнього виконання програми контролера — зупинка, тільки читання.</li>
<li> <i>this</i> — об'єкт даного контролеру.</li></ul>
<div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:966px;"><a class="image" href="http://oscada.org/wiki/File:JavaLikeCalc_cntr_calc_uk.png"><img class="thumbimage" height="660" src="../files/JavaLikeCalc_cntr_calc_uk.png" width="964" /></a>  <div class="thumbcaption">Рис.3. Вкладка "Обчислення" об'єкту контролеру.</div></div></div></div>
<h2><span class="mw-headline" id=".D0.9F.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82.D1.83_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.B5.D1.80.D0.B0_.D1.82.D0.B0_.D0.B9.D0.BE.D0.B3.D0.BE_.D0.BA.D0.BE.D0.BD.D1.84.D1.96.D0.B3.D1.83.D1.80.D0.B0.D1.86.D1.96.D1.8F"><span class="mw-headline-number">3</span> Параметр об'єкту контролера та його конфігурація</span></h2>
<p>Модуль надає тільки один "Стандартний (std)" тип параметрів із назвою таблиці параметрів "JavaLikePrm_{CntrId}".
</p><p>Параметр об'єкту контролера даного модуля виконує функцію надання доступу до результатів обчислення контролера у OpenSCADA, за посередництвом атрибутів параметрів. Із специфічних полів, вкладка конфігурації параметра об'єкта контролера містить тільки поле переліку параметрів обчислювальної функції, які треба відобразити.
</p>
<h2><span class="mw-headline" id=".D0.91.D1.96.D0.B1.D0.BB.D1.96.D0.BE.D1.82.D0.B5.D0.BA.D0.B8_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D0.B9_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="mw-headline-number">4</span> <span id="FuncsLibs" title="#FuncsLibs">Бібліотеки функцій модуля</span></span></h2>
<p>Модуль надає механізм для створення бібліотек користувацьких функцій на мові подібній до Java. Приклад вкладки конфігурації бібліотеки зображено на рисунку 4. Вкладка містить базові поля: доступність, адреса таблиці БД бібліотеки (з відстеженням наявності даних у різних сховищах та наданням послідовного видалення дублікатів), дата та час модифікації, ідентифікатор, ім'я та опис.
</p>
<dl><dd> <a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Об'єкт все ще підтримує визначення надлишкової адреси сховку із таблицею до того часу як ви перейменуєте її у стандартну форму "<b>flb_{ObjID}</b>".</dd></dl>
<div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:744px;"><a class="image" href="http://oscada.org/wiki/File:JavaLikeCalc_lib_uk.png"><img class="thumbimage" height="504" src="../files/JavaLikeCalc_lib_uk.png" width="742" /></a>  <div class="thumbcaption">Рис.4. Вкладка конфігурації бібліотеки.</div></div></div></div>
<h2><span class="mw-headline" id=".D0.9A.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="mw-headline-number">5</span> Користувацькі функції модуля</span></h2>
<p>Функція, також як і бібліотека, містить базову вкладку конфігурації, вкладку формування програми та параметрів функції (Рис.1), а також вкладку виконання створеної функції.
</p>
<h2><span class="mw-headline" id="API_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F"><span class="mw-headline-number">6</span> API користувацького програмування</span></h2>
<p>Деякі об'єкти модуля надають функції користувацького програмування.
</p>
<div class="floatright"><a class="image" href="http://oscada.org/wiki/File:Oscada_UserOM_JavaLikeCalc_uk.png" title="Об&#039;єктна модель користувача модуля JavaLikeCalc."><img alt="Об&#039;єктна модель користувача модуля JavaLikeCalc." height="214" src="../files/Oscada_UserOM_JavaLikeCalc_uk.png" width="223" /></a></div>
<p><b>Об'єкт "Бібліотека функцій" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"])</b>
</p>
<ul><li> <i>ElTp {funcID}(ElTp prm1, ...)</i> — викликає функцію "funcID" бібліотеки "Lfunc" з параметрами <i>prm{N}</i>. Повертає результат викликаної функції. Префікс "lib_" перед ідентифікатором бібліотеки обов'язковий!</li></ul>
<p><b>Об'єкт "Користувацька функція" (SYS.DAQ.JavaLikeCalc["lib_Lfunc"]["func"])</b>
</p>
<ul><li> <i>ElTp call(ElTp prm1, ...)</i> — викликає функцію "func" бібліотеки "Lfunc" з параметрами <i>prm{N}</i>. Повертає результат викликаної функції. Префікс "lib_" перед ідентифікатором бібліотеки обов'язковий!</li></ul>
<p><br />
</p>
<h2><span class="mw-headline" id=".D0.A1.D0.B5.D1.80.D0.B2.D1.96.D1.81.D0.BD.D1.96_.D0.BA.D0.BE.D0.BC.D0.B0.D0.BD.D0.B4.D0.B8-.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D0.86.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.83_.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D1.96.D0.BD.D0.BD.D1.8F"><span class="mw-headline-number">7</span> Сервісні команди-функції Інтерфейсу Управління</span></h2>
<p>Сервісні функції — це інтерфейс доступу до OpenSCADA із зовнішніх систем посередництвом <a href="../API.html#CntrNode" title="Special:MyLanguage/Documents/API">Інтерфейсу Управління</a>. Цей механізм покладено в основу усього обміну всередині OpenSCADA, реалізованого шляхом слабких зв'язків та <a href="../Modules/SelfSystem.html" title="Special:MyLanguage/Modules/SelfSystem">власного протоколу обміну OpenSCADA</a>.
</p><p><br />
<b><u>Отримання значень ВВ функції об'єкту контролеру</u></b><br />
ЗАП: <i>&lt;get path="/DAQ/JavaLikeCalc/<b>{CNTR}</b>/%2fserv%2ffncAttr" /&gt;</i>
</p>
<ul><li> <i>CNTR</i> — об'єкт контролеру.</li></ul>
<p>ВІДП: <i>&lt;get path="/DAQ/JavaLikeCalc/{CNTR}/%2fserv%2ffncAttr" rez="<b>0</b>"&gt;<b>{IOs}</b>&lt;/get&gt;</i>
</p>
<ul><li> <i>IOs</i> — ВВ контексту виконання функції у тегах "a": <i>&lt;a id="<b>{ID}</b>"&gt;<b>{value}</b>&lt;/a&gt;</i>
<ul><li> <i>ID</i> — ідентифікатор ВВ;</li>
<li> <i>value</i> — значення ВВ.</li></ul></li></ul>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 10pt"><pre><span class="nt">&lt;get</span> <span class="na">path=</span><span class="s">"/DAQ/JavaLikeCalc/testCalc/%2fserv%2ffncAttr"</span> <span class="na">rez=</span><span class="s">"0"</span> <span class="na">user=</span><span class="s">"roman"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"f_frq"</span><span class="nt">&gt;</span>0.1<span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"f_start"</span><span class="nt">&gt;</span>0<span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"f_stop"</span><span class="nt">&gt;</span>0<span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"this"</span><span class="nt">&gt;</span><span class="ni">&amp;lt;</span>TCntrNodeObj path="/sub_DAQ/mod_JavaLikeCalc/cntr_testCalc/"/<span class="ni">&amp;gt;</span><span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"offset"</span><span class="nt">&gt;</span>100<span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"out"</span><span class="nt">&gt;</span>50<span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"test"</span><span class="nt">&gt;</span>1<span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"rez"</span> <span class="nt">/&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"inFarg"</span><span class="nt">&gt;</span>3<span class="nt">&lt;/a&gt;</span>
<span class="nt">&lt;/get&gt;</span>
</pre></div>
<p><b><u>Встановлення значень ВВ функції об'єкту контролеру</u></b><br />
ЗАП[<b>root-DAQ</b>]: <i>&lt;set path="/DAQ/JavaLikeCalc/<b>{CNTR}</b>/%2fserv%2ffncAttr"&gt;<b>{IOs}</b>&lt;/set&gt;</i>
</p>
<ul><li> <i>CNTR</i> — об'єкт контролеру;</li>
<li> <i>IOs</i> — ВВ контексту виконання функції у тегах "a": <i>&lt;a id="<b>{ID}</b>"&gt;<b>{value}</b>&lt;/a&gt;</i>
<ul><li> <i>ID</i> — ідентифікатор ВВ;</li>
<li> <i>value</i> — значення ВВ.</li></ul></li></ul>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 10pt"><pre><span class="nt">&lt;set</span> <span class="na">path=</span><span class="s">"/DAQ/JavaLikeCalc/testCalc/%2fserv%2ffncAttr"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"out"</span><span class="nt">&gt;</span>50<span class="nt">&lt;/a&gt;</span>
  <span class="nt">&lt;a</span> <span class="na">id=</span><span class="s">"test"</span><span class="nt">&gt;</span>1<span class="nt">&lt;/a&gt;</span>
<span class="nt">&lt;/set&gt;</span>
</pre></div>
<p><br />
</p>
<h2><span class="mw-headline" id=".D0.9F.D1.80.D0.BE.D0.B4.D1.83.D0.BA.D1.82.D0.B8.D0.B2.D0.BD.D1.96.D1.81.D1.82.D1.8C"><span class="mw-headline-number">8</span> <span id="Productivity" title="#Productivity">Продуктивність</span></span></h2>
<p>Початковий текст процедур на мові цього модуля компілюється у байт-код, який надалі обчислюється віртуальною машиною. Байт-код це не машинний код і досягнути продуктивності самої апаратної архітектури у віртуальній машині його виконуючої — теоретично нереально, якщо звісно код цієї віртуальної машини не виконує сам процесор. Тобто продуктивність виконання байт-коду приблизно на порядок нижче апаратної продуктивності за рахунок накладених витрат команд віртуальної машини, розподілу багатопотокового доступу до даних, прозорого приведення типів та відсутності жорсткої типізації, а також динамічної природи мови та наявності складних типів "Рядок" та "Об'єкт".
</p><p><b>28.01.2006:</b><br />
<i>Description:</i> Initial estimation of the productivity of the OpenSCADA virtual machine in example of the expression <b>y=x1+x2</b>, where all the variables are global and in the float-point type.
</p>
<table class="wikitable">

<tr>
<th> Stage </th>
<th> Action </th>
<th> K7_1G-0, us
</th></tr>
<tr>
<td> 1 </td>
<td> The registers list initialization </td>
<td> 2.3
</td></tr>
<tr>
<td> 2 </td>
<td> Entry to the function exec() </td>
<td> 3
</td></tr>
<tr>
<td> 3 </td>
<td> The commands coming </td>
<td> 4.4
</td></tr>
<tr>
<td> 4 </td>
<td> Reading </td>
<td> 9
</td></tr>
<tr>
<td> 5 </td>
<td> Full time </td>
<td> 10.2
</td></tr></table>
<p><b>17.07.2013:</b><br />
<i>Description:</i> Justification of the current performance evaluation and optimization. The measurements were made by sampling the minimum time from five calls to 1000 executions of the formula <b>a -= b*(a-c)</b> and its abbreviations in each call. All the variables are global and in the float-point type.
</p>
<table class="wikitable">

<tr>
<th> Formula </th>
<th> Time on AMDGeode-500 (the operation time), us </th>
<th> Notes
</th></tr>
<tr>
<td> a -= b*(a-c) </td>
<td> 4.52 (0.74) </td>
<td>
</td></tr>
<tr>
<td> a -= b*c </td>
<td> 3.78 (0.72) </td>
<td>
</td></tr>
<tr>
<td> a -= b </td>
<td> 3.06 (0.56)
<dl><dd>=&gt; full call: 3.06 (0.49): getValR() = 0.49/2 = 0.245</dd>
<dd>=&gt; only write const = 2.57 (0.17)</dd>
<dd>=&gt; pass.code = 2.4</dd></dl>
</td>
<td>
</td></tr>
<tr>
<td> a = b </td>
<td> 2.5 (1.21)
<dl><dd>!&gt; using the unified TVariant function setVal() and getVal() = 7.6 (2.7 write only) =&gt; fix to 5.0 for prevent default setting to the string EVAL.</dd>
<dd>=&gt; full call: 2.5 (0.33)</dd>
<dd>=&gt; only write const: 2.17 (0.47)</dd>
<dd>=&gt; only check for type: 1.7 (0.3)</dd>
<dd>=&gt; pass code: 1.4 (0.11)</dd></dl>
</td>
<td> Writing to the function IO is longer then reading from the local register for other context call and additional checking for NAN and real modification.
</td></tr>
<tr>
<td> Empty </td>
<td> 1.29 </td>
<td> the infrastructure and measurement method utilization time.
</td></tr></table>
<p><b>24.04.2016:</b><br />
<i>Reason:</i> Estimate performance of accessing to the low level IO lines on Raspberry Pi GPIO in different ways of the JavaLikeCalc language of OpenSCADA.<br />
<i>Conditions:</i> <a class="external" href="http://oscada.org/wiki/Special:MyLanguage/Using/Raspberry_Pi" title="Special:MyLanguage/Using/Raspberry Pi">Raspberry Pi 3</a>, GPIO40, <a href="../Modules/GPIO.html" title="Special:MyLanguage/Modules/GPIO">DAQ.GPIO</a> (based on the library <a class="external text" href="http://www.airspayce.com/mikem/bcm2835" rel="nofollow noreferrer noopener" target="_blank">bcm2835</a>)
</p>
<table class="wikitable">

<tr>
<th> Operation </th>
<th> Result, us
</th></tr>
<tr>
<td colspan="2"> <i>Sleep. Lag on sleep in 1ms measuring, which mostly limited by the realtime reaction about 100us.</i>
</td></tr>
<tr>
<td> <b>SYS.sleep();</b> </td>
<td> +110
</td></tr>
<tr>
<td> <b>Special.FLibSYS.fnc_tmSleep();</b> </td>
<td> +70
</td></tr>
<tr>
<td colspan="2"> <i>Sleep. Lag on sleep in 100us measuring, which performs in the measuring cycle.</i>
</td></tr>
<tr>
<td> <b>SYS.sleep();</b> </td>
<td> +17
</td></tr>
<tr>
<td> <b>Special.FLibSYS.fnc_tmSleep();</b> </td>
<td> +2
</td></tr>
<tr>
<td colspan="2"> <i>Get a level of the GPIO pin</i>
</td></tr>
<tr>
<td> From an attribute <b>res = GPIO.io.pi.gpio17;</b> </td>
<td> 5.4
</td></tr>
<tr>
<td> By the static accessing function <b>res = DAQ.GPIO.io.pi.fnc_get(17);</b> </td>
<td> 1.6
</td></tr>
<tr>
<td> By the static accessing function with the link preparation <b>function get = "DAQ.GPIO.io.pi.fnc_get"; for(i = 0; i &lt; 10000; i++) res = get(17);</b> </td>
<td> 1.7
</td></tr>
<tr>
<td> By the dynamic accessing function <b>res = SYS.DAQ.GPIO.io.pi.fnc_get.call(17);</b> </td>
<td> 80
</td></tr>
<tr>
<td> By the dynamic accessing function with the end object preparation <b>tO = SYS.DAQ.GPIO.io.pi.fnc_get; for(i = 0; i &lt; 1000; i++) res = tO.call(17);</b> </td>
<td> 14.3
</td></tr>
<tr>
<td colspan="2"> <i>Put a level to the GPIO pin</i>
</td></tr>
<tr>
<td> To an attribute <b>GPIO.io.pi.gpio18 = true;</b> </td>
<td> 2.1
</td></tr>
<tr>
<td> By the static accessing function <b>DAQ.GPIO.io.pi.fnc_put(18, true);</b> </td>
<td> 1.4
</td></tr>
<tr>
<td> By the static accessing function with the link preparation <b>function put = "DAQ.GPIO.io.pi.fnc_put"; for(i = 0; i &lt; 10000; i++) put(17, false);</b> </td>
<td> 1.5
</td></tr>
<tr>
<td> By the dynamic accessing function <b>SYS.DAQ.GPIO.io.pi.fnc_put.call(18, true);</b> </td>
<td> 79
</td></tr>
<tr>
<td> By the dynamic accessing function with the end object preparation <b>tO = SYS.DAQ.GPIO.io.pi.fnc_put; for(i = 0; i &lt; 1000; i++) tO.call(18, true);</b> </td>
<td> 14.3
</td></tr></table>
<h2><span class="mw-headline" id=".D0.9F.D0.BE.D1.81.D0.B8.D0.BB.D0.B0.D0.BD.D0.BD.D1.8F"><span class="mw-headline-number">9</span> Посилання</span></h2>
<ul><li> <a class="external" href="http://oscada.org/wiki/File:Oscada_UserOM_JavaLikeCalc_uk.odg" title="File:Oscada UserOM JavaLikeCalc uk.odg">Діаграма: Об'єктна модель користувача модуля JavaLikeCalc.</a></li></ul>






</div><table style="border-top: dotted 2px #999999; margin-top: 20pt; color: gray;" width="100%"><tr><td style="text-align: left;" width="40%"><a href="http://oscada.org/wiki/Modules/JavaLikeCalc/uk">Modules/JavaLikeCalc/uk</a> - <a href="http://oscada.org/en/main/about-the-project/licenses/">GFDL</a></td><td style="text-align: center;">April 2025</td><td style="text-align: right;" width="40%">OpenSCADA 1+r3018</td></tr></table></body>
</html>