<?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>Модули/ModBus - 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">Модули/ModBus</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%2FModBus&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/ModBus" title="Modules/ModBus">Modules/ModBus</a> and the translation is 94% 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/ModBus.html" title="Modules/ModBus (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/ModBus.html" title="Модулі/ModBus (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/ModBus.html" title="Special:MyLanguage/Modules/ModBus">ModBus</a> </td> <td> ModBus </td> <td> 3.8 </td> <td> GPL2 </td> <td> daq_ModBus.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"> ПредоÑтавлÑет реализацию клиентÑкого ÑервиÑа протокола ModBus. ПоддерживаютÑÑ ModBus/TCP, ModBus/RTU и ModBus/ASCII протоколы. </td></tr> <tr> <td> <a href="../Modules/ModBus.html" title="Special:MyLanguage/Modules/ModBus">ModBus</a> </td> <td> ModBus </td> <td> 2.10 </td> <td> GPL2 </td> <td> daq_ModBus.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"> ПредоÑтавлÑет реализацию протоколов ModBus. ПоддерживаютÑÑ ModBus/TCP, ModBus/RTU и ModBus/ASCII протоколы. <ul><li> <b>ÐžÐ±Ñ‰Ð°Ñ Ñ‚Ñ€ÑƒÐ´Ð¾Ñ‘Ð¼ÐºÐ¾ÑÑ‚ÑŒ:</b> > 20 <span title="человеко-дней, 1ЧД — 10 чаÑов">ЧД<sup style="color: blue">[!]</sup></span></li> <li> <b><a href="../../en/To_do.html" title="Special:MyLanguage/Works/To do">Задачи (To Do)</a>:</b></li></ul> <dl><dd> - </dd></dl> </td></tr></table> <p>ModBus — коммуникационный протокол, оÑнованный на клиент-Ñерверной архитектуре. Разработан фирмой Modicon Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² контроллерах Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð¸Ñ€ÑƒÐµÐ¼Ð¾Ð¹ логикой (PLC). Стал Ñтандартом де-факто в промышленноÑти и широко применÑетÑÑ Ð´Ð»Ñ Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ÑвÑзи промышленного Ñлектронного оборудованиÑ. ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ данных через поÑледовательные линии ÑвÑзи RS-485, RS-422, RS-232, а также Ñети TCP/IP. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ð½ÐµÐºÐ¾Ð¼Ð¼ÐµÑ€Ñ‡ÐµÑкой организацией ModBus-IDA. </p><p>СущеÑтвуют три режима протокола: ModBus/RTU, ModBus/ASCII и ModBus/TCP. Первые два иÑпользуют поÑледовательные линии ÑвÑзи (в оÑновном RS-485, реже RS-422/RS-232), поÑледний иÑпользует Ñети TCP/IP Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ данных. </p><p>Модуль Ñбора данных предоÑтавлÑет возможноÑÑ‚ÑŒ Ñобирать информацию у различных уÑтройÑтв по протоколу ModBus во вÑех режимах. Также, модулем реализуютÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ горизонтального резервированиÑ, а именно — ÑовмеÑтной работы Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð¹ Ñтанцией Ñтого-же уровнÑ. Ð’ то же времÑ, модуль протокола позволÑет Ñформировать и выдать данные по протоколу ModBus в различных режимах и через интерфейÑÑ‹, поддерживаемые модулÑми <a href="../Program_manual.html#Communication" title="Special:MyLanguage/Documents/Program manual">подÑиÑтемы "ТранÑпорты"</a>. </p> <div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div> <ul> <li class="toclevel-1 tocsection-1"><a href="#.D0.9E.D0.B1.D1.89.D0.B5.D0.B5_.D0.BE.D0.BF.D0.B8.D1.81.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.B0_ModBus"><span class="tocnumber">1</span> <span class="toctext">Общее опиÑание протокола ModBus</span></a> <ul> <li class="toclevel-2 tocsection-2"><a href="#.D0.90.D0.B4.D1.80.D0.B5.D1.81.D0.B0.D1.86.D0.B8.D1.8F"><span class="tocnumber">1.1</span> <span class="toctext">ÐдреÑациÑ</span></a></li> <li class="toclevel-2 tocsection-3"><a href="#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D1.8B.D0.B5_.D0.BA.D0.BE.D0.B4.D1.8B_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9"><span class="tocnumber">1.2</span> <span class="toctext">Стандартные коды функций</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.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-5"><a href="#API_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D0.B8.D1.81.D1.85.D0.BE.D0.B4.D1.8F.D1.89.D0.B8.D1.85_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2"><span class="tocnumber">2.1</span> <span class="toctext">API функции иÑходÑщих запроÑов</span></a></li> <li class="toclevel-2 tocsection-6"><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_ModBus"><span class="tocnumber">2.2</span> <span class="toctext">ОбÑлуживание запроÑов по протоколу ModBus</span></a> <ul> <li class="toclevel-3 tocsection-7"><a href="#.D0.A0.D0.B5.D0.B6.D0.B8.D0.BC_.22.D0.94.D0.B0.D0.BD.D0.BD.D1.8B.D0.B5.22"><span class="tocnumber">2.2.1</span> <span class="toctext">Режим "Данные"</span></a></li> <li class="toclevel-3 tocsection-8"><a href="#.D0.A0.D0.B5.D0.B6.D0.B8.D0.BC_.22.D0.A8.D0.BB.D1.8E.D0.B7_.D1.83.D0.B7.D0.BB.D0.B0.22"><span class="tocnumber">2.2.2</span> <span class="toctext">Режим "Шлюз узла"</span></a></li> <li class="toclevel-3 tocsection-9"><a href="#.D0.A0.D0.B5.D0.B6.D0.B8.D0.BC_.22.D0.A8.D0.BB.D1.8E.D0.B7_.D1.81.D0.B5.D1.82.D0.B8.22"><span class="tocnumber">2.2.3</span> <span class="toctext">Режим "Шлюз Ñети"</span></a></li> </ul> </li> <li class="toclevel-2 tocsection-10"><a href="#.D0.9E.D1.82.D1.87.D1.91.D1.82_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2_ModBus"><span class="tocnumber">2.3</span> <span class="toctext"><span>Отчёт запроÑов ModBus</span></span></a></li> </ul> </li> <li class="toclevel-1 tocsection-11"><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>Модуль Ñбора данных</span></span></a> <ul> <li class="toclevel-2 tocsection-12"><a href="#.D0.9E.D0.B1.D1.8A.D0.B5.D0.BA.D1.82_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D0.BB.D0.B5.D1.80.D0.B0"><span class="tocnumber">3.1</span> <span class="toctext">Объект контроллера</span></a></li> <li class="toclevel-2 tocsection-13"><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-14"><a href="#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D0.BD.D1.8B.D0.B9_.28Prm.29"><span class="tocnumber">3.2.1</span> <span class="toctext">Стандартный (Prm)</span></a></li> <li class="toclevel-3 tocsection-15"><a href="#.D0.9B.D0.BE.D0.B3.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B9_.28PrmL.29"><span class="tocnumber">3.2.2</span> <span class="toctext">ЛогичеÑкий (PrmL)</span></a></li> </ul> </li> <li class="toclevel-2 tocsection-16"><a href="#API_.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D1.81.D0.BA.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F"><span class="tocnumber">3.3</span> <span class="toctext"><span>API пользовательÑкого программированиÑ</span></span></a></li> </ul> </li> <li class="toclevel-1 tocsection-17"><a href="#.D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8"><span class="tocnumber">4</span> <span class="toctext">СÑылки</span></a></li> </ul> </div> <h2><span class="mw-headline" id=".D0.9E.D0.B1.D1.89.D0.B5.D0.B5_.D0.BE.D0.BF.D0.B8.D1.81.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D1.80.D0.BE.D1.82.D0.BE.D0.BA.D0.BE.D0.BB.D0.B0_ModBus"><span class="mw-headline-number">1</span> Общее опиÑание протокола ModBus</span></h2> <p>Протокол ModBus/{RTU,ASCII} предполагает одно ведущее (запрашивающее) уÑтройÑтво в линии (master), которое может передавать команды одному или неÑкольким ведомым уÑтройÑтвам (slave), обращаÑÑÑŒ к ним по уникальному адреÑу в линии. СинтакÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ протокола позволÑет адреÑовать 247 уÑтройÑтв на одной линии ÑвÑзи Ñтандарта RS-485 (реже RS-422 или RS-232). Ð’ Ñлучае Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð¾Ð¼ TCP, адреÑÐ°Ñ†Ð¸Ñ Ð¸Ñключена из протокола, поÑкольку выполнÑетÑÑ Ð½Ð° уровне TCP/IP Ñтека. </p><p>Инициатива оÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° вÑегда иÑходит от ведущего уÑтройÑтва. Ведомые уÑтройÑтва проÑлушивают линию ÑвÑзи. МаÑтер подаёт Ð·Ð°Ð¿Ñ€Ð¾Ñ (поÑылка, поÑледовательноÑÑ‚ÑŒ байт) в линию и переходит в режим проÑÐ»ÑƒÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ð½Ð¸Ð¸ ÑвÑзи. Ведомое уÑтройÑтво отвечает на запроÑ, пришедший на его адреÑ. </p><p>Окончание ответной поÑылки определÑетÑÑ Ð² завиÑимоÑти от режима. Ð’ режиме RTU окончание поÑылки определÑетÑÑ Ð¿Ð¾ временному интервалу между окончанием приёма предыдущего байта и началом приёма Ñледующего — Ð²Ñ€ÐµÐ¼Ñ Ñимвола. ЕÑли Ñтот интервал превыÑил времÑ, необходимое Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ‘Ð¼Ð° полтора байта на заданной ÑкороÑти передачи то приём фрейма ответа ÑчитаетÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ñ‹Ð¼. Ð’ режиме ASCII критерием Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñылки ÑвлÑетÑÑ Ñимвол '\r', а в режиме TCP — ожидаемый размер поÑылки, Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ котором приÑутÑтвует в заголовке пакета. </p> <h3><span class="mw-headline" id=".D0.90.D0.B4.D1.80.D0.B5.D1.81.D0.B0.D1.86.D0.B8.D1.8F"><span class="mw-headline-number">1.1</span> ÐдреÑациÑ</span></h3> <p>Ð’Ñе операции Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ привÑзаны к нулю, каждый вид данных (региÑÑ‚Ñ€, бит, региÑÑ‚Ñ€ входа или бита входа) начинаютÑÑ Ñ Ð°Ð´Ñ€ÐµÑа <b>0</b> и заканчиваютÑÑ <b>65535</b>. </p> <h3><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.B5_.D0.BA.D0.BE.D0.B4.D1.8B_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9"><span class="mw-headline-number">1.2</span> Стандартные коды функций</span></h3> <p>Ð’ протоколе ModBus можно выделить неÑколько подмножеÑтв команд (Таблица 1). </p><p><b>Таблица 1</b>: ПодмножеÑтва команд протокола ModBus </p> <table class="wikitable"> <tr> <td> <b>ПодмножеÑтво</b> </td> <td> <b>Диапазон кодов</b> </td></tr> <tr> <td> Стандартные </td> <td> 1-21 </td></tr> <tr> <td> Резерв Ð´Ð»Ñ Ñ€Ð°Ñширенных функций </td> <td> 22-64 </td></tr> <tr> <td> ПользовательÑкие </td> <td> 65-119 </td></tr> <tr> <td> Резерв Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ñ… нужд </td> <td> 120-255 </td></tr></table> <p>Модулем Ñбора данных иÑпользуютÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ <b>3</b> и <b>6(16)</b> Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑи региÑтров, <b>1</b> и <b>5(15)</b> Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑи битов, <b>2</b> и <b>4</b> Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð±Ð¸Ñ‚Ð° и региÑтра входа, ÑоответÑтвенно. Ð”Ð»Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ оÑтальных и нетипичных команд модулем предуÑмотрена Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ <a href="#UserAPI">API пользовательÑкого программированиÑ</a>, которую можно вызывать из <a href="../DAQ.html#LogicLev" title="Special:MyLanguage/Documents/DAQ">процедуры шаблона логичеÑкого уровнÑ</a>, отправлÑÑ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ñ‹Ðµ PDU пакеты и Ð¾Ð±Ñ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ‹Ðµ в ответ. </p><p>Модуль протокола обрабатывает запроÑÑ‹ командами <b>3</b> и <b>6(16)</b> Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑи региÑтров, <b>1</b> и <b>5(15)</b> Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑи битов. </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>Модуль протокола ModBus Ñодержит код реализации протокольной чаÑти ModBus, а именно — оÑобенноÑти вариантов протоколов ModBus/TCP, ModBus/RTU и ModBus/ASCII. Модуль протокола, ÑовмеÑтно Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ транÑпортом, активно иÑпользуетÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ Ñбора данных Ð´Ð»Ñ Ð¾ÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑредÑтвенных запроÑов. ПоÑкольку модуль протокола ÑвлÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð½Ð¾Ð¼Ð½Ñ‹Ð¼ то, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐµÐ³Ð¾, можно Ñоздавать дополнительные модули Ñбора данных поÑредÑтвом неÑтандартных функций раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ModBus различного Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸. </p> <h3><span class="mw-headline" id="API_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B8_.D0.B8.D1.81.D1.85.D0.BE.D0.B4.D1.8F.D1.89.D0.B8.D1.85_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2"><span class="mw-headline-number">2.1</span> API функции иÑходÑщих запроÑов</span></h3> <p>API функции иÑходÑщих запроÑов (<a href="../User_API.html#SYSTransport" title="Special:MyLanguage/Documents/User API">messIO()</a>) оперируют обменом блоками PDU, завёрнутыми в XML-пакеты, Ñо Ñледующей Ñтруктурой: </p> <ul><li> <b><{prt} id="{sId}" reqTm="{reqTm}" node="{node}" reqTry="{reqTry}">{pdu}</{prt}></b></li></ul> <dl><dd>Где: <ul><li> <i>prt</i> — Ð¸Ð¼Ñ Ñ‚ÐµÐ³Ð° запроÑа Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ иÑпользуемого варианта протокола (TCP, RTU или ASCII).</li> <li> <i>sId</i> — идентификатор иÑточника запроÑа. ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð² <a href="#Report">отчёт выходного протокола</a>.</li> <li> <i>reqTm</i> — Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа, а именно — времÑ, в течение которого, ожидать ответ, в миллиÑекундах.</li> <li> <i>node</i> — номер узла Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ идентификатор юнита ModBus/TCP.</li> <li> <i>reqTry</i> — количеÑтво попыток Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ в ответе. Только Ð´Ð»Ñ Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚Ð¾Ð² ModBus/{RTU,ASCII}.</li> <li> <i>pdu</i> — непоÑредÑтвенно блок юнита данных (PDU) протокола ModBus.</li></ul></dd></dl> <p>Результирующий <i>pdu</i> в XML-пакете заменÑет <i>pdu</i> запроÑа, а также уÑтанавливаетÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ "err" Ñ ÐºÐ¾Ð´Ð¾Ð¼ и текÑтом ошибки, еÑли Ñ‚Ð°ÐºÐ¾Ð²Ð°Ñ Ð¸Ð¼ÐµÐ»Ð° меÑто. </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_ModBus"><span class="mw-headline-number">2.2</span> ОбÑлуживание запроÑов по протоколу ModBus</span></h3> <p>Ð’Ñ…Ð¾Ð´Ð½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ, обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов к модулю протокола, оÑущеÑтвлÑет проверку и обработку запроÑов поÑредÑтвом предуÑмотренных модулем объектов узлов (риÑ.1). ФактичеÑки, реализуетÑÑ Ð¼ÐµÑ…Ð°Ð½Ð¸Ð·Ð¼, позволÑющий OpenSCADA выполнÑÑ‚ÑŒ роль Ñервера ModBus/TCP или подчинённого уÑтройÑтва ModBus/{RTU,ADCII}. Таким образом, OpenSCADA получает возможноÑÑ‚ÑŒ иÑпользоватьÑÑ Ð² роли любого учаÑтника Ñети ModBus. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:639px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prt_nodes_ru.png"><img class="thumbimage" height="493" src="../files/ModBus_prt_nodes_ru.png" width="637" /></a> <div class="thumbcaption">РиÑ.1. Вкладка Ð¿ÐµÑ€ÐµÑ‡Ð½Ñ ÑƒÐ·Ð»Ð¾Ð² обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´Ñщих запроÑов протокола.</div></div></div></div> <p>Узел протокола Ñквивалентен физичеÑкому узлу уÑтройÑтва Ñети ModBus и может работать в трёх режимах: </p> <ul><li> "Данные" — режим Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… OpenSCADA на маÑÑивы региÑтров и битов ModBus Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡ÐµÐ¹ их по запроÑу клиентÑкого узла или маÑтера.</li> <li> "Шлюз узла" — режим Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (шлюзованиÑ) запроÑов к узлу в другой Ñети ModBus через данный узел.</li> <li> "Шлюз Ñети" — режим Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов к любому узлу в другую Ñеть ModBus, фактичеÑки выполнÑÑ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸ÑŽ неÑкольких Ñетей ModBus в одну.</li></ul> <p>ПоÑкольку узлов протокола может быть Ñоздано множеÑтво то получаетÑÑ, что на одном интерфейÑе, Ñ‚.е. в одной Ñети, одна ÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð½Ð° оÑнове OpenSCADA может прозрачно предÑтавлÑÑ‚ÑŒ неÑколько узлов Ñети ModBus Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ данными. </p><p>РаÑÑмотрим оÑобенноÑти конфигурации узла протокола в различных режимах. </p> <h4><span class="mw-headline" id=".D0.A0.D0.B5.D0.B6.D0.B8.D0.BC_.22.D0.94.D0.B0.D0.BD.D0.BD.D1.8B.D0.B5.22"><span class="mw-headline-number">2.2.1</span> Режим "Данные"</span></h4> <p>Режим иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… OpenSCADA на маÑÑивы региÑтров и битов ModBus. ÐžÐ±Ñ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÐ·Ð»Ð° оÑущеÑтвлÑетÑÑ Ð²Ð¾ вкладке "Узел" (риÑ.2) параметрами: </p> <ul><li> СоÑтоÑние узла, а именно: ÑтатуÑ, "Включен" и Ð¸Ð¼Ñ Ð‘Ð”, Ñодержащей конфигурацию, Ñ Ð¾Ñ‚Ñлеживанием Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… в различных хранилищах и предоÑтавлением поÑледовательного ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ð¾Ð².</li> <li> Идентификатор, Ð¸Ð¼Ñ Ð¸ опиÑание узла.</li> <li> СоÑтоÑние "Включен", в которое переводить узел при загрузке.</li> <li> ÐÐ´Ñ€ÐµÑ ÑƒÐ·Ð»Ð° Ñети ModBus от 1 до 247.</li> <li> Входной транÑпорт, к Ñети которого отноÑитÑÑ ÑƒÐ·ÐµÐ». ВыбираетÑÑ Ð¸Ð· Ð¿ÐµÑ€ÐµÑ‡Ð½Ñ <a href="../Program_manual.html#TransportIn" title="Special:MyLanguage/Documents/Program manual">входных транÑпортов</a> подÑиÑтемы "ТранÑпорты" OpenSCADA. Указание Ñимвола "*" в качеÑтве транÑпорта делает данный узел учаÑтником любой Ñети ModBus Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¾Ð¹ запроÑов от любого транÑпорта.</li> <li> Вариант протокола ModBus, запроÑÑ‹ в котором должен обрабатывать узел, из ÑпиÑка: Ð’Ñе, RTU, ASCII, TCP/IP.</li> <li> Выбор режима, в данном Ñлучае Ñтот режим "Данные".</li> <li> Период обÑчёта данных в Ñекундах. Указывает период обработки формируемых Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов данных, а именно: таблицы данных ModBus, программы обÑчёта данных и обÑлуживание ÑÑылок на данные OpenSCADA.</li> <li> <a href="../Program_manual.html#DAQTmpl" title="Special:MyLanguage/Documents/Program manual">DAQ шаблон</a> или Ñзык прÑмой процедуры. ПредуÑматривает выбор шаблона или Ñзыка прÑмой процедуры Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ вычиÑÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ† данных ModBus, а также Ð´Ð»Ñ Ð¾Ð±ÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ÑÑылок на модель данных подÑиÑтемы "Сбор Данных".</li></ul> <p>Узлом в Ñтом режиме обрабатываютÑÑ Ñледующие Ñтандартные команды протокола ModBus: </p> <ul><li> <b>1</b> — чтение группы битов;</li> <li> <b>2</b> — чтение группы битов входов;</li> <li> <b>3</b> — чтение группы региÑтров;</li> <li> <b>4</b> — чтение группы региÑтров входов;</li> <li> <b>5</b> — уÑтановка одного бита;</li> <li> <b>6</b> — уÑтановка одного региÑтра;</li> <li> <b>15</b> — уÑтановка группы битов;</li> <li> <b>16</b> — уÑтановка группы региÑтров.</li></ul> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:811px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prt_node_node_ru.png"><img class="thumbimage" height="657" src="../files/ModBus_prt_node_node_ru.png" width="809" /></a> <div class="thumbcaption">РиÑ.2. Вкладка "Узел" Ñтраницы конфигурации узла протокола в режиме "Данные".</div></div></div></div> <p>To form the table of reflection the ModBus network data, that is registers and bits, the tab "Data" is provided (Fig.3). The tab "Data" contains a table of parameters and program of processing the parameters with the specified programming language which is available in OpenSCADA, but in the template there is only the table available and in the "Enabled" mode. The table contains parameters with the properties: </p> <ul><li> <i>Identifier</i> — identifier of the parameter. It is the key for formation of the tables of registers and bits of ModBus. Registers and bits of ModBus set as follows:</li></ul> <dl><dd><ul><li> <b>R{N}[w~]</b>, <b>RI{N}[w~]</b> — specific register and input register form, can be expanded by the suffixes: "i"—Int32, "f"—Float, "d"—Double, "s"—String (by default the size is 10 and up to 100 registers);</li> <li> <b>R:{N}[:w~]</b>, <b>RI:{N}[:w~]</b> — classic register and input register form, can be expanded by the suffixes: "i4"—Int32, "i8"—Int64, "f"—Float, "d"—Double, "s"—String</li> <li> <b>C{N}[w]</b>, <b>CI{N}[w]</b>, <b>C:{N}[:w]</b>, <b>CI:{N}[:w]</b> — coil and input coil.</li></ul></dd> <dd>Where: <ul><li> <b>{N}</b> — ModBus device's data address (decimal, hexadecimal or octal) [0...65535];</li> <li> <b>w~e</b> — flags: write mode 'w', registers order inversion '~', register 'e'ndian toggle (to LE in generic and BE for strings).</li></ul></dd> <dd>Examples: <dl><dd>"R0x300w" — register access;</dd> <dd>"C100w" — coil access, allowed to write;</dd> <dd>"R_f200", "R_f200~" — get float from registers 200 and 201, 201 and 200;</dd> <dd>"R_i400,300" — get int32 from registers 400 and 300;</dd> <dd>"R_s15,20" — get string, registers block, from register 15 and size 20.</dd> <dd>"R_i8:0x10:w" — get and set int64 into registers [0x10-0x13];</dd> <dd>"R_d:0x20,0x30" — get double float point (8 byte) from registers [0x20,0x30-0x32].</dd></dl></dd></dl> <dl><dt> All other parameters are internal and used for a variety of intermediate calculations, processing, conversion and their values can be operative controlled and changed from the table into execution mode.</dt></dl> <ul><li> <i>Name</i> — name of the parameter, is used for the naming of the connection.</li> <li> <i>Type</i> — type of the parameter from the list: "Real", "Integer", "Boolean" and "String". For the registers and bits of ModBus it makes sense to set the "Integer" and "Boolean" type, respectively. For registers, extended by "f" and "s" prefixes, you must specify the "Real" and "String" types respectively.</li> <li> <i>Link</i> — a sign that this parameter should be connected with the parameter attribute of the subsystem "Data acquisition". The links indicated by this sign are set in the "Template configuration" tab.</li> <li> <i>Value</i> — original or current value of the parameter, if the node is switched on.</li></ul> <p>Ð’ таблице, по умолчанию, определÑетÑÑ Ð½ÐµÑколько параметров Ñпециального назначениÑ: </p> <ul><li> <i>f_frq</i> — чаÑтота вычиÑÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ программой;</li> <li> <i>f_start</i> — признак первого иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â€” запуÑка программы.</li> <li> <i>f_stop</i> — признак поÑледнего иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â€” оÑтанова программы.</li></ul> <p><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> ПоÑкольку в указателе раÑширенных типов региÑтров может иÑпользоватьÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимый Ñимвол ',' то доÑтуп к нему из программы можно оÑущеÑтвить только альтернативным ÑпоÑобом, через объект "arguments": </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="nx">arguments</span><span class="p">[</span><span class="s2">"R_s10,5w"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"9876543210"</span><span class="p">;</span> </pre></div> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:802px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prt_node_data_ru.png"><img class="thumbimage" height="657" src="../files/ModBus_prt_node_data_ru.png" width="800" /></a> <div class="thumbcaption">РиÑ.3. Вкладка "Данные" Ñтраницы конфигурации узла протокола в режиме "Данные".</div></div></div></div> <p>Ð”Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² указанных в качеÑтве ÑвÑзей, ÑвÑзи можно уÑтановить Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð³Ð¾ узла протокола и во вкладке "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°" (риÑ.4). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:720px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prt_node_lnk_ru.png"><img class="thumbimage" height="557" src="../files/ModBus_prt_node_lnk_ru.png" width="718" /></a> <div class="thumbcaption">РиÑ.4. Вкладка "СвÑзи" Ñтраницы конфигурации узла протокола в режиме "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°".</div></div></div></div> <h4><span class="mw-headline" id=".D0.A0.D0.B5.D0.B6.D0.B8.D0.BC_.22.D0.A8.D0.BB.D1.8E.D0.B7_.D1.83.D0.B7.D0.BB.D0.B0.22"><span class="mw-headline-number">2.2.2</span> Режим "Шлюз узла"</span></h4> <p>Режим иÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов к отдельному уÑтройÑтву в другой Ñети ModBus, из Ñети ModBus Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ Ñконфигурирован данный узел. ÐžÐ±Ñ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÐ·Ð»Ð° оÑущеÑтвлÑетÑÑ Ð²Ð¾ вкладке "Узел" (риÑ.5) параметрами: </p> <ul><li> СоÑтоÑние узла, а именно: ÑтатуÑ, "Включен" и Ð¸Ð¼Ñ Ð‘Ð”, Ñодержащей конфигурацию.</li> <li> Идентификатор, Ð¸Ð¼Ñ Ð¸ опиÑание узла.</li> <li> СоÑтоÑние "Включен", в которое переводить узел при загрузке.</li> <li> ÐÐ´Ñ€ÐµÑ ÑƒÐ·Ð»Ð° иÑходной Ñети ModBus от 1 до 247.</li> <li> Входной транÑпорт, к Ñети которого отноÑитÑÑ ÑƒÐ·ÐµÐ». ВыбираетÑÑ Ð¸Ð· Ð¿ÐµÑ€ÐµÑ‡Ð½Ñ <a href="../Program_manual.html#TransportIn" title="Special:MyLanguage/Documents/Program manual">входных транÑпортов</a> подÑиÑтемы "ТранÑпорты" OpenSCADA. Указание Ñимвола "*" в качеÑтве транÑпорта делает данный узел учаÑтником любой Ñети ModBus Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¾Ð¹ запроÑов от любого транÑпорта.</li> <li> Вариант протокола ModBus запроÑÑ‹, в котором должен обрабатывать узел, из ÑпиÑка: Ð’Ñе, RTU, ASCII, TCP/IP.</li> <li> Выбор режима, в данном Ñлучае Ñтот режим "Шлюз узла".</li> <li> ТранÑпорт, в который перенаправлÑÑ‚ÑŒ запроÑ, из Ð¿ÐµÑ€ÐµÑ‡Ð½Ñ <a href="../Program_manual.html#TransportOut" title="Special:MyLanguage/Documents/Program manual">иÑходÑщих транÑпортов</a> подÑиÑтемы "ТранÑпорты".</li> <li> Протокол, в котором перенаправлÑÑ‚ÑŒ запроÑ.</li> <li> ÐÐ´Ñ€ÐµÑ ÑƒÐ·Ð»Ð° Ñети ModBus, от 1 до 247, в которую перенаправлÑетÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ.</li></ul> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:684px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prt_node_nodeGwNode_ru.png"><img class="thumbimage" height="679" src="../files/ModBus_prt_node_nodeGwNode_ru.png" width="682" /></a> <div class="thumbcaption">РиÑ.5. Вкладка "Узел" Ñтраницы конфигурации узла протокола в режиме "Шлюз узла".</div></div></div></div> <h4><span class="mw-headline" id=".D0.A0.D0.B5.D0.B6.D0.B8.D0.BC_.22.D0.A8.D0.BB.D1.8E.D0.B7_.D1.81.D0.B5.D1.82.D0.B8.22"><span class="mw-headline-number">2.2.3</span> Режим "Шлюз Ñети"</span></h4> <p>Режим иÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов Ñети целиком в другую Ñеть ModBus, из Ñети ModBus Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ Ñконфигурирован данный узел протокола. Т.е., Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° уÑтройÑтво Ñ Ð»ÑŽÐ±Ñ‹Ð¼ адреÑом будет направлÑÑ‚ÑŒÑÑ Ð² другую Ñеть, без переадреÑовки. ÐžÐ±Ñ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÐ·Ð»Ð° протокола оÑущеÑтвлÑетÑÑ Ð²Ð¾ вкладке "Узел" (риÑ.6) параметрами: </p> <ul><li> СоÑтоÑние узла, а именно: ÑтатуÑ, "Включен" и Ð¸Ð¼Ñ Ð‘Ð”, Ñодержащей конфигурацию.</li> <li> Идентификатор, Ð¸Ð¼Ñ Ð¸ опиÑание узла.</li> <li> СоÑтоÑние "Включен", в которое переводить узел при загрузке.</li> <li> Входной транÑпорт Ñети, из которой перенаправлÑÑŽÑ‚ÑÑ Ð·Ð°Ð¿Ñ€Ð¾ÑÑ‹. ВыбираетÑÑ Ð¸Ð· Ð¿ÐµÑ€ÐµÑ‡Ð½Ñ <a href="../Program_manual.html#TransportIn" title="Special:MyLanguage/Documents/Program manual">входных транÑпортов</a> подÑиÑтемы "ТранÑпорты" OpenSCADA.</li> <li> Вариант протокола ModBus, запроÑÑ‹ в котором должен обрабатывать узел, из ÑпиÑка: Ð’Ñе, RTU, ASCII, TCP/IP.</li> <li> Выбор режима, в данном Ñлучае Ñтот режим "Шлюз Ñети".</li> <li> ТранÑпорт Ñети, в которую перенаправлÑÑ‚ÑŒ запроÑ, из Ð¿ÐµÑ€ÐµÑ‡Ð½Ñ <a href="../Program_manual.html#TransportOut" title="Special:MyLanguage/Documents/Program manual">выходных транÑпортов</a> подÑиÑтемы "ТранÑпорты".</li> <li> Протокол, в котором перенаправлÑÑ‚ÑŒ запроÑ.</li></ul> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:684px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prt_node_nodeGwNet_ru.png"><img class="thumbimage" height="628" src="../files/ModBus_prt_node_nodeGwNet_ru.png" width="682" /></a> <div class="thumbcaption">РиÑ.6. Вкладка "Узел" Ñтраницы конфигурации узла протокола в режиме "Шлюз Ñети".</div></div></div></div> <h3><span class="mw-headline" id=".D0.9E.D1.82.D1.87.D1.91.D1.82_.D0.B7.D0.B0.D0.BF.D1.80.D0.BE.D1.81.D0.BE.D0.B2_ModBus"><span class="mw-headline-number">2.3</span> <span id="Report" title="#Report">Отчёт запроÑов ModBus</span></span></h3> <p>Ð”Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð¸ диагноÑтики за корректноÑтью оÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов различными компонентами, модулем предоÑтавлÑетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñ‡Ñ‘Ñ‚Ð° запроÑов, проходÑщих через модуль протокола. Отчёт включаетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ ненулевого количеÑтва запиÑей во вкладе "Отчёт" Ñтраницы Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð° (риÑ.7). </p><p><a class="image" href="http://oscada.org/wiki/File:At.png"><img alt="At.png" height="22" src="../../en/files/At.png" width="22" /></a> Ðтот механизм в оÑновном ÑвлÑетÑÑ ÑƒÑтаревшим, поÑкольку его функции ÑÐµÐ¹Ñ‡Ð°Ñ Ð¸ÑполнÑÑŽÑ‚ÑÑ Ñдром программы: </p> <ul><li> <a href="../Program_manual.html#DAQDiagnostic" title="Special:MyLanguage/Documents/Program manual">диагноÑтика иÑточника данных</a>;</li> <li> <a href="../Program_manual.html#TrDiagnostic" title="Special:MyLanguage/Documents/Program manual">протокол трафику через транÑпорт</a>.</li></ul> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:713px;"><a class="image" href="http://oscada.org/wiki/File:Modbus_prt_rep_ru.png"><img class="thumbimage" height="628" src="../files/Modbus_prt_rep_ru.png" width="711" /></a> <div class="thumbcaption">РиÑ.7. Вкладка "Отчёт" Ñтраницы Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð°.</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 id="DAQ" title="#DAQ">Модуль Ñбора данных</span></span></h2> <p>Модуль Ñбора данных предоÑтавлÑет возможноÑÑ‚ÑŒ опроÑа и запиÑи региÑтров и битов уÑтройÑтв поÑредÑтвом режимов протокола TCP, RTU, ASCII и команд запроÑа <b>1</b> — <b>6</b>, <b>15</b>, <b>16</b>. </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>Ð”Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ñточника данных ModBus ÑоздаётÑÑ Ð¸ конфигурируетÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚ контроллера OpenSCADA. Пример вкладки конфигурации объекта контроллера данного типа изображен на риÑунке 8. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:779px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_cntr.png"><img class="thumbimage" height="883" src="../../en/files/ModBus_cntr.png" width="777" /></a> <div class="thumbcaption">РиÑ.8. Вкладка конфигурации объекта контроллера.</div></div></div></div> <p>Using 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 acquisition blocks.</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> Policy of scheduling and priority of the data acquisition task.</li> <li> ModBus protocol, used for requesting the real device (TCP/IP, RTU or ASCII).</li> <li> Address of <a href="../Program_manual.html#TransportOut" title="Special:MyLanguage/Documents/Program manual">the output transport</a> using the unified connection with navigation. Default port of the ModuBus/TCP is 502. The field may be set to empty and be changed at the runtime. Format of the address is: <ul><li> "<b>{TrModule}.[out_]{TrID}[:{TrAddr}]</b>" — typical output with automatic creation <i>TrID</i> at it missing and providing <i>TrAddr</i>;</li> <li> "<b>{TrModule}.in_{TrID}:{RemConId}</b>" — initiative input with the connection identifier in <i>RemConId</i>.</li></ul></li> <li> ModBus destination node. In the case of protocols RTU and ASCII this is the unique address of the physical device, and when TCP/IP this is the identifier of the unity.</li> <li> Merging of the data fragments. Standard functions <b>1</b>-<b>4</b> let to request at once multiple adjacent registers or bits. This strategy often allows to optimize the traffic and time. However, the required registers are not always located adjacent to each other, this option allows you to gather them in blocks of up to 100 registers, or 1600 bits.</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> Installing of this parameter must be approached with caution, since not all devices support access to the registers between fragments.</dd></dl> <ul><li> Using the multi-items writing functions (<b>15</b>, <b>16</b>). Instead one-item writing will be used the multi-items functions.</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> Omit cycles for read back of written. Can be useful for PLC which applying the changes not fast and they are processed in some significant time depending on the PLC load. So, the cycles value then specifies count of the omitting read cycles before reading back the changed value, preventing the value twinkle.</li> <li> Timeout of connection in milliseconds. Specifies the time interval during which the answer is expected. If there is zero waiting time the transport waiting time by default is used. Allows taking into account individual properties of the controller in the common network.</li> <li> Timeout of restore in seconds. Specifies the time interval after which the re-attempt of the request to previously inaccessible device is done.</li> <li> Request tries for the protocols RTU and ASCII. Indicates the number of attempts by the repetition of the request in case of incomplete or damaged answer.</li> <li> Maximum size of the request block in bytes, useful for controllers with such limits.</li></ul> <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_.28Prm.29"><span class="mw-headline-number">3.2.1</span> Стандартный (Prm)</span></h4> <p>Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница конфигурации параметра Ñтандартного типа предÑтавлена на риÑунке 9. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:635px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prm_ru.png"><img class="thumbimage" height="659" src="../files/ModBus_prm_ru.png" width="633" /></a> <div class="thumbcaption">РиÑ.9. Вкладка конфигурации параметра Ñтандартного типа.</div></div></div></div> <p>One attribute line in the parameter of the attributes list can be written as "<b>{dt}:{numb}[:{flg}[:{id}[:{name}]]]</b>".<br /> Where: </p> <ul><li> <i>dt</i> — Modbus data type ("R"—register[3,6(16)], "C"—coil[1,5(15)], "RI" — input register[4], "CI"—input coil[2]);</li></ul> <dl><dd>"R" and "RI" can be expanded by the suffixes: "i2"—Int16, "i4"—Int32, "i8"—Int64, "u2"—UInt16, "u4"—UInt32, "f"—Float, "d"—Double, "b5"—Bit5, "b"—Bit in address, "s[CHARSET]"—String (size by default is 10 and up to 100 registers);</dd></dl> <ul><li> <i>numb</i> — ModBus data address of the device (decimal, hexadecimal or octal) [0...65535];</li> <li> <i>flg</i> — flags: read/write mode (r-read, w-write), strict requesting mode (not combining) 's', registers order inversion '~', register 'e'ndian toggle (to LE in generic and BE for strings);</li> <li> <i>id</i> — identifier of the created attribute;</li> <li> <i>name</i> — name of the created attribute.</li></ul> <p>Примеры: </p> <dl><dd>"R:0x300:rw:var:Variable" — доÑтуп к региÑтру;</dd> <dd>"C:100:rw:var1:Variable 1" — доÑтуп к биту;</dd> <dd>"R_f:200:r:float:Float", "R_f:200:r~:float:Float" — получить вещеÑтвенное из региÑтров 200 и 201, 201 и 200;</dd> <dd>"R_i4:400,300:r:int32:Int32" — получить int32 из региÑтров 400 и 300;</dd> <dd>"R_b10:25:r:rBit:Reg bit", "R_b:25.10:r:rBit:Reg bit" — получить бит 10 из региÑтра 25;</dd> <dd>"R_s:15,20:r:str:Reg blk" — получить Ñтроку (блок региÑтров) из региÑтра 15 и размером 20.</dd></dl> <p>ЛиниÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ÑÑ Ñ Ñимвола '#', ÑчитаетÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ¼ и не обрабатываетÑÑ. </p><p>Ð’ ÑоответÑтвии Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ ÑпиÑком атрибутов выполнÑетÑÑ Ð¾Ð¿Ñ€Ð¾Ñ Ð¸ Ñоздание атрибутов параметра (риÑ.10). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:635px;"><a class="image" href="http://oscada.org/wiki/File:ModBus_prm_atr_ru.png"><img class="thumbimage" height="533" src="../files/ModBus_prm_atr_ru.png" width="633" /></a> <div class="thumbcaption">РиÑ.10. Вкладка атрибутов параметра Ñтандартного типа.</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_.28PrmL.29"><span class="mw-headline-number">3.2.2</span> ЛогичеÑкий (PrmL)</span></h4> <p>Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница конфигурации параметра логичеÑкого типа предÑтавлена на риÑунке 11. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:713px;"><a class="image" href="http://oscada.org/wiki/File:ModBusLog_prm_ru.png"><img class="thumbimage" height="533" src="../files/ModBusLog_prm_ru.png" width="711" /></a> <div class="thumbcaption">РиÑ.11. Вкладка конфигурации параметра логичеÑкого типа.</div></div></div></div> <p>Link value, when configuring the template (Fig.12), is written in the form <b>{dt}:{numb}[:{flg}]</b>.<br /> Where: </p> <ul><li> <i>dt</i> — ModBus data type ("R"—register[3,6(16)], "C"—coil[1,5(15)], "RI"—input register[4], "CI"—input coil[2]);</li></ul> <dl><dd>"R" and "RI" can be expanded by the suffixes: "i2"—Int16, "i4"—Int32, "i8"—Int64, "u2"—UInt16, "u4"—UInt32, "f"—Float, "d"—Double, "b5"—Bit5, "b"—Bit in address, "s[CHARSET]"—String (size by default is 10 and up to 100 registers);</dd></dl> <ul><li> <i>numb</i> — ModBus data address of the device (decimal, hexadecimal or octal) [0...65535];</li> <li> <i>flg</i> — flags: read/write mode (r-read; w-write), registers order inversion '~', register 'e'ndian toggle (to LE in generic and BE for strings).</li></ul> <p>Примеры: </p> <dl><dd>"R:0x300:rw" — доÑтуп к региÑтру;</dd> <dd>"C:100:rw" — доÑтуп к биту;</dd> <dd>"R_f:200:r", "R_f:200:r~" — получить вещеÑтвенное из региÑтров 200 и 201, 201 и 200;</dd> <dd>"R_i4:400,300:r" — получить int32 из региÑтров 400 и 300;</dd> <dd>"R_b10:25:r", "R_b:25.10:r" — получить бит 10 из региÑтра 25;</dd> <dd>"R_s:15,20:r" — получить Ñтроку (блок региÑтров) из региÑтра 15 и размером 20.</dd></dl> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:714px;"><a class="image" href="http://oscada.org/wiki/File:ModbusLog_tmpl_ru.png"><img class="thumbimage" height="505" src="../files/ModbusLog_tmpl_ru.png" width="712" /></a> <div class="thumbcaption">РиÑ.12. Вкладка "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°" параметра логичеÑкого типа.</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>Ð’ ÑоответÑтвии Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼, лежащим в оÑнове параметра, мы получаем набор атрибутов параметра (риÑ.13). </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:714px;"><a class="image" href="http://oscada.org/wiki/File:ModbusLog_prm_atr_ru.png"><img class="thumbimage" height="505" src="../files/ModbusLog_prm_atr_ru.png" width="712" /></a> <div class="thumbcaption">РиÑ.13. Вкладка атрибутов параметра логичеÑкого типа.</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> <div class="floatright"><a class="image" href="http://oscada.org/wiki/File:Oscada_UserOM_ModBus_ru.png" title="ÐžÐ±ÑŠÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ ModBus."><img alt="ÐžÐ±ÑŠÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ ModBus." height="213" src="../files/Oscada_UserOM_ModBus_ru.png" width="323" /></a></div> <p><b>Объект "Контроллер" [this.cntr()]</b> </p> <ul><li> <i>string messIO(string pdu)</i> — отправка PDU <i>pdu</i> через транÑпорт объекта контроллера поÑредÑтвом ModBus протокола. PDU результата запроÑа помещаетÑÑ Ð²Ð¼ÐµÑто запроÑа в <i>pdu</i>, а ошибка возвращаетÑÑ Ð² результате функции.</li></ul> <p><b>Объект "Параметр" [this]</b> </p> <ul><li> <i>bool attrAdd( string id, string name, string tp = "real", string selValsNms = "" )</i> [<span style="color: red">Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð³Ð¾ параметра логичеÑкого типа</span>] — добавление атрибута <i>id</i> Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ <i>name</i> и типом <i>tp</i>. ЕÑли атрибут уже приÑутÑтвует то будут применены ÑвойÑтва, которые возможно изменить "на ходу": имÑ, режим выбора и параметры выбора. <ul><li> <i>id, name</i> — идентификатор и Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ атрибута;</li> <li> <i>tp</i> — тип атрибута [boolean | integer | real | string | text | object] + режим выбора [sel | seled] + только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ [ro];</li> <li> <i>selValsNms</i> — две Ñтроки Ñо значениÑми в первой и их именами во второй, разделённые ";".</li></ul></li> <li> <i>bool attrDel( string id )</i> [<span style="color: red">Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð³Ð¾ параметра логичеÑкого типа</span>] — удаление атрибута <i>id</i>.</li></ul> <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">4</span> СÑылки</span></h2> <ul><li> <a class="external" href="http://oscada.org/wiki/File:Oscada_UserOM_ModBus_ru.odg" title="File:Oscada UserOM ModBus ru.odg">Диаграмма: ÐžÐ±ÑŠÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ ModBus.</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/ModBus/ru">Modules/ModBus/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>