From OpenSCADAWiki
Jump to: navigation, search
 
(2 intermediate revisions by 2 users not shown)
Line 11: Line 11:
 
Перший спосіб полягає у декременті лічильника, встановленого у значення часового інтервалу, у кожному циклі та на значення періодичності такту до значення <=0, наприклад, у OpenSCADA це реалізується таким чином:
 
Перший спосіб полягає у декременті лічильника, встановленого у значення часового інтервалу, у кожному циклі та на значення періодичності такту до значення <=0, наприклад, у OpenSCADA це реалізується таким чином:
 
<syntaxhighlight lang="JS">
 
<syntaxhighlight lang="JS">
if((tm_cnt-=1/f_frq) <= 0)  //Декремент
+
if((tm_cnt-=1/f_frq) <= 0) { //Декремент
{
+
 
     tm_cnt = 10; //Встановлення лічильника у значення 10 секунд
 
     tm_cnt = 10; //Встановлення лічильника у значення 10 секунд
 
     //Виконання інших дій з періодичністю 10 секунд
 
     //Виконання інших дій з періодичністю 10 секунд
Line 19: Line 18:
 
Другий спосіб засновано на абсолютному часі, тобто у циклі здійснюється порівняння з поточним часом, наприклад, у OpenSCADA це реалізується таким чином:
 
Другий спосіб засновано на абсолютному часі, тобто у циклі здійснюється порівняння з поточним часом, наприклад, у OpenSCADA це реалізується таким чином:
 
<syntaxhighlight lang="JS">
 
<syntaxhighlight lang="JS">
if(SYS.time() > tm_to)
+
if(SYS.time() > tm_to) {
{
+
 
     tm_to = SYS.time()+10; //Встановлення порогу очікування у 10 секунд більше за поточний час
 
     tm_to = SYS.time()+10; //Встановлення порогу очікування у 10 секунд більше за поточний час
 
     //Виконання інших дій з періодичністю 10 секунд
 
     //Виконання інших дій з періодичністю 10 секунд

Latest 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 секунд
}

Другий спосіб засновано на абсолютному часі, тобто у циклі здійснюється порівняння з поточним часом, наприклад, у OpenSCADA це реалізується таким чином:

if(SYS.time() > tm_to) {
    tm_to = SYS.time()+10; //Встановлення порогу очікування у 10 секунд більше за поточний час
    //Виконання інших дій з періодичністю 10 секунд
}

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