FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Четверг, 08.12.2016, 12:44
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » FBD Порядок обработки блоков на плате (Не могу понять.)
FBD Порядок обработки блоков на плате
Слимпер
Дата: Суббота, 05.03.2016, 09:45 | Сообщение # 1
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 30
Репутация: 23
Статус: Offline
В одной теме баг трекера задал автору вопрос:

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

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


Позже попросил уточнения


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


Ответа так и не получил, видно в других постах затерялось


Сообщение отредактировал Слимпер - Суббота, 05.03.2016, 13:08
 
Слимпер Дата: Суббота, 05.03.2016, 09:51 | Сообщение # 2
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 30
Репутация: 23
Статус: Offline
Стал пробовать и получает, что на деле последовательность больше зависит от того когда добавил блок чем от места.

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

   
код такой 



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



Последовательность то не меняется
Прикрепления: 9808771.png(6Kb) · 2056347.png(7Kb) · 5463656.png(6Kb) · 9845055.png(7Kb)
 
Слимпер Дата: Суббота, 05.03.2016, 09:55 | Сообщение # 3
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 30
Репутация: 23
Статус: Offline
Проверяем на таймерах ( Цифры снижу значения задержки для проверки )


Код такой


Переставлю местами


а код тот же


Выкладывать скрины не буду, но на пользовательских блоках история та же:
Какой первым добавил тот и первым в коде и идет, не важно где он стоит справа, или слева, или снижу, или сверху платы.

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

Может кто объяснит? wacko
Прикрепления: 6047409.png(5Kb) · 6845237.png(22Kb) · 7091075.png(5Kb)


Сообщение отредактировал Слимпер - Суббота, 05.03.2016, 09:58
 
Siberian Дата: Суббота, 05.03.2016, 12:23 | Сообщение # 4
Майор
Группа: Проверенные
Сообщений: 188
Награды: 1
Репутация: 1
Статус: Offline
Цитата Слимпер ()
Какой первым добавил тот и первым в коде и идет, не важно где он стоит справа, или слева, или снижу, или сверху платы.
Так это естественно так и будет.
Добавлением любого блока Вы условно прописываете код в IDE.
Зависимости составляют только зависимые между собой блоки. (Извиняюсь за тавтологию
).


Сообщение отредактировал Siberian - Суббота, 05.03.2016, 12:26
 
Слимпер Дата: Суббота, 05.03.2016, 13:18 | Сообщение # 5
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 30
Репутация: 23
Статус: Offline
Цитата Siberian ()
Так это естественно так и будет.Добавлением любого блока Вы условно прописываете код в IDE.Зависимости составляют только зависимые между собой блоки. (Извиняюсь за тавтологию
В том то и дело что так быть не должно, FBD подразумевает, что можно построить логическую цепочку, с заранее известной последовательностью вычисления блоков.

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

А сейчас последовательность выходит несколько хаотичной, из-за этого, иногда, получаешь неожиданные результат.


Сообщение отредактировал Слимпер - Суббота, 05.03.2016, 13:20
 
Siberian Дата: Суббота, 05.03.2016, 14:05 | Сообщение # 6
Майор
Группа: Проверенные
Сообщений: 188
Награды: 1
Репутация: 1
Статус: Offline
Перетаскивание блоков на рабочее поле - это генерация кода. Каким образом уже сгенерированный код будет перескакивать вверх-вниз?

Создавайте блоки по порядку и будет Вам счастье! biggrin
 
Олег Дата: Суббота, 05.03.2016, 14:30 | Сообщение # 7
Гуру
Группа: Проверенные
Сообщений: 730
Награды: 20
Репутация: 15
Статус: Offline
По идее код в Си из FBD должен создаваться в процессе компиляции, а не в процессе рисования.
 
support Дата: Суббота, 05.03.2016, 14:39 | Сообщение # 8
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Глубоко извиняюсь, действительно ввёл Вас в заблуждение. Как я уже писал, эта логика разрабатывалась почти три года назад, и кое- что подзабылось. В общем логика с расстоянием работала только в отношении к оконечным блокам (выходы, запись в переменные и т.д).  Для расчётных (тригеры, таймеры...) применялась более сложная логика. Брался последний (в пределах платы) вставленный блок и к нему выстраивалась цепочка соединённых с ним рассчитываемых блоков. Затем она обрабатывалась от начала до конца

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

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


Разработчик программы FLProg
 
Слимпер Дата: Суббота, 05.03.2016, 14:49 | Сообщение # 9
Генерал-лейтенант
Группа: Проверенные
Сообщений: 678
Награды: 30
Репутация: 23
Статус: Offline
Хорошо, а то я уже думал у меня какой то, глобальный глюк.
Цитата support ()
Со следующей версии ситуация немного изменится. Теперь для расчётных блоков я ввёл предварительную сортировку по расстоянию к правому верхнему углу, так что привязки ко времени вставки в схему не будет. В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.

Буду очень ждать следующей версии.

А внутри пользовательских блоков на FBD, та же логика?
 
Siberian Дата: Суббота, 05.03.2016, 14:51 | Сообщение # 10
Майор
Группа: Проверенные
Сообщений: 188
Награды: 1
Репутация: 1
Статус: Offline
Цитата support ()
В первую очередь будут браться блоки наиболее близкие к правому верхнему углу, и к ним так же будут строится логические цепочки.

От правого верхнего или от левого? Не совсем понял...

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

 
support Дата: Суббота, 05.03.2016, 14:59 | Сообщение # 11
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Цитата Слимпер ()
А внутри пользовательских блоков на FBD, та же логика?
Да.
Цитата Siberian ()
От правого верхнего или от левого? Не совсем понял...
От правого верхнего. Затем строится цепочка и она обрабатывается в обратном порядке (слева направо). Это нужно что бы поймать конец цепочки. Сложно объяснить популярнее, там код метода огромный. Кому интересно:



Разработчик программы FLProg
 
Siberian Дата: Суббота, 05.03.2016, 15:03 | Сообщение # 12
Майор
Группа: Проверенные
Сообщений: 188
Награды: 1
Репутация: 1
Статус: Offline
Понятно.
 
Олег Дата: Суббота, 05.03.2016, 15:33 | Сообщение # 13
Гуру
Группа: Проверенные
Сообщений: 730
Награды: 20
Репутация: 15
Статус: Offline
Сергей, чтобы было совсем понятно как лучше рисовать схему, подскажите пожалуйста, размещение нижних блоков, где у меня образуется сигнал на линию L2, лучше перенести в верхний левый угол, или все-равно где он будет стоять и выходной код будет одинаков?
Прикрепления: 9132317.png(38Kb)
 
support Дата: Суббота, 05.03.2016, 15:51 | Сообщение # 14
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Я вам советую поднять его на самый верх платы.  тогда он будет обрабатываться в первую очередь (правда со следующей версии). Хотя если честно то в Вашей схеме это не очень важно. Отставание в обработке будет максимум на один цикл программы. В большинстве случаев это не критично.

Разработчик программы FLProg
 
Олег Дата: Суббота, 05.03.2016, 16:21 | Сообщение # 15
Гуру
Группа: Проверенные
Сообщений: 730
Награды: 20
Репутация: 15
Статус: Offline
Да, все работает без проблем, хотелось понять суть, спасибо.
 
Форум » Основной » Спросить у знатоков » FBD Порядок обработки блоков на плате (Не могу понять.)
Страница 1 из 212»
Поиск:

FLProg © 2016
Яндекс.Метрика