Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Таймеры CoDeSys

 Ответить Ответить Страница  123 11>
Автор
Сообщение
Mixer Смотреть выпадающим
Участник
Участник


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Таймеры CoDeSys
    Опубликовано: 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;

Объясните почему.
Наверх
Mixer Смотреть выпадающим
Участник
Участник


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Февраль 2007 10:03
... там и время, которое на выходе .ET не бежит.
Наверх
flexlogix5434 Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Ноябрь 2006
Категория: Albania
Online Status: Offline
Публикации: 134
Свойства публикации Свойства публикации   Ответить, цитируя автора - flexlogix5434 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Февраль 2007 10:50
млин, жаль с CodeSys никогда не работал, а то бы сумничал как-нить,.. ))
а вообще, на мой скорый взгляд в этом куске случаем не зацикливание?
может быть вместо
Первоначально опубликовано Mixer



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;

попробовать нечто вроде
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;

сразу прошу прощения, с синтаксисом не знаком, поэтому вероятны ошибки
Смейся, и весь мир будет смеяться вместе с тобой.
Плачь, и ты будешь плакать в одиночестве.
Наверх
Mixer Смотреть выпадающим
Участник
Участник


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Февраль 2007 11:06
Ну, это то даа... Зацикливания нет. Меня интересует почему таймер запускается, т.е. выход переходит в TRUE и все... i считается, а таймер как будто зависает.
Наверх
_IP_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Февраль 2007 13: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); (*Вызов таймера и запуск = OK*)
END_IF;

IF Tmr_1.Q THEN  (* Смотрим на выход, он естественно не меняется, поскольку вызова таймера в этой ветке нету !*)

     Tmr_1;    (* Вызов экз. функ. блока *)
     i:=i+1;
     y:=Tmr_1.ET;
END_IF;

IF Tmr_1.Q = FALSE THEN
     Tmr_1(IN:=FALSE);     (*Вызов таймера и останов = OK*)
END_IF;

Подробно о работе с временем, датами и таймерами МЭК см. тут.

 

Igor Petrov
Наверх
Kanzi Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Сентябрь 2006
Online Status: Offline
Публикации: 125
Свойства публикации Свойства публикации   Ответить, цитируя автора - Kanzi Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Февраль 2007 13:18

Перед обращением к полю ЕТ надо вызвать функцию:


IF Tmr_1.Q THEN
     i:=i+1;

     Tmr_1(IN:=TRUE);
     y:=Tmr_1.ET;
END_IF;

P.S. Пока писал, оказывается, уже ответили

Наверх
Mixer Смотреть выпадающим
Участник
Участник


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Февраль 2007 13:42
Спасибо. Работает.
Т.е. если мы проскакиваем первый if (Tmr_1.IN=TRUE), то вызова блока действительно не происходит. Но почему он не выключался по истечении заданного времени, т.е. почему Tmr_1.Q не изменялся. Он же включился, время пошло - должен выключиться.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 16 Февраль 2007 19:56

Причина ясна - сразу после включения таймер оказывается недоступен программному циклу, так-как условие IF Tmr_1.IN = FALSE ... после того как стало TRUE не пускает программу к таймеру - она его обходит ! Надо вынести таймер из тела условия, чтобы он всегда был на виду, не важно в каком он состоянии.

Минимально покушаясь на авторство, начальный кусок можно переделать так :

----------------------------------------------------------------

b: BOOL := FALSE;   (* Добавляем булеву переменную *)

----------------------------

IF NOT(b) THEN
     b := TRUE;
END_IF

Tmr_1(IN := b, PT := T#5s); (* Выносим таймер наружу *)
...
...
------------- И все затикает !

На этом можно было бы и закончить, но но здесь затронута тема более широкая чем отдельный случай. Таймер - это ФУНКЦИОНАЛЬНЫЙ БЛОК, то есть вещь специфичная для CoDeSys (и подобных систем). Это не функция в классическом понимании, привычная для обычных языков программирования. Функциональный блок (FB) должен вызываться В КАЖДОМ ЦИКЛЕ, чтобы внутри у него все правильно работало. Вообще говоря, FB используются в графическом редакторе CFC, и там они само-собой всегда вызываются программным циклом, не зависимо в каком состоянии эти FB находятся. FB , как кубики разбросанные на поле графического редактора, можно представить в виде фрагментов текста, следующих в порядке расположения FB. С такой точки зрения хорошо видно, что обработка проходит все места насквозь, не пропустив ни одного FB.
Я сделал эту выкладку потому, что если кто решил заняться CoDeSys, то с вопросами по FB еще много раз придется столкнуться(и я в том числе).

С уважением, SAN.

Наверх
Mixer Смотреть выпадающим
Участник
Участник


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Февраль 2007 09:47
Спасибо. Вот теперь все встало на свои места.
Наверх
Kanzi Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 27 Сентябрь 2006
Online Status: Offline
Публикации: 125
Свойства публикации Свойства публикации   Ответить, цитируя автора - Kanzi Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 19 Февраль 2007 10:45
Первоначально опубликовано sanwork

На этом можно было бы и закончить, но но здесь затронута тема более широкая чем отдельный случай. Таймер - это ФУНКЦИОНАЛЬНЫЙ БЛОК, то есть вещь специфичная для CoDeSys (и подобных систем). Это не функция в классическом понимании, привычная для обычных языков программирования. Функциональный блок (FB) должен вызываться В КАЖДОМ ЦИКЛЕ, чтобы внутри у него все правильно работало. Вообще говоря, FB используются в графическом редакторе CFC, и там они само-собой всегда вызываются программным циклом, не зависимо в каком состоянии эти FB находятся. FB , как кубики разбросанные на поле графического редактора, можно представить в виде фрагментов текста, следующих в порядке расположения FB. С такой точки зрения хорошо видно, что обработка проходит все места насквозь, не пропустив ни одного FB.
Я сделал эту выкладку потому, что если кто решил заняться CoDeSys, то с вопросами по FB еще много раз придется столкнуться(и я в том числе).

С уважением, SAN.

Для Mixer:

Мне кажется, здесь всё усложнено и запутано ("... это не фунция...", "должен вызываться, чтобы все правильно работало" и прочее). Напишите первой строкой программы вызов функции:

Tmr_1;

остальные обращения к ней можно убрать. Получится, что таймер вызывается каждый раз при вызове программного блока (если вам нужно, чтобы таймер всё время работал). Главная идея такая. Система следит только за обновлением системного таймера (суммирует импульсы от кварцевого генератора), выходные поля вашего таймера будут обновлены после явного вызова функции (в данном случае TP).

Наверх
 Ответить Ответить Страница  123 11>

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz