Просмотр полной версии : Вызов FB из FB
Здравствуйте!
В программе имеется FB1, внутри которого есть FB2.
Возникла необходимость сделать несколько экземпляров FB1 (внутри которого есть FB2, а так же BLINK, _R_TRIG и тд.)
И так, делаю несколько экземпляров FB1, корректно-ли при этом будет работать FB2, а так же BLINK, _RTRIG и т.д.?
Или нужно делать экземпляры и для FB2 в каждом FB1?:confused:
Зависит от того, есть ли в FB1, FB2 глобальные переменные.
Зависит от того, есть ли в FB1, FB2 глобальные переменные.
И у FB1 и у FB2 есть входные и выходные переменные.
Во вкладке РЕСУРСЫ\Глобальные переменные - пусто.
Все равно у меня сомнение, что будет работать корректно...
Ведь получается, что все мои N экземпляров DB1 будут вызывать DB2 с одним и тем же "экземплярным блоком данных"
Кроме того, у блинк и триг тоже свои экземпляры или я что-то путаю?
Где я не прав? Поправьте, пожалуйста
Не замарачивайся. Глубина вложенности не имеет значения
Экземпляров_будет := N (уровень 1) [* M(уровень 2) [* K(уровень3 ) ...]]
Не замарачивайся. Глубина вложенности не имеет значения
Экземпляров_будет := N (уровень 1) [* M(уровень 2) [* K(уровень3 ) ...]]
А проще можно ответить?
Будет работать программа, где несколько экземпляров FB1, внутри которого(ых) один и тот же FB2?
Вопрос типа - "Доктор, я жить буду ?"
Работать будет всегда и везде любая программа. Вот результаты работы могут не совпасть с ожиданиями.
Почитайте любую лит-ру про структуры/классы и т.п. про их описания и экземпляры.
Николаев Андрей
02.04.2016, 10:50
werg, а можете начать с описания задачи, а не с того, как можно неправильно написать.
У Вас есть несколько экземпляров FB1. При каждом новом экземпляре CODESYS будет требовать объявить его (дать персональное имя). Это основа работы с FB - при добавлении экземпляра его надо объявлять, и выполняться будет не сам блок, а именно его экземпляр (это видно при отладке).
Если Вы создаете 2 FB1 (FB1_1 и FB1_2), то:
1. Вам нужно в каждом экземпляре вызывать свой экземпляр блока FB2? (FB2_1...)?
2. Вам нужно во всех экземплярах FB1_... вызывать один и тот же экземпляр блока FB2?
Благодарю за отзывчивость.
Если Вы создаете 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 или нет?
А проще можно ответить?
Будет работать программа, где несколько экземпляров FB1, внутри которого(ых) один и тот же FB2?
Будет, если внутри этих блоков не будут использоваться глобальные переменные.
Будет, если внутри этих блоков не будут использоваться глобальные переменные.
Будет-ли работать корректно? Если FB 2 - это ПИД регулятор, а FB1, который его вызывает используется для регулирования N разных систем?
?
Просто сядьте и подумайте - чем Ваши FB отличяются от стандартных библиотечных, скажем из util.lib ?
Вас же не смущает использование внутри других блоков триггеров, таймеров, счетчиков и других стандартных функциональных блоков? ПИД регулятор такой же функциональный блок и для него справедливы те же правила, что и для остальных. Главное, чтобы внутри Вашего ПИД регулятора не было глобальных переменных.
---
Пока писал, уже дали тот же ответ :)
Вас же не смущает использование внутри других блоков триггеров, таймеров, счетчиков и других стандартных функциональных блоков?
Смущает. Я для них разные области памяти данных (сиречь экземпляры) делаю. Получается я лишний код пишу?
Главное, чтобы внутри Вашего ПИД регулятора не было глобальных переменных.
В глобальных ничего не объявлял вроде. Есть ин аут переменные, они же не глобальные? Я что то путаю?
Переменная VAR_IN_OUT передаются в блок по ссылке, то есть копия ее не создается, а идет работа напрямую с переменной-первоисточником. Поэтому если Вы одну и ту же переменную подаете на разные экземпляры через VAR_IN_OUT, то у Вас все эти экземпляры работают с одной переменной, все равно что с глобальной.
Переменная VAR_IN_OUT передаются в блок по ссылке, то есть копия ее не создается, а идет работа напрямую с переменной-первоисточником. Поэтому если Вы одну и ту же переменную подаете на разные экземпляры через VAR_IN_OUT, то у Вас все эти экземпляры работают с одной переменной, все равно что с глобальной.
А если уйти от инаут переменных, оставить только ин, аут и вар?
Тогда не о чем будет волноваться :)
Все таки сошлись - волноваться не о чем.
А если уйти от инаут переменных, оставить только ин, аут и вар?
А ТС до сих пор не осилил первые 5 страниц глав про структурные типы/параметры-переменные/параметры-значения любого букваря по любому ЯВУ.
В глобальных ничего не объявлял вроде
И с глобальными будет работать когда понимаете что делаете.
:confused:
ТС -топикстартер, так называется тот пользователь форума, которым был начат топик. То есть он добавил тему – первый пост в топике, т.е. Вы и есть ТС.
ЯВУ -Язык Высокого Уровня. Тип языка компьютерного программирования. Языки высокого уровня предназначены для выражения потребностей программиста, а не возможностей компьютера. ЯВУ способствует возможности "держать в голове" весь алгоритм программы, работать с небольшими и понятными областями кода взамен огромных листов утомительных машинных кодов, которые включает язык программирования низкого уровня
Не стал бы гнуть пальцы дальше, ответил бы ... но petera опередил (спасибо)
Благодарю всех отозвавшихся помочь.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot