PDA

Просмотр полной версии : Проблемы с программой.



Artemid
20.06.2019, 16:05
Здравствуйте, не могу понять где ошибка в проекте. В фб OPERATOR в шаге Step7 находится таймер типа TON, его выходная переменная R2, во время первого цикла таймер отрабатывает как надо, начиная со второго таймер не работает , показывает что выходная переменная R2 постоянно активна, хотя на входе IN переменная меняет свое состояние. В общем таймер как бы не сбрасывается. В шаге Step12 такая же проблема с другим таймером. Программу (очень корявую) прилагаю.

Artemid
20.06.2019, 20:48
Хороший пример привели, я так понимаю таймер сбросить надо, но ведь если таймер типа ton и на входе in переменная из 1 в 0 устанавливается то он сам должен отключиться и выход Q установить в 0. И как тогда его сбросить? В следующем шаге я указывал что выходная переменная таймера должна в 0 установиться, но видимо не так это сделал, толку небыло. Понимаю что туплю в элементарных вещах.

Sulfur
20.06.2019, 21:14
Artemid
Заметил, что иногда таймеры некорректно работают, если они объявлены локально, в отличии от таймеров, объявленных глобально.

Sulfur
20.06.2019, 21:34
Валенок
Я не утверждаю, что я гуру в КДС. Я сам часто работаю с таймерами, и предпочитаю описывать их глобально. Кроме того, я не практикую FBD и разбираться в чужом коде без комментариев удовольствие то еще.
Попробую еще раз:
Насколько я понял, ton2 запускается по наличию BQ3, назначенному на вход №26 ПЛК. Т е. по BQ3=false таймер должен остановиться и сбросить выход в 0 в любом случае, но этого не происходит. Если ton2 успел поставить выход в 1, и к нему больше не было обращения (программа больше не вызывает этот ФБ, работает в другом шаге\месте), то таймер "зависает". С глобальными таймерами такого не происходит. И потом, у топикастера локальные переменные в его ФБ имеют те же имена что и глобальные переменные в конфиге ПЛК, в том числе и BQ3. Тут тоже может сидеть засада.
Хотелось бы услышать где я ошибаюсь.

capzap
20.06.2019, 21:40
Валенок
Я не утверждаю, что я гуру в КДС. Я сам часто работаю с таймерами, и предпочитаю описывать их глобально. Кроме того, я не практикую FBD и разбираться в чужом коде без комментариев удовольствие то еще.
Попробую еще раз:
Насколько я понял, ton2 запускается по наличию BQ3, назначенному на вход №26 ПЛК. Т е. по BQ3=false таймер должен остановиться и сбросить выход в 0 в любом случае, но этого не происходит. Если ton2 успел поставить выход в 1, и к нему больше не было обращения (программа больше не вызывает этот ФБ, работает в другом шаге\месте), то таймер "зависает". С глобальными таймерами такого не происходит. И потом, у топикастера локальные переменные в его ФБ имеют те же имена что и глобальные переменные в конфиге ПЛК, в том числе и BQ3. Тут тоже может сидеть засада.
Хотелось бы услышать где я ошибаюсь.

а кто мешает таймеры запускть в конце блока, а в шагах(коде) только устанавливать входные аргументы тайиера

Sulfur
20.06.2019, 21:51
capzap
Вопрос не ко мне. Мы тут обсуждаем творчество другого товарища.

capzap
20.06.2019, 21:57
capzap
Вопрос не ко мне. Мы тут обсуждаем творчество другого товарища.

ну это же Вы предлагаете сделать таймеры глобальными. К примеру такое ПОУ как ФБ, предназначается чтоб не писать повторяющийся код для однотипных объктов, один ФБ - множество экземпляров, в этом случае как должны работать глобальные ФБ аля TON? Ну редположим каким то образом обошли эту проблему, не запутаетесь в названиях таймеров, если объектов будет с десяток. Можно дальше продолжать, но смысл в том что не нужно советовать не рациональные решения

Artemid
21.06.2019, 09:46
Спасибо большое за советы. Да мне действительно нужно только задержать переход на 1 сек. Сейчас пробовал через атрибуты шага, устанавливал мин и макс время в формате t#1s, в одном шаге работает отлично, в двух других задержка не осуществляется.

Artemid
21.06.2019, 12:59
43243 В 1, 7, 12 шагах выкинул таймер, в атрибутах к шагу указал t#1s, в 7 шаге это заработало, т.е. переход на 1 сек задерживался, в 1 и 12 задержки перехода не было. И простите еще один тупой вопрос: в шаге у меня объявлен таймер

ton1(IN:=BQ1, PT:=t#1s);
R1:=ton1.Q;
во входном действии чтобы сбросить таймер я указываю R1:=FALSE; я правильно делаю или это как то по другому должно выглядеть?

glazastik
21.06.2019, 13:46
Если в Init пропишите
ton1(IN:=BQ1, PT:=t#1m);
ну или смысл в том чтобы таймер не сработал за время выполнения init
то точно обнулите таймер

но не уверен что это эстетически правильно

petera
21.06.2019, 14:28
Не понимаю, зачем ВООБЩЕ использовать ФБ таймеров в программах на SFC
когда есть переменные контроля времени активности шага типа _timeStep10
43244

Например, используем для условий перехода по времени между шагами
простое условие
43245

сложное условие
43246

Можно использовать время выполнения шага для вычислений
Считаем рампу
43247

Как показывает практика, лучше задать атрибут времени шага(максимальное время) вместо заявленного "необходимо явно объявить, например "_timeStep1: TIME;"
43248

petera
21.06.2019, 14:59
В первоначальной логике TC тон (в шаге 7) висел с QB3. Задержка в шаге от момента подъема QB3.
Тут либо свой таймер, либо "_timeStep1: TIME;" руками сбрасывать. С атрибутом - не катит

Сбрасывать ничего не надо, т.к.
В отличии от атрибута минимальное время шага, который явно влияет на выполнение шага по времени, атрибут максимальное время шага не влияет на выполнение шага, этот атрибут может использоваться для анализа ошибки выполнения программы через переменную SFCError

SFCError: Эта логическая переменная принимает значение ИСТИНА, когда происходит задержка времени в некотором шаге. Если следом возникнет вторая ошибка, она не будет зафиксирована, если флаг SFCError не был предварительно сброшен. Для уточнения причины ошибки необходимо использовать флаги: SFCErrorStep, SFCErrorPOU, SFCQuitError, SFCErrorAnalyzation.

Пример: Если в SFC POU некоторый шаг активен дольше чем время, заданное в его атрибутах (см. ниже), устанавливается специальный флаг, доступный через переменную "SFCError" (SFCError принимает значение TRUE в этом случае).
Это какбы сторожевая собака с ручным анализом зависания
Т.е. прекратить выполнение шага можно и до и после времени заданного атрибутом макс.время выполнения любыми условиями перехода.