Таймеры CoDeSys |
Ответить | Страница 123 11> |
Автор | |
Участник Присоединился: 02 Сентябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
Опубликовано: 16 Февраль 2007 10:00 |
Добрый день, уважаемые коллеги!
Может быть я просто не внимательный (как всегда), но вот это программа мне никак не хочет останавливать таймер: PROGRAM proba VAR Tmr_1: TP; i: INT; y: TIME; END_VAR IF Tmr_1.IN =FALSE THEN Tmr_1(IN:=TRUE, PT:=T#5s); END_IF; IF Tmr_1.Q THEN i:=i+1; y:=Tmr_1.ET; END_IF; IF Tmr_1.Q = FALSE THEN Tmr_1(IN:=FALSE); END_IF; Объясните почему. |
|
Участник Присоединился: 02 Сентябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
... там и время, которое на выходе .ET не бежит.
|
|
Действительный член Присоединился: 27 Ноябрь 2006 Категория: Albania Online Status: Offline Публикации: 134 |
|
млин, жаль с CodeSys никогда не работал, а то бы сумничал как-нить,.. ))
а вообще, на мой скорый взгляд в этом куске случаем не зацикливание? может быть вместо
попробовать нечто вроде IF Tmr_1.Q THEN i:=i+1; y:=Tmr_1.ET; ELSEIF Tmr_1.Q = FALSE THEN Tmr_1(IN:=FALSE); END_IF; или IF Tmr_1.Q THEN i:=i+1; y:=Tmr_1.ET; ELSE Tmr_1(IN:=FALSE); END_IF; сразу прошу прощения, с синтаксисом не знаком, поэтому вероятны ошибки |
|
Смейся, и весь мир будет смеяться вместе с тобой.
Плачь, и ты будешь плакать в одиночестве. |
|
Участник Присоединился: 02 Сентябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Ну, это то даа... Зацикливания нет. Меня интересует почему таймер запускается, т.е. выход переходит в TRUE и все... i считается, а таймер как будто зависает.
|
|
Действительный член Присоединился: 29 Январь 2004 Категория: Russian Federation Online Status: Offline Публикации: 293 |
|
В рабочей ветке блок таймера вообще не вызывается! С чего вдруг его выход должен меняться? Надо добавить красную строчку: PROGRAM proba Tmr_1; (* Вызов экз. функ. блока *) Подробно о работе с временем, датами и таймерами МЭК см. тут.
|
|
Igor Petrov
|
|
Действительный член Присоединился: 27 Сентябрь 2006 Online Status: Offline Публикации: 125 |
|
Перед обращением к полю ЕТ надо вызвать функцию:
Tmr_1(IN:=TRUE); |
|
Участник Присоединился: 02 Сентябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Спасибо. Работает.
Т.е. если мы проскакиваем первый if (Tmr_1.IN=TRUE), то вызова блока действительно не происходит. Но почему он не выключался по истечении заданного времени, т.е. почему Tmr_1.Q не изменялся. Он же включился, время пошло - должен выключиться. |
|
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
|
Причина ясна - сразу после включения таймер оказывается недоступен программному циклу, так-как условие IF Tmr_1.IN = FALSE ... после того как стало TRUE не пускает программу к таймеру - она его обходит ! Надо вынести таймер из тела условия, чтобы он всегда был на виду, не важно в каком он состоянии. Минимально покушаясь на авторство, начальный кусок можно переделать так : ---------------------------------------------------------------- b: BOOL := FALSE; (* Добавляем булеву переменную *) ---------------------------- IF NOT(b) THEN Tmr_1(IN := b, PT := T#5s); (* Выносим таймер наружу *) На этом можно было бы и закончить, но но здесь затронута тема более широкая чем отдельный случай. Таймер - это ФУНКЦИОНАЛЬНЫЙ БЛОК, то есть вещь специфичная для CoDeSys (и подобных систем). Это не функция в классическом понимании, привычная для обычных языков программирования. Функциональный блок (FB) должен вызываться В КАЖДОМ ЦИКЛЕ, чтобы внутри у него все правильно работало. Вообще говоря, FB используются в графическом редакторе CFC, и там они само-собой всегда вызываются программным циклом, не зависимо в каком состоянии эти FB находятся. FB , как кубики разбросанные на поле графического редактора, можно представить в виде фрагментов текста, следующих в порядке расположения FB. С такой точки зрения хорошо видно, что обработка проходит все места насквозь, не пропустив ни одного FB. С уважением, SAN. |
|
Участник Присоединился: 02 Сентябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Спасибо. Вот теперь все встало на свои места.
|
|
Действительный член Присоединился: 27 Сентябрь 2006 Online Status: Offline Публикации: 125 |
|
Для Mixer: Мне кажется, здесь всё усложнено и запутано ("... это не фунция...", "должен вызываться, чтобы все правильно работало" и прочее). Напишите первой строкой программы вызов функции: Tmr_1; остальные обращения к ней можно убрать. Получится, что таймер вызывается каждый раз при вызове программного блока (если вам нужно, чтобы таймер всё время работал). Главная идея такая. Система следит только за обновлением системного таймера (суммирует импульсы от кварцевого генератора), выходные поля вашего таймера будут обновлены после явного вызова функции (в данном случае TP). |
|
Ответить | Страница 123 11> |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |