- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
EN для FBD и его распространение
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
EN для FBD и его распространение
Добрый день.
Меня давно мучает один вопрос связанный с языком 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).... и т.п.} ] каскадов блоков?
Меня давно мучает один вопрос связанный с языком 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 раз
- Поблагодарили: 244 раза
EN для FBD и его распространение
Если я правильно понял, то ответ следующий: значение FB.Q сохранится с момента последнего вызова FB. Объяснение простое: для того, чтобы обнулить или установить FB.Q нужно затратить процессорное время, выполнить соответствующие инструкции, но таковых условий нет - следовательно память сохранит значение FB.Q.
Соответственно это не описано в стандарте. Оно было бы описано, если потребовалось бы предписание как-то особо управляться с FB.Q при отсутствии сигнала EN.
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
EN для FBD и его распространение
То, что значения выходных сигналов 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;
}
FB_MOVE работает по 2-му правилу, а вот с другими FB почему-то иногда 1-ый вариант происходит.
Компилятор - лучший друг человека!
-
- почётный участник форума
- Сообщения: 3549
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 244 раза
EN для FBD и его распространение
Ну это зависит от того, где происходит присваивание. Тот блок, где находится присваивание, выполняется?..
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
EN для FBD и его распространение
Обсуждать FBD без графики бессмысленно
среда "unity"
Вот
1) часть не работает как хотелось бы
2) часть работает
В 1-й части каждый FB что-то делает и выдает сигнал готовности. На картинке 2-й FB перезатирает сигнал 1-го FB и "c_tare_zero_ok" всегда зависит только от 2-го FB. (т.е. FB тут работает по типу №1 )
Во второй части в зависимости от состояния EN подается либо на 1-й MOVE (.6), либо на 2-й MOVE (.8). В этом случае все работает как задумано и speed равен или speed1sp*100 или speed2sp в зависимости от того на каком MOVE EN==1. Т.о. эта часть работает по типу №2 в моем псевдокоде.
----
Итог: мы имеем библиотечный FB и пользовательский FB. Один по одному принципу присваивает сигнал с выхода на подключенную переменную, а другой по другому. Я вот и пытаюсь найти где это описано в стандарте.
Компилятор - лучший друг человека!
-
- почётный участник форума
- Сообщения: 3549
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 244 раза
EN для FBD и его распространение
В случае блока FB присвоение должно всегда работать, в случае MOVE, по определению, в зависимости от входа EN.
Вход EN у блока FB предназначен для инициализации расчетов внутри этого блока FB, на внешние присвоения не влияет.
Вход EN у блока FB предназначен для инициализации расчетов внутри этого блока FB, на внешние присвоения не влияет.
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
EN для FBD и его распространение
По определению, это по "логике" или по стандарту?
По моей логике, если у любого блока EN выключен, то никакие действия с любым сигналом, к нему подключенным, не должны происходить. И это должно касаться не только MOVE.
Компилятор - лучший друг человека!
-
- почётный участник форума
- Сообщения: 3549
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 244 раза
EN для FBD и его распространение
Команда MOVE по определению осуществляет перенос данных со входа на выход. При этому у команды нет никаких внутренних переменных, перенос осуществляется напрямую со входа на выход. Это команда, а не блок.
Если блок FB будет работать также как команда MOVE, то наверное нарушится некоторая логика: блок есть, данные есть, время для обновления состояния блока не наступило, но считать состояние нельзя.
Если блок FB будет работать также как команда MOVE, то наверное нарушится некоторая логика: блок есть, данные есть, время для обновления состояния блока не наступило, но считать состояние нельзя.
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
EN для FBD и его распространение
Итак, про POU стандарт говорит:
1) значение выходной переменной функции при EN(0) определяется разработчиком.
2) значение выходной переменной функционального блока при EN(0) не должно изменяться относительно значения, полученного при вызове функционального блока с EN(1).
Выходная переменная POU (и функции и функционального блока) соединяется с переменной на диаграмме, и по логике это означает, что каждый раз выходная переменная POU будет записана в соединенную к ней переменную не зависимо от значения сигнала EN.
Еще раз перепроверю unity ))
1) значение выходной переменной функции при EN(0) определяется разработчиком.
2) значение выходной переменной функционального блока при EN(0) не должно изменяться относительно значения, полученного при вызове функционального блока с EN(1).
Выходная переменная POU (и функции и функционального блока) соединяется с переменной на диаграмме, и по логике это означает, что каждый раз выходная переменная POU будет записана в соединенную к ней переменную не зависимо от значения сигнала EN.
Еще раз перепроверю unity ))
Компилятор - лучший друг человека!
-
- почётный участник форума
- Сообщения: 3549
- Зарегистрирован: 10 ноя 2009, 04:58
- Имя: Толмачев Михаил Алексеевич
- город/регион: г. Чехов, МО
- Благодарил (а): 6 раз
- Поблагодарили: 244 раза
EN для FBD и его распространение
Наверное тебя смутила команда MOVE, которая не является POU (но она подозрительно внешне похожа на такую).
-
- частый гость
- Сообщения: 404
- Зарегистрирован: 25 фев 2016, 12:18
- Имя: Жидков Игорь Алексеевич
- Страна: РФ
- город/регион: Королев/Фрязино
- Благодарил (а): 4 раза
- Поблагодарили: 12 раз
EN для FBD и его распространение
На симуляторе все работает по типу "move" . А я точно помню, что на железе была разница.
Компилятор - лучший друг человека!