В предыдущей статье мы обсуждали, что такое функциональный блок FB, как он работает в программе ПЛК и как его создать и использовать. В этой статье мы поговорим об экземплярах блоков данных различных типов функциональных блоков в Siemens Tia Portal и когда использовать каждый тип.
Содержание:
- Что такое функциональный блок FB?
- Различные варианты экземпляров данных.
- Одиночный экземпляр.
- Экземпляр параметра.
- Многоэкземпляр.
Что такое функциональный блок?
Функциональный блок или FB — это просто блок, содержащий логику кода. Вы используете этот FB для достижения определенной функциональности с помощью фрагментов кода, написанных внутри.
При вызове функционального блока в ваш код вам будет предложено назначить блок данных, также называемый экземпляром данных, который будет связан с этим FB, чтобы сохранить значения параметров FB. Не все параметры внутри FB сохраняются в экземпляре данных, но мы вернемся к этому позже.
При вызове функционального блока у вас есть 3 различных варианта для связывания экземпляра блока данных с этим вызовом функции. Эти различные варианты будут зависеть от того, где вы вызываете свой FB.
Итак, вкратце. Функциональный блок FB — это в основном функция FC с выделенным блоком данных DB, этот блок данных используется для хранения значений параметров функционального блока.
Различные варианты для экземпляров данных
У нас есть 3 различных варианта для экземпляра данных функционального блока, эти варианты:
- Один экземпляр.
- Экземпляр параметра.
- Мультиэкземпляр.
Три различных экземпляра данных вызова исходят из 3 различных методов вызова:
- Вы можете вызвать функциональный блок FB внутри основного OB1, что даст вам возможность:
- Один экземпляр.
- Вы можете вызвать функциональный блок FB внутри функции FC, что даст вам два варианта
- Один экземпляр
- Экземпляр параметра
- Вы можете вызвать функциональный блок внутри другого функционального блока, что даст вам три доступных варианта создания экземпляра данных
- Один экземпляр
- Экземпляр параметра
- Несколько экземпляров
Один экземпляр данных
Сначала давайте начнем с создания функционального блока FB, как мы уже упоминали ранее, мы создаем функциональный блок, нажимая «добавить новый блок» и выбирая нужный нам тип блока. Смотрите рисунок 1.
Рисунок 1 — Создание функционального блока FB
Теперь давайте вызовем ReusableFB, который мы создали внутри нашего основного OB1. См. рисунок 2.
Рисунок 2 – Вызов FB внутри основного OB1
Как видно из предыдущего рисунка, при вызове FB внутри основного OB1 вам будет предложено назначить экземпляр данных, который будет связан с этим вызовом FB. В этом случае будет только один вариант – один экземпляр.
После выбора варианта один экземпляр будет создан блок данных и связан с вызовом FB. См. рисунок 3.
Рисунок 3 – Создан один экземпляр
Созданный один экземпляр будет использоваться для хранения значений некоторых параметров FB. Например, входов, выходов, In Out и статических параметров.
Другие параметры FB не будут сохранены, например, temp и константы. См. рисунки 4 и 5.
Рисунок 4 – Данные сохраняются внутри экземпляра данных
Рисунок 5 – Данные сохраняются из FB в экземпляр данных.
Теперь давайте создадим простую логику внутри FB, чтобы лучше понять экземпляры данных. Эта логика добавит постоянное значение 15 к статической переменной, а затем переместит результат на выход. См. рисунок 6.
Рисунок 6 – Создание простой логики
Теперь вернитесь к основному OB1 и обратите внимание, как теперь выглядит ваш вызов FB. См. рисунок 7.
Рисунок 7 – Обновление вызова FB после каждого изменения
Любое изменение, которое вы вносите в логику внутри FB, приведет к необходимости обновления вызова функционального блока, чтобы внесенные вами изменения можно было применить.
Вы можете обновить вызов блока, щелкнув правой кнопкой мыши вызов FB и нажав опцию обновления вызова блока или перекомпилировав код ПЛК. Смотрите рисунок 8.
Рисунок 8 – Обновление вызова FB
После обновления вызова блока изменения, внесенные вами в код FB, будут применены и использованы в вызове блока. Как вы видите на рисунке 9.
Теперь FB ожидает входной сигнал типа bool, а FB выдаст выход типа int.
Рисунок 9 – Входы и выходы теперь связаны с вызовом FB
Давайте смоделируем наш код и посмотрим, как будет вести себя ПЛК. Смотрите следующую анимацию, показывающую простую симуляцию логики ПЛК на данный момент.
Как вы видите из анимации, всякий раз, когда сигнал запуска равен TRUE, функция будет выполняться, а выход будет продолжать меняться. И как только сигнал запуска больше не доступен, выход останется на последнем записанном значении.
Использование экземпляра данных здесь заключается в том, что значения статической переменной и выходной переменной сохраняются внутри одного экземпляра, поэтому, когда сигнал запуска снова возвращается, функция продолжит работу с последних записанных значений.
Очень важное примечание
Никогда не используйте один и тот же экземпляр для двух разных вызовов FB. Смотрите следующую анимацию.
Как вы видите из анимации, у нас есть два разных вызова FB, но оба вызова связаны с одним и тем же одним экземпляром, поэтому даже когда сигнал start2 был FALSE, значение Output2 менялось вместе с Output1.
Как и следовало ожидать, изменение экземпляра данных 1-го вызова также будет затронуто во 2-м вызове, поскольку у них один и тот же блок памяти. Смотрите рисунок 10.
Рисунок 10 — Никогда не используйте один и тот же экземпляр данных с разными вызовами FB
Если вы использовали один и тот же экземпляр данных с разными вызовами FB, то ваш функциональный блок больше не может быть использован повторно. Даже если входные/выходные параметры различны для каждого отдельного вызова FB. Как вы видели в последнем видео (анимация), оба вызова дали одинаковые результаты, хотя у второго вызова даже нет входного сигнала включения.
Еще одно очень важное замечание
Мы уже говорили, что если вы вызываете свой FB из FC более высокого уровня, у вас будет два варианта для связанного экземпляра данных; эти варианты — один экземпляр и экземпляр параметра. Смотрите рисунок 11.
Рисунок 11 — Использование одного экземпляра с FB, вызванным из FC
Если это произошло, и вы вызовете FB внутри FC, вам никогда не следует использовать один экземпляр для ваших FB. Чтобы узнать, почему это так. См. рисунок 12
Рисунок 12 – Вызов FC более одного раза
Как видно из рисунка 12, когда вы вызываете FC более одного раза в своей логике, вам не будет предложено назначить блок данных, потому что FC не нужен один.
Но вы знаете, что внутри FC есть вызванный FB, с этим FB связан один экземпляр. Так что теперь 3 вызова FC имеют один и тот же экземпляр данных для вызова FB. Так что ваша функция FC больше не может быть повторно использована.
Что делать? Лучший вариант, когда вам нужно вызвать FB внутри FC, — использовать экземпляр параметра.
Экземпляр параметра
Как мы уже говорили, если вы вызвали FB внутри FC, вам не следует выбирать один экземпляр, а экземпляр параметра лучше для целей повторного использования.
Экземпляр параметра сохранит экземпляр данных FB, вызванного в области In Out интерфейса блока FC. Позволяет вводить новый экземпляр данных для каждого вызова FC. Смотрите рисунки 13 и 14.
Рисунок 13 — Назначение экземпляра параметра при вызове FB внутри FC
Рисунок 14 — Каждому вызову FC потребуется новый экземпляр данных
Как видно из предыдущего рисунка, всякий раз, когда вы вызываете FC внутри своей программы, она будет запрашивать экземпляр данных для повторно используемого FB внутри FC.
Но, используя этот способ, вам придется создать экземпляр данных самостоятельно. Смотрите рисунок 15.
Рисунок 15 — Создание нового экземпляра данных
Чтобы создать новый экземпляр данных, вы делаете то же самое, что и при создании FC или FB, но на этот раз вы выбираете опцию DB. И убедитесь, что вы выбрали тот же тип DB, что и вызываемый FB.
Теперь ваш FC можно использовать повторно столько раз, сколько вы хотите, вам просто нужно создать экземпляр для каждого вызова. Смотрите рисунок 16.
Рисунок 16 — Назначение DB вызову FC
Многоэкземплярная база данных
Многоэкземплярная база данных просто означает, что DB вызываемого FB будет храниться внутри DB вызывающего FB более высокого уровня. Эта опция доступна только в том случае, если вы вызываете FB из другого FB.
Давайте создадим еще один FB, чтобы использовать его как FB более высокого уровня.
После создания этого HigherLevelFB вызовите его из основного OB1, и, конечно, единственным вариантом вызова будет один экземпляр, как показано ранее. Смотрите рисунок 17.
Рисунок 17 – Вызов HigherLevelFB из основного OB1
Теперь вызовите ReusableFB из HigherLevelFB. И выберите опцию Multi-instance. См. рисунок 18.
Рисунок 18 – Назначение многоэкземплярной БД
При выборе опции Multi-instance созданная БД будет сохранена внутри статических параметров вызывающего FB. См. рисунок 19.
Рисунок 19 – Экземпляры сохраняются внутри статических параметров
Вы можете вызывать ReusableFB много раз, каждый раз при его вызове многоэкземпляр будет сохранен внутри статического параметра. См. рисунок 20.
Рисунок 20 – Многократный вызов ReusableFB
Как вы видите, экземпляр данных FB нижнего уровня будет сохранен внутри экземпляра данных FB верхнего уровня. Это лучше всего подходит для лучшей структуры программы и удобной для чтения логики.
Заключение
Создание функциональных блоков внутри вашего кода потребует связывания блока данных с каждым вызовом FB, который вы сделаете в своей логике. Этот блок данных или также называемый экземпляром данных имеет различные параметры в зависимости от типа блока, который вызывает ваш FB.
Будьте осторожны при выборе типа экземпляра данных, так как некоторые параметры могут не подходить для вашего случая, как мы показали ранее. А иногда это может привести к проблемам в вашей логике, и ваша функция больше не сможет быть повторно использована.
Использование нескольких экземпляров может помочь лучше организовать структуру вашей программы, поскольку все вызываемые FB будут хранить свои базы данных внутри основного вызывающего FB.