Просмотр полной версии : пошаговое выполнение Sfc-программы
Здравствуйте!
Есть прогамма на SFC. В ней есть какое-то количество шагов в том смысле, как их определяет сам язык SFC. Но можно выделить и некое количество шагов (я их называю "фазами"), остановка на которых что-то значат для пользователя.
В нормальном режиме работы программа прокручивает свои шаги (среди которых и фазы), все чики-пики. Теперь я хочу организовать пошаговый (отладочный) режим - когда некий тумблер переключается в состояние ПОШАГОВО (у нас это какой-то дискретный вход _bStpStp). Как только тумблер щелкнул, я хочу, чтобы переходы между шагами выполнялисть теперь по прежним правилам, но с одной оговоркой:
те шаги, которые я считаю фазами (т.е. некоторые шаги на мой выбор) переходят дальше при дополнительном условии, что во время активности данного шага была нажата кнопка ШАГ (еще один вход _bStep).
Я тут накручиваю варианты, аж вспотел. Все ужасно. Как бы сделать красиво? Куда впихнуть ловлю нажатия ШАГ, как сбрасывать этот флаг, когда шаг сделан и мы стоим на следующем шаге?
Использую шаги по МЭК.
Спасибо!
извини что по тексту комментариев нет, просто не смог придумать что комментировать :-)
Спасибо, начинаю вкуривать твой пример. Есть НИПАНЯТКИ.
Добавлено: пропускайте это, если спешите. Читайте следующий пост.
Итак, у тебя 3 идентичных (не МЭК) шага, в которых на входе стопится таймер и сбрасывается разрешение следующего шага blnNextStep.
Хорошо. Таймер нужен только для того, чтобы показать, как в автомате программа сама будет скакать зайчиком. Верно? Я могу вместо проверки
TON_Delay.Q AND NOT blnStepWork
поставить нечто свое вместо TON_Delay.Q
В теле шага таймер запускается (я так ин е понял, зачем его стопить, но ЩАС подойдем до этого)
А в переходах между шагами ты поставил параллельные ветви. Я читал про параллельность, а додуматься не смог, что и переходы бывают параллельными, сдуру писал всегда горбатые выражения через OR. Хотя, по сути это одно и то же. Или нет?
Итак, переход происходит либо по таймеру, если сброшен признак пошаоговости, либо по условию:
blnNextStep AND blnStepWork
Вроде бы тоже ясно. Единственное, что я хочу: переходы в пошаговом режиме происходят по прежним условиям, к которым дополнительно добавлено условие РАЗРЕШИТЬ ОДИН ШАГ.
То есть, верно ли будет добавить во вторую ветвь переходов проверку
TON_Delay.Q AND
чтобы было по-моему?
Тогда, ИМХО, и стопить таймер в Entry Action не нужно. Так?
Видишь, ты не знал, что комментировать. Ответь на все мои знаки вопроса - вот и наговоришься :)
Но теперь главное. Допустим, все это я верно понял (я и сам могу проверить, но то все было цветочки). А вот как именно связать blnNextStep с кнопкой?
Не смейся, пожалуйста. Либо МЭК от упрощенного CoDeSys сильно отличаются, либо у меня лыжи не едут. Смотри.
Я ставлю на кнопку триггер R_TRIGGER и взвожу его по перепаду. Выход триггера будет коротким? Один цикл, если я правильно понимаю. Этот самый выход я перемножаю с тем, что у тебя названо blnStepWork и запускаю на S-вход RS-триггера. Теперь я знаю, что нажатие на кнопку ШАГ вызовет установку RS-триггера в пошаговом режиме. Ура. А сбрасывать его когда? Тут пошли размышлизмы:
Считаю, что каждое нажатие кнопки ШАГ произойдет где-то в середине шага (т.е. не непосредственно в момент входа в шаг). Поэтому в Entry Action каждого шага я поднимаю R-вход триггера, сбрасывая его и само разрешение перехода по шагу. А где-то чуть позже (хоть на такт) мне нужно этот R-вход деактивировать. И именно это не получается! Ставлю действие, например, с идентификатором
L T#2000ms
в котором R-вход сбрасывается. А он не сбрасывается.
Ну, и другие варианты тоже не пашут.
Т.е., возвращаюсь из своих путаных якобы пояснений к простому вопросу:
как связать переменную blnNextStep с нажатием кнопки?
Т.е., возвращаюсь из своих путаных якобы пояснений к простому вопросу:
как связать переменную blnNextStep с нажатием кнопки?
Прилагаю свое проектик, мож проще будет понять поток сознания
Вот в этом варианте действие ReleaseReset не активизируется на 2 секунды, как ожидалось. Оно вообще не активизируется!
Прошу учесть, что само это действие мне до лампочки. Мне бы bRes передернуть в начале шага. А еще правильнее - bOneStep связать с нажатием по входу _bStep правильным образом.
1. Итак, у тебя 3 идентичных (не МЭК) шага, в которых на входе стопится таймер и сбрасывается разрешение следующего шага blnNextStep.
Хорошо. Таймер нужен только для того, чтобы показать, как в автомате программа сама будет скакать зайчиком. Верно?
- совершенно верно :-)
2. Я могу вместо проверки TON_Delay.Q AND NOT blnStepWork поставить нечто свое вместо TON_Delay.Q?
- конечно этоже уже Ваша программа :-)
3. А в переходах между шагами ты поставил параллельные ветви. Я читал про параллельность, а додуматься не смог, что и переходы бывают параллельными, сдуру писал всегда горбатые выражения через OR. Хотя, по сути это одно и то же. Или нет?
- конечно это одно и тоже, правда иногда так не красиво :-)
4. Вроде бы тоже ясно. Единственное, что я хочу: переходы в пошаговом режиме происходят по прежним условиям, к которым дополнительно добавлено условие РАЗРЕШИТЬ ОДИН ШАГ. То есть, верно ли будет добавить во вторую ветвь переходов проверку TON_Delay.Q AND чтобы было по-моему?
- конечно это будет верно, только не забудь про скобочки в нужных местах :-)
5. Но теперь главное. Допустим, все это я верно понял (я и сам могу проверить, но то все было цветочки). А вот как именно связать blnNextStep с кнопкой?
- предположим что кнопка перехода в следующий шаг подключена на третий вход ПЛК100. Тогда войти в ПЛК-конфигурацию и перед «АТ %IX0.0.2: BOOL» дважды щелкнуть мышкой и ввести имя переменой blnNextStep
во вложении я подправил объявление переменных.
и добавил ещё пример работы в SFC
5. А вот как именно связать blnNextStep с кнопкой?
- предположим что кнопка перехода в следующий шаг подключена на третий вход ПЛК100. Тогда войти в ПЛК-конфигурацию и перед «АТ %IX0.0.2: BOOL» дважды щелкнуть мышкой и ввести имя переменой blnNextStep
Нет, уважаемый Учитель. Ты не понял моего вопроса. Связывать имена переменным, которые отражают состояние дискретных входов, это пол-дела. Спасибо за указание, что это нужно делать в одном месте - в данном случае в Конфигураторе входов. Будем так и делать.
Но вопрос был в другом: на этот самый вход подается сигнал с кнопки ШАГ. И мне нужно, чтобы в режиме _bStpStp по нажатию кнопки _bStep (ШАГ) выполнился ОДИН переход из одного шага в другой, после чего контроллер ждет отпускания кнопки ШАГ и следующего нажатия. Или отпускание может быть и раньше, тогда процесс ждет просто следующего нажатия.
Т.е., включили потенциально вход _bStpStp:=TRUE и после этого каждое нжатие ШАГ позволяло сдвинуться с текущего активного шага на следующий (если там еще и свои условия перехода выполняются, но это уже детали).
Безуспешно пытаясь наваять такое, я сделал по входу _bStep триггер Q_Step (в том числе) и тут вычитал, что такой триггер по входу можно объявить и в Конфигураторе ПЛК. А там еще одна засада, описанная в ветке о подавлении дребезга (http://www.owen.ru/forum/showthread.php?t=9054). То отдельная песня. Но ответ на вопрос здесь - как вообще словить разовое нажатие ШАГ, перейти и ждать следующего нажатия? - пока не дан.
Можно вообще отвлечься от моей реализации. Просто - прога на SFC и необходимость шагать от внешней кнопки. Все.
точки прерывания не помогут?
нет, я поясню точнее. речь идет не об отладке проги с остановами, а о нормальной работе в таргет-девайсе, в ходе которой разработчик (т.е. я) заложил 2 режима:
- автоматический
- пошаговый
режимы выбираются тумблером. автомат - обычная работа. когда пошаговый - работа проги почти такая же, все условия переходов проверяются и без этого - ни-ни! но!!! в нескольких (избранных) шагах, которые я называю "фазами" переход включает дополнительное условие: однократное нажатие (и сколь угодно долгое удержание) кнопки шаг, имеющейся на панели управления и подключенной к одному из дискретных входов плк-100.
вот у меня по неопытности никак не получается так принимать и обрабатывать нажатие кнопки шаг, чтобы нажал - проверились остальные условия и перескочили, нажал - проверились остальные условия и перескочили, нажал...
Про CoDeSys со временем очень понравится, и чем дальше тем больше!!!
Я тут накидал что смог понять из пожеланий + добавил кнопку «Стоп» (на 8-ой вход ПЛК100). Для симуляции программы необходимо в ПЛК-конфигурации изменять состояние входов.
Про CoDeSys со временем очень понравится, и чем дальше тем больше!!!
Надеюсь!
По твоему решению. Работает, йидрить его налево! Не пойму, как, но таки да.
Пробую разобраться. Пока вижу только, что ты в интересующих меня (для остановки) шагах во входном действии ЗАПУСКАЕШЬ экземпляр функционального блока. Вот этого я не делал! Я и сейчас с трудом осознаю, что же это такое: в действии stpService имеется вызов этого FB, на его входах вполне определенные сигналы, и вдруг бац! - в шаге sptWork1 мы видим снова запуск этого же блока с совершенно произвольными значениями сигналов на входах. Как-то это в голову не лезет...
А в другой ветке вопрос по счетчику (я на нем альтернативный способ пошаговости придумал, может быть интересно) - посмотри, плз, что там не так!
Надеюсь!
в действии stpService имеется вызов этого FB, на его входах вполне определенные сигналы, и вдруг бац! - в шаге sptWork1 мы видим снова запуск этого же блока с совершенно произвольными значениями сигналов на входах. Как-то это в голову не лезет...
Привет, вызывать объявленный функциональный блок можно сколько угодно раз и пользоваться входами/выходами в других местах программы. Это как свойства объекта (RS_NextStep.Q1) на С++/Delphi и тд., а что бы эти свойства были использованы объектом необходимо его вызвать - TON_Delay(IN:=TRUE, PT:=t#10s);
На самом деле CoDeSys - очень удобная вещь :-) При работе с ПЛК1хх не перестаю удивляться как сложные задачи можно решать простыми путями. Что бы понять основные возможности CoDeSys как минимум необходимо освоить SFC, ST, CFC/FBD. есть еще IL и LD, но я ими еще ни разу не пользовался и пока всё красиво решалось :-)
Привет, вызывать объявленный функциональный блок можно сколько угодно раз и пользоваться входами/выходами в других местах программы.
Дык, это вроде как понятно. Но когда я вызывал ФБ в Инит (и уходил с этого шага навсегда), то почему-то этот ФБ (счетчик в том случае) морозился и не работал... Ну, вопрос решился использованием бесконечного действия (описано в другой ветке (http://owen.ru/forum/showthread.php?t=9079)), а далее надеюсь, что с практикой придет лучшее понимание SFC. Все же непривычная штука для традиционщика.
как минимум необходимо освоить SFC, ST, CFC/FBD. есть еще IL и LD, но я ими еще ни разу не пользовался и пока всё красиво решалось :-)
Похоже, именно в таком наборе я и осваиваю. IL не нужен, если привык к Си (т.е. тяготеешь побольше на ST накалякать), а LD - не дает мне преимущества в предметной области перед тем же ST и FBD.
Спасибо большое за помощь, свой вопрос я решил!
Для тех, кто забредет сюда в поисках ответа на организацию пошагового выполнения SFC-программы, прилагаю работающий пример, который я создал с помощью коллеги Gans'а.
SFCTip, SFCTipMode не спасут гиганта мысли? :) Нашел вот, а самому пробовать лень...
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot