В ФБ все переменные сохраняют свои значения до следующего вызова,
а в функции нет - инициализируются значениями по-умолчанию!
Свой ФБ Вы можете вызывать без передачи параметров, например (fB_bool_TO_int()),
значение входных останутся теми же, которые были при первом вызове.
А вот функция без параметров - ошибка.
В ФБ если алгоритм не изменил значения внутренних или выходных переменных,
то они тоже сохраняются между вызовами.
По аналогии с ООП ФБ - это объекты со своими полями.
Последний раз редактировалось EFrol; 03.05.2024 в 12:11.
novinky Собственно, в этом и отличие по их работе и есть.
Функция НЕ запоминает своё состояние ВООБЩЕ. Поэтому все переменные там НЕ сохраняются никогда и никак. Они обсчитываются только на момент вызова функции.
Это используется, когда надо сделать одни и те же вычисления для разных данных. Функции занимают память один раз: на сам код функции. В программе идёт обращение к одному и тому же коду из разных мест.
Функциональный Блок запоминает состояние всех переменных внутри. Но он будет потреблять больше памяти: на каждый экземпляр функционального блока будет выделяться своя отдельная память, так как разные экземпляры блоков могут иметь разное состояние внутренних переменных.
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab
классическое объяснение про ПЛК гласит:
- ПЛК опрашивает входа и запоминает их значения,
- выполняет код,
- записывает результат в выхода.
Если i1=1 и i2=1, то согласно учению, ПР должен выдать sum=3
Последний раз редактировалось novinky; 03.05.2024 в 12:23.
Если i1=1, Затем i2=1, то почему сумму не выдает по последнему вызову?
Др несоответствие: если i1=1 и i2=1, получается не дойдя до END_IF выдает неверную сумму? Мне думается в др ПЛК результат будет = 3.
OK спасибо, попробовали через несколько IF, получили желаемый результат через функцию.
Тогда почему:
1 - "сколько раз не вызывайте функцию, ft1 и ft2 будут всегда FALSE, поэтому 3 ни когда не получите, сперва один потом два"все же значение первого сложения не потерялась "внутренняя память" перед вычислением по 2 входу?
2 - в ФБ, "если всё сделано через ELSIF. Сработает только одно условие", по первому совпавшему условию не прекращает перебирать ELSIF и суммировать?
Подскажите реализацию несложного функционала (я в этом новичек, поэтому вопросы возникают даже на несложных задачах).
Есть щит управления и кнопка без фиксации (DO1 на ПР200), также к ПР подключена ESP32 в качестве мастера.
Суть задачи, кнопкой без фиксации запускать систему с задержкой 2с, статус должен отображатся в ESP. Выключить систему можно как той же кнопкой (также задержка 2с), так и с ESP. Если выключить с ESP, то повторное нажатие на кнопку опять запустит систему. То есть это старт/стоп системы как кнопкий на щите, так и с ESP.
Кстати, получилось вот такое, вроде работает, но все же на другие варианты хотелось бы посмотреть.
Screenshot_3.png
Последний раз редактировалось RomanKk; 05.05.2024 в 12:06.