<?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>Документация/API пользователя - 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">Документация/API пользователя</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&amp;group=page-Documents%2FUser+API&amp;action=page&amp;filter=&amp;language=ru" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Documents/User_API" title="Documents/User API">Documents/User API</a> and the translation is 79% 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/User_API.html" title="Documents/User API (100% translated)">English</a>&nbsp;• ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--high">mRussian</span>&nbsp;• ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../uk/User_API.html" title="Документація/API користувача (100% translated)">Українська</a></div></div>
<div style="float:right; border:1px solid gray; width:300px; padding:2px; margin-left: 10pt; margin-bottom: 10pt;">
<ul><li> <b>Автор:</b> <a class="external" href="http://oscada.org/wiki/User:RomanSavochenko" title="User:RomanSavochenko">Роман Савоченко</a></li>
<li> <b>Изначально создано:</b> в <a class="external text" href="http://wiki.oscada.org/HomePageEn/Doc/ProgrammManual" rel="nofollow noreferrer noopener" target="_blank">старой Wiki</a> </li></ul>
</div>
<p>До начала программирования в OpenSCADA Вы должны изучить структуру объектов программы (Объектная модель) из <a href="Program_manual.html" title="Special:MyLanguage/Documents/Program manual">руководства по программе OpenSCADA</a> и на рисунке 1.
</p>
<div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:1202px;"><a class="image" href="http://oscada.org/wiki/File:Oscada_UserOM_ru.png"><img class="thumbimage" height="541" src="files/Oscada_UserOM_ru.png" width="1200" /></a>  <div class="thumbcaption">Рис. 1. Пользовательская объектная модель ядра OpenSCADA.</div></div></div></div>
<p>Из этого документа Вы увидите, что можете, как пользователь, программировать следующие части OpenSCADA:
</p>
<ul><li> <a href="DAQ.html#Virtual" title="Special:MyLanguage/Documents/DAQ">Источники логического уровня подсистемы "Сбор данных"</a>.</li>
<li> Транспортные протоколы, доступные для пользовательского программирования, такие как: <a href="Modules/UserProtocol.html" title="Special:MyLanguage/Modules/UserProtocol">Пользовательский протокол</a>, <a href="Modules/ModBus.html" title="Special:MyLanguage/Modules/ModBus">ModBus узлы типа "Данные"</a>, <a href="Modules/WebUser.html" title="Special:MyLanguage/Modules/WebUser">Web-интерфейсы от пользователя</a>, ...</li>
<li> <a href="Modules/VCAEngine.html" title="Special:MyLanguage/Modules/VCAEngine">Среда Визуализации и Управления (СВУ)</a> в процедурах виджетов.</li></ul>
<p>API пользовательского программирования представляет собой дерево объектов OpenSCADA (Рис.1), каждый объект которого может представлять собственный перечень свойств и функций. Свойства и функции объектов могут использоваться пользователем в процедурах на языках пользовательского программирования OpenSCADA.
</p><p>На данный момент OpenSCADA предоставляет только один язык текстового программирования — <a href="#JavaLikeCalc">JavaLikeCalc</a>, следовательно Вы также должны его изучить перед началом. Точкой входа для доступа к объектам OpenSCADA (Рис.1) из языка пользовательского программирования JavaLikeCalc является зарезервированное слово "SYS", корневого объекта OpenSCADA. Например, для доступа к функции исходящего транспорта нужно записать: <b>SYS.Transport.Serial.out_ModBus.messIO(mess);</b>.
</p><p>API объектов, предоставляемых модулями, описывается в собственной документации модулей и тут предоставляются ссылки на неё.
</p>
<div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1 tocsection-1"><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.B9_.D1.8F.D0.B7.D1.8B.D0.BA_.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_JavaLikeCalc"><span class="tocnumber">1</span> <span class="toctext"><span>Пользовательский язык программирования JavaLikeCalc</span></span></a>
<ul>
<li class="toclevel-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"><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"><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"><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"><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"><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"><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"><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>
</ul>
</li>
<li class="toclevel-1 tocsection-2"><a href="#.D0.9E.D0.B1.D1.89.D0.B5.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.BD.D1.8B.D0.B5_.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.B8.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D1.8B"><span class="tocnumber">2</span> <span class="toctext"><span>Общесистемные пользовательские объекты</span></span></a>
<ul>
<li class="toclevel-2 tocsection-3"><a href="#.D0.9E.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.BC.D0.B0.D1.81.D1.81.D0.B8.D0.B2.D0.B0_.28Array.29"><span class="tocnumber">2.1</span> <span class="toctext"><span>Объект массива (Array)</span></span></a></li>
<li class="toclevel-2 tocsection-4"><a href="#.D0.9E.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D1.80.D0.B5.D0.B3.D1.83.D0.BB.D1.8F.D1.80.D0.BD.D0.BE.D0.B3.D0.BE_.D0.B2.D1.8B.D1.80.D0.B0.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F_.28RegExp.29"><span class="tocnumber">2.2</span> <span class="toctext"><span>Объект регулярного выражения (RegExp)</span></span></a></li>
<li class="toclevel-2 tocsection-5"><a href="#XML_node-tag_object_.28XMLNodeObj.29"><span class="tocnumber">2.3</span> <span class="toctext">XML node-tag object (XMLNodeObj)</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-6"><a href="#Program-system_.28SYS.29"><span class="tocnumber">3</span> <span class="toctext"><span>Program-system (SYS)</span></span></a></li>
<li class="toclevel-1 tocsection-7"><a href="#Any_object_.28TCntrNode.29_of_OpenSCADA_objects_tree_.28SYS..2A.29"><span class="tocnumber">4</span> <span class="toctext"><span>Any object (TCntrNode) of OpenSCADA objects tree (SYS.*)</span></span></a></li>
<li class="toclevel-1 tocsection-8"><a href="#Subsystem_.22Security.22_.28SYS.Security.29"><span class="tocnumber">5</span> <span class="toctext">Subsystem "Security" (SYS.Security)</span></a></li>
<li class="toclevel-1 tocsection-9"><a href="#.D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.91.D0.94.22_.28SYS.BD.29"><span class="tocnumber">6</span> <span class="toctext"><span>Подсистема "БД" (SYS.BD)</span></span></a></li>
<li class="toclevel-1 tocsection-10"><a href="#.D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.A1.D0.B1.D0.BE.D1.80_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85.22_.28SYS.DAQ.29"><span class="tocnumber">7</span> <span class="toctext"><span>Подсистема "Сбор данных" (SYS.DAQ)</span></span></a>
<ul>
<li class="toclevel-2 tocsection-11"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.JavaLikeCalc"><span class="tocnumber">7.1</span> <span class="toctext">Модуль DAQ.JavaLikeCalc</span></a></li>
<li class="toclevel-2 tocsection-12"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.LogicLev"><span class="tocnumber">7.2</span> <span class="toctext">Модуль DAQ.LogicLev</span></a></li>
<li class="toclevel-2 tocsection-13"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.BlockCalc"><span class="tocnumber">7.3</span> <span class="toctext">Модуль DAQ.BlockCalc</span></a></li>
<li class="toclevel-2 tocsection-14"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.ModBus"><span class="tocnumber">7.4</span> <span class="toctext">Модуль DAQ.ModBus</span></a></li>
<li class="toclevel-2 tocsection-15"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.Siemens"><span class="tocnumber">7.5</span> <span class="toctext">Модуль DAQ.Siemens</span></a></li>
<li class="toclevel-2 tocsection-16"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.OPC_UA"><span class="tocnumber">7.6</span> <span class="toctext">Модуль DAQ.OPC_UA</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-17"><a href="#.D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.90.D1.80.D1.85.D0.B8.D0.B2.D1.8B-.D0.98.D1.81.D1.82.D0.BE.D1.80.D0.B8.D1.8F.22_.28SYS.Archive.29"><span class="tocnumber">8</span> <span class="toctext"><span>Подсистема "Архивы-История" (SYS.Archive)</span></span></a></li>
<li class="toclevel-1 tocsection-18"><a href="#Subsystem_.22Transports.22_.28SYS.Transport.29"><span class="tocnumber">9</span> <span class="toctext"><span>Subsystem "Transports" (SYS.Transport)</span></span></a></li>
<li class="toclevel-1 tocsection-19"><a href="#.D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.9F.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.8B.22_.28SYS.Protocols.29"><span class="tocnumber">10</span> <span class="toctext">Подсистема "Протоколы" (SYS.Protocols)</span></a>
<ul>
<li class="toclevel-2 tocsection-20"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_Protocol.HTTP"><span class="tocnumber">10.1</span> <span class="toctext">Модуль Protocol.HTTP</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-21"><a href="#Subsystem_.22User_interfaces.22_.28SYS.UI.29"><span class="tocnumber">11</span> <span class="toctext"><span>Subsystem "User interfaces" (SYS.UI)</span></span></a>
<ul>
<li class="toclevel-2 tocsection-22"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_QTStarter"><span class="tocnumber">11.1</span> <span class="toctext">Модуль QTStarter</span></a></li>
<li class="toclevel-2 tocsection-23"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_UI.VCAEngine"><span class="tocnumber">11.2</span> <span class="toctext">Модуль UI.VCAEngine</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-24"><a href="#.D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.A1.D0.BF.D0.B5.D1.86.D0.B8.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5.22_.28SYS.Special.29"><span class="tocnumber">12</span> <span class="toctext">Подсистема "Специальные" (SYS.Special)</span></a>
<ul>
<li class="toclevel-2 tocsection-25"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.BD.D0.BE.D0.B3.D0.BE_API_.D1.81.D1.80.D0.B5.D0.B4.D1.8B_.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_.28Special.FLibSYS.29"><span class="tocnumber">12.1</span> <span class="toctext">Модуль Библиотека системного API среды пользовательского программирования (Special.FLibSYS)</span></a></li>
<li class="toclevel-2 tocsection-26"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_.D1.81.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D1.8B.D1.85_.D0.BC.D0.B0.D1.82.D0.B5.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9_.28Special.FLibMath.29"><span class="tocnumber">12.2</span> <span class="toctext">Модуль Библиотека стандартных математических функций (Special.FLibMath)</span></a></li>
<li class="toclevel-2 tocsection-27"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9_.D1.81.D0.BE.D0.B2.D0.BC.D0.B5.D1.81.D1.82.D0.B8.D0.BC.D0.BE.D1.81.D1.82.D0.B8_.D1.81.D0.BE_SCADA_Complex1_.D1.84.D0.B8.D1.80.D0.BC.D1.8B_.D0.9E.D0.9E.D0.9E_.D0.9D.D0.98.D0.9F_.22DIYA.22_.28Special.FLibComplex1.29"><span class="tocnumber">12.3</span> <span class="toctext">Модуль Библиотека функций совместимости со SCADA Complex1 фирмы ООО НИП "DIYA" (Special.FLibComplex1)</span></a></li>
</ul>
</li>
<li class="toclevel-1 tocsection-28"><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.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8F"><span class="tocnumber">13</span> <span class="toctext">Библиотеки функций пользователя</span></a></li>
<li class="toclevel-1 tocsection-29"><a href="#.D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8"><span class="tocnumber">14</span> <span class="toctext">Ссылки</span></a></li>
</ul>
</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.B9_.D1.8F.D0.B7.D1.8B.D0.BA_.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_JavaLikeCalc"><span class="mw-headline-number">1</span> <span id="JavaLikeCalc" title="#JavaLikeCalc"><a href="Modules/JavaLikeCalc.html" title="Special:MyLanguage/Modules/JavaLikeCalc">Пользовательский язык программирования JavaLikeCalc</a></span></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>("&lt;EVAL&gt;").</li></ul>
<p><i>Встроенные константы:</i> <b>pi</b> = 3.14159265..., <b>e</b> = 2.71828182..., <b>EVAL_BOOL</b>(2), <b>EVAL_INT</b>(-9223372036854775807), <b>null</b>,<b>EVAL</b>,<b>EVAL_REAL</b>(-1.79E308), <b>EVAL_STR</b>("&lt;EVAL&gt;")<br />
<i>Глобальные атрибуты параметров DAQ (начиная с подсистемы "DAQ" и в виде <b>{Тип модуля DAQ}.{Объект контроллера}.{Параметр}.{Атрибут}</b>).</i><br />
<i>Функции и параметры <a href="User_API.html" title="Special:MyLanguage/Documents/User API">объектной модели OpenSCADA</a>.</i>
</p><p><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../en/files/At.png" width="22" /></a> 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>&lt;&lt;</td><td>Поразрядный сдвиг влево</td></tr>
<tr><td>&gt;&gt;</td><td>Поразрядный сдвиг вправо</td></tr>
<tr bgcolor="#FFFFC0"><td>&gt;</td><td>Больше</td></tr>
<tr bgcolor="#FFFFC0"><td>&gt;=</td><td>Больше или равно</td></tr>
<tr bgcolor="#FFFFC0"><td>&lt;</td><td>Меньше</td></tr>
<tr bgcolor="#FFFFC0"><td>&lt;=</td><td>Меньше или равно</td></tr>
<tr bgcolor="#FFFFC0"><td>==</td><td>Равно</td></tr>
<tr bgcolor="#FFFFC0"><td>!=</td><td>Не равно</td></tr>
<tr><td>|</td><td>Поразрядное "ИЛИ"</td></tr>
<tr><td>&amp;</td><td>Поразрядное "И"</td></tr>
<tr><td>^</td><td>Поразрядное "Исключающее ИЛИ"</td></tr>
<tr bgcolor="#FFFFC0"><td>&amp;&amp;</td><td>Логический "И"</td></tr>
<tr bgcolor="#FFFFC0"><td>||</td><td>Логический "ИЛИ"</td></tr>
<tr><td>?:</td><td>Условная операция "i=(i&lt;0)?0:i;"</td></tr>
<tr bgcolor="#FFFFC0"><td>=</td><td>Присваивание.</td></tr>
<tr bgcolor="#FFFFC0"><td>+=</td><td>Присваивание со сложением.</td></tr>
<tr bgcolor="#FFFFC0"><td>-=</td><td>Присваивание с вычитанием.</td></tr>
<tr bgcolor="#FFFFC0"><td>*=</td><td>Присваивание с умножением.</td></tr>
<tr bgcolor="#FFFFC0"><td>/=</td><td>Присваивание с делением.</td></tr>
</table>
<h3><span class="mw-headline" id=".D0.92.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">&gt;=</span> <span class="mi">100</span><span class="p">)</span> <span class="o">?</span> <span class="kc">true</span> <span class="o">:</span> <span class="kc">false</span><span class="p">;</span>
</pre></div>
<p>Что читается как — если переменная <i>pos</i> больше или равна <b>100</b>, то переменной <i>st_open</i> присваивается значение <b>true</b>, иначе — <b>false</b>.
</p><p>Глобальное условие строится на основе условных операторов "if" и "else". В качестве примера можно привести тоже выражение, но записанное другим способом:
</p>
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="p">(</span><span class="nx">pos</span> <span class="o">&gt;</span> <span class="mi">100</span><span class="p">)</span> <span class="nx">st_open</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="k">else</span> <span class="nx">st_open</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</pre></div>
<h4><span class="mw-headline" id=".D0.A6.D0.B8.D0.BA.D0.BB.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>
<h2><span class="mw-headline" id=".D0.9E.D0.B1.D1.89.D0.B5.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.BD.D1.8B.D0.B5_.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.B8.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D1.8B"><span class="mw-headline-number">2</span> <span id="Object" title="#Object">Общесистемные пользовательские объекты</span></span></h2>
<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">&lt;</span> <span class="nx">arguments</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span>
  <span class="nx">args</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nx">arguments</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</pre></div>
<p>Частичными свойствами объекта обладают и базовые типы. Свойства и функции базовых типов приведены ниже:
</p>
<ul><li> Нулевой тип, функции:
<ul><li> <i>bool isEVal();</i> — возвращает "true".</li></ul></li></ul>
<ul><li> Логический тип, функции:
<ul><li> <i>bool isEVal(); bool isNaN( );</i> — проверяет значение на <b>null</b>-<b>EVAL</b>.</li>
<li> <i>string toString();</i> — представляет значение в виде строки "true" или "false".</li></ul></li></ul>
<dl><dd><ul><li> <i>real toReal();</i> — читает логическое значение как вещественное число.</li>
<li> <i>int toInt();</i> — читает логическое значение как целое число.</li></ul></dd></dl>
<ul><li> Целое и вещественное число:</li></ul>
<dl><dd><dl><dt> <i>Свойства:</i></dt></dl>
<ul><li> <i>MAX_VALUE</i> — максимальное значение;</li>
<li> <i>MIN_VALUE</i> — минимальное значение;</li>
<li> <i>NaN</i> — недостоверное значение.</li></ul>
<dl><dt> <i>Функции:</i></dt></dl>
<ul><li> <i>bool isEVal(); bool isNaN( );</i> — проверяет значение на <b>null</b>-<b>EVAL</b>, и не число для Вещественного.</li>
<li> <i>string toExponential( int numbs = -1 );</i> — возвращает строку отформатированного числа, в экспоненциальной нотации и количеством значащих цифр <i>numbs</i>. Если <i>numbs</i> отсутствует то цифр будет столько сколько необходимо.</li>
<li> <i>string toFixed( int numbs = 0, int len = 0, bool sign = false );</i> — возвращает строку отформатированного числа в нотации с фиксированной точкой и количеством цифр после десятичной точки <i>numbs</i>, с минимальной длиной <i>len</i> и обязательным знаком <i>sign</i>. Если <i>numbs</i> отсутствует то количество цифр после десятичной точки равно нулю.</li>
<li> <i>string toPrecision( int prec = -1 );</i> — возвращает строку отформатированного числа с количеством значащих цифр <i>prec</i>. </li>
<li> <i>string toString( int base = 10, int len = -1, bool sign = false );</i> — возвращает строку отформатированного числа целого типа с базой представления <i>base</i> (2-36), с минимальной длиной <i>len</i> и обязательным знаком <i>sign</i>.</li>
<li> <i>real toReal();</i> — читает целое-вещественное значение как вещественное число.</li>
<li> <i>int toInt();</i> — читает целое-вещественное значение как целое число.</li></ul></dd></dl>
<ul><li> 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 (&gt;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 (&gt;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 />
</p>
<h3><span class="mw-headline" id=".D0.9E.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.BC.D0.B0.D1.81.D1.81.D0.B8.D0.B2.D0.B0_.28Array.29"><span class="mw-headline-number">2.1</span> <span id="Array" title="#Array">Объект массива (Array)</span></span></h3>
<p>Особенностью массива является то, что он работает со свойствами, как с индексами, и полное их именование бессмысленно, а значит доступен только механизм обращения заключением индекса в квадратные скобки "<b>arr[1]</b>". Массив хранит свойства в собственном контейнере одномерного массива. Цифровые свойства массива используются для доступа непосредственно к массиву, а символьные работают как свойства объекта.
</p><p>Массив предоставляет специальное свойство "length", для получения размера массива "<b>var = arr.length;</b>". Также массив предоставляет следующие функции:
</p>
<ul><li> <i>string join( string sep = "," )</i>, <i>string toString( string sep = "," )</i>, <i>string valueOf( string sep = "," )</i> — возвращает строку с элементами массива, разделёнными <i>sep</i> или символом ','.</li>
<li> <i>Array concat( Array arr );</i> — добавляет к исходному массиву элементы массива <i>arr</i>. Возвращает исходный массив с изменениями.</li>
<li> <i>int push( ElTp var, ... );</i> — помещает элемент(ы) <i>var</i> в конец массива, как в стек. Возвращает новый размер массива.</li>
<li> <i>ElTp pop( );</i> — удаляет последний элемент массива и возвращает его значения, как из стека.</li>
<li> <i>Array reverse( );</i> — изменяет порядок расположения элементов массива. Возвращается исходный массив с изменениями.</li>
<li> <i>ElTp shift( );</i> — сдвигает массив вверх, при этом первый элемент массива удаляется, а его значение возвращается.</li>
<li> <i>int unshift( ElTp var, ... );</i> — задвигает элемент(ы) <i>var</i> в массив. Первый элемент в 0, второй в 1 и т.д.</li>
<li> <i>Array slice( int beg, int end );</i> — возвращает фрагмент массива от <i>beg</i> к <i>end</i> (исключая). Если значение начала или конца отрицательно, то отсчёт ведётся с конца массива. Если конец не указан, то концом является конец массива.</li>
<li> <i>Array splice( int beg, int remN, ElTp val1, ElTp val2, ... );</i> — вставляет, удаляет или заменяет элементы массива. Возвращает массив удалённых элементов. В первую очередь осуществляется удаление элементов с позиции <i>beg</i> и количеством <i>remN</i>, а затем вставляются значения <i>val1</i> и т.д., начиная с позиции <i>beg</i>.</li>
<li> <i>int indexOf( ElTp var, int start = 0 );</i> — возвращает индекс массиву нужной переменной <i>var</i> в исходной последовательности, начиная с позиции <i>start</i>. Если исходная позиция не указана то поиск начинается с начала. Если искомого значения не найдено то возвращается "-1".</li>
<li> <i>int lastIndexOf( ElTp var, int start = {end} );</i> — возвращает индекс массива нужной переменной <i>var</i> в исходной последовательности, начиная с позиции <i>start</i> при поиске с конца. Если исходная позиция не указана то поиск начинается с конца. Если искомого значения не найдено то возвращается "-1".</li>
<li> <i>double sum( int beg, int end );</i> — сумма значений части массива с позиции <i>beg</i> по <i>end</i>, исключая.</li>
<li> <i>Array sort( );</i> — сортирует элементы массива в лексикографическом порядке.</li></ul>
<h3><span class="mw-headline" id=".D0.9E.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D1.80.D0.B5.D0.B3.D1.83.D0.BB.D1.8F.D1.80.D0.BD.D0.BE.D0.B3.D0.BE_.D0.B2.D1.8B.D1.80.D0.B0.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F_.28RegExp.29"><span class="mw-headline-number">2.2</span> <span id="RegExp" title="#RegExp">Объект регулярного выражения (RegExp)</span></span></h3>
<p>Объект работы с регулярными выражениями, основан на библиотеке PCRE. При глобальном поиске устанавливается атрибут объекта "lastIndex", что позволяет продолжить поиск при следующем вызове функции. В случае неудачного поиска атрибут "lastIndex" сбрасывается в ноль.
</p><p>As arguments for creating the object, a string with regular expression text and a flags box in the form of a character string is passed:
</p>
<ul><li> 'g' — global match mode, that is meant the request repeating for processing all expressions up to empty result array;</li>
<li> 'i' — case insensitive match mode;</li>
<li> 'm' — multi-line match mode;</li>
<li> 'u' — compulsion for UTF-8 characters resolution, for other locales;</li>
<li> 'p' — testing the expression by the usual template rule with the key characters: '?', '*' and '\'.</li></ul>
<p>Свойства объекта:
</p>
<ul><li> <i>source</i> — исходный шаблон регулярного выражения, только чтение.</li>
<li> <i>global</i> — признак глобального поиска, только чтение.</li>
<li> <i>ignoreCase</i> — признак игнорирования регистра символов при поиске, только чтение.</li>
<li> <i>multiline</i> — признак многострочного поиска, только чтение.</li>
<li> <i>UTF8</i> — признак разрешения UTF-8 символов, только чтение.</li>
<li> <i>lastIndex</i> — индекс символа за подстрокой последнего поиска, используется в глобальном режиме для продолжения сканирования, при следующем вызове.</li></ul>
<p>Функции объекта:
</p>
<ul>
<li><i>Array exec(string val);</i> — вызывает поиск по строке <i>val</i>. Возвращает найденную подстроку (0) и подвыражения (&gt;0) в массиве. Устанавливает атрибут массива "index" в позицию найденной подстроки. Устанавливает атрибут массива "input" в значение исходной строки.
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="kd">var</span> <span class="nx">re</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">"(\\d\\d)[-/](\\d\\d)[-/](\\d\\d(?:\\d\\d)?)"</span><span class="p">,</span><span class="s2">""</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">rez</span> <span class="o">=</span> <span class="nx">re</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="s2">"12/30/1969"</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">month</span> <span class="o">=</span> <span class="nx">rez</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">day</span> <span class="o">=</span> <span class="nx">rez</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
<span class="kd">var</span> <span class="nx">year</span> <span class="o">=</span> <span class="nx">rez</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
</pre></div></li>
<li><i>bool test(string val);</i> — возвращает "true" если подстрока найдена в <i>val</i>.
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="kd">var</span> <span class="nx">re</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">"(\\d\\d)[-/](\\d\\d)[-/](\\d\\d(?:\\d\\d)?)"</span><span class="p">,</span><span class="s2">""</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">OK</span> <span class="o">=</span> <span class="nx">re</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="s2">"12/30/1969"</span><span class="p">);</span>
</pre></div></li>
</ul>
<h3><span class="mw-headline" id="XML_node-tag_object_.28XMLNodeObj.29"><span class="mw-headline-number">2.3</span> XML node-tag object (XMLNodeObj)</span></h3>
<p>Functions:
</p>
<ul><li> <i>string name( )</i> — the name of the node, XML-tag.</li>
<li> <i>string text( bool full = false )</i> — the text of the node, contents of the XML-tag. Set <i>full</i> for get the combined text of all included nodes.</li>
<li> <i>string attr( string id )</i> — the value of the node attribute <i>id</i>.</li>
<li> <i>XMLNodeObj setName( string vl )</i> — sets of the node name to <i>vl</i>. Returns the current node.</li>
<li> <i>XMLNodeObj setText( string vl )</i> — sets of the node text to <i>vl</i>. Returns the current node.</li>
<li> <i>XMLNodeObj setAttr( string id, string vl )</i> — sets the attribute <i>id</i> to the value <i>vl</i>. Returns the current node.</li>
<li> <i>XMLNodeObj clear( bool full = false )</i> — clears the node for the childs, removes the text and attributes for <i>full</i>.</li>
<li> <i>int childSize( )</i> — quantity of the included nodes.</li>
<li> <i>XMLNodeObj childAdd( ElTp no = XMLNodeObj ); XMLNodeObj childAdd( string no )</i> — addition of the object <i>no</i> as the included one. <i>no</i> may be the direct object-result of the function "SYS.XMLNode()", and the string with the name of a new tag. Returns the included node.</li>
<li> <i>XMLNodeObj childIns( int id, ElTp no = XMLNodeObj ); XMLNodeObj childIns( int id, string no )</i> — insert of the object <i>no</i> as the included one to the position <i>id</i>. <i>no</i> may be the direct object-result of the function "SYS.XMLNode()", and the string with the name of a new tag. Returns the embedded node.</li>
<li> <i>XMLNodeObj childDel( int id )</i> — deletes the included node from the position <i>id</i>. Returns current node.</li>
<li> <i>XMLNodeObj childGet( int id )</i> — gets the included node in the position <i>id</i>. Returns <b>0</b> at missing one.</li>
<li> <i>XMLNodeObj childGet( string name, int num = 0 )</i> — gets the included node with the tag <i>name</i> and the position number <i>num</i>. Returns <b>0</b> at missing one.</li>
<li> <i>XMLNodeObj parent( )</i> — gets the parent node. Returns <b>false</b> at missing one.</li>
<li> <i>string load( string str, bool file = false, int flg = 0, string cp = "UTF-8" )</i> — loads the XML from the string <i>str</i> or from the file with the path in <i>str</i> if the <i>file</i> equal "true", with the source encoding <i>cp</i>. Returns a string with error in the format "<b>{errCod}:{errText}</b>", which is "0" for successful loading. Where <i>flg</i> — loading flags:</li></ul>
<dl><dd><dl><dd>0x01 — full loading, with texts and comments blocks into special nodes;</dd>
<dd>0x02 — does not remove spaces from the begin and end of the tag text.</dd></dl></dd></dl>
<ul><li> <i>string save( int flg = 0, string path = "", string cp = "UTF-8" )</i> — saves the XML tree to the string or to the file <i>path</i> with the formatting flags <i>flg</i> and target encoding <i>cp</i>. Returns the XML text or the error code. The following formatting options <i>flg</i> are provided:</li></ul>
<dl><dd><dl><dd>0x01 — end line before the opening tag;</dd>
<dd>0x02 — end line after the opening tag;</dd>
<dd>0x04 — end line after the closing tag;</dd>
<dd>0x08 — end line after the text;</dd>
<dd>0x10 — end line after the instruction;</dd>
<dd>0x1E — end line after all ones;</dd>
<dd>0x20 — inserts the standard XML-header;</dd>
<dd>0x40 — inserts the standard XHTML-header;</dd>
<dd>0x80 — cleans the service tags: &lt;??&gt;, &lt;!-- --&gt;;</dd>
<dd>0x100 — does not encode the tag name;</dd>
<dd>0x200 — does not encode the attribute;</dd>
<dd>0x400 — shield the binary symbols [\x0-\x8\xB-\xC\x0E-\x1F] and wrong UTF-8.</dd></dl></dd></dl>
<ul><li> <i>XMLNodeObj getElementBy( string val, string attr = "id" )</i> — gets an element from the tree by the attribute <i>attr</i> in value <i>val</i>.</li>
<li> <i>TArrayObj&lt;XMLNodeObj&gt; getElementsBy( string tag, string attrVal = "", string attr = "id", int limit = 0, int from = 0 )</i> — gets an elements array from the tree by the <i>tag</i> (empty for all) and attribute <i>attr</i> in value <i>attrVal</i> (empty for pass), also starting the tag number <i>from</i> and limiting them number in <i>limit</i> (zero for no limit).</li></ul>
<h2><span class="mw-headline" id="Program-system_.28SYS.29"><span class="mw-headline-number">3</span> <span id="SYS" title="#SYS">Program-system (SYS)</span></span></h2>
<p>Object functions:
</p>
<ul>
<li><i>{string|int} system( string cmd, bool noPipe = false );</i> — calls the console commands <i>cmd</i> of the OS returning the result by the channel. If <i>noPipe</i> is set then the callback code is returned and program can be started in the background ("sleep 5 &amp;"). The function provides OpenSCADA with a wide range of capabilities by calling any system programs, utilities, and scripts, as well as by providing them with access to a huge amount of system data. For example the command "ls-l" returns the detailed content of the working directory.</li>
<li><i>int fileSize( string file );</i> — returns the <i>file</i> size.</li>
<li><i>string fileRead( string file, int off = 0, int sz = -1 );</i> — returns a string of part of the <i>file</i> for the offset <i>off</i> and the block size <i>sz</i>.</li>
<li><i>int fileWrite( string file, string str, bool append = false );</i> — writes the string <i>str</i> to the <i>file</i>, removes presented one, at <i>append</i>. Returns the wrote bytes count.</li>
<li><i>int fileRemove( string file );</i> — removes the <i>file</i>. Returns the removing result.</li>
<li><i>int message( string cat, int level, string mess );</i> — forms of the system message <i>mess</i> with the category <i>cat</i>, level <i>level</i> (-7...7). The negative value of the level forms the alarms.</li>
<li><i>int messDebug( string cat, string mess ); int messInfo( string cat, string mess ); int messNote( string cat, string mess ); int messWarning( string cat, string mess ); int messErr( string cat, string mess ); int messCrit( string cat, string mess ); int messAlert( string cat, string mess ); int messEmerg( string cat, string mess );</i> — forms of the system message <i>mess</i> with the category <i>cat</i> and the appropriate level by the name.</li>
<li><i>XMLNodeObj XMLNode( string name = "" );</i> — creates of the XML node object with the <i>name</i>.</li>
<li><i>string cntrReq( XMLNodeObj req, string stat = "" );</i> — sends a request <i>req</i> in XML view to the <a href="../en/API.html#CntrNode" title="Special:MyLanguage/Documents/API">Control Interface</a> of the program. Returns a string with error in the format "<b>{errCod}:{errText}</b>", which is "0" for successful. A request is generally written in the form <b>&lt;get path="/OPath/%2felem" /&gt;</b> and with additional attributes specific to the particular request. If the station <i>stat</i> is specified into the request then the request will be sent to this external station. The address for the attribute "path" you can obtain into the OpenSCADA configurator, that is into the status line where the address appear at the mouse cursor point to a field of configuration or information. Some examples of common requests, more examples in <a href="../en/API.html#CntrNode" title="Special:MyLanguage/Documents/API">description the Control Interface</a> and <a href="Libs_Service_procedures.html#releaseTests" title="Special:MyLanguage/Libs/Service procedures">releaseTests()</a>:
<ul>
 <li>Reading a value of the element (the user name "test"):
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"get"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"path"</span><span class="p">,</span><span class="s2">"/sub_Security/usr_test/%2fprm%2fDESCR"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">cntrReq</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
<span class="nx">idSt</span> <span class="o">=</span> <span class="nx">req</span><span class="p">.</span><span class="nx">text</span><span class="p">();</span>
</pre></div></li>
 <li>Writing a value to the element (the user name "test"):
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"set"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"path"</span><span class="p">,</span><span class="s2">"/sub_Security/usr_test/%2fprm%2fDESCR"</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="s2">"New test user name"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">cntrReq</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</pre></div></li>
 <li>Adding a new node (the user "test"):
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"add"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"path"</span><span class="p">,</span><span class="s2">"/sub_Security/%2fbr%2fusr_"</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="s2">"test"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">cntrReq</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</pre></div></li>
 <li>Deleting a node (the user "test"):
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"del"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"path"</span><span class="p">,</span><span class="s2">"/sub_Security/%2fbr%2fusr_"</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="s2">"test"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">cntrReq</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</pre></div></li>
 <li>Saving the node changes to DB (the user "test"):
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"save"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"path"</span><span class="p">,</span><span class="s2">"/sub_Security/usr_test/%2fobj"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">cntrReq</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</pre></div></li>
 <li>Loading the node from DB (the user "test"):
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"load"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"path"</span><span class="p">,</span><span class="s2">"/sub_Security/usr_test/%2fobj"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">cntrReq</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
</pre></div></li>
</ul></li>
<li><i>string lang(string full);</i> — returns the system language in two symbols and the full language in <i>full</i>.</li>
<li><i>int sleep( real tm, int ntm = 0 );</i> — puts the execution thread to sleep on the <i>tm</i> seconds (precised up to nanoseconds) and <i>ntm</i> nanoseconds. The sleeping time you can set up to STD_INTERF_TM (5 seconds).</li>
<li><i>int time( int usec );</i> — returns the absolute time in seconds from the epoch of 1/1/1970 and the microseconds part into <i>usec</i> if specified.</li>
<li><i>int utime( ); int mtime( );</i> — returns the absolute time in microseconds and milliseconds from the epoch of 1/1/1970.</li>
<li><i>int {localtime|gmtime}( int fullsec, int sec, int min, int hour, int mday, int month, int year, int wday, int yday, int isdst );</i> — returns the full date in seconds (sec), minutes (min), hours (hour), days of the month (mday), months (month), years (year), days in the week (wday), days in the year (yday) and sign of the summer time (isdst), based on the absolute time in seconds <i>fullsec</i> from the epoch 1/1/1970. <i>gmtime</i> returns time in GMT(UTC).</li>
<li><i>int {mktime|timegm}( int sec, int min, int hour, int mday, int month, int year, int wday, int yday, int isdst );</i> — forms the time since Epoch 1/1/1970 from separated seconds, minutes, hours, days, month etc. The values for separated time items can be set out from this typical range, which allows you to use this function during checking, and as a result, units of time will be fixed and rotated in the normal range. <i>timegm</i> runs in time at GMT(UTC).</li>
<li><i>string {strftime|strftimegm}( int sec, string form = "%Y-%m-%d&nbsp;%H:%M:%S" );</i> — converts an absolute time <i>sec</i> to the string of the desired format <i>form</i>. Record of the format corresponds to the POSIX-function <i>strftime</i>. <i>strftimegm</i> returns time into GMT(UTC).</li>
<li><i>int {strptime|strptimegm}( string str, string form = "%Y-%m-%d&nbsp;%H:%M:%S" );</i> — returns the time in seconds from the epoch of 1/1/1970, based on the string record of time <i>str</i>, in accordance with the specified template <i>form</i>. For example the template "%Y-%m-%d&nbsp;%H:%M:%S" corresponds with the time "2006-08-08 11:21:55". Description of the template format can be obtained from the documentation on POSIX-function <i>strptime</i>. <i>strptimegm</i> works into GMT(UTC) time.</li>
<li><i><span id="CRON" title="#CRON">int cron( string cronreq, int base = 0 );</span></i> — returns the time, planned in the format of the standard CRON, <i>cronreq</i>, beginning from the basic time <i>base</i> or current, if the basic is not specified. CRON is the standard form "* * * * *".
<dl><dt> Where items by the order</dt>
<dd /></dl>
<ul><li> minutes (0-59);</li>
<li> hours (0-23);</li>
<li> days (1-31);</li>
<li> month (1-12);</li>
<li> week day (0[Sunday]-6).</li></ul>
<dl><dt> Where the item variants</dt>
<dd /></dl>
<ul><li> "*" — any value;</li>
<li> "1,2,3" — list of the allowed values;</li>
<li> "1-5" — raw range of the allowed values;</li>
<li> "*/2" — divider to the all allowed values range.</li></ul>
<dl><dt> Examples</dt>
<dd /></dl>
<ul><li> "* * * * *" — each minute;</li>
<li> "10 23 * * *" — only at 23 hour and 10 minute for any day and month;</li>
<li> "*/2 * * * *" — for minutes: 0,2,4,...,56,58;</li>
<li> "* 2-4 * * *" — for any minutes in hours from 2 to 4(include).</li></ul>
</li>
<li><i>string time2str( real tm, bool inParts = true );</i> — Converts the time interval <i>tm</i> in seconds to human string like "1hour 23minutes 10s" at setting <i>inParts</i> or "1.5 hour" else.</li>
<li><i>string cpct2str( real cnt );</i> — Converts the capacity <i>cnt</i> in bytes to the human representing string.</li>
<li><i>string str2time( string val, bool inParts = true );</i> — Converts the human representing relative time <i>val</i> of the function <i>time2str()</i> to the time in seconds, with parsing parts at setting <i>inParts</i>.</li>
<li><i>string strFromCharCode( int char1, int char2, int char3, ... );</i> — creates a string from symbol codes <i>char1</i>, <i>char2</i> ... <i>charN</i>.</li>
<li><i>string strFromCharUTF([string type = "UTF-8",] int char1, int char2, int char3, ...);</i> — creates a string from UTF symbols <i>char1</i>, <i>char2</i> ... <i>charN</i>. These types of the symbol are supported: UTF-8, UTF-16, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE.</li>
<li><i>string strCodeConv( string src, string fromCP, string toCP );</i> — transcodes the text <i>src</i> from the encoding <i>fromCP</i> to <i>toCP</i>. If the encoding is omitted (empty string), it is used the internal one.</li>
<li><i>string strEncode( string src, string tp = "Bin", string opt = "" );</i> — encodes the string <i>src</i> by the rule <i>tp</i> and the option <i>opt</i>. Allowed rules:
<dl><dd>"PathEl" — symbols <b>[/%]</b> to "%2f" and "%25", respectively;</dd>
<dd>"HttpURL" — symbols <b>[ \t%]</b> and "&gt; 0x80" to "%20", "%09", "%25" and etc.;</dd>
<dd>"HTML" — symbols of the HTML-entities <b>[&gt;&lt;"&amp;']</b> to "&amp;gt;", "&amp;lt;", "&amp;quot;" and etc.;</dd>
<dd>"JavaScript" — symbol '\n' shielding to "\\n";</dd>
<dd>"SQL" — shielding of the symbols <b>['"`\]</b> by appending '\' or doubling of the listed symbols into <i>opt</i>;</dd>
<dd>"Custom" — symbols into <i>opt</i> to the view "%NN";</dd>
<dd>"Base64" — same Base 64 binary encoding, into <i>opt</i> sets a line termination symbol(s) after 57 symbols;</dd>
<dd>"FormatPrint" — symbol '%' to "%%";</dd>
<dd>"OscdID" — almost all symbols like <b>[ /\&amp;(]</b> to '_';</dd>
<dd>"Bin" — ASCII bytes list ("XX XX XX XX ...") to the binary represent;</dd>
<dd>"Reverse" — reversion the sequence;</dd>
<dd>"ToLower" — symbols to the lower register;</dd>
<dd>"Limit" — limiting the string to the length into <i>opt</i>, counting UTF-8 variable length;</dd>
<dd>"ShieldSymb" — shielding symbols from <i>opt</i> (by default ['"`]) with the slash symbol "\" like to '\n', '\r', ..., '\0NNN';</dd>
<dd>"ShieldBin" — shielding all binary symbols [\x0-\x8\xB-\xC\x0E-\x1F] with the slash symbol "\".</dd></dl>
</li>
<li><i>string strDecode( string src, string tp = "Bin", string opt = "" );</i> — decodes the string <i>src</i> by the rule <i>tp</i> and the option <i>opt</i>. Allowed rules:
<dl><dd>"PathEl", "HttpURL", "Custom" — symbols like "%NN" to the binary represent;</dd>
<dd>"Base64" — same from Base 64;</dd>
<dd>"Bin" — the binary string to ASCII bytes ("XX XX XX XX ..   A.b.c.."), <i>opt</i> points to the separator or "&lt;text&gt;" for enable the offset to the left and the text part to the right;</dd>
<dd>"ShieldSymb" — shielded symbols like to '\n', '\r', ..., '\0NNN', '\xNN' to the binary represent.</dd></dl>
</li></ul>
<h2><span class="mw-headline" id="Any_object_.28TCntrNode.29_of_OpenSCADA_objects_tree_.28SYS..2A.29"><span class="mw-headline-number">4</span> <span id="TCntrNode" title="#TCntrNode">Any object (TCntrNode) of OpenSCADA objects tree (SYS.*)</span></span></h2>
<p>Object functions:
</p>
<ul><li> <i>PropTp property(string id, PropTp val = NULL);</i> — Returns of the object's property <i>id</i> for the group <i>grp</i> with setting its at <i>val</i> non NULL and EVAL. Where <i>val</i> in EVAL is clearing the property and NULL (no the argument) just sets nothing. You can <a href="#Object">access directly</a> the properties for the TCntrNode objects, of course at their absency in the Object Model.</li>
<li> <i>TArrayObj nodeList( string grp = "", string path = "" );</i> — Get child nodes full identifiers list for group <i>grp</i> and node from path <i>path</i>. If <i>grp</i> empty then return nodes for all groups. The full identifier is "{grp}{nID}".</li>
<li> <i>TCntrNodeObj nodeAt( string path, string sep="" );</i> — Attach to node <i>path</i> into OpenSCADA objects tree. If a separator set into <i>sep</i> then path process as separated string. For missing and invalid nodes the function will return "false" when a correct node in it conversion to BOOLEAN will return "true".</li>
<li> <i>TCntrNodeObj nodePrev( );</i> — Get previous, parent, node.</li>
<li> <i>string nodePath( string sep = "", bool from_root = true );</i> — Getting the path of the current node in the object tree OpenSCADA. One separator character is specified in <i>sep</i> to get the path through the separator, for example, "DAQ.ModBus.PLC1.P1.var", otherwise "/DAQ/ModBus/PLC1/P1/var". <i>from_root</i> indicates a need to form a path from the root, and without the Station ID.</li>
<li> <i>int messSys( int level, string mess )</i> — Formation of the system message <i>mess</i> with the <i>level</i> with the node path as a category and with the human readable path before the message.</li></ul>
<h2><span class="mw-headline" id="Subsystem_.22Security.22_.28SYS.Security.29"><span class="mw-headline-number">5</span> Subsystem "Security" (SYS.Security)</span></h2>
<p>Functions of the subsystem object (SYS.Security):
</p>
<ul><li> <i>int access( string user, int mode, string owner, string group, int perm )</i> — checking for access of the <i>user</i> to resource which owned by the <i>owner</i> and <i>group</i> and for the <i>perm</i> and <i>mode</i>:</li></ul>
<dl><dd><dl><dd><i>user</i> — user of the access checking;</dd>
<dd><i>mode</i> — access mode (4-R, 2-W, 1-X);</dd>
<dd><i>owner</i> — owner of the resource;</dd>
<dd><i>group</i> — group of the resource;</dd>
<dd><i>perm</i> — permition of the resource (RWXRWXRWX — 0777).</dd></dl></dd></dl>
<p>Функции объекта "Пользователь" (SYS.Security["usr_{User}"]):
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>bool auth( string pass )</i> — возвращает TRUE в случае удачной аутентификации пользователя по <i>pass</i>.</li>
<li> <i>Array groups( )</i> — возвращает перечень групп пользователя.</li></ul>
<p>Функции объекта "Группа пользователей" (SYS.Security["grp_{Group}"]):
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>bool user( string nm )</i> — проверяет присутствие пользователя <i>nm</i> в данной группе.</li></ul>
<h2><span class="mw-headline" id=".D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.91.D0.94.22_.28SYS.BD.29"><span class="mw-headline-number">6</span> <span id="SYS.BD" title="#SYS.BD">Подсистема "БД" (SYS.BD)</span></span></h2>
<p>Функции объекта "БД" (SYS.BD["TypeDB"]["DB"]):
</p>
<ul>
<li><i>ElTp cfg(string nm)</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li><i>bool cfgSet(string nm, ElTp val)</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li><i>Array SQLReq( string req, bool tr = EVAL );</i> — осуществляет SQL-запрос <i>req</i> к БД, внутри (<i>tr</i>=true), вне (<i>tr</i>=false) или безразлично (<i>tr</i>=EVAL) к транзакции. Возвращает массив строк таблицы результата с полями по индексам и по именам колонок. В случае ошибки её значение помещается в свойство "err" результата.
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">DBTbl</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">BD</span><span class="p">.</span><span class="nx">MySQL</span><span class="p">.</span><span class="nx">GenDB</span><span class="p">.</span><span class="nx">SQLReq</span><span class="p">(</span><span class="s2">"SELECT * from DB;"</span><span class="p">);</span>
<span class="k">if</span><span class="p">(</span><span class="nx">DBTbl</span><span class="p">.</span><span class="nx">err</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">messInfo</span><span class="p">(</span><span class="s2">"TEST DB"</span><span class="p">,</span><span class="s2">"Error: "</span><span class="o">+</span><span class="nx">DBTbl</span><span class="p">.</span><span class="nx">err</span><span class="p">);</span>
<span class="k">else</span> <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">iRw</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">iRw</span> <span class="o">&lt;</span> <span class="nx">DBTbl</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">iRw</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">var</span> <span class="nx">rec</span> <span class="o">=</span> <span class="s2">""</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">iFld</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">iFld</span> <span class="o">&lt;</span> <span class="nx">DBTbl</span><span class="p">[</span><span class="nx">iRw</span><span class="p">].</span><span class="nx">length</span><span class="p">;</span> <span class="nx">iFld</span><span class="o">++</span><span class="p">)</span> <span class="nx">rec</span> <span class="o">+=</span> <span class="nx">DBTbl</span><span class="p">[</span><span class="nx">iRw</span><span class="p">][</span><span class="nx">iFld</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"\t"</span><span class="p">;</span>
  <span class="nx">SYS</span><span class="p">.</span><span class="nx">messInfo</span><span class="p">(</span><span class="s2">"TEST DB"</span><span class="p">,</span> <span class="s2">"Row "</span><span class="o">+</span><span class="nx">iRw</span><span class="o">+</span><span class="s2">": "</span><span class="o">+</span><span class="nx">rec</span><span class="p">);</span>
  <span class="c1">//Get column value by the name</span>
  <span class="k">if</span><span class="p">(</span><span class="nx">iRw</span><span class="p">)</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">messInfo</span><span class="p">(</span><span class="s2">"TEST DB"</span><span class="p">,</span> <span class="s2">"Row "</span><span class="o">+</span><span class="nx">iRw</span><span class="o">+</span><span class="s2">": 'NAME'"</span><span class="o">+</span><span class="nx">DBTbl</span><span class="p">[</span><span class="nx">iRw</span><span class="p">][</span><span class="s2">"NAME"</span><span class="p">]);</span>
<span class="p">}</span>
</pre></div></li>
</ul>
<p>Функции объекта "Таблица" (SYS.BD["TypeDB"]["DB"]["Table"]):
</p>
<ul>
<li><i>XMLNodeObj fieldStruct( );</i> — получает структуру таблицы в виде XML узла "field" с дочерними узлами-колонками <b>&lt;RowId type="real" len="10.2" key="1" def="Default value"&gt;{Value}&lt;/RowId&gt;</b>, где:<ul>
 <li>{RowId} — идентификатор колонки;</li>
 <li>{Value} — значение колонки;</li>
 <li>type — тип значения колонки: <i>str</i> — строка, <i>int</i> — целое, <i>real</i> — вещественное и <i>bool</i> — логическое;</li>
 <li>len — размер значения колонки, в знаках;</li>
 <li>key — признак того, что колонка является ключом, и поиск осуществляется по его значению;</li>
 <li>def — значение колонки по умолчанию.</li>
</ul></li>
<li><i>string fieldSeek( int row, XMLNodeObj fld );</i> — запрашивает поле <i>row</i> таблицы. Если поле получено то возвращается "1" иначе "0". В случае ошибки возвращается "0:Error".</li>
<li><i>string fieldGet( XMLNodeObj fld );</i> — запрашивает значение поля. В случае ошибки возвращается "0:Error".
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"field"</span><span class="p">);</span>
<span class="nx">req</span><span class="p">.</span><span class="nx">childAdd</span><span class="p">(</span><span class="s2">"user"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"type"</span><span class="p">,</span><span class="s2">"str"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"key"</span><span class="p">,</span><span class="s2">"1"</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="s2">"root"</span><span class="p">);</span>
<span class="nx">req</span><span class="p">.</span><span class="nx">childAdd</span><span class="p">(</span><span class="s2">"id"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"type"</span><span class="p">,</span><span class="s2">"str"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"key"</span><span class="p">,</span><span class="s2">"1"</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="s2">"/Lang2CodeBase"</span><span class="p">);</span>
<span class="nx">req</span><span class="p">.</span><span class="nx">childAdd</span><span class="p">(</span><span class="s2">"val"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"type"</span><span class="p">,</span><span class="s2">"str"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">BD</span><span class="p">.</span><span class="nx">MySQL</span><span class="p">.</span><span class="nx">GenDB</span><span class="p">.</span><span class="nx">SYS</span><span class="p">.</span><span class="nx">fieldGet</span><span class="p">(</span><span class="nx">req</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">messDebug</span><span class="p">(</span><span class="s2">"TEST DB"</span><span class="p">,</span><span class="s2">"Value: "</span><span class="o">+</span><span class="nx">req</span><span class="p">.</span><span class="nx">childGet</span><span class="p">(</span><span class="mi">2</span><span class="p">).</span><span class="nx">text</span><span class="p">());</span>
</pre></div></li>
<li><i>string fieldSet( XMLNodeObj fld );</i> — устанавливает поле. В случае ошибки возвращается "0:Error".</li>
<li><i>string fieldDel(XMLNodeObj fld);</i> — удаляет поле. В случае ошибки возвращается "0:Error".</li>
</ul>
<h2><span class="mw-headline" id=".D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.A1.D0.B1.D0.BE.D1.80_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85.22_.28SYS.DAQ.29"><span class="mw-headline-number">7</span> <span id="SYS.DAQ" title="#SYS.DAQ">Подсистема "Сбор данных" (SYS.DAQ)</span></span></h2>
<p>Функции объекта подсистемы (SYS.DAQ):
</p>
<ul>
<li><i>TCntrNodeObj daqAt(string path, string sep = "", waitForAttr = true)</i> — подключается к DAQ узлу (объект контролера, параметр, атрибут) по пути <i>path</i> или разделённой строки по разделителю <i>sep</i>, от DAQ-подсистемы. Проверять на атрибут в конце пути, по <i>waitForAttr</i>.</li>
<li><i>bool funcCall( string progLang, TVarObj args, string prog, string fixId = "", string err = "" );</i> — исполняет текст функции <i>prog</i> с аргументами в объекте <i>args</i> на языке программирования <i>progLang</i> и с идентификатором фиксации <i>fixId</i> (автоматически если пустой). Возвращает "true" при корректном вызове, иначе "false" и устанавливается "err". Фиксированная функция отличается от автоматической тем, что она не удаляется после исполнения, а используется повторно по адресу в <i>fixId</i>, заменяющего оригинальный идентификатор при первом вызове. Для переформирования функции нужно изменить программу или очистить <i>fixId</i> в её оригинальный идентификатор.
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="kd">var</span> <span class="nx">args</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Object</span><span class="p">();</span>
<span class="nx">args</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">args</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="mi">123</span><span class="p">;</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">DAQ</span><span class="p">.</span><span class="nx">funcCall</span><span class="p">(</span><span class="s2">"JavaLikeCalc.JavaScript"</span><span class="p">,</span><span class="nx">args</span><span class="p">,</span><span class="s2">"y=2*x;"</span><span class="p">);</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">messDebug</span><span class="p">(</span><span class="s2">"TEST Calc"</span><span class="p">,</span><span class="s2">"TEST Calc rezult: "</span><span class="o">+</span><span class="nx">args</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span>
</pre></div></li>
<li><i>string funcSnthHgl(string progLang);</i> — запрос правил подсветки синтаксиса языка программы <i>progLang</i> в <a href="../en/API.html#SnthHgl" title="Special:MyLanguage/Documents/API">XML-теге <i>SnthHgl</i></a>.</li>
</ul>
<p>Функции объекта контроллера (SYS.DAQ["Modul"]["Controller"]):
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>string name( )</i> — имя объекта контроллера.</li>
<li> <i>string descr( )</i> — описание объекта и контроллера.</li>
<li> <i>string status( )</i> — статус контроллера.</li>
<li> <i>bool messSet( string mess, int lev, string type2Code = "OP", string prm = "", string cat = "")</i> — устанавливает сообщение источника данных <i>mess</i> с уровнем <i>lev</i>, для параметра <i>prm</i> (<b>{PrmId}</b>), дополнительной информацией категории <i>cat</i> и кодом типа <i>type2Code</i>. Эта функция <a href="Program_manual.html#ArchMess" title="Special:MyLanguage/Documents/Program manual">формирует сообщения</a> с унифицированной категорией транспортирования через источник данных <b>{type2Code}{ModId}:{CntrId}[.{PrmId}][:{cat}]</b>, где: 
<ul><li> <i>type2Code</i> — двухсимвольный код типа сообщения, по умолчанию означает действие оператора "OP";</li>
<li> <i>CntrId</i> — идентификатор объекта контроллера;</li>
<li> <i>PrmId</i> — идентификатор параметра, из аргумента <i>prm</i>;</li>
<li> <i>CntrNm</i> — название объекта контроллера;</li>
<li> <i>cat</i> — дополнительная информация категории которую определено для типа <i>type2Code</i>.</li></ul></li>
<li> <i>bool alarmSet( string mess, int lev = -5, string prm = "", bool force = false )</i> — устанавливает/снимает нарушение <i>mess</i> с уровнем <i>lev</i> (отрицательный для установки иначе снятие), для параметра <i>prm</i> (<b>{PrmId}\n{PrmNm}</b>). Очистка нарушений, как и установка, работает в режиме переключателя, что предусматривает пропуск сообщений очистки в буфер сообщений, и саму очистку, только при наличии соответствующего нарушения, что может быть отключено установкой <i>force</i>. Функция формирует нарушение с категорией <b>al{ModId}:{CntrId}[.{PrmId}]</b> и текстом <b>{CntrNm} &gt; {PrmNm}: {MessText}</b>, где:
<ul><li> <i>ModId</i> — идентификатор модуля;</li>
<li> <i>CntrId</i> — идентификатор объекта контроллера;</li>
<li> <i>PrmId</i> — идентификатор параметра, из аргумента <i>prm</i>;</li>
<li> <i>CntrNm</i> — название объекта контроллера;</li>
<li> <i>PrmNm</i> — название параметра, из аргумента <i>prm</i>;</li>
<li> <i>MessText</i> — текст сообщения.</li></ul></li>
<li> <i>bool enable( bool newSt = EVAL )</i> — получает состояние "Включен" или изменяет его назначением атрибута <i>newSt</i>.</li>
<li> <i>bool start( bool newSt = EVAL )</i> — получает состояние "Имполняется" или изменяет его назначением атрибута <i>newSt</i>.</li></ul>
<p>Функции объекта параметра контроллера (SYS.DAQ["Modul"]["Controller"]["Parameter"]):
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>TCntrNodeObj cntr( )</i> — возвращает объект контроллера этого параметра, независимо от вложенности.</li>
<li> <i>bool messSet( string mess, int lev, string type2Code = "OP", string cat = "")</i> — устанавливает сообщение источника данных <i>mess</i> с уровнем <i>lev</i>, для параметра.</li>
<li> <i>bool alarmSet( string mess, int lev = -5, bool force = false )</i> — устанавливает/снимает нарушение <i>mess</i> с уровнем <i>lev</i> (отрицательный для установки иначе снятие) для этого параметра. Очистка нарушений, как и установка, работает в режиме переключателя, что предусматривает пропуск сообщений очистки в буфер сообщений, и саму очистку, только при наличии соответствующего нарушения, что может быть отключено установкой <i>force</i>.</li></ul>
<p>Функции объекта атрибута параметра контроллера (SYS.DAQ["Modul"]["Controller"]["Parameter"]["Attribute"]):
</p>
<ul><li> <i>ElTp get( int tm = 0, int utm = 0, bool sys = false )</i> — запрашивает значение атрибута на время <i>tm.utm</i> и признаком системного доступа <i>sys</i>. Атрибуты времени <i>tm.utm</i> являются также выходами, соответственно реальное время полученного значения помещается в них, если это переменные.</li>
<li> <i>bool set( ElTp val, int tm = 0, int utm = 0, bool sys = false )</i> — записывает значение <i>val</i> в атрибут с меткой времени <i>tm:utm</i> и признаком системного доступа <i>sys</i>.</li>
<li> <i>TCntrNodeObj arch( )</i> — получает объект архива, связанный с этим атрибутом. В случае отсутствия связанного архива возвращается "false".</li>
<li> <i>string descr( )</i> — описание атрибута.</li>
<li> <i>int time( int utm )</i> — время последнего значения в секундах и микросекундах в <i>utm</i>, если указан и является переменной.</li>
<li> <i>int len( )</i> — длина поля в БД.</li>
<li> <i>int dec( )</i> — разрешение вещественного числа поля в БД.</li>
<li> <i>int flg( )</i> — флаги поля.</li>
<li> <i>string def( )</i> — значение по умолчанию.</li>
<li> <i>string values( )</i> — список допустимых значений или диапазон.</li>
<li> <i>string selNames( )</i> — список имён допустимых значений.</li>
<li> <i>string reserve( )</i> — резервное свойство значения.</li></ul>
<p>Функции объекта библиотеки шаблона (SYS.DAQ[tmplb_Lib"]) и шаблона (SYS.DAQ[tmplb_Lib"]["Tmpl"]) параметра контроллера:
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.JavaLikeCalc"><span class="mw-headline-number">7.1</span> Модуль <a href="Modules/JavaLikeCalc.html" title="Special:MyLanguage/Modules/JavaLikeCalc">DAQ.JavaLikeCalc</a></span></h3>
<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>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.LogicLev"><span class="mw-headline-number">7.2</span> Модуль <a href="Modules/LogicLev.html" title="Special:MyLanguage/Modules/LogicLev">DAQ.LogicLev</a></span></h3>
<p><b>Объект "Параметр" [this]</b>
</p>
<ul><li> <i>bool attrAdd( string id, string name, string tp = "real", string selValsNms = "" )</i> [<span style="color: red">для включенного параметра логического типа</span>] — добавление атрибута <i>id</i> с именем <i>name</i> и типом <i>tp</i>. Если атрибут уже присутствует то будут применены свойства, которые возможно изменить "на ходу": имя, режим выбора и параметры выбора.
<ul><li> <i>id, name</i> — идентификатор и имя нового атрибута;</li>
<li> <i>tp</i> — тип атрибута [boolean | integer | real | string | text | object] + режим выбора [sel | seled] + только для чтения [ro];</li>
<li> <i>selValsNms</i> — две строки со значениями в первой и их именами во второй, разделённые ";".</li></ul></li>
<li> <i>bool attrDel( string id )</i> [<span style="color: red">для включенного параметра логического типа</span>] — удаление атрибута <i>id</i>.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.BlockCalc"><span class="mw-headline-number">7.3</span> Модуль <a href="Modules/BlockCalc.html" title="Special:MyLanguage/Modules/BlockCalc">DAQ.BlockCalc</a></span></h3>
<div class="floatright"><a class="image" href="http://oscada.org/wiki/File:Oscada_UserOM_BlockCalc_ru.png" title="Объектная модель пользователя модуля BlockCalc."><img alt="Объектная модель пользователя модуля BlockCalc." height="214" src="files/Oscada_UserOM_BlockCalc_ru.png" width="218" /></a></div>
<p><b>Объект "Блок" (SYS.DAQ.BlockCalc["cntr"]["blk_block"])</b>
</p>
<ul><li> <i>ElTp cfg(string nm)</i> — получение значения конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet(string nm, ElTp val)</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — установка конфигурационного поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>TCntrNodeObj cntr()</i> — возвращает объект контроллера этого параметра, независимо от вложенности.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.ModBus"><span class="mw-headline-number">7.4</span> Модуль <a href="Modules/ModBus.html" title="Special:MyLanguage/Modules/ModBus">DAQ.ModBus</a></span></h3>
<div class="floatright"><a class="image" href="http://oscada.org/wiki/File:Oscada_UserOM_ModBus_ru.png" title="Объектная модель пользователя модуля ModBus."><img alt="Объектная модель пользователя модуля ModBus." height="213" src="files/Oscada_UserOM_ModBus_ru.png" width="323" /></a></div>
<p><b>Объект "Контроллер" [this.cntr()]</b>
</p>
<ul><li> <i>string messIO(string pdu)</i> — отправка PDU <i>pdu</i> через транспорт объекта контроллера посредством ModBus протокола. PDU результата запроса помещается вместо запроса в <i>pdu</i>, а ошибка возвращается в результате функции.</li></ul>
<p><b>Объект "Параметр" [this]</b>
</p>
<ul><li> <i>bool attrAdd( string id, string name, string tp = "real", string selValsNms = "" )</i> [<span style="color: red">для включенного параметра логического типа</span>] — добавление атрибута <i>id</i> с именем <i>name</i> и типом <i>tp</i>. Если атрибут уже присутствует то будут применены свойства, которые возможно изменить "на ходу": имя, режим выбора и параметры выбора.
<ul><li> <i>id, name</i> — идентификатор и имя нового атрибута;</li>
<li> <i>tp</i> — тип атрибута [boolean | integer | real | string | text | object] + режим выбора [sel | seled] + только для чтения [ro];</li>
<li> <i>selValsNms</i> — две строки со значениями в первой и их именами во второй, разделённые ";".</li></ul></li>
<li> <i>bool attrDel( string id )</i> [<span style="color: red">для включенного параметра логического типа</span>] — удаление атрибута <i>id</i>.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.Siemens"><span class="mw-headline-number">7.5</span> Модуль <a href="Modules/Siemens.html" title="Special:MyLanguage/Modules/Siemens">DAQ.Siemens</a></span></h3>
<p><b>Объект "Параметр" [this]</b>
</p>
<ul><li> <i>bool attrAdd( string id, string name, string tp = "real", string selValsNms = "" )</i> [<span style="color: red">для включенного параметра логического типа</span>] — добавление атрибута <i>id</i> с именем <i>name</i> и типом <i>tp</i>. Если атрибут уже присутствует то будут применены свойства, которые возможно изменить "на ходу": имя, режим выбора и параметры выбора.
<ul><li> <i>id, name</i> — идентификатор и имя нового атрибута;</li>
<li> <i>tp</i> — тип атрибута [boolean | integer | real | string | text | object] + режим выбора [sel | seled] + только для чтения [ro];</li>
<li> <i>selValsNms</i> — две строки со значениями в первой и их именами во второй, разделённые ";".</li></ul></li>
<li> <i>bool attrDel( string id )</i> [<span style="color: red">для включенного параметра логического типа</span>] — удаление атрибута <i>id</i>.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_DAQ.OPC_UA"><span class="mw-headline-number">7.6</span> Модуль <a href="Modules/OPC_UA.html" title="Special:MyLanguage/Modules/OPC UA">DAQ.OPC_UA</a></span></h3>
<p><b>Объект "Параметр" [this]</b>
</p>
<ul><li> <i>bool attrAdd( string id, string name, string tp = "real", string selValsNms = "" )</i> [<span style="color: red">для включенного параметра логического типа</span>] — добавление атрибута <i>id</i> с именем <i>name</i> и типом <i>tp</i>. Если атрибут уже присутствует то будут применены свойства, которые возможно изменить "на ходу": имя, режим выбора и параметры выбора.
<ul><li> <i>id, name</i> — идентификатор и имя нового атрибута;</li>
<li> <i>tp</i> — тип атрибута [boolean | integer | real | string | text | object] + режим выбора [sel | seled] + только для чтения [ro];</li>
<li> <i>selValsNms</i> — две строки со значениями в первой и их именами во второй, разделённые ";".</li></ul></li>
<li> <i>bool attrDel( string id )</i> [<span style="color: red">для включенного параметра логического типа</span>] — удаление атрибута <i>id</i>.</li></ul>
<p><br />
</p>
<h2><span class="mw-headline" id=".D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.90.D1.80.D1.85.D0.B8.D0.B2.D1.8B-.D0.98.D1.81.D1.82.D0.BE.D1.80.D0.B8.D1.8F.22_.28SYS.Archive.29"><span class="mw-headline-number">8</span> <span id="SYS.Archive" title="#SYS.Archive">Подсистема "Архивы-История" (SYS.Archive)</span></span></h2>
<p>Функции объекта подсистемы:
</p>
<ul><li> <i>Array messGet( int btm, int etm, string cat = "", int lev = 0, string arch = "", int upTm = 0 );</i> — запрашивает сообщения программы или нарушения (lev &lt; 0) за время от <i>btm</i> до <i>etm</i> для категории <i>cat</i>, уровня <i>lev</i> (-7...7) и архиваторов <i>arch</i> (разделены символом ';'; "" — буфер и архиваторы; "&lt;buffer&gt;" — буфер; "{ArhMod}.{Arh}" — конкретный архиватор модуля). <i>upTm</i> устанавливает ограничение продолжительности операции в указанное время; отрицательное значение используется как относительное время; менее чем STD_INTERF_TM (5). Возвращается время останова чтения (атрибут "tm" массива) и массив объектов сообщений/нарушений со свойствами:
<ul><li> <i>tm</i> — время сообщения, секунды;</li>
<li> <i>utm</i> — время сообщения, микросекунды;</li>
<li> <i>categ</i> — категория сообщения;</li>
<li> <i>level</i> — уровень сообщения;</li>
<li> <i>mess</i> — текст сообщения.</li></ul></li>
<li> <i>bool messPut( int tm, int utm, string cat, int lev, string mess, string arch = "" );</i> — записывает сообщение <i>mess</i> с категорией <i>cat</i>, уровнем <i>lev</i> (-7...7) и временем <i>tm.utm</i> в архиваторы <i>arch</i> (разделены символом ';') и/или список нарушений.</li></ul>
<p>Функции объекта архиватора сообщений (SYS.Archive["mod_Modul"]["mess_Archivator"]):
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>bool status( )</i> — статус архиватора "Исполнение".</li>
<li> <i>int end( )</i> — время окончания данных архиватора.</li>
<li> <i>int begin( )</i> — время начала данных архиватора.</li></ul>
<p>Функции объекта архиватора значений (SYS.Archive["val_Modul"]["val_Archivator"]):
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>bool status( )</i> — статус архиватора "Исполнение".</li></ul>
<p><span id="SYS.Archive" title="#SYS.Archive">Функции объекта архива (SYS.Archive["va_Archive"]):</span>
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — получает значение конфигурационного поля <i>nm</i> объекта.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">доступ к соответствующей подсистеме</span>] — устанавливает конфигурационное поля <i>nm</i> объекта в значение <i>val</i>.</li>
<li> <i>bool status( )</i> — статус архиватора "Исполнение".</li>
<li> <i>int end( string arch = "" )</i> — время конца данных архива для архиватора <i>arch</i>, в микросекундах.</li>
<li> <i>int begin( string arch = "" )</i> — время начала данных архива для архиватора <i>arch</i>, в микросекундах.</li>
<li> <i>int period( string arch = "" )</i> — период данных архива для архиватора <i>arch</i>, в микросекундах.</li>
<li> <i>TArrayObj archivatorList( )</i> — список архиваторов, использующих данный архив как источник.</li>
<li> <i>VarType getVal( int tm, bool up_ord = false, string arch = "" )</i> — получает значение из архива на время <i>tm</i>, подтяжкой к верху <i>up_ord</i> и архиватора <i>arch</i>:
<ul><li> <i>tm</i> — время запрашиваемого значения, в микросекундах, установить в 0 для "end()"; этот атрибут также является выходом, соответственно реальное время полученного значения помещается сюда, если это переменная; </li>
<li> <i>up_ord</i> — подтягивать время запрашиваемого значения к верху сетки;</li>
<li> <i>arch</i> — архиватор запроса, установить в пустую строку для проверки всех архиваторов, установить в "&lt;buffer&gt;" для обработки только буфера.</li></ul></li>
<li> <i>bool setVal( int tm, VarType vl, string arch = "" )</i> [<span style="color:red">доступ к подсистеме Архивы-История</span>] — устанавливает значение <i>vl</i> в архив на время <i>tm</i> и архиватор <i>arch</i>:
<ul><li> <i>tm</i> — время устанавливаемого значения, в микросекундах;</li>
<li> <i>vl</i> — значение;</li>
<li> <i>arch</i> — архиватор установки, установить в пустую строку для всех архиваторов, установить в "&lt;buffer&gt;" для обработки только буфера.</li></ul></li>
<li> <i>Array getVals( int begTm, int endTm, int period, string arch = "" )</i> — получает архив/историю значений от <i>begTm</i> и по <i>endTm</i> для архиватора <i>arch</i>:
<ul><li> <i>begTm</i> — время начала запрошенного диапазона данных, в микросекундах, будет изменено в реальное начало данных;</li>
<li> <i>endTm</i> — время окончания запрошенного диапазона данных, в микросекундах;</li>
<li> <i>period</i> — период данных, в микросекундах, должно быть обязательно определено и будет использовано максимальное значение для этого архива, будет изменено в периодичность реальных данных;</li>
<li> <i>arch</i> — архиватор запроса, установить в пустую строку для проверки всех архиваторов, установить в "&lt;buffer&gt;" для обработки только буфера.</li></ul></li>
<li> <i>bool setVals( Array buf, int tm, int period, string arch = "" )</i> [<span style="color:red">доступ к подсистеме Архивы-История</span>] — устанавливает значение архиву/истории <i>buf</i> в архив от времени начала <i>tm</i>, для периода значений <i>period</i> и архиватора <i>arch</i>.
<ul><li> <i>buf</i> — массив значений к установке;</li>
<li> <i>tm</i> — время начала устанавливаемого диапазона данных, в микросекундах;</li>
<li> <i>period</i> — период устанавливаемых данных, в микросекундах, должно быть обязательно определено и будет использовано максимальное значение для этого архива, будет изменено в периодичность реальных данных;</li>
<li> <i>arch</i> — архиватор запроса, установить в пустую строку для проверки всех архиваторов, установить в "&lt;buffer&gt;" для обработки только буфера.</li></ul></li></ul>
<h2><span class="mw-headline" id="Subsystem_.22Transports.22_.28SYS.Transport.29"><span class="mw-headline-number">9</span> <span id="SYSTransport" title="#SYSTransport">Subsystem "Transports" (SYS.Transport)</span></span></h2>
<p>Functions of the subsystem object:
</p>
<ul><li> <i>TCntrNodeObj outAt( string addr );</i> — common-unified output transport connection at the address <i>addr</i> in the forms:</li></ul>
<dl><dd><dl><dd> "<b>{TrModule}.[out_]{TrID}[:{TrAddr}]</b>" — typical output with automatic creation <i>TrID</i> at it missing and allowing <i>TrAddr</i>;</dd>
<dd> "<b>{TrModule}.in_{TrID}:{RemConId}</b>" — initiative input with the connection identifier in <i>RemConId</i>.</dd></dl>
<ul><li> <i>TrModule</i> — transport module, as is <a href="Modules/Sockets.html" title="Special:MyLanguage/Modules/Sockets">Sockets</a>, <a href="../en/Modules/SSL.html" title="Special:MyLanguage/Modules/SSL">SSL</a>, <a href="Modules/Serial.html" title="Special:MyLanguage/Modules/Serial">Serial</a>;</li>
<li> <i>TrID</i> — transport identifier;</li>
<li> <i>TrAddr</i> — transport specific address;</li>
<li> <i>RemConId</i> — remote initiative connection ID.</li></ul></dd></dl>
<p>Functions of the input transport object (SYS.Transport["Modul"]["in_Transp"]):
</p>
<ul><li> <i>ElTp cfg( string nm )</i> — gets the value of the configuration field <i>nm</i> of the object.</li>
<li> <i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">access to the appropriate subsystem</span>] — sets the configuration field <i>nm</i> of the object to the value <i>val</i>.</li>
<li> <i>string status()</i> — string status of the transport.</li>
<li> <i>string addr( string vl = "" )</i> — address of the transport, sets the non-empty value <i>vl</i>.</li>
<li> <i>string writeTo(string sender, string mess)</i> — sends the message <i>mess</i> to the sender <i>sender</i>, as a reply.</li>
<li> <i>TArrayObj associateTrsList()</i> — associated output transports list to that input one.</li>
<li> <i>TCntrNodeObj associateTr( string id )</i> — getting the associated transport at that connection <i>id</i>.</li>
<li> <i>ElTp conPrm( string id, ElTp val = EVAL, string cfg = "" )</i> — common handling the connection time parameter <i>id</i> with setting to the value <i>val</i> at presence; request for configuration parameter of the connection time with registration at the first time from the configuration <i>cfg</i> in the form "{SRC}\n{NAME}\n{HELP}".</li>
<li> <i>bool setConPrm( string id, ElTp val )</i> — setting the connection time parameter <i>id</i> to the value <i>val</i>, only for compatibility.</li></ul>
<p>Functions of the output transport object (SYS.Transport["Modul"]["out_Transp"]):
</p>
<ul>
<li><i>bool isNetwork( )</i> — the sign — "The transport is network one", what is specified by the timeouts in seconds.</li>
<li><i>ElTp cfg( string nm )</i> — gets the value of the configuration field <i>nm</i> of the object.</li>
<li><i>bool cfgSet( string nm, ElTp val )</i> [<span style="color:red">access to the appropriate subsystem</span>] — sets the configuration field <i>nm</i> of the object to the value <i>val</i>.</li>
<li><i>string status()</i> — string status of the transport.</li>
<li><i>bool start( bool vl = EVAL, int tm = 0 )</i> — returns the transport status "Running", starts/stops it by <i>vl</i> (if it is not EVAL). For starting you can set the specific timeout <i>tm</i>.</li>
<li><i>string addr( string vl = "" )</i> — address of the transport, sets the non-empty value <i>vl</i>.</li>
<li><i>string timings( string vl = "", isDef = true )</i> — timings of the transport, sets the non-empty value <i>vl</i> and as default one for <i>isDef</i>.</li>
<li><i>int attempts( int vl = EVAL )</i> — attempts of the transport connection, sets the non-EVAL value <i>vl</i>.</li>
<li><i>ElTp conPrm( string id, ElTp val = EVAL, string cfg = "" )</i> — common handling the connection time parameter <i>id</i> with setting to the value <i>val</i> at presence; request for configuration parameter of the connection time with registration at the first time from the configuration <i>cfg</i> in the form "{SRC}\n{NAME}\n{HELP}".</li>
<li><i>bool setConPrm( string id, ElTp val )</i> — setting the connection time parameter <i>id</i> to the value <i>val</i>, only for compatibility.</li>
<li><i>string messIO( string mess, real timeOut = 0, int inBufLen = -1 );</i> — sends the message <i>mess</i> via the transport with the waiting time of the response <i>timeOut</i> (in seconds) and reads an response (Buffer) in <i>inBufLen</i> byte. In the case of a zero timeout, this time is taken from the settings of the output transport. The <i>timeOut</i> in negative (&lt; -1e-3) disables the transport request/respond mode and allows for independent reading/writing to a buffer IO, with the reading timeout <i>timeOut</i> in absolute. For negative <i>inBufLen</i> the buffer size sets to STR_BUF_LEN(10000) and "0" disables the reading at all.<br />
<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> If your transport means getting data in parts for a request then for several devices on single bus-transport, use the function into single thread but there is not a way to lock the transport into the user API. Single thread that is any object of controller of DAQ and <a href="Modules/UserProtocol.html" title="Special:MyLanguage/Modules/UserProtocol">the module "User protocol"</a> locks the transport internally before self user procedures execution.
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">rez</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">Serial</span><span class="p">.</span><span class="nx">out_ttyUSB0</span><span class="p">.</span><span class="nx">messIO</span><span class="p">(</span><span class="nx">SYS</span><span class="p">.</span><span class="nx">strFromCharCode</span><span class="p">(</span><span class="mh">0x4B</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x37</span><span class="p">,</span><span class="mh">0x40</span><span class="p">),</span><span class="mf">0.2</span><span class="p">);</span>
<span class="c1">//Wait for all the message tail by timeout and empty result</span>
<span class="k">while</span><span class="p">(</span><span class="nx">rez</span><span class="p">.</span><span class="nx">length</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="nx">trez</span><span class="o">=</span><span class="nx">SYS</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">Serial</span><span class="p">.</span><span class="nx">out_ttyUSB0</span><span class="p">.</span><span class="nx">messIO</span><span class="p">(</span><span class="s2">""</span><span class="p">)).</span><span class="nx">length</span><span class="p">)</span> <span class="nx">rez</span> <span class="o">+=</span> <span class="nx">trez</span><span class="p">;</span>
</pre></div></li>
<li><i>string messIO( XMLNodeObj req, string prt );</i> — sends the request <i>req</i> to the protocol <i>prt</i> to perform a communication session through the transport and in assistance of the protocol. Returns a string with error in the format "<b>{errCod}:{errText}</b>" which empty for successful request.
<div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">req</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">XMLNode</span><span class="p">(</span><span class="s2">"TCP"</span><span class="p">);</span>
<span class="nx">req</span><span class="p">.</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"id"</span><span class="p">,</span><span class="s2">"test"</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"reqTm"</span><span class="p">,</span><span class="mi">500</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"node"</span><span class="p">,</span><span class="mi">1</span><span class="p">).</span><span class="nx">setAttr</span><span class="p">(</span><span class="s2">"reqTry"</span><span class="p">,</span><span class="mi">2</span><span class="p">).</span><span class="nx">setText</span><span class="p">(</span><span class="nx">SYS</span><span class="p">.</span><span class="nx">strFromCharCode</span><span class="p">(</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x05</span><span class="p">));</span>
<span class="nx">SYS</span><span class="p">.</span><span class="nx">Transport</span><span class="p">.</span><span class="nx">Sockets</span><span class="p">.</span><span class="nx">out_testModBus</span><span class="p">.</span><span class="nx">messIO</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="s2">"ModBus"</span><span class="p">);</span>
<span class="nx">test</span> <span class="o">=</span> <span class="nx">Special</span><span class="p">.</span><span class="nx">FLibSYS</span><span class="p">.</span><span class="nx">strDec4Bin</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">text</span><span class="p">());</span>
</pre></div></li>
</ul>
<h2><span class="mw-headline" id=".D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.9F.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.8B.22_.28SYS.Protocols.29"><span class="mw-headline-number">10</span> Подсистема "Протоколы" (SYS.Protocols)</span></h2>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_Protocol.HTTP"><span class="mw-headline-number">10.1</span> Модуль <a href="Modules/HTTP.html" title="Special:MyLanguage/Modules/HTTP">Protocol.HTTP</a></span></h3>
<p><b>Входная часть объекта модуля (SYS.Protocol.HTTP.{In})</b>
</p>
<ul><li> <i>bool setUser( string user )</i> — меняет пользователя связанного с идентификатором сеанса аутентификации.
<ul><li> <i>user</i> — пользователя для смены.</li></ul></li>
<li> <i>bool pgAccess(string URL)</i> — проверяет доступность страницы, определённой в <i>URL</i>.
<ul><li> <i>URL</i> — URL страницы, которая проверяется.</li></ul></li>
<li> <i>string pgCreator(string cnt, string rcode = "", string httpattrs = "Content-Type: text/html;charset={SYS}", string htmlHeadEls = "", string forceTmplFile = "")</i> — формирует страницу или ресурс из содержимого <i>cnt</i>, обёрнутого в HTTP с результатом <i>rcode</i>, с дополнительными атрибутами HTTP <i>httpattrs</i>, дополнительным элементом заголовка HTML <i>htmlHeadEls</i> и использованием файла шаблона <i>forceTmplFile</i>.
<ul><li> <i>cnt</i> — содержимое страницы или ресурса (изображения, XML, CSS, JavaScript, ...);</li>
<li> <i>rcode</i> — результирующий код HTTP, вроде "200 OK"; пустое значение выключает добавление HTTP заголовка;</li>
<li> <i>httpattrs</i> — дополнительные атрибуты HTTP, в основном это "Content-Type" со значением по умолчанию "text/html;charset={SYS}"; только для "Content-Type: text/html" будет осуществляться заворачивание во внутренний/сервисный, или определённый <i>forceTmplFile</i>, HTML-шаблон;</li>
<li> <i>htmlHeadEls</i> — дополнительный тег заголовка HTML, в основном это META с "Refresh" для указанного URL;</li>
<li> <i>forceTmplFile</i> — файл прямо определённого шаблона для перекрытия внутреннего/сервисного или главной страницы.</li></ul></li></ul>
<p><br />
</p>
<h2><span class="mw-headline" id="Subsystem_.22User_interfaces.22_.28SYS.UI.29"><span class="mw-headline-number">11</span> <span id="SYSUI" title="#SYSUI">Subsystem "User interfaces" (SYS.UI)</span></span></h2>
<p>Functions of the subsystem object:
</p>
<ul><li> <i>string mimeGet(string fnm);</i> — obtaining the MIME type at the file name <i>fnm</i>.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_QTStarter"><span class="mw-headline-number">11.1</span> Модуль <a href="Modules/QTStarter.html" title="Special:MyLanguage/Modules/QTStarter">QTStarter</a></span></h3>
<p><b>Объект модуля (SYS.UI.QTStarter)</b>
</p>
<ul><li> <i>Array sensors()</i> — получить все доступные сенсоры от Qt mobility, возвращает "false" если не доступно ни одного сенсора.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_UI.VCAEngine"><span class="mw-headline-number">11.2</span> Модуль <a href="Modules/VCAEngine.html" title="Special:MyLanguage/Modules/VCAEngine">UI.VCAEngine</a></span></h3>
<div class="floatright"><a class="image" href="http://oscada.org/wiki/File:Oscada_UserOM_VCAEngine.png" title="User object model of the module VCAEngine."><img alt="User object model of the module VCAEngine." height="238" src="../en/files/Oscada_UserOM_VCAEngine.png" width="352" /></a></div>
<p><b>Object "Session" ( this.ownerSess() )</b>
</p>
<ul><li> <i>string user( )</i> — current session user.</li>
<li> <i>int alrmQuietance( int quit_tmpl, string wpath = "", bool ret = false )</i> — quiets of the violations <i>wpath</i> with the template <i>quit_tmpl</i>. If <i>wpath</i> is empty string then the global quietance makes. In the string <i>wpath</i>, by symbol ';', can be enumerated addresses of several widgets. When set the <i>ret</i>, the quietance return is performed.</li>
<li> <i>int reqTm( )</i> — last request time in seconds from the epoch of 1/1/1970.</li>
<li> <i>string reqUser( )</i> — last request user.</li>
<li> <i>string reqLang( )</i> — last request language.</li>
<li> <i>int userActTm( )</i> — last user action time in seconds from the epoch of 1/1/1970.</li>
<li> <i>bool uiCmd( string cmd, string prm, string src )</i> — sends a UI command of the pages managing, that is: "open", "next", "prev"; for more details see in <a href="#Events">the events section</a>. This function must be in the priority of using to the pages managing before the direct writing to the page attributes "pgOpen" and "pgOpenSrc" due it is single method of the correct work with <a href="#Project">the linked pages</a>.</li>
<li> <i>int period( bool isReal = false )</i> — getting the session processing period, <i>isReal</i> for the real one.</li></ul>
<p><b>Object "Widget" (this)</b>
</p>
<ul><li> <i>TCntrNodeObj ownerSess( )</i> — session object for the current widget.</li>
<li> <i>TCntrNodeObj ownerPage( )</i> — parent page object for the current widget.</li>
<li> <i>TCntrNodeObj ownerWdg( bool base = false )</i> — parent widget object for the current widget. If set <i>base</i> then returns the parent page objects also.</li>
<li> <i>TCntrNodeObj wdgAdd( string wid, string wname, string parent )</i> — adds the new widget <i>wid</i> with the name <i>wname</i> and based on the library widget <i>parent</i>.</li></ul>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 15px"><pre><span class="c1">//Adds the new widget, based at the text primitive</span>
<span class="nx">nw</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">wdgAdd</span><span class="p">(</span><span class="s2">"nw"</span><span class="p">,</span> <span class="s2">"New widget"</span><span class="p">,</span> <span class="s2">"/wlb_originals/wdg_Text"</span><span class="p">);</span>
<span class="nx">nw</span><span class="p">.</span><span class="nx">attrSet</span><span class="p">(</span><span class="s2">"geomX"</span><span class="p">,</span> <span class="mi">50</span><span class="p">).</span><span class="nx">attrSet</span><span class="p">(</span><span class="s2">"geomY"</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
</pre></div>
<ul><li> <i>bool wdgDel( string wid )</i> — deletes the widget <i>wid</i>.</li>
<li> <i>TCntrNodeObj wdgAt( string wid, bool byPath = false )</i> — attaches to child or global widget, by the path <i>byPath</i>. For missing and invalid widgets the function will return "false" when a correct widget in it conversion to BOOLEAN will return "true". In the case of global connection, you can use absolute or relative path to the widget. For starting point of the absolute address acts the root object of the module "VCAEngine", which means the first element of the absolute address is session identifier, which is ignored. The relative address takes the countdown from the current widget. Special element of the relative address is an element of parent node "..".</li>
<li> <i>Array attrList()</i> — list of the widget attributes.</li>
<li> <i>bool attrPresent( string attr )</i> — checks to presence fact of the attribute <i>attr</i> of the widget.</li>
<li> <i>ElTp attr( string attr, bool fromSess = false )</i> — value of the attribute <i>attr</i> of the widget or from the session <i>fromSess</i>. For missing attributes will be return empty string.</li>
<li> <i>TCntrNodeObj attrSet( string attr, ElTp vl, bool toSess = false )</i> — sets the value <i>vl</i> to the attribute <i>attr</i> of the widget or to the session, by <i>toSess</i>. The object is returned for the function concatenation.</li>
<li> <i>string link( string attr, bool prm = false )</i> — link for the widget attribute <i>attr</i>. At set <i>prm</i> requests the link for the attributes block (parameter), represented by the attribute. </li>
<li> <i>string linkSet( string attr, string vl, bool prm = false )</i> — sets the link for the widget attribute <i>attr</i>. At set <i>prm</i>, sets the link for the attributes block (parameter), represented by the attribute.</li></ul>
<div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 15px"><pre><span class="c1">//Sets the link to the parameter for the eight trend</span>
<span class="k">this</span><span class="p">.</span><span class="nx">linkSet</span><span class="p">(</span><span class="s2">"el8.name"</span><span class="p">,</span> <span class="s2">"prm:/LogicLev/experiment/Pi"</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</pre></div>
<ul><li> <i>string {resource,mime}( string addr, string MIME = "" )</i> — resource object by the address <i>addr</i> (the direct link to the resource or the widget attribute contained the link) with the <i>MIME</i>, from the session table or the source. It is designed for the resource objects edition and that substitution to this session's context, for example, images SVG.</li>
<li> <i>int {resourceSet,mimeSet}( string addr, string data, string MIME = "" )</i> — sets the resource object to <i>data</i> with <i>MIME</i> by the address <i>addr</i>.</li>
<li> <i>int messDebug( string mess ); int messInfo( string mess ); int messNote( string mess ); int messWarning( string mess ); int messErr( string mess ); int messCrit( string mess ); int messAlert( string mess ); int messEmerg( string mess );</i> — formats of the program message <i>mess</i> with the category — the widget path.</li>
<li> <i>int calcPer( int set = EVAL )</i> — the actual calculation-processing period getting and setting at <i>set</i> not EVAL. There reserved the special values:
<ul><li> <b>0</b> — if you want the session period processing;</li>
<li> <b>-1</b> — if you want to use the parent widget/page/project processing period in the cascade;</li>
<li> <b>-2</b> — for disable the periodic processing in whole;</li>
<li> <b>-3</b> — no session time period, getting the projecting one.</li></ul></li></ul>
<p><b>Объект "Виджет", примитива "Документ" (this)</b>
</p>
<ul><li> <i>string getArhDoc( int nDoc)</i> — текст документа архива на глубине <i>nDoc</i> (0-{aSize-1}).</li></ul>
<p><br />
</p>
<h2><span class="mw-headline" id=".D0.9F.D0.BE.D0.B4.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.B0_.22.D0.A1.D0.BF.D0.B5.D1.86.D0.B8.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5.22_.28SYS.Special.29"><span class="mw-headline-number">12</span> Подсистема "Специальные" (SYS.Special)</span></h2>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_.D1.81.D0.B8.D1.81.D1.82.D0.B5.D0.BC.D0.BD.D0.BE.D0.B3.D0.BE_API_.D1.81.D1.80.D0.B5.D0.B4.D1.8B_.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_.28Special.FLibSYS.29"><span class="mw-headline-number">12.1</span> Модуль <a href="Modules/FLibSYS.html" title="Special:MyLanguage/Modules/FLibSYS">Библиотека системного API среды пользовательского программирования (Special.FLibSYS)</a></span></h3>
<p><b>Объект "Библиотека функций" (SYS.Special.FLibSYS)</b>
</p>
<ul><li> <i>ElTp {funcID}(ElTp prm1, ...)</i> — вызов функции библиотеки <i>{funcID}</i>. Возвращает результат вызываемой функции.</li></ul>
<p><b>Объект "Пользовательская функция" (SYS.Special.FLibSYS["funcID"])</b>
</p>
<ul><li> <i>ElTp call(ElTp prm1, ...)</i> — вызов данной функции с параметрами <i>&lt;prm{N}&gt;</i>. Возвращает результат вызываемой функции.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_.D1.81.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D1.8B.D1.85_.D0.BC.D0.B0.D1.82.D0.B5.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9_.28Special.FLibMath.29"><span class="mw-headline-number">12.2</span> Модуль <a href="Modules/FLibMath.html" title="Special:MyLanguage/Modules/FLibMath">Библиотека стандартных математических функций (Special.FLibMath)</a></span></h3>
<p><b>Объект "Библиотека функций" (SYS.Special.FLibMath)</b>
</p>
<ul><li> <i>ElTp {funcID}(ElTp prm1, ...)</i> — вызов функции библиотеки <i>{funcID}</i>. Возвращает результат вызываемой функции.</li></ul>
<p><b>Объект "Пользовательская функция" (SYS.Special.FLibMath["funcID"])</b>
</p>
<ul><li> <i>ElTp call(ElTp prm1, ...)</i> — вызов данной функции с параметрами <i>&lt;prm{N}&gt;</i>. Возвращает результат вызываемой функции.</li></ul>
<h3><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9_.D1.81.D0.BE.D0.B2.D0.BC.D0.B5.D1.81.D1.82.D0.B8.D0.BC.D0.BE.D1.81.D1.82.D0.B8_.D1.81.D0.BE_SCADA_Complex1_.D1.84.D0.B8.D1.80.D0.BC.D1.8B_.D0.9E.D0.9E.D0.9E_.D0.9D.D0.98.D0.9F_.22DIYA.22_.28Special.FLibComplex1.29"><span class="mw-headline-number">12.3</span> Модуль <a href="Modules/FLibComplex1.html" title="Special:MyLanguage/Modules/FLibComplex1">Библиотека функций совместимости со SCADA Complex1 фирмы ООО НИП "DIYA" (Special.FLibComplex1)</a></span></h3>
<p><b>Объект "Библиотека функций" (SYS.Special.FLibComplex1)</b>
</p>
<ul><li> <i>ElTp {funcID}(ElTp prm1, ...)</i> — вызов функции библиотеки <i>{funcID}</i>. Возвращает результат вызываемой функции.</li></ul>
<p><b>Объект "Пользовательская функция" (SYS.Special.FLibComplex1["funcID"])</b>
</p>
<ul><li> <i>ElTp call(ElTp prm1, ...)</i> — вызов данной функции с параметрами <i>&lt;prm{N}&gt;</i>. Возвращает результат вызываемой функции.</li></ul>
<p><br />
</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.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8F"><span class="mw-headline-number">13</span> Библиотеки функций пользователя</span></h2>
<p>На данное время OpenSCADA имеет библиотеки функций пользователя, написанные с использованием этого API пользователя. Некоторые из них разработаны для использования исключительно из этого API. Все библиотеки пользователя представлены в следующей таблице:
</p>
<table class="wikitable">

<tr>
<th> Наименование </th>
<th> Версия </th>
<th> Лицензия </th>
<th> Источник </th>
<th> Языки
</th></tr>
<tr>
<td colspan="5"> <i>Библиотеки источников данных, служб и обработки</i>
</td></tr>

<tr>
<td> <a href="Libs_Main.html" title="Special:MyLanguage/Libs/Main">Основная библиотека</a>
</td>
<td> 2.3 </td>
<td> GPLv2 </td>
<td> OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.tmplb_base </td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_Devices.html" title="Special:MyLanguage/Libs/Devices">Библиотека промышленных устройств</a>
</td>
<td> 3.1 </td>
<td> GPLv2 </td>
<td> OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.tmplb_DevLib
</td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_LowLevelDevices.html" title="Special:MyLanguage/Libs/LowLevelDevices">Библиотека низкоуровневых сенсоров и чипов</a>
</td>
<td> 1.6 </td>
<td> GPLv2 </td>
<td> OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.tmplb_LowDevLib </td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_Service_procedures.html" title="Special:MyLanguage/Libs/Service procedures">Библиотека сервисных процедур</a>
</td>
<td> 1.2 </td>
<td> GPLv2 </td>
<td> OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.JavaLikeCalc.servProc </td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_Regulation_elements.html" title="Special:MyLanguage/Libs/Regulation elements">Библиотека элементов регулирования</a>
</td>
<td> 1.0 </td>
<td> GPLv2 </td>
<td> OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.JavaLikeCalc.regEl </td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_Technological_apparatuses.html" title="Special:MyLanguage/Libs/Technological apparatuses">Библиотека моделей аппаратов технологических процессов</a>
</td>
<td> 2.0 </td>
<td> GPLv2
</td>
<td> OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.JavaLikeCalc.techApp
</td>
<td> en, uk, ru
</td></tr>
<tr>
<td colspan="5"> <i>Библиотеки графических элементов OpenSCADA модуля <a href="Modules/VCAEngine.html" title="Special:MyLanguage/Modules/VCAEngine">UI.VCAEngine</a></i>
</td></tr>

<tr>
<td> <a href="Libs_Main_graphical_elements.html" title="Special:MyLanguage/Libs/Main graphical elements">Библиотека основных элементов интерфейса пользователя</a>
</td>
<td> 2.2 </td>
<td> GPLv2
</td>
<td> vcaBase.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/vcaBase.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:VcaBase.db.gz" title="File:VcaBase.db.gz">GZip</a>) &gt; VCA.wlb_Main
</td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_Mnemo_elements.html" title="Special:MyLanguage/Libs/Mnemo elements">Библиотека элементов мнемосхем интерфейса пользователя</a>
</td>
<td> 1.0 </td>
<td> GPLv2
</td>
<td> vcaBase.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/vcaBase.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:VcaBase.db.gz" title="File:VcaBase.db.gz">GZip</a>) &gt; VCA.wlb_mnEls
</td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_Electrical_elements.html" title="Special:MyLanguage/Libs/Electrical elements">Библиотека электрических элементов пользовательского интерфейса</a>
</td>
<td> 2.0 </td>
<td> GPLv2 </td>
<td> vcaElectroEls.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/vcaElectroEls.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:VcaElectroEls.db.gz" title="File:VcaElectroEls.db.gz">GZip</a>) &gt; VCA.wlb_ElectroEls </td>
<td> en, uk, ru
</td></tr>
<tr>
<td colspan="5"> <i>Комбинированные библиотеки</i>
</td></tr>

<tr>
<td> <a href="Libs_Documents.html" title="Special:MyLanguage/Libs/Documents">Библиотека отчётов и документов</a>
</td>
<td> 2.0, 2.1 </td>
<td> GPLv2 </td>
<td>
<p>OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.JavaLikeCalc.doc<br />
vcaBase.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/vcaBase.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:VcaBase.db.gz" title="File:VcaBase.db.gz">GZip</a>) &gt; VCA.wlb_doc
</p>
</td>
<td> en, uk, ru
</td></tr>

<tr>
<td> <a href="Libs_Prescriptions.html" title="Special:MyLanguage/Libs/Prescriptions">Рецепты</a>
</td>
<td> 1.1, 1.1 </td>
<td> GPLv2 </td>
<td>
<p>OscadaLibs.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/OscadaLibs.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:OscadaLibs.db.gz" title="File:OscadaLibs.db.gz">GZip</a>) &gt; DAQ.tmplb_PrescrTempl<br />
vcaBase.db (<a class="external text" href="http://oscada.org/svn/trunk/OpenSCADA/data/LibsDB/vcaBase.sql" rel="nofollow noreferrer noopener" target="_blank">SQL</a>, <a class="external" href="http://oscada.org/wiki/File:VcaBase.db.gz" title="File:VcaBase.db.gz">GZip</a>) &gt; VCA.wlb_prescr
</p>
</td>
<td> en, uk, ru
</td></tr></table>
<p><br />
</p>
<h2><span class="mw-headline" id=".D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8"><span class="mw-headline-number">14</span> Ссылки</span></h2>
<ul><li> <a class="external" href="http://oscada.org/wiki/File:Oscada_UserOM_uk.odg" title="File:Oscada UserOM uk.odg">Диаграмма: Пользовательская объектная модель ядра OpenSCADA.</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/Documents/User_API/ru">Documents/User_API/ru</a> - <a href="http://oscada.org/en/main/about-the-project/licenses/">GFDL</a></td><td style="text-align: center;">March 2025</td><td style="text-align: right;" width="40%">OpenSCADA 1+r3012</td></tr></table></body>
</html>