Вход

Просмотр полной версии : Вызов FB из FB



werg
01.04.2016, 21:02
Здравствуйте!
В программе имеется FB1, внутри которого есть FB2.
Возникла необходимость сделать несколько экземпляров FB1 (внутри которого есть FB2, а так же BLINK, _R_TRIG и тд.)
И так, делаю несколько экземпляров FB1, корректно-ли при этом будет работать FB2, а так же BLINK, _RTRIG и т.д.?
Или нужно делать экземпляры и для FB2 в каждом FB1?:confused:

ASo
01.04.2016, 21:04
Зависит от того, есть ли в FB1, FB2 глобальные переменные.

werg
01.04.2016, 21:10
Зависит от того, есть ли в FB1, FB2 глобальные переменные.
И у FB1 и у FB2 есть входные и выходные переменные.
Во вкладке РЕСУРСЫ\Глобальные переменные - пусто.
Все равно у меня сомнение, что будет работать корректно...
Ведь получается, что все мои N экземпляров DB1 будут вызывать DB2 с одним и тем же "экземплярным блоком данных"
Кроме того, у блинк и триг тоже свои экземпляры или я что-то путаю?
Где я не прав? Поправьте, пожалуйста

Валенок
01.04.2016, 22:18
Не замарачивайся. Глубина вложенности не имеет значения
Экземпляров_будет := N (уровень 1) [* M(уровень 2) [* K(уровень3 ) ...]]

werg
02.04.2016, 02:41
Не замарачивайся. Глубина вложенности не имеет значения
Экземпляров_будет := N (уровень 1) [* M(уровень 2) [* K(уровень3 ) ...]]

А проще можно ответить?
Будет работать программа, где несколько экземпляров FB1, внутри которого(ых) один и тот же FB2?

Валенок
02.04.2016, 05:02
Вопрос типа - "Доктор, я жить буду ?"
Работать будет всегда и везде любая программа. Вот результаты работы могут не совпасть с ожиданиями.
Почитайте любую лит-ру про структуры/классы и т.п. про их описания и экземпляры.

Николаев Андрей
02.04.2016, 10:50
werg, а можете начать с описания задачи, а не с того, как можно неправильно написать.
У Вас есть несколько экземпляров FB1. При каждом новом экземпляре CODESYS будет требовать объявить его (дать персональное имя). Это основа работы с FB - при добавлении экземпляра его надо объявлять, и выполняться будет не сам блок, а именно его экземпляр (это видно при отладке).
Если Вы создаете 2 FB1 (FB1_1 и FB1_2), то:
1. Вам нужно в каждом экземпляре вызывать свой экземпляр блока FB2? (FB2_1...)?
2. Вам нужно во всех экземплярах FB1_... вызывать один и тот же экземпляр блока FB2?

werg
02.04.2016, 14:48
Благодарю за отзывчивость.

Если Вы создаете 2 FB1 (FB1_1 и FB1_2), то:
1. Вам нужно в каждом экземпляре вызывать свой экземпляр блока FB2? (FB2_1...)?
2. Вам нужно во всех экземплярах FB1_... вызывать один и тот же экземпляр блока FB2?
FB1, в моем случае, это "обвязка" для FB2, являющегося ПИД регулятором.
Естественно ПИД должен быть разным для N экземпляров.
В общем я понял, что мой случай - это второй вариант, причем вместо экземпляров FB1 можно сделать N FC, в каждой из которых будет свой экземпляр FB2.
Прояснилось, спасибо!

Еще вопрос: для BLINK, _R_TRIG и тд. в "теле" FB, 1 тоже нужны экземпляры как для FB2 или нет?

amn
02.04.2016, 15:08
А проще можно ответить?
Будет работать программа, где несколько экземпляров FB1, внутри которого(ых) один и тот же FB2?

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

werg
02.04.2016, 16:49
Будет, если внутри этих блоков не будут использоваться глобальные переменные.
Будет-ли работать корректно? Если FB 2 - это ПИД регулятор, а FB1, который его вызывает используется для регулирования N разных систем?
?

ASo
02.04.2016, 16:54
Просто сядьте и подумайте - чем Ваши FB отличяются от стандартных библиотечных, скажем из util.lib ?

amn
02.04.2016, 17:00
Вас же не смущает использование внутри других блоков триггеров, таймеров, счетчиков и других стандартных функциональных блоков? ПИД регулятор такой же функциональный блок и для него справедливы те же правила, что и для остальных. Главное, чтобы внутри Вашего ПИД регулятора не было глобальных переменных.

---
Пока писал, уже дали тот же ответ :)

werg
02.04.2016, 17:25
Вас же не смущает использование внутри других блоков триггеров, таймеров, счетчиков и других стандартных функциональных блоков?
Смущает. Я для них разные области памяти данных (сиречь экземпляры) делаю. Получается я лишний код пишу?

Главное, чтобы внутри Вашего ПИД регулятора не было глобальных переменных.
В глобальных ничего не объявлял вроде. Есть ин аут переменные, они же не глобальные? Я что то путаю?

amn
02.04.2016, 18:22
Переменная VAR_IN_OUT передаются в блок по ссылке, то есть копия ее не создается, а идет работа напрямую с переменной-первоисточником. Поэтому если Вы одну и ту же переменную подаете на разные экземпляры через VAR_IN_OUT, то у Вас все эти экземпляры работают с одной переменной, все равно что с глобальной.

werg
02.04.2016, 18:56
Переменная VAR_IN_OUT передаются в блок по ссылке, то есть копия ее не создается, а идет работа напрямую с переменной-первоисточником. Поэтому если Вы одну и ту же переменную подаете на разные экземпляры через VAR_IN_OUT, то у Вас все эти экземпляры работают с одной переменной, все равно что с глобальной.

А если уйти от инаут переменных, оставить только ин, аут и вар?

amn
02.04.2016, 19:08
Тогда не о чем будет волноваться :)

Валенок
02.04.2016, 23:34
Все таки сошлись - волноваться не о чем.


А если уйти от инаут переменных, оставить только ин, аут и вар?
А ТС до сих пор не осилил первые 5 страниц глав про структурные типы/параметры-переменные/параметры-значения любого букваря по любому ЯВУ.


В глобальных ничего не объявлял вроде
И с глобальными будет работать когда понимаете что делаете.

werg
03.04.2016, 15:45
TC

ЯВУ

:confused:

petera
03.04.2016, 16:01
:confused:
ТС -топикстартер, так называется тот пользователь форума, которым был начат топик. То есть он добавил тему – первый пост в топике, т.е. Вы и есть ТС.

ЯВУ -Язык Высокого Уровня. Тип языка компьютерного программирования. Языки высокого уровня предназначены для выражения потребностей программиста, а не возможностей компьютера. ЯВУ способствует возможности "держать в голове" весь алгоритм программы, работать с небольшими и понятными областями кода взамен огромных листов утомительных машинных кодов, которые включает язык программирования низкого уровня

Валенок
03.04.2016, 17:10
Не стал бы гнуть пальцы дальше, ответил бы ... но petera опередил (спасибо)

werg
04.04.2016, 00:41
Благодарю всех отозвавшихся помочь.