<?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>Модулі/OPC UA - 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">Модулі/OPC UA</h1> </div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="uk"><div class="mw-pt-translate-header noprint" dir="ltr" lang="en">This page is a <span class="plainlinks"><a class="external text" href="http://oscada.org/wiki/index.php?title=Special:Translate&group=page-Modules%2FOPC+UA&action=page&filter=&language=uk" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Modules/OPC_UA" title="Modules/OPC UA">Modules/OPC UA</a> and the translation is 100% complete.</div><hr /><div class="mw-pt-languages" dir="ltr" lang="en"><div class="mw-pt-languages-list autonym"><a class="mw-pt-languages-ui mw-pt-progress mw-pt-progress--complete" href="../../en/Modules/OPC_UA.html" title="Modules/OPC UA (100% translated)">English</a> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../ru/Modules/OPC_UA.html" title="Модули/OPC UA (96% translated)">mRussian</a> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">УкраїнÑька</span></div></div> <table class="wikitable"> <tr> <th> Модуль </th> <th> Ім'Ñ </th> <th> ВерÑÑ–Ñ </th> <th> Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ </th> <th> Джерело </th> <th> Мови </th> <th> Платформи </th> <th> Тип </th> <th> Ðвтор </th></tr> <tr> <td> <a href="../Modules/OPC_UA.html" title="Special:MyLanguage/Modules/OPC UA">OPC_UA</a> </td> <td> Клієнт OPC-UA </td> <td> 2.8 </td> <td> GPL2 </td> <td> daq_OPC_UA.so </td> <td> en,uk,ru,de </td> <td> x86,x86_64,ARM </td> <td> Збір Даних </td> <td> Роман Савоченко </td></tr> <tr> <th colspan="9"> ÐžÐ¿Ð¸Ñ </th></tr> <tr> <td colspan="9"> Ðадає реалізацію OPC-UA клієнтÑького ÑервіÑу. </td></tr> <tr> <td> <a href="../Modules/OPC_UA.html" title="Special:MyLanguage/Modules/OPC UA">OPC_UA</a> </td> <td> Сервер OPC-UA </td> <td> 2.3 </td> <td> GPL2 </td> <td> daq_OPC_UA.so </td> <td> en,uk,ru,de </td> <td> x86,x86_64,ARM </td> <td> Протокол </td> <td> Роман Савоченко </td></tr> <tr> <th colspan="9"> ÐžÐ¿Ð¸Ñ </th></tr> <tr> <td colspan="9"> Ðадає реалізацію OPC-UA ÑервіÑу Ñерверу. </td></tr> <tr> <td> <a href="../Modules/OPC_UA.html" title="Special:MyLanguage/Modules/OPC UA">OPC_UA</a> </td> <td> Бібліотека реалізації OPC-UA у OpenSCADA </td> <td> 2.3 </td> <td> LGPL3 </td> <td> libOPC_UA.{h,cpp} </td> <td> en </td> <td> x86,x86_64,ARM </td> <td> Бібліотека </td> <td> Роман Савоченко </td></tr> <tr> <th colspan="9"> ÐžÐ¿Ð¸Ñ </th></tr> <tr> <td colspan="9"> Ðадає реалізацію протоколу OPC-UA в чаÑтині клієнта та Ñерверу, у виглÑді окремої бібліотеки. <ul><li> <b>Загальна працеміÑткіÑть:</b> > 50 <span title="людино-днів, 1ЛД — 10 годин">ЛД<sup style="color: blue">[!]</sup></span></li> <li> <b>СпонÑоруваннÑ, 2 роки ТП на 13 <span title="людино-днів, 1ЛД — 10 годин">ЛД<sup style="color: blue">[!]</sup></span>:</b> Дмитро Ликов, ТОВ Вектор</li> <li> <b>СпонÑоруваннÑ, перенеÑÐµÐ½Ð½Ñ ÐºÐ¾Ð´Ñƒ протоколу до LGPL бібліотеки, значного вдоÑÐºÐ¾Ð½Ð°Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° 8.4 <span title="людино-днів, 1ЛД — 10 годин">ЛД<sup style="color: blue">[!]</sup></span>:</b> ОлекÑандр Леута, MYSCADA</li> <li> <b>СпонÑоруваннÑ, роботу з UAExpert 1.4 та kepware2 на 0.9 <span title="людино-днів, 1ЛД — 10 годин">ЛД<sup style="color: blue">[!]</sup></span>:</b> УÑтьÑнцев Михайло</li> <li> <b>СпонÑоруваннÑ, <a class="external" href="http://oscada.org/wiki/Special:MyLanguage/Documents/Release_0.9/Update4#OPC_UA" title="Special:MyLanguage/Documents/Release 0.9/Update4">роботу з UAExpert 1.5, реалізації клієнтÑького Publish та Chunks, значної уніфікації</a>, підтримки Логічного Ð Ñ–Ð²Ð½Ñ Ñ‚Ð° цілковитої ревізії документу на 10.4 <span title="людино-днів, 1ЛД — 10 годин">ЛД<sup style="color: blue">[!]</sup></span>:</b> <a class="external" href="http://oscada.org/wiki/Special:MyLanguage/Fund" title="Special:MyLanguage/Fund">Фонд</a></li> <li> <a class="external text" href="http://oscada.org/en/development/tasks/posts/subsystem_daq/module_opc_ua_functions_extending/" rel="nofollow noreferrer noopener" target="_blank">Задача Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ</a></li> <li> <b><a href="../../en/To_do.html" title="Special:MyLanguage/Works/To do">Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ (To Do)</a>:</b></li></ul> <dl><dd> - додати автоматичне ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… транÑпортів та Ñ—Ñ… пре-конфігурацію із влаÑтивоÑтей об'єкту КінцевогоВузла;</dd> <dd> - детально переглÑнути ÑÐµÑ€Ð²Ñ–Ñ Publish щодо втрати пакетів та надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ Republish;</dd> <dd> - додати підтримку ÑервіÑу Ñ–Ñторії Ñерверної чаÑтини, дивлÑчиÑÑŒ та теÑтуючи Ñпільно із обміном UAExpert;</dd> <dd> - додати підтримку ÑервіÑу Ñ–Ñторії клієнтÑької чаÑтини.</dd></dl> </td></tr></table> <p>OPC (OLE for Process Control) — це ÑімейÑтво протоколів та технологій, Ñкі надають єдиний Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¾Ð±'єктами автоматизації та технологічними процеÑами. Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð° підтримку Ñпецифікацій OPC координує міжнародна некомерційна Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ <a class="external text" href="http://opcfoundation.org" rel="nofollow noreferrer noopener" target="_blank">OPC Foundation</a>, Ñку Ñтворено у 1994 році провідними виробниками заÑобів промиÑлової автоматизації. </p><p>У зв'Ñзку з тим, що значний вплив у організації OPC Foundation має ÐºÐ¾Ñ€Ð¿Ð¾Ñ€Ð°Ñ†Ñ–Ñ Microsoft, протоколи OPC до оÑтаннього чаÑу були одноплатформними та закритими, з причини прив'Ñзки до закритих технологій MS Windows. Однак, з недавніх пір, організацією OPC Foundation було Ñтворено такі багатоплатформні рішеннÑ, Ñк OPC XML-DA та OPC-UA. Ðайбільший Ñ–Ð½Ñ‚ÐµÑ€ÐµÑ Ð· них предÑтавлÑÑ” OPC-UA, Ñк уніфікуючий вÑÑ– протоколи ранніх верÑій у межах відкритих та багатоплатформних технологій. </p><p>Цей модуль реалізує підтримку інтерфейÑу та протоколу OPC-UA Ñк у виглÑді клієнтÑького ÑервіÑу, так Ñ– у виглÑді Ñерверу OPC-UA. КлієнтÑький ÑÐµÑ€Ð²Ñ–Ñ OPC-UA реалізуєтьÑÑ Ð¾Ð´Ð½Ð¾Ð¹Ð¼ÐµÐ½Ð½Ð¸Ð¼ модулем підÑиÑтеми "Збір даних", а Ñервер реалізуєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ підÑиÑтеми "Протоколи". ВеÑÑŒ код реалізації цим модулем Ñпецифіки протоколу OPC-UA було винеÑено, за проханнÑм кориÑтувачів, у окрему бібліотеку, Ñка розповÑюджуєтьÑÑ Ð¿Ñ–Ð´ ліцензією LGPL3. </p><p>Поточною верÑією цих модулів та бібліотеки реалізуютьÑÑ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð° чаÑтина протоколу та базові ÑервіÑи у небезпечному режимі та безпечних режимах політик "Base128Rsa15" та "Base256". Ðадалі плануєтьÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ€ÐµÑˆÑ‚Ð¸ ÑервіÑів OPC-UA, за потреби. </p><p>Хоча протокол OPC-UA Ñ– Ñ” багатоплатформним, його ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ‚Ð° SDK не Ñ” вільно-доÑтупними, а надаютьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ членам організації OPC Foundation. З цієї причини Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… модулів ÑтикнулаÑÑ Ð·Ñ– значними перепонами та проблемами. </p><p>По перше, протокол OPC-UA Ñкладний та Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¹Ð¾Ð³Ð¾ взагалі без Ñпецифікації дуже працеміÑтка. З цієї причини роботи над даними модулÑми тривалий Ñ‡Ð°Ñ Ð½Ðµ починалиÑÑ, та лише завдÑки ÑпонÑорÑькій допомозі однієї із організацій-члену OPC Foundation, проєкт OpenSCADA отримав документацію Ñпецифікації. При цьому SDK та вихідні текÑти ANSIC-API протоколу OPC-UA отримано не було з причини неÑуміÑноÑті Ñ—Ñ… ліцензії із GPL та, Ñк наÑлідок, потенційної загрози Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ— при роботі із вихідними текÑтами, що могло призвеÑти до подальших юридичних проблем при вільному розповÑюджені цих модулів. </p><p>По друге, навіть наÑвніÑть Ñпецифікації не дозволÑÑ” вирішити низку технічних питань без прикладів реалізації та можливоÑті перевірки на робочому прототипі клієнта та Ñервера OPC-UA. Ðаприклад, Ñаме технічні оÑобливоÑті реалізації алгоритмів Ñиметричного ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ñ–Ð² Ð´Ð»Ñ Ð½Ð¸Ñ… не дозволили реалізувати підтримку політик безпеки одразу. </p><p>Ð”Ð»Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ–Ð² викориÑтовувалоÑÑ Ð´ÐµÐ¼Ð¾Ð½Ñтраційне ПЗ фірми <a class="external text" href="http://www.unified-automation.com" rel="nofollow noreferrer noopener" target="_blank">Unified Automation</a>, у Ñкладі OPC-UA клієнту — UAExpert та Ñерверу — "OPC-UA Demo Server", із пакету SDK. У зв'Ñзку із поÑтійним розвитком Ñамого клієнту "UAExpert", у плані інтерпретації Ñпецифікації OPC-UA, нові його верÑÑ–Ñ— чаÑто мають проблеми при роботі із Ñервером OPC-UA від OpenSCADA. Ð’ цілому, результати ÑуміÑноÑті роботи із клієнтами та Ñерверами різних виробників можна отримати у <a href="#TableOfCompat">таблиці ÑуміÑноÑті</a>. </p> <div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div> <ul> <li class="toclevel-1 tocsection-1"><a href="#.D0.9F.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB_OPC-UA"><span class="tocnumber">1</span> <span class="toctext">Протокол OPC-UA</span></a></li> <li class="toclevel-1 tocsection-2"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D1.80.D0.B5.D0.B0.D0.BB.D1.96.D0.B7.D0.B0.D1.86.D1.96.D1.97_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.83"><span class="tocnumber">2</span> <span class="toctext">Модуль реалізації протоколу</span></a> <ul> <li class="toclevel-2 tocsection-3"><a href="#.D0.9E.D0.B1.D1.81.D0.BB.D1.83.D0.B3.D0.BE.D0.B2.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F_.D0.B7.D0.B0.D0.BF.D0.B8.D1.82.D1.96.D0.B2_.D0.B7.D0.B0_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.BE.D0.BC_OPC-UA"><span class="tocnumber">2.1</span> <span class="toctext">ОбÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² за протоколом OPC-UA</span></a></li> </ul> </li> <li class="toclevel-1 tocsection-4"><a href="#.D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.B7.D0.B1.D0.BE.D1.80.D1.83_.D0.B4.D0.B0.D0.BD.D0.B8.D1.85"><span class="tocnumber">3</span> <span class="toctext">Модуль збору даних</span></a> <ul> <li class="toclevel-2 tocsection-5"><a href="#.D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.B5.D1.80.D1.83"><span class="tocnumber">3.1</span> <span class="toctext">Об'єкт контролеру</span></a></li> <li class="toclevel-2 tocsection-6"><a href="#.D0.9F.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D0.B8"><span class="tocnumber">3.2</span> <span class="toctext">Параметри</span></a> <ul> <li class="toclevel-3 tocsection-7"><a href="#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D0.B8.D0.B9_.28_Prm.29"><span class="tocnumber">3.2.1</span> <span class="toctext">Стандартний (_Prm)</span></a></li> <li class="toclevel-3 tocsection-8"><a href="#.D0.9B.D0.BE.D0.B3.D1.96.D1.87.D0.BD.D0.B8.D0.B9_.28_PrmL.29"><span class="tocnumber">3.2.2</span> <span class="toctext">Логічний (_PrmL)</span></a></li> </ul> </li> <li class="toclevel-2 tocsection-9"><a href="#API_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F"><span class="tocnumber">3.3</span> <span class="toctext"><span>API кориÑтувацького програмуваннÑ</span></span></a></li> </ul> </li> <li class="toclevel-1 tocsection-10"><a href="#.D0.91.D1.96.D0.B1.D0.BB.D1.96.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_libOPC_UA"><span class="tocnumber">4</span> <span class="toctext">Бібліотека libOPC_UA</span></a> <ul> <li class="toclevel-2 tocsection-11"><a href="#.D0.A1.D0.BB.D1.83.D0.B6.D0.B1.D0.BE.D0.B2.D1.96_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82.D0.B8.2C_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D1.82.D0.B0_.D0.BA.D0.BB.D0.B0.D1.81_UA"><span class="tocnumber">4.1</span> <span class="toctext">Службові об'єкти, функції та ÐºÐ»Ð°Ñ UA</span></a> <ul> <li class="toclevel-3 tocsection-12"><a href="#.D0.94.D0.B0.D0.BD.D1.96"><span class="tocnumber">4.1.1</span> <span class="toctext">Дані</span></a></li> <li class="toclevel-3 tocsection-13"><a href="#.D0.97.D0.BE.D0.B2.D0.BD.D1.96.D1.88.D0.BD.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97"><span class="tocnumber">4.1.2</span> <span class="toctext">Зовнішні функції</span></a></li> <li class="toclevel-3 tocsection-14"><a href="#.D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.B0.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.BD.D0.BE.D0.B3.D0.BE_.D1.80.D0.BE.D0.B7.D0.B1.D0.BB.D0.BE.D0.BA.D0.BE.D0.B2.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F_POSIX_.D0.BC.D1.8E.D1.82.D0.B5.D0.BA.D1.81.D1.83_.D0.B4.D0.BB.D1.8F_OPC_.28OPCAlloc.29"><span class="tocnumber">4.1.3</span> <span class="toctext">Об'єкт автоматичного Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ POSIX мютекÑу Ð´Ð»Ñ OPC (OPCAlloc)</span></a></li> <li class="toclevel-3 tocsection-15"><a href="#.D0.9F.D0.BE.D0.BC.D0.B8.D0.BB.D0.BA.D0.B0_OPC_.28OPCError.29"><span class="tocnumber">4.1.4</span> <span class="toctext">Помилка OPC (OPCError)</span></a></li> <li class="toclevel-3 tocsection-16"><a href="#XML-.D1.82.D0.B5.D0.B3_.28XML_N.29"><span class="tocnumber">4.1.5</span> <span class="toctext">XML-тег (XML_N)</span></a></li> <li class="toclevel-3 tocsection-17"><a href="#.D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.B2.D1.83.D0.B7.D0.BB.D0.B0_OPC-UA_.28NodeId.29"><span class="tocnumber">4.1.6</span> <span class="toctext">Об'єкт вузла OPC-UA (NodeId)</span></a></li> <li class="toclevel-3 tocsection-18"><a href="#.D0.9A.D0.BE.D1.80.D0.B5.D0.BD.D0.B5.D0.B2.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.83_OPC-UA_.28UA.29"><span class="tocnumber">4.1.7</span> <span class="toctext">Кореневий об'єкт протоколу OPC-UA (UA)</span></a> <ul> <li class="toclevel-4 tocsection-19"><a href="#.D0.92.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.BD.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.96.D0.B2_.D0.B1.D0.B5.D0.B7.D0.BF.D0.B5.D0.BA.D0.B8_.28SecuritySetting.29"><span class="tocnumber">4.1.7.1</span> <span class="toctext">Включений об'єкт параметрів безпеки (SecuritySetting)</span></a></li> </ul> </li> </ul> </li> <li class="toclevel-2 tocsection-20"><a href="#.D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client-.3EUA.29"><span class="tocnumber">4.2</span> <span class="toctext">ОÑновний об'єкт Клієнту (Client->UA)</span></a> <ul> <li class="toclevel-3 tocsection-21"><a href="#.D0.9A.D0.BE.D0.BC.D0.BF.D0.BB.D0.B5.D0.BA.D1.81.D0.BD.D0.B8.D0.B9_.D1.81.D0.B5.D0.B0.D0.BD.D1.81_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client::SClntSess.29"><span class="tocnumber">4.2.1</span> <span class="toctext">КомплекÑний ÑÐµÐ°Ð½Ñ ÐšÐ»Ñ–Ñ”Ð½Ñ‚Ñƒ (Client::SClntSess)</span></a> <ul> <li class="toclevel-4 tocsection-22"><a href="#.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client::Subscr.29"><span class="tocnumber">4.2.1.1</span> <span class="toctext">ПідпиÑка Клієнту (Client::Subscr)</span></a> <ul> <li class="toclevel-5 tocsection-23"><a href="#.D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D1.96.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D1.83_.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client::Subscr::MonitItem.29"><span class="tocnumber">4.2.1.1.1</span> <span class="toctext">Елемент Моніторингу ПідпиÑки Клієнту (Client::Subscr::MonitItem)</span></a></li> </ul> </li> </ul> </li> </ul> </li> <li class="toclevel-2 tocsection-24"><a href="#.D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server-.3EUA.29"><span class="tocnumber">4.3</span> <span class="toctext">ОÑновний об'єкт Серверу (Server->UA)</span></a> <ul> <li class="toclevel-3 tocsection-25"><a href="#.D0.9A.D0.B0.D0.BD.D0.B0.D0.BB_.D0.91.D0.B5.D0.B7.D0.BF.D0.B5.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::SecCnl.29"><span class="tocnumber">4.3.1</span> <span class="toctext">Канал Безпеки Серверу (Server::SecCnl)</span></a></li> <li class="toclevel-3 tocsection-26"><a href="#.D0.A1.D0.B5.D0.B0.D0.BD.D1.81_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Sess.29"><span class="tocnumber">4.3.2</span> <span class="toctext">Ð¡ÐµÐ°Ð½Ñ Ð¡ÐµÑ€Ð²ÐµÑ€Ñƒ (Server::Sess)</span></a> <ul> <li class="toclevel-4 tocsection-27"><a href="#.D0.A2.D0.BE.D1.87.D0.BA.D0.B0_.D0.BF.D1.80.D0.BE.D0.B4.D0.BE.D0.B2.D0.B6.D0.B5.D0.BD.D0.BD.D1.8F_.D0.BE.D0.B3.D0.BB.D1.8F.D0.B4.D1.83_.D0.A1.D0.B5.D0.B0.D0.BD.D1.81.D1.83_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Sess::ContPoint.29"><span class="tocnumber">4.3.2.1</span> <span class="toctext">Точка Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¾Ð³Ð»Ñду СеанÑу Серверу (Server::Sess::ContPoint)</span></a></li> </ul> </li> <li class="toclevel-3 tocsection-28"><a href="#.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Subscr.29"><span class="tocnumber">4.3.3</span> <span class="toctext">ПідпиÑка Серверу (Server::Subscr)</span></a> <ul> <li class="toclevel-4 tocsection-29"><a href="#.D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D1.96.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D1.83_.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Subscr::MonitItem.29"><span class="tocnumber">4.3.3.1</span> <span class="toctext">Елемент Моніторингу ПідпиÑки Серверу (Server::Subscr::MonitItem)</span></a> <ul> <li class="toclevel-5 tocsection-30"><a href="#.D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.BD.D1.8F_.D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D1.83_.D0.9C.D0.BE.D0.BD.D1.96.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D1.83_.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Subscr::MonitItem::Val.29"><span class="tocnumber">4.3.3.1.1</span> <span class="toctext">Елемент Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð•Ð»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ Моніторингу ПідпиÑки Серверу (Server::Subscr::MonitItem::Val)</span></a></li> </ul> </li> </ul> </li> <li class="toclevel-3 tocsection-31"><a href="#.D0.9A.D1.96.D0.BD.D1.86.D0.B5.D0.B2.D0.B0_.D0.A2.D0.BE.D1.87.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::EP.29"><span class="tocnumber">4.3.4</span> <span class="toctext">Кінцева Точка Серверу (Server::EP)</span></a></li> </ul> </li> </ul> </li> <li class="toclevel-1 tocsection-32"><a href="#.D0.9F.D1.80.D0.B8.D0.B2.D0.B0.D1.82.D0.BD.D1.96_.D0.BA.D0.BB.D1.8E.D1.87.D1.96_.D1.82.D0.B0_.D1.81.D0.B5.D1.80.D1.82.D0.B8.D1.84.D1.96.D0.BA.D0.B0.D1.82.D0.B8"><span class="tocnumber">5</span> <span class="toctext">Приватні ключі та Ñертифікати</span></a></li> <li class="toclevel-1 tocsection-33"><a href="#.D0.97.D0.B0.D1.83.D0.B2.D0.B0.D0.B6.D0.B5.D0.BD.D0.BD.D1.8F"><span class="tocnumber">6</span> <span class="toctext">ЗауваженнÑ</span></a></li> <li class="toclevel-1 tocsection-34"><a href="#.D0.A2.D0.B0.D0.B1.D0.BB.D0.B8.D1.86.D1.8F_.D1.81.D1.83.D0.BC.D1.96.D1.81.D0.BD.D0.BE.D1.81.D1.82.D1.96_.D1.96.D0.B7_.D1.80.D0.B5.D0.B0.D0.BB.D1.96.D0.B7.D0.B0.D1.86.D1.96.D1.8F.D0.BC.D0.B8_OPC-UA_.D1.96.D0.BD.D1.88.D0.B8.D1.85_.D0.B2.D0.B8.D1.80.D0.BE.D0.B1.D0.BD.D0.B8.D0.BA.D1.96.D0.B2"><span class="tocnumber">7</span> <span class="toctext"><span>Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ ÑуміÑноÑті із реалізаціÑми OPC-UA інших виробників</span></span></a></li> <li class="toclevel-1 tocsection-35"><a href="#.D0.9F.D0.BE.D1.81.D0.B8.D0.BB.D0.B0.D0.BD.D0.BD.D1.8F"><span class="tocnumber">8</span> <span class="toctext">ПоÑиланнÑ</span></a></li> </ul> </div> <h2><span class="mw-headline" id=".D0.9F.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB_OPC-UA"><span class="mw-headline-number">1</span> Протокол OPC-UA</span></h2> <p>OPC-UA — це платформо-незалежний Ñтандарт, за допомогою Ñкого ÑиÑтеми та приÑтрої різного типу можуть взаємодіÑти шлÑхом відправки повідомлень між клієнтом та Ñервером через різноманітні типи мереж. Протокол підтримує безпечну взаємодію шлÑхом валідації клієнтів та Ñерверів, а також протидії атакам. OPC-UA визначає понÑÑ‚Ñ‚Ñ <i>СервіÑи</i>, Ñкі Ñервери можуть надавати, а також ÑервіÑи, Ñкі Ñервер підтримує Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñƒ. Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ”Ñ‚ÑŒÑÑ Ñƒ виглÑді типів даних, визначених OPC-UA та виробником, крім того Ñервера визначають об'єктну модель, Ð´Ð»Ñ Ñкої клієнти можуть здійÑнювати динамічний оглÑд. </p><p>OPC-UA надає Ð¿Ð¾Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ адреÑного проÑтору та ÑервіÑної моделі. Це дозволÑÑ” Ñерверу інтегрувати дані, Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ (Alarms), повідомлень (Events) та Ñ–Ñторію у цьому адреÑному проÑторі, а також надавати доÑтуп до них за поÑередництвом інтегрованих ÑервіÑів. СервіÑи також надають інтегровану модель безпеки. </p><p>OPC-UA дозволÑÑ” Ñерверам надавати Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñ–Ð² Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð², Ð´Ð»Ñ Ð´Ð¾Ñтупу до об'єктів із адреÑного проÑтору. OPC-UA допуÑкає Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… у різних форматах, включаючи бінарні Ñтруктури та XML-документи. Через адреÑний проÑтір клієнти можуть запитати у Ñервера метадані, Ñкі опиÑують формат даних. </p><p>OPC-UA додає підтримку множинної зв'ÑзноÑті між вузлами заміÑть проÑтого Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ–Ñ”Ñ€Ð°Ñ€Ñ…Ñ–Ñ‡Ð½Ñ–Ñтю. Така гнучкіÑть, у комбінації із визначеннÑм типів, дозволÑÑ” заÑтоÑовувати OPC-UA Ð´Ð»Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡ широкого Ñпектру проблем. </p><p>OPC-UA Ñпроєктовано Ð´Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ñ–Ð¹Ð½Ð¾Ñ— видачі даних. ОÑновна оÑобливіÑть вÑÑ–Ñ… OPC Ñерверів — ÑпроможніÑть видавати данні та події. </p><p>OPC-UA Ñпроєктовано Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ широкого діапазону Ñерверів, від проÑтіших ПЛК до промиÑлових Ñерверів. Ці Ñервери характеризуютьÑÑ ÑˆÐ¸Ñ€Ð¾ÐºÐ¸Ð¼ Ñпектром розмірів, продуктивноÑті, платформ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ‚Ð° функційної ємноÑті. Відтак, OPC-UA визначає вичерпну множину можливоÑтей та Ñервер може імплементувати підмножини цих можливоÑтей. Ð”Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ ÑуміÑноÑті, OPC-UA визначає підмножини, іменовані <i>ПрофілÑми</i>, Ñкі Ñервери можуть вказувати Ð´Ð»Ñ Ð¿Ð¾Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ. Клієнти можуть згодом виконувати оглÑд профілів Ñерверу та прокидати взаємодію із Ñервером, оÑнованим на профілÑÑ…. </p><p>OPC-UA ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñпроєктована Ñк Ñдро у шарі ізольованому від підлеглих комп'ютерних технологій та мережевих транÑпортів. Це дозволÑÑ” OPC-UA, при потребі, розширюватиÑÑ Ð½Ð° майбутні технології без Ð²Ñ–Ð´Ñ‚Ð¾Ñ€Ð³Ð½ÐµÐ½Ð½Ñ Ð¾Ñнови дизайну. Ðа цей чаÑ, Ñпецифікацією визначено два ÑпоÑоби ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: UA Binary та XML/text. Додатково визначено два типи транÑпортного шару: TCP та HTTP/SOAP. </p><p>OPC-UA Ñпроєктовано Ñк Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¼Ñ–Ð³Ñ€Ð°Ñ†Ñ–Ñ— із OPC клієнтів та Ñерверів, Ñкі оÑновані на Microsoft COM технологіÑÑ…. OPC COM Ñервери (DA, HDA та A&E) можуть бути легко віддзеркалені у OPС-UA. Виробники можуть ÑамоÑтійно здійÑнювати таку міграцію або ж рекомендувати кориÑтувачам викориÑтовувати обгортки та конвертори між цими протоколами. OPC-UA уніфікує попередні моделі у єдиному адреÑному проÑторі з єдиною множиною ÑервіÑів. </p> <h2><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D1.80.D0.B5.D0.B0.D0.BB.D1.96.D0.B7.D0.B0.D1.86.D1.96.D1.97_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.83"><span class="mw-headline-number">2</span> Модуль реалізації протоколу</span></h2> <p>Модуль Ñерверу міÑтить код реалізації Ñерверної чаÑтини OPC-UA — Ñерверних ÑервіÑів (РиÑ.1), у чаÑтині Ñпецифічній Ð´Ð»Ñ OpenSCADA, та викориÑтовуючи бібліотеку Ð´Ð»Ñ OPC-UA Ñпецифічної чаÑтини. Ð”Ð»Ñ Ð¿Ð¾Ð±ÑƒÐ´Ð¾Ð²Ð¸ OPC-UA Ñерверу доÑтатньо Ñтворити вхідний транÑпорт, за звичай це TCP-транÑпорт Ð¼Ð¾Ð´ÑƒÐ»Ñ <a href="../Modules/Sockets.html" title="Special:MyLanguage/Modules/Sockets">Sockets</a>, та обрати в ньому модуль даного протоколу, а також Ñконфігурувати хоча б один кінцевий вузол Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ, про що нижче. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:889px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prt_serv_uk.png"><img class="thumbimage" height="488" src="../files/OPC-UA_prt_serv_uk.png" width="887" /></a> <div class="thumbcaption">РиÑ.1. Загальний Ñтан "Серверу".</div></div></div></div> <p>Загальний Ñтан Серверу міÑтить лише перелік активних каналів безпеки. </p> <h3><span class="mw-headline" id=".D0.9E.D0.B1.D1.81.D0.BB.D1.83.D0.B3.D0.BE.D0.B2.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F_.D0.B7.D0.B0.D0.BF.D0.B8.D1.82.D1.96.D0.B2_.D0.B7.D0.B0_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.BE.D0.BC_OPC-UA"><span class="mw-headline-number">2.1</span> ОбÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² за протоколом OPC-UA</span></h3> <p>Вхідні запити до модулÑ-протоколу оброблÑютьÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ у відповідноÑті до Ñконфігурованих кінцевих вузлів OPC-UA (EndPoints) (риÑ.2). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:684px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prt_eps_uk.png"><img class="thumbimage" height="487" src="../files/OPC-UA_prt_eps_uk.png" width="682" /></a> <div class="thumbcaption">РиÑ.2. Кінцеві вузли протоколу.</div></div></div></div> <p>Кінцевий вузол протоколу OPC-UA це фактично об'єкт Ñерверу OPC-UA. Кінцеві вузли у OPC-UA можуть бути Ñк локальними, так Ñ– віддаленими. Локальні кінцеві вузли призначено Ð´Ð»Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑів Ñтанції OpenSCADA за протоколом OPC-UA, в той-же Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ñ– кінцеві вузли Ñлугують Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñк ÑервіÑу оглÑду доÑтупних OPC-UA вузлів, так Ñ– Ð´Ð»Ñ ÑˆÐ»ÑŽÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² до віддалених Ñтанцій. У цій верÑÑ–Ñ— Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÑƒÑ”Ñ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… кінцевих вузлів. </p><p>Загальна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÑ–Ð½Ñ†ÐµÐ²Ð¾Ð³Ð¾ вузла здійÑнюєтьÑÑ Ð½Ð° головній вкладці Ñторінки кінцевого вузла (риÑ.3) параметрами: </p> <ul><li> Стан вузла, а Ñаме: загальний ÑтатуÑ, перелік активних ÑеанÑів та підпиÑок, "Включено" та ім'Ñ Ð‘Ð”, Ñка міÑтить конфігурацію, з відÑтеженнÑм наÑвноÑті даних у різних Ñховищах та наданнÑм поÑлідовного Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ‚Ñ–Ð².</li> <li> Ідентифікатор, Ім'Ñ Ñ‚Ð° Ð¾Ð¿Ð¸Ñ Ð²ÑƒÐ·Ð»Ð°.</li> <li> Стан, у Ñкий переводити вузол при завантажені: "Включено".</li> <li> Тип ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ, на цей Ñ‡Ð°Ñ Ñ†Ðµ лише "Бінарний".</li> <li> URL кінцевої точки.</li> <li> Ðнонімний кориÑтувач ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð½Ð¾Ð½Ñ–Ð¼Ð½Ð¾Ð³Ð¾ доÑтупу, або лише Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð° порожнього.</li> <li> Сертифікат Ñерверу та приватний ключ у форматі PEM.</li></ul> <dl><dd><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Приховано у ввімкненому Ñтані.</dd></dl> <ul><li> Політики безпеки Ñерверу.</li></ul> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:910px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prt_ep_main_uk.png"><img class="thumbimage" height="928" src="../files/OPC-UA_prt_ep_main_uk.png" width="908" /></a> <div class="thumbcaption">РиÑ.3. Головна вкладка Ñторінки кінцевого вузла.</div></div></div></div> <h2><span class="mw-headline" id=".D0.9C.D0.BE.D0.B4.D1.83.D0.BB.D1.8C_.D0.B7.D0.B1.D0.BE.D1.80.D1.83_.D0.B4.D0.B0.D0.BD.D0.B8.D1.85"><span class="mw-headline-number">3</span> Модуль збору даних</span></h2> <p>Модуль збору даних надає можливіÑть Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° запиÑу атрибутів значеннÑ(13) вузлів типу "Змінна" у режимі прÑмого Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ð¾Ð¼ "Read" та аÑинхронним ÑервіÑом запиту "Publish". </p> <h3><span class="mw-headline" id=".D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.B5.D1.80.D1.83"><span class="mw-headline-number">3.1</span> Об'єкт контролеру</span></h3> <p>Ð”Ð»Ñ Ð´Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° даних OPC-UA ÑтворюєтьÑÑ Ñ‚Ð° конфігуруєтьÑÑ Ð¾Ð±'єкт контролеру в OpenSCADA. Приклад вкладки конфігурації об'єкту контролеру даного типу зображено на риÑунку 4. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:838px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_cntr_main_uk.png"><img class="thumbimage" height="821" src="../files/OPC-UA_cntr_main_uk.png" width="836" /></a> <div class="thumbcaption">РиÑ.4. Вкладка конфігурації об'єкту контролера OPC-UA.</div></div></div></div> <p>За допомогою цієї вкладки можна вÑтановити: </p> <ul><li> Стан об'єкту контролеру, а Ñаме: СтатуÑ, "Ввімкнено", "ВиконуєтьÑÑ" та ім'Ñ Ñховища, Ñке міÑтить конфігурацію.</li></ul> <dl><dd><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Ручний перезапуÑк ввімкненого об'єкту контролеру викликає примуÑове Ð¿ÐµÑ€ÐµÑ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ елементів моніторингу.</dd></dl> <ul><li> Ідентифікатор, ім'Ñ Ñ‚Ð° Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÐµÑ€Ñƒ.</li> <li> Стан "Ввімкнено" та "ВиконуєтьÑÑ", у Ñкий переводити об'єкт контролеру при завантажені.</li> <li> Політика Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° пріоритет задачі збору даних.</li> <li> Період Ñинхронізації конфігурації атрибутів параметрів з віддаленою Ñтанцією, а також Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ñƒ Ñпроб Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ.</li> <li> URL кінцевого вузла віддаленої Ñтанції — Ñервера OPC-UA. Ðа початку цю адреÑу можна вказати у виглÑді "<b>opc.tcp://{IP|name}:{port}</b>", піÑÐ»Ñ Ñ‡Ð¾Ð³Ð¾, у випадку Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¾Ð±'єкту контролера та наÑвноÑті вказаного OPC-UA вузла, з'ÑвитьÑÑ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ–Ñть обрати уточнену адреÑу.</li></ul> <dl><dd><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> ЧаÑто зуÑтрічаєтьÑÑ ÑитуаціÑ, коли уточнена адреÑа Ñ” Ñимвольною, Ñкий у цій мережі не резолвитьÑÑ, через некоректне Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñерверу. У таких випадках потрібно залишити початкову IP-адреÑу або ім'Ñ Ñке резолвитьÑÑ Ñƒ IP правильно.</dd></dl> <ul><li> Політика безпеки та режим безпеки повідомленнÑ.</li> <li> Сертифікат клієнту та приватний ключ у форматі PEM.</li></ul> <dl><dd><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Приховано у Ñтані виконаннÑ.</dd></dl> <ul><li> КориÑтувач та пароль Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— на Ñервері, порожнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ” анонімний доÑтуп.</li> <li> ÐÑинхронний запиÑ. Вмикає аÑинхронний Ð·Ð°Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½ до контролеру, у загальному циклі Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° піÑÐ»Ñ Ñамого Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…, блокуючи Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñаних значень на один цикл (до Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±ÑƒÑ„ÐµÑ€Ñƒ запиÑу).</li></ul> <dl><dd> <a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Цей режим також запобігає втраті запиÑаних даних за втрати Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‚Ð° запиÑані дані будуть передані щойно Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ відновлено.</dd></dl> <ul><li> ВикориÑтовувати функцію "Read", інакше активуєтьÑÑ Ñ‚Ð° викориÑтовуєтьÑÑ ÑÐµÑ€Ð²Ñ–Ñ Ð·Ð±Ð¾Ñ€Ñƒ даних Publish (аÑинхронний) протоколу OPC-UA.</li></ul> <p>З метою Ð¿Ð¾Ð»ÐµÐ³ÑˆÐµÐ½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— вузлів на віддаленій Ñтанції, а також вибору Ñ—Ñ… Ð´Ð»Ñ Ð²Ñтавки у об'єкті параметру контролеру, в Ñамому об'єкті контролеру передбачено вкладку навігації за вузлами віддаленої Ñтанції "ОглÑд вузлів Ñерверу", де можна пройти за деревом об'єктів та ознайомитиÑÑ Ð· Ñ—Ñ… атрибутами (риÑ.5). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:719px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_cntr_browse_uk.png"><img class="thumbimage" height="690" src="../files/OPC-UA_cntr_browse_uk.png" width="717" /></a> <div class="thumbcaption">РиÑ.5. Вкладка "ОглÑд вузлів Ñерверу" Ñторінки об'єкту контролеру OPC-UA.</div></div></div></div> <h3><span class="mw-headline" id=".D0.9F.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D0.B8"><span class="mw-headline-number">3.2</span> Параметри</span></h3> <p>Модуль збору даних надає два типи параметру: "Стандартний (_Prm)" та "Логічний (_PrmL)". Додатковими конфігураційними полÑми параметрів цього Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ”: </p> <ul><li> <i><b>Стандартний (_Prm)</b></i>: <ul><li> <i>Перелік атрибутів</i> — міÑтить Ñтруктурований перелік конфігурації атрибутів ModBUS.</li></ul></li> <li> <i><b>Логічний (_PrmL)</b></i>: <ul><li> <i>Шаблон параметру</i> — адреÑа шаблону параметру DAQ.</li></ul></li></ul> <h4><span class="mw-headline" id=".D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D0.B8.D0.B9_.28_Prm.29"><span class="mw-headline-number">3.2.1</span> Стандартний (_Prm)</span></h4> <p>Додатковим конфігураційним полем параметру даного типу (риÑ.6) Ñ” перелік вузлів OPC-UA Ñ– поле навігації за вузлами OPC-UA у один Ñ€Ñдок Ð´Ð»Ñ Ð²Ñтавки обраних вузлів типу "Змінна" до визначеного переліку. Ðтрибут у цьому переліку запиÑуєтьÑÑ Ñк "<b>{ns}:{nid}[|[{flg}][|{id}[|{name}]]]</b>".<br /> Де: </p> <ul><li> <i>ns</i> — проÑтір імен, чиÑлом; нульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути опущено;</li> <li> <i>nid</i> — ідентифікатор вузла, чиÑлом, Ñ€Ñдком, Ñ€Ñдком байт або GUID;</li> <li> <i>flg</i> — прапорці нездійÑÐ½ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ цільових даних на Ñервері: тип Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (b-Логічний,i-Ціле,f-Реальне,s-Ð Ñдок,o-Об'єкт), режим запиÑу/Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ (r-читати, w-пиÑати);</li> <li> <i>id</i> — ідентифікатор атрибуту що ÑтворюєтьÑÑ;</li> <li> <i>name</i> — ім'Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñƒ що ÑтворюєтьÑÑ.</li></ul> <p>Приклади: </p> <dl><dd><b>84</b> — кореневий вузол;</dd> <dd><b>3:"BasicDevices2"||var</b> — вузол базових приÑтроїв у проÑторі імен 3 та у виглÑді Ñ€Ñдка із прÑмим ІД атрибуту;</dd> <dd><b>4:"61626364"||var|Variable</b> — вузол у проÑторі імен 4 та у виглÑді Ñ€Ñдка байт із прÑмим ІД та назвою атрибуту;</dd> <dd><b>4:{40d95ab0-50d6-46d3-bffd-f55639b853d4}|irw|var|Variable</b> — вузол у проÑторі імен 4 Ñ– у виглÑді GUID із нездійÑненнÑм запиту цільових даних щодо Цілого ЧитаннÑ-ЗапиÑу та прÑмим ІД Ñ– назвою атрибуту.</dd></dl> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:778px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prm_uk.png"><img class="thumbimage" height="668" src="../files/OPC-UA_prm_uk.png" width="776" /></a> <div class="thumbcaption">РиÑ.6. Вкладка конфігурації об'єкту параметра OPC-UA.</div></div></div></div> <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><p>Відповідно до вказаного переліку вузлів виконуєтьÑÑ Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² параметру (риÑ.7). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:689px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prm_atr_uk.png"><img class="thumbimage" height="591" src="../files/OPC-UA_prm_atr_uk.png" width="687" /></a> <div class="thumbcaption">РиÑ.7. Вкладка атрибутів параметру.</div></div></div></div> <h4><span class="mw-headline" id=".D0.9B.D0.BE.D0.B3.D1.96.D1.87.D0.BD.D0.B8.D0.B9_.28_PrmL.29"><span class="mw-headline-number">3.2.2</span> Логічний (_PrmL)</span></h4> <p>Головну Ñторінку конфігурації параметру логічного типу предÑтавлено на риÑунку 8. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:784px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UALog_prm_uk.png"><img class="thumbimage" height="591" src="../files/OPC-UALog_prm_uk.png" width="782" /></a> <div class="thumbcaption">РиÑ.8. Вкладка конфігурації параметру логічного типа.</div></div></div></div> <p>Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ конфігурації шаблону (риÑ.9) запиÑуєтьÑÑ Ñƒ формі "<b>{ns}:{id}</b>".<br /> Де: </p> <ul><li> <i>ns</i> — проÑтір імен, чиÑлом; нульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути опущено;</li> <li> <i>id</i> — ідентифікатор вузла, чиÑлом, Ñ€Ñдком, Ñ€Ñдком байт або GUID.</li></ul> <p>Приклади: </p> <dl><dd><b>84</b> — кореневий вузол;</dd> <dd><b>3:"BasicDevices2"</b> — вузол базових приÑтроїв у проÑторі імен 3 та у виглÑді Ñ€Ñдка;</dd> <dd><b>4:"61626364"</b> — вузол у проÑторі імен 4 та у виглÑді Ñ€Ñдка байт;</dd> <dd><b>4:{40d95ab0-50d6-46d3-bffd-f55639b853d4}</b> — вузол у проÑторі імен 4 Ñ– у виглÑді GUID.</dd></dl> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:784px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UALog_tmpl_uk.png"><img class="thumbimage" height="591" src="../files/OPC-UALog_tmpl_uk.png" width="782" /></a> <div class="thumbcaption">РиÑ.9. Вкладка "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñƒ" параметра логічного типу.</div></div></div></div> <p>Модулем передбачена оÑоблива обробка низки атрибутів шаблону: </p> <ul><li> <i>f_frq</i> — чаÑтота обчиÑÐ»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ шаблону або Ñ‡Ð°Ñ Ð¿Ñ–ÑÐ»Ñ Ð¾Ñтаннього обчиÑÐ»ÐµÐ½Ð½Ñ (негативне у Ñекундах) Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° CRON, тільки читаннÑ.</li> <li> <i>f_start</i> — ознака першого Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ шаблону — запуÑк, тільки читаннÑ.</li> <li> <i>f_stop</i> — ознака оÑтаннього Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ шаблону — зупинка, тільки читаннÑ.</li> <li> <i>f_err</i> — помилка параметру, повний доÑтуп. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ атрибуту шаблону потраплÑÑ” до атрибуту помилки параметру "err". ЗапиÑати Ñюди <b>EVAL</b> Ð´Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ñті вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð·Ð¾Ð²Ð½Ñ– атрибуту "err" та вÑÑ–Ñ… інших у режимі Тільки Ð´Ð»Ñ Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ.</li> <li> <i>SHIFR</i> — Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑˆÐ¸Ñ„Ñ€Ñƒ параметру, тільки читаннÑ.</li> <li> <i>NAME</i> — Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð·Ð²Ð¸ параметру, тільки читаннÑ.</li> <li> <i>DESCR</i> — Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð¿Ð¸Ñу параметру, тільки читаннÑ.</li> <li> <i>this</i> — об'єкт даного параметру, дозволÑÑ” отримати доÑтуп до атрибутів параметру, наприклад, Ð´Ð»Ñ Ð´Ð¾Ñтупу до архівів-Ñ–Ñторії.</li></ul> <p>Відповідно до шаблону, що лежить у оÑнові параметру, ми отримуємо набір атрибутів параметру (риÑ.10). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:784px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UALog_prm_atr_uk.png"><img class="thumbimage" height="591" src="../files/OPC-UALog_prm_atr_uk.png" width="782" /></a> <div class="thumbcaption">РиÑ.10. Вкладка атрибутів параметру логічного типу.</div></div></div></div> <h3><span class="mw-headline" id="API_.D0.BA.D0.BE.D1.80.D0.B8.D1.81.D1.82.D1.83.D0.B2.D0.B0.D1.86.D1.8C.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F"><span class="mw-headline-number">3.3</span> <span id="UserAPI" title="#UserAPI">API кориÑтувацького програмуваннÑ</span></span></h3> <p>У зв'Ñзку із підтримкою параметрів логічного типу, має ÑÐµÐ½Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð½Ð¸Ð·ÐºÐ¸ функцій кориÑтувацького API Ð´Ð»Ñ Ñ—Ñ… виклику із шаблону логічного параметру. </p><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.91.D1.96.D0.B1.D0.BB.D1.96.D0.BE.D1.82.D0.B5.D0.BA.D0.B0_libOPC_UA"><span class="mw-headline-number">4</span> Бібліотека libOPC_UA</span></h2> <p>ÒрунтуючиÑÑŒ на напрацюваннÑÑ… цього модулÑ, протокольний код OPC-UA було винеÑено до окремої бібліотеки та опубліковано під ліцензією LGPLv3. Такі дії виконано з метою надати можливіÑть проÑтого Ð´Ð¾Ð´Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ протоколу OPC-UA Ñтороннім проєктам. Бібліотека предÑтавлена двома файлами libOPC_UA.h, libOPC_UA.cpp; підтримуєтьÑÑ Ñ‚Ð° міÑтитьÑÑ Ñƒ Ñкладі цього модулÑ, тобто актуальну верÑÑ–ÑŽ Ви можете завантажити тут: <a class="external free" href="http://oscada.org/svn/trunk/OpenSCADA/src/moduls/daq/OPC_UA/libOPC_UA" rel="nofollow noreferrer noopener" target="_blank">http://oscada.org/svn/trunk/OpenSCADA/src/moduls/daq/OPC_UA/libOPC_UA</a>. </p><p>Бібліотеку, Ñк Ñ– цей модуль, напиÑано на мові Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ C++. Статичну діаграму клаÑів, Ñка відображає архітектуру бібліотеки, наведено на риÑунку 11. Згідно до діаграми клаÑів, бібліотеку виконано у проÑторі імен "OPC", а архітектурно Ñ—Ñ— можна поділити на клієнтÑьку "Client" та Ñерверну "Server" чаÑтини, Ñкі уÑпадковано від загального клаÑу протоколу "UA". Крім безпоÑередньо клаÑів протоколу "OPC-UA" бібліотека включає в Ñебе набір функцій та клаÑів Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ або Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… протоколу, окремо з Ñких треба відзначити ÐºÐ»Ð°Ñ Ð²ÑƒÐ·Ð»Ð° мови XML "XML_N", викориÑтаний Ð´Ð»Ñ ÑƒÐ½Ñ–Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— звернень до API бібліотеки. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:400px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_libOPCUA_class.png"><img class="thumbimage" height="311" src="../../en/files/OPC-UA_libOPCUA_class.png" width="398" /></a> <div class="thumbcaption">РиÑ.11. Статична діаграма клаÑів бібліотеки libOPC_UA.</div></div></div></div> <p>ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐºÐ¸ загалом полÑгає у Ñпадкуванні клаÑу "Client" та/або "Server" згідно до функцій кінцевої програми та наÑтупної реалізації віртуальних функцій влаÑтивоÑтей клієнта/Ñервера у контекÑті протоколу OPC-UA, а також транÑпортної чаÑтини комунікації, тобто — підключеннÑ/Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ TCP-Ñокету та передачу/Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð½ÐµÑтруктурованого потоку даних. ÐаÑтупні запити, та обробка Ñ—Ñ… даних (Ð´Ð»Ñ Ñерверу), здійÑнюєтьÑÑ Ñ‡ÐµÑ€ÐµÐ· виклик функції запиту ÑервіÑу <i>reqService()</i> та/або обробки віртуальної функції запиту даних <i>reqData()</i>, тобто, фактично, Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñƒ модель даних додатку. </p><p>ПіÑÐ»Ñ Ð´Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾ клієнту підтримки аÑинхронного ÑервіÑу Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… ÑервіÑом "Publish", Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— доповнивÑÑ Ð¿ÐµÑ€Ñ–Ð¾Ð´Ð¸Ñ‡Ð½Ð¸Ð¼ викликом функції <i>Client::poll()</i> з метою Ð¾Ð¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ð½Ð½Ñ Ð°Ñинхронного ÑервіÑу. Функцію <i>Client::poll()</i> також забезпечено підтримкою Ñинхронного режиму роботи, окремим аргументом, через уніфіковану інфраÑтруктуру підпиÑки-реєÑтрації елементів моніторингу, але функцією "Read". Тобто, наразі доÑтатньо зареєÑтрувати вÑÑ– елементи моніторингу функцією <i>Client::Subscr::monitoredItemAdd()</i> а потім викликати функцію <i>Client::poll()</i> Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ—Ñ… даних у потрібному режимі. </p><p>ПіÑÐ»Ñ Ð¾Ñтаннього переглÑду коду у верÑÑ–Ñ— 2, Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñерверної чаÑтини додатково потребує обов'Ñзкового запуÑку окремого потоку обробки вÑÑ–Ñ… підпиÑок, з викликом із нього функції <i>Server::EP::subScrCycle()</i> та аргументом лічильника циклів Ð¾Ð¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок — періодичніÑть виклику <i>Server::EP::subscrProcPer()</i>. </p> <h3><span class="mw-headline" id=".D0.A1.D0.BB.D1.83.D0.B6.D0.B1.D0.BE.D0.B2.D1.96_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82.D0.B8.2C_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97_.D1.82.D0.B0_.D0.BA.D0.BB.D0.B0.D1.81_UA"><span class="mw-headline-number">4.1</span> Службові об'єкти, функції та ÐºÐ»Ð°Ñ UA</span></h3> <h4><span class="mw-headline" id=".D0.94.D0.B0.D0.BD.D1.96"><span class="mw-headline-number">4.1.1</span> Дані</span></h4> <p>Типи реалізацій (enum — SerializerType): </p> <ul><li> <i>ST_Binary = 0</i> — бінарний.</li></ul> <p>Типи запиÑу Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки (enum — SC_ReqTP): </p> <ul><li> <i>SC_ISSUE = 0</i> — викликаючий;</li> <li> <i>SC_RENEW = 1</i> — оновлюючий.</li></ul> <p>Режими безпеки Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ (enum — MessageSecurityMode): </p> <ul><li> <i>MS_None = 1</i> — без безпеки;</li> <li> <i>MS_Sign = 2</i> — підпиÑ;</li> <li> <i>MS_SignAndEncrypt = 3</i> — Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñ‚Ð° шифруваннÑ.</li></ul> <p>Типи аутентифікації (enum — AuthTp): </p> <ul><li> <i>A_Anon = 0</i> — анонімно;</li> <li> <i>A_UserNm = 1</i> — кориÑтувач+пароль;</li> <li> <i>A_Cert = 2</i> — Ñертифікат.</li></ul> <p>КлаÑи вузлів (enum — NodeClasses): </p> <ul><li> <i>NC_Object = 1</i> — об'єкт;</li> <li> <i>NC_Variable = 2</i> — змінна;</li> <li> <i>NC_Method = 4</i> — метод;</li> <li> <i>NC_ObjectType = 8</i> — тип об'єкта;</li> <li> <i>NC_VariableType = 16</i> — тип змінної;</li> <li> <i>NC_ReferenceType = 32</i> — тип поÑиланнÑ;</li> <li> <i>NC_DataType = 64</i> — тип даних;</li> <li> <i>NC_View = 128</i> — вид.</li></ul> <p>ÐапрÑми оглÑду (enum — BrowseDirection): </p> <ul><li> <i>BD_FORWARD = 0</i> — вперед;</li> <li> <i>BD_INVERSE = 1</i> — назад;</li> <li> <i>BD_BOTH = 2</i> — вперед та назад.</li></ul> <p>Мітка чаÑу Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ (enum — TimestampsToReturn): </p> <ul><li> <i>TS_SOURCE = 0</i> — джерела;</li> <li> <i>TS_SERVER = 1</i> — Ñервера;</li> <li> <i>TS_BOTH = 2</i> — джерела та Ñервера;</li> <li> <i>TS_NEITHER = 3</i> — відÑутнÑ.</li></ul> <p>ДоÑтуп (enum — Access): </p> <ul><li> <i>ACS_Read = 0x01</i> — читаннÑ;</li> <li> <i>ACS_Write = 0x02</i> — запиÑ;</li> <li> <i>ACS_HistRead = 0x04</i> — Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ñторії;</li> <li> <i>ACS_HistWrite = 0x08</i> — Ð·Ð°Ð¿Ð¸Ñ Ñ–Ñторії;</li> <li> <i>ACS_SemChange = 0x10</i> — ?.</li></ul> <p>Елементи маÑки опиÑу оглÑдового запиту (enum — RefDscrResMask): </p> <ul><li> <i>RdRm_RefType = 0x01</i> — тип поÑиланнÑ;</li> <li> <i>RdRm_IsForward = 0x02</i> — напрÑмок;</li> <li> <i>RdRm_NodeClass = 0x04</i> — ÐºÐ»Ð°Ñ Ð²ÑƒÐ·Ð»Ð°;</li> <li> <i>RdRm_BrowseName = 0x08</i> — ім'Ñ Ð¾Ð³Ð»Ñду;</li> <li> <i>RdRm_DisplayName = 0x10</i> — ім'Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ;</li> <li> <i>RdRm_TypeDef = 0x20</i> — тип визначеннÑ.</li></ul> <p>Ідентифікатори атрибутів вузла (enum — AttrIds): </p> <ul><li> <i>Aid_Error = 0</i> — помилка;</li> <li> <i>AId_NodeId = 1</i> — ідентифікатор вузла;</li> <li> <i>AId_NodeClass = 2</i> — ÐºÐ»Ð°Ñ Ð²ÑƒÐ·Ð»Ð°;</li> <li> <i>AId_BrowseName = 3</i> — ім'Ñ Ð¾Ð³Ð»Ñду;</li> <li> <i>AId_DisplayName = 4</i> — ім'Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ;</li> <li> <i>AId_Descr = 5</i> — опиÑ;</li> <li> <i>AId_WriteMask = 6</i> — маÑка запиÑу;</li> <li> <i>AId_UserWriteMask = 7</i> — маÑка запиÑу кориÑтувача;</li> <li> <i>AId_IsAbstract = 8</i> — абÑтрактніÑть;</li> <li> <i>AId_Symmetric = 9</i> — ÑиметричніÑть;</li> <li> <i>AId_InverseName = 10</i> — інверÑне ім'Ñ;</li> <li> <i>AId_ContainsNoLoops = 11</i> — відÑутніÑть петель;</li> <li> <i>AId_EventNotifier = 12</i> — Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ð¹;</li> <li> <i>AId_Value = 13</i> — значеннÑ;</li> <li> <i>AId_DataType = 14</i> — тип даних;</li> <li> <i>AId_ValueRank = 15</i> — ранг значеннÑ;</li> <li> <i>AId_ArrayDimensions = 16</i> — розмірніÑть маÑиву;</li> <li> <i>AId_AccessLevel = 17</i> — рівень доÑтупу;</li> <li> <i>AId_UserAccessLevel = 18</i> — рівень доÑтупу кориÑтувача;</li> <li> <i>AId_MinimumSamplingInterval = 19</i> — мінімальний інтервал вимірюваннÑ;</li> <li> <i>AId_Historizing</i> — архівуваннÑ;</li> <li> <i>AId_Executable</i> — виконуваний;</li> <li> <i>AId_UserExecutable</i> — виконуваний кориÑтувачем.</li></ul> <p>Стани підпиÑки (enum — SubScrSt): </p> <ul><li> <i>SS_CUR = 0</i> — поточне (не мінÑти командою);</li> <li> <i>SS_CLOSED = 1</i> — закрито;</li> <li> <i>SS_CREATING = 2</i> — ÑтвореннÑ;</li> <li> <i>SS_NORMAL = 3</i> — нормальний;</li> <li> <i>SS_LATE = 4</i> — запізнілий;</li> <li> <i>SS_KEEPALIVE = 5</i> — Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¶Ð¸Ð²Ð¸Ð¼.</li></ul> <p>Режими моніторингу (enum — MonitoringMode): </p> <ul><li> <i>MM_CUR = -1</i> — поточне (не мінÑти командою);</li> <li> <i>MM_DISABLED = 0</i> — відімкнене;</li> <li> <i>MM_SAMPLING = 1</i> — вимірюваннÑ;</li> <li> <i>MM_REPORTING = 2</i> — звітніÑть.</li></ul> <h4><span class="mw-headline" id=".D0.97.D0.BE.D0.B2.D0.BD.D1.96.D1.88.D0.BD.D1.96_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D1.96.D1.97"><span class="mw-headline-number">4.1.2</span> Зовнішні функції</span></h4> <p>До бібліотеки включено низку зовнішніх функцій об'єкту <a class="external" href="http://oscada.org/wiki/Documents/API#TSYS" title="Documents/API">TSYS</a> Ñдра OpenSCADA Ð´Ð»Ñ ÑÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð° уніфікації низки внутрішніх операцій: </p> <ul><li> <i>int64_t curTime( clockid_t clc = CLOCK_REALTIME );</i> — Поточний Ñ‡Ð°Ñ Ñƒ мікроÑекундах Ð´Ð»Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ° <i>clc</i>, з початку епохи Unix (01.01.1970) Ð´Ð»Ñ CLOCK_REALTIME.</li> <li> <i>string int2str( int val );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†Ñ–Ð»Ð¾Ð³Ð¾ знакового у Ñ€Ñдок в деÑÑтковому предÑтавлені.</li> <li> <i>int str2int( const string &val );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ñдка <i>val</i> в деÑÑтковому, шіÑтнадцÑтковому або віÑімковому предÑтавлені у ціле знакове.</li> <li> <i>string uint2str( unsigned val );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ†Ñ–Ð»Ð¾Ð³Ð¾ беззнакового у Ñ€Ñдок в деÑÑтковому предÑтавлені.</li> <li> <i>unsigned long str2uint( const string &val );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ñдка <i>val</i> в деÑÑтковому, шіÑтнадцÑтковому або віÑімковому предÑтавлені у ціле беззнакове.</li> <li> <i>string ll2str( int64_t val );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð¾Ð²Ð³Ð¾Ð³Ð¾ цілого (64біт) у Ñ€Ñдок в деÑÑтковому предÑтавлені.</li> <li> <i>string real2str( double val, int prec = 15, char tp = 'g' );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ із точніÑтю <i>prec</i> знаків Ñ– типом <i>tp</i> у Ñ€Ñдок.</li> <li> <i>double str2real( const string &val );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ñдка <i>val</i> у реальне.</li> <li> <i>string strParse( const string &path, int level, const string &sep, int *off = NULL, bool mergeSepSymb = false );</i> — Розбір Ñ€Ñдку <i>path</i> на Ñкладові, відокремлені роздільником <i>sep</i>, об'єднуючи одноÑимвольні <i>mergeSepSymb</i>, починаючи зі Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ <i>off</i> Ñ– контролюючи Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ в ньому ж.</li> <li> <i>string strLine( const string &str, int level, int *off = NULL );</i> — Розбір багаторÑдкового текÑту на окремі Ñ€Ñдки, починаючи зі Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ <i>off</i> Ñ– контролюючи Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ в ньому ж.</li> <li> <i>string strMess( const char *fmt, ... );</i> — Ð¤Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñдка за шаблоном <i>fmt</i> та аргументами, реалізовано на оÑнові "sprintf".</li></ul> <h4><span class="mw-headline" id=".D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.B0.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.BD.D0.BE.D0.B3.D0.BE_.D1.80.D0.BE.D0.B7.D0.B1.D0.BB.D0.BE.D0.BA.D0.BE.D0.B2.D1.83.D0.B2.D0.B0.D0.BD.D0.BD.D1.8F_POSIX_.D0.BC.D1.8E.D1.82.D0.B5.D0.BA.D1.81.D1.83_.D0.B4.D0.BB.D1.8F_OPC_.28OPCAlloc.29"><span class="mw-headline-number">4.1.3</span> Об'єкт автоматичного Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÐ¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ POSIX мютекÑу Ð´Ð»Ñ OPC (OPCAlloc)</span></h4> <p>Цей об'єкт ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÑŽÑ‚ÐµÐºÑом Ñ” копією об'єкту "MtxAlloc" Ð´Ð»Ñ Ñдра OpenSCADA. </p><p><b>Публічні методи:</b> </p> <ul><li> <i>OPCAlloc( pthread_mutex_t &iM, bool ilock = false );</i> — Ð†Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¾Ð±'єкту автоматичного Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÑŽÑ‚ÐµÐºÑу <i>iM</i>, Ñтвореного раніш, із блокуваннÑм при Ñтворені за <i>lock</i>.</li> <li> <i>int lock( );</i> — Ð—Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÑурÑу, Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð½ÑƒÐ»Ñ Ð¿Ñ€Ð¸ вдалому виконанні.</li> <li> <i>int unlock( );</i> — Ð—Ð²Ñ–Ð»ÑŒÐ½ÐµÐ½Ð½Ñ Ñ€ÐµÑурÑу, Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð½ÑƒÐ»Ñ Ð¿Ñ€Ð¸ вдалому виконанні.</li> <li> <i>int tryLock( );</i> — Спроба Ð·Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÑурÑу без Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ð»ÑŒÐ½ÐµÐ½Ð½Ñ, Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð½ÑƒÐ»Ñ Ð¿Ñ€Ð¸ вдалому виконанні.</li></ul> <h4><span class="mw-headline" id=".D0.9F.D0.BE.D0.BC.D0.B8.D0.BB.D0.BA.D0.B0_OPC_.28OPCError.29"><span class="mw-headline-number">4.1.4</span> Помилка OPC (OPCError)</span></h4> <p>Об'єкт помилки "OPCError" Ñ” урізаною копією об'єкту <a class="external" href="http://oscada.org/wiki/Documents/API#TError" title="Documents/API">TError</a> Ñдра OpenSCADA. </p><p><b>Публічні методи:</b> </p> <ul><li> <i>OPCError( const char *fmt, ... );</i> — КонÑтруктор типової помилки без коду.</li> <li> <i>OPCError( int cod, const char *fmt, ... );</i> — КонÑтруктор типової помилки із кодом помилки.</li></ul> <p><b>Публічні атрибути:</b> </p> <ul><li> <i>int cod;</i> — Код помилки.</li> <li> <i>string mess;</i> — ТекÑÑ‚ помилки.</li></ul> <h4><span class="mw-headline" id="XML-.D1.82.D0.B5.D0.B3_.28XML_N.29"><span class="mw-headline-number">4.1.5</span> XML-тег (XML_N)</span></h4> <p>Об'єкт "XML_N" Ñ” урізаною копією об'єкту <a class="external" href="http://oscada.org/wiki/Documents/API#XMLNode" title="Documents/API">XMLNode</a> Ñдра OpenSCADA. </p><p><b>Публічні методи:</b> </p> <ul><li> <i>XML_N( const string &name = "" );</i> — Ð†Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐ³Ñƒ з назвою <i>name</i>.</li> <li> <i>XML_N( const XML_N &nd );</i> — Копіюючий конÑтруктор.</li> <li> <i>XML_N &operator=( const XML_N &prm );</i> — ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð³Ñ–Ð»ÐºÐ¸ XML-дерева із <i>prm</i>.</li> <li> <i>string name( ) const;</i> — Ðазва тегу.</li> <li> <i>XML_N* setName( const string &s );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð·Ð²Ð¸ тегу у <i>s</i>.</li> <li> <i>string text( bool childs = false, bool recursive = false ) const;</i> — ТекÑÑ‚ тегу, <i>childs</i> — Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÑту із Ñпеціалізованих вузлів текÑту.</li> <li> <i>XML_N* setText( const string &s, bool childs = false );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑту тегу у <i>s</i>, <i>childs</i> — Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑту у Ñпеціалізованих вузол текÑту.</li> <li> <i>void attrList( vector<string> & list ) const;</i> — Перелік атрибутів <i>list</i> у тегу.</li> <li> <i>XML_N* attrDel( const string &name );</i> — Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñƒ <i>name</i>.</li> <li> <i>void attrClear( );</i> — ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² тегу.</li> <li> <i>string attr( const string &name, bool caseSens = true ) const;</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñƒ <i>name</i>.</li> <li> <i>XML_N* setAttr( const string &name, const string &val );</i> — Ð’ÑтановленнÑ/ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñƒ <i>name</i> зі значеннÑм <i>val</i>.</li> <li> <i>XML_N* clear( );</i> — ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚ÐµÐ³Ñƒ (рекурÑивно, включаючи вÑÑ– вкладеннÑ).</li> <li> <i>bool childEmpty( ) const;</i> — Перевірка на відÑутніÑть вкладених тегів.</li> <li> <i>unsigned childSize( ) const;</i> — КількіÑть вкладених тегів.</li> <li> <i>void childAdd( XML_N *nd ); XML_N* childAdd( const string &name = "" );</i> — Ð”Ð¾Ð´Ð°Ð½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ тегу.</li> <li> <i>int childIns( unsigned id, XML_N *nd );</i> — Ð’Ñтавка вкладеного тегу <i>nd</i> у позицію <i>id</i>, негативне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>id</i> веде відлік з кінцÑ.</li> <li> <i>XML_N* childIns( unsigned id, const string &name = "" );</i> — Ð’Ñтавка вкладеного тегу з ім'Ñм <i>name</i> у позицію <i>id</i>, негативне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>id</i> веде відлік з кінцÑ.</li> <li> <i>void childDel( const unsigned id );</i> — Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ тегу <i>id</i>, Ðегативне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>id</i> веде відлік з кінцÑ.</li> <li> <i>void childDel( XML_N *nd );</i> — Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ тегу за його адреÑою <i>nd</i>.</li> <li> <i>XML_N* childClear( const string &name = "" );</i> — ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ тегу <i>name</i>.</li> <li> <i>XML_N* childGet( const int, bool noex = false ) const;</i> — Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ тегу за порÑдковим номером.</li> <li> <i>XML_N* childGet( const string &name, const int numb = 0, bool noex = false ) const;</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ <i>numb</i> порÑдкового тегу за іменем тегу <i>name</i>, <i>noex</i> вказує на заборону генерації Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñƒ випадку відÑутноÑті тегу.</li> <li> <i>XML_N* childGet( const string &attr, const string &name, bool noex = false ) const;</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ тегу за значеннÑм <i>name</i> атрибуту <i>attr</i>, <i>noex</i> вказує на заборону генерації Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñƒ випадку відÑутноÑті тегу.</li> <li> <i>XML_N* getElementBy( const string &attr, const string &val );</i> — Пошук вкладеного вузла за значеннÑм <i>val</i> атрибуту <i>attr</i>.</li> <li> <i>XML_N* parent( );</i> — БатьківÑький тег цього тегу.</li> <li> <i>XML_N* root( );</i> — Кореневий тег цього тегу.</li></ul> <h4><span class="mw-headline" id=".D0.9E.D0.B1.27.D1.94.D0.BA.D1.82_.D0.B2.D1.83.D0.B7.D0.BB.D0.B0_OPC-UA_.28NodeId.29"><span class="mw-headline-number">4.1.6</span> Об'єкт вузла OPC-UA (NodeId)</span></h4> <p><b>Дані:</b><br /> Типи даних (enum — NodeId::Type): </p> <ul><li> <i>NodeId::Numeric</i> — номер.</li> <li> <i>NodeId::String</i> — Ñ€Ñдок.</li> <li> <i>NodeId::Guid</i> — глобальний унікальний ідентифікатор.</li> <li> <i>NodeId::Opaque</i> — opaque.</li></ul> <p><b>Публічні методи:</b> </p> <ul><li> <i>NodeId( uint32_t n, uint16_t ns = 0 );</i> — ЧиÑельний ініціюючий конÑтруктор Ð´Ð»Ñ Ñ‡Ð¸Ñла <i>n</i> у проÑторі назв <i>ns</i>.</li> <li> <i>NodeId( const string &str, uint16_t ns = 0, Type tp = String );</i> — Строковий ініціюючий конÑтруктор Ð´Ð»Ñ Ñ€Ñдка <i>str</i> у проÑторі назв <i>ns</i> з типом <i>tp</i>.</li> <li> <i>NodeId( const NodeId &node );</i> — Копіюючий конÑтруктор об'єкту.</li> <li> <i>NodeId( );</i> — ДеÑтруктор.</li> <li> <i>bool operator==( const NodeId &node );</i> — ПорівнÑÐ½Ð½Ñ Ð¾Ð±'єктів.</li> <li> <i>NodeId &operator=( const NodeId &node );</i> — ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єкту.</li> <li> <i>Type type( ) const;</i> — Тип вузла.</li> <li> <i>bool isNull( ) const;</i> — Вузол нульовий — неініційований.</li> <li> <i>uint16_t ns( ) const;</i> — ПроÑтір назв.</li> <li> <i>uint32_t numbVal( ) const;</i> — ЧиÑельні значеннÑ.</li> <li> <i>string strVal( ) const;</i> — Строкові значеннÑ.</li> <li> <i>void setNs( uint16_t ns );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñтору назв у <i>ns</i>.</li> <li> <i>void setNumbVal( uint32_t n );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð¸Ñельного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>n</i>.</li> <li> <i>void setStrVal( const string &str, Type tp = String );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñтрокового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>str</i> з типом <i>tp</i>.</li> <li> <i>static NodeId fromAddr( const string &strAddr, bool strictStr = false, int *off = NULL );</i> — Ð¤Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єкту вузла із адреÑи <i>strAddr</i>, Ñк Ñуворий Ñ€Ñдок <i>strictStr</i> та із кінцем розбору адреÑи у <i>off</i>.</li> <li> <i>string toAddr( ) const;</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ð´Ñ€ÐµÑи об'єкту вузла.</li></ul> <h4><span class="mw-headline" id=".D0.9A.D0.BE.D1.80.D0.B5.D0.BD.D0.B5.D0.B2.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.83_OPC-UA_.28UA.29"><span class="mw-headline-number">4.1.7</span> Кореневий об'єкт протоколу OPC-UA (UA)</span></h4> <p><b>Публічні методи:</b> </p> <ul><li> <i>virtual string lang2CodeSYS( );</i> — Дво-Ñимвольний код мови оточеннÑ.</li> <li> <i>virtual void debugMess( const string &mess )</i> — Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸Ñ… повідомлень.</li> <li> <i>virtual uint32_t rcvBufSz( );</i> — Розмір буферу приймача, більш за 8192.</li> <li> <i>virtual uint32_t sndBufSz( );</i> — Розмір буферу передавача, більш за 8192.</li> <li> <i>virtual uint32_t msgMaxSz( );</i> — МакÑимальний розмір повідомленнÑ, 0 Ð´Ð»Ñ Ð²Ñ–Ð´ÑутноÑті обмеженнÑ.</li> <li> <i>virtual uint32_t chunkMaxCnt( );</i> — МакÑимальна кількіÑть шматків, 0 Ð´Ð»Ñ Ð²Ñ–Ð´ÑутноÑті обмеженнÑ.</li> <li> <i>static string iErr( const string &buf, int &off );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ із потоку <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static const char *iVal( const string &buf, int &off, char vSz );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ð¾Ð¼ <i>vSz</i> із потоку <i>buf</i> за зміщеннÑм <i>off</i>, Ñк ділÑнку даних.</li> <li> <i>static int64_t iN( const string &rb, int &off, char vSz );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ð³Ð¾ цілого розміром <i>vSz</i> (1, 2, 4, 8) із потоку <i>rb</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static uint64_t iNu( const string &rb, int &off, char vSz );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ð³Ð¾ цілого розміром <i>vSz</i> (1, 2, 4, 8) із потоку <i>rb</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static double iR( const string &rb, int &off, char vSz = 4 );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ розміром <i>vSz</i> (4, 8) із потоку <i>rb</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static string iS( const string &buf, int &off );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€Ñдка із потоку <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static string iSl( const string &buf, int &off, string *locale = NULL );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ <i>locale</i> Ñ€Ñдка із потоку <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static string iSqlf( const string &buf, int &off, uint16_t *nsIdx = NULL );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€Ñдку із кваліфікатором <i>nsIdx</i> із потоку <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static int64_t iTm( const string &buf, int &off );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‡Ð°Ñу із потоку <i>buf</i> за зміщеннÑм <i>off</i>, із перетвореннÑм у епоху UNIX.</li> <li> <i>static NodeId iNodeId( const string &buf, int &off );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ñƒ вузла із потоку <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static string iVariant( const string &buf, int &off, uint8_t *tp = NULL );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ варіант із потоку <i>buf</i> за зміщеннÑм <i>off</i>, повертає варіант у Ñтроковому виглÑді Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ <i>tp</i>.</li> <li> <i>static void iDataValue( const string &buf, int &off, XML_N &nVal );</i> — Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (Ñтруктура DataValue) у <i>nVal</i> із потоку <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oN( string &buf, int64_t val, char sz, int off = -1 );</i> — Ð—Ð°Ð¿Ð¸Ñ Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ð³Ð¾ цілого <i>val</i> розміром <i>sz</i> (1, 2, 4, 8) у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oNu( string &buf, uint64_t val, char sz, int off = -1 );</i> — Ð—Ð°Ð¿Ð¸Ñ Ð±ÐµÐ·Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ð³Ð¾ цілого <i>val</i> розміром <i>sz</i> (1, 2, 4, 8) у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oR( string &buf, double val, char sz = 4 );</i> — Ð—Ð°Ð¿Ð¸Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ <i>val</i> розміром <i>sz</i> (4, 8) у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oS( string &buf, const string &val, int off = -1 );</i> — Ð—Ð°Ð¿Ð¸Ñ Ñ€Ñдку <i>val</i> у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oSl( string &buf, const string &val, const string &locale = "" );</i> — Ð—Ð°Ð¿Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ <i>locale</i> Ñ€Ñдка <i>val</i> у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oSqlf( string &buf, const string &val, uint16_t nsIdx = 0 );</i> — Ð—Ð°Ð¿Ð¸Ñ Ñ€Ñдка <i>val</i> із кваліфікатором <i>nsIdx</i> у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oTm( string &buf, int64_t val );</i> — Ð—Ð°Ð¿Ð¸Ñ Ñ‡Ð°Ñу <i>val</i> (в епоÑÑ– UNIX) у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oNodeId( string &buf, const NodeId &val );</i> — Ð—Ð°Ð¿Ð¸Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ñƒ вузла <i>val</i> у потік <i>buf</i> за зміщеннÑм <i>off</i>.</li> <li> <i>static void oRef( string &buf, uint32_t resMask, const NodeId &nodeId, const NodeId &refTypeId, bool isForward, const string &name, uint32_t nodeClass, const NodeId &typeDef );</i> — Ð—Ð°Ð¿Ð¸Ñ Ñƒ потік <i>buf</i> опиÑу оглÑду (Ñтруктура ReferenceDescription) Ð´Ð»Ñ Ð¼Ð°Ñки результату <i>resMask</i>, вузла <i>nodeId</i>, типу поÑÐ¸Ð»Ð°Ð½Ð½Ñ <i>refTypeId</i>, напрÑмку <i>isForward</i>, назви <i>name</i>, клаÑу вузла <i>nodeClass</i>, типу Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>typeDef</i>.</li> <li> <i>void oDataValue( string &buf, uint8_t eMsk, const string &vl, uint8_t vEMsk = 0, int64_t srcTmStmp = 0 );</i> — Ð—Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (Ñтруктура DataValue) у потік <i>buf</i> Ð´Ð»Ñ Ð¼Ð°Ñки ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ <i>eMsk</i>, Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i>, маÑки Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vEMsk</i>, чаÑу джерела <i>srcTmStmp</i>.</li> <li> <i>static string randBytes( int num );</i> — Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ випадкових даних у кількоÑті <i>num</i>.</li> <li> <i>static string certPEM2DER( const string &certPem );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñертифікату із формату PEM <i>certPem</i> у формат DER.</li> <li> <i>static string certDER2PEM( const string &certDer );</i> — ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñертифікату із формату DER <i>certDer</i> у формат PEM.</li> <li> <i>static string certThumbprint( const string &certPem );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу із Ñертифікату PEM <i>certPem</i>.</li> <li> <i>static string asymmetricEncrypt( const string &mess, const string &certPem, const string &secPolicy );</i> — ÐÑиметричне ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mess</i> Ñертифікатом <i>certPem</i> (відкритим ключем) Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ <i>secPolicy</i>.</li> <li> <i>static string asymmetricDecrypt( const string &mess, const string &pvKeyPem, const string &secPolicy );</i> — ÐÑиметричне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mess</i> ключем <i>pvKeyPem</i> Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ <i>secPolicy</i>.</li> <li> <i>static bool asymmetricVerify( const string &mess, const string &sign, const string &certPem );</i> — ÐÑиметрична Ð²ÐµÑ€Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу <i>sign</i> Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mess</i> Ñертифікатом <i>certPem</i>.</li> <li> <i>static string asymmetricSign( const string &mess, const string &pvPem );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ñиметричного підпиÑу закритим ключем Ñертифікату <i>pvPem</i> Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mess</i>.</li> <li> <i>static int asymmetricKeyLength( const string &keyCertPem );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ ключа Ñертифікату <i>keyCertPem</i>.</li> <li> <i>static string deriveKey( const string &secret, const string &seed, int keyLen );</i> — Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° розміром <i>keyLen</i> із Ñекрету <i>secret</i> та <i>seed</i>.</li> <li> <i>static string symmetricCrypt( const string &mess, const string &keySet, const string &secPolicy, bool encrypt );</i> — Симетричне ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° <i>encrypt</i> або Ð´ÐµÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑƒ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mess</i> ключем <i>keySet</i> Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ <i>secPolicy</i>.</li> <li> <i>static string symmetricSign( const string &mess, const string &keySet, const string &secPolicy );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñиметричного підпиÑу ключем <i>keySet</i> Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mess</i> та політики <i>secPolicy</i>.</li></ul> <h5><span class="mw-headline" id=".D0.92.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.BD.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D1.96.D0.B2_.D0.B1.D0.B5.D0.B7.D0.BF.D0.B5.D0.BA.D0.B8_.28SecuritySetting.29"><span class="mw-headline-number">4.1.7.1</span> Включений об'єкт параметрів безпеки (SecuritySetting)</span></h5> <p><b>Отримані дані:</b> </p> <ul><li> <i>string policy</i> — політика безпеки;</li> <li> <i>MessageSecurityMode messageMode</i> — режим повідомленнÑ.</li></ul> <p><b>Публічні методи:</b> </p> <ul><li> <i>SecuritySetting( const string &plc, int8_t mMode )</i> — КонÑтруктор об'єкту із політикою безпеки <i>plc</i> та режимом Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>mMode</i>.</li> <li> <i>SecuritySetting( )</i> — КонÑтруктор об'єкту із політикою безпеки "None" та режимом Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>MS_None</i>.</li></ul> <h3><span class="mw-headline" id=".D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client-.3EUA.29"><span class="mw-headline-number">4.2</span> ОÑновний об'єкт Клієнту (Client->UA)</span></h3> <p><b>ЗаÑтоÑуваннÑ:</b> БезпоÑередньо уÑпадковуєтьÑÑ ÐºÐ¾Ñ€Ð¸Ñтувацьким об'єктом — Клієнт OPC-UA. </p><p><b>Публічні методи:</b> </p> <ul><li> <i>virtual string applicationUri( ) = 0;</i> — URI додатку.</li> <li> <i>virtual string productUri( ) = 0;</i> — URI продукту.</li> <li> <i>virtual string applicationName( ) = 0;</i> — Ðазва додатку.</li> <li> <i>virtual string sessionName( ) = 0;</i> — Ðазва ÑеанÑу.</li> <li> <i>virtual string endPoint( ) = 0;</i> — Кінцева точка.</li> <li> <i>virtual string secPolicy( ) = 0;</i> — Політика безпеки.</li> <li> <i>virtual int secMessMode( ) = 0;</i> — Режим безпеки повідомленнÑ.</li> <li> <i>virtual string cert( ) = 0;</i> — Сертифікат.</li> <li> <i>virtual string pvKey( ) = 0;</i> — Приватний ключ.</li> <li> <i>virtual string authData( ) = 0;</i> — Дані аутентифікації: <ul><li> "<Empty>" — анонімний;</li> <li> "{User}\n{Password}" — за кориÑтувачем та паролем.</li></ul></li> <li> <i>virtual uint8_t publishReqsPool( )</i> — КількіÑть <i>Publish</i> запитів обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ ÑервіÑу публікації, типово <b>2(два)</b>.</li> <li> <i>virtual string poll( bool byRead = false );</i> — Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ ÑервіÑу публікації на предмет: Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ каналу щодо відповідей публікації, відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð°ÑвноÑті потрібної кількоÑті <i>Publish</i> запитів та втрати зв'Ñзку через відÑутніÑть відповідей публікацій протÑгом визначеного чаÑу життÑ. За аргументом <i>byRead</i> Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ñ‚Ð°ÐºÐ¾Ð¶ забезпечує прÑме Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°Ñ€ÐµÑ”Ñтрованих елементів моніторингу запитом "Read".</li> <li> <i>virtual int messIO( const char *oBuf, int oLen, char *iBuf = NULL, int iLen = 0 ) = 0;</i> — Обмін повідомленнÑми, передача запиту та Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ–.</li></ul> <dl><dd> <a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Змішаний режим запиту та вільного читаннÑ/запиÑу вÑе ще вирішуєтьÑÑ.</dd></dl> <ul><li> <i>virtual bool connect( int8_t est = -1 );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑтатуÑу підключеннÑ, вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ <i>est</i> = 1, Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ <i>est</i> = 0.</li> <li> <i>virtual void protIO( XML_N &io );</i> — Обробка запиту до протоколу.</li> <li> <i>virtual void reqService( XML_N &io );</i> — КомплекÑний запит ÑервіÑу, Ñкий Ñам відÑтежує необхідніÑть виклику допоміжних запитів відкриттÑ/Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки, відкриттÑ/закриттÑ/активації ÑеанÑу та решта.</li></ul> <p><b>Захищені атрибути:</b> </p> <ul><li> <i>SClntSess sess;</i> — дані ÑеанÑу;</li> <li> <i>pthread_mutex_t mtxData;</i> — замок доÑтупу до даних.</li></ul> <h4><span class="mw-headline" id=".D0.9A.D0.BE.D0.BC.D0.BF.D0.BB.D0.B5.D0.BA.D1.81.D0.BD.D0.B8.D0.B9_.D1.81.D0.B5.D0.B0.D0.BD.D1.81_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client::SClntSess.29"><span class="mw-headline-number">4.2.1</span> КомплекÑний ÑÐµÐ°Ð½Ñ ÐšÐ»Ñ–Ñ”Ð½Ñ‚Ñƒ (Client::SClntSess)</span></h4> <p><b>Публічні дані:</b> </p> <ul><li> <i>uint32_t servRcvBufSz, servSndBufSz, servMsgMaxSz, servChunkMaxCnt;</i> — параметри буферу приймача, передавача, макÑимального розміру Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° макÑимальної кількоÑті шматків; Ñкі отримано від Ñерверу запитом "HELLO";</li> <li> <i>string endPoint;</i> — кінцева точка;</li> <li> <i>XML_N endPointDscr;</i> — Ð¾Ð¿Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñ— кінцевої точки;</li> <li> <i>uint32_t secChnl, secToken;</i> — Ñ–Ð½Ð´ÐµÐºÑ Ñ‚Ð° талон каналу безпеки;</li> <li> <i>int secLifeTime;</i> — Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки;</li> <li> <i>bool secChnlChanged;</i> — ознака зміни каналу безпеки Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡Ð¸ повторної активації ÑеанÑу;</li> <li> <i>uint32_t sqNumb, sqReqId, reqHndl;</i> — номер поÑлідовноÑті, порÑдковий номер запиту та тримач запиту;</li> <li> <i>string secPolicy;</i> — політика безпеки;</li> <li> <i>char secMessMode;</i> — режим безпеки повідомленнÑ;</li> <li> <i>int64_t secChnlOpenTm, secLstMessReqTm;</i> — Ñ‡Ð°Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ/Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки та оÑтаннього Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ;</li> <li> <i>string sesId, authTkId;</i> — ідентифікатор та талон аутентифікації ÑеанÑу;</li> <li> <i>double sesLifeTime;</i> — Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ ÑеанÑу;</li> <li> <i>string servCert, servNonce, servKey;</i> — Ñертифікат, випадкова поÑлідовніÑть та Ñиметричний ключ Ñерверу;</li> <li> <i>string clKey;</i> — Ñиметричний ключ клієнту;</li> <li> <i>vector<Subscr> mSubScr;</i> — підпиÑки (об'єкт Subscr) клієнту;</li> <li> <i>vector<uint32_t> mPublSeqs;</i> — реєÑтр надіÑланих запитів публікації за порÑдковим номером запиту.</li></ul> <p><b>Публічні методи:</b> </p> <ul><li> <i>void clearSecCnl( bool inclEP = false )</i> — ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки, включно із опиÑом кінцевої точки <i>inclEPdescr</i>.</li> <li> <i>void clearSess( bool inclSubscr = true )</i> — ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ ÑеанÑу, включно із підпиÑками <i>inclSubscr</i>.</li></ul> <h5><span class="mw-headline" id=".D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client::Subscr.29"><span class="mw-headline-number">4.2.1.1</span> ПідпиÑка Клієнту (Client::Subscr)</span></h5> <p><b>Публічні дані:</b> </p> <ul><li> <i>bool publEn;</i> — увімкнути публікацію;</li> <li> <i>double publInterval;</i> — інтервал публікації у міліÑекундах;</li> <li> <i>uint32_t subScrId;</i> — ідентифікатор підпиÑки: <ÐУЛЬ> — неактивний об'єкт;</li> <li> <i>uint32_t lifetimeCnt;</i> — лічильник, за Ñкого та відÑутноÑті Ñповіщень, у клієнта видалÑєтьÑÑ Ñ†ÐµÐ¹ об'єкт;</li> <li> <i>uint32_t maxKeepAliveCnt;</i> — лічильник, за Ñкого треба надÑилати порожню відповідь публікації;</li> <li> <i>uint32_t maxNtfPerPubl;</i> — макÑимальна кількіÑть Ñповіщень у одній відповіді Публікації;</li> <li> <i>uint8_t pr;</i> — пріоритет;</li> <li> <i>vector<MonitItem> mItems;</i> — контейнер елементів моніторингу;</li> <li> <i>vector<uint32_t> mSeqToAcq;</i> — реєÑтр поÑлідовноÑтей відповідей Публікації, Ñкі потребують Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð°Ð¹Ð±Ð»Ð¸Ð¶Ñ‡Ð¸Ð¼ запитом Публікації;</li> <li> <i>int64_t lstPublTm;</i> — Ñ‡Ð°Ñ Ð¾Ñтанньої відповіді публікації;</li> <li> <i>Client *clnt;</i> — прÑме поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'єкт Клієнту.</li></ul> <p><b>Публічні методи:</b> </p> <ul><li> <i>Subscr( Client *clnt, double publInterval = 1e3 );</i> — КонÑтруктор ПідпиÑки щодо Клієнту <i>clnt</i> із інтервалом публікації <i>publInterval</i>.</li> <li> <i>bool isActivated( );</i> — Повертає Ñтан активації підпиÑки.</li> <li> <i>void activate( bool vl, bool onlyLocally = false );</i> — Ðктивує (<i>vl</i>=TRUE) або деактивує (<i>vl</i>=FALSE) ПідпиÑку. ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ´Ð±Ð°Ñ‡Ð°Ñ” надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ "CreateSubscription" зі ÑтвореннÑм зареєÑтрованих, але ще не активованих елементів моніторингу, ÑервіÑним запитом "CreateMonitoredItems". Ð”ÐµÐ°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ´Ð±Ð°Ñ‡Ð°Ñ” надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÑервіÑного запиту "DeleteSubscriptions", Ñкщо не вÑтановлено <i>onlyLocally</i>, із очищеннÑм локальних даних елементів моніторингу.</li> <li> <i>int monitoredItemAdd( const NodeId &nd, AttrIds aId = AId_Value, MonitoringMode mMode = MM_REPORTING );</i> — Додає вузол <i>nd</i> щодо атрибуту <i>aId</i>, Ñк елемент моніторингу у режимі моніторингу <i>mMode</i>, та повертає ідентифікатор нового елементу. За активного Ñтану ПідпиÑки також здійÑнюєтьÑÑ ÑервіÑний запит "CreateMonitoredItems". Спеціальне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "0" вузла <i>nd</i> передбачає здійÑÐ½ÐµÐ½Ð½Ñ ÑервіÑного запиту "CreateMonitoredItems" Ð´Ð»Ñ Ð²ÑÑ–Ñ… зареєÑтрованих та ще не активованих елементів.</li> <li> <i>void monitoredItemDel( int32_t mItId, bool localDeactivation = false, bool onlyNoData = false );</i> — ВидалÑÑ” елемент моніторингу <i>mItId</i>, позначаючи його Ñк "ВІЛЬÐИЙ" та здійÑнюючи також ÑервіÑний виклик "DeleteMonitoredItems" Ð´Ð»Ñ Ð½Ðµ <i>localDeactivation</i>. <i>onlyNoData</i> викориÑтовуєтьÑÑ Ñ€Ð°Ð·Ð¾Ð¼ із <i>localDeactivation</i> Ð´Ð»Ñ Ð»Ð¸ÑˆÐµ Ð¼Ð°Ñ€ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ Ñк "ÐЕМÐЄ-ДÐÐИХ" піÑÐ»Ñ Ð´ÐµÑких помилок підключеннÑ. Спеціальне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "-1" елементу моніторингу <i>mItId</i> передбачає здійÑÐ½ÐµÐ½Ð½Ñ Ð´ÐµÐ°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— вÑÑ–Ñ… елементів.</li></ul> <h6><span class="mw-headline" id=".D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D1.96.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D1.83_.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.9A.D0.BB.D1.96.D1.94.D0.BD.D1.82.D1.83_.28Client::Subscr::MonitItem.29"><span class="mw-headline-number">4.2.1.1.1</span> Елемент Моніторингу ПідпиÑки Клієнту (Client::Subscr::MonitItem)</span></h6> <p><b>Публічні дані:</b> </p> <ul><li> <i>MonitoringMode md;</i> — режим моніторингу;</li> <li> <i>NodeId nd;</i> — цільовий вузол: <ПОРОЖÐЬО> — вільний елемент моніторингу;</li> <li> <i>uint32_t aid;</i> — ІД атрибуту вузла;</li> <li> <i>double smplItv;</i> — інтервал вимірюваннÑ;</li> <li> <i>uint32_t qSz;</i> — розмір черги;</li> <li> <i>bool active;</i> — активніÑть елементу;</li> <li> <i>uint32_t st;</i> — код Ñтану елементу;</li> <li> <i>XML_N val;</i> — контекÑÑ‚ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ: наÑвніÑть атрибуту "nodata" означає відÑутніÑть даних.</li></ul> <p><b>Публічні методи:</b> </p> <ul><li> <i>MonitItem( NodeId nd, uint32_t aid, MonitoringMode md = MM_REPORTING );</i> — КонÑтруктор Елементу Моніторингу Ð´Ð»Ñ Ð²ÑƒÐ·Ð»Ð° <i>nd</i> та його атрибуту <i>aid</i> у режимі моніторингу <i>md</i>.</li></ul> <h3><span class="mw-headline" id=".D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D0.B8.D0.B9_.D0.BE.D0.B1.27.D1.94.D0.BA.D1.82_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server-.3EUA.29"><span class="mw-headline-number">4.3</span> ОÑновний об'єкт Серверу (Server->UA)</span></h3> <p><b>ЗаÑтоÑуваннÑ:</b> ПрÑмо уÑпадковуєтьÑÑ ÐºÐ¾Ñ€Ð¸Ñтувацьким об'єктом — Сервер OPC-UA. </p><p><b>Публічні методи:</b> </p> <ul><li> <i>virtual bool debug( );</i> — Ðктивовано налаштуваннÑ.</li> <li> <i>virtual string applicationUri( ) = 0;</i> — URI додатку.</li> <li> <i>virtual string productUri( ) = 0;</i> — URI продукту.</li> <li> <i>virtual string applicationName( ) = 0;</i> — Ім'Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÑƒ.</li> <li> <i>virtual uint32_t clientRcvBufSz( const string &inPrtId ) = 0;</i> — Розмір буферу приймача Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>, отриманий від клієнта.</li> <li> <i>virtual uint32_t clientSndBufSz( const string &inPrtId ) = 0;</i> — Розмір буферу передавача Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>, отриманий від клієнта.</li> <li> <i>virtual uint32_t clientMsgMaxSz( const string &inPrtId ) = 0;</i> — МакÑимальний розмір Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>, отриманий від клієнта.</li> <li> <i>virtual uint32_t clientChunkMaxCnt( const string &inPrtId ) = 0;</i> — МакÑимальна кількіÑть шматків Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>, отримана від клієнта.</li> <li> <i>virtual void discoveryUrls( vector<string> &ls ) = 0;</i> — URLи Ñерверів оглÑду у <i>ls</i>.</li> <li> <i>virtual bool inReq( string &request, const string &inPrtId, string *answ = NULL );</i> — Обробник вхідних запитів <i>request</i> екземплÑру протоколу <i>inPrtId</i> та відповіді у <i>answ</i>.</li> <li> <i>virtual int writeToClient( const string &threadId, const string &data ) = 0;</i> — ПрÑмий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾Ð¼Ñƒ клієнту.</li> <li> <i>virtual string clientAddr( const string &threadId ) = 0;</i> — ÐдреÑа клієнту.</li> <li> <i>virtual void clientRcvBufSzSet( const string &inPrtId, uint32_t vl ) = 0;</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ буферу приймача, отриманого від клієнта, у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i> Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>.</li> <li> <i>virtual void clientSndBufSzSet( const string &inPrtId, uint32_t vl ) = 0;</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ буферу передавача, отриманого від клієнта, у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i> Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>.</li> <li> <i>virtual void clientMsgMaxSzSet( const string &inPrtId, uint32_t vl ) = 0;</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ð°ÐºÑимального розміру повідомленнÑ, отриманого від клієнта, у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i> Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>.</li> <li> <i>virtual void clientChunkMaxCntSet( const string &inPrtId, uint32_t vl ) = 0;</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ð°ÐºÑимальної кількоÑті шматків, отриманої від клієнта, у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i>, Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ <i>inPrtId</i>.</li> <li> <i>int chnlSet( int cid, const string &ep, int32_t lifeTm = 0, const string& clCert = "", const string &secPolicy = "None", char secMessMode = 1, const string &clAddr = "", uint32_t seqN = 1 );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки із ідентифікатором <i>cid</i> (ненульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ) Ð´Ð»Ñ ÐºÑ–Ð½Ñ†ÐµÐ²Ð¾Ñ— точки <i>ep</i>, чаÑу Ð¶Ð¸Ñ‚Ñ‚Ñ <i>lifeTm</i>, клієнтÑького Ñертифікату <i>clCert</i>, політики безпеки <i>secPolicy</i>, режиму безпеки Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ <i>secMessMode</i>, адреÑи клієнта <i>clAddr</i>, номеру поÑлідовноÑті пакета <i>seqN</i>.</li> <li> <i>void chnlClose( int cid );</i> — Ð—Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки <i>cid</i>.</li> <li> <i>SecCnl chnlGet( int cid ); SecCnl &chnlGet_( int cid );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÐ¾Ð¿Ñ–Ñ— та доÑтупу до об'єкту каналу безпеки <i>cid</i>.</li> <li> <i>void chnlSecSet( int cid, const string &servKey, const string &clKey );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки <i>cid</i> Ñерверного <i>servKey</i> та клієнтÑького <i>clKey</i> Ñиметричних ключів.</li> <li> <i>static string mkError( uint32_t errId, const string &err = "" );</i> — Ð¤Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ з ідентифікатором <i>errId</i> та повідомленнÑм <i>err</i>.</li></ul> <p><b>Захищені методи:</b> </p> <ul><li> <i>virtual void epEnList( vector<string> &ls ) = 0;</i> — Обробник запиту переліку кінцевих вузлів.</li> <li> <i>virtual EP *epEnAt( const string &ep ) = 0;</i> — Обробник запиту об'єкту кінцевої точки.</li></ul> <p><b>Захищені атрибути:</b> </p> <ul><li> <i>pthread_mutex_t mtxData;</i> — замок доÑтупу до даних.</li></ul> <h4><span class="mw-headline" id=".D0.9A.D0.B0.D0.BD.D0.B0.D0.BB_.D0.91.D0.B5.D0.B7.D0.BF.D0.B5.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::SecCnl.29"><span class="mw-headline-number">4.3.1</span> Канал Безпеки Серверу (Server::SecCnl)</span></h4> <p><b>Публічні методи:</b> </p> <ul><li> <i>SecCnl( const string &ep, uint32_t tokenId, int32_t lifeTm, const string &clCert, const string &secPolicy, char secMessMode, const string &clAddr, uint32_t secN );</i> — КонÑтруктор об'єкту Каналу Безпеки длÑ: кінцевої точки <i>ep</i>, талону безпеки <i>tokenId</i>, чаÑу Ð¶Ð¸Ñ‚Ñ‚Ñ <i>lifeTm</i>, клієнтÑького Ñертифікату <i>clCert</i>, політики безпеки <i>secPolicy</i>, режиму безпеки повідомлень <i>secMessMode</i>, адреÑи клієнта <i>clAddr</i>, номеру поÑлідовноÑті ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ безпеки <i>secN</i>.</li></ul> <p><b>Публічні атрибути:</b> </p> <ul><li> <i>string endPoint;</i> — кінцева точка;</li> <li> <i>string secPolicy;</i> — політика безпеки;</li> <li> <i>char secMessMode;</i> — режим безпеки повідомлень;</li> <li> <i>int64_t tCreate;</i> — Ñ‡Ð°Ñ ÑтвореннÑ;</li> <li> <i>int32_t tLife;</i> — Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ;</li> <li> <i>uint32_t tokenId, tokenIdPrev;</i> — поточний Ñ– попередній ідентифікатори талону;</li> <li> <i>string clCert, clAddr, clKey;</i> — Ñертифікат, адреÑа та Ñиметричний ключ клієнту;</li> <li> <i>string servKey;</i> — Ñиметричний ключ Ñерверу;</li> <li> <i>uint32_t servSeqN, clSeqN, reqId;</i> — поточний номер поÑлідовноÑті пакету Ñерверу, клієнту та запиту;</li> <li> <i>int chCnt;</i> — лічильник шматків пакету в акумулÑції;</li> <li> <i>string chB;</i> — акумулÑÑ†Ñ–Ñ Ð¿Ð°ÐºÐµÑ‚Ñƒ зі шматків.</li></ul> <h4><span class="mw-headline" id=".D0.A1.D0.B5.D0.B0.D0.BD.D1.81_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Sess.29"><span class="mw-headline-number">4.3.2</span> Ð¡ÐµÐ°Ð½Ñ Ð¡ÐµÑ€Ð²ÐµÑ€Ñƒ (Server::Sess)</span></h4> <p><b>Публічні методи:</b> </p> <ul><li> <i>Sess( const string &name, double tInact );</i> — КонÑтруктор об'єкту СеанÑу з назвою <i>name</i> та таймаутом неактивноÑті <i>tInact</i>.</li> <li> <i>bool isSecCnlActive( EP *ep );</i> — Повертає Ñтан активноÑти Каналу Безпеки, пов'Ñзаному із ÑеанÑом.</li></ul> <p><b>Публічні атрибути:</b> </p> <ul><li> <i>string name, inPrtId;</i> — назва та ідентифікатор вхідного протоколу;</li> <li> <i>string idPolicyId, user;</i> — ідентифікатор політики Ñ– кориÑтувач автентифікації;</li> <li> <i>uint32_t secCnl;</i> — канал безпеки, пов'Ñзаний із ÑеанÑом;</li> <li> <i>double tInact;</i> — Ñ‡Ð°Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті;</li> <li> <i>int64_t tAccess;</i> — Ñ‡Ð°Ñ Ð´Ð¾Ñтупу;</li> <li> <i>string servNonce;</i> — випадкова поÑлідовніÑть Ñерверу;</li> <li> <i>map<string, ContPoint> cntPnts;</i> — точки Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ оглÑду;</li> <li> <i>deque<string> publishReqs;</i> — перелік запитів публікації.</li></ul> <h5><span class="mw-headline" id=".D0.A2.D0.BE.D1.87.D0.BA.D0.B0_.D0.BF.D1.80.D0.BE.D0.B4.D0.BE.D0.B2.D0.B6.D0.B5.D0.BD.D0.BD.D1.8F_.D0.BE.D0.B3.D0.BB.D1.8F.D0.B4.D1.83_.D0.A1.D0.B5.D0.B0.D0.BD.D1.81.D1.83_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Sess::ContPoint.29"><span class="mw-headline-number">4.3.2.1</span> Точка Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¾Ð³Ð»Ñду СеанÑу Серверу (Server::Sess::ContPoint)</span></h5> <p><b>Публічні методи:</b> </p> <ul><li> <i>ContPoint( const string &brNode, const string &lstNode, uint32_t brDir, uint32_t refPerN, const string &refTypeId, uint32_t nClassMask, uint32_t resMask )</i> — КонÑтруктор об'єкту Ð´Ð»Ñ Ð²ÑƒÐ·Ð»Ð° гілки Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¾Ð³Ð»Ñду <i>brNode</i>, вузла ÑпиÑку <i>lstNode</i>, напрÑмку оглÑду <i>brDir</i>, чиÑла Ñпроб на вузол <i>refPerN</i>, ідентифікатору поÑÐ¸Ð»Ð°Ð½Ð½Ñ <i>refTypeId</i>, маÑки клаÑу вузла <i>nClassMask</i> та маÑки результату <i>resMask</i>.</li> <li> <i>bool empty( ) const;</i> — Точка Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ.</li></ul> <p><b>Публічні атрибути:</b> </p> <ul><li> <i>uint32_t brDir, refPerN, nClassMask, resMask;</i> — напрÑмок оглÑду, чиÑло Ñпроб на вузол, маÑка клаÑу вузла, маÑка результату;</li> <li> <i>string brNode, lstNode, refTypeId;</i> — гілка вузлів, перелік вузла та ідентифікатор типу поÑиланнÑ.</li></ul> <h4><span class="mw-headline" id=".D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Subscr.29"><span class="mw-headline-number">4.3.3</span> ПідпиÑка Серверу (Server::Subscr)</span></h4> <p><b>Публічні методи:</b> </p> <ul><li> <i>Subscr copy( bool noWorkData = true );</i> — ÐšÐ¾Ð¿Ñ–Ñ Ð¾Ð±'єкту підпиÑки, без робочих даних Ð´Ð»Ñ <i>noWorkData</i>.</li> <li> <i>SubScrSt setState( SubScrSt st = SS_CUR );</i> — ÐŸÐ¾Ð²ÐµÑ€ÐµÐ½ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ñтану та вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñƒ <i>st</i>.</li></ul> <p><b>Публічні атрибути:</b> </p> <ul><li> <i>SubScrSt st;</i> — ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ñ–Ð´Ð¿Ð¸Ñки;</li> <li> <i>int sess;</i> — ÑÐµÐ°Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки;</li> <li> <i>bool publEn;</i> — Ð²Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—;</li> <li> <i>bool toInit;</i> — ознака ініціації підпиÑки — надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾-порожнього пакету відповіді публікації;</li> <li> <i>double publInterv;</i> — інтервал публікації, міліÑекунди;</li> <li> <i>uint32_t seqN;</i> — номер поÑлідовноÑті Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´ÐµÐ¹, Ð·Ð°Ð²ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· 1, не інкрементуєтьÑÑ Ð½Ð° KeepAlive повідомленнÑÑ…;</li> <li> <i>uint32_t pubCntr, pubCntr_;</i> — лічильник надÑилань відповідей публікації Ð´Ð»Ñ Ð²Ð¸ÑÐ²Ð»ÐµÐ½Ð½Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті;</li> <li> <i>uint32_t lifetimeCnt, wLT;</i> — лічильник, за вичерпаннÑм Ñкого на протÑзі відÑутноÑті Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ клієнту потрібно видалÑти цей об'єкт;</li> <li> <i>uint32_t maxKeepAliveCnt, wKA;</i> — лічильник, за вичерпаннÑм Ñкого потрібно надÑилати порожню відповідь публікації та вÑтановлювати <i>StatusChangeNotification</i> у <b>Bad_Timeout</b>;</li> <li> <i>uint32_t maxNtfPerPubl;</i> — макÑимальна кількіÑть повідомлень на одну відповідь публікації;</li> <li> <i>uint8_t pr;</i> — пріоритет;</li> <li> <i>vector<MonitItem> mItems;</i> — перелік елементів моніторингу;</li> <li> <i>deque<string> retrQueue;</i> — черга перенадÑиланнÑ; викориÑтовуєтьÑÑ Ð·Ð°Ð¿Ð¸Ñ‚Ð¾Ð¼ перенадÑÐ¸Ð»Ð°Ð½Ð½Ñ "RePublish"; очищуєтьÑÑ Ð½Ð° глибину згідно <i>KeepAlive</i> або прÑмим запитом публікації у наборі підтвердженнÑ.</li></ul> <h5><span class="mw-headline" id=".D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D1.96.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D1.83_.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Subscr::MonitItem.29"><span class="mw-headline-number">4.3.3.1</span> Елемент Моніторингу ПідпиÑки Серверу (Server::Subscr::MonitItem)</span></h5> <p><b>Публічні атрибути:</b> </p> <ul><li> <i>MonitoringMode md;</i> — режим моніторингу;</li> <li> <i>NodeId nd;</i> — цільовий вузол;</li> <li> <i>uint32_t aid;</i> — ідентифікатор атрибуту вузла;</li> <li> <i>TimestampsToReturn tmToRet;</i> — мітки чаÑу Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ;</li> <li> <i>double smplItv;</i> — інтервал вимірюваннÑ;</li> <li> <i>uint32_t qSz;</i> — розмір черги;</li> <li> <i>bool dO;</i> — відкидати Ñтарі;</li> <li> <i>uint32_t cH;</i> — вказівник клієнту;</li> <li> <i>XML_N fltr;</i> — фільтр;</li> <li> <i>int vTp;</i> — тип значень;</li> <li> <i>int64_t dtTm;</i> — Ñ‡Ð°Ñ Ð¾Ñтаннього значеннÑ;</li> <li> <i>deque<Val> vQueue;</i> — черга значень.</li></ul> <h6><span class="mw-headline" id=".D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.B7.D0.BD.D0.B0.D1.87.D0.B5.D0.BD.D0.BD.D1.8F_.D0.95.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D1.83_.D0.9C.D0.BE.D0.BD.D1.96.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D1.83_.D0.9F.D1.96.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::Subscr::MonitItem::Val.29"><span class="mw-headline-number">4.3.3.1.1</span> Елемент Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð•Ð»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ Моніторингу ПідпиÑки Серверу (Server::Subscr::MonitItem::Val)</span></h6> <p><b>Публічні методи:</b> </p> <ul><li> <i>Val( const string &vl, int64_t tm )</i> — КонÑтруктор об'єкту Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>vl</i> на Ñ‡Ð°Ñ <i>tm</i>.</li></ul> <p><b>Публічні атрибути:</b> </p> <ul><li> <i>string vl;</i> — значеннÑ;</li> <li> <i>int64_t tm;</i> — Ñ‡Ð°Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ;</li> <li> <i>uint32_t st;</i> — код ÑтатуÑу.</li></ul> <h4><span class="mw-headline" id=".D0.9A.D1.96.D0.BD.D1.86.D0.B5.D0.B2.D0.B0_.D0.A2.D0.BE.D1.87.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D1.83_.28Server::EP.29"><span class="mw-headline-number">4.3.4</span> Кінцева Точка Серверу (Server::EP)</span></h4> <p><b>Публічні методи:</b> </p> <ul><li> <i>EP( Server *serv );</i> — КонÑтруктор об'єкту Кінцевої Точки до Ñерверу <i>serv</i>.</li> <li> <i>virtual string id( ) = 0;</i> — Ідентифікатор.</li> <li> <i>virtual string url( ) = 0;</i> — URL.</li> <li> <i>virtual string cert( ) = 0;</i> — Сертифікат, текÑтом формату PEM.</li> <li> <i>virtual string pvKey( ) = 0;</i> — Приватний ключ, текÑтом формату PEM.</li> <li> <i>virtual double subscrProcPer( ) = 0;</i> — Загальний мінімальний період циклу публікації та обробки його даних.</li> <li> <i>virtual uint32_t limSubScr( );</i> — ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° кількіÑть підпиÑок.</li> <li> <i>virtual uint32_t limMonitItms( );</i> — ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ñті елементів моніторингу.</li> <li> <i>virtual uint32_t limRetrQueueTm( );</i> — ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу на глибину черги повторної передачі.</li> <li> <i>bool enableStat( );</i> — Стан "Ввімкнено".</li> <li> <i>virtual void setEnable( bool vl );</i> — Увімкнути.</li> <li> <i>virtual void setPublish( const string &inPrtId );</i> — Ініціювати умови виклику <i>publishCall()</i> у вхідному потоці — циклічний виклик протоколу вхідного транÑпорту та пов'ÑÐ·Ð°Ð½Ð½Ñ Ñ–Ð· Кінцевою Точкою.</li> <li> <i>void subScrCycle( unsigned cntr );</i> — Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ циклу обробки підпиÑок на кроку <i>cntr</i> Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– у функції <i>publishCall()</i> вхідного потоку.</li> <li> <i>int secN( );</i> — КількіÑть політик безпеки.</li> <li> <i>string secPolicy( int sec );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¾Ð¿Ð¸Ñу політики безпеки <i>isec</i>.</li> <li> <i>MessageSecurityMode secMessageMode( int sec );</i> — Режим безпеки повідомлень політики безпеки <i>sec</i>.</li> <li> <i>unsigned sessN( );</i> — КількіÑть ÑеанÑів.</li> <li> <i>int sessCreate( const string &name, double tInact );</i> — Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑеанÑу з назвою <i>name</i> та таймаутом неактивноÑті <i>tInact</i>, повертає ідентифікатор ÑеанÑу.</li> <li> <i>void sessServNonceSet( int sid, const string &servNonce );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¾Ð²Ð¾Ñ— поÑлідовноÑті Ñерверу у <i>servNonce</i> Ð´Ð»Ñ ÑеанÑу <i>sid</i>.</li> <li> <i>virtual uint32_t sessActivate( int sid, uint32_t secCnl, bool check = false, const string &inPrtId = "", const XML_N &identTkn = XML_N() );</i> — ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ ÑеанÑу <i>sid</i> Ð´Ð»Ñ Ð·Ð²'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð· каналом безпеки <i>secCnl</i>, з перевіркою <i>check</i> на можливіÑть-потребу Ð¿ÐµÑ€ÐµÐ½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ñ€Ð¾Ð·Ñ€Ð¸Ð²Ñƒ попереднього каналу безпеки, повертає помилку (0 — помилки немає).</li> <li> <i>void sessClose( int sid );</i> — Ð—Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÑеанÑу <i>sid</i>.</li> <li> <i>Sess sessGet( int sid );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»Ñру об'єкту ÑеанÑу Ð´Ð»Ñ <i>sid</i>.</li> <li> <i>Sess::ContPoint sessCpGet( int sid, const string &cpId );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¾Ð³Ð»Ñду <i>cpId</i> ÑеанÑу <i>sid</i>.</li> <li> <i>void sessCpSet( int sid, const string &cpId, const Sess::ContPoint &cp = Sess::ContPoint() );</i> — Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¾Ð³Ð»Ñду <i>cp</i> Ð´Ð»Ñ ÑеанÑу <i>sid</i> та ідентифікатору <i>cpId</i>.</li> <li> <i>unsigned subscrN( );</i> — КількіÑть підпиÑок.</li> <li> <i>uint32_t subscrSet( uint32_t ssId, SubScrSt st, bool en = false, int sess = -1, double publInterval = 0, uint32_t lifetimeCnt = 0, uint32_t maxKeepAliveCnt = 0, uint32_t maxNotePerPubl = OpcUa_NPosID, int pr = -1 );</i> — Ð’ÑтановленнÑ-ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки <i>ssId</i> длÑ: Ñтану <i>st</i>, ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— <i>en</i>, ÑеанÑу <i>sess</i>, інтервалу публікації <i>publInterv</i>, лічильнику чаÑу Ð¶Ð¸Ñ‚Ñ‚Ñ <i>lifetimeCnt</i>, лічильнику Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ "живим" <i>maxKeepAliveCnt</i>, макÑимальної кількоÑті повідомлень у одній публікації <i>maxNotePerPubl</i>, пріоритету <i>pr</i>; повертає ідентифікатор підпиÑки.</li> <li> <i>Subscr subscrGet( uint32_t ssId, bool noWorkData = true );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»Ñру підпиÑки <i>ssId</i>, без робочих даних <i>noWorkData</i>.</li> <li> <i>uint32_t mItSet( uint32_t ssId, uint32_t mItId, MonitoringMode md = MM_CUR, const NodeId &nd = NodeId(), uint32_t aid = OpcUa_NPosID, TimestampsToReturn tmToRet = TimestampsToReturn(-1), double smplItv = -2, uint32_t qSz = OpcUa_NPosID, int8_t dO = -1, uint32_t cH = OpcUa_NPosID, XML_N *fltr = NULL );</i> — Ð’ÑтановленнÑ-ÑÐ¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ моніторингу <i>mItId</i> ÑеанÑу <i>ssId</i> длÑ: режиму <i>md</i>, вузла <i>nd</i>, атрибуту <i>aid</i>, профілю мітки чаÑу <i>tmToRet</i>, інтервалу Ð²Ð¸Ð¼Ñ–Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ <i>smplItv</i>, розміру черги <i>qSz</i>, Ð²Ñ–Ð´ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ñтарих <i>dO</i>, вказівника клієнту <i>cH</i>, фільтру <i>fltr</i>; повертає ідентифікатор елементу моніторингу.</li> <li> <i>Subscr::MonitItem mItGet( uint32_t ssId, uint32_t mItId );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÐºÐ·ÐµÐ¼Ð¿Ð»Ñру елементу моніторингу <i>mItId</i> Ð´Ð»Ñ ÑеанÑу <i>ssId</i>.</li> <li> <i>virtual uint32_t reqData( int reqTp, XML_N &req );</i> — Обробник запиту даних — запит до дерева вузлів Ñерверу.</li></ul> <p><b>Захищені методи:</b> </p> <ul><li> <i>XML_N *nodeReg( const NodeId &parent, const NodeId &ndId, const string &name, int ndClass, const NodeId &refTypeId, const NodeId &typeDef = 0 );</i> — РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð²ÑƒÐ·Ð»Ð° <i>ndId</i> у дереві вузлів Ñерверу длÑ: батька <i>parent</i>, клаÑу вузла <i>ndClass</i>, ідентифікатору типу поÑÐ¸Ð»Ð°Ð½Ð½Ñ <i>refTypeId</i> та типу Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>typeDef</i>.</li> <li> <i>Sess *sessGet_( int sid );</i> — ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'єкт ÑеанÑу <i>sid</i>, доÑтуп не захищено захопленнÑм реÑурÑу.</li></ul> <p><b>Захищені атрибути:</b> </p> <ul><li> <i>char mEn;</i> — Ñтан "Ввімкнено";</li> <li> <i>uint64_t cntReq;</i> — лічильник запитів;</li> <li> <i>vector<SecuritySetting> mSec;</i> — перелік політик безпеки кінцевого вузла;</li> <li> <i>vector<Sess> mSess;</i> — перелік відкритих ÑеанÑів;</li> <li> <i>vector<Subscr> mSubScr;</i> — перелік підпиÑок;</li> <li> <i>XML_N objTree;</i> — дерево вузлів Ñерверу;</li> <li> <i>map<string, XML_N*> ndMap;</i> — карта поÑилань на вузли дерева;</li> <li> <i>pthread_mutex_t> mtxData;</i> — Ð¼ÑŽÑ‚ÐµÐºÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð¾Ð³Ð¾ доÑтупу;</li> <li> <i>Server *serv;</i> — поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñервер — контейнер об'єкту кінцевої точки.</li></ul> <h2><span class="mw-headline" id=".D0.9F.D1.80.D0.B8.D0.B2.D0.B0.D1.82.D0.BD.D1.96_.D0.BA.D0.BB.D1.8E.D1.87.D1.96_.D1.82.D0.B0_.D1.81.D0.B5.D1.80.D1.82.D0.B8.D1.84.D1.96.D0.BA.D0.B0.D1.82.D0.B8"><span class="mw-headline-number">5</span> Приватні ключі та Ñертифікати</span></h2> <p>Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ клієнтÑької та Ñерверної-протокольної чаÑтини OPC-UA потрібно ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð° Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ð³Ð¾ ключа Ñ– Ñертифікату у конфігурації об'єкту клієнта та Ñервера. У загальному випадку доÑтатньо ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð²Ð¸Ñ‡Ð°Ð¹Ð½Ð¾Ð³Ð¾ ÑамопідпиÑаного Ñертифікату та приватного ключа без паролÑ, однак, Ð´Ð»Ñ Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸Ñ… повідомлень, потрібно додати низку Ñлужбових полів до Ñертифікату. Це можна виконати взÑвши <a class="external" href="http://oscada.org/wiki/File:OPC-UA_openssl.cnf" title="File:OPC-UA openssl.cnf">файл конфігурації ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñертифікату</a> та виконати наÑтупну процедуру: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="c"># Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ð³Ð¾ ключа:</span> openssl genrsa -out key_c.pem -des3 -rand /var/log/messages 2048 <span class="c"># Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð°Ñ‚Ð½Ð¾Ð³Ð¾ ключа без паролÑ:</span> openssl rsa -in key_c.pem -out key_c1.pem <span class="c"># Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑамопідпиÑаного Ñертифікату:</span> openssl req -x509 -new -key key_c.pem -out cert_c.pem -config ./OPC-UA_openssl.cnf -days 3650 <span class="c"># Розташувати вміÑÑ‚ файлу key_c1.pem у поле приватного ключа та cert_c.pem у поле Ñертифікату!</span> </pre></div> <h2><span class="mw-headline" id=".D0.97.D0.B0.D1.83.D0.B2.D0.B0.D0.B6.D0.B5.D0.BD.D0.BD.D1.8F"><span class="mw-headline-number">6</span> ЗауваженнÑ</span></h2> <p>У процеÑÑ– реалізації модулів підтримки OPC-UA було виÑвлено низку невідповідноÑтей офіційного SDK зі Ñпецифікацією OPC-UA: </p> <ul><li> OPC-UA Part 6 на Ñторінці 27 міÑтить Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу рукоÑтиÑÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÑ‡Ð½Ð¾Ð³Ð¾ каналу. Пакет ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑеÑÑ–Ñ—, виходÑчи із цього процеÑу, підпиÑуєтьÑÑ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñьким Ñиметричним ключем, а ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñерверним. Ðа Ñправді Ñ– Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñ– ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð´Ñ–Ð¹ÑнюєтьÑÑ Ñерверним ключем.</li> <li> OPC-UA Part 4 на Ñторінці 141 міÑтить Ð¾Ð¿Ð¸Ñ Ñтруктури даних підпиÑу, де перший йдуть дані підпиÑу, а потім Ñ€Ñдок алгоритму. Ðа Ñправді реалізовано зворотна поÑлідовніÑть.</li></ul> <h2><span class="mw-headline" id=".D0.A2.D0.B0.D0.B1.D0.BB.D0.B8.D1.86.D1.8F_.D1.81.D1.83.D0.BC.D1.96.D1.81.D0.BD.D0.BE.D1.81.D1.82.D1.96_.D1.96.D0.B7_.D1.80.D0.B5.D0.B0.D0.BB.D1.96.D0.B7.D0.B0.D1.86.D1.96.D1.8F.D0.BC.D0.B8_OPC-UA_.D1.96.D0.BD.D1.88.D0.B8.D1.85_.D0.B2.D0.B8.D1.80.D0.BE.D0.B1.D0.BD.D0.B8.D0.BA.D1.96.D0.B2"><span class="mw-headline-number">7</span> <span id="TableOfCompat" title="#TableOfCompat">Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ ÑуміÑноÑті із реалізаціÑми OPC-UA інших виробників</span></span></h2> <table class="wikitable"> <tr> <th> ПЗ </th> <th> Ядро </th> <th> ОглÑд </th> <th> Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ </th> <th> Ð—Ð°Ð¿Ð¸Ñ </th> <th> ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ </th> <th> Ð—Ð°ÑƒÐ²Ð°Ð¶ÐµÐ½Ð½Ñ </th></tr> <tr> <td colspan="7"> <i>OpenSCADA parts</i> </td></tr> <tr> <td> OpenSCADA OPC-UA Client (libOPC_UA client part) </td> <td> + </td> <td> + </td> <td> + </td> <td> + </td> <td> + </td> <td> IO requests by XML implemented: HEL (HELLO), OPN (OpenSecureChannel), CLO (CloseSecureChannel), FindServers, GetEndpoints, CreateSession, ActivateSession, CloseSession, Read, Write, Browse, CreateSubscription, DeleteSubscriptions, CreateMonitoredItems, DeleteMonitoredItems, Publish, Poll (the special empty request of checking the input channel). Chunks implemented. </td></tr> <tr> <td> OpenSCADA OPC-UA Server (libOPC_UA server part) </td> <td> + </td> <td> + </td> <td> + </td> <td> + </td> <td> + </td> <td> The requests implemented: HELF, OPNF, CLOF, MSGF: FindServers, GetEndpoints, CreateSession, ActivateSession, CloseSession, CreateSubscription, ModifySubscription, DeleteSubscriptions, MonitoredItems, ModifyMonitoredItems, SetMonitoringMode, DeleteMonitoredItems, SetPublishingMode, TranslateBrowsePathsToNodeIds, RegisterNodes, UnregisterNodes, Browse, BrowseNext, Read, Write, Publish, Republish. Chunks implemented. </td></tr> <tr> <td colspan="7"> <i>Clients</i> </td></tr> <tr> <td> UAExpert 1.2, 1.3 </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> </td></tr> <tr> <td> Indusoft web studio 7.1 </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> </td></tr> <tr> <td> Iconics genesis64 10.8 </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> </td></tr> <tr> <td> Insat masterscada 3.7 </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> </td></tr> <tr> <td> <a class="external text" href="https://opcfoundation.org/developer-tools/developer-kits-unified-architecture/sample-applications" rel="nofollow noreferrer noopener" target="_blank">Sample Applications of Unified Architecture</a> </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> <span style="color: blue">Not tested</span> </td> <td> Pass </td> <td> </td></tr> <tr> <td> Wonderware System Platform </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> <span style="color: blue">Not tested</span> </td> <td> Pass </td> <td> Result mask processing fix into the service "Browse" for nodes of OpenSCADA data model. ... </td></tr> <tr> <td> Kepware </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Specific value types OpcUa_IntAuto and OpcUa_UIntAuto was added for adaptive integer type selection, mostly for provide integer not fixed as int64. Time stamp was removed from "Write" package but the client tell 0x80730000(OpcUa_BadWriteNotSupported) </td></tr> <tr> <td> UAExpert 1.4 </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Packages sequence number split from it request and set self managing. </td></tr> <tr> <td> UAExpert 1.5 </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> The Server code cleaned from inconsistency of the data types and the types appended for declaration own OpenSCADA types OpcUa_IntAuto and OpcUa_UIntAuto. </td></tr> <tr> <td colspan="7"> <i>Servers</i> </td></tr> <tr> <td> IgnitionOPC_UA </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> <span style="color: blue">Not tested</span> </td> <td> <span style="color: blue">Not tested</span> </td> <td> </td></tr> <tr> <td> B&R Embedded OPC-UA Server </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> Pass </td> <td> <ul><li> the authenticate process fixed by the server provides self specific identifiers to its. The string of bytes wrong interpretation fixed;</li> <li> 2021.05: has limits on direct reading by the service request "Read", so that was an initiator of implementing the service request "Publish" and Chunks for the Client part, UAExpert 1.5 adaption, significant refactoring and the document complete revision.</li></ul> </td></tr></table> <p><br /> </p> <h2><span class="mw-headline" id=".D0.9F.D0.BE.D1.81.D0.B8.D0.BB.D0.B0.D0.BD.D0.BD.D1.8F"><span class="mw-headline-number">8</span> ПоÑиланнÑ</span></h2> <ul><li> <a class="external" href="http://oscada.org/wiki/File:OPC-UA_libOPCUA_class.odg" title="File:OPC-UA libOPCUA class.odg">Діаграма: Статична діаграма клаÑів бібліотеки libOPC_UA.</a></li> <li> <a class="external" href="http://oscada.org/wiki/File:OPC-UA_openssl.cnf" title="File:OPC-UA openssl.cnf">Файл конфігурації ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñертифікату Ð´Ð»Ñ OPC-UA.</a></li></ul> </div><table style="border-top: dotted 2px #999999; margin-top: 20pt; color: gray;" width="100%"><tr><td style="text-align: left;" width="40%"><a href="http://oscada.org/wiki/Modules/OPC_UA/uk">Modules/OPC_UA/uk</a> - <a href="http://oscada.org/en/main/about-the-project/licenses/">GFDL</a></td><td style="text-align: center;">April 2025</td><td style="text-align: right;" width="40%">OpenSCADA 1+r3018</td></tr></table></body> </html>