From OpenSCADAWiki
Jump to: navigation, search
(Updating to match new version of source page)
Line 16: Line 16:
 
}</syntaxhighlight>
 
}</syntaxhighlight>
  
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:
+
Второй способ основан на абсолютном времени, т.е. в цикле осуществляется сравнение с текущим временем, например, в OpenSCADA это реализуется таким образом:
 
<syntaxhighlight lang="JS">
 
<syntaxhighlight lang="JS">
if(SYS.time() > tm_to) {  
+
if(SYS.time() > tm_to) {
     tm_to = SYS.time()+10; //Setting the waiting threshold for 10 seconds more than the current time
+
     tm_to = SYS.time()+10; //Установка порога ожидания на 10 секунд более текущего времени
     //Other actions with the periodicity of 10 seconds
+
     //Выполнение других действий с периодичностью 10 секунд
 
}</syntaxhighlight>
 
}</syntaxhighlight>
  
 
Второй способ является более надёжным поскольку в нём исключается проблема запаздывания срабатывания по причине возможного выполнения процедуры цикла более времени такта — потеря тактов-циклов. Хотя в правильно настроенных конфигурациях и задачах данный эффект не должен иметь место, а также, последние версии OpenSCADA в основном учитывают такие потери циклов в расчёте значения ''f_frq''.
 
Второй способ является более надёжным поскольку в нём исключается проблема запаздывания срабатывания по причине возможного выполнения процедуры цикла более времени такта — потеря тактов-циклов. Хотя в правильно настроенных конфигурациях и задачах данный эффект не должен иметь место, а также, последние версии OpenSCADA в основном учитывают такие потери циклов в расчёте значения ''f_frq''.

Revision as of 12:42, 21 March 2024

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

У начинающих пользователей часто возникает вопрос обеспечения выдержки временных интервалов при программировании вычислительных процедур в окружении OpenSCADA. Этот вопрос обычно связан с наличием предыдущего опыта программирования линейных вычислений и отсутствием опыта программирования циклических систем реального времени.

В системах реального времени используется так называемый такт или цикл периодических вычислений — ритм "жизни". В каждом такте выполняется некоторая процедура, которая не должна занимать времени больше такта — периода цикла. Как следствие, если процедура такта останавливается в ожидании, то останавливается и жизнь системы реального времени. Следовательно, недопустимо использование в этих процедурах традиционных функций усыпления задачи на большие интервалы времени!

Решение задачи выдержки большого интервала времени, более периодичности цикла, в системах реального времени осуществляется в два способа.

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:

if((tm_cnt-=1/f_frq) <= 0) {  //Decrement
    tm_cnt = 10; //Setting the counter to 10 seconds
    //Perform other actions with the 10 seconds period
}

Второй способ основан на абсолютном времени, т.е. в цикле осуществляется сравнение с текущим временем, например, в OpenSCADA это реализуется таким образом:

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

Второй способ является более надёжным поскольку в нём исключается проблема запаздывания срабатывания по причине возможного выполнения процедуры цикла более времени такта — потеря тактов-циклов. Хотя в правильно настроенных конфигурациях и задачах данный эффект не должен иметь место, а также, последние версии OpenSCADA в основном учитывают такие потери циклов в расчёте значения f_frq.