Страница 1 из 1

Добавлено: 06 июн 2013, 13:05
NS
Не совсем понял работу блока "Таймаут".
Когда на вход "считать" подаётся "1" - начинается отсчёт. В чём вопрос:
если с входа "считать" пропадает "1" - блок работает до того, как "осталось"<=0 или он становится неактивным (и "осталось" сбрасывается на значение установленного периода)?

Добавлено: 06 июн 2013, 13:23
NS
Судя по всему первое, пока приходит единичка на вход.

Добавлено: 09 июл 2013, 12:57
Dimka
Таймаут по времени:
cs_In = STATECOD(dState) == 1;
dep_timeout(&internal->DBlock0, &DBlock0_out, cs_In, timeout);
cs_Out = (DBlock0_out.IsTO)&&(cs_In);
if(cs_Out == 1)
{
// Делаем, что нужно
}

Добавлено: 10 июл 2013, 17:35
dws
Описание на Разработчик:
Блок отсчитывает момент наступления таймаута. Отсчитываемое время задается по входу Период и может динамически изменяться.
Отсчет начинается с такта, в котором вход Считать становится активным.
На такте, когда остаток времени (выход Осталось) станет меньше или равен нулю, выход Таймаут активизируется и удерживается таким до тех пор, пока вход Считать активен.
При входе Считать = FALSE, выход Таймаут = FALSE и выход Осталось = 0.

В момент перехода входа Считать 0->1 начинается отсчет времени.
Выход Таймаут остается = 0.
Как только остаток времени = Период - счетчик времени стал <= 0,
выход Таймаут = 1.
Как только Считать 1->0, выход Таймаут = 0.

По поводу предыдущего фрагмента кода. Строку

Код: Выделить всё

cs_Out = (DBlock0_out.IsTO)&&(cs_In);

можно упростиь до

Код: Выделить всё

cs_Out = (DBlock0_out.IsTO);

т.к. выход таймаут может быть 1, только когда cs_In == 1.
А вот если какое-либо действие надо выполнять пока отсчитывается таймаут, можно

Код: Выделить всё

cs_Out = (!DBlock0_out.IsTO)&&(cs_In);