<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> <html class="client-nojs" dir="ltr" lang="en"> <head> <meta charset="UTF-8" /> <title>Документи/Як/ЗдійÑнювати циклічне Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ - OpenSCADAWiki</title> <meta content="MediaWiki 1.26.4" name="generator" /> <link href="https://www.gnu.org/copyleft/fdl.html" rel="copyright" /> <link href="../en/files/doc.css" rel="stylesheet" /></head> <body><div class="floatright"><a href="index.html"><img alt="OpenSCADA" src="../en/files/index.png" /></a></div><div id="mw_header"> <div class="mw-indicators"> </div> <h1 id="firstHeading" lang="uk">Документи/Як/ЗдійÑнювати циклічне програмуваннÑ</h1> </div><div class="mw-content-ltr" dir="ltr" id="mw-content-text" lang="uk"><div class="mw-pt-translate-header noprint" dir="ltr" lang="en">This page is a <span class="plainlinks"><a class="external text" href="http://oscada.org/wiki/index.php?title=Special:Translate&group=page-Documents%2FHow+to%2FCyclic+programming&action=page&filter=&language=uk" rel="nofollow noreferrer noopener" target="_blank">translated version</a></span> of the page <a class="external" href="http://oscada.org/wiki/Documents/How_to/Cyclic_programming" title="Documents/How to/Cyclic programming">Documents/How to/Cyclic programming</a> and the translation is 100% complete.</div><hr /><div class="mw-pt-languages" dir="ltr" lang="en"><div class="mw-pt-languages-list autonym"><a class="mw-pt-languages-ui mw-pt-progress mw-pt-progress--complete" href="../en/How_to_Cyclic_programming.html" title="Documents/How to/Cyclic programming (100% translated)">English</a> • ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../ru/How_to_Cyclic_programming.html" title="Документы/Как/ОÑущеÑтвÑÑ‚ÑŒ цикличеÑкое программирование (100% translated)">mRussian</a> • ‎<span class="mw-pt-languages-selected mw-pt-progress mw-pt-progress--complete">УкраїнÑька</span></div></div> <div style="float:right; border:1px solid gray; width:300px; padding:2px; margin-left: 10pt; margin-bottom: 10pt;"> <ul><li> <b>Ðвтор:</b> <a class="external" href="http://oscada.org/wiki/User:RomanSavochenko" title="User:RomanSavochenko">Роман Савоченко</a></li></ul> </div> <p>У початківців чаÑто виникає Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ інтервалів чаÑу при програмуванні обчиÑлювальних процедур у оточені OpenSCADA. Це Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð·Ð²Ð¸Ñ‡Ð°Ð¹ пов'Ñзано з наÑвніÑÑ‚ÑŽ попереднього доÑвіду Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ð½Ñ–Ð¹Ð½Ð¸Ñ… обчиÑлень та відÑутноÑÑ‚Ñ– доÑвіду Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ð¸ÐºÐ»Ñ–Ñ‡Ð½Ð¸Ñ… ÑиÑтем реального чаÑу. </p><p>У ÑиÑтемах реального чаÑу викориÑтовуєтьÑÑ Ñ‚Ð°Ðº званий такт або цикл періодичних обчиÑлень — ритм "життÑ". У кожному такті виконуєтьÑÑ Ð´ÐµÑка процедура, Ñка не повинна займати чаÑу більш такту — періоду циклу. Як наÑлідок, Ñкщо процедура такту зупинÑєтьÑÑ Ñƒ очікувані, то зупинÑєтьÑÑ Ð¹ Ð¶Ð¸Ñ‚Ñ‚Ñ ÑиÑтеми реального чаÑу. Відповідно, недопуÑтимо викориÑÑ‚Ð°Ð½Ð½Ñ Ñƒ цих процедурах традиційних функцій приÑÐ¿Ð°Ð½Ð½Ñ Ð·Ð°Ð´Ð°Ñ‡Ñ– на великі інтервали чаÑу! </p><p>Ð’Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð²Ð¸Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ великого інтервалу чаÑу, більш за періодичніÑÑ‚ÑŒ циклу, у ÑиÑтемах реального чату здійÑнюєтьÑÑ Ñƒ два ÑпоÑоби. </p><p>Перший ÑпоÑіб полÑгає у декременті лічильника, вÑтановленого у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñового інтервалу, у кожному циклі та на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ñ–Ð¾Ð´Ð¸Ñ‡Ð½Ð¾ÑÑ‚Ñ– такту до Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <=0, наприклад, у OpenSCADA це реалізуєтьÑÑ Ñ‚Ð°ÐºÐ¸Ð¼ чином: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="p">((</span><span class="nx">tm_cnt</span><span class="o">-=</span><span class="mi">1</span><span class="o">/</span><span class="nx">f_frq</span><span class="p">)</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="c1">//Декремент</span> <span class="nx">tm_cnt</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">//Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ° у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 10 Ñекунд</span> <span class="c1">//Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ñ… дій з періодичніÑÑ‚ÑŽ 10 Ñекунд</span> <span class="p">}</span> </pre></div> <p>Другий ÑпоÑіб заÑновано на абÑолютному чаÑÑ–, тобто у циклі здійÑнюєтьÑÑ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑÐ½Ð½Ñ Ð· поточним чаÑом, наприклад, у OpenSCADA це реалізуєтьÑÑ Ñ‚Ð°ÐºÐ¸Ð¼ чином: </p> <div class="mw-highlight mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="p">(</span><span class="nx">SYS</span><span class="p">.</span><span class="nx">time</span><span class="p">()</span> <span class="o">></span> <span class="nx">tm_to</span><span class="p">)</span> <span class="p">{</span> <span class="nx">tm_to</span> <span class="o">=</span> <span class="nx">SYS</span><span class="p">.</span><span class="nx">time</span><span class="p">()</span><span class="o">+</span><span class="mi">10</span><span class="p">;</span> <span class="c1">//Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ð¾Ð³Ñƒ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ 10 Ñекунд більше за поточний чаÑ</span> <span class="c1">//Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ñ… дій з періодичніÑÑ‚ÑŽ 10 Ñекунд</span> <span class="p">}</span> </pre></div> <p>Другий ÑпоÑіб Ñ” більш надійним оÑкільки у ньому виключено проблему затримки ÑÐ¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ð½Ð½Ñ Ð· причини можливого Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ циклу більш чаÑу такту — втрата тактів-циклів. Хоча у правильно налаштованих конфігураціÑÑ… та задачах даний ефект не повинен мати міÑце, а також, оÑтанні верÑÑ–Ñ— OpenSCADA переважно враховують такі втрати циклів у розрахунку Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ <i>f_frq</i>. </p> </div><table style="border-top: dotted 2px #999999; margin-top: 20pt; color: gray;" width="100%"><tr><td style="text-align: left;" width="40%"><a href="http://oscada.org/wiki/Documents/How_to/Cyclic_programming/uk">Documents/How_to/Cyclic_programming/uk</a> - <a href="http://oscada.org/en/main/about-the-project/licenses/">GFDL</a></td><td style="text-align: center;">March 2025</td><td style="text-align: right;" width="40%">OpenSCADA 1+r3012</td></tr></table></body> </html>