Просмотр полной версии : простой вопрос по Sfc
В простейшей SFC программе создаю счетчик. На его счетный вход подаю битовую переменную bIn. Ее устанавливаю в TRUE во входном действии одного шага, а сбрасываю - во входном действии следующего шага.
Переходами между шагами управляю вручную, чтобы все видно было в подробностях.
Счетчик не считает. Хотя битовая переменная bIn и ведет себя не совсем так, как я ожидаю, однако же она изменяет свое состояние. А в это время наблюдаю за счетным входом счетчика - он стоит в нуле, как убитый.
Почему?
Проект прилагаю
ДОБАВЛЕНО: С помощью уважаемого Gans вопрос решился. Смотри сообщение от 31.10.2010 и работающий проект с переходом по изменению состояния счетчика
Привет.
а вызвать сам счетчик, ну что бы он смог посчитать.
C1();
или сразу
C1(CU:=bIn, RESET:=false);
Ну, изучая твое колдовство, я где-то начинаю в ту степь думать. Но не могу понять - разве включение этого счетчика в шаге Init в виде FBD - это не вызов???
ПАЛУЧИЛОСЯ!!!
Добавил в шаг действие с классификатором S - для получения такого же результата, как у тебя шагом stpService с FALSE переходом. Т.е. для бесконечного существования этого счетчика.
А теперь в каждом шаге, на котором у меня требуется остановка, по входу добавляю действие
b := FALSE;
а по выходу -
b := TRUE;
Ладно, сейчас доделаю проектик и выкладу. Может не один я так низко начинаю :)
Итак, что стало ясно после любезной помощи товарищей.
Задача была не просто запустить счетчик, но на основе анализа его приращения делать вывод о переходе к следующему шагу SFC-программы.
Какова была моя проблема (см.проект в первом посте)? Запуск ФБ "Счетчик" в блоке Init вовсе не дал мне возможность со счетчиком работать. Думаю, что неактивность блока Init - вот причина.
Поэтому можно:
а) При работе с упрощенными CoDeSys шагами построить параллельную ветвь и там в первом шаге (который сделать бесконечно работающим или деактивировать когда пошаговость не нужна) вызывать Счетчик. Он становится активным, можно в других шагах дергать его вход, состояние будет меняться - ну и его анализ позволяет сделать вывод, что кнопка ШАГ нажата. Этот путь подсказал товарищ Gans
б) При работе с МЭК-шагами создать действие с классификатором S и в нем вызвать тот самы Счетчик. Теперь он тоже будет существовать вечно и анализ его состояния позволяет шагать по программе.
Работающий пример прилагаю.
З.Ы. Единственное, чего не понял - почему задание PV в счетчике никак не влияет на его работу? Делал 65536, делал 5, делел 0 - счетчик считает себе, не замечаю перехода через границу. Что-то я еще не дочитал...
привет вот решил накидать свой вариант счетчика (на мой взгляд более правильного :-).
на счет «почему задание Pv в счетчике никак не влияет на его работу?»
- выход Q устанавливается в True, когда счетчик достигнет значения заданного Pv. (это цитата из документации)
вариант счетчика (на мой взгляд более правильного
Нет-нет, дорогой Учитель! Тут ты не понял мою задачу. Несмотря на название счетчика, я его использую ТОЛЬКО для определения самого факта нажатия. А никак не подсчета числа шагов. Извини за путаницу!
Поэтому именно так, как сделано: каждое нажатие кнопки (здесь иммитируется ручным взведением переменной bStepNext) приводит к изменению состояния счетчика - и к пониманию программой, что шаг можно делать.
на счет «почему задание Pv в счетчике никак не влияет на его работу?»
- выход Q устанавливается в True, когда счетчик достигнет значения заданного Pv. (это цитата из документации)
Ну, я это видел. И почему-то решил, что счетчик еще и сбрасывается. Ладно, теперь ясно. Пусть считает дальше :)
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot