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

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

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

#1

Сообщение Слимпер » 05.03.2016{, 09:45}

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

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

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

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

Ответа так и не получил, видно в других постах затерялось
Последний раз редактировалось Слимпер 05.03.2016{, 13:08}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#2

Сообщение Слимпер » 05.03.2016{, 09:51}

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

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

   
код такой 



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



Последовательность то не меняется
Для скачивания вложений Вы должны быть зарегистрированы.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#3

Сообщение Слимпер » 05.03.2016{, 09:55}

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

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

Может кто объяснит? Изображение
Для скачивания вложений Вы должны быть зарегистрированы.
Последний раз редактировалось Слимпер 05.03.2016{, 09:58}, всего редактировалось 1 раз.

Аватара пользователя
Siberian
Лейтенант
Сообщения: 473
Зарегистрирован: 07.09.2015{, 11:51}
Репутация: 8
Откуда: СССР
Имя: Александр

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

#4

Сообщение Siberian » 05.03.2016{, 12:23}

Слимпер писал(а):Какой первым добавил тот и первым в коде и идет, не важно где он стоит справа, или слева, или снижу, или сверху платы.
Так это естественно так и будет.
Добавлением любого блока Вы условно прописываете код в IDE.
Зависимости составляют только зависимые между собой блоки. (Извиняюсь за тавтологию
).
Последний раз редактировалось Siberian 05.03.2016{, 12:26}, всего редактировалось 1 раз.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#5

Сообщение Слимпер » 05.03.2016{, 13:18}

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

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

А сейчас последовательность выходит несколько хаотичной, из-за этого, иногда, получаешь неожиданные результат.
Последний раз редактировалось Слимпер 05.03.2016{, 13:20}, всего редактировалось 1 раз.

Аватара пользователя
Siberian
Лейтенант
Сообщения: 473
Зарегистрирован: 07.09.2015{, 11:51}
Репутация: 8
Откуда: СССР
Имя: Александр

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

#6

Сообщение Siberian » 05.03.2016{, 14:05}

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

Создавайте блоки по порядку и будет Вам счастье! Изображение

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 62
Контактная информация:

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

#7

Сообщение Олег » 05.03.2016{, 14:30}

По идее код в Си из FBD должен создаваться в процессе компиляции, а не в процессе рисования.

Аватара пользователя
support
Супермодератор
Сообщения: 1754
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 603
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#8

Сообщение support » 05.03.2016{, 14:39}

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

Со следующей версии ситуация немного изменится. Теперь для расчётных блоков я ввёл предварительную сортировку по расстоянию к правому верхнему углу, так что привязки ко времени вставки в схему не будет. В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.
Автор программы FLProg.

Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 25
Откуда: Новосибирск

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

#9

Сообщение Слимпер » 05.03.2016{, 14:49}

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

А внутри пользовательских блоков на FBD, та же логика?

Аватара пользователя
Siberian
Лейтенант
Сообщения: 473
Зарегистрирован: 07.09.2015{, 11:51}
Репутация: 8
Откуда: СССР
Имя: Александр

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

#10

Сообщение Siberian » 05.03.2016{, 14:51}

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

Добавлено (05.03.2016, 14:51)
---------------------------------------------
понял, извиняюсь.

Аватара пользователя
support
Супермодератор
Сообщения: 1754
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 603
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#11

Сообщение support » 05.03.2016{, 14:59}

Слимпер писал(а):А внутри пользовательских блоков на FBD, та же логика?
Да.
Siberian писал(а):От правого верхнего или от левого? Не совсем понял...
От правого верхнего. Затем строится цепочка и она обрабатывается в обратном порядке (слева направо). Это нужно что бы поймать конец цепочки. Сложно объяснить популярнее, там код метода огромный. Кому интересно:
СпойлерПоказать

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

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
Автор программы FLProg.

Аватара пользователя
Siberian
Лейтенант
Сообщения: 473
Зарегистрирован: 07.09.2015{, 11:51}
Репутация: 8
Откуда: СССР
Имя: Александр

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

#12

Сообщение Siberian » 05.03.2016{, 15:03}

Понятно.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 62
Контактная информация:

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

#13

Сообщение Олег » 05.03.2016{, 15:33}

Сергей, чтобы было совсем понятно как лучше рисовать схему, подскажите пожалуйста, размещение нижних блоков, где у меня образуется сигнал на линию L2, лучше перенести в верхний левый угол, или все-равно где он будет стоять и выходной код будет одинаков?
Для скачивания вложений Вы должны быть зарегистрированы.

Аватара пользователя
support
Супермодератор
Сообщения: 1754
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 603
Откуда: Астрахань
Имя: Сергей
Контактная информация:

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

#14

Сообщение support » 05.03.2016{, 15:51}

Я вам советую поднять его на самый верх платы.  тогда он будет обрабатываться в первую очередь (правда со следующей версии). Хотя если честно то в Вашей схеме это не очень важно. Отставание в обработке будет максимум на один цикл программы. В большинстве случаев это не критично.
Автор программы FLProg.

Аватара пользователя
Олег
Полковник
Сообщения: 1532
Зарегистрирован: 13.10.2015{, 16:47}
Репутация: 62
Контактная информация:

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

#15

Сообщение Олег » 05.03.2016{, 16:21}

Да, все работает без проблем, хотелось понять суть, спасибо.

SirYorik
Сержант
Сообщения: 124
Зарегистрирован: 04.10.2015{, 10:01}
Репутация: 0
Откуда: Томск

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

#16

Сообщение SirYorik » 05.03.2016{, 19:26}

следующая версия это замечательно (устал бодаться с порядком компиляции в си)
Последний раз редактировалось SirYorik 05.03.2016{, 19:33}, всего редактировалось 1 раз.

Аватара пользователя
Lisica
Сержант
Сообщения: 236
Зарегистрирован: 18.12.2017{, 17:25}
Репутация: 14
Откуда: Золотоноша

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

#17

Сообщение Lisica » 30.10.2018{, 23:11}

Извиняюсь, конечно, но, не нашёл, как поменять порядок выполнения блоков на плате в версиях, выше 3.х.х
На скрине счётчик сначала сбросится, потом запишет в переменную.
Как сделать чтоб сначала записал, потом сбросился.
PS в коде ино переставлял - работает, но это же не выход.......
Безымянный.JPG
Попробовал по платам разнести - тоже самое... на выходе 0
Для скачивания вложений Вы должны быть зарегистрированы.

Аватара пользователя
Sancho
Полковник
Сообщения: 3833
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 533
Откуда: Ярославль.
Имя: Александр
Контактная информация:

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

#18

Сообщение Sancho » 31.10.2018{, 08:13}

Lisica, Никак. Только ручками.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Lisica
Сержант
Сообщения: 236
Зарегистрирован: 18.12.2017{, 17:25}
Репутация: 14
Откуда: Золотоноша

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

#19

Сообщение Lisica » 31.10.2018{, 08:50}

Sancho писал(а):
31.10.2018{, 08:13}
Lisica, Никак. Только ручками.
Жаль...
Я пробовал и р-триг вставить между генератором и сбросом... то программа, всё равно тригер вставляет после записи в переменную...

Аватара пользователя
Sancho
Полковник
Сообщения: 3833
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 533
Откуда: Ярославль.
Имя: Александр
Контактная информация:

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

#20

Сообщение Sancho » 31.10.2018{, 09:15}

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

Отправлено спустя 2 минуты 29 секунд:
О заморочках с достижением значения, отставанием сброса на один цикл уже писал...
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Ответить

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