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 это всего лишь пять секунд, как можно их не дождаться.
Действительно, как предложили ранее, надо выкладывать проект
Bad programmers worry about the code. Good programmers worry about data structures and their relationships
среди успешных людей я не встречала нытиков
Барбара Коркоран
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), а вы просто задолбались ждать исполнения багованого кода, повторно нажали кнопку и о чудо, выхода включились...
Вот с виртуальной визуализацией тоже все норм...
121212121.png
Последний раз редактировалось МихаилГл; 13.12.2023 в 05:59.