<?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>Модули/Serial - 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">Модули/Serial</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%2FSerial&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/Serial" title="Modules/Serial">Modules/Serial</a> and the translation is 75% 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/Serial.html" title="Modules/Serial (100% translated)">English</a> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--high">mRussian</span> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../../uk/Modules/Serial.html" title="Модулі/Serial (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> <th> ОпиÑание </th></tr> <tr> <td> <a href="../Modules/Serial.html" title="Special:MyLanguage/Modules/Serial">Serial</a> </td> <td> ПоÑледовательные интерфейÑÑ‹ </td> <td> 2.7 </td> <td> GPL2 </td> <td> tr_Serial.so </td> <td> en,uk,ru,de </td> <td> x86,x86_64,ARM </td> <td> ТранÑпорт </td> <td> Роман Савоченко<br /> <font size="-2"><i>МакÑим Кочетков (2016)</i></font> </td> <td> ПредоÑтавлÑет транÑпорт оÑнованный на поÑледовательных интерфейÑах. ИÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° данными через поÑледовательные интерфейÑÑ‹ типа RS232, RS485, GSM и похожие. <ul><li> <b><a href="../../en/To_do.html" title="Special:MyLanguage/Works/To do">Задачи (To Do)</a>:</b></li></ul> <dl><dd> - проверить режим модема и добавить к нему поле ввода PIN.</dd></dl> </td></tr></table> <p>Модуль предоÑтавлÑет в программу поддержку транÑпортов, оÑнованных на поÑледовательных интерфейÑах типа RS232, RS485, GSM и похожие. ПоддерживаютÑÑ Ð²Ñ…Ð¾Ð´Ð½Ñ‹Ðµ и выходные транÑпорты. Добавить новые входные и выходные интерфейÑÑ‹ можно поÑредÑтвом конфигурации транÑпортной подÑиÑтемы в любом конфигураторе OpenSCADA. </p><p>Модулем, в режиме модема, поддерживаетÑÑ Ñмешанный режим работы, который предуÑматривает наличие входного транÑпорта, ожидающего внешних подключений, а также выходного транÑпорта на том-же уÑтройÑтве. Т.е. входной транÑпорт будет игнорировать вÑе запроÑÑ‹ при наличии уÑтановленного выходным транÑпортом ÑоединениÑ, в тоже Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð¹ транÑпорт не будет оÑущеÑтвлÑÑ‚ÑŒ попыток уÑтановить Ñоединение при наличии Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº входному транÑпорту или ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ выходного транÑпорта, например, Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ номером телефона. </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> Ð’ обычном режиме поÑледовательного интерфейÑа не допуÑкаетÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð¾Ðµ иÑпользование одного и того-же порта во входных и выходных транÑпортах. Глобальное блокирование поÑледовательного уÑтройÑтва не оÑущеÑтвлÑетÑÑ Ð² виду неоднозначноÑти Ñтого процеÑÑа на ÑиÑтемном уровне, а многократное иÑпользование может привеÑти к непредÑказуемым и Ñложно-уловимым проблемам. При необходимоÑти организации локального поÑледовательного канала Ñ Ð¿Ð°Ñ€Ð¾Ð¹ ÑвÑзанных портов рекомендуетÑÑ Ð¸Ñпользование команды <span style="border: solid gray 1px; padding: 1px; font-family: monospace; font-size: 1.2em; white-space: nowrap;">socat -d -d pty,raw,echo=0,perm=0666 pty,raw,echo=0,perm=0666</span>. </p> <div class="toc" id="toc"><div id="toctitle"><h2>Contents</h2></div> <ul> <li class="toclevel-1 tocsection-1"><a href="#.D0.92.D1.85.D0.BE.D0.B4.D0.BD.D1.8B.D0.B5_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D1.8B"><span class="tocnumber">1</span> <span class="toctext">Входные транÑпорты</span></a></li> <li class="toclevel-1 tocsection-2"><a href="#.D0.92.D1.8B.D1.85.D0.BE.D0.B4.D0.BD.D1.8B.D0.B5_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D1.8B"><span class="tocnumber">2</span> <span class="toctext">Выходные транÑпорты</span></a></li> <li class="toclevel-1 tocsection-3"><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</span> <span class="toctext">API пользовательÑкого программированиÑ</span></a></li> <li class="toclevel-1 tocsection-4"><a href="#Notes"><span class="tocnumber">4</span> <span class="toctext"><span>Notes</span></span></a> <ul> <li class="toclevel-2 tocsection-5"><a href="#.D0.92.D0.B8.D1.80.D1.82.D1.83.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5.2F.D0.BB.D0.BE.D0.BA.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.8B"><span class="tocnumber">4.1</span> <span class="toctext">Виртуальные/локальные поÑледовательные интерфейÑÑ‹</span></a></li> <li class="toclevel-2 tocsection-6"><a href="#.D0.9F.D1.80.D0.BE.D0.B1.D1.80.D0.BE.D1.81_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D0.B3.D0.BE_.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D0.B0_.D1.87.D0.B5.D1.80.D0.B5.D0.B7_.D1.81.D0.B5.D1.82.D1.8C_Ethernet"><span class="tocnumber">4.2</span> <span class="toctext">ÐŸÑ€Ð¾Ð±Ñ€Ð¾Ñ Ð¿Ð¾Ñледовательного интерфейÑа через Ñеть Ethernet</span></a></li> </ul> </li> </ul> </div> <h2><span class="mw-headline" id=".D0.92.D1.85.D0.BE.D0.B4.D0.BD.D1.8B.D0.B5_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D1.8B"><span class="mw-headline-number">1</span> Входные транÑпорты</span></h2> <p>Сконфигурированный и запущенный входной транÑпорт открывает порт поÑледовательного интерфейÑа Ð´Ð»Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов клиентов. Каждый входной Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¾Ð±Ñзательно ÑвÑзываетÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ из доÑтупных транÑпортных протоколов, к которому передаютÑÑ Ð²Ñ…Ð¾Ð´Ð½Ñ‹Ðµ ÑообщениÑ. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:779px;"><a class="image" href="http://oscada.org/wiki/File:Serial_in.png"><img class="thumbimage" height="1155" src="../../en/files/Serial_in.png" width="777" /></a> <div class="thumbcaption">Fig.1. The generic configuration dialogues of the input serial interface.</div></div></div></div> <p>Using the main dialog you can set: </p> <ul><li> State of transport, that is: status, "Connect" and name of the database, containing the configuration.</li> <li> Identifier, name and description of the transport.</li> <li> Address of the transport in the format "<b>{dev}[:{spd}[:{format}[:{opts}[:{mdm}]]]]</b>", where: <ul><li> <i>dev</i> — address of the serial device (/dev/ttyS0);</li> <li> <i>spd</i> — speed of the serial devices from a number: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000 or 921600;</li> <li> <i>format</i> — asynchronous data format "<b>{size}{parity}{stop}</b>" (8N1, 7E1, 5O2, ...);</li> <li> <i>opts</i> — different options, mostly for flow control, separated by ',': <ul><li> "[-]h" — hardware (CRTSCTS);</li> <li> "[-]s" — software (IXON|IXOFF);</li> <li> "rts" — using of the RTS signal for transferring(false) and checking for echo, for raw RS-485;</li> <li> "rts1" — using of the RTS signal for transferring(true) and checking for echo, for raw RS-485;</li> <li> "rtsne" — using of the RTS signal for transferring(false) and without checking for echo, for raw RS-485;</li> <li> "rts1ne" — using of the RTS signal for transferring(true) and without checking for echo, for raw RS-485;</li> <li> "[-]RS485" — using RS-485 mode, through TIOCSRS485.</li></ul></li> <li> <i>mdm</i> — modem mode, listen for "RING".</li></ul></li> <li> Choice of transport protocols.</li> <li> The state "Connect", in which the transport must be translated at boot. </li></ul> <p>Using the additional dialog you can set: </p> <ul><li> Time intervals of the interface in the format of string "<b>{symbol}:{frm}[::{rtsDelay1}:{rtsDelay2}]</b>", where: <ul><li> <i>symbol</i> — character time in milliseconds, used to control of the frame end;</li> <li> <i>frm</i> — maximum time of the frame in milliseconds, used to limit the package maximum size of the request — the frame;</li> <li> <i>rtsDelay1</i> — delay between the transmitter activation with RTS signal and start up of the transmission, in milliseconds;</li> <li> <i>rtsDelay2</i> — delay between the transmitting and disconnecting the transmitter with RTS signal, in milliseconds.</li></ul></li> <li> Priority of the input stream task.</li> <li> [MODEM] Modem parameters. This mode is activated by the fifth parameter of the address and includes call waiting from the remote modem (the request "RING"), answering the call (the command "ATA") and the subsequent transfer of requests from the remote station to the transport protocol. The disconnection of the communication session is performed by the connection initiator and leads to the reconnection of the receiver modem to wait for new calls. <ul><li> Requests timeout of the modem, in seconds.</li> <li> Time delay before initializing the modem, in seconds.</li> <li> Time delay after initializing the modem, in seconds.</li> <li> First initialization string (typically contains the reset command of the modem "ATZ").</li> <li> Second initialization string.</li> <li> Result string of the modem's initialization (usually "OK"), with which the modem answers for initializing and which must be expected.</li> <li> Call's request (usually "RING"), which is sent by the modem in the case of an output call.</li> <li> Answer to the call (usually "ATA"), which is sent to the modem to answer the call.</li> <li> Result line for the answer to the call (usually "CONNECT"), with which the modem answers to the answer command, and that is to be expected.</li></ul></li> <li> Protocols' specific custom parameters.</li> <li> Reset all the additional parameters to default values and cleanup the protocols' specific custom parameters.</li></ul> <h2><span class="mw-headline" id=".D0.92.D1.8B.D1.85.D0.BE.D0.B4.D0.BD.D1.8B.D0.B5_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BF.D0.BE.D1.80.D1.82.D1.8B"><span class="mw-headline-number">2</span> Выходные транÑпорты</span></h2> <p>Сконфигурированный и иÑполнÑющийÑÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð¹ транÑпорт открывает порт поÑледовательного интерфейÑа Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ запроÑов через него. </p> <div class="center"><div class="thumb tnone"><div class="thumbinner" style="width:823px;"><a class="image" href="http://oscada.org/wiki/File:Serial_out.png"><img class="thumbimage" height="1265" src="../../en/files/Serial_out.png" width="821" /></a> <div class="thumbcaption">Fig.2. The generic configuration dialogues of the output serial interface.</div></div></div></div> <p>Using the main dialog you can set: </p> <ul><li> The state of transport, that is: status, "Connect" and name of the database, containing the configuration.</li> <li> Identifier, name and description of the transport.</li> <li> Address of the transport in the format "<b>{dev}[:{spd}[:{format}[:{opts}[:{modTel}]]]]</b>", where: <ul><li> <i>dev</i> — address of the serial device (/dev/ttyS0);</li> <li> <i>spd</i> — speed of the serial devices from a number: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000 or 921600;</li> <li> <i>format</i> — asynchronous data format "<b>{size}{parity}{stop}</b>" (8N1, 7E1, 5O2, ...);</li> <li> <i>opts</i> — different options, mostly for flow control, separated by ',': <ul><li> "[-]h" — hardware (CRTSCTS);</li> <li> "[-]s" — software (IXON|IXOFF);</li> <li> "rts" — using of the RTS signal for transferring(false) and checking for echo, for raw RS-485;</li> <li> "rts1" — using of the RTS signal for transferring(true) and checking for echo, for raw RS-485;</li> <li> "rtsne" — using of the RTS signal for transferring(false) and without checking for echo, for raw RS-485;</li> <li> "rts1ne" — using of the RTS signal for transferring(true) and without checking for echo, for raw RS-485;</li> <li> "[-]RS485" — using RS-485 mode, through TIOCSRS485.</li></ul></li> <li> <i>modTel</i> — modem phone, presence of this field switches transport to work in the modem mode.</li></ul></li></ul> <p>Using the additional dialog you can set: </p> <ul><li> Time intervals of the interface in format of the string "<b>{conn}:{symbol}[-{NextReqMult}][:{KeepAliveTm}[:{rtsDelay1}:{rtsDelay2}]]</b>", where: <ul><li> <i>conn</i> — maximum time of waiting the connecting response, in milliseconds;</li> <li> <i>symbol</i> — maximum time of one symbol, used for the frame end detection, in milliseconds;</li> <li> <i>NextReqMult</i> — next request's multiplicator to the <i>symbol</i> time, 4 by default;</li> <li> <i>KeepAliveTm</i> — keep alive timeout to restart the transport, in seconds; use the value < 0 for stopping the transport after missing response at each request;</li> <li> <i>rtsDelay1</i> — delay between the transmitter activation with RTS signal and start up of the transmission, in milliseconds;</li> <li> <i>rtsDelay2</i> — delay between the transmitting and disconnecting the transmitter with RTS signal, in milliseconds.</li></ul></li></ul> <dl><dd> Can be prioritatile specified into the address field as the second global argument, as such "<b>/dev/rfcomm0:9600||1000:40-20</b>".</dd></dl> <ul><li> Do not disconnect at processing. Sometimes the closing of an open device can be destructive, for example, on an ICP-DAS LP PLC, and you can prevent it with this option.</li> <li> [MODEM] Modem parameters. This mode is enabled by the fifth parameter presence of the address and it involves making a call on the phone specified by this parameter at the start time of the transport. After establishing a connection to the remote modem, all transmission requests are sent to the remote modem station. Disconnection of a communication session, with the transport stopping, is carried out according to the activity timeout. <ul><li> Requests timeout of the modem, in seconds.</li> <li> Lifetime of the connection, in seconds. If during this time there will be no data transmission over the transport the connection will be aborted.</li> <li> Delay time before initializing the modem, in seconds.</li> <li> Delay time after initializing the modem, in seconds.</li> <li> First initialization string (typically contains the reset command "ATZ" of the modem).</li> <li> Second initialization string.</li> <li> Result string of the modem's initialization (usually "OK"), with which the modem answers for initializing and which must be expected.</li> <li> Dialling string to the remote modem (usually "ATDT"). When dialing, the phone number is added to this prefix.</li> <li> Result string of the successful connection (usually "CONNECT").</li> <li> Result string of the busy line (usually is "BUSY").</li> <li> Result string of the absence of the carrier in line (usually "NO CARRIER").</li> <li> Result string of the dial tone lack in the line (usually "NO DIALTONE").</li> <li> Exit string from the data mode (usually "+++") and the "Delay time before initializing the modem" is used, after it.</li> <li> Hang up command (usually "+++ATH"). This command is called whenever there is need to break the connection.</li> <li> Result string of the hanging up command (usually "OK"), with which the modem answers to the command and which must be expected.</li></ul></li> <li> Protocols' specific custom parameters.</li> <li> Reset all the additional parameters to default values and cleanup the protocols' specific custom parameters.</li></ul> <p>ТранÑпорт может работать Ñ Ð°Ð¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ шиной I2С, еÑли в качеÑтве уÑтройÑтва выбрать "/dev/i2c-{N}" и шина позволит уÑтановить Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð´Ñ‡Ð¸Ð½Ñ‘Ð½Ð½Ð¾Ð³Ð¾ уÑтройÑтва командой I2C_SLAVE, из <b>первого байта запроÑа</b>. СкороÑÑ‚ÑŒ и формат не играют роли в данном режиме. Из таймаутов тут фактичеÑки работает только Ð²Ñ€ÐµÐ¼Ñ Ñимвола и в оÑновном Ð´Ð»Ñ Ñ€Ð°Ñчёта Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð° запроÑа. </p> <h2><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</span> API пользовательÑкого программированиÑ</span></h2> <p><b>Объект "Выходной транÑпорт" (SYS.Transport.Serial.out_{OutTransport})</b> </p> <ul><li> <i>bool TS( bool rts = EVAL )</i> — управлÑет отправкой, поÑредÑтвом уÑтановки запроÑа <i>rts</i>, и возвращает ÑоÑтоÑние Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ CTS.</li> <li> <i>bool DR( bool dtr = EVAL )</i> — управлÑет готовноÑтью уÑтройÑтва, поÑредÑтвом уÑтановки готовноÑти терминала <i>dtr</i>, и возвращает ÑоÑтоÑние готовноÑти DSR.</li> <li> <i>bool DCD()</i> — ÑоÑтоÑние Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½ÐµÑущей данных.</li> <li> <i>bool RI()</i> — индикатор звонка.</li> <li> <i>int sendbreak( int duration = 0 )</i> — отправлÑет в поток прерывание нулÑми в течении <i>duration</i> (0 — некоторый интервал по умолчанию).</li></ul> <h2><span class="mw-headline" id="Notes"><span class="mw-headline-number">4</span> <span id="Notes" title="#Notes">Notes</span></span></h2> <p>Communications via the serial interfaces have a number of features. The most important feature is the criterion for the end of the message and the waiting time of this criterion. In some protocols, such a criterion is a sign of the end or the specified message size. In other protocols, such a criterion is no data in the input stream for a specified time — the symbol time. In both cases, the criterion waiting time, or the symbol, is a crucial and strongly affects the overall exchange time and the data integrity. Consequently, the smaller this time, the better if you have no loss the data tail. Here the problem of hardware and its drivers latency happens. </p><p>Проверить латентноÑÑ‚ÑŒ канала обмена, и тем Ñамым оптимально наÑтроить Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ-Ñимвола, можно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ интерфейÑа вкладки "ЗапроÑ" выходного транÑпорта. Ð”Ð»Ñ Ñтого необходимо указать образцовый Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑоответÑтвующего протокола, указать "Ожидать таймаут", отоÑлать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸ проконтролировать его целоÑтноÑÑ‚ÑŒ. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ репрезентативного результата необходимо Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ неÑколько раз. ЕÑли наблюдаетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ неполных ответов, то Ð²Ñ€ÐµÐ¼Ñ Ñимвола необходимо увеличить, иначе можно уменьшить. </p><p>Ðа вÑтроенном оборудовании поÑледовательных интерфейÑов RS232/422/485 можно добитьÑÑ Ð½Ð¸Ð·ÐºÐ¾Ð³Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð»Ð°Ñ‚ÐµÐ½Ñ‚Ð½Ð¾Ñти — вплоть до единиц миллиÑекунд. Однако, на выÑоко-нагруженных ÑиÑтемах Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтвом задач в приоритете реального времени, латентноÑÑ‚ÑŒ может Ñтать недетерминированной, в ÑвÑзи Ñ Ð¸Ñполнением потока обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñобытий Ñдра Linux в низком приоритете. Ð”Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñтой проблемы необходимо уÑтановить выÑокий приоритет Ñтим потокам, что можно Ñделать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñкрипта, помеÑтив его, например, в "/etc/rc.local": </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="c">#!/bin/sh</span> <span class="c"># Setting the high priority for events kernel threads to rise the serial interfaces reaction</span> <span class="nv">events</span><span class="o">=</span><span class="sb">`</span>ps -Ao pid,comm <span class="p">|</span> sed -n <span class="s1">'/[ ]*\([^ ]\)[ ]*events\/[0-9]/s//\1/p'</span><span class="sb">`</span> <span class="k">for</span> ie in <span class="nv">$events</span><span class="p">;</span> <span class="k">do</span> chrt -pr <span class="m">21</span> <span class="nv">$ie</span> <span class="k">done</span> </pre></div> <p>Ðтот Ñкрипт не имеет ÑмыÑла Ð´Ð»Ñ Ñдер Linux реального времени, Ñ Ð¿Ð°Ñ‚Ñ‡ÐµÐ¼ PREEMPT_RT, поÑкольку вÑе потоки прерываний и Ñобытий там уже запуÑкаютÑÑ Ð² приоритете реального времени. </p><p>Ðа внешнем оборудовании поÑледовательных интерфейÑов, например, в переходниках USB->RS232/422/485, может возникнуть проблема выÑокой латентноÑти, ÑвÑÐ·Ð°Ð½Ð½Ð°Ñ Ñ Ð¾ÑобенноÑтью аппаратной реализации или его драйвера. Решать Ñту проблему нужно путём Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек Ñтого Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ уÑтановкой большого времени ожиданиÑ- Ñимвола! </p><p>Похожим образом определÑетÑÑ Ð¸ оптимальное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ, а именно: уÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² значение по умолчанию Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑкороÑти (ÑтавитÑÑ Ð¿Ñ€Ð¸ Ñмене ÑкороÑти в адреÑе), ÑнÑÑ‚ÑŒ "Ожидать таймаут", отоÑлать запроÑ. ЕÑли ответ пришёл то берём измеренное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° уÑтройÑтва, удваиваем и уÑтанавливаем полученное значение, как Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ. ÐеобоÑнованное превышение времени Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´Ñ‘Ñ‚ к большим ожиданиÑм в Ñлучае отÑутÑÑ‚Ð²Ð¸Ñ ÑƒÑтройÑтва, а также ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð½Ñ‹Ñ… таймаутов внутренних процедур! </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> Ðа рынке вÑтречаютÑÑ USB->Serial преобразователи, которые работают только Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð°Ð»Ð°Ð¼Ð¸, Ñ‚.е. они могут передавать и обрабатывать иÑключительно ASCII Ñимволы и не могут быть переключены в бинарный режим. ИзвеÑтные ÑкземплÑры таких преобразователей: PL2303TA (Y-105). </p> <h3><span class="mw-headline" id=".D0.92.D0.B8.D1.80.D1.82.D1.83.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5.2F.D0.BB.D0.BE.D0.BA.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D1.8B"><span class="mw-headline-number">4.1</span> Виртуальные/локальные поÑледовательные интерфейÑÑ‹</span></h3> <p>ЧаÑто Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ проверки, без физичеÑкого оборудованиÑ, необходима пара портов подключенных в одну Ñеть. Создание таких портов и выполнение множеÑтва других операций над поÑледовательным потоком позволÑет выполнÑÑ‚ÑŒ утилита <b>socat</b>. Ðапример, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð²ÑƒÑ… ÑвÑзанных портов нужно выполнить команду, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоздаÑÑ‚ их и Ñообщит адреÑа: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre>socat -d -d pty,raw,echo<span class="o">=</span>0,perm<span class="o">=</span><span class="m">0666</span> pty,raw,echo<span class="o">=</span>0,perm<span class="o">=</span>0666 <span class="c">#2013/07/02 16:37:29 socat[10402] N PTY is /dev/pts/6</span> <span class="c">#2013/07/02 16:37:30 socat[10402] N PTY is /dev/pts/7</span> <span class="c">#2013/07/02 16:37:30 socat[10402] N starting data transfer loop with FDs [3,3] and [5,5]</span> </pre></div> <h3><span class="mw-headline" id=".D0.9F.D1.80.D0.BE.D0.B1.D1.80.D0.BE.D1.81_.D0.BF.D0.BE.D1.81.D0.BB.D0.B5.D0.B4.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D0.BE.D0.B3.D0.BE_.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D0.B0_.D1.87.D0.B5.D1.80.D0.B5.D0.B7_.D1.81.D0.B5.D1.82.D1.8C_Ethernet"><span class="mw-headline-number">4.2</span> ÐŸÑ€Ð¾Ð±Ñ€Ð¾Ñ Ð¿Ð¾Ñледовательного интерфейÑа через Ñеть Ethernet</span></h3> <p>Ð’ некоторых ÑлучаÑÑ… бывает полезным проброÑить порт поÑледовательного интерфейÑа удалённой машины на локальный порт, например, Ð´Ð»Ñ Ð¾Ð¿Ñ€Ð¾Ñа уÑтройÑтв, подключенных к поÑледовательному интерфейÑу удалённой машины. Конечно, еÑли уÑтановить на удалённую машину OpenSCADA в конфигурации ПЛК, то можно будет Ñразу выполнÑÑ‚ÑŒ обработку Ñтих данных, предварительное буферирование/архивирование и Ñ‚.д., но иногда оборудование может быть Ñложным Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка OpenSCADA, где и ÑпаÑает возможноÑÑ‚ÑŒ проброÑа поÑледовательного потока через Ñеть. Ð”Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñтой задачи можно воÑпользоватьÑÑ Ñ‚Ð¾Ð¹-же утилитой <b>socat</b> или <b>remserial</b>, <b>ser2net</b>, какую удаÑÑ‚ÑÑ Ñобрать и запуÑтить на удалённой машине. Примеры проброÑа поÑледовательного порта: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="c"># Создание Ñокета на порту 5555 удалённой машине, Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ‚Ð° /dev/ttyS0</span> socat tcp-l:5555,reuseaddr,fork file:/dev/ttyS0,raw <span class="c"># Подключение к Ñокету отражённого порта удалённой машины и формирование файла отражённого локального интерфейÑа</span> socat -d -d pty,raw,echo<span class="o">=</span>0,perm<span class="o">=</span><span class="m">0666</span> tcp:192.168.2.4:5555,mss<span class="o">=</span>1400 <span class="c">#2013/07/04 10:09:09 socat[12947] N PTY is /dev/pts/4</span> <span class="c">#2013/07/04 10:09:09 socat[12947] N opening connection to AF=2 192.168.2.4:5555</span> <span class="c">#2013/07/04 10:09:09 socat[12947] N successfully connected from local address AF=2 192.168.2.61:33493</span> <span class="c">#2013/07/04 10:09:09 socat[12947] N starting data transfer loop with FDs [3,3] and [5,5]</span> </pre></div> <p>Ð’ Ñлучае Ñ "socat", а возможно и других утилит, можно на клиентÑкой Ñтороне опуÑтить запуÑк драйвера EthernetTCP->Serial и подключатьÑÑ Ð¸Ð· OpenSCADA прÑмо на TCP-порт удалённого уÑтройÑтва. </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> Ð’ работе через драйвер EthernetTCP->Serial еÑÑ‚ÑŒ оÑобенноÑÑ‚ÑŒ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑвÑзанна Ñ Ð½Ð°Ð»Ð¸Ñ‡Ð¸ÐµÐ¼ двух таймаутов подключениÑ: один в драйвере, а другой в <a href="../Modules/Sockets.html" title="Special:MyLanguage/Modules/Sockets">Transport.Sockets</a>. Важно чтобы значение Ñтого таймаута в <a href="../Modules/Sockets.html" title="Special:MyLanguage/Modules/Sockets">Transport.Sockets</a> был больше чем в драйвере иначе возможно Ñмещение и получение запоздалых ответов от предыдущих запроÑов. </p><p>Многие производители промышленного коммуникационного Ð¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð¿ÑƒÑкают готовые конвертеры из Ethernet в RS-232/422/485, которые могут иÑпользоватьÑÑ Ñ OpenSCADA таким-же образом. Комментарии и перечень конвертеров Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ работа OpenSCADA проверена: </p> <ul><li> <a class="external text" href="http://www.icpdas.com" rel="nofollow noreferrer noopener" target="_blank">ICP DAS</a>: <a class="external text" href="http://www.icpdas.com/products/Industrial/pds/tds-700.htm" rel="nofollow noreferrer noopener" target="_blank">tDS-7xx</a> — наÑтраиваетÑÑ Ñ‡ÐµÑ€ÐµÐ· WEB-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸ работает по прÑмому подключение к TCP-порту;</li> <li> <a class="external text" href="http://tibbo.com" rel="nofollow noreferrer noopener" target="_blank">Tibbo</a>: <a class="external text" href="http://tibbo.com/products/controllers/ds100.html" rel="nofollow noreferrer noopener" target="_blank">DS100</a> — <span style="color: red">наÑтраиваетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ через программу Ð´Ð»Ñ MS Windows®</span>, предоÑтавлÑет ÑобÑтвенный драйвер Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ… поÑледовательных интерфейÑов на Linux, работает по прÑмому подключение к TCP-порту.</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/Serial/ru">Modules/Serial/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>