<?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="ru">Модули/OPC UA</h1> </div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="ru"><div class="mw-pt-translate-header noprint" dir="ltr" lang="en">This page is a <span class="plainlinks"><a class="external text" href="http://oscada.org/wiki/index.php?title=Special:Translate&group=page-Modules%2FOPC+UA&action=page&filter=&language=ru" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Modules/OPC_UA" title="Modules/OPC UA">Modules/OPC UA</a> and the translation is 96% 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> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">mRussian</span> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../uk/Modules/OPC_UA.html" title="Модулі/OPC UA (100% translated)">УкраїнÑька</a></div></div> <table class="wikitable"> <tr> <th> Модуль </th> <th> Ð˜Ð¼Ñ </th> <th> ВерÑÐ¸Ñ </th> <th> Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ </th> <th> ИÑточник </th> <th> Языки </th> <th> Платформы </th> <th> Тип </th> <th> Ðвтор </th></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 и иÑходные текÑÑ‚Ñ‹ ANSIС-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.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D0.B8_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.B0"><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.B6.D0.B8.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2_.D0.BF.D0.BE_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.83_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_.D1.81.D0.B1.D0.BE.D1.80.D0.B0_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.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.D1.8A.D0.B5.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.BB.D0.B5.D1.80.D0.B0"><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.D1.8B"><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.D1.8B.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.D0.B8.D1.87.D0.B5.D1.81.D0.BA.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.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F"><span class="tocnumber">3.3</span> <span class="toctext"><span>API пользовательÑкого программированиÑ</span></span></a></li> </ul> </li> <li class="toclevel-1 tocsection-10"><a href="#.D0.91.D0.B8.D0.B1.D0.BB.D0.B8.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.B5.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D1.8B.2C_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D0.B8_.D0.BA.D0.BB.D0.B0.D1.81.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.D0.BD.D1.8B.D0.B5"><span class="tocnumber">4.1.1</span> <span class="toctext">Данные</span></a></li> <li class="toclevel-3 tocsection-13"><a href="#.D0.92.D0.BD.D0.B5.D1.88.D0.BD.D0.B8.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8"><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.D1.8A.D0.B5.D0.BA.D1.82_.D0.B0.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D1.80.D0.B0.D0.B7.D0.B1.D0.BB.D0.BE.D0.BA.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F_POSIX_.D0.BC.D1.8E.D1.82.D0.B5.D0.BA.D1.81.D0.B0_.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.9E.D1.88.D0.B8.D0.B1.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.D1.8A.D0.B5.D0.BA.D1.82_.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="#Root_object_of_the_OPC-UA_protocol_.28UA.29"><span class="tocnumber">4.1.7</span> <span class="toctext">Root object of the OPC-UA protocol (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.BD.D1.8B.D0.B9_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D0.BE.D0.B2_.D0.B1.D0.B5.D0.B7.D0.BE.D0.BF.D0.B0.D1.81.D0.BD.D0.BE.D1.81.D1.82.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.BE.D0.B9_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.D1.8B.D0.B9_.D1.81.D0.B5.D0.B0.D0.BD.D1.81_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D0.B8.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D0.B0_.D0.9F.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.BE.D0.B9_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.BE.D0.BF.D0.B0.D1.81.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.D0.B0_.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.BB.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F_.D0.BE.D0.B1.D0.B7.D0.BE.D1.80.D0.B0_.D0.A1.D0.B5.D0.B0.D0.BD.D1.81.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D0.B8.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D0.B0_.D0.9F.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.AD.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.B8.D1.8F_.D0.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D0.B0_.D0.9C.D0.BE.D0.BD.D0.B8.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D0.B0_.D0.9F.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.D0.BE.D0.BD.D0.B5.D1.87.D0.BD.D0.B0.D1.8F_.D0.A2.D0.BE.D1.87.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.8B.D0.B5_.D0.BA.D0.BB.D1.8E.D1.87.D0.B8_.D0.B8_.D1.81.D0.B5.D1.80.D1.82.D0.B8.D1.84.D0.B8.D0.BA.D0.B0.D1.82.D1.8B"><span class="tocnumber">5</span> <span class="toctext">Приватные ключи и Ñертификаты</span></a></li> <li class="toclevel-1 tocsection-33"><a href="#.D0.97.D0.B0.D0.BC.D0.B5.D1.87.D0.B0.D0.BD.D0.B8.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.D0.B0_.D1.81.D0.BE.D0.B2.D0.BC.D0.B5.D1.81.D1.82.D0.B8.D0.BC.D0.BE.D1.81.D1.82.D0.B8_.D1.81_.D1.80.D0.B5.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F.D0.BC.D0.B8_OPC-UA_.D0.B4.D1.80.D1.83.D0.B3.D0.B8.D1.85_.D0.BF.D1.80.D0.BE.D0.B8.D0.B7.D0.B2.D0.BE.D0.B4.D0.B8.D1.82.D0.B5.D0.BB.D0.B5.D0.B9"><span class="tocnumber">7</span> <span class="toctext"><span>Таблица ÑовмеÑтимоÑти Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñми OPC-UA других производителей</span></span></a></li> <li class="toclevel-1 tocsection-35"><a href="#.D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8"><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.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D0.B8_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.B0"><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:930px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prt_serv_ru.png"><img class="thumbimage" height="491" src="../files/OPC-UA_prt_serv_ru.png" width="928" /></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.B6.D0.B8.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2_.D0.BF.D0.BE_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D1.83_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:676px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prt_eps_ru.png"><img class="thumbimage" height="505" src="../files/OPC-UA_prt_eps_ru.png" width="674" /></a> <div class="thumbcaption">РиÑ.2. Конечные узлы протокола.</div></div></div></div> <p>Конечный узел протокола OPC-UA Ñто фактичеÑки объект Ñервера OPC-UA. Конечные узлы в OPC-UA могут быть как локальными, так и удалёнными. Локальные конечные узлы предназначены Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€ÐµÑурÑов Ñтанции OpenSCADA по протоколу OPC-UA, в тоже Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ðµ конечные узлы Ñлужат Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ðº ÑервиÑа обзора доÑтупных OPC-UA узлов, так и Ð´Ð»Ñ ÑˆÐ»ÑŽÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов к удалённым ÑтанциÑм. Ð’ данной верÑии Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… конечных узлов. </p><p>General configuration of the endpoint node is made on the main tab of the endpoint node's page (Fig.3) with parameters: </p> <ul><li> Node status, as follow: common status, lists of the active sessions and subscriptions, "Enabled" and the name of the database containing the configuration, with tracking the availability of the data in different storages and providing the sequentially removing duplicates.</li> <li> Identifier, name and description of the node.</li> <li> State, in which to transfer the node at the start: "Enabled".</li> <li> Type of the protocol encoding, at the moment it is only "Binary".</li> <li> URL of the endpoint node.</li> <li> Anonymous user of enabling the anonymous access, or only authentication at empty.</li> <li> Server certificate and private key in the PEM format.</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> Hidden in the enabled state.</dd></dl> <ul><li> Security Server Policy.</li></ul> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:875px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prt_ep_main.png"><img class="thumbimage" height="928" src="../../en/files/OPC-UA_prt_ep_main.png" width="873" /></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_.D1.81.D0.B1.D0.BE.D1.80.D0.B0_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.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.D1.8A.D0.B5.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.BB.D0.B5.D1.80.D0.B0"><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:804px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_cntr_main.png"><img class="thumbimage" height="817" src="../../en/files/OPC-UA_cntr_main.png" width="802" /></a> <div class="thumbcaption">РиÑ.4. Вкладка конфигурации объекта контроллера OPC-UA.</div></div></div></div> <p>From this tab you can set: </p> <ul><li> The state of the controller object, as follows: Status, "Enabled", "Running" and the name of the storage containing the configuration.</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> Manual restart of the enabled controller object causes the force reformation of the monitored items list.</dd></dl> <ul><li> Identifier, name and description of the controller.</li> <li> The state "Enabled" and "Running", in which the controller object must be translated at boot.</li> <li> Scheduling policy and priority of the task of the data acquisition.</li> <li> Period of synchronization of the configuration of attributes of the parameters with the remote station, and try time for the connection restore.</li> <li> URL of the endpoint node of the remote station — OPC-UA server. In begin, the address you can point as "<b>opc.tcp://{IP|name}:{port}</b>", after that, at the controller's object enable and allowing the pointed OPC-UA node, there will be emerged to select the refined address.</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> Often there meets a situation when the refined address is symbolic which does not resolve into the network by the server incorrect configuration. In this cases you need to keep the original IP-address or the name which resolved to the correct IP.</dd></dl> <ul><li> Security policy and mode of the messaging security.</li> <li> Client certificate and private key in the PEM format.</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> Hidden in the running state.</dd></dl> <ul><li> User and password to authenticate on the server, empty value here enable the anonymous access.</li> <li> Asynchronous write. Enables asynchronously writing of the changes to the controller, in the general acquisition cycle and after the data acquisition itself, blocking of reading the written values on one cycle (before the writing buffer clearing).</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> This mode also prevents for loss the writing data at the connection loss and the wrote data will be transmitted just the connection will be restored.</dd></dl> <ul><li> Use the "Read" function, otherwise there is activated and used the Publish (asynchronous) data acquisition service of the OPC-UA protocol.</li></ul> <p>С целью Ð¾Ð±Ð»ÐµÐ³Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ узлов на удалённой Ñтанции, а также выбора их Ð´Ð»Ñ Ð²Ñтавки в объекте параметра контроллера, в Ñамом объекте контроллера предуÑмотрена вкладка навигации по узлам удалённой Ñтанции "Обзор узлов Ñервера", где можно пройти по дереву объектов и ознакомитÑÑ Ñ Ð¸Ñ… атрибутами (риÑ.5). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:729px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_cntr_browse_ru.png"><img class="thumbimage" height="671" src="../files/OPC-UA_cntr_browse_ru.png" width="727" /></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.D1.8B"><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.D1.8B.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_ru.png"><img class="thumbimage" height="668" src="../files/OPC-UA_prm_ru.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:688px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UA_prm_atr_ru.png"><img class="thumbimage" height="589" src="../files/OPC-UA_prm_atr_ru.png" width="686" /></a> <div class="thumbcaption">РиÑ.7. Вкладка атрибутов параметра.</div></div></div></div> <h4><span class="mw-headline" id=".D0.9B.D0.BE.D0.B3.D0.B8.D1.87.D0.B5.D1.81.D0.BA.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:810px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UALog_prm_ru.png"><img class="thumbimage" height="589" src="../files/OPC-UALog_prm_ru.png" width="808" /></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:810px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UALog_tmpl_ru.png"><img class="thumbimage" height="589" src="../files/OPC-UALog_tmpl_ru.png" width="808" /></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:810px;"><a class="image" href="http://oscada.org/wiki/File:OPC-UALog_prm_atr_ru.png"><img class="thumbimage" height="589" src="../files/OPC-UALog_prm_atr_ru.png" width="808" /></a> <div class="thumbcaption">РиÑ.10. Вкладка атрибутов параметра логичеÑкого типа.</div></div></div></div> <h3><span class="mw-headline" id="API_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F"><span class="mw-headline-number">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.D0.B8.D0.B1.D0.BB.D0.B8.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.B5.D0.B1.D0.BD.D1.8B.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D1.8B.2C_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D0.B8_.D0.BA.D0.BB.D0.B0.D1.81.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.D0.BD.D1.8B.D0.B5"><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.92.D0.BD.D0.B5.D1.88.D0.BD.D0.B8.D0.B5_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8"><span class="mw-headline-number">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.D1.8A.D0.B5.D0.BA.D1.82_.D0.B0.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D1.80.D0.B0.D0.B7.D0.B1.D0.BB.D0.BE.D0.BA.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F_POSIX_.D0.BC.D1.8E.D1.82.D0.B5.D0.BA.D1.81.D0.B0_.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.9E.D1.88.D0.B8.D0.B1.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.D1.8A.D0.B5.D0.BA.D1.82_.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>Public methods:</b> </p> <ul><li> <i>NodeId( uint32_t n, uint16_t ns = 0 );</i> — Numerical initial constructor for number <i>n</i> in the namespace <i>ns</i>.</li> <li> <i>NodeId( const string &str, uint16_t ns = 0, Type tp = String );</i> — String initial constructor for string <i>str</i> into the namespace <i>ns</i> with the type <i>tp</i>.</li> <li> <i>NodeId( const NodeId &node );</i> — The object copy constructor.</li> <li> <i>NodeId( );</i> — Destructor.</li> <li> <i>bool operator==( const NodeId &node );</i> — Objects comparing.</li> <li> <i>NodeId &operator=( const NodeId &node );</i> — Copying the object.</li> <li> <i>Type type( ) const;</i> — Node type.</li> <li> <i>bool isNull( ) const;</i> — Node is zero — uninitialized.</li> <li> <i>uint16_t ns( ) const;</i> — Namespace.</li> <li> <i>uint32_t numbVal( ) const;</i> — Number value.</li> <li> <i>string strVal( ) const;</i> — String value.</li> <li> <i>void setNs( uint16_t ns );</i> — Name space setting to <i>ns</i>.</li> <li> <i>void setNumbVal( uint32_t n );</i> — Number value setting to <i>n</i>.</li> <li> <i>void setStrVal( const string &str, Type tp = String );</i> — String value setting to <i>str</i> with type <i>tp</i>.</li> <li> <i>static NodeId fromAddr( const string &strAddr, bool strictStr = false, int *off = NULL );</i> — Node's object forming from the address <i>strAddr</i>, as a strict string <i>strictStr</i> and with the address parsing end in <i>off</i>.</li> <li> <i>string toAddr( ) const;</i> — Node's object address getting.</li></ul> <h4><span class="mw-headline" id="Root_object_of_the_OPC-UA_protocol_.28UA.29"><span class="mw-headline-number">4.1.7</span> Root object of the OPC-UA protocol (UA)</span></h4> <p><b>Public methods:</b> </p> <ul><li> <i>virtual string lang2CodeSYS( );</i> — Two-symbol language code of the environment.</li> <li> <i>virtual void debugMess( const string &mess )</i> — Debug messages placing.</li> <li> <i>virtual uint32_t rcvBufSz( );</i> — Receiver buffer size, great for 8192.</li> <li> <i>virtual uint32_t sndBufSz( );</i> — Transmitter buffer size, great for 8192.</li> <li> <i>virtual uint32_t msgMaxSz( );</i> — Maximum message size, 0 for unlimited.</li> <li> <i>virtual uint32_t chunkMaxCnt( );</i> — Maximum chunks counter, 0 for unlimited.</li> <li> <i>static string iErr( const string &buf, int &off );</i> — Error reading from the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static const char *iVal( const string &buf, int &off, char vSz );</i> — Value in size <i>vSz</i> reading from the stream <i>buf</i> by the offset <i>off</i>, as a data part.</li> <li> <i>static int64_t iN( const string &rb, int &off, char vSz );</i> — Value of signed integer in size <i>vSz</i> (1, 2, 4, 8) reading from the stream <i>rb</i> by the offset <i>off</i>.</li> <li> <i>static uint64_t iNu( const string &rb, int &off, char vSz );</i> — Value of unsigned integer in size <i>vSz</i> (1, 2, 4, 8) reading from the stream <i>rb</i> by the offset <i>off</i>.</li> <li> <i>static double iR( const string &rb, int &off, char vSz = 4 );</i> — Value of real in size <i>vSz</i> (4, 8) reading from the stream <i>rb</i> by the offset <i>off</i>.</li> <li> <i>static string iS( const string &buf, int &off );</i> — String reading from the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static string iSl( const string &buf, int &off, string *locale = NULL );</i> — Localized <i>locale</i> string reading from the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static string iSqlf( const string &buf, int &off, uint16_t *nsIdx = NULL );</i> — String with the qualify <i>nsIdx</i> reading from the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static int64_t iTm( const string &buf, int &off );</i> — Time reading from the stream <i>buf</i> by the offset <i>off</i>, with conversion it to the UNIX epoch.</li> <li> <i>static NodeId iNodeId( const string &buf, int &off );</i> — Node identifier reading from the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static string iVariant( const string &buf, int &off, uint8_t *tp = NULL );</i> — Variant type reading from the stream <i>buf</i> by the offset <i>off</i>, returns the variant in string representing of type <i>tp</i>.</li> <li> <i>static void iDataValue( const string &buf, int &off, XML_N &nVal );</i> — Complex value (structure DataValue) reading to <i>nVal</i> from the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oN( string &buf, int64_t val, char sz, int off = -1 );</i> — Value of signed integer <i>val</i> in size <i>sz</i> (1, 2, 4, 8) writing to the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oNu( string &buf, uint64_t val, char sz, int off = -1 );</i> — Value of unsigned integer <i>val</i> in size <i>sz</i> (1, 2, 4, 8) writing to the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oR( string &buf, double val, char sz = 4 );</i> — Value of real <i>val</i> in size <i>sz</i> (4, 8) writing to the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oS( string &buf, const string &val, int off = -1 );</i> — String <i>val</i> writing to the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oSl( string &buf, const string &val, const string &locale = "" );</i> — Localized <i>locale</i> string <i>val</i> writing to the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oSqlf( string &buf, const string &val, uint16_t nsIdx = 0 );</i> — String <i>val</i> with the qualify <i>nsIdx</i> writing to the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oTm( string &buf, int64_t val );</i> — Time <i>val</i> (in the UNIX epoch) writing to the stream <i>buf</i> by the offset <i>off</i>.</li> <li> <i>static void oNodeId( string &buf, const NodeId &val );</i> — Node identifier <i>val</i> writing to the stream <i>buf</i> by the offset <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> — Writing to the stream <i>buf</i> of browsing description (structure ReferenceDescription) for the result mask <i>resMask</i>, the node <i>nodeId</i>, the reference type <i>refTypeId</i>, the forward direction <i>isForward</i>, the name <i>name</i>, the node class <i>nodeClass</i>, the definition type <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> — Complex value (structure DataValue) writing to the stream <i>buf</i> for the encoding mask <i>eMsk</i>, the value <i>vl</i>, the value mask <i>vEMsk</i>, the source time <i>srcTmStmp</i>.</li> <li> <i>static string randBytes( int num );</i> — Random data stream generation in the number <i>num</i>.</li> <li> <i>static string certPEM2DER( const string &certPem );</i> — Certificate conversion from PEM <i>certPem</i> to DER form.</li> <li> <i>static string certDER2PEM( const string &certDer );</i> — Certificate conversion from DER <i>certDer</i> to PEM form.</li> <li> <i>static string certThumbprint( const string &certPem );</i> — Sign getting from the certificate PEM <i>certPem</i>.</li> <li> <i>static string asymmetricEncrypt( const string &mess, const string &certPem, const string &secPolicy );</i> — Asymmetric encryption of the message <i>mess</i> stream by the certificate <i>certPem</i> (by the open key) for the policy <i>secPolicy</i>.</li> <li> <i>static string asymmetricDecrypt( const string &mess, const string &pvKeyPem, const string &secPolicy );</i> — Asymmetric decryption of the message <i>mess</i> stream by the key <i>pvKeyPem</i> for the certificate <i>secPolicy</i>.</li> <li> <i>static bool asymmetricVerify( const string &mess, const string &sign, const string &certPem );</i> — Asymmetric verifying of the <i>sign</i> of the message <i>mess</i> by the certificate <i>certPem</i>.</li> <li> <i>static string asymmetricSign( const string &mess, const string &pvPem );</i> — Asymmetric subscription getting by the private key of the certificate <i>pvPem</i> for the message <i>mess</i>.</li> <li> <i>static int asymmetricKeyLength( const string &keyCertPem );</i> — Key length getting of the certificate <i>keyCertPem</i>.</li> <li> <i>static string deriveKey( const string &secret, const string &seed, int keyLen );</i> — Key of the length <i>keyLen</i> derive from the <i>secret</i> and the <i>seed</i>.</li> <li> <i>static string symmetricCrypt( const string &mess, const string &keySet, const string &secPolicy, bool encrypt );</i> — Symmetric encryption at <i>encrypt</i> or decryption of the message <i>mess</i> stream by the key <i>keySet</i> for the policy <i>secPolicy</i>.</li> <li> <i>static string symmetricSign( const string &mess, const string &keySet, const string &secPolicy );</i> — Symmetric sign by key <i>keySet</i> getting for the message <i>mess</i> and the policy <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.BD.D1.8B.D0.B9_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.BF.D0.B0.D1.80.D0.B0.D0.BC.D0.B5.D1.82.D1.80.D0.BE.D0.B2_.D0.B1.D0.B5.D0.B7.D0.BE.D0.BF.D0.B0.D1.81.D0.BD.D0.BE.D1.81.D1.82.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.BE.D0.B9_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.D1.8B.D0.B9_.D1.81.D0.B5.D0.B0.D0.BD.D1.81_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D0.B8.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D0.B0_.D0.9F.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.9A.D0.BB.D0.B8.D0.B5.D0.BD.D1.82.D0.B0_.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.BE.D0.B9_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.BE.D0.BF.D0.B0.D1.81.D0.BD.D0.BE.D1.81.D1.82.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.D0.B0_.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>Public attributes:</b> </p> <ul><li> <i>string name, inPrtId;</i> — name and input protocol identifier;</li> <li> <i>string idPolicyId, user;</i> — the policy identifier and user of the authentication;</li> <li> <i>uint32_t secCnl;</i> — security channel, linked the session;</li> <li> <i>double tInact;</i> — inactivity time;</li> <li> <i>int64_t tAccess;</i> — access time;</li> <li> <i>string servNonce;</i> — random sequence of the server;</li> <li> <i>map<string, ContPoint> cntPnts;</i> — browse's continuation points;</li> <li> <i>deque<string> publishReqs;</i> — publish requests list.</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.BB.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F_.D0.BE.D0.B1.D0.B7.D0.BE.D1.80.D0.B0_.D0.A1.D0.B5.D0.B0.D0.BD.D1.81.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82_.D0.9C.D0.BE.D0.BD.D0.B8.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D0.B0_.D0.9F.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.AD.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.B8.D1.8F_.D0.AD.D0.BB.D0.B5.D0.BC.D0.B5.D0.BD.D1.82.D0.B0_.D0.9C.D0.BE.D0.BD.D0.B8.D1.82.D0.BE.D1.80.D0.B8.D0.BD.D0.B3.D0.B0_.D0.9F.D0.BE.D0.B4.D0.BF.D0.B8.D1.81.D0.BA.D0.B8_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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.D0.BE.D0.BD.D0.B5.D1.87.D0.BD.D0.B0.D1.8F_.D0.A2.D0.BE.D1.87.D0.BA.D0.B0_.D0.A1.D0.B5.D1.80.D0.B2.D0.B5.D1.80.D0.B0_.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>sec</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>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.8B.D0.B5_.D0.BA.D0.BB.D1.8E.D1.87.D0.B8_.D0.B8_.D1.81.D0.B5.D1.80.D1.82.D0.B8.D1.84.D0.B8.D0.BA.D0.B0.D1.82.D1.8B"><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> <span class="nv">$ </span>openssl genrsa -out key_c.pem -des3 -rand /var/log/messages 2048 <span class="c"># Создание приватного ключа без паролÑ:</span> <span class="nv">$ </span>openssl rsa -in key_c.pem -out key_c1.pem <span class="c"># Создание ÑамоподпиÑанного Ñертификата:</span> <span class="nv">$ </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.D0.BC.D0.B5.D1.87.D0.B0.D0.BD.D0.B8.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.D0.B0_.D1.81.D0.BE.D0.B2.D0.BC.D0.B5.D1.81.D1.82.D0.B8.D0.BC.D0.BE.D1.81.D1.82.D0.B8_.D1.81_.D1.80.D0.B5.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F.D0.BC.D0.B8_OPC-UA_.D0.B4.D1.80.D1.83.D0.B3.D0.B8.D1.85_.D0.BF.D1.80.D0.BE.D0.B8.D0.B7.D0.B2.D0.BE.D0.B4.D0.B8.D1.82.D0.B5.D0.BB.D0.B5.D0.B9"><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.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8"><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/ru">Modules/OPC_UA/ru</a> - <a href="http://oscada.org/en/main/about-the-project/licenses/">GFDL</a></td><td style="text-align: center;">April 2025</td><td style="text-align: right;" width="40%">OpenSCADA 1+r3018</td></tr></table></body> </html>