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

Таймеры CoDeSys

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


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Таймеры CoDeSys
    Опубликовано: 22 Май 2007 12:01
А почему после остановки программы через точки останова, таймеры продолжают работать? т.е. по истечении времени .PT, таймер все равно установит выход .Q в TRUE, не зависимо от того, стоим на точке останова или программа продолжает работать. Уж очень это не удобно, да и не правильно по-моему.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


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

Вообще говоря, режим Реального Времени и точки останова - две вещи несовместные !
Отладка в RT сродни отладке прерываний. В общем случае, отладка прерываний рассчитана на получение однократного результата, после которого программа разрушается и нужен повторный перезапуск.

Но есть куча приемов для отладки в режиме RT. Все зависит от конкретной частной задачи.
Все они требуют элементарных рассуждений.

Все таймеры и счетчики в CoDeSys сами ничего не считают. Они только "выхватывают" значения системного аппаратного счетчика, который работает непрерывно. После открытия счета таймеры начинают давать приращение своей внутренней переменной. При сбросе - обнуляют.

На выходе  TP  сигнал  Q  меняется не сам-собой, а после нажатия кнопки отладки (F5). По истечении заданного времени (реального) системный счетчик достигнет величины срабатывания (и продолжит считать дальше), но сигнал на выходе не изменится - таймер будет "заморожен". Его состояние изменится при нажатии кнопки. Это равносильно тому, что время срабатывания таймера было задано вручную - и смысл отладки достигнут !  Не видно никаких "неудобств".
Кстати, такая-же ситуация возникнет при задании времени цикла больше времени таймера. Если цикл задачи будет с периодом  5 сек.  а значение таймера  1 сек. , то промежутки времени точнее  5 сек.  все-равно нельзя будет отсчитать. Если задача не назначена, то программа будет крутиться в режиме FreeWheeling - как в Windows, с максимально возможной скоростью.
У программы нет ни глаз ни ушей, о времени она судит по сигналам таймеров, поэтому логика работы программы никак не нарушается.
Отладку с breakpoint-ами лучше делать в режиме симуляции - Online->Simulation Mode, так-как в точке останова возникают конфликты среды с системным счетчиком. И вообще, надо избегать точек останова, а лучше использовать пошаговый режим - он более "родной" для систем Реального Времени.

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

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

Присоединился: 01 Июнь 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 464
Свойства публикации Свойства публикации   Ответить, цитируя автора - Dismay Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 23 Май 2007 06:44

ИМХО точки останова никак не связаны с концепцией распределения аппаратных ресурсов в многопоточной среде. Обеспечивает это распределение детерминированное выполнение в системе реального времени или реализующее вытесняющую многозадачность. Какая собственно разница. Сам по себе процесс по большому счету любой может быть остановлен на любом шаге, если при этом будут остановлены все сопутствующие процессы. Это видно из простых логических умозаключений. Другое дело, что среда программирования прерывает только процесс разрабатываемого приложения, но среда исполнения при этом никаких изменений не претерпевает, продолжая функционировать в обычном режиме, посему и таймер привязанный к аппаратному таймеру не может быть остановлен. Но это вовсе не говорит о неприемлемости точек останова. Более того возьмите хоть SoftIce он позволяет поставить в стоп вообще всю ОС. Да собственно выполнение любого кода останавливается по  завершении кванта времени выделенного потоку. Так что это нормально естественно и логично, и ничего предосудительного в поведении таймера нет…

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


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 23 Май 2007 08:28
Задача была следующая:

Tmr_cycle(IN :=TRUE, PT:=_T_cycle);

IF Tmr_cycle.Q THEN
   Tmr_cycle.IN:=FALSE;
ELSE
   (* операторы *)
END_IF;

нужно было было определить как изменяются перемееные во врмя работы таймера и после его срабатывания. Делаем останов на строке запуска таймера, пошагово проходим операторы которые программа должна сделать после запуска и доходим до строки, где идет проверка срабатывания нашего таймера. Реально конечно проходит больше времени чем _T_cycle. Поэтому условие однозначно выполняется и таймер отключается. И мы не можем увидеть как же выполняются наши операторы после ELSE.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


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

Дэк-с ... Проблемы-то вроде нету.
Вот слегка измененный пример.
Две переменные  var1 и  var2  находятся в обоих ветках условия.
Время  _T_cycle  устанавливается таким большим, чтобы спокойно успеть заметить изменения. При большом времени, скажем - T#10s, точка останова и вовсе не нужна !  Но если нужна (когда много переменных), то можно и поставить.
Сначала изменияется  var1. При переключении таймера - var2. Все хорошо видно.
Чтобы  Win  не зависал, надо включить режим симуляции - поставить галочку  Online->Simulation Mode.

Теоретическая часть.
Точки останова опасны не для железа, а для программы.
Как было совершенно верно замечено ( Dismay ), если все части программы, связанные одним таймером остановить, то программа ничего не заметит. Но это идеализированный демо-случай. Практическую пользу имеют как-раз остановы отдельных модулей, и здесь ситуация сложнее.
Приходилось отлаживать программы работающие не от системного счетчика, а вообще от внешнего генератора. Здесь не помог даже Великий и Могучий SoftIce (хотя он имеет доступ к четырем аппаратным отладочным регистрам процессора). Пришлось вставлять свои баги, чтобы программа достигнув интересующего места остановилась и неминуемо разрушилась из-за нарушения последовательности логики. Но золотые крупицы ценной информации успевали появиться.
Хочу еще раз повторить - в каждой ситуации нужны конкретные приемы и решения.

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

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


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 23 Май 2007 12:55
Ну, а разве не для отладки придуманы всякие там точки остановки, пошаговый режим и симуляция? По-моему как раз для того, чтобы посмотреть как будет себя вести система в каком-то определенном случае. Мне просто хочется видеть как изменится время в таймере через один, два, ... шага. Внутренний счетчик таймера можно же останавливать, на время когда точки останова активны.
И почему приходится вставлять дополнительный код в программу только для отладки? Я не говорю, о том, что мне жалко времени или памяти контроллера для дополнительных переменных. Но на мой взгляд - это недостаток среды, если приходится дописывать что-то только для отладки.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


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

Отнюдь !
Каждый более-менее писамший Кодер знает, что средства отладки в несолько раз больше самой программы. В простом случае эти средства находятся в стороне, и наблюдают за работой. Когда дело посложнее, то отладочные нструменты приходится внедрять в код самой программы. Есть даже понятие - отладочный код.
Когда прога становится похожа на правду, отладочные примочки постепенно отцепляют, пробуют в рабочем режиме. И так несколько раз.

Но это еще не все. В окончательном варианте, кроме основной своей части, программа набита еще вспомогательным кодом, который отрабатывает всякие нештатные ситуации.
Поначалу при разработке, все внимание уделяется основному алгоритму, как-будто программа всегда будет работать в идеальных условиях, без всяких сбоев. На самом деле, реально будет много непредвиденных случаев. Программа должна уметь корректно выходить из таких ситуаций, самовосстанавливаться. Это называется - устойчивостью программы.
Для пром. контроллеров - важнейшее дело. И при этом, вспомогательный код в несколько раз превышает саму рабочую часть.

То была статическая отладка. Динамическая (в реальном времени) добавляет свои специфичные особенности.
Во 1-ых, точки останова работают не так, как в статике. После первой остановки, следующий шаг будет сделан не сразу на следущую команду, а через цикл. То-есть, прежде чем перейти на следущую после метки строчку, будет сделан полный цикл. Разумеется, хронологическая последовательность событий нарушится и дальнейшие результаты бесполезны. Спросите - зачем тогда нужны точки останова в RT ? Они нужны ради единственного шага, который может дать ценные сведения. И где-попало breakpoint-ы не ставят.
Вообще, каждое средство предназначено для определенных целей. Не следует возлагать лишнего, и ожидать больше чем может инструмент, а потом ругать, что он плохо сделан.

2-ое.  Надо уточнить фразу : " .. посмотреть как считает счетчик ..".
Как считает сам системный счетчик с частотой 1 кгц. (или 10 Мгц. в ядре) (?) - вряд-ли вы это прямо сможете увидеть !
А вот изменение значения функции таймеров в CoDeSys - так оно происходит с частотой цикла программы ! 

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

3-тье.  Останавливать счетчик  RT  не имеет смысла - на то он и счетчик Реального Времени ! Дело не в плохой разработке среды. Есть вещи принципиально невозможные. Рассмотрение момента времени и движущееся время - несовместимы (как длину измерять в квадратных килограммах). Если остановить счетчик, то он перестанет быть счетчиком Реального Времени - в этом смысл его сути ().

Часто бывает надо выяснить какую-то конкретную предполагаемую ситуацию. Например, значения переменных при определенном значении другой переменной. Или состояние при достижении какого-то числа счетчика  и т.д.  Специально на эти случаи вставляется отладочный код, или точка останова.
Обычно подобные приемы и используются при отладке в RT.

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

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


Присоединился: 02 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - Mixer Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 25 Май 2007 08:12
Спасибо, за объяснение. Может быть (наверное) Вы и правы. Я осознал свою ошибку.


Прошу не обижаться кого может быть обидел.
Видимо знаний моих критически мало. Необходимо их пополнять. Не подскажите где можно найти информацию кроме   И.В. Петров Программируемые контроллеры и документации по CoDeSys?
Наверх
Nekit Смотреть выпадающим
Участник
Участник
Аватар

Присоединился: 04 Апрель 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 80
Свойства публикации Свойства публикации   Ответить, цитируя автора - Nekit Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 27 Май 2007 14:33

To Mixer http://www.prolog-plc.ru/tmpl.php?content=info3.htm

SAN, а вы не думали оформить эти измышления в виде публикации? Почитать было бы многим интересно а не только форумчанам.

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


Присоединился: 29 Январь 2004
Категория: Russian Federation
Online Status: Offline
Публикации: 293
Свойства публикации Свойства публикации   Ответить, цитируя автора - _IP_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 28 Май 2007 13:28

Первоначально опубликовано Mixer

Ну, а разве не для отладки придуманы всякие там точки остановки, пошаговый режим и симуляция? По-моему как раз для того, чтобы посмотреть как будет себя вести система в каком-то определенном случае...

Поставил точку останова на IF, попал в нее. Далее вручную поменял значение выхода  Tmr_cycle.Q и пошел в какую надо ветку. Экземпляр FB таймера вообще можно раскрыть в отладчике и поменять значения внутренних перемененных, дабы привести его желаемое состояние.

Жалко конечно, что время нельзя останавливать. Пока я сплю будильник (аналог таймера МЭК) мог бы постоять

Igor Petrov
Наверх
 Ответить Ответить Страница  <1 678910 11>

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

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