Страница 1 из 1
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 09:45
Слимпер
В одной теме баг трекера задал автору вопрос:
Все хотел спросить, в какой последовательности обрабатываются блоки
На что он ответил так:
Блоки в плате могут быть трёх видов. Расчитываемые, оконечные, и логические.
В первую очередь обрабатываются расчитываеммые блоки. Это триггеры, таймеры, генераторы, сенсоры и т.д.
Затем обрабатываются оконечные блоки. Это в основном блоки которые не имеют выходов. Например вывод на дисплей, вывод на UART, запись в переменные.
Порядок обработки блоков внутри групп организован следующим образом. Первым обрабатывается блок наиболее близкий по прямой (пришлось вспоминать расчёт гипотенузы в прямоугольном треугольнике) к правому верхнему углу платы. Последним соответственно самый дальний.
Логические блоки (например AND, OR, входы, математика) не рассчитываются. При обработке блоков других типов запрашивается состояние выходов таких блоков. Они в ответ выдают логические выражения (готовый код С) соответствующие своей логике. Такое решение принято для экономии памяти контроллера. Не хорошо было бы для каждого логического или математического действия создавать переменную. В большинстве случаев в этом нет необходимости.
Ну где то так. Это очень упрощённо, на самом деле логика компилятора намного сложнее. Я даже не очень представляю как её описать подробно. На это потребуется много времени и сил.
Позже попросил уточнения

Правильно нарисовал? или все же так:
Ответа так и не получил, видно в других постах затерялось
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 09:51
Слимпер
Стал пробовать и получает, что на деле последовательность больше зависит от того когда добавил блок чем от места.
Цифры с верху над блоками это номер как добавлял.
код такой
Переставляю местами триггеры
Последовательность то не меняется
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 09:55
Слимпер
Проверяем на таймерах ( Цифры снижу значения задержки для проверки )
6047409.png
Код такой
6845237.png
Переставлю местами
7091075.png
а код тот же
6845237.png
Выкладывать скрины не буду, но на пользовательских блоках история та же:
Какой первым добавил тот и первым в коде и идет, не важно где он стоит справа, или слева, или снижу, или сверху платы.
Вот и пытаюсь понят, то ли у меня глюк, то ли я чего та не понимаю.
Может кто объяснит?

FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 12:23
Siberian
Слимпер писал(а):Какой первым добавил тот и первым в коде и идет, не важно где он стоит справа, или слева, или снижу, или сверху платы.
Так это естественно так и будет.
Добавлением любого блока Вы условно прописываете код в IDE.
Зависимости составляют только зависимые между собой блоки. (Извиняюсь за тавтологию
).
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 13:18
Слимпер
Siberian писал(а):Так это естественно так и будет.Добавлением любого блока Вы условно прописываете код в IDE.Зависимости составляют только зависимые между собой блоки. (Извиняюсь за тавтологию
В том то и дело что так быть не должно, FBD подразумевает, что можно построить логическую цепочку, с заранее известной последовательностью вычисления блоков.
Обычно обработка идет, или от начало цепи к концу, или последовательность обработки блоков заедается вручную (с помощью индексов блоков).
А сейчас последовательность выходит несколько хаотичной, из-за этого, иногда, получаешь неожиданные результат.
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 14:05
Siberian
Перетаскивание блоков на рабочее поле - это генерация кода. Каким образом уже сгенерированный код будет перескакивать вверх-вниз?
Создавайте блоки по порядку и будет Вам счастье!

FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 14:30
Олег
По идее код в Си из FBD должен создаваться в процессе компиляции, а не в процессе рисования.
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 14:39
support
Глубоко извиняюсь, действительно ввёл Вас в заблуждение. Как я уже писал, эта логика разрабатывалась почти три года назад, и кое- что подзабылось. В общем логика с расстоянием работала только в отношении к оконечным блокам (выходы, запись в переменные и т.д). Для расчётных (тригеры, таймеры...) применялась более сложная логика. Брался последний (в пределах платы) вставленный блок и к нему выстраивалась цепочка соединённых с ним рассчитываемых блоков. Затем она обрабатывалась от начала до конца

В данном примере последним добавлен блок №1. К нему строится цепочка 1 - 2 - 3. и после этого она обрабатывается в порядке : 3, 2, 1.
После чего берётся следующий из оставшихся необработанных блоков (с сортировкой по времени добавления) и операция повторяется.
Со следующей версии ситуация немного изменится. Теперь для расчётных блоков я ввёл предварительную сортировку по расстоянию к правому верхнему углу, так что привязки ко времени вставки в схему не будет. В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 14:49
Слимпер
Хорошо, а то я уже думал у меня какой то, глобальный глюк.
support писал(а):Со следующей версии ситуация немного изменится. Теперь для расчётных блоков я ввёл предварительную сортировку по расстоянию к правому верхнему углу, так что привязки ко времени вставки в схему не будет. В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.
Буду очень ждать следующей версии.
А внутри пользовательских блоков на FBD, та же логика?
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 14:51
Siberian
support писал(а):В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.
От правого верхнего или от левого? Не совсем понял...
Добавлено (05.03.2016, 14:51)
---------------------------------------------
понял, извиняюсь.
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 14:59
support
Слимпер писал(а):А внутри пользовательских блоков на FBD, та же логика?
Да.
Siberian писал(а):От правого верхнего или от левого? Не совсем понял...
От правого верхнего. Затем строится цепочка и она обрабатывается в обратном порядке (слева направо). Это нужно что бы поймать конец цепочки. Сложно объяснить популярнее, там код метода огромный. Кому интересно:
[spoiler=Спойлер]
Код: Выделить всё
sortedCalculatingBlocksFromNetWork: aNetWork
| result undisposedBlocks |
result := OrderedCollection new.
undisposedBlocks := OrderedCollection new.
(aNetWork calculatingBlocks sorted: [:a :b | a vector < b vector]) do:
[:each |
| prewCalculatingBlocks |
prewCalculatingBlocks := each previousCalculatingBlocks.
prewCalculatingBlocks isEmpty
ifTrue: [result add: each]
ifFalse: [undisposedBlocks add: each]].
[undisposedBlocks isEmpty] whileFalse:
[| tempUndisposedBlocks |
tempUndisposedBlocks := undisposedBlocks copy.
undisposedBlocks := OrderedCollection new.
tempUndisposedBlocks do:
[:each |
| prevBlocks |
prevBlocks := each previousCalculatingBlocks.
(prevBlocks allSatisfy:
[:eachPrevBlock |
result anySatisfy: [:eachResultBlock | eachResultBlock = eachPrevBlock]])
ifTrue:
[result add: each
after: (prevBlocks
sorted: [:a :b | (result indexOf: a) < (result indexOf: b)]) last]
ifFalse: [undisposedBlocks add: each]]].
^result
[/spoiler]
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 15:03
Siberian
Понятно.
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 15:33
Олег
Сергей, чтобы было совсем понятно как лучше рисовать схему, подскажите пожалуйста, размещение нижних блоков, где у меня образуется сигнал на линию L2, лучше перенести в верхний левый угол, или все-равно где он будет стоять и выходной код будет одинаков?
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 15:51
support
Я вам советую поднять его на самый верх платы. тогда он будет обрабатываться в первую очередь (правда со следующей версии). Хотя если честно то в Вашей схеме это не очень важно. Отставание в обработке будет максимум на один цикл программы. В большинстве случаев это не критично.
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 16:21
Олег
Да, все работает без проблем, хотелось понять суть, спасибо.
FBD Порядок обработки блоков на плате
Добавлено: 05 мар 2016, 19:26
SirYorik
следующая версия это замечательно (устал бодаться с порядком компиляции в си)
FBD Порядок обработки блоков на плате
Добавлено: 30 окт 2018, 23:11
Lisica
Извиняюсь, конечно, но, не нашёл, как поменять порядок выполнения блоков на плате в версиях, выше 3.х.х
На скрине счётчик сначала сбросится, потом запишет в переменную.
Как сделать чтоб сначала записал, потом сбросился.
PS в коде ино переставлял - работает, но это же не выход.......
Безымянный.JPG
Попробовал по платам разнести - тоже самое... на выходе 0
FBD Порядок обработки блоков на плате
Добавлено: 31 окт 2018, 08:13
Sancho
[ref]Lisica[/ref], Никак. Только ручками.
FBD Порядок обработки блоков на плате
Добавлено: 31 окт 2018, 08:50
Lisica
Sancho писал(а): 31 окт 2018, 08:13Lisica, Никак. Только ручками.
Жаль...
Я пробовал и р-триг вставить между генератором и сбросом... то программа, всё равно тригер вставляет после записи в переменную...
FBD Порядок обработки блоков на плате
Добавлено: 31 окт 2018, 09:17
Sancho
[ref]Lisica[/ref],
Написать свой - я так сделал.
Отправлено спустя 2 минуты 29 секунд:
О заморочках с достижением значения, отставанием сброса на один цикл
уже писал...