<?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&amp;group=page-Documents%2FHow+to%2FCyclic+programming&amp;action=page&amp;filter=&amp;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>&nbsp;• ‎<a class="mw-pt-progress mw-pt-progress--complete" href="../ru/How_to_Cyclic_programming.html" title="Документы/Как/Осуществять циклическое программирование (100% translated)">mRussian</a>&nbsp;• ‎<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>Перший спосіб полягає у декременті лічильника, встановленого у значення часового інтервалу, у кожному циклі та на значення періодичності такту до значення &lt;=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">&lt;=</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">&gt;</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>