Страница 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 секунд:
О заморочках с достижением значения, отставанием сброса на один цикл уже писал...