Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 19

Тема: Инициализация вложенных ФБ

  1. #1
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию Инициализация вложенных ФБ

    Добрый день, форумчане.

    Не могу понять как мне проинициализировать переменные вложенного ФБ.
    Привожу простой пример.
    Объявляю 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): Неверное начальное значение".

    Как проиницилизировать вложенный ФБ?

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    чем эта тема отличается от предыдущей Вами созданной?
    Не меняются из вне переменные в просто VAR-ах
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Отличается.
    Если я попробую создать экземпляр ФБ Pump, то его переменную Mode можно проинициализировать без проблем.
    Это будет выглядеть вот так:
    VAR_GLOBAL

    PumpStandAlone : Pump := (Mode := 33);

    END_VAR

    Компилируется. При начале работы контроллера поле PumpStandAlone.Mode имеет значение 33.

  4. #4
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Какой смысл вообще объявлять ФБ как глобальный, чем такой ФБ будет отличаться от программы?
    Создавайте просто программу, а не ФБ , программа является глобальной без дополнительных объявлений.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #5
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    Код:
    VAR_GLOBAL
    PumpStation1 : PumpStation := (Pump1.Mode := 1, Pump2.Mode := 2);
    END_VAR
    При компиляции выдает ошибку:
    Тут так :
    Код:
    PumpStation1 : PumpStation := (Pump1:=(Mode := 1), Pump2 :=(Mode := 2));

  6. #6
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    О, вот это другое дело. Спасибо.
    Так получилось проиницилизировать:

    VAR_GLOBAL
    PumpStation1 : PumpStation := (Pump1 := (Mode := 1), Pump2 := (Mode := 2));
    END_VAR

    А где размещать блоки - в программе или в глобальных переменных - я пока не решил.
    Не понимаю разницы.
    Есть ли она вообще?

  7. #7
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Какой смысл вообще объявлять ФБ как глобальный, чем такой ФБ будет отличаться от программы.
    Не обязательно глобальный. Но даже 1 (один) экземпляр часто имеет смысл делать в виде ФБ.
    Например в проекте ПЛК обслуживает 2 насосные станции. А при ПНР оказалось ( ) 1 станция. Убрал экземпляр - и все. 1 экземпляр ФБ. Накой его переделывать в PRG ?

    Или релиз станции - в биб-ке. Сдуру там - PRG. А станций - две вместо 1й ( ) Пароль к б-ке - потеряли. Приемная комиссия - в соседнем цеху.

    И это еще не все )))
    Нужен определенный порядок данных для станции. В FB - порядок чёткий. В PRG - по ситуации.
    Последний раз редактировалось Валенок; 06.08.2015 в 12:50.

  8. #8
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,825

    По умолчанию

    Цитата Сообщение от SKV Посмотреть сообщение
    А где размещать блоки - в программе или в глобальных переменных - я пока не решил.
    Не понимаю разницы.
    Есть ли она вообще?
    Конечно есть разница.
    Захват-1.png

    Программа существует в единственном экземпляре, а ФБ может иметь множество экземпляров
    Захват-3.png
    Каждый экземпляр ФБ живет собственной жизнью. Только код внутри у них одинаковый.
    Отсюда и смысл делать ФБ для многократно повторяющихся фрагментов кода в разных местах программы. Например библиотечный RS триггер. ФБ - существует один, а в программе можно использовать множество экземпляров этого триггера, код у всех одинаковый, а состояния внутренних переменных у каждого свои.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  9. #9
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    Цитата Сообщение от SKV Посмотреть сообщение
    А где размещать блоки - в программе или в глобальных переменных - я пока не решил.
    Не понимаю разницы.
    Есть ли она вообще?
    Разницы - нет никакой кроме формы обращения к полям.
    Тут ведь нету WITH ))

    to Petera
    Сдается мне что SKV спросил про месторасположение ФБ
    Последний раз редактировалось Валенок; 06.08.2015 в 12:47.

  10. #10
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Я спросил именно про местоположение экземпляров ФБ.
    Если я объявлю экземпляр в программе, например, так:
    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 все блоки располагаются в глобальной памяти (назовем это так). И экземплярные блоки ФБ и блоки данных, т.е. не привязанных к ФБ.

    Вопрос про инициализацию закрыт.
    Вопрос о размещении экземпляров блока данных открыт.

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Инициализация контроллера плк100
    от xГеоргийx в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 30.12.2011, 11:17
  2. тонкости вложенных шагов Sfc
    от Kiselev в разделе ПЛК1хх
    Ответов: 13
    Последнее сообщение: 25.12.2011, 12:39
  3. инициализация массива структур
    от drvlas в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 16.12.2010, 18:31
  4. инициализация программы
    от Old_Lucky в разделе ПЛК1хх
    Ответов: 18
    Последнее сообщение: 04.06.2010, 15:54
  5. Инициализация ПЛК
    от Gnom666 в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 11.03.2009, 05:27

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •