From OpenSCADAWiki
Jump to: navigation, search
This page is a translated version of the page Documents/How to/Cyclic programming and the translation is 100% complete.

Other languages:
English • ‎российский • ‎українська

Автор: Роман Савоченко

У начинающих пользователей часто возникает вопрос обеспечения выдержки временных интервалов при программировании вычислительных процедур в окружении 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.