PDA

Просмотр полной версии : Реализация паузы в SFC



KoT'86
04.06.2013, 15:37
Имеется необходимость в остановке программы в любом её месте,с дальнейшим продолжением. Т.е. время шага должно остановиться, а после снятия паузы продолжиться. С SFCPause время шага начинает идти с нуля, что не устраивает условиям.

lara197a
04.06.2013, 16:18
Не знаю, что за программа у Вас, но возможно проще к примеру снимать питание с выходных цепей.
Будет работать в случае, если в устройстве используете датчики.

KoT'86
04.06.2013, 16:44
Программа мойки резервуаров. Переключение насосов и клапанов происходит по времени (жесткая привязка), датчиков ОС нет. Необходимо по паузе выключать все устройства (с этим проблем нет) и останавливать время шага, после снятия паузы время шага должно продолжиться.

petera
04.06.2013, 16:58
Имеется необходимость в остановке программы в любом её месте,с дальнейшим продолжением. Т.е. время шага должно остановиться, а после снятия паузы продолжиться. С SFCPause время шага начинает идти с нуля, что не устраивает условиям.
Вся программа на упрощенном SFC (не МЭК) состоит из шагов и условий перехода между шагами.
Я подозреваю, что в основном Ваша программв реализует некотторый алгоритм
Шаг_N--> включить то-то, выключить то-то, если время активности шага > заданного то, перейти на следующий. И так далее.
И скорей всего Вы используете простое условие для перехода типа _timeШаг_N > T1
А кто Вам мешает вместо такого простого условия перехода дважды щелкнуть мышкой на горизонтальной черточке и в качестве условия перехода написать фрагмент кода на IL, LD, FBD или ST, с таймером с возможностью остановки и продолжения работы, который и будет запоминать текущее время работы этого шага?

Николаев Андрей
05.06.2013, 08:38
Либо создать параллельную ветвь, в которой условие будет отслеживание нажатия "пауза"

KoT'86
05.06.2013, 08:42
petera, Вы всё правильно поняли, через определённые промежутки времени нужно что-то включить-выключить, но во время этого промежутка необходимо отслеживать состояние аварийного выключателя и если он активен, то выключить кое-какие выхода и остановить время шага. Я при входе в шаг включаю-выключаю что нужно, в шаге проверяю аварию и предпринимаю действия по ней, а промежуток времени задаю минимальным временем шага.

Yegor
05.06.2013, 09:30
Можно навставлять переменных типа TIME в качестве временных атрибутов каждого шага и уменьшать их, а потом сбрасывать по изменению SFCPause. Но я бы выкинул SFC и написал всё одним большим CASE.

Собственно, так я и сделал когда от меня потребовали возможность вставать на паузу в совершенно любой момент и учитывать время в отсутствие питания на контроллере. Я переписал таймер TON для своего проекта, чтобы он использовал вместо функции TIME мою PTIME (стало возможным останавливать, перематывать и вообще пускать время вспять — для отладки это гипер-офигенно), и гонял этот таймер в хвост и в гриву в большом кейсе. С SFC такого естественным способом не проделаешь — только городить огород с атрибутами каждого шага.

Валенок
05.06.2013, 22:28
Не знаю, что за программа у Вас, но возможно проще к примеру снимать питание с выходных цепей.
А вообще снимать питание - слабо ?
А ФБ состоящий из SFC - держать в ретайне :rolleyes: