Просмотр полной версии : Инициализация вложенных ФБ
Спорягин Кирилл
06.08.2015, 12:00
Добрый день, форумчане.
Не могу понять как мне проинициализировать переменные вложенного ФБ.
Привожу простой пример.
Объявляю 2 ФБ.
FUNCTION_BLOCK Pump
VAR
Mode : INT;
END_VAR
FUNCTION_BLOCK PumpStation
VAR
Pump1 : Pump;
Pump2 : Pump;
END_VAR
Как видно, ФБ PumpStation (насосная станция) включает в себя 2 ФБ Pump (насос).
Теперь в глобальных переменных пытаюсь создать экземпляр ФБ PumpStation и при создании проиницилизировать состояния насосов:
VAR_GLOBAL
PumpStation1 : PumpStation := (Pump1.Mode := 1, Pump2.Mode := 2);
END_VAR
При компиляции выдает ошибку:
"Ошибка 3760: Global_variables (3): Неверное начальное значение".
Как проиницилизировать вложенный ФБ?
чем эта тема отличается от предыдущей Вами созданной?
Не меняются из вне переменные в просто VAR-ах
Спорягин Кирилл
06.08.2015, 12:15
Отличается.
Если я попробую создать экземпляр ФБ Pump, то его переменную Mode можно проинициализировать без проблем.
Это будет выглядеть вот так:
VAR_GLOBAL
PumpStandAlone : Pump := (Mode := 33);
END_VAR
Компилируется. При начале работы контроллера поле PumpStandAlone.Mode имеет значение 33.
Какой смысл вообще объявлять ФБ как глобальный, чем такой ФБ будет отличаться от программы?
Создавайте просто программу, а не ФБ , программа является глобальной без дополнительных объявлений.
VAR_GLOBAL
PumpStation1 : PumpStation := (Pump1.Mode := 1, Pump2.Mode := 2);
END_VAR
При компиляции выдает ошибку:
Тут так :
PumpStation1 : PumpStation := (Pump1:=(Mode := 1), Pump2 :=(Mode := 2));
Спорягин Кирилл
06.08.2015, 12:29
О, вот это другое дело. Спасибо.
Так получилось проиницилизировать:
VAR_GLOBAL
PumpStation1 : PumpStation := (Pump1 := (Mode := 1), Pump2 := (Mode := 2));
END_VAR
А где размещать блоки - в программе или в глобальных переменных - я пока не решил.
Не понимаю разницы.
Есть ли она вообще?
Какой смысл вообще объявлять ФБ как глобальный, чем такой ФБ будет отличаться от программы.
Не обязательно глобальный. Но даже 1 (один) экземпляр часто имеет смысл делать в виде ФБ.
Например в проекте ПЛК обслуживает 2 насосные станции. А при ПНР оказалось ( :) ) 1 станция. Убрал экземпляр - и все. 1 экземпляр ФБ. Накой его переделывать в PRG ?
Или релиз станции - в биб-ке. Сдуру там - PRG. А станций - две вместо 1й ( :) ) Пароль к б-ке - потеряли. Приемная комиссия - в соседнем цеху.
И это еще не все )))
Нужен определенный порядок данных для станции. В FB - порядок чёткий. В PRG - по ситуации.
А где размещать блоки - в программе или в глобальных переменных - я пока не решил.
Не понимаю разницы.
Есть ли она вообще?
Конечно есть разница.
19387
Программа существует в единственном экземпляре, а ФБ может иметь множество экземпляров
19388
Каждый экземпляр ФБ живет собственной жизнью. Только код внутри у них одинаковый.
Отсюда и смысл делать ФБ для многократно повторяющихся фрагментов кода в разных местах программы. Например библиотечный RS триггер. ФБ - существует один, а в программе можно использовать множество экземпляров этого триггера, код у всех одинаковый, а состояния внутренних переменных у каждого свои.
А где размещать блоки - в программе или в глобальных переменных - я пока не решил.
Не понимаю разницы.
Есть ли она вообще?
Разницы - нет никакой кроме формы обращения к полям.
Тут ведь нету WITH ))
to Petera
Сдается мне что SKV спросил про месторасположение ФБ
Спорягин Кирилл
06.08.2015, 13:28
Я спросил именно про местоположение экземпляров ФБ.
Если я объявлю экземпляр в программе, например, так:
PROGRAM PLC_PRG
VAR
PumpStation2 : PumpStation;
END_VAR
Или в глобальных переменных, т.е. так:
VAR_GLOBAL
PumpStation1 : PumpStation;
END_VAR
То внутри кода программы могу вызвать их исполнительную часть:
PumpStation1();
PumpStation2();
Обращаться к их переменным, например, так:
if PumpStation1.Pump1.Mode = 2 then ...
Одним словом не вижу разницы между размещением экзепляра в глобальных данных или среди переменных программы.
Вообще, если сравнивать со Step7, то программа - это организационный блок Step7. Вот только в организационном блоке нельзя размещать
статические, т.е. сохраняющиеся от цикла к циклу переменные, можно только локальные (в Step7 этот термин имеет другое значение, чем в CoDeSys), т.е. временные переменные.
В Step7 все блоки располагаются в глобальной памяти (назовем это так). И экземплярные блоки ФБ и блоки данных, т.е. не привязанных к ФБ.
Вопрос про инициализацию закрыт.
Вопрос о размещении экземпляров блока данных открыт.
Вопрос про инициализацию закрыт.
Вопрос о размещении экземпляров блока данных открыт.
Соглашусь с Валенком, в Вашем случае разницы никакой.
Спорягин Кирилл
06.08.2015, 14:15
Я так понимаю не понятен вопрос?
Могу пояснить его с другой стороны.
Сейчас я представляю себе структуру программы на CoDeSys следующим образом.
Создаются различные ФБ и функции - они содержат логику программы.
Создаются экземпляры ФБ (где? - мы как раз и пытаемся решить) - они содержат данные системы (настройки, текущие состояния и пр.).
ФБ и функции вызываются в программах. В простейшем случае - это одна программа PLC_PRG.
Здесь важно, что кроме вызова функций и ФБ, программа, в идеальном случае, вообще не должна содержать логики.
А где в этом случае лучше размещать экземпляры ФБ мне пока не ясно.
Я так понимаю не понятен вопрос?
Могу пояснить его с другой стороны.
Сейчас я представляю себе структуру программы на CoDeSys следующим образом.
Создаются различные ФБ и функции - они содержат логику программы.
Создаются экземпляры ФБ (где? - мы как раз и пытаемся решить) - они содержат данные системы (настройки, текущие состояния и пр.).
ФБ и функции вызываются в программах. В простейшем случае - это одна программа PLC_PRG.
Здесь важно, что кроме вызова функций и ФБ, программа, в идеальном случае, вообще не должна содержать логики.
А где в этом случае лучше размещать экземпляры ФБ мне пока не ясно.
Вопрос понятен.
Если "в простейшем случае - это одна программа PLC_PRG" ни какой разницы нет.
Я так понимаю не понятен вопрос?
Могу пояснить его с другой стороны.
Сейчас я представляю себе структуру программы на CoDeSys следующим образом.
Создаются различные ФБ и функции - они содержат логику программы.
Создаются экземпляры ФБ (где? - мы как раз и пытаемся решить) - они содержат данные системы (настройки, текущие состояния и пр.).
ФБ и функции вызываются в программах. В простейшем случае - это одна программа PLC_PRG.
Здесь важно, что кроме вызова функций и ФБ, программа, в идеальном случае, вообще не должна содержать логики.
А где в этом случае лучше размещать экземпляры ФБ мне пока не ясно.
а может перестать думать как сименсовод, в КДС как только объявил в ПОУ какой либо ФБ, система за Вас уже создаст экземпляр и хранить его в глобальных переменных нет смысла. Там Вы только храните свою структуру по семоновски это UDT, можете туда из любого куска кода читать/писать данные, только это всёравно не экземпляр ФБ
Не мучайте себя. Размещайте где хотите.
кроме вызова функций и ФБ, программа, в идеальном случае, вообще не должна содержать логики.
В смысле PLC_PRG ? Тогда лично я так и делаю. Она - только список вызовов процессов + привязки физических io. В этом случае делать экземпляры внутри PLC_PRG просто неудобно если в других POU используются поля этих ФБ :
PLC_PRG.Station1.Pump2 ... как-то неуютно.
Если в глобальных - то просто :
Station1.Pump2..
Но никто не запрещает пихнуть все станции в отдельный ФБ/ПРОГРАММ и обращатся
Stations.Station1.Pump2..
Очень даже ООП'эшно и самодокументируемо
PS
Инкапсуляция !!
Спорягин Кирилл
06.08.2015, 14:50
Я пытаюсь перестать думать как сименсовод, но внятных ответов не получаю.
Peterа, предложенная мною структура организации всего кода применима и не "в простейшем случае".
Важно, то что в программах, я просто вызываю функции и ФБ. Более там никакого кода не должно быть.
В этом случае программа превращается просто в место вызова ФБ и функций. Так же как, например, в С вы должны вызвать все свои функции, методы и прочее в функции main().
Так какая разница где я размещу экземпляры ФБ?
Спорягин Кирилл
06.08.2015, 14:52
Валенок, Ваш ответ прочел после своего сообщения.
Спорягин Кирилл
06.08.2015, 15:25
Вот наверное единственное отличие:
19397
Переменные доступны либо в рамках данного ПОУ, либо во всех ПОУ.
Вот наверное единственное отличие:
19397
Ну переводила технический текст девочка из мхата. Читайте между строк:
%СТРОКА% = где угодно и откуда угодно если они не перекрыты локальными переменными
1.
ФБ разместить можно где угодно :
В PROGRAM, в другом ФБ, в функции, в области обмена, в динамической памяти, в строке, в области входов/выходов...
2.
При размещении ФБ в функции (ее переменные в КДС2 единственные с автоматически ограниченным сроком жизни) при её каждом вызове ФБ заново инициализируется задаными значениями.
3.
Экземпляры ФБ доступны для вызова %СТРОКА%.
4.
Экземпляры ФБ и их поля доступны для чтения %СТРОКА%.
5.
Экземпляры ФБ доступны для записи %СТРОКА% и во всей цепочке вложений являются var_input
6.
Поля экземпляров ФБ доступны для записи %СТРОКА% и во всей цепочке вложений являются var_input
7.
п.5 и п.6 не одно и тоже
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot