PDA

Просмотр полной версии : RS-триггер и локальные переменные



Frants
09.03.2022, 12:46
Доброго времени суток всем!
Создаю свой POU типа function. Добавляю RS-триггер. В интерфейсе функции в разделе VAR появляется объявление переменной RS_0: RS;
И такой вопрос.
В разделе VAR описываются локальные переменные блока, которые, по идее, являются временными и до использования в блоке должны инициализироваться.
Может быть, этот раздел не самое лучшее место для триггера, который должен помнить своё состояние?

Frants
09.03.2022, 13:11
Зачем же компилятор позволяет его туда вставить?

Frants
09.03.2022, 14:10
Ясно. Тогда такой вопрос. Как в теле функции выполнить установку/сброс глобальной битовой переменной. Может для этого есть отдельные инструкции типа set / reset ? В CFC пока не нашёл ничего такого. Может какую библиотеку подскажете?

Frants
09.03.2022, 14:45
Вообще, надо воспользоваться командой установки/сброса именно внутри функции (не функционального блока, а функции).
Похоже, что для CFC это невыполнимая операция. Например, в LD есть инструкция SET (Set coil).

melky
09.03.2022, 16:35
Frants прочтите отличия Функции от Функционального блока. Под Функцию не резервируется память для переменных, они создаются при каждом вызове функции и потом уничтожаются.

Если вы хотите сделать именно функцией что-то, то сделайте вход IN_OUT например и свяжите с переменной внешней (это один из подходов).
В общем надо сперва понять чего вы там хотите?

Frants
09.03.2022, 22:26
Спасибо за помощь!
Как я уже говорил выше, есть глобальная битовая переменная, есть функция (именно функция, не ФБ). Требуется в теле функции выполнить установку или сброс этой переменной.
Как выяснилось выше, инструкция RS в языке CFC не подходит для этого.
Я попробовал решить эту задачу с помощью функции на языке LD, там есть инструкция установки (Set coil) и сброса (Reset coil) - отлично получается!
Но это в LD. Хотелось бы сделать то же и в CFC.
Почему возник вопрос? Я новичок, наблюдая за созданием первой программы для ПЛК210 в видео вебинара, я заметил что у ведущего вебинар переменная для инструкции RS объявлена в локальной области. Это вызывает недоумение, почему переменная объявлена в локальной области (а не в статической хотя бы), или в Codesys локальные переменные это совсем не то что в TIA Portal или Simatic Manager? Вот эти подробности и хочется понять. Пока не нашел где точнее почитать, в первых шагах нет такого. Ну и конечно же, как это сделать в CFC?

melky
09.03.2022, 22:51
А просто обратиться к глобальной переменной из тела функции и так же прописать SET или RESET в зависимости от результата расчета функции? (так понимаю вам именно это нужно?)

з.ы. под рукой нет сейчас CDS но SET и RESET в CFC так же применяются. Поклацайте по пиктограммам вверху, там это есть...

и все-таки лучше это делать не внутри самой функции, а используя выход функции, как-бы более корректнее будет.

Frants
09.03.2022, 23:10
Сейчас тоже под рукой нет, но до этого целый день искал, нигде не нашёл :)
Да, согласен с Вами, через выход - это корректно. Но специфика задачи требует такое решение.
Предполагается, что функция будет опрашивать структуры управления множеством приводов, на предмет наличия у какого-либо привода состояния "разгон". Что бы одномоментно мог запускаться только один из них. Для этого планируется выполнять опрос флагов перед вызовом блока каждого привода.

melky
09.03.2022, 23:52
И почему вдруг этим не может заниматься FB ?

Вверху над полем куча кнопочек, там где выбираете поставить блок на поле и т.д. что-то среди них, если не ошибаюсь.
На работе сам завтра гляну... Перед переменной появится возможность S или R выставлять.
Или на входе самой переменной тыкнуть.

Более опытные товарищи быстрее бы подсказали.

https://www.youtube.com/watch?v=0zXQXUaBwLI около 3-й минуты.

з.ы. ну и вам никто не мешает функцию сделать на LD и вызывать ее в программе на CFC к тому же.

Frants
10.03.2022, 10:53
Про S и R понято, принято. Осталось разобраться с областями переменных.
Экземпляр RS_0 триггера объявлен в разделе локальные переменные — VAR. По невнимательности я принял этот раздел за временные переменные (VAR_TEMP).
В справке про время жизни переменных и что где и какие области лучше для каких целей использовать не очень густо написано.
Будем искать. Спасибо за помощь!

melky
10.03.2022, 11:41
RS_Trig как и другое работает от цикла к циклу, вроде код открыт этого FB. И если Функция вызывается в пределах одного цикла, то RS_Trig вставленный внутри Функции как мертвому припарка... просто не будет работать.

Sergey666
10.03.2022, 14:29
А просто обратиться к глобальной переменной из тела функции .

А вот за это в КДС надо палкой бить. Все должно работать через интерфейсы.

melky
10.03.2022, 16:00
Sergey666 ну я об этом выше написал, что политкоректнее выход привязывать к переменных, а не прямо внутри колхозить, чтобы потом никто не нашел :)