<?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="ru">Модули/ВычиÑлитель похожий на Java</h1> </div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="ru"><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=ru" 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 85% 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> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">mRussian</span> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../uk/Modules/JavaLikeCalc.html" title="Модулі/ОбчиÑлювач подібний до Java (100% translated)">УкраїнÑька</a></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.7 </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>Parameters of functions can be freely created, deleted or modified. The current version of the module supports up to 65535 parameters of the function, in the sum with the internal variables. The view of editing functions in the OpenSCADA configurator is shown in Figure 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> The parameter name's rows after the first one treat as help. </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_ru.png"><img class="thumbimage" height="683" src="../files/JavaLikeCalc_funcedit_ru.png" width="942" /></a> <div class="thumbcaption">РиÑ.1. Вид Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹ в конфигураторе OpenSCADA.</div></div></div></div> <p>ПоÑле любого Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑта программы или конфигурации параметров, выполнÑетÑÑ Ð¿ÐµÑ€ÐµÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸ÐµÐ¼ объектов значений <i>TValCfg</i>, ÑвÑзанных Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹. КомпилÑтор Ñзыка поÑтроен Ñ Ð¸Ñпользованием извеÑтного генератора грамматики "Bison", который ÑовмеÑтим Ñ Ð½Ðµ менее извеÑтной утилитой "Yacc". </p><p>The language uses the implicit definition of local variables, which is to define a new variable in the case of assigning a value to it. This type of local variable is set according to the type of the assigning value. For example, the expression <b>Qr=Q0*Pi+0.01;</b> will define <b>Qr</b> variable with the type of variable <b>Q0</b>. And with implementing the built-in functions, there also added the statement <b>var</b> for defining the variables in the function scope instead global one. </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="#Java-.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B9_.D1.8F.D0.B7.D1.8B.D0.BA"><span class="tocnumber">1</span> <span class="toctext">Java-подобный Ñзык</span></a> <ul> <li class="toclevel-2 tocsection-2"><a href="#.D0.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D1.8B_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><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.D0.B8.D0.B8_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><span class="tocnumber">1.2</span> <span class="toctext">Операции Ñзыка</span></a></li> <li class="toclevel-2 tocsection-4"><a href="#.D0.92.D1.81.D1.82.D1.80.D0.BE.D0.B5.D0.BD.D0.BD.D1.8B.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><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.D1.8B_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><span class="tocnumber">1.4</span> <span class="toctext">Операторы Ñзыка</span></a> <ul> <li class="toclevel-3 tocsection-6"><a href="#.D0.A3.D1.81.D0.BB.D0.BE.D0.B2.D0.BD.D1.8B.D0.B5_.D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D1.8B"><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.D1.8B"><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.D0.B5.D0.BD.D0.BD.D0.B8.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8"><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.D0.B8.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.81.D0.B8.D0.BC.D0.B2.D0.BE.D0.BB.D1.8B_.D1.81.D1.82.D1.80.D0.BE.D0.BA.D0.BE.D0.B2.D1.8B.D1.85_.D0.BF.D0.B5.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D0.BD.D1.8B.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.D1.8A.D0.B5.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.BC.D0.B5.D1.80.D1.8B_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D1.8B_.D0.BD.D0.B0_.D1.8D.D1.82.D0.BE.D0.BC_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B5"><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.D1.8A.D0.B5.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.BB.D0.B5.D1.80.D0.B0_.D0.B8_.D0.B5.D0.B3.D0.BE_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.D1.8F"><span class="tocnumber">2</span> <span class="toctext"><span>Объект контроллера и его конфигурациÑ</span></span></a></li> <li class="toclevel-1 tocsection-13"><a href="#Parameter_of_the_controller_object_and_its_configuration"><span class="tocnumber">3</span> <span class="toctext">Parameter of the controller object and its configuration</span></a></li> <li class="toclevel-1 tocsection-14"><a href="#.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B8_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.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.9F.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.B8.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.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.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F"><span class="tocnumber">6</span> <span class="toctext">API пользовательÑкого программированиÑ</span></a></li> <li class="toclevel-1 tocsection-17"><a href="#Service_commands-functions_of_the_Control_Interface"><span class="tocnumber">7</span> <span class="toctext">Service commands-functions of the Control Interface</span></a></li> <li class="toclevel-1 tocsection-18"><a href="#.D0.9F.D1.80.D0.BE.D0.B8.D0.B7.D0.B2.D0.BE.D0.B4.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.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.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8"><span class="tocnumber">9</span> <span class="toctext">СÑылки</span></a></li> </ul> </div> <h2><span class="mw-headline" id="Java-.D0.BF.D0.BE.D0.B4.D0.BE.D0.B1.D0.BD.D1.8B.D0.B9_.D1.8F.D0.B7.D1.8B.D0.BA"><span class="mw-headline-number">1</span> Java-подобный Ñзык</span></h2> <h3><span class="mw-headline" id=".D0.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D1.8B_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><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> The <b>EVAL</b> (Error VALue) variants and <b>null</b> are processed specially in conversion one to one depending on used the base type, that is you are free in use only <b>null</b> or <b>EVAL</b> for any cases. </p> <h3><span class="mw-headline" id=".D0.9E.D0.BF.D0.B5.D1.80.D0.B0.D1.86.D0.B8.D0.B8_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><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.D1.81.D1.82.D1.80.D0.BE.D0.B5.D0.BD.D0.BD.D1.8B.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><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.D1.8B_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B0"><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.D1.81.D0.BB.D0.BE.D0.B2.D0.BD.D1.8B.D0.B5_.D0.BE.D0.BF.D0.B5.D1.80.D0.B0.D1.82.D0.BE.D1.80.D1.8B"><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.D1.8B"><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.D0.B5.D0.BD.D0.BD.D0.B8.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8"><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.D0.B8.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.81.D0.B8.D0.BC.D0.B2.D0.BE.D0.BB.D1.8B_.D1.81.D1.82.D1.80.D0.BE.D0.BA.D0.BE.D0.B2.D1.8B.D1.85_.D0.BF.D0.B5.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D0.BD.D1.8B.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.D1.8A.D0.B5.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>. Очевидно, что первый механизм Ñтатичен, а второй позволÑет указывать Ð¸Ð¼Ñ ÑвойÑтва через переменную. Удалить ÑвойÑтво объекта можно директивой "delete". Ð˜Ð¼Ñ ÑвойÑтва через точку не должно начинатьÑÑ Ñ Ñ†Ð¸Ñ„Ñ€Ñ‹ и Ñодержать Ñимволы операций, иначе, Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð¹ цифры, должен иÑпользоватьÑÑ <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>, Ð´Ð»Ñ Ñимволов операций в названии. Чтение неопределённого ÑвойÑтва вернёт <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> String: </li></ul> <dl><dd><dl><dt> <i>Properties:</i></dt></dl> <ul><li> <i>int length</i> — string length. </li></ul> <dl><dt> <i>Functions:</i></dt></dl> <ul><li> <i>bool isEVal();</i> — checks value to <b>null</b>-<b>EVAL</b>.</li> <li> <i>bool isNaN( bool whole = true );</i> — checks the string to Not A Number and in whole for <i>whole</i>. </li> <li> <i>string charAt( int symb, string type = "" );</i> — extracts from the string the symbol <i>symb</i> for the <i>type</i>. These types of the symbol are supported: ""-ASCII and raw one byte code, UTF-8, UTF-16, UTF-32. In the case of UTF-8, the symbol position <i>symb</i> is changed to the next symbol position due to length of this symbols type is variable one.</li> <li> <i>int charCodeAt( int symb, string type = "" );</i> — extracts from the string the symbol code <i>symb</i> for the <i>type</i>. These types of the symbol are supported: ""-ASCII and raw one byte code, UTF-8, UTF-16, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE. In the case of UTF-8, the symbol position <i>symb</i> is changed to the next symbol position due to length of this symbols type is variable one.</li> <li> <i>string concat( string val1, string val2, ... );</i> — returns a new string formed by joining the values <i>val1</i> etc. to the original one.</li> <li> <i>int indexOf( string substr, int start = 0 );</i> — returns the position of the required string <i>substr</i> in the original row from the position <i>start</i>. If the initial position is not specified then the search starts from the beginning. If the search string is not found then "-1" is returned.</li> <li> <i>int lastIndexOf( string substr, int start = {end} );</i> — returns the position of the search string <i>substr</i> in the original one beginning from the position of <i>start</i> when searching from the end. If the initial position is not specified then the search begins from the end. If the search string is not found then "-1" is returned.</li> <li> <i>int search( string pat, string flg = "" );</i> — searches into the string by the pattern <i>pat</i> and pattern's flags <i>flg</i>. Returns found substring position or "-1" for else.</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> — searches into the string by the "RegExp" pattern <i>pat</i>. Returns found substring position or "-1" for else.</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> — calls match for the string by the pattern <i>pat</i> and flags <i>flg</i>. Returns matched substring (0) and subexpressions (>0) array. Sets "index" attribute of the array to the substring position. Sets the "input" attribute to the source string. Sets the "err" attribute to the operation error code.</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 plus 2 plus 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> — calls match for the string and "RegExp" pattern <i>pat</i>. Returns matched substring (0) and subexpressions (>0) array. Sets the "index" attribute of the array to substring position. Sets the "input" attribute to the source string. Sets the "err" attribute to the operation error code.</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 plus 2 plus 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> — returns the string extracted from the original one starting from the <i>beg</i> position and ending before the <i>end</i> (not included), numbering from zero. If the begin or end is negative, then the count is conducted from the end of the line. If the end is not specified, then the end is the end of the line. For example, the construction <b>substring(-2)</b> return two last symbols of the string.</li> <li> <i>Array split( string sep, int limit = 0 );</i> — returns the array of strings separated by <i>sep</i> with the <i>limit</i> of the number of elements (0 for no limit).</li> <li> <i>Array split( RegExp pat, int limit = 0 );</i> — returns the array of strings separated by the RegExp pattern <i>pat</i> with the <i>limit</i> of the number of elements (0 for no limit).</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> — inserts the substring <i>substr</i> into this string's position <i>pos</i>.</li> <li> <i>string replace( int pos, int n, string str );</i> — replaces substring into the position <i>pos</i> and length <i>n</i> to the string <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> — replaces all the substrings <i>substr</i> to the string <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> — replaces substrings by the pattern <i>pat</i> to the string <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> — converts this string to a real number.</li> <li> <i>int toInt( int base = 0 );</i> — converts this string to an integer number in accordance with <i>base</i> (from 2 to 36). If the base is 0, then the prefix will be considered a prefix for determining the base (123-decimal; 0123-octal; 0x123-hex).</li> <li> <i>string {parse,parseEnd}( int pos, string sep = ".", int off = {0,{length}}, bool mergeSepSymb = false );</i> — gets a token with the number <i>pos</i> from the string when separated by <i>sep</i> and from the offset <i>off</i> (stopping on the next token begin, end for <i>parseEnd</i>). <i>mergeSepSymb</i> specifies of allowing of merging of the group of identical symbols to one separator. Result offset is returned back to <i>off</i>. <i>parseEnd()</i> does the same but from the end.</li> <li> <i>string parseLine( int pos, int off = 0 );</i> — gets a line with the number <i>pos</i> from the string and from the offset <i>off</i>. Result offset is returned back to <i>off</i> (stopping on the next token begin).</li> <li> <i>string parsePath( int pos, int offCmptbl = 0, int off = 0 );</i> — gets a path token with the number <i>pos</i> from the string and from the offset <i>off</i> (stopping on the next token begin) or <i>offCmtbl</i> (stopping on next symbol of the current token end — for compatibility). Result offset is returned back to <i>off</i> or <i>offCmptbl</i>.</li> <li> <i>string parsePathEnd( int pos, int off = {length} );</i> — gets a path token with the number <i>pos</i> from the string end and from the offset <i>off</i> (stopping on the next token end). Result offset is returned back to <i>off</i>.</li> <li> <i>string path2sep( string sep = "." );</i> — converts path into this string to separated by <i>sep</i> string.</li> <li> <i>string trim( string cfg = " \n\t\r" );</i> — trims the string at the begin and the end for the symbols <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.BC.D0.B5.D1.80.D1.8B_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D1.8B_.D0.BD.D0.B0_.D1.8D.D1.82.D0.BE.D0.BC_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B5"><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.D1.8A.D0.B5.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.BB.D0.B5.D1.80.D0.B0_.D0.B8_.D0.B5.D0.B3.D0.BE_.D0.BA.D0.BE.D0.BD.D1.84.D0.B8.D0.B3.D1.83.D1.80.D0.B0.D1.86.D0.B8.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.png"><img class="thumbimage" height="691" src="../../en/files/JavaLikeCalc_cntr.png" width="774" /></a> <div class="thumbcaption">РиÑ.2. Вкладка конфигурации объекта контроллера.</div></div></div></div> <p>From this tab you can set: </p> <ul><li> State of the controller object, as follows: status, "Enabled", "Running" and the storage name containing the configuration.</li> <li> Identifier, name and description of the controller.</li> <li> The state "Enabled" and "Running", in which the controller object must be translated at start up.</li> <li> Address of the computational function or <a href="../Program_manual.html#DAQTmpl" title="Special:MyLanguage/Documents/Program manual">the data acquisition template</a>.</li> <li> Policy of scheduling, priority of the data acquisition task and number of iterations in one cycle of calculation task.</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:973px;"><a class="image" href="http://oscada.org/wiki/File:JavaLikeCalc_cntr_calc_ru.png"><img class="thumbimage" height="658" src="../files/JavaLikeCalc_cntr_calc_ru.png" width="971" /></a> <div class="thumbcaption">РиÑ.3. Вкладка "ВычиÑлениÑ" объекта контроллера.</div></div></div></div> <h2><span class="mw-headline" id="Parameter_of_the_controller_object_and_its_configuration"><span class="mw-headline-number">3</span> Parameter of the controller object and its configuration</span></h2> <p>The module provides only one the "Standard (std)" type of the parameters with the parameters table name "JavaLikePrm_{CntrId}". </p><p>Параметр объекта контроллера данного Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñет функцию предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа к результатам вычиÑÐ»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ð»ÐµÑ€Ð° в OpenSCADA, поÑредÑтвом атрибутов параметров. Из ÑпецифичеÑких полей, вкладка конфигурации параметра контроллера Ñодержит только поле перечиÑÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² вычиÑлÑемой функции, которые необходимо отразить. </p> <h2><span class="mw-headline" id=".D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B8_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.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_ru.png"><img class="thumbimage" height="511" src="../files/JavaLikeCalc_lib_ru.png" width="742" /></a> <div class="thumbcaption">РиÑ.4. Вкладка конфигурации библиотеки.</div></div></div></div> <h2><span class="mw-headline" id=".D0.9F.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.B8.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.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.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.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_ru.png" title="ÐžÐ±ÑŠÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ JavaLikeCalc."><img alt="ÐžÐ±ÑŠÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ JavaLikeCalc." height="214" src="../files/Oscada_UserOM_JavaLikeCalc_ru.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="Service_commands-functions_of_the_Control_Interface"><span class="mw-headline-number">7</span> Service commands-functions of the Control Interface</span></h2> <p>Service functions are an interface for accessing OpenSCADA from external systems through the <a href="../../en/API.html#CntrNode" title="Special:MyLanguage/Documents/API">Control Interface</a>. This mechanism is the basis of all exchange within OpenSCADA, implemented through weak links and <a href="../Modules/SelfSystem.html" title="Special:MyLanguage/Modules/SelfSystem">OpenSCADA's own exchange protocol</a>. </p><p><br /> <b><u>Getting for values of the function IO of the controller object</u></b><br /> REQ: <i><get path="/DAQ/JavaLikeCalc/<b>{CNTR}</b>/%2fserv%2ffncAttr" /></i> </p> <ul><li> <i>CNTR</i> — controller object.</li></ul> <p>RESP: <i><get path="/DAQ/JavaLikeCalc/{CNTR}/%2fserv%2ffncAttr" rez="<b>0</b>"><b>{IOs}</b></get></i> </p> <ul><li> <i>IOs</i> — IOs of the function execution context in the tags "a": <i><a id="<b>{ID}</b>"><b>{value}</b></a></i> <ul><li> <i>ID</i> — identifier of the IO;</li> <li> <i>value</i> — value of the IO.</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>Setting for values of the function IO of the controller object</u></b><br /> REQ[<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> — controller object;</li> <li> <i>IOs</i> — IOs of the function execution context in the tags "a": <i><a id="<b>{ID}</b>"><b>{value}</b></a></i> <ul><li> <i>ID</i> — identifier of the IO;</li> <li> <i>value</i> — value of the IO.</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.B8.D0.B7.D0.B2.D0.BE.D0.B4.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.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.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8"><span class="mw-headline-number">9</span> СÑылки</span></h2> <ul><li> <a class="external" href="http://oscada.org/wiki/File:Oscada_UserOM_JavaLikeCalc_ru.odg" title="File:Oscada UserOM JavaLikeCalc ru.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/ru">Modules/JavaLikeCalc/ru</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>