Line 9: | Line 9: | ||
Решение задачи выдержки большого интервала времени, более периодичности цикла, в системах реального времени осуществляется в два способа. | Решение задачи выдержки большого интервала времени, более периодичности цикла, в системах реального времени осуществляется в два способа. | ||
− | + | Первый способ заключается в декременте счётчика, установленного в значение временного интервала, в каждом цикле и на значение периодичности такта до значения <=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; // | + | tm_cnt = 10; //Установка счётчика в значение 10 секунд |
− | // | + | //Выполнение других действий с периодичностью 10 секунд |
}</syntaxhighlight> | }</syntaxhighlight> | ||
Latest revision as of 12:42, 21 March 2024
- Автор: Роман Савоченко
У начинающих пользователей часто возникает вопрос обеспечения выдержки временных интервалов при программировании вычислительных процедур в окружении 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.