From OpenSCADAWiki
Jump to: navigation, search
(Updating to match new version of source page)
Line 9: Line 9:
 
Вирішення завдання витримки великого інтервалу часу, більш за періодичність циклу, у системах реального чату здійснюється у два способи.
 
Вирішення завдання витримки великого інтервалу часу, більш за періодичність циклу, у системах реального чату здійснюється у два способи.
  
The first method consists in decrement of the counter, set in the time interval value, in each cycle, and at the periodicity of the cycle to the value of <= 0, for example, in OpenSCADA this is implemented as follows:
+
Перший спосіб полягає у декременті лічильника, встановленого у значення часового інтервалу, у кожному циклі та на значення періодичності такту до значення <=0, наприклад, у OpenSCADA це реалізується таким чином:
 
<syntaxhighlight lang="JS">
 
<syntaxhighlight lang="JS">
if((tm_cnt-=1/f_frq) <= 0) {  //Decrement
+
if((tm_cnt-=1/f_frq) <= 0) {  //Декремент
     tm_cnt = 10; //Setting the counter to 10 seconds
+
     tm_cnt = 10; //Встановлення лічильника у значення 10 секунд
     //Perform other actions with the 10 seconds period
+
     //Виконання інших дій з періодичністю 10 секунд
 
}</syntaxhighlight>
 
}</syntaxhighlight>
  

Revision as of 12:41, 21 March 2024

Other languages:
English • ‎mRussian • ‎Українська

У початківців часто виникає питання забезпечення витримки інтервалів часу при програмуванні обчислювальних процедур у оточені OpenSCADA. Це питання зазвичай пов'язано з наявністю попереднього досвіду програмування лінійних обчислень та відсутності досвіду програмування циклічних систем реального часу.

У системах реального часу використовується так званий такт або цикл періодичних обчислень — ритм "життя". У кожному такті виконується деяка процедура, яка не повинна займати часу більш такту — періоду циклу. Як наслідок, якщо процедура такту зупиняється у очікувані, то зупиняється й життя системи реального часу. Відповідно, недопустимо використання у цих процедурах традиційних функцій приспання задачі на великі інтервали часу!

Вирішення завдання витримки великого інтервалу часу, більш за періодичність циклу, у системах реального чату здійснюється у два способи.

Перший спосіб полягає у декременті лічильника, встановленого у значення часового інтервалу, у кожному циклі та на значення періодичності такту до значення <=0, наприклад, у OpenSCADA це реалізується таким чином:

if((tm_cnt-=1/f_frq) <= 0) {  //Декремент
    tm_cnt = 10; //Встановлення лічильника у значення 10 секунд
    //Виконання інших дій з періодичністю 10 секунд
}

The second method is based on absolute time, that is the comparison with the current time is made in the cycle, for example, in OpenSCADA it is implemented as follows:

if(SYS.time() > tm_to) { 
    tm_to = SYS.time()+10; //Setting the waiting threshold for 10 seconds more than the current time
    //Other actions with the periodicity of 10 seconds
}

Другий спосіб є більш надійним оскільки у ньому виключено проблему затримки спрацювання з причини можливого виконання процедури циклу більш часу такту — втрата тактів-циклів. Хоча у правильно налаштованих конфігураціях та задачах даний ефект не повинен мати місце, а також, останні версії OpenSCADA переважно враховують такі втрати циклів у розрахунку значення f_frq.