(Updating to match new version of source page) |
|||
(4 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<noinclude> | <noinclude> | ||
<languages/> | <languages/> | ||
− | {{Info|* ''' | + | {{Info|* '''Автор:''' [[User:RomanSavochenko|Роман Савоченко]]}} |
</noinclude> | </noinclude> | ||
У начинающих пользователей часто возникает вопрос обеспечения выдержки временных интервалов при программировании вычислительных процедур в окружении OpenSCADA. Этот вопрос обычно связан с наличием предыдущего опыта программирования линейных вычислений и отсутствием опыта программирования циклических систем реального времени. | У начинающих пользователей часто возникает вопрос обеспечения выдержки временных интервалов при программировании вычислительных процедур в окружении OpenSCADA. Этот вопрос обычно связан с наличием предыдущего опыта программирования линейных вычислений и отсутствием опыта программирования циклических систем реального времени. | ||
Line 10: | Line 10: | ||
Первый способ заключается в декременте счётчика, установленного в значение временного интервала, в каждом цикле и на значение периодичности такта до значения <=0, например, в OpenSCADA это реализуется таким образом: | Первый способ заключается в декременте счётчика, установленного в значение временного интервала, в каждом цикле и на значение периодичности такта до значения <=0, например, в OpenSCADA это реализуется таким образом: | ||
− | < | + | <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 секунд | ||
− | }</ | + | }</syntaxhighlight> |
Второй способ основан на абсолютном времени, т.е. в цикле осуществляется сравнение с текущим временем, например, в OpenSCADA это реализуется таким образом: | Второй способ основан на абсолютном времени, т.е. в цикле осуществляется сравнение с текущим временем, например, в OpenSCADA это реализуется таким образом: | ||
− | < | + | <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 секунд | ||
− | }</ | + | }</syntaxhighlight> |
Второй способ является более надёжным поскольку в нём исключается проблема запаздывания срабатывания по причине возможного выполнения процедуры цикла более времени такта — потеря тактов-циклов. Хотя в правильно настроенных конфигурациях и задачах данный эффект не должен иметь место, а также, последние версии OpenSCADA в основном учитывают такие потери циклов в расчёте значения ''f_frq''. | Второй способ является более надёжным поскольку в нём исключается проблема запаздывания срабатывания по причине возможного выполнения процедуры цикла более времени такта — потеря тактов-циклов. Хотя в правильно настроенных конфигурациях и задачах данный эффект не должен иметь место, а также, последние версии OpenSCADA в основном учитывают такие потери циклов в расчёте значения ''f_frq''. |
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.