PDA

Просмотр полной версии : Что и откуда можно вызывать?



Frants
11.03.2022, 13:20
Доброе время суток всем!
В руководстве по Codesys попалась фраза "Объявлять экземпляр функционального блока в теле функции нельзя."
В связи с этим вопросы:
1. Почему нельзя?
2. Как вызвать ФБ из функции. Или нельзя использовать функциональные блоки в функциях?
3. Если ФБ можно использовать в функциях, то как это правильно делать?
4. Что ещё и в чём нельзя объявлять?

Трофимов Артем
11.03.2022, 13:27
вы можете вызвать функцию в ФБ, а наоборот нет.

melky
11.03.2022, 13:47
Frants под Функциональный Блок резервируется постоянная память, под Функцию НЕТ. Подумайте почему одно не будет работать ПРАВИЛЬНО в другом.

Собственно ответ на пункт 1. Который потянет и все остальные...

Frants
11.03.2022, 14:04
То есть, инструкцию R_TRIG, которая есть ФБ, использовать в функциях нельзя?

melky
11.03.2022, 14:17
Frants я писал вам раньше, изучите код R-Trig чтобы понять.

Если проще, поставив R_Trig внутри функции и подав на вход функции, связанный с входом R_Trig логическую 1-цу, он будет срабатывать ВСЕГДА, а не один раз, как положено.

Frants
11.03.2022, 14:34
М-да. А есть где-нибудь свод этих правил что можно и нельзя? Или компилятор будет помогать?
Или не один мешок шишек надо будет набить, прежде чем разберешься?

Зачем вообще здесь функции? Можно прекрасно обойтись одними ФБ.

IVM
11.03.2022, 14:39
М-да. А есть где-нибудь свод этих правил что можно и нельзя? Или компилятор будет помогать?
Или не один мешок шишок надо будет набить, прежде чем разберешься?

Зачем вообще здесь функции? Можно прекрасно обойтись одними ФБ.

А что на FUN свет клином сошелся ? Что мешает использовать вместо функции FB или PRG. Или ты FUN - фанат. ;)

melky
11.03.2022, 14:56
Frants вы раньше ни на чем не программировали ?

Frants
11.03.2022, 15:10
Идёт адаптация к новым условиям. Когда у плк объём ОЗУ измеряется килобайтами, задумаешься, что выбрать для конкретного случая.
ФБ с экземпляром или можно обойтись простой функцией. Поэтому хочется понять плюсы/минусы каждого решения или инструмента.
Пока что ФБ ведёт по очкам.

Frants
11.03.2022, 15:18
Сименс.........

IVM
11.03.2022, 15:30
Когда у плк объём ОЗУ измеряется килобайтами, задумаешься, что выбрать для конкретного случая.

Не смеши людей. Это у какого ПЛК объём ОЗУ измеряется килобайтами ? ПЛК ОВЕН это тебе не ПЛК Siemens. Это много круче. ;)

kondor3000
11.03.2022, 15:43
Идёт адаптация к новым условиям. Когда у плк объём ОЗУ измеряется килобайтами, задумаешься, что выбрать для конкретного случая.
ФБ с экземпляром или можно обойтись простой функцией. Поэтому хочется понять плюсы/минусы каждого решения или инструмента.
Пока что ФБ ведёт по очкам.

Для ПЛК 200 и 210

ROM 512 Мбайт (NAND)
RAM 256 Мбайт (DDR3)

Cs-Cs
11.03.2022, 15:55
То есть, инструкцию R_TRIG, которая есть ФБ, использовать в функциях нельзя?
Это не инструкция.

Можно я попробую на примере рассказать? Я когда-то сам тупил, учился, и мне было проще понять на своих примерах.
FB - это аналог какой-то штуки, которая целостна и внутри запоминает состояние переменных. Если брать физический мир - то это реле, таймер, выключатель. Таких штук мы можем поставить несколько - и каждая из них будет иметь своё отдельное состояние и настройки.
Например, одно "реле времени" будет настроено на 5 секунд, другое на 20 секунд, третье - выключено. Но все эти реле будут одного типа.
Вот это - FB. То есть FB - это некая хреновина, которая имеет одну и ту же логику, может сохранять своё состояние и что-то делать во время работы ПЛК, и их можно насоздавать (объявить разные переменные) сколько надо штук.

Функция - это аналог обычной функции в любом языке программирования. У неё нет никаких запоминания состояний, она ОДИН РАЗ что-то делает в момент вызова.
Например, может быть функция преобразования значения: ей на вход дали значение с датчика, а она вернула строку вида "0,23 bar" или "Err" в случае ошибки. Функция всегда выполняется на лету, как есть. Поэтому если мы объявим внутри неё FB - их значения не будут сохраняться между вызовами функции.

Где что применять - наверное ясно из описания, если у меня получилось помочь.
а) Функции - только там, где нужно разные однократные вычисления БЕЗ запоминания состояния: обработка числа, данных, строк, однотипные математические расчёты.
б) FB - во всех случаях, когда нужно запоминать состояния и что-то делать с ними: логика управления объектами (например FB управления насосом, и объявить его пять штук для пяти насосов).

Frants
11.03.2022, 16:46
Обо всём по порядку.
1) Не совсем ясно где взята информация про ROM и RAM в сотнях Mb. Но вот к примеру для ПЛК (заказной 6AG1 215-1AG40-5XB0) читаем из спецификации "program/data memory 125 KB"
2) Крутизной никто не собирался меряться, не до того.
3) Благодарю всех, что напомнили разницу между ФБ и ФЦ, это как раз не вызывает трудностей.
4) Напомню истоки темы - смотрите первый пост.

Почему так сложно: потому что до сих пор не сталкивался с проблемой разницы между локальной и временной памятью (ещё и локальной и статической); потому что фб и фц можно было вызывать откуда угодно; потому что определение фронта можно выполнить из блока любого типа; и ещё много почему.

Благодарю всех за помощь и поддержку!

m.petrovich
11.03.2022, 16:52
Обо всём по порядку.
Не совсем ясно где взята информация про ROM и RAM в сотнях Mb.

В ПЛК200 и ПЛК210
https://owen.ru/product/plk200
https://owen.ru/product/plk210

kondor3000
11.03.2022, 17:12
Обо всём по порядку.
1) Не совсем ясно где взята информация про ROM и RAM в сотнях Mb. Но вот к примеру для ПЛК (заказной 6AG1 215-1AG40-5XB0) читаем из спецификации "program/data memory 125 KB"


Вы вообще то на форуме Овен пишите, для среды Codesys 3.5. Ветка ПЛК (среда программирования CODESYS V3.5)ПЛК2хх Естественно вам скопировал с сайта Овен характеристики ПЛК 200 и 210. Ссылки выше уже дали.
А вот зачем вы тут другие ссылки даёте, не понятно.

Cs-Cs
11.03.2022, 17:42
Frants На современных ПЛК110, СПК1хх, ПЛК2хх про память можно не думать. Лучше думать про быстродействие в плане скорости опроса, выполнения задач...

И просьба описать точнее вопросы, потому что про "А шо откудова вызывать" можно лекцию написать часа на два. Это явно не то.
В CodeSys действует стандартное правило для всех языков программирования - про локальные и глобальные переменные.
Что нужно пояснить?

Frants
11.03.2022, 19:20
Вы вообще то на форуме Овен пишите, для среды Codesys 3.5. Ветка ПЛК (среда программирования CODESYS V3.5)ПЛК2хх Естественно вам скопировал с сайта Овен характеристики ПЛК 200 и 210. Ссылки выше уже дали.
А вот зачем вы тут другие ссылки даёте, не понятно.

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

Frants
11.03.2022, 19:20
Прошу простить за некоторые вольности. Просто зубы режутся, вот и больно.

Присказки долго рассказывать, да придётся.
Вот, например, экран среды разработки
59653
Слева ФЦ, справа ФБ. Глядя на интерфейс блоков, видно какие разделы описания переменных есть. Ни отнять ни добавить.
Видно так же, что механика вызова ФБ иная чем в Codesys.

Читая про Codesys, пока не нашёл полной спецификации на объявление ФЦ, ФБ, программы.
Поэтому и вопросы (детские).

Какие разделы описания переменных в каждом из типов блоков допустимы?
Вот выяснилось про ограничения вызова ФБ из ФЦ, прочитать бы подробнее, может ещё какие особенности есть.
Что мешает описать экземпляр в глобальных переменных и вызывать ФБ из ФЦ (а что, совсем-совсем нельзя так)?

Вот, например, VAR сохраняют свои значения между вызовами ФБ/программы.
Так VAR_STAT тоже сохраняют свои значения.
А у функций VAR являются временными. Тогда почему в одних типах блоков они сохраняют значения, а в других нет?
Области VAR_STAT и VAR_TEMP ясно говорят о своем назначении и поведении. Для чего тут VAR?

Читаешь справку, понять в чём разница, из того что там написано, я вывод сделать не смог.

Понятно, что программы здесь пишутся и работают, нужно просто накопить информации чтобы разобраться.

Было бы лучше, чтобы в первых шагах разобрали такие вот моменты, использование, особенности разных блоков.

Cs-Cs
11.03.2022, 19:26
Читая про Codesys, пока не нашёл полной спецификации на объявление ФЦ, ФБ, программы
А где читаешь? А то ж у ОВЕНа есть огромный PDF на сотни страниц с подробным описанием всего и вся: https://owen.ru/product/codesys_v3/documentation
А для всяких кунг-фу есть Онлайн-FAQ: https://owen.ru/forum/showthread.php?t=28167


Тогда почему в одних типах блоков они сохраняют значения, а в других нет?
Мы все рады, что ты рассказал как в Сименсе. Но ты щас на ОВЕНе, а тут по другому всё.
Скажи пожалуйста: программировал ли ты на обычных, компьютерных языках?
В курсе ли ты о том, что такое область видимости переменных (ссылка на википедию (https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2% D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8))?
У тебя проблемы не с функциями и FB, а с областью видимости переменных - ты в ней запутался.

Frants
11.03.2022, 20:03
Frants На современных ПЛК110, СПК1хх, ПЛК2хх про память можно не думать. Лучше думать про быстродействие в плане скорости опроса, выполнения задач...

И просьба описать точнее вопросы, потому что про "А шо откудова вызывать" можно лекцию написать часа на два. Это явно не то.
В CodeSys действует стандартное правило для всех языков программирования - про локальные и глобальные переменные.
Что нужно пояснить?

Как говорил один персонаж "А я до сих пор не знаю, как надо есть яблоко — резать его, или есть так, как принято у меня дома: целиком. С косточкой."

Именно так, "что и откудова". Потому что идеология системы не понятна, программу из фц или фб можно вызвать? или фб из фц? можно - но будет ли это корректно?

Вот написано в руководстве " Объявлять экземпляр функционального блока в теле функции нельзя." А почему нельзя, не разъясняется.
Нельзя потому что запрещено правилами или нельзя потому что не имеет смысла?

Или ещё, написано "Нельзя вызывать программу из функции." А ранее по тексту пишут "POU могут вызывать другие POU..." - без дополнительных уточнений.
Ясно, надо спрашивать у людей, имеющих опыт.

Frants
11.03.2022, 20:15
Спасибо, буду немножко подумать.

Евгений Кислов
11.03.2022, 20:17
Потому что идеология системы не понятна, программу из фц или фб можно вызвать?

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


или фб из фц? можно - но будет ли это корректно?

Прежде чем задавать подобный вопрос - надо озвучить критерии корректности.


Вот написано в руководстве " Объявлять экземпляр функционального блока в теле функции нельзя." А почему нельзя, не разъясняется.
Нельзя потому что запрещено правилами или нельзя потому что не имеет смысла?

Я согласен с вами - это неудачная формулировка. Из документа про CoDeSys V2.3, который вам не имеет особого смысла читать, так как ваш ПЛК программируется в CODESYS V3.5.


Ясно, надо спрашивать у людей, имеющих опыт.

Или ознакомиться со стандартом МЭК 61131-3. Как вариант.

Frants
11.03.2022, 20:28
Ушёл читать :)

ASo
11.03.2022, 21:07
Вот написано в руководстве " Объявлять экземпляр функционального блока в теле функции нельзя." А почему нельзя, не разъясняется.
Нельзя потому что запрещено правилами или нельзя потому что не имеет смысла?

Или ещё, написано "Нельзя вызывать программу из функции." А ранее по тексту пишут "POU могут вызывать другие POU..." - без дополнительных уточнений.

Нужно внимательно читать руководство.
Функция не сохраняет внутренние переменные в интервалах между вызовами, а экземпляр ФБ или POU - сохраняют. Именно поэтому и нельзя.
Повторяю - если Вы программировали на "обычных" языках программирования - то все понятно. А если нет - тупо, в хорошем смысле слова, выполняйте указания руководства.

melky
11.03.2022, 21:30
Frants объясню, почему с Сименсом у вас недопонимание по отношению к CodeSys.
В Симене, насколько помню аппаратные флаги для тех же Таймеров, R-Trig и так далее. То есть в Симене есть область памяти, где отведено место для хранения флагов этих FB. По этому вы и можете их использовать где угодно. точнее в том количестве, сколько памяти отдано под флаги таймеров и т.д.

CodeSys полностью программная хрень. Например если в Семене можно установить 100 таймеров (цифры не помню, лень искать) а вам понадобилось 120 таймеров в программе, то дополнительные 20 вы будете реализовывать программно по тому же принципу, как в CodeSys (ну или в другом языке программирования, например на ПК)...

Надеюсь я понятно объяснил разницу между Сименом и CodeSys....

Frants
11.03.2022, 22:02
Да! Постепенно проясняется. Огромная благодарность всем за участие!