1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

EN для FBD и его распространение

PLC, прочие контроллеры, промышленные компьютеры, операторские панели
Ответить
Аватара пользователя

Автор темы
izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

EN для FBD и его распространение

Сообщение izhidkov »

Добрый день.
Меня давно мучает один вопрос связанный с языком FBD. Может быть он есть из-за того что я не особо много программирую на 61131, но например в стандарте при прочтении я ответа не нашел.

Если на выход блока FB с наличием сигнала EN, мы подключаем "переменную" на выход "Q", то будет ли при выключенном сигнале EN в "переменную" записываться значение FB.Q, которое было в последний вызов FB, при включенном EN...?

Вопрос возникает в связи с тем что по ощущению в различных средах программирования(step,unity,twincat...) эта ситуация решается по разному.

Благо по-моему с функцией MOVE при наличии сигнала EN все довольно просто:
если EN==1 (c-подобное сравнение) то значение FB.Q записывается в сигнал подключенный к линии Q, иначе значение сигнала не меняется.

Можно меня ткнуть в текст стандарта на язык FB где описывается, как должна решаться данная ситуация?

// P.s. кроме этого можете подсказать в FB есть ли ситуация, когда признак EN внедряется в "сигнал" на выходе ("Q" например) и нет необходимости соединять каскадом выходы ENO и входы EN (я так не делаю) или параллельно от одного источника сигнала "питать" входы EN (я так делаю)[ чтобы реализовать конструкцию языка "c": if(something) {one=somefct();two=do_two(one); three=do_three(two).... и т.п.} ] каскадов блоков?
Компилятор - лучший друг человека!

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3549
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 246 раз

EN для FBD и его распространение

Сообщение Михайло »

izhidkov писал(а):Если на выход блока FB с наличием сигнала EN, мы подключаем "переменную" на выход "Q", то будет ли при выключенном сигнале EN в "переменную" записываться значение FB.Q, которое было в последний вызов FB, при включенном EN...?
Если я правильно понял, то ответ следующий: значение FB.Q сохранится с момента последнего вызова FB. Объяснение простое: для того, чтобы обнулить или установить FB.Q нужно затратить процессорное время, выполнить соответствующие инструкции, но таковых условий нет - следовательно память сохранит значение FB.Q.
Соответственно это не описано в стандарте. Оно было бы описано, если потребовалось бы предписание как-то особо управляться с FB.Q при отсутствии сигнала EN.
Аватара пользователя

Автор темы
izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

EN для FBD и его распространение

Сообщение izhidkov »

Михайло писал(а): FB.Q
То, что значения выходных сигналов FB сохраняют свои значения при EN==0, (кажется) очевидно и прописано в описании языка.
Мне не понятно как затем происходит присваивание сигнала FB.Q к сигналу , который на этот выход подключен. Происходит ли присваивание независимо от того есть ли сигнал EN на входе FB или нет.
Иначе запишу в псевдокоде "с"

Код: Выделить всё

1) if(FB.EN==1)
{
 FB.Q = rand();  //rand - что-то в FB происходит
}
next= FB.Q;    // next это переменная которая подключена к FB.Q
2)
if(EB.EN==1)
{
 FB.Q = rand();
 next= FB.Q;
}
Так вот 1 или 2 вариант верно описывает поведение FB со входом EN?
FB_MOVE работает по 2-му правилу, а вот с другими FB почему-то иногда 1-ый вариант происходит.
Компилятор - лучший друг человека!

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3549
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 246 раз

EN для FBD и его распространение

Сообщение Михайло »

izhidkov писал(а): Так вот 1 или 2 вариант верно описывает поведение FB со входом EN?
Ну это зависит от того, где происходит присваивание. Тот блок, где находится присваивание, выполняется?..
Аватара пользователя

Автор темы
izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

EN для FBD и его распространение

Сообщение izhidkov »

Михайло писал(а): Ну это зависит от того, где происходит присваивание. Тот блок, где находится присваивание, выполняется?..
Обсуждать FBD без графики бессмысленно
Изображение
среда "unity"

Вот
1) часть не работает как хотелось бы
2) часть работает

В 1-й части каждый FB что-то делает и выдает сигнал готовности. На картинке 2-й FB перезатирает сигнал 1-го FB и "c_tare_zero_ok" всегда зависит только от 2-го FB. (т.е. FB тут работает по типу №1 )
izhidkov писал(а): 1) if(FB.EN==1)
{
 FB.Q = rand();  //rand - что-то в FB происходит
}
next= FB.Q;    // next это переменная которая подключена к FB.Q
2)
if(EB.EN==1)
{
 FB.Q = rand();
 next= FB.Q;
}
Во второй части в зависимости от состояния EN подается либо на 1-й MOVE (.6), либо на 2-й MOVE (.8). В этом случае все работает как задумано и speed равен или speed1sp*100 или speed2sp в зависимости от того на каком MOVE EN==1. Т.о. эта часть работает по типу №2 в моем псевдокоде.
----

Итог: мы имеем библиотечный FB и пользовательский FB. Один по одному принципу присваивает сигнал с выхода на подключенную переменную, а другой по другому. Я вот и пытаюсь найти где это описано в стандарте.
Компилятор - лучший друг человека!

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3549
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 246 раз

EN для FBD и его распространение

Сообщение Михайло »

В случае блока FB присвоение должно всегда работать, в случае MOVE, по определению, в зависимости от входа EN.
Вход EN у блока FB предназначен для инициализации расчетов внутри этого блока FB, на внешние присвоения не влияет.
Аватара пользователя

Автор темы
izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

EN для FBD и его распространение

Сообщение izhidkov »

Михайло писал(а): В случае блока FB присвоение должно всегда работать, в случае MOVE, по определению, в зависимости от входа EN.
По определению, это по "логике" или по стандарту?

По моей логике, если у любого блока EN выключен, то никакие действия с любым сигналом, к нему подключенным, не должны происходить. И это должно касаться не только MOVE.
Компилятор - лучший друг человека!

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3549
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 246 раз

EN для FBD и его распространение

Сообщение Михайло »

Команда MOVE по определению осуществляет перенос данных со входа на выход. При этому у команды нет никаких внутренних переменных, перенос осуществляется напрямую со входа на выход. Это команда, а не блок.
Если блок FB будет работать также как команда MOVE, то наверное нарушится некоторая логика: блок есть, данные есть, время для обновления состояния блока не наступило, но считать состояние нельзя.
Аватара пользователя

Автор темы
izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

EN для FBD и его распространение

Сообщение izhidkov »

Итак, про POU стандарт говорит:
1) значение выходной переменной функции при EN(0) определяется разработчиком.
2) значение выходной переменной функционального блока при EN(0) не должно изменяться относительно значения, полученного при вызове функционального блока с EN(1).

Выходная переменная POU (и функции и функционального блока) соединяется с переменной на диаграмме, и по логике это означает, что каждый раз выходная переменная POU будет записана в соединенную к ней переменную не зависимо от значения сигнала EN.

Еще раз перепроверю unity ))
Компилятор - лучший друг человека!

Михайло
почётный участник форума
почётный участник форума
Сообщения: 3549
Зарегистрирован: 10 ноя 2009, 04:58
Имя: Толмачев Михаил Алексеевич
город/регион: г. Чехов, МО
Благодарил (а): 6 раз
Поблагодарили: 246 раз

EN для FBD и его распространение

Сообщение Михайло »

Наверное тебя смутила команда MOVE, которая не является POU (но она подозрительно внешне похожа на такую).
Аватара пользователя

Автор темы
izhidkov
частый гость
частый гость
Сообщения: 404
Зарегистрирован: 25 фев 2016, 12:18
Имя: Жидков Игорь Алексеевич
Страна: РФ
город/регион: Королев/Фрязино
Благодарил (а): 4 раза
Поблагодарили: 12 раз

EN для FBD и его распространение

Сообщение izhidkov »

На симуляторе все работает по типу "move" . А я точно помню, что на железе была разница.
Компилятор - лучший друг человека!
Ответить

Вернуться в «Средний уровень автоматизации (управляющий)»