<?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>ДокументаціÑ/Як/Створити модуль - OpenSCADAWiki</title> <meta content="MediaWiki 1.26.4" name="generator" /> <link href="https://www.gnu.org/copyleft/fdl.html" rel="copyright" /> <link href="../en/files/doc.css" rel="stylesheet" /></head> <body><div class="floatright"><a href="index.html"><img alt="OpenSCADA" src="../en/files/index.png" /></a></div><div id="mw_header"> <div class="mw-indicators"> </div> <h1 id="firstHeading" lang="uk">ДокументаціÑ/Як/Створити модуль</h1> </div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="uk"><div class="mw-pt-translate-header noprint" dir="ltr" lang="en">This page is a <span class="plainlinks"><a class="external text" href="http://oscada.org/wiki/index.php?title=Special:Translate&group=page-Documents%2FHow+to%2FCreate+module&action=page&filter=&language=uk" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Documents/How_to/Create_module" title="Documents/How to/Create module">Documents/How to/Create module</a> and the translation is 100% complete.</div><hr /><div class="mw-pt-languages" dir="ltr" lang="en"><div class="mw-pt-languages-list autonym"><a class="mw-pt-languages-ui mw-pt-progress mw-pt-progress--complete" href="../en/How_to_Create_module.html" title="Documents/How to/Create module (100% translated)">English</a> • ‎<a class="mw-pt-progress mw-pt-progress--stub" href="../ru/How_to_Create_module.html" title="ДокументациÑ/Как/Создать модуль (8% translated)">mRussian</a> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">УкраїнÑька</span></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>СпонÑоруваннÑ, повної ревізії на 1.8 <span title="людино-днів, 1ЛД — 10 годин">ЛД<sup style="color: blue">[!]</sup></span>:</b> SINGE SOFTWARE</li> <li> <b>Початково Ñтворено:</b> у <a class="external text" href="http://wiki.oscada.org/HomePageUk/Doc/ModuleBuild" rel="nofollow noreferrer noopener" target="_blank">Ñтарій Wiki</a> </li></ul> </div> <p>Цей поÑібник покликано допомогти у Ñтворені модулів Ð´Ð»Ñ OpenSCADA. Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¼Ð¾Ð¶Ðµ знадобитиÑÑ Ñƒ випадку Ð±Ð°Ð¶Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ підтримку нового джерела даних або іншого Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾ OpenSCADA. ОÑкільки OpenSCADA Ñ” гранично модульною то вÑÑ– інтерфейÑи взаємодії із зовнішнім Ñередовищем здійÑнюєтьÑÑ Ð·Ð° поÑередництвом Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñми типів: </p> <ul><li> бази даних;</li> <li> комунікаційні інтерфейÑи, транÑпорти;</li> <li> протоколи комунікаційних інтерфейÑів;</li> <li> джерела даних та збір даних;</li> <li> архіви-Ñ–ÑÑ‚Ð¾Ñ€Ñ–Ñ (повідомлень та значень);</li> <li> інтерфейÑи кориÑтувача (GUI, TUI, WebGUI, speach, signal ...);</li> <li> додаткові модулі, Ñпеціальні.</li></ul> <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> Ð”Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ–Ð² до OpenSCADA необхідні Ð·Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° мові C/C++, Ñкладальної ÑиÑтеми <a class="external text" href="http://en.wikipedia.org/wiki/GNU_build_system" rel="nofollow noreferrer noopener" target="_blank">AutoTools</a>, а також базові Ð·Ð½Ð°Ð½Ð½Ñ ÐžÐ¡ Linux та викориÑтовуваного диÑтрибутиву Linux. </p><p>Ð”Ð»Ñ Ð¿Ð¾Ð´Ð°Ð»ÑŒÑˆÐ¾Ð³Ð¾ Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ð¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð¾ <a class="external text" href="http://oscada.org/websvn/listing.php?repname=OpenSCADA" rel="nofollow noreferrer noopener" target="_blank">репозиторію дерева вихідних текÑтів OpenSCADA</a> ви маєте виконати наÑтупне та дотримуватиÑÑ Ð½Ð°Ñтупних вимог: </p> <ul><li> бути правовлаÑником або автором коду цього Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ‚Ð° розповÑюджувати його за вільною ліцензією, віддаючи перевагу GPL;</li> <li> приготувати та зберігати код Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñк архів окремої теки Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð±ÑƒÐ´ÑŒ Ñкої з підÑиÑтем OpenSCADA із вимогам до вміÑту: <ul><li> вихідні текÑти Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð½Ð° початку кожного файлу мають включати коректну інформацію прав копіюваннÑ, бути напиÑаними та відформатованими згідно до ÑкоїÑÑŒ ÑиÑтеми де перевагу треба надавати <a href="API.html#CodeDesign" title="Special:MyLanguage/Documents/API">Ñтилю форматуванню оÑновних модулів OpenSCADA</a>;</li> <li> файли локалізації модулів також мають бути коректними, актуальними та відповідно відформатованими.</li></ul></li> <li> напиÑати коротку інформаційну Ñторінку Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ—Ñ— на <a class="external" href="http://oscada.org/wiki/Special:MyLanguage/Modules" title="Special:MyLanguage/Modules">OpenSCADA Wiki</a> таким-же чином, Ñк Ñ– інші модулів порÑд;</li> <li> Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð½Ð°Ð¿Ð¸Ñати прÑмий запит у темі форуму "<a class="external text" href="http://oscada.org/ua/forum/topics/rozrobka_openscada/" rel="nofollow noreferrer noopener" target="_blank">Розробка OpenSCADA</a>", включаючи доказ працездатноÑÑ‚Ñ– від розробника OpenSCADA або коротке демонÑтраційним відео.</li></ul> <div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div> <ul> <li class="toclevel-1 tocsection-1"><a href="#.D0.A1.D1.82.D0.B2.D0.BE.D1.80.D0.B5.D0.BD.D0.BD.D1.8F_.D0.9D.D0.BE.D0.B2.D0.BE.D0.B3.D0.BE_.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="tocnumber">1</span> <span class="toctext">Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ðового МодулÑ</span></a> <ul> <li class="toclevel-2 tocsection-2"><a href="#.D0.A1.D1.82.D0.B2.D0.BE.D1.80.D0.B5.D0.BD.D0.BD.D1.8F_.D1.83_.D0.B4.D0.B5.D1.80.D0.B5.D0.B2.D1.96_.D0.B2.D0.B8.D1.85.D1.96.D0.B4.D0.BD.D0.B8.D1.85_.D1.82.D0.B5.D0.BA.D1.81.D1.82.D1.96.D0.B2_.D0.BF.D1.80.D0.BE.D1.94.D0.BA.D1.82.D1.83_OpenSCADA"><span class="tocnumber">1.1</span> <span class="toctext">Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñƒ дереві вихідних текÑтів проєкту OpenSCADA</span></a></li> <li class="toclevel-2 tocsection-3"><a href="#.D0.A1.D1.82.D0.B2.D0.BE.D1.80.D0.B5.D0.BD.D0.BD.D1.8F_.D0.B7.D0.BE.D0.B2.D0.BD.D1.96.D1.88.D0.BD.D1.8C.D0.BE.D0.B3.D0.BE_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F_.D0.B4.D0.BE_OpenSCADA"><span class="tocnumber">1.2</span> <span class="toctext">Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð¾ OpenSCADA</span></a></li> </ul> </li> <li class="toclevel-1 tocsection-4"><a href="#API_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="tocnumber">2</span> <span class="toctext">API модулÑ</span></a></li> </ul> </div> <h2><span class="mw-headline" id=".D0.A1.D1.82.D0.B2.D0.BE.D1.80.D0.B5.D0.BD.D0.BD.D1.8F_.D0.9D.D0.BE.D0.B2.D0.BE.D0.B3.D0.BE_.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="mw-headline-number">1</span> Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ðового МодулÑ</span></h2> <p>Модулі в OpenSCADA предÑтавлÑÑŽÑ‚ÑŒ із Ñебе поділювані бібліотеки, Ñкі підключаютьÑÑ Ð´Ð¾ Ñдра OpenSCADA динамічно при запуÑку або під Ñ‡Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸. Багато модулів у процеÑÑ– Ñ„ÑƒÐ½ÐºÑ†Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ бути відключені, підключені та оновлені із <a href="Program_manual.html#CfgModSched" title="Special:MyLanguage/Documents/Program manual">менеджера модулів</a>. Модулі також можуть бути вбудовані-включені до Ñдра OpenSCADA під Ñ‡Ð°Ñ ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ Ð·Ð° поÑередництвом аргументу <b>--enable-{ModName}=incl</b> до Ñкрипту конфігурації <b>configure</b>, про що можна дізнатиÑÑ Ñ–Ð· <a href="How_to_Build_from_source.html" title="Special:MyLanguage/Documents/How to/Build from source">поÑібника по збірці</a>. Модулі OpenSCADA можуть бути Ñеми типів згідно приÑутнім <a href="Program_manual.html#Modularity" title="Special:MyLanguage/Documents/Program manual">модульним підÑиÑтемам</a>. Ðаразі модулі до OpenSCADA пишутьÑÑ Ð½Ð° мові Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ "<b>C++</b>", хоча у подальшому можлива поÑва біндінгів на інші мови. </p><p>У дереві вихідних текÑтів, у гілці кожної підÑиÑтеми, Ð´Ð»Ñ ÑÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð½Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¸Ñ… модулів передбачено теку "=Tmpl=" із шаблоном Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ñ— підÑиÑтеми. Розробник нового Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¼Ð¾Ð¶Ðµ взÑти цю теку та Ñкопіювати Ñ—Ñ— з ім'Ñм Ñвого нового модулÑ, хоча він також завжди може викориÑтати у ÑкоÑÑ‚Ñ– зразка будь Ñкий реальний функціонуючий модуль Ñкщо його новий близький за Ñтруктурою. Передбачено можливіÑÑ‚ÑŒ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ–Ð² у дереві вихідних текÑтів проєкту OpenSCADA або Ñк незалежного проєкту зовнішнього Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð¾ OpenSCADA. </p> <h3><span class="mw-headline" id=".D0.A1.D1.82.D0.B2.D0.BE.D1.80.D0.B5.D0.BD.D0.BD.D1.8F_.D1.83_.D0.B4.D0.B5.D1.80.D0.B5.D0.B2.D1.96_.D0.B2.D0.B8.D1.85.D1.96.D0.B4.D0.BD.D0.B8.D1.85_.D1.82.D0.B5.D0.BA.D1.81.D1.82.D1.96.D0.B2_.D0.BF.D1.80.D0.BE.D1.94.D0.BA.D1.82.D1.83_OpenSCADA"><span class="mw-headline-number">1.1</span> Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñƒ дереві вихідних текÑтів проєкту OpenSCADA</span></h3> <p>Створювати нові модулі у дереві вихідних текÑтів проєкту OpenSCADA має ÑÐµÐ½Ñ Ñƒ випадку подальших планів передачі нового Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ OpenSCADA. ОÑкільки модуль не має Ñуперечити духу відкритого проєкту та ліцензії на оÑнові Ñкої <a class="external text" href="http://oscada.org/ua/golovna/pro-proekt/licenziji/" rel="nofollow noreferrer noopener" target="_blank">розроблÑєтьÑÑ Ñ‚Ð° розповÑюджуєтьÑÑ OpenSCADA</a> то ліцензією нового Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð¾Ñ‡ÐµÐ²Ð¸Ð´ÑŒ має бути одна із вільних ліцензій. </p><p>Процедура ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð· включеннÑм до дерева вихідних текÑтів на оÑнові шаблону в цілому Ñ” проÑтішою за процедуру Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ‚Ð° включає в Ñебе кроки: </p> <dl><dd>1. Отримати дерево вихідних текÑтів проєкту OpenSCADA длÑ: <ul><li> <i>Робочої (Work) гілки:</i></li></ul> <dl><dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">svn co svn://oscada.org/trunk/OpenSCADA</span></dd></dl> <ul><li> <i>гілки Ñтабільного релізу — ÐЕБÐЖÐÐО, оÑкільки до Ñтабільних LTS релізів приймаютьÑÑ Ð»Ð¸ÑˆÐµ Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° Ñ†Ñ Ñ–Ð½ÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” верÑÑ–Ñ— 0.9 або вище:</i></li></ul> <dl><dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">svn co svn://oscada.org/tags/openscada_0.9</span></dd></dl></dd> <dd>2. Скопіювати теку шаблону з назвою нового Ð¼Ð¾Ð´ÑƒÐ»Ñ "NewMod", наприклад, Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "БД": <dl><dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">cd OpenSCADA/src/moduls/bd; cp -r =Tmpl= NewMod; cd NewMod; rm -f configure.ac</span> <dl><dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Збір Даних" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>daq</b>"</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Ðрхіви-ІÑторіÑ" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>arhiv</b>"</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпорти" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>transport</b>"</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпортні Протоколи" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>protocol</b>"</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "КориÑтувацькі ІнтерфейÑи" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>ui</b>"</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Спеціальні" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>special</b>"</dd></dl></dd></dl></dd> <dd>3. Редагувати файл "module.cpp" щодо: <dl><dd><dl><dd> <i>також може здійÑнюватиÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ за допомогою:</i> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">sed -i "s/Tmpl/NewMod/g" *.{cpp,h}</span></dd></dl></dd></dl> <ul><li> <i>зміни назви функцій вбудуваннÑ-Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ð³Ñ–Ð´Ð½Ð¾ назви нового модулÑ</i>:</li></ul> <dl><dd> "TModule::SAt <b>bd_Tmpl_module</b>( int n_mod )" —> "TModule::SAt <b>bd_NewMod_module</b>( int n_mod )"</dd> <dd> "TModule *<b>bd_Tmpl_attach</b>( const TModule::SAt &AtMod, const string &source )" —> "TModule *<b>bd_NewMod_attach</b>( const TModule::SAt &AtMod, const string &source )"</dd></dl> <ul><li> <i>інформації про модуль у файлі "module.cpp", а Ñаме ділÑнка:</i></li></ul></dd></dl> <div class="mw-highlight mw-content-ltr" dir="ltr" style="margin-left: 45px"><pre><span class="c1">//************************************************</span> <span class="c1">//* Modul info! *</span> <span class="cp">#define MOD_ID "NewMod"</span> <span class="cp">#define MOD_NAME _("DB NewMod")</span> <span class="cp">#define MOD_TYPE SDB_ID</span> <span class="cp">#define VER_TYPE SDB_VER</span> <span class="cp">#define MOD_VER "0.0.1"</span> <span class="cp">#define AUTHORS _("MyName MyFamily")</span> <span class="cp">#define DESCRIPTION _("BD NewMod description.")</span> <span class="cp">#define MOD_LICENSE "GPL2"</span> </pre></div> <dl><dd>4. Відредагувати конфігурацію ÑÐºÐ»Ð°Ð´Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñƒ файлі "Makefile.am" щодо: <dl><dd><dl><dd> <i>також може здійÑнюватиÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ за допомогою:</i> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">sed -i "s/Tmpl/NewMod/g" Makefile.am</span></dd></dl></dd></dl></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> EXTRA_DIST = *.h po/* if NewModIncl noinst_LTLIBRARIES = db_NewMod.la db_NewMod_la_CXXFLAGS = -DMOD_INCL -fpic db_NewMod_la_LIBTOOLFLAGS = --tag=disable-shared db_NewMod_la_LDFLAGS = -module else oscd_modul_LTLIBRARIES = db_NewMod.la db_NewMod_la_CXXFLAGS = db_NewMod_la_LIBTOOLFLAGS = --tag=disable-static db_NewMod_la_LDFLAGS = -module -avoid-version $(top_builddir)/src/liboscada.la endif db_NewMod_la_CXXFLAGS += $(NewMod_CFLAGS) db_NewMod_la_LDFLAGS += $(NewMod_LDLAGS) db_NewMod_la_SOURCES = module.cpp I18N_mod = $(oscd_modulpref)NewMod include ../../../../I18N.mk </pre> <dl><dd>5. Додати Ð·Ð°Ð¿Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð² кінець Ñекції підÑиÑтеми конфігураційного файлу "OpenSCADA/configure.ac" Ñкладальної ÑиÑтеми OpenSCADA: <ul><li> <i>в кінець Ñекції "DB modules" Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "БД":</i></li></ul></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> AX_MOD_DB_EN(NewMod, [disable or enable[=incl] compilation module DB.NewMod], disable, incl, [ # Код перевірки зовнішніх бібліотек Ð¼Ð¾Ð´ÑƒÐ»Ñ ]) </pre> <dl><dd><ul><li> <i>в кінець Ñекції "DAQ modules" Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Збір Даних":</i></li></ul></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> AX_MOD_DAQ_EN(NewMod, [disable or enable[=incl] compilation module DAQ.NewMod], disable, incl, [ # Код перевірки зовнішніх бібліотек Ð¼Ð¾Ð´ÑƒÐ»Ñ ]) </pre> <dl><dd><ul><li> <i>в кінець Ñекції "Archive modules" Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Ðрхіви-ІÑторіÑ":</i></li></ul></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> AX_MOD_Archive_EN(NewMod, [disable or enable[=incl] compilation module Archive.NewMod], disable, incl, [ # Код перевірки зовнішніх бібліотек Ð¼Ð¾Ð´ÑƒÐ»Ñ ]) </pre> <dl><dd><ul><li> <i>в кінець Ñекції "Transport modules" Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпорти":</i></li></ul></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> AX_MOD_Transport_EN(NewMod, [disable or enable[=incl] compilation module Transport.NewMod], disable, incl, [ # Код перевірки зовнішніх бібліотек Ð¼Ð¾Ð´ÑƒÐ»Ñ ]) </pre> <dl><dd><ul><li> <i>в кінець Ñекції "Transport protocol modules" Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпортні Протоколи":</i></li></ul></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> AX_MOD_TrProt_EN(NewMod, [disable or enable[=incl] compilation module Protocol.NewMod], disable, incl, [ # Код перевірки зовнішніх бібліотек Ð¼Ð¾Ð´ÑƒÐ»Ñ ]) </pre> <dl><dd><ul><li> <i>в кінець Ñекції "UI modules" Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "КориÑтувацькі ІнтерфейÑи":</i></li></ul></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> AX_MOD_UI_EN(NewMod, [disable or enable[=incl] compilation module UI.NewMod], disable, incl, [ # Код перевірки зовнішніх бібліотек Ð¼Ð¾Ð´ÑƒÐ»Ñ ]) </pre> <dl><dd><ul><li> <i>в кінець Ñекції "Special modules" Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Спеціальні":</i></li></ul></dd></dl> <pre style="white-space: pre-wrap; margin-left: 30px"> AX_MOD_Special_EN(NewMod, [disable or enable[=incl] compilation module Special.NewMod], disable, incl, [ # Код перевірки зовнішніх бібліотек Ð¼Ð¾Ð´ÑƒÐ»Ñ ]) </pre> <dl><dd>6. Тепер новий модуль можна ÑклаÑти у Ñкладі OpenSCADA піÑÐ»Ñ Ð¿ÐµÑ€ÐµÑ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñкладальної ÑиÑтеми: <dl><dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">autoreconf -if; ./configure --enable-NewMod; make</span></dd></dl></dd> <dd>7. Опублікувати — Ñформувати латку із вашим модулем та надіÑлати Ñ—Ñ— розробникам OpenSCADA: <dl><dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">cd OpenSCADA; make distclean; rm -rf src/moduls/bd/NewMod/{Makefile.in,.deps}</span></dd> <dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">svn add src/moduls/bd/NewMod; svn diff > NewMod.patch</span></dd></dl></dd></dl> <h3><span class="mw-headline" id=".D0.A1.D1.82.D0.B2.D0.BE.D1.80.D0.B5.D0.BD.D0.BD.D1.8F_.D0.B7.D0.BE.D0.B2.D0.BD.D1.96.D1.88.D0.BD.D1.8C.D0.BE.D0.B3.D0.BE_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F_.D0.B4.D0.BE_OpenSCADA"><span class="mw-headline-number">1.2</span> Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð¾ OpenSCADA</span></h3> <p>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð¾ OpenSCADA може мати ÑÐµÐ½Ñ Ñƒ випадку розробки інтерфейÑу інтеграції з комерційними ÑиÑтемами, Ñкі вимагають Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐ¾Ð´Ñƒ взаємодії, а також у випадку інших реалізацій комерційних інтерфейÑів при Ñких модуль до OpenSCADA отримує ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾ÐºÑ€ÐµÐ¼Ð¾Ð³Ð¾ проєкту, розповÑюджуєтьÑÑ Ñ‚Ð° підтримуєтьÑÑ Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ð¾, чаÑто у виглÑді бінарних збірок під конкретну платформу та верÑÑ–ÑŽ OpenSCADA. Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Ñ‚Ð°ÐºÐ¸Ñ… модулів відповідно може бути будь Ñкою. </p><p>Процедура ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ зовнішнього Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð½Ð° оÑнові шаблону багато в чому Ñхожа на попередню процедуру та включає в Ñебе кроки: </p> <dl><dd>1. Отримати вихідні текÑтів проєкту OpenSCADA — Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñƒ ÑкоÑÑ‚Ñ– джерела шаблону можна викориÑтати будь Ñкі файли OpenSCADA верÑÑ–Ñ— більш 0.9, оÑкільки із них потрібно Ñкопіювати лише теку "=Tmpl=" та декілька файлів Ð´Ð»Ñ Ð·Ð±Ñ–Ñ€ÐºÐ¸.</dd> <dd>2. Скопіювати теку шаблону з ім'Ñм нового Ð¼Ð¾Ð´ÑƒÐ»Ñ "NewMod", наприклад, Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "БД"; та вже в ній Ñтворити та Ñкопіювати потрібні файли зовнішнього модулÑ. Ð’ подальшому інформаційні файли проєкту "COPYING", "NEWS", "README", "AUTHORS" та "ChangeLog" потрібно заповнити згідно ÑутноÑÑ‚Ñ– нового модулÑ: <dl><dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">cp -r OpenSCADA/src/moduls/bd/=Tmpl= NewMod; touch NewMod/{NEWS,README,AUTHORS,ChangeLog}; cp OpenSCADA/I18N.mk NewMod/</span> <dl><dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Збір Даних" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>daq</b>/=Tmpl="</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Ðрхіви-ІÑторіÑ" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>arhiv</b>/=Tmpl="</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпорти" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>transport</b>/=Tmpl="</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпортні Протоколи" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>protocol</b>/=Tmpl="</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "КориÑтувацькі ІнтерфейÑи" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>ui</b>/=Tmpl="</dd> <dd> <i>Ð´Ð»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Спеціальні" шлÑÑ… наÑтупний</i> — "OpenSCADA/src/moduls/<b>special</b>/=Tmpl="</dd></dl></dd></dl></dd> <dd>3. Відредагувати інформацію Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñƒ файлі "module.cpp" аналогічно цьому пункту попереднього розділу.</dd> <dd>4. Відредагувати конфігурацію збірки Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñƒ файлі "Makefile.am" аналогічно цьому пункту попереднього розділу, окрім: <ul><li> заміÑÑ‚ÑŒ "db_NewMod_la_LDFLAGS = -module -avoid-version <b>$(top_builddir)/src/liboscada.la</b>" запиÑати "db_NewMod_la_LDFLAGS = -module -avoid-version", тобто видалити "$(top_builddir)/src/liboscada.la"</li> <li> заміÑÑ‚ÑŒ "include <b>../../../../</b>I18N.mk" запиÑати "include I18N.mk", тобто видалити шлÑÑ… "../../../../"</li></ul></dd> <dd>5. Відредагувати файл конфігурації Ñкладальної ÑиÑтеми "configure.ac" щодо: <dl><dd><dl><dd> <i>також може здійÑнюватиÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ за допомогою:</i> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">sed -i "s/Tmpl/NewMod/g" configure.ac</span></dd></dl></dd></dl> <ul><li> "AC_INIT([<b>Tmpl</b>],[<b>0.0.1</b>],[<b>my@email.org</b>])" — Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ модуль: ім'Ñ, верÑÑ–Ñ Ñ‚Ð° Ел.Пошта проєкту</li> <li> "AM_CONDITIONAL([<b>TmplIncl</b>],[test])" — "AM_CONDITIONAL([<b>NewModIncl</b>],[test])"</li></ul></dd> <dd>6. Ð’Ñтановити пакет розробки OpenSCADA "openscada-dev" або "openscada-devel" — у зв'Ñзку з тим, що модуль зовнішній та вихідні файли OpenSCADA потрібні лише на першому етапі його ÑтвореннÑ, то необхідно вÑтановлювати пакет розробки OpenSCADA, Ñкий міÑтить заголовні файли та бібліотеки.</dd> <dd>7. Тепер новий модуль можна ÑклаÑти, піÑÐ»Ñ Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñкладальної ÑиÑтеми: <dl><dd> <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">autoreconf -if; ./configure; make</span></dd></dl></dd></dl> <h2><span class="mw-headline" id="API_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D1.8F"><span class="mw-headline-number">2</span> API модулÑ</span></h2> <p>API OpenSCADA Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð½Ð¸ÐºÐ° OpenSCADA та модулів до неї опиÑано у відповідному документі "<a href="API.html" title="Special:MyLanguage/Documents/API">API OpenSCADA</a>", Ñкий завжди має бути під рукою при розробці Ð´Ð»Ñ OpenSCADA. Ð’ цьому ж документі Ð½Ð°Ð³Ð¾Ð»Ð¾Ñ Ð·Ð´Ñ–Ð¹Ñнено на детальному роз'ÑÑнені оÑновних моментів модульного API. </p><p>Модулі в OpenSCADA реалізуютьÑÑ Ñк поділювані бібліотеки та одна така бібліотека може міÑтити багато модулів підÑиÑтем OpenSCADA, фактично виÑтупаючи Ñк контейнер. Такі контейнери також можуть бути включені-вбудовані до Бібліотеки Ядра OpenSCADA Ñкщо ви будуєте дуже компактні рішеннÑ. </p><p>Першим кроком Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ð»ÑŽÐ²Ð°Ð½Ð¸Ñ… бібліотек (SO — Поділювані Об'єкти) Ñ” Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ ініціалізації. Такі функції мають бути визначені Ñк звичайні "C" функції Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ñпотворенню Ñ—Ñ… назв. Зазвичай це здійÑнюєтьÑÑ Ð½Ð°Ñтупним чином: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="c1">//================== CUT =========================</span> <span class="k">extern</span> <span class="s">"C"</span> <span class="p">{</span> <span class="cp">#ifdef MOD_INCL</span> <span class="n">TModule</span><span class="o">::</span><span class="n">SAt</span> <span class="n">bd_Tmpl_module</span><span class="p">(</span> <span class="kt">int</span> <span class="n">n_mod</span> <span class="p">)</span> <span class="cp">#else</span> <span class="n">TModule</span><span class="o">::</span><span class="n">SAt</span> <span class="n">module</span><span class="p">(</span> <span class="kt">int</span> <span class="n">n_mod</span> <span class="p">)</span> <span class="cp">#endif</span> <span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="n">n_mod</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">TModule</span><span class="o">::</span><span class="n">SAt</span><span class="p">(</span><span class="n">MOD_ID</span><span class="p">,</span> <span class="n">MOD_TYPE</span><span class="p">,</span> <span class="n">VER_TYPE</span><span class="p">);</span> <span class="k">return</span> <span class="n">TModule</span><span class="o">::</span><span class="n">SAt</span><span class="p">(</span><span class="s">""</span><span class="p">);</span> <span class="p">}</span> <span class="o"><!--</span><span class="nl">T</span><span class="p">:</span><span class="mi">348</span><span class="o">--></span> <span class="cp">#ifdef MOD_INCL</span> <span class="n">TModule</span> <span class="o">*</span><span class="n">bd_Tmpl_attach</span><span class="p">(</span> <span class="k">const</span> <span class="n">TModule</span><span class="o">::</span><span class="n">SAt</span> <span class="o">&</span><span class="n">AtMod</span><span class="p">,</span> <span class="k">const</span> <span class="n">string</span> <span class="o">&</span><span class="n">source</span> <span class="p">)</span> <span class="cp">#else</span> <span class="n">TModule</span> <span class="o">*</span><span class="n">attach</span><span class="p">(</span> <span class="k">const</span> <span class="n">TModule</span><span class="o">::</span><span class="n">SAt</span> <span class="o">&</span><span class="n">AtMod</span><span class="p">,</span> <span class="k">const</span> <span class="n">string</span> <span class="o">&</span><span class="n">source</span> <span class="p">)</span> <span class="cp">#endif</span> <span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="n">AtMod</span> <span class="o">==</span> <span class="n">TModule</span><span class="o">::</span><span class="n">SAt</span><span class="p">(</span><span class="n">MOD_ID</span><span class="p">,</span><span class="n">MOD_TYPE</span><span class="p">,</span><span class="n">VER_TYPE</span><span class="p">))</span> <span class="k">return</span> <span class="k">new</span> <span class="n">BDTmpl</span><span class="o">::</span><span class="n">BDMod</span><span class="p">(</span><span class="n">source</span><span class="p">);</span> <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> <span class="c1">//================== CUT =========================</span> </pre></div> <p>Точкою входу будь Ñкого Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ” функції: </p> <ul><li> <i>TModule::SAt module( int n_mod )</i>, <i>TModule::SAt {modTp}_{modNm}_module( int n_mod )</i> — викориÑтовуютьÑÑ Ð´Ð»Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ та інформації з уÑÑ–Ñ… модулів у бібліотеці. Перша Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтовуєтьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— модулів у зовнішній поділюваній бібліотеці, а друга під Ñ‡Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ-Ð²Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ—Ñ… до Ñдра OpenSCADA, де <i>modTp</i> відповідає типу модулÑ, а <i>modNm</i> його ІД.</li> <li> <i>TModule *attach( const TModule::SAt &AtMod, const string &source )</i>, <i>TModule *{modTp}_{modNm}_attach( const TModule::SAt &AtMod, const string &source )</i> — викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð±ÐµÐ·Ð¿Ð¾Ñереднього підключеннÑ-Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð¾Ð±Ñ€Ð°Ð½Ð¾Ð³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑˆÐ»Ñхом ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€ÐµÐ½ÐµÐ²Ð¾Ð³Ð¾ об'єкта Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑƒÑпадкованого від <b>TModule</b>. Перша Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтовуєтьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— модулів у зовнішній поділюваній бібліотеці, а друга під Ñ‡Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ-Ð²Ð±ÑƒÐ´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ—Ñ… до Ñдра OpenSCADA, де <i>modTp</i> та <i>modNm</i> відповідають попередній функції.</li></ul> <p>Загальним Ð´Ð»Ñ Ð²ÑÑ–Ñ… модулів Ñ” наÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€ÐµÐ½ÐµÐ²Ð¾Ð³Ð¾ об'єкта-клаÑу Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ñ–Ð´ клаÑу модульної підÑиÑтеми <a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a>, що вказує на наÑвніÑÑ‚ÑŒ Ñпільної чаÑтини інтерфейÑу Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñкий розглÑнемо далі. Ð”Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑƒÑÐ²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ архітектуру модулів у контекÑÑ‚Ñ– загальної архітектури OpenSCADA наполегливо рекомендуєтьÑÑ Ð¼Ð°Ñ‚Ð¸ перед очима <a class="external" href="http://oscada.org/wiki/File:API_uml_classdep.png" title="File:API uml classdep.png">загальну діаграму клаÑів OpenSCADA</a>! </p><p>Ð’ÑÑ– інтерфейÑні об'єкти модулів уÑпадковують ÐºÐ»Ð°Ñ Ð²ÑƒÐ·Ð»Ð° <a href="API.html#TCntrNode" title="Special:MyLanguage/Documents/API">TCntrNode</a>, Ñкий надає механізм <a href="API.html#CntrNode" title="Special:MyLanguage/Documents/API">інтерфейÑу управліннÑ</a>. Одним із завдань цього механізму Ñ” Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу конфігурації об'єкту у будь Ñкому конфігураторі OpenSCADA. </p> <table class="wikitable"> <tr> <th> Загальне API </th></tr> <tr> <td><b><a href="API.html#TCntrNode" title="Special:MyLanguage/Documents/API">TCntrNode</a></b> — Вузол OpenSCADA: <ul><li> <i>void preEnable( int flag );</i>, <i>void postEnable( int flag );</i> — Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð¾ динамічного дерева об'єктів, викликаєтьÑÑ Ð¿ÐµÑ€ÐµÐ´ та піÑÐ»Ñ Ñ„Ð°ÐºÑ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾.</li> <li> <i>void preDisable( int flag );</i>, <i>void postDisable( int flag );</i> — Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ–Ð· динамічного дерева об'єктів перед звільненнÑм об'єкту, викликаєтьÑÑ Ð¿ÐµÑ€ÐµÐ´ та піÑÐ»Ñ Ñ„Ð°ÐºÑ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾.</li> <li> <i>void load_( TConfig *cfg );</i>, <i>void load_( );</i> — Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ–Ð· контекÑту Ñховища <i>cfg</i> та загалом, викликаєтьÑÑ Ð½Ð° Ñтадії Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð·Ñ– Ñховку.</li> <li> <i>void save_( );</i> — Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ, викликаєтьÑÑ Ð½Ð° Ñтадії Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð¾ Ñховку, зазвичай за ініціативою кориÑтувача.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — Модуль OpenSCADA:<br /> <ul><li> <i>void modStart( );</i> — запуÑк модулÑ, викликаєтьÑÑ Ð½Ð° Ñтадії запуÑку завдань Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¸Ñ… функцій модулÑ, Ñкщо такі модулем надаютьÑÑ.</li> <li> <i>void modStop( );</i> — зупинка модулÑ, викликаєтьÑÑ Ð½Ð° Ñтадії зупинки завдань Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¸Ñ… функцій модулÑ, Ñкщо такі модулем надаютьÑÑ.</li> <li> <i>void modInfo( vector<string> &list );</i> — запит переліку інформаційних влаÑтивоÑтей модулÑ, Ñким надаєтьÑÑ Ñтандартний набір влаÑтивоÑтей "Module", "Name", "Type", "Source", "Version", "Author", "Description", "License", та що може бути розширено влаÑними-Ñпецифічними влаÑтивоÑÑ‚Ñми.</li> <li> <i>string modInfo( const string &name );</i> — запит елементу інформації <i>name</i> за Ñкого здійÑнюєтьÑÑ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ° запитів Ñ– до влаÑних-Ñпецифічних влаÑтивоÑтей модулÑ.</li> <li> <i>void modFuncReg( ExpFunc *func );</i> — реєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ ÐµÐºÑпортованої функції модулÑ, Ñка Ñ” чаÑтиною механізму міжмодульної взаємодії що реєÑтрує внутрішню функцію Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ виклику за назвою-Ñимволом функції та Ñ—Ñ— вказівником відноÑно об'єкта модулÑ. Ðаразі цей механізм мало Ñкими модулÑми викориÑтовуєтьÑÑ!</li> <li> <i>void perSYSCall( unsigned int cnt );</i> — виклик із ÑиÑтемного-ÑервіÑного потоку-Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð· періодичніÑÑ‚ÑŽ 10 Ñекунд та Ñекундним лічильником <i>cnt</i>, може викориÑтовуватиÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿ÐµÑ€Ñ–Ð¾Ð´Ð¸Ñ‡Ð½Ð¸Ñ…-рідких ÑервіÑних процедур.</li></ul> </td></tr> <tr> <th> API модулів підÑиÑтеми "Бази Даних (БД)" </th></tr> <tr> <td> Призначено Ð´Ð»Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— OpenSCADA із БД чи СУБД, Ñка реалізуєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼. Ðадає два загальних підходи до реалізації модулів: <ol><li> Режим ANSI SQL — Ñ” найпроÑтішим шлÑхом Ñкий передбачає безпоÑереднє викориÑÑ‚Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ Ñдра <a href="API.html#TTable" title="Special:MyLanguage/Documents/API">fieldSQLSeek(), fieldSQLGet(), fieldSQLSet(), fieldSQLDel()</a> у fieldSeek(), fieldGet(), fieldSet(), fieldDel() відповідно; вÑÑ– SQL-модулі викориÑтовують наразі цей підхід.</li> <li> Повна Ð ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ â€” Ñ” найÑкладнішим шлÑхом Ñкий передбачає повну реалізацію; модулі, що викориÑтовують такий підхід Ñ” або Ñтарими або Ñпецифічними: <a href="Modules/DBF.html" title="Special:MyLanguage/Modules/DBF">DBF</a>, <a href="Modules/LDAP.html" title="Special:MyLanguage/Modules/LDAP">LDAP</a>.</li></ol> </td></tr> <tr> <td><b><a href="API.html#TTypeBD" title="Special:MyLanguage/Documents/API">TTypeBD</a>-><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — кореневий об'єкт Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´ÑиÑтеми "БД": <ul><li> <i>string features( );</i> — перелік ключових Ñлів <a href="Program_manual.html#DBFeat" title="Special:MyLanguage/Documents/Program manual">підтримуваних влаÑтивоÑтей БД</a>.</li> <li> <i>int lsPr( );</i> — базовий приорітет БД [0...9] у загальному переліку Ñховків.</li> <li> <i>TBD *openBD( const string &id );</i> — викликаєтьÑÑ Ð¿Ñ€Ð¸ відкритті або Ñтворені нового об'єкта БД даним модулем з ідентифікатором <i>id</i>.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TBD" title="Special:MyLanguage/Documents/API">TBD</a></b> — об'єкт бази даних: <ul><li> <i>void enable( );</i> — Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð‘Ð”.</li> <li> <i>void disable( );</i> — Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð‘Ð”.</li> <li> <i>void allowList( vector<string> &list ) const;</i> — запит переліку <i>list</i> таблиць у БД.</li> <li> <i>void sqlReq( const string &req, vector< vector<string> > *tbl = NULL, char intoTrans = EVAL_BOOL );</i> — обробка SQL-запиту <i>req</i> до БД та Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñƒ у виглÑді таблиці <i>tbl</i>, Ñкщо запит вибірки та вказівник ненульовий. При вÑтановлені <i>intoTrans</i> у TRUE Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ муÑить бути відкрита транзакціÑ, у FALSE закрита. Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¼Ð°Ñ” реалізовуватиÑÑ Ð´Ð»Ñ Ð¡Ð£Ð‘Ð”, Ñкі підтримують SQL-запити.</li> <li> <i>void transCloseCheck( );</i> — періодично викликаєтьÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ транзакцій та Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñтарих або Ñкі міÑÑ‚ÑÑ‚ÑŒ багато запитів.</li> <li> <i>TTable *openTable( const string &name, bool create );</i> — викликаєтьÑÑ Ð¿Ñ€Ð¸ відкритті або Ñтворені нового об'єкта таблиці.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TTable" title="Special:MyLanguage/Documents/API">TTable</a></b> — об'єкт таблиці у базі даних: <ul><li> <i>void fieldStruct( TConfig &cfg );</i> — Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— Ñтруктури таблиці у об'єкті <i>cfg</i>.</li> <li> <i>bool fieldSeek( int row, TConfig &cfg, const string &cacheKey = "" );</i> — поÑлідовне ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñів таблиці перебором <i>row</i> за об'єктом <i>cfg</i> та Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ FALSE по закінченню, з адреÑацією за активними <a href="API.html#TCfg" title="Special:MyLanguage/Documents/API">keyUse()</a> ключовими полÑми. Ключ кешу <i>cacheKey</i> вказуєтьÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñм повної відповіді до кешу, із витÑгненнÑм наÑтупних запиÑів звідти.</li> <li> <i>void fieldGet( TConfig &cfg );</i> — запит вказаного у об'єкті <i>cfg</i> запиÑу із адреÑацією за ключовими полÑми.</li> <li> <i>void fieldSet( TConfig &cfg );</i> — передача вказаного у об'єкті <i>cfg</i> запиÑу з адреÑацією за ключовими полÑми.</li> <li> <i>void fieldDel( TConfig &cfg );</i> — Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ запиÑу за ключовими полÑми об'єкту <i>cfg</i>.</li></ul> <dl><dd> <i><b>Специфічне Ð´Ð»Ñ SQL Баз Даних</b></i></dd></dl> <ul><li> <i>void fieldFix( TConfig &cfg, const string &langLs = "" );</i> — Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñтруктури таблиці БД до <i>cfg</i> та Ð´Ð»Ñ Ð¼Ð¾Ð² перекладу <i>langLs</i>, зазвичай піÑÐ»Ñ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾Ð³Ð¾ запиÑу.</li> <li> <i>string getSQLVal( TCfg &cf, uint8_t RqFlg = 0 );</i> — Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñпецифічно до SQL обгорненого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>cf</i> Ð´Ð»Ñ <a href="API.html#TCfg" title="Special:MyLanguage/Documents/API">прапорців ReqFlg</a> Ð·Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ <i>RqFlg</i>.</li> <li> <i>void setSQLVal( TCfg &cf, const string &vl, bool tr = false );</i> — розбір SQL-Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i> Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ð´Ñƒ <i>tr</i> та із запиÑом до <i>cf</i>.</li></ul> </td></tr> <tr> <th> API модулів підÑиÑтеми "ТранÑпорти" </th></tr> <tr> <td> Забезпечує OpenSCADA комунікаціÑми через інтерфейÑ, чаÑто це мережі Ñкі реалізуютьÑÑ Ñ†Ð¸Ð¼ модулем. </td></tr> <tr> <td> <b><a href="API.html#TTypeTransport" title="Special:MyLanguage/Documents/API">TTypeTransport</a>-><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — кореневий об'єкт Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпорти": <ul><li> <i>virtual bool isNetwork( );</i> — ознака реалізації мережі цим модулем.</li> <li> <i>virtual string outAddrHelp( );</i> — допомога із формату адреÑи вихідного транÑпорту.</li> <li> <i>virtual TTransportIn *In( const string &id, const string &stor );</i> — викликаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ за Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ об'єкту вхідного транÑпорту із ідентифікатором <i>id</i> та Ñховком <i>stor</i>.</li> <li> <i>virtual TTransportOut *Out( const string &name, const string &stor );</i> — викликаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ за Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ об'єкту вихідного транÑпорту із ідентифікатором <i>id</i> та Ñховком <i>stor</i>.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TTransportIn" title="Special:MyLanguage/Documents/API">TTransportIn</a></b> — об'єкт вхідного транÑпорту: <ul><li> <i>virtual unsigned keepAliveReqs( );</i> — макÑимум запитів "Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð–Ð¸Ñ‚Ñ‚Ñ".</li> <li> <i>virtual unsigned keepAliveTm( );</i> — Ñ‡Ð°Ñ "Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð–Ð¸Ñ‚Ñ‚Ñ".</li> <li> <i>virtual string getStatus( );</i> — Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑтатуÑу транÑпорту.</li> <li> <i>virtual void start( );</i> — запуÑк транÑпорту.</li> <li> <i>virtual void stop( );</i> — зупинка транÑпорту.</li> <li> <i>virtual int writeTo( const string &sender, const string &data );</i> — надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… <i>data</i> назад відправнику <i>sender</i>. <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> Переважно заÑтаріле та заміщене режимом Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ <a href="API.html#TProtocolIn" title="Special:MyLanguage/Documents/API">вхідного транÑпортного протоколу</a>, Початково реалізуєтьÑÑ Ñƒ транÑпортах із підтримкою ініціативного відправленнÑ, не лише за запитом.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TTransportOut" title="Special:MyLanguage/Documents/API">TTransportOut</a></b> — об'єкт вихідного транÑпорту: <ul><li> <i>virtual string timings( );</i> — таймаути транÑпорту.</li> <li> <i>virtual unsigned short attempts( );</i> — Ñпроб підключеннÑ.</li> <li> <i>virtual string getStatus( );</i> — Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑтатуÑу транÑпорту.</li> <li> <i>virtual void setTimings( const string &vl, bool isDef = false );</i> — вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð¹Ð¼Ð°ÑƒÑ‚Ñ–Ð² транÑпорту, Ñк типове за <i>isDef</i>.</li> <li> <i>virtual void setAttempts( unsigned short vl );</i> — вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñпроб підключеннÑ.</li> <li> <i>virtual void start( int time = 0 );</i> — запуÑк транÑпорту із таймаутом Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>time</i>. Із запуÑком вихідного транÑпорту вÑтановлюєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ віддаленої Ñтанції Ð´Ð»Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñів Ñкі передбачають підключеннÑ. Ðа цей Ñ‡Ð°Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ виникати помилки Ñкщо Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ та транÑпорт має повернутиÑÑ Ð´Ð¾ Ñтану зупинки.</li> <li> <i>virtual void stop( );</i> — зупинка транÑпорту.</li> <li> <i>virtual int messIO( const char *oBuf, int oLen, char *iBuf = NULL, int iLen = 0, int time = 0 );</i> — відправка даних через транÑпорт. Таймаут Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ <i>time</i> Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð² міліÑекундах. Ðегативне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>time</i> вимикає режим транÑпорту запит/відповідь Ð´Ð»Ñ Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ð¾Ð³Ð¾ читаннÑ/запиÑу до буферу Ð’Ð’, із таймаутом Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ <i>time</i> у абÑолютному значені.</li></ul> </td></tr> <tr> <th> API модулів підÑиÑтеми "ТранÑпортні протоколи" </th></tr> <tr> <td> Забезпечує OpenSCADA комунікаціÑми Ñ€Ñ–Ð²Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ, Ñкі реалізуютьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼, щодо доÑтупу до даних із зовнішніх ÑиÑтем та Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… OpenSCADA Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… ÑиÑтем. </td></tr> <tr> <td><b><a href="API.html#TProtocol" title="Special:MyLanguage/Documents/API">TProtocol</a>-><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — кореневий об'єкт Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´ÑиÑтеми "ТранÑпортні протоколи": <ul><li> <i>virtual void itemListIn( vector<string> &ls, const string &curIt = "" );</i> — перелік <i>ls</i> під'елементів вхідного протоколу від поточного елементу <i>curIt</i>, Ñкщо протокол Ñ—Ñ… надає. ВикориÑтовуєтьÑÑ Ð¿Ñ€Ð¸ обранні об'єкта у конфігурації вхідного транÑпорту.</li> <li> <i>virtual void outMess( XMLNode &io, TTransportOut &tro );</i> — Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… об'єктами Ñдра OpenSCADA у дереві XML <i>io</i> до віддаленої ÑиÑтеми через транÑпорт <i>tro</i> та поточний вихідний протокол. ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… у дереві XML не Ñтандартизоване та Ñпецифічне до логічної Ñтруктури протоколу. Ці дані ÑеріалізуютьÑÑ â€” перетворюютьÑÑ Ñƒ поÑлідовніÑÑ‚ÑŒ байтів відповідно до протоколу, та надÑилаютьÑÑ Ñ‡ÐµÑ€ÐµÐ· визначений вихідний транÑпорт <i>tro</i> <a href="API.html#TTransportOut" title="Special:MyLanguage/Documents/API">функцією messIO()</a>.</li> <li> <i>virtual TProtocolIn *in_open( const string &id );</i> — викликаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ за Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ об'єкту транÑпортного протоколу із ідентифікатором <i>id</i>.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TProtocolIn" title="Special:MyLanguage/Documents/API">TProtocolIn</a></b> — вхідний об'єкт транÑпортного протоколу з Ð¾Ð¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… запитів від <a href="API.html#TTransportIn" title="Special:MyLanguage/Documents/API">вхідного транÑпортного об'єкту TTransportIn</a>. Ð”Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ ÑеанÑу вхідного запиту ÑтворюєтьÑÑ Ð°Ñоційований об'єкт вхідного протоколу, Ñкий залишаєтьÑÑ Ð¶Ð¸Ð²Ð¸Ð¼ до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ ÑеанÑу "запит->відповідь". ÐдреÑа транÑпорту, Ñкий відкриває Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ, визначаєтьÑÑ Ñƒ <a href="API.html#TProtocolIn" title="Special:MyLanguage/Documents/API">srcTr()</a>: <ul><li> <i>virtual unsigned waitReqTm( )</i> — Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на вхідному транÑпорті у міліÑекундах, піÑÐ»Ñ Ñкого звертаєтьÑÑ Ð´Ð¾ протоколу із порожнім повідомленнÑм — режим опитуваннÑ. Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¹Ð¾Ð³Ð¾ у нуль вимикає режим опитуваннÑ.</li> <li> <i>virtual void setSrcTr( TTransportIn *vl )</i> — вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ñпорту-джерела відкритого ÑеанÑу вхідного протоколу.</li> <li> <i>virtual void setSrcAddr( const string &vl );</i> — вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð´Ñ€ÐµÑи відправника.</li> <li> <i>virtual bool mess( const string &request, string &answer );</i> — Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑлідовноÑÑ‚Ñ– даних запиту <i>request</i> до об'єкту протоколу Ð´Ð»Ñ Ñ—Ñ— розбору відповідно до реалізації протоколу. Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ має опрацювати запит <i>request</i>, згенерувати відповідь у <i>answer</i> та повернути FALSE у випадку повноти запиту. Якщо запит <i>request</i> не повний, необхідно повернути транÑпорту TRUE Ð´Ð»Ñ Ñ–Ð½Ð´Ð¸ÐºÐ°Ñ†Ñ–Ñ— "Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ", попередні чаÑтини запиту повинні зберігатиÑÑ Ñƒ контекÑÑ‚Ñ– об'єкту протоколу.</li></ul> </td></tr> <tr> <th> API модулів підÑиÑтеми "Збір Даних" </th></tr> <tr> <td> Ðадає збір даних реального чаÑу із зовнішніх ÑиÑтем або Ñ—Ñ… Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ обчиÑлювачах, Ñкі реалізуютьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼. Це оÑновна підÑиÑтема, оÑкільки SCADA це первинно про Збір Даних. Як оÑновна підÑиÑтема, вона забезпечує декілька підходів до реалізації модулів, Ñкі здебільшого ÑтоÑуютьÑÑ Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñтруктури атрибутів: <ol><li> Статичне Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ типів параметрів, уÑпадкованих від <a href="API.html#TTypeParam" title="Special:MyLanguage/Documents/API">TTypeParam</a>, тобто заÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтруктур виконуєтьÑÑ Ñк набір атрибутів зі зміною типу параметра. Цей метод Ñ” найменш гнучким Ñ– його викориÑтовують такі модулі: <a href="Modules/GPIO.html" title="Special:MyLanguage/Modules/GPIO">GPIO</a>, <a href="Modules/SMH2Gi.html" title="Special:MyLanguage/Modules/SMH2Gi">SMH2Gi</a>, <a class="external" href="http://oscada.org/wiki/Special:MyLanguage/Modules/AMRDevs" title="Special:MyLanguage/Modules/AMRDevs">AMRDevs</a>.</li> <li> Динамічне Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð· керуваннÑм Ñтруктури контейнеру <a href="API.html#TElem" title="Special:MyLanguage/Documents/API">TElem</a> в об’єкті параметра <a href="API.html#TParamContr" title="Special:MyLanguage/Documents/API">TParamContr</a>. Цей метод Ñ” найбільш гнучким Ñ– викориÑтовуєтьÑÑ Ð² більшоÑÑ‚Ñ– модулів, Ñтруктуру Ñких можна конфігурувати.</li> <li> Як Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ñнує <a href="DAQ.html#LogicLev" title="Special:MyLanguage/Documents/DAQ">тип параметра Логічного РівнÑ</a>, Ñкий можна додати до будь-Ñкого модулÑ, але він викориÑтовуєтьÑÑ Ð¿ÐµÑ€ÐµÐ²Ð°Ð¶Ð½Ð¾ в універÑальних джерелах даних: <a href="Modules/LogicLev.html" title="Special:MyLanguage/Modules/LogicLev">LogicLev</a>, <a href="Modules/ModBus.html" title="Special:MyLanguage/Modules/ModBus">ModBus</a>, <a href="Modules/Siemens.html" title="Special:MyLanguage/Modules/Siemens">Siemens</a>, <a href="Modules/OPC_UA.html" title="Special:MyLanguage/Modules/OPC UA">OPC_UA</a>.</li></ol> </td></tr> <tr> <td><b><a href="API.html#TTypeDAQ" title="Special:MyLanguage/Documents/API">TTypeDAQ</a>-><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — кореневий об'єкт Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Збір Даних": <ul><li> <i>virtual bool compileFuncLangs( vector<string> *ls = NULL );</i> — запитує перелік мов <i>ls</i> Ð´Ð»Ñ Ñких реалізуєтьÑÑ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ–ÑÑ‚ÑŒ Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких процедур у цьому модулі, та перевірка факту підтримки цього.</li> <li> <i>virtual void compileFuncSnthHgl( const string &lang, XMLNode &shgl );</i> — запит прав підÑÐ²Ñ–Ñ‚Ð»ÐµÐ½Ð½Ñ ÑинтакÑиÑу <i>shgl</i> щодо визначеної мови <i>lang</i>.</li> <li> <i>virtual string compileFunc( const string &lang, TFunction &fnc_cfg, const string &prog_text, const string &usings = "", int maxCalcTm = 0 );</i> — компілÑціÑ-реєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñтувацької функції на підтримуваній мові Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ <i>lang</i> та на вихідному коді процедури <i>prog_text</i>, заÑнованій на параметрах процедури <i>fnc_cfg</i>. Повертає адреÑу об'єкту Ñкомпільованої функції, готового до виконаннÑ.</li> <li> <i>virtual bool redntAllow( );</i> — Ñтан підтримки механізму Ñ€ÐµÐ·ÐµÑ€Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ð¸Ð¼ модулем. Має бути перевизначено та повертати TRUE за підтримки, інакше FALSE.</li> <li> <i>virtual TController *ContrAttach( const string &id, const string &daq_db );</i> — викликаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ за Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ об'єкту контролеру із ідентифікатором <i>id</i>.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TController" title="Special:MyLanguage/Documents/API">TController</a></b> — об'єкт контролеру джерела даних. У контекÑÑ‚Ñ– об'єкту зазвичай виконуєтьÑÑ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿ÐµÑ€Ñ–Ð¾Ð´Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ або планового Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… реального чаÑу фізичного контролеру або фізично відокремленого блоку даних. У випадку Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… пакетами, вони розташовуютьÑÑ Ð±ÐµÐ·Ð¿Ð¾Ñередньо у архіві, пов'Ñзаному із атрибутом параметра <a href="API.html#TVAl" title="Special:MyLanguage/Documents/API">TVAl::arch()</a>, та поточне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÑтановлюєтьÑÑ <a href="API.html#TVAl" title="Special:MyLanguage/Documents/API">функцією TVAl::set()</a> із атрибутом "sys"=TRUE: <ul><li> <i>virtual string getStatus( );</i> — Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ ÑтатуÑу контролеру.</li> <li> <i>virtual void enable_( );</i> — ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¾Ð±'єкту контролеру. Ðа цій Ñтадії зазвичай відбуваєтьÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¾Ð±'єктів параметрів та Ñ—Ñ… інтерфейÑів у формі атрибутів, атрибути інколи можуть запитуватиÑÑ Ñƒ пов'Ñзаного віддаленого джерела.</li> <li> <i>virtual void disable_( );</i> — Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¾Ð±'єкту контролеру.</li> <li> <i>virtual void start_( );</i> — запуÑк об'єкту контролеру. Ðа цій Ñтадії зазвичай ÑтворюєтьÑÑ Ñ‚Ð° запуÑкаєтьÑÑ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ.</li> <li> <i>virtual void stop_( );</i> — зупинка об'єкту контролеру.</li> <li> <i>virtual void redntDataUpdate( );</i> — Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… із резервної Ñтанції, автоматично викликаєтьÑÑ ÑервіÑною процедурою Ñхеми Ñ€ÐµÐ·ÐµÑ€Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÑиÑтеми.</li> <li> <i>virtual string catsPat( );</i> — перелік правил регулÑрних виразів, поділених '|', Ð´Ð»Ñ Ð²Ð¸Ð¾ÐºÑ€ÐµÐ¼Ð»ÐµÐ½Ð½Ñ Ð·Ð° категорією щодо повідомлень згенерованих об'єктом.</li> <li> <i>virtual void messSet( const string &mess, int lev, const string &type2Code = "OP", const string &prm = "", const string &cat = "" );</i> — Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð”Ð¶ÐµÑ€ÐµÐ»Ð° Даних від об'єкту параметру <i>prm</i> (PrmId) або об'єкту контролеру взагалі Ñкщо об'єкту параметру не визначено, Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mess</i>, Ñ€Ñ–Ð²Ð½Ñ <i>lev</i> та коду типу <i>type2Code</i>. Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð³ÐµÐ½ÐµÑ€ÑƒÑ” Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ–Ð· уніфікованою категорією прозороÑÑ‚Ñ– Джерела Даних "<b>{type2Code}{ModId}:{CntrId}[.{prm}][:{cat}]</b>".</li> <li> <i>virtual TParamContr *ParamAttach( const string &id, int type );</i> — викликаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ за Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ об'єкту параметру контролера із ідентифікатором <i>id</i>.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TParamContr" title="Special:MyLanguage/Documents/API">TParamContr</a>-><a href="API.html#TValue" title="Special:MyLanguage/Documents/API">TValue</a></b> — об'єкт параметру контролера джерела даних. МіÑтить атрибути з реальними даними у наборі визначеному фізично доÑтупними даними. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾ атрибутів потраплÑÑŽÑ‚ÑŒ із Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÐµÑ€Ð°, при аÑинхронному режимі, або запитуютьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð·Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ, при Ñинхронному режимі, та за поÑередництвом методів уÑпадкованого типу <a href="API.html#TValue" title="Special:MyLanguage/Documents/API">TValue</a>: <ul><li> <i>virtual TElem *dynElCntr( );</i> — контейнер динамічних елементів атрибутів Збору Даних. Переважно визначаєтьÑÑ Ð´Ð¶ÐµÑ€ÐµÐ»Ð°Ð¼Ð¸ логічного Ñ€Ñ–Ð²Ð½Ñ Ñкі Ñ– надають контейнери такого характеру.</li> <li> <i>virtual void enable( );</i> — ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¾Ð±'єкту параметру, здійÑнюєтьÑÑ Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ атрибутів та Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ñ—Ñ… значеннÑми недоÑтовірноÑÑ‚Ñ–.</li> <li> <i>virtual void disable( );</i> — Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¾Ð±'єкту параметру.</li> <li> <i>virtual void setType( const string &tpId );</i> — викликаєтьÑÑ Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ типу параметру у <i>tpId</i> та може бути опрацьований у об'єкті Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ влаÑних даних.</li> <li> <i>virtual TVal* vlNew( );</i> — викликаєтьÑÑ Ð½Ð° Ñтадії ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ атрибуту. Може бути перевизначено Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— оÑобливої поведінки у межах Ñвого об'єкту, уÑпадкованого від <i>TVal</i>, при доÑтупі до атрибуту.</li> <li> <i>virtual void vlGet( TVal &vo );</i> — викликаєтьÑÑ Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñƒ <i>vo</i> із режимом прÑмого Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ <b>TVal::DirRead</b> при читанні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð»Ñ Ð¿Ñ€Ñмого-Ñинхронного Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð· фізичного джерела або буферу об'єкта.</li> <li> <i>virtual void vlSet( TVal &vo, const TVariant &vl, const TVariant &pvl );</i> — викликаєтьÑÑ Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñƒ <i>vo</i> із режимом прÑмого запиÑу <b>TVal::DirWrite</b> при запиÑу Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i> Ð·Ð°Ð´Ð»Ñ Ð¿Ñ€Ñмого-Ñинхронного запиÑу до фізичного джерела або буферу об'єкта, із попереднім значеннÑм <i>pvl</i>.</li> <li> <i>virtual void vlArchMake( TVal &val );</i> — викликаєтьÑÑ Ð½Ð° Ñтадії ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ значень із атрибутом <i>val</i> Ñк джерело щодо ініціалізації характериÑтик ÑкоÑÑ‚Ñ– буферу архіву у відповідноÑÑ‚Ñ– до характериÑтик джерела даних та опитуваннÑ.</li></ul> </td></tr> <tr> <th> API модулів підÑиÑтеми "Ðрхіви-ІÑторіÑ" </th></tr> <tr> <td> ВикориÑтовуєтьÑÑ Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ñторії повідомлень Ñ– значень реального чаÑу отриманих у підÑиÑтемі "Збір Даних", та у заÑіб реалізований модулем. </td></tr> <tr> <td><b><a href="API.html#TTypeArchivator" title="Special:MyLanguage/Documents/API">TTypeArchivator</a>-><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — кореневий об'єкт Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Ðрхіви-ІÑторіÑ": <ul><li> <i>virtual TMArchivator *AMess( const string &id, const string &stor );</i> — викликаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ за Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ об'єкту архіватору повідомлень із ідентифікатором <i>id</i> та у Ñховку <i>stor</i>.</li> <li> <i>virtual TVArchivator *AVal( const string &id, const string &stor );</i> — викликаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ за Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð°Ð±Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ об'єкту архіватору значень із ідентифікатором <i>id</i> та у Ñховку <i>stor</i>.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TMArchivator" title="Special:MyLanguage/Documents/API">TMArchivator</a></b> — об'єкт архіватору повідомлень. <ul><li> <i>virtual void redntDataUpdate( );</i> — Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… із резервної Ñтанції, автоматично викликаєтьÑÑ ÑервіÑною процедурою Ñхеми Ñ€ÐµÐ·ÐµÑ€Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÑиÑтеми.</li> <li> <i>virtual void start( );</i> — запуÑк об'єкту архіватору, архіватор запуÑкаєтьÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ та Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ—Ñ… до Ñховку.</li> <li> <i>virtual void stop( );</i> — зупинка об'єкту архіватору.</li> <li> <i>virtual time_t begin( );</i> — Ñ‡Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ даних архіватору у відповідноÑÑ‚Ñ– до поточного Ñтану Ñховку.</li> <li> <i>virtual time_t end( );</i> — Ñ‡Ð°Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… архіватору у відповідноÑÑ‚Ñ– до поточного Ñтану Ñховку.</li> <li> <i>virtual bool put( vector<TMess::SRec> &mess, bool force = false );</i> — Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ повідомлень <i>mess</i> до архіватору. Повертає TRUE за уÑпішної операції. Ð’Ñтановити <i>force</i> Ð´Ð»Ñ Ð¿Ñ€Ñмого запиÑу до архіву оминаючи резервуваннÑ.</li> <li> <i>virtual time_t get( time_t bTm, time_t eTm, vector<TMess::SRec> &mess, const string &category = "", char level = 0, time_t upTo = 0 );</i> — Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ до <i>mess</i> із архіватору Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ… параметрів фільтрації. Повертає Ñ‡Ð°Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ¸ запиту, кориÑно Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ цієї позиції Ñк чаÑу закінченнÑ, тобто ітераційно заглиблюючиÑÑŒ в Ñ–Ñторію. Фільтр визначаєтьÑÑ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð¼ чаÑу [<i>bTm</i>...<i>eTm</i>], правилами категорії <i>category</i>, рівнем <i>level</i> та обмежено до чаÑу <i>upTo</i>. За відÑутноÑÑ‚Ñ– прÑмого Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ чаÑу <i>upTo</i>, це Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð²ÑтановлюєтьÑÑ Ñƒ <i>prmInterf_TM</i> — 7 Ñекунд.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TVArchivator" title="Special:MyLanguage/Documents/API">TVArchivator</a></b> — об'єкт архіватору значень. <ul><li> <i>virtual void start( );</i> — запуÑк об'єкту архіватору, архіватор запуÑкаєтьÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ та Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ—Ñ… у Ñховок.</li> <li> <i>virtual void stop( bool full_del = false );</i> — зупинка об'єкту архіватору із можливіÑÑ‚ÑŽ повного Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¹Ð¾Ð³Ð¾ даних зі Ñховку за <i>full_del</i>.</li> <li> <i>virtual TVArchEl *getArchEl( TVArchive &arch );</i> — Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¾Ð±'єкту елемента архіву значень Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾Ð³Ð¾ архіву <i>arch</i>.</li> <li> <i>virtual void pushAccumVals( );</i> — Ð²Ð¸ÑˆÑ‚Ð¾Ð²Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°ÐºÐ¾Ð¿Ð¸Ñ‡ÐµÐ½Ð¸Ñ… завданнÑм архівації значень, Ð´Ð»Ñ Ð°ÐºÑƒÐ¼ÑƒÐ»ÑŽÐ²Ð°Ð»ÑŒÐ½Ð¸Ñ… архіваторів.</li></ul> </td></tr> <tr> <td><b><a href="API.html#TVArchEl" title="Special:MyLanguage/Documents/API">TVArchEl</a></b> — об'єкт елементу архіватору значень. <ul><li> <i>virtual void fullErase( );</i> — викликаєтьÑÑ Ð´Ð»Ñ Ñ†Ñ–Ð»ÐºÐ¾Ð²Ð¸Ñ‚Ð¾Ð³Ð¾ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð½Ð¾Ñ— чаÑтини архіватору.</li> <li> <i>virtual int64_t end( );</i> — Ñ‡Ð°Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñƒ мікроÑекундах щодо наÑвних значень у архіві архіватору.</li> <li> <i>virtual int64_t begin( );</i> — Ñ‡Ð°Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ у мікроÑекундах щодо наÑвних значень у архіві архіватору.</li> <li> <i>virtual TVariant getValProc( int64_t *tm, bool up_ord );</i> — запит одного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð· архіву на Ñ‡Ð°Ñ <i>tm</i> та із підтÑгненнÑм до верхнього Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñƒ ґратці Ð²Ð¸Ð¼Ñ–Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ <i>up_ord</i>.</li> <li> <i>virtual void getValsProc( TValBuf &buf, int64_t beg, int64_t end );</i> — запит групи значень до <i>buf</i> із архіву та Ð´Ð»Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ чаÑу [<i>beg</i>...<i>end</i>].</li> <li> <i>virtual void setValsProc( TValBuf &buf, int64_t beg, int64_t end, bool toAccum );</i> — вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð³Ñ€ÑƒÐ¿Ð¸ значень <i>buf</i> до архіву, Ð´Ð»Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ чаÑу [<i>beg</i>...<i>end</i>] та через акумулÑцію <i>toAccum</i>.</li></ul> </td></tr> <tr> <th> API модулів підÑиÑтеми "КориÑтувацькі ІнтерфейÑи" </th></tr> <tr> <td> КориÑтувацький Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ„Ð¾Ñ€Ð¼ÑƒÑ”Ñ‚ÑŒÑÑ Ð·Ð³Ñ–Ð´Ð½Ð¾ до концепції та механізмів зовнішніх розповÑюджених Ñтандартів та бібліотек. </td></tr> <tr> <td><b><a href="API.html#TUI" title="Special:MyLanguage/Documents/API">TUI</a>-><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — кореневий об'єкт Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´ÑиÑтеми "КориÑтувацькі ІнтерфейÑи":<br /> <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> Ðе міÑтить Ñпецифічних функцій! </p> </td></tr> <tr> <th> API модулів підÑиÑтеми "Спеціальне" </th></tr> <tr> <td> Реалізує Ñпецифічні функції, Ñкі не увійшли до жодної з вищеперелічених підÑиÑтем. Специфічні функції формуютьÑÑ Ð·Ð³Ñ–Ð´Ð½Ð¾ Ñ—Ñ… влаÑних вимог та із викориÑтаннÑм вÑÑ–Ñ… можливоÑтей API OpenSCADA. </td></tr> <tr> <td><b><a href="API.html#TSpecial" title="Special:MyLanguage/Documents/API">TSpecial</a>-><a href="API.html#TModule" title="Special:MyLanguage/Documents/API">TModule</a></b> — кореневий об'єкт Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´ÑиÑтеми "Спеціальне":<br /> <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> Ðе міÑтить Ñпецифічних функцій! </p> </td></tr></table> <p><br /> Ð”Ð»Ñ Ð·Ñ€ÑƒÑ‡Ð½Ð¾ÑÑ‚Ñ– прÑмої адреÑації до кореневого об'єкта Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ–Ð· будь Ñкого об'єкта нижче за ієрархією, рекомендуєтьÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ глобальну змінну "mod" у облаÑÑ‚Ñ– імен модулÑ, з ініціалізацією Ñ—Ñ— у конÑтрукторі кореневого об'єкта. Також, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€Ð¾Ð³Ð¾ перекладу текÑтових повідомлень Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÑ”Ñ‚ÑŒÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ шаблони функцій виклику перекладу повідомлень Ð¼Ð¾Ð´ÑƒÐ»Ñ "<b>_({ПовідомленнÑ})</b>" та "<b>trS({ПовідомленнÑ})</b>" Ñк: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="cp">#undef _</span> <span class="cp">#define _(mess) mod->I18N(mess).c_str()</span> <span class="cp">#undef trS</span> <span class="cp">#define trS(mess) mod->I18N(mess,mess_PreSave)</span> </pre></div> <p>У конÑтрукторі кореневого об'єкту Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑƒÑпадкованого від <b>TModule</b> необхідно вÑтановити оÑновну інформацію Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¾Ð¼ функції <b>void modInfoMainSet({Ім'Ñ}, {Тип}, {ВерÑÑ–Ñ}, {Ðвтори}, {ОпиÑ}, {ЛіцензіÑ}, {Джерело})</b> піÑÐ»Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— швидкого поÑÐ¸Ð»Ð°Ð½Ð½Ñ "mod" на кореневий об'єкт цього модулÑ. </p><p>Подальше Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ шаблону перекладів "po/oscd_NewMod.pot" текÑтових повідомлень "<b>_({ПовідомленнÑ})</b>" та "<b>trS({ПовідомленнÑ})</b>", а також оновленнÑ-Ð°ÐºÑ‚ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² вже Ñ–Ñнуючих перекладів "po/{uk|de|ru|...}.po" здійÑнюєтьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ у теці Ð¼Ð¾Ð´ÑƒÐ»Ñ <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">make messages</span>. </p><p>При вирішенні завдань нового Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¼Ð¾Ð¶Ðµ знадобитиÑÑ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² конфігурації, що здійÑнюєтьÑÑ Ñƒ віртуальній функції <b>void cntrCmdProc( XMLNode *req );</b>. ВміÑÑ‚ цієї функції, Ñкий додає влаÑтивоÑÑ‚Ñ–, у <a href="Modules/SQLite.html" title="Special:MyLanguage/Modules/SQLite">модулі SQLite</a> має виглÑд: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="kt">void</span> <span class="n">MBD</span><span class="o">::</span><span class="n">cntrCmdProc</span><span class="p">(</span> <span class="n">XMLNode</span> <span class="o">*</span><span class="n">opt</span> <span class="p">)</span> <span class="p">{</span> <span class="c1">//Getting the page info</span> <span class="k">if</span><span class="p">(</span><span class="n">opt</span><span class="o">-></span><span class="n">name</span><span class="p">()</span> <span class="o">==</span> <span class="s">"info"</span><span class="p">)</span> <span class="p">{</span> <span class="n">TBD</span><span class="o">::</span><span class="n">cntrCmdProc</span><span class="p">(</span><span class="n">opt</span><span class="p">);</span> <span class="n">ctrMkNode</span><span class="p">(</span><span class="s">"fld"</span><span class="p">,</span><span class="n">opt</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="s">"/prm/cfg/ADDR"</span><span class="p">,</span><span class="n">EVAL_STR</span><span class="p">,</span><span class="n">enableStat</span><span class="p">()</span><span class="o">?</span><span class="nl">R_R___</span><span class="p">:</span><span class="n">RWRW__</span><span class="p">,</span><span class="s">"root"</span><span class="p">,</span><span class="n">SDB_ID</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span> <span class="s">"dest"</span><span class="p">,</span><span class="s">"sel_ed"</span><span class="p">,</span><span class="s">"select"</span><span class="p">,</span><span class="s">"/prm/cfg/dbFsList"</span><span class="p">,</span><span class="s">"help"</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s">"SQLite DB address must be written as: </span><span class="se">\"</span><span class="s">{FileDBPath}</span><span class="se">\"</span><span class="s">.</span><span class="se">\n</span><span class="s">"</span> <span class="s">"Where:</span><span class="se">\n</span><span class="s">"</span> <span class="s">" FileDBPath - full path to DB file (./oscada/Main.db).</span><span class="se">\n</span><span class="s">"</span> <span class="s">" Use the empty path to create a temporary database on the disk.</span><span class="se">\n</span><span class="s">"</span> <span class="s">" Use </span><span class="se">\"</span><span class="s">:memory:</span><span class="se">\"</span><span class="s"> to create a temporary database in memory."</span><span class="p">));</span> <span class="k">if</span><span class="p">(</span><span class="n">reqCnt</span><span class="p">)</span> <span class="n">ctrMkNode</span><span class="p">(</span><span class="s">"comm"</span><span class="p">,</span><span class="n">opt</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="s">"/prm/st/end_tr"</span><span class="p">,</span><span class="n">_</span><span class="p">(</span><span class="s">"Close opened transaction"</span><span class="p">),</span><span class="n">RWRW__</span><span class="p">,</span><span class="s">"root"</span><span class="p">,</span><span class="n">SDB_ID</span><span class="p">);</span> <span class="p">}</span> <span class="c1">//Processing for commands to the page</span> <span class="n">string</span> <span class="n">a_path</span> <span class="o">=</span> <span class="n">opt</span><span class="o">-></span><span class="n">attr</span><span class="p">(</span><span class="s">"path"</span><span class="p">);</span> <span class="k">if</span><span class="p">(</span><span class="n">a_path</span> <span class="o">==</span> <span class="s">"/prm/cfg/dbFsList"</span> <span class="o">&&</span> <span class="n">ctrChkNode</span><span class="p">(</span><span class="n">opt</span><span class="p">))</span> <span class="p">{</span> <span class="n">opt</span><span class="o">-></span><span class="n">childAdd</span><span class="p">(</span><span class="s">"el"</span><span class="p">)</span><span class="o">-></span><span class="n">setText</span><span class="p">(</span><span class="s">":memory:"</span><span class="p">);</span> <span class="n">TSYS</span><span class="o">::</span><span class="n">ctrListFS</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="n">addr</span><span class="p">(),</span> <span class="s">"db;"</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">a_path</span> <span class="o">==</span> <span class="s">"/prm/st/end_tr"</span> <span class="o">&&</span> <span class="n">ctrChkNode</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span><span class="s">"set"</span><span class="p">,</span><span class="n">RWRW__</span><span class="p">,</span><span class="s">"root"</span><span class="p">,</span><span class="n">SDB_ID</span><span class="p">,</span><span class="n">SEC_WR</span><span class="p">)</span> <span class="o">&&</span> <span class="n">reqCnt</span><span class="p">)</span> <span class="n">transCommit</span><span class="p">();</span> <span class="k">else</span> <span class="n">TBD</span><span class="o">::</span><span class="n">cntrCmdProc</span><span class="p">(</span><span class="n">opt</span><span class="p">);</span> <span class="p">}</span> </pre></div> <p>Перша половина цієї функції обÑлуговує інформаційні запити "info" з переліком та влаÑтивоÑÑ‚Ñми полів конфігурації. Друга половина обÑлуговує решту команд на отриманнÑ, вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð° інше. Виклик <b>TBD::cntrCmdProc(opt);</b> викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑƒÑпадкованого інтерфейÑу. Детальніше про Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтаних функцій дивітьÑÑ Ñƒ <a href="API.html#CntrNode" title="Special:MyLanguage/Documents/API">інтерфейÑÑ– управліннÑ</a>, а також у вихідних текÑтах Ñ–Ñнуючих модулів. </p><p>Об'єкт <b>TCntrNode</b> окрім функції інтерфейÑу ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð½Ð°Ð´Ð°Ñ” уніфіковані механізми контролю за модифікацією конфігурації об'єкта, завантаженнÑ, Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚Ð° Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ‚Ñ–Ð² конфігурації у Ñховищі. Ð”Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð¿Ð¾Ñ€Ñ†Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— даних об'єкта можна викориÑтовувати функції <b>modif()</b> та <b>modifG()</b>, а Ñпецифічні до Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð´Ñ–Ñ— із Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° розташовувати у віртуальні функції: </p> <ul><li> <i>void load_( TConfig *cfg );</i>, <i>void load_( );</i> — Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¾Ð±'єкта зі Ñховища.</li> <li> <i>void save_( );</i> — Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¾Ð±'єкта у Ñховищі.</li></ul> <p>Дії із конфігурацією типово відбуваютьÑÑ Ð·Ð° поÑередництвом об'єкта <a href="API.html#TConfig" title="Special:MyLanguage/Documents/API">TConfig</a>, Ñких міÑтить набір визначених влаÑтивоÑтей зі Ñтруктурою та значеннÑми. Ð”Ð»Ñ Ð¿Ñ€Ñмого Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑтей об'єкта Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð²Ñ–Ð½ уÑпадковуєтьÑÑ Ð²Ñ–Ð´ <b>TConfig</b>, а нові влаÑтивоÑÑ‚Ñ– додаютьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="n">fldAdd</span><span class="p">(</span><span class="k">new</span> <span class="n">TFld</span><span class="p">(</span><span class="s">"MOD_PRMS"</span><span class="p">,</span><span class="n">trS</span><span class="p">(</span><span class="s">"Module addition parameters"</span><span class="p">),</span><span class="n">TFld</span><span class="o">::</span><span class="n">String</span><span class="p">,</span><span class="n">TFld</span><span class="o">::</span><span class="n">FullText</span><span class="o">|</span><span class="n">TCfg</span><span class="o">::</span><span class="n">NoVal</span><span class="p">,</span><span class="s">"100000"</span><span class="p">));</span> </pre></div> <p>ЗавантаженнÑ/збереженнÑ/Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑтивоÑтей, вказаних у об'єкті <i>TConfig</i>, із/у/в Ñховище здійÑнюєтьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="n">TBDS</span><span class="o">::</span><span class="n">dataGet</span><span class="p">(</span><span class="n">fullDB</span><span class="p">(),</span> <span class="n">owner</span><span class="p">().</span><span class="n">nodePath</span><span class="p">()</span><span class="o">+</span><span class="n">tbl</span><span class="p">(),</span> <span class="o">*</span><span class="k">this</span><span class="p">);</span> <span class="n">TBDS</span><span class="o">::</span><span class="n">dataSet</span><span class="p">(</span><span class="n">fullDB</span><span class="p">(),</span> <span class="n">owner</span><span class="p">().</span><span class="n">nodePath</span><span class="p">()</span><span class="o">+</span><span class="n">tbl</span><span class="p">(),</span> <span class="o">*</span><span class="k">this</span><span class="p">);</span> <span class="n">TBDS</span><span class="o">::</span><span class="n">dataDel</span><span class="p">(</span><span class="n">fullDB</span><span class="p">(</span><span class="n">flag</span><span class="o">&</span><span class="n">NodeRemoveOnlyStor</span><span class="p">),</span> <span class="n">owner</span><span class="p">().</span><span class="n">nodePath</span><span class="p">()</span><span class="o">+</span><span class="n">tbl</span><span class="p">(),</span> <span class="o">*</span><span class="k">this</span><span class="p">,</span> <span class="n">TBDS</span><span class="o">::</span><span class="n">UseAllKeys</span><span class="p">);</span> </pre></div> <p>Де: </p> <ul><li> <i>fullDB()</i> — повна назва Ñховища у <a href="API.html#DataConcept" title="Special:MyLanguage/Documents/API">загальній формі</a>;</li> <li> <i>owner().nodePath()+tbl()</i> — загальний шлÑÑ… до вузла об'єкта у конфігураційному файлі, предÑтавлений таблицею;</li> <li> <i>*this</i> — цей об'єкт, уÑпадкований від <b>TConfig</b>.</li></ul> <p>Ð”Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ— налагоджувальних повідомлень <a href="Program_manual.html#Config" title="Special:MyLanguage/Documents/Program manual">відповідно до загальної концепції налаштувань</a> необхідно викориÑтовувати функцію <b>mess_debug()</b> з умовою виклику залежно від ділÑнки вихідного текÑту програми: </p> <ul><li> рідко викликувана ділÑнка — прÑмий виклик функції <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">mess_debug(...);</span>;</li> <li> чаÑто викликувана ділÑнка — умовний виклик <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">if(mess_lev() == TMess::Debug) mess_debug(...);</span>;</li> <li> критична до продуктивноÑÑ‚Ñ– ділÑнка коду — Ð¾Ð±Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ñƒ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <b>OSC_DEBUG</b>:</li></ul> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="cp">#ifdef OSC_DEBUG</span> <span class="n">mess_debug</span><span class="p">(...);</span> <span class="cp">#endif</span> </pre></div> </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/How_to/Create_module/uk">Documents/How_to/Create_module/uk</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>