<?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&group=page-Modules%2FJavaLikeCalc&action=page&filter=&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> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../ru/Modules/JavaLikeCalc.html" title="Модули/ВычиÑлитель похожий на Java (85% translated)">mRussian</a> • ‎<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"><</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>("<EVAL>").</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>("<EVAL>")<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><<</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 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>?:</td><td>Умовна Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ "i=(i<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">>=</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">></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"><</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) та підвиразами (>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) та підвиразами (>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">&&</span> <span class="o">!</span><span class="nx">com</span><span class="p">)</span> <span class="o">&&</span> <span class="o">!</span><span class="p">(</span><span class="nx">st_open</span> <span class="o">&&</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">></span><span class="mi">0</span><span class="o">&&</span><span class="nx">pos</span><span class="o"><</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">></span><span class="mi">0</span><span class="o">&&</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">></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">></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"><</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">>=</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"><=</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">></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">></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"><</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">></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="Об'єктна модель кориÑтувача Ð¼Ð¾Ð´ÑƒÐ»Ñ JavaLikeCalc."><img alt="Об'єктна модель кориÑтувача Ð¼Ð¾Ð´ÑƒÐ»Ñ 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><get path="/DAQ/JavaLikeCalc/<b>{CNTR}</b>/%2fserv%2ffncAttr" /></i> </p> <ul><li> <i>CNTR</i> — об'єкт контролеру.</li></ul> <p>ВІДП: <i><get path="/DAQ/JavaLikeCalc/{CNTR}/%2fserv%2ffncAttr" rez="<b>0</b>"><b>{IOs}</b></get></i> </p> <ul><li> <i>IOs</i> — Ð’Ð’ контекÑту Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— у тегах "a": <i><a id="<b>{ID}</b>"><b>{value}</b></a></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"><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">></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"f_frq"</span><span class="nt">></span>0.1<span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"f_start"</span><span class="nt">></span>0<span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"f_stop"</span><span class="nt">></span>0<span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"this"</span><span class="nt">></span><span class="ni">&lt;</span>TCntrNodeObj path="/sub_DAQ/mod_JavaLikeCalc/cntr_testCalc/"/<span class="ni">&gt;</span><span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"offset"</span><span class="nt">></span>100<span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"out"</span><span class="nt">></span>50<span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"test"</span><span class="nt">></span>1<span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"rez"</span> <span class="nt">/></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"inFarg"</span><span class="nt">></span>3<span class="nt"></a></span> <span class="nt"></get></span> </pre></div> <p><b><u>Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ Ð’Ð’ функції об'єкту контролеру</u></b><br /> ЗÐП[<b>root-DAQ</b>]: <i><set path="/DAQ/JavaLikeCalc/<b>{CNTR}</b>/%2fserv%2ffncAttr"><b>{IOs}</b></set></i> </p> <ul><li> <i>CNTR</i> — об'єкт контролеру;</li> <li> <i>IOs</i> — Ð’Ð’ контекÑту Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— у тегах "a": <i><a id="<b>{ID}</b>"><b>{value}</b></a></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"><set</span> <span class="na">path=</span><span class="s">"/DAQ/JavaLikeCalc/testCalc/%2fserv%2ffncAttr"</span><span class="nt">></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"out"</span><span class="nt">></span>50<span class="nt"></a></span> <span class="nt"><a</span> <span class="na">id=</span><span class="s">"test"</span><span class="nt">></span>1<span class="nt"></a></span> <span class="nt"></set></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>=> full call: 3.06 (0.49): getValR() = 0.49/2 = 0.245</dd> <dd>=> only write const = 2.57 (0.17)</dd> <dd>=> pass.code = 2.4</dd></dl> </td> <td> </td></tr> <tr> <td> a = b </td> <td> 2.5 (1.21) <dl><dd>!> using the unified TVariant function setVal() and getVal() = 7.6 (2.7 write only) => fix to 5.0 for prevent default setting to the string EVAL.</dd> <dd>=> full call: 2.5 (0.33)</dd> <dd>=> only write const: 2.17 (0.47)</dd> <dd>=> only check for type: 1.7 (0.3)</dd> <dd>=> 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 < 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 < 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 < 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 < 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>