TON и остальные таймеры и триггеры на CodeSys полностью программные, и кодом можно напортачить.
Вид для печати
TON и остальные таймеры и триггеры на CodeSys полностью программные, и кодом можно напортачить.
При включении кнопки knop_26 из исходного состояния (предположим, что только что залили программу и запустили контроллер), включается таймер myTON. При выключении knop_26 таймер продолжит отсчитывать время до 5 секунд, сработает его выход, но d_N3 не включится, т.к. первый if knop_26 не срабатывает. При следующем включении knop_26 и досчитанном таймере включается d_N3. Таймер по knop_26 не будет ни сбрасываться, ни включаться по новой, т.к. для сброса таймера требуется задний фронт knop_26, а его myTON не видит из-за if knop_26 then.
Ваш код пришлось изменить потому что он на переключателе не работал.
tik_curr := time_to_dword(time());
If knop_26 and (tik_curr - tik_start) > 5000 then
d_N3:= true;
else
tik_start := tik_curr;
end_if
В нем (tik_curr - tik_start) > 5000 никогда не превышает 5000. (на переключателе)
Поэтому для проверки time() код был поправлен. А для удобства кнопка стала клавишей.
У Вас knop_26 это использование физического входа или что программноэмулированое нечто? 5000 это всего лишь пять секунд, как можно их не дождаться.
Действительно, как предложили ранее, надо выкладывать проект
knop_26 - переключатель в визуализации. d_N3 - физический выход на самом ПЛК200.
А я разве сказал, что не дождался их? при установку 1s - дождался через 3 секунды. При установке 5s и в другой раз 5000ms дождался через 15 сек.
Проект заключался именно в 7 строчках, которые я вам написал. Ничего кроме них не было (Кроме кнопки в визуализации.)
Вернемся к началу...
myTON(IN:=knop_26,PT:=t#5s); надо вообще наружу вынести, зачем это внутри условия, непонятно, т.к. IN:=knop_26 это тоже само по себе условие. Тем более время таймера если больше не меняется, то зачем его в условие пихать.
Помню я в case такое запихал, но у меня таймеры переназначались по времени работы, и тоже начался какой то мрак...
Посмотрел, как ведет себя ваш код в эмуляторе... Это тот еще мрак.Код:myTON(IN:=knop_26,PT:=t#5s);
d_N3:= knop_26 and myTON.Q;
1. Нажимаем кнопку knop_26 и отпускаем... В момент нажатия таймер начинает отсчет, в момент отпускания таймер остается взведен, что логично, но отсчет в переменных уже не ведется (хотя таймер считает), так как находимся вне условия IF.
2. Проходит хоть час, хоть два... Ничего не произойдет, пока снова не нажмем knop_26 и тогда попадем в 2 условия и загорится выход...
3. Все, таймер больше не сбросить, так как вне условия IF код myTON(IN:=knop_26,PT:=t#5s) не выполняется ни при каких условиях...
Вы сами намудрили с кодом и поэтому так и вышло... Это похоже не 3 секунды (или 15), а вы просто задолбались ждать исполнения багованого кода, повторно нажали кнопку и о чудо, выхода включились...
Вот с виртуальной визуализацией тоже все норм...
Вложение 72348