PDA

Просмотр полной версии : Порядок исполнения блоков



starmos
22.02.2023, 10:56
Не нашел понятного объяснения, как исполняются блоки, расположенные на рабочем поле.
Есть только описание для выходов и обратных связей. Но вот у меня на поле несколько блоков, на выходе у них присваиваются значения переменным, какие раньше, а какие позже присвоятся, как узнать?
Мне это важно для построения программы. Делаться это должно именно в одном цикле, поэтому обратные связи не подходят. Процессор контроллера обрабатывает эти присвоения последовательно, т.е. он "знает" какое сначала, а какое потом. А мне как узнать это?

melky
22.02.2023, 11:00
Проверять в пошаговом варианте онлайн. Вообще на холсте слева направо сверху вниз заявляется.
Еще есть кнопка нумерации или типа того в программе.

Dimensy
22.02.2023, 12:37
Расположение блоков на холсте никак не влияет на порядок их выполнения - все вычисляется единой картинкой.
Энергонезависимые переменные и экранные переменные у которых в свойстве стоит "Запись в конце цикла" записываются в конце цикла, т.е. после того как вся схема посчитана. Такой же результат будет, если мы обычную переменную запишем через линию задержки.

66100

1exan
22.02.2023, 12:57
Не нашел понятного объяснения, как исполняются блоки, расположенные на рабочем поле.
Есть только описание для выходов и обратных связей. Но вот у меня на поле несколько блоков, на выходе у них присваиваются значения переменным, какие раньше, а какие позже присвоятся, как узнать?
Мне это важно для построения программы. Делаться это должно именно в одном цикле, поэтому обратные связи не подходят. Процессор контроллера обрабатывает эти присвоения последовательно, т.е. он "знает" какое сначала, а какое потом. А мне как узнать это?

Я думаю, что если на холсте нет обратных связей (обнаруженных системой или добавленных специально), то будут обрабатываться только данные текущего цикла

starmos
27.02.2023, 08:08
А почему собственно "переменная может иметь только один блок записи значения"? Чтобы жизнь пользователей продукции ОВЕН не была слишком легкой что ли?

1exan
27.02.2023, 08:30
А почему собственно "переменная может иметь только один блок записи значения"? Чтобы жизнь пользователей продукции ОВЕН не была слишком легкой что ли?

Наверное это напрямую связано с построением порядка обработки блоков в OL: если на холсте будет два присваивания одной и той-же переменной, то как определить, в каком порядке они будут/должны выполняться?

kondor3000
27.02.2023, 08:46
А почему собственно "переменная может иметь только один блок записи значения"? Чтобы жизнь пользователей продукции ОВЕН не была слишком легкой что ли?

Больше и не нужно, только поначалу кажется, что должно))

starmos
28.02.2023, 10:56
Больше и не нужно, только поначалу кажется, что должно))

Все это взаимосвязано. Если вы знаете порядок исполнения блоков, то вы можете иметь сколько угодно блоков записи значения. Да, это предъявляет определенные требования к программисту, но они не являются чрезмерными. Но если вы не знаете порядок исполнения, то все блоки на поле могут быть выполнены когда угодно, по отношению друг к другу и конечно тут неизбежно будут ошибки, связанные с неправильным присвоением. Истина в том, что контроллер обрабатывает все блоки строго последовательно, т.к. у него один процессор, который в каждый конкретный момент работает только с парой операндов. Возможно наверное создание ПР с многоядерными процессорами и параллельными вычислениями, но думаю здесь не тот случай. Если человеку не важен порядок выполнения, то он может просто не ориентироваться на него, при создании программы. Но если важен, то по факту у него нет возможности это учесть, не смотря на то, что по умолчанию такая возможность присутствует. Иначе говоря, инженеры ОВЕН сознательно приложили усилия, чтобы исключить возможность учета порядка вычисления блоков и тем самым СОЗНАТЕЛЬНО усложнили жизнь программистам.

kondor3000
28.02.2023, 11:09
Все это взаимосвязано. Если вы знаете порядок исполнения блоков, то вы можете иметь сколько угодно блоков записи значения. Да, это предъявляет определенные требования к программисту, но они не являются чрезмерными. Но если вы не знаете порядок исполнения, то все блоки на поле могут быть выполнены когда угодно, по отношению друг к другу и конечно тут неизбежно будут ошибки, связанные с неправильным присвоением. Истина в том, что контроллер обрабатывает все блоки строго последовательно, т.к. у него один процессор, который в каждый конкретный момент работает только с парой операндов. Возможно наверное создание ПР с многоядерными процессорами и параллельными вычислениями, но думаю здесь не тот случай. Если человеку не важен порядок выполнения, то он может просто не ориентироваться на него, при создании программы. Но если важен, то по факту у него нет возможности это учесть, не смотря на то, что по умолчанию такая возможность присутствует. Иначе говоря, инженеры ОВЕН сознательно приложили усилия, чтобы исключить возможность учета порядка вычисления блоков и тем самым СОЗНАТЕЛЬНО усложнили жизнь программистам.

Делал макрос расчёта по реальному времени Unix Time.
При пуске записывается Т_0, далее считаем разницу и потом рассчитываем время работы. Разница считается при паузе, работа при пуске таймера.
Всё работает по порядку сверху вниз. При желании можете повторить и проверить.

PS: При пошаговой проверке, именно линиями задержки, заставил блоки работать по порядку. Dimensy оказался прав, см. следующий пост.

Вывод: Заставить работать по порядку можно, даже в Лоджике.

Dimensy
28.02.2023, 11:52
Все это взаимосвязано. Если вы знаете порядок исполнения блоков, то вы можете иметь сколько угодно блоков записи значения. Да, это предъявляет определенные требования к программисту, но они не являются чрезмерными. Но если вы не знаете порядок исполнения, то все блоки на поле могут быть выполнены когда угодно, по отношению друг к другу и конечно тут неизбежно будут ошибки, связанные с неправильным присвоением. Истина в том, что контроллер обрабатывает все блоки строго последовательно, т.к. у него один процессор, который в каждый конкретный момент работает только с парой операндов. Возможно наверное создание ПР с многоядерными процессорами и параллельными вычислениями, но думаю здесь не тот случай. Если человеку не важен порядок выполнения, то он может просто не ориентироваться на него, при создании программы. Но если важен, то по факту у него нет возможности это учесть, не смотря на то, что по умолчанию такая возможность присутствует. Иначе говоря, инженеры ОВЕН сознательно приложили усилия, чтобы исключить возможность учета порядка вычисления блоков и тем самым СОЗНАТЕЛЬНО усложнили жизнь программистам.

Наоборот, разработчики Лоджика упростили жизнь, потому что не надо учитывать порядок выполнения блоков.
Т.к. у нас может быть только одна запись в переменную, то связи формируют единственное решение. Грубо говоря, Лоджик на основе схемы формирует уравнения, типа
У1 (Х1, Х2, Х3); У2(Х4, Х5, У1), У3(У1, У2) и считает их. А, вот, если попадается запись типа У4(Х6, У5) и У5(Х7, У4), то Лоджик просит поставить линию задержки

1exan
28.02.2023, 13:18
В этом плане Codesys сделал хороший вариант CFC - можно произвольно установить порядок исполнения блоков, а можно выстроить нумерацию согласно потоку данных (как делает OL).
Справедливости ради - не помню, чтобы мне сильно необходимо было использовать порядок выполнения блоков, отличный от упорядоченного по потоку данных.