PDA

Просмотр полной версии : простой вопрос по Sfc



drvlas
30.10.2010, 15:59
В простейшей SFC программе создаю счетчик. На его счетный вход подаю битовую переменную bIn. Ее устанавливаю в TRUE во входном действии одного шага, а сбрасываю - во входном действии следующего шага.
Переходами между шагами управляю вручную, чтобы все видно было в подробностях.

Счетчик не считает. Хотя битовая переменная bIn и ведет себя не совсем так, как я ожидаю, однако же она изменяет свое состояние. А в это время наблюдаю за счетным входом счетчика - он стоит в нуле, как убитый.

Почему?

Проект прилагаю

ДОБАВЛЕНО: С помощью уважаемого Gans вопрос решился. Смотри сообщение от 31.10.2010 и работающий проект с переходом по изменению состояния счетчика

Gans
30.10.2010, 19:17
Привет.
а вызвать сам счетчик, ну что бы он смог посчитать.
C1();
или сразу
C1(CU:=bIn, RESET:=false);

drvlas
30.10.2010, 20:47
Ну, изучая твое колдовство, я где-то начинаю в ту степь думать. Но не могу понять - разве включение этого счетчика в шаге Init в виде FBD - это не вызов???

drvlas
30.10.2010, 21:03
ПАЛУЧИЛОСЯ!!!

Добавил в шаг действие с классификатором S - для получения такого же результата, как у тебя шагом stpService с FALSE переходом. Т.е. для бесконечного существования этого счетчика.
А теперь в каждом шаге, на котором у меня требуется остановка, по входу добавляю действие

b := FALSE;

а по выходу -

b := TRUE;

Ладно, сейчас доделаю проектик и выкладу. Может не один я так низко начинаю :)

drvlas
31.10.2010, 07:41
Итак, что стало ясно после любезной помощи товарищей.

Задача была не просто запустить счетчик, но на основе анализа его приращения делать вывод о переходе к следующему шагу SFC-программы.

Какова была моя проблема (см.проект в первом посте)? Запуск ФБ "Счетчик" в блоке Init вовсе не дал мне возможность со счетчиком работать. Думаю, что неактивность блока Init - вот причина.
Поэтому можно:

а) При работе с упрощенными CoDeSys шагами построить параллельную ветвь и там в первом шаге (который сделать бесконечно работающим или деактивировать когда пошаговость не нужна) вызывать Счетчик. Он становится активным, можно в других шагах дергать его вход, состояние будет меняться - ну и его анализ позволяет сделать вывод, что кнопка ШАГ нажата. Этот путь подсказал товарищ Gans

б) При работе с МЭК-шагами создать действие с классификатором S и в нем вызвать тот самы Счетчик. Теперь он тоже будет существовать вечно и анализ его состояния позволяет шагать по программе.

Работающий пример прилагаю.

З.Ы. Единственное, чего не понял - почему задание PV в счетчике никак не влияет на его работу? Делал 65536, делал 5, делел 0 - счетчик считает себе, не замечаю перехода через границу. Что-то я еще не дочитал...

Gans
31.10.2010, 08:48
привет вот решил накидать свой вариант счетчика (на мой взгляд более правильного :-).
на счет «почему задание Pv в счетчике никак не влияет на его работу?»
- выход Q устанавливается в True, когда счетчик достигнет значения заданного Pv. (это цитата из документации)

drvlas
31.10.2010, 10:03
вариант счетчика (на мой взгляд более правильного
Нет-нет, дорогой Учитель! Тут ты не понял мою задачу. Несмотря на название счетчика, я его использую ТОЛЬКО для определения самого факта нажатия. А никак не подсчета числа шагов. Извини за путаницу!

Поэтому именно так, как сделано: каждое нажатие кнопки (здесь иммитируется ручным взведением переменной bStepNext) приводит к изменению состояния счетчика - и к пониманию программой, что шаг можно делать.


на счет «почему задание Pv в счетчике никак не влияет на его работу?»
- выход Q устанавливается в True, когда счетчик достигнет значения заданного Pv. (это цитата из документации)
Ну, я это видел. И почему-то решил, что счетчик еще и сбрасывается. Ладно, теперь ясно. Пусть считает дальше :)