From OpenSCADAWiki
Jump to: navigation, search
 
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>
  

Latest revision as of 12:42, 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.