FBD Порядок обработки блоков на плате

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Ответить
Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06 сен 2015, 16:56
Откуда: Новосибирск

FBD Порядок обработки блоков на плате

Сообщение Слимпер »

В одной теме баг трекера задал автору вопрос:

Все хотел спросить, в какой последовательности обрабатываются блоки

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

Изображение
Правильно нарисовал? или все же так:
Изображение

Ответа так и не получил, видно в других постах затерялось
Последний раз редактировалось Слимпер 05 мар 2016, 13:08, всего редактировалось 1 раз.
Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06 сен 2015, 16:56
Откуда: Новосибирск

FBD Порядок обработки блоков на плате

Сообщение Слимпер »

Стал пробовать и получает, что на деле последовательность больше зависит от того когда добавил блок чем от места.

Цифры с верху над блоками это номер как добавлял.

   
код такой 



Переставляю местами триггеры 



Последовательность то не меняется
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06 сен 2015, 16:56
Откуда: Новосибирск

FBD Порядок обработки блоков на плате

Сообщение Слимпер »

Проверяем на таймерах ( Цифры снижу значения задержки для проверки )
6047409.png
Код такой
6845237.png
Переставлю местами
7091075.png
а код тот же
6845237.png
Выкладывать скрины не буду, но на пользовательских блоках история та же:
Какой первым добавил тот и первым в коде и идет, не важно где он стоит справа, или слева, или снижу, или сверху платы.

Вот и пытаюсь понят, то ли у меня глюк, то  ли я чего та не понимаю.

Может кто объяснит? Изображение
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Слимпер 05 мар 2016, 09:58, всего редактировалось 1 раз.
Аватара пользователя
Siberian
Лейтенант
Сообщения: 475
Зарегистрирован: 07 сен 2015, 11:51
Откуда: СССР
Имя: Александр

FBD Порядок обработки блоков на плате

Сообщение Siberian »

Слимпер писал(а):Какой первым добавил тот и первым в коде и идет, не важно где он стоит справа, или слева, или снижу, или сверху платы.
Так это естественно так и будет.
Добавлением любого блока Вы условно прописываете код в IDE.
Зависимости составляют только зависимые между собой блоки. (Извиняюсь за тавтологию
).
Последний раз редактировалось Siberian 05 мар 2016, 12:26, всего редактировалось 1 раз.
Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06 сен 2015, 16:56
Откуда: Новосибирск

FBD Порядок обработки блоков на плате

Сообщение Слимпер »

Siberian писал(а):Так это естественно так и будет.Добавлением любого блока Вы условно прописываете код в IDE.Зависимости составляют только зависимые между собой блоки. (Извиняюсь за тавтологию
В том то и дело что так быть не должно, FBD подразумевает, что можно построить логическую цепочку, с заранее известной последовательностью вычисления блоков.

Обычно обработка идет, или от начало цепи к концу, или последовательность обработки блоков заедается вручную (с помощью индексов блоков).

А сейчас последовательность выходит несколько хаотичной, из-за этого, иногда, получаешь неожиданные результат.
Последний раз редактировалось Слимпер 05 мар 2016, 13:20, всего редактировалось 1 раз.
Аватара пользователя
Siberian
Лейтенант
Сообщения: 475
Зарегистрирован: 07 сен 2015, 11:51
Откуда: СССР
Имя: Александр

FBD Порядок обработки блоков на плате

Сообщение Siberian »

Перетаскивание блоков на рабочее поле - это генерация кода. Каким образом уже сгенерированный код будет перескакивать вверх-вниз?

Создавайте блоки по порядку и будет Вам счастье! Изображение
Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13 окт 2015, 16:47
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение Олег »

По идее код в Си из FBD должен создаваться в процессе компиляции, а не в процессе рисования.
Аватара пользователя
support
Супермодератор
Сообщения: 1908
Зарегистрирован: 03 янв 2018, 11:45
Откуда: Астрахань
Имя: Сергей
Поблагодарили: 2 раза
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение support »

Глубоко извиняюсь, действительно ввёл Вас в заблуждение. Как я уже писал, эта логика разрабатывалась почти три года назад, и кое- что подзабылось. В общем логика с расстоянием работала только в отношении к оконечным блокам (выходы, запись в переменные и т.д).  Для расчётных (тригеры, таймеры...) применялась более сложная логика. Брался последний (в пределах платы) вставленный блок и к нему выстраивалась цепочка соединённых с ним рассчитываемых блоков. Затем она обрабатывалась от начала до конца
Изображение
В данном примере последним добавлен блок №1. К нему строится цепочка 1 - 2 - 3. и после этого она обрабатывается в порядке : 3, 2, 1. 
После чего берётся следующий из оставшихся необработанных блоков (с сортировкой по времени добавления) и операция повторяется.

Со следующей версии ситуация немного изменится. Теперь для расчётных блоков я ввёл предварительную сортировку по расстоянию к правому верхнему углу, так что привязки ко времени вставки в схему не будет. В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.
Автор программы FLProg.
Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06 сен 2015, 16:56
Откуда: Новосибирск

FBD Порядок обработки блоков на плате

Сообщение Слимпер »

Хорошо, а то я уже думал у меня какой то, глобальный глюк.
support писал(а):Со следующей версии ситуация немного изменится. Теперь для расчётных блоков я ввёл предварительную сортировку по расстоянию к правому верхнему углу, так что привязки ко времени вставки в схему не будет. В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.
Буду очень ждать следующей версии.

А внутри пользовательских блоков на FBD, та же логика?
Аватара пользователя
Siberian
Лейтенант
Сообщения: 475
Зарегистрирован: 07 сен 2015, 11:51
Откуда: СССР
Имя: Александр

FBD Порядок обработки блоков на плате

Сообщение Siberian »

support писал(а):В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.
От правого верхнего или от левого? Не совсем понял...

Добавлено (05.03.2016, 14:51)
---------------------------------------------
понял, извиняюсь.
Аватара пользователя
support
Супермодератор
Сообщения: 1908
Зарегистрирован: 03 янв 2018, 11:45
Откуда: Астрахань
Имя: Сергей
Поблагодарили: 2 раза
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение 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]
Автор программы FLProg.
Аватара пользователя
Siberian
Лейтенант
Сообщения: 475
Зарегистрирован: 07 сен 2015, 11:51
Откуда: СССР
Имя: Александр

FBD Порядок обработки блоков на плате

Сообщение Siberian »

Понятно.
Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13 окт 2015, 16:47
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение Олег »

Сергей, чтобы было совсем понятно как лучше рисовать схему, подскажите пожалуйста, размещение нижних блоков, где у меня образуется сигнал на линию L2, лучше перенести в верхний левый угол, или все-равно где он будет стоять и выходной код будет одинаков?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
support
Супермодератор
Сообщения: 1908
Зарегистрирован: 03 янв 2018, 11:45
Откуда: Астрахань
Имя: Сергей
Поблагодарили: 2 раза
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение support »

Я вам советую поднять его на самый верх платы.  тогда он будет обрабатываться в первую очередь (правда со следующей версии). Хотя если честно то в Вашей схеме это не очень важно. Отставание в обработке будет максимум на один цикл программы. В большинстве случаев это не критично.
Автор программы FLProg.
Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13 окт 2015, 16:47
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение Олег »

Да, все работает без проблем, хотелось понять суть, спасибо.
SirYorik
Сержант
Сообщения: 124
Зарегистрирован: 04 окт 2015, 10:01
Откуда: Томск

FBD Порядок обработки блоков на плате

Сообщение SirYorik »

следующая версия это замечательно (устал бодаться с порядком компиляции в си)
Последний раз редактировалось SirYorik 05 мар 2016, 19:33, всего редактировалось 1 раз.
Аватара пользователя
Lisica
Сержант
Сообщения: 244
Зарегистрирован: 18 дек 2017, 17:25
Откуда: Золотоноша

FBD Порядок обработки блоков на плате

Сообщение Lisica »

Извиняюсь, конечно, но, не нашёл, как поменять порядок выполнения блоков на плате в версиях, выше 3.х.х
На скрине счётчик сначала сбросится, потом запишет в переменную.
Как сделать чтоб сначала записал, потом сбросился.
PS в коде ино переставлял - работает, но это же не выход.......
Безымянный.JPG
Попробовал по платам разнести - тоже самое... на выходе 0
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 1 раз
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение Sancho »

[ref]Lisica[/ref], Никак. Только ручками.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Lisica
Сержант
Сообщения: 244
Зарегистрирован: 18 дек 2017, 17:25
Откуда: Золотоноша

FBD Порядок обработки блоков на плате

Сообщение Lisica »

Sancho писал(а): 31 окт 2018, 08:13Lisica, Никак. Только ручками.
Жаль...
Я пробовал и р-триг вставить между генератором и сбросом... то программа, всё равно тригер вставляет после записи в переменную...
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 1 раз
Контактная информация:

FBD Порядок обработки блоков на плате

Сообщение Sancho »

[ref]Lisica[/ref],
Написать свой - я так сделал.

Отправлено спустя 2 минуты 29 секунд:
О заморочках с достижением значения, отставанием сброса на один цикл уже писал...
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Ответить

Вернуться в «Спросить у знатоков»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость