IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Ошибка data flow did not rich part of network, Ошибка data flow did not rich part of network
Илья Алексеев
сообщение 26.03.2019 - 17:48
Сообщение #1


Читатель
*

Группа: Пользователи
Сообщений: 16
Регистрация: 4.08.2018
Пользователь №: 11060



Здравствуйте. Хотел с помощью RS триггера организовать работу программы таким образом, чтобы кусок программы выполняется только 1 раз.
Сделал это следующим образом. (когда собрались условия, а триггер еще не взвелся -> сделать действие и взвести триггер. А сбросить только в случае отключения установки)
Но компилятор ругается.
Такой же код сделал в среде Codesys. Там все работает.
Подскажите, почему так.
Спасибо.

Сообщение отредактировал Илья Алексеев - 26.03.2019 - 17:49
Прикрепленные файлы
Прикрепленный файл  ______.png ( 42.65 килобайт ) Кол-во скачиваний: 22
 
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Sergei Troizky
сообщение 27.03.2019 - 01:19
Сообщение #2


Гигант мысли
****

Группа: Пользователи
Сообщений: 377
Регистрация: 30.12.2004
Пользователь №: 108



Не вдаваясь в саму логику, ошибка вызвана линией с выхода триггера. Она заворачивает назад и заканчивается позади уже отработанного узла, а это недопустимая конструкция.


--------------------
Делать надо сразу хорошо. Плохо само получится.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Илья Алексеев
сообщение 27.03.2019 - 11:15
Сообщение #3


Читатель
*

Группа: Пользователи
Сообщений: 16
Регистрация: 4.08.2018
Пользователь №: 11060



Цитата(Sergei Troizky @ 27.03.2019 - 02:19) *
Не вдаваясь в саму логику, ошибка вызвана линией с выхода триггера. Она заворачивает назад и заканчивается позади уже отработанного узла, а это недопустимая конструкция.

Спасибо
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Илья Алексеев
сообщение 30.01.2021 - 19:42
Сообщение #4


Читатель
*

Группа: Пользователи
Сообщений: 16
Регистрация: 4.08.2018
Пользователь №: 11060



Прикрепленный файл  ______.png ( 25.68 килобайт ) Кол-во скачиваний: 30
Цитата(Илья Алексеев @ 27.03.2019 - 12:15) *
Цитата(Sergei Troizky @ 27.03.2019 - 02:19) *
Не вдаваясь в саму логику, ошибка вызвана линией с выхода триггера. Она заворачивает назад и заканчивается позади уже отработанного узла, а это недопустимая конструкция.

Спасибо


Здравствуйте, прошло столько времени. Но воз и ныне там rolleyes.gif
Дело в том, что тогда эту ошибку я обошел и больше не сталкивался с этим контроллером.
Но сейчас понимаю, что для новых задач много где требуется, чтобы с выхода блока линия шла назад, на уже отработанный узел.
Подскажите, как правильно решать эту задачу?

Для примера, если сигнал датчика меняется на значение меньше чем мертвая зона, но значение на выходе не меняется. Если более то записать новое значение.

Спасибо.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
kaii
сообщение 30.01.2021 - 20:40
Сообщение #5


Фанат
***

Группа: Пользователи
Сообщений: 106
Регистрация: 17.03.2020
Из: Екатеринбург
Пользователь №: 11250



Если в первом варианте у вас просто никогда операция И не будет выполнена т.к. нужно 1 и 1 на входах (это не операция ИЛИ), и выход с этого И как раз и должен включать 1 необходимую, что никогда не произойдет.
Во втором варианте у вас петля получилась. Представьте, в теории (т.к. вряд ли вообще этот цикл будет работать т.к. значение IN0 не определенно как 0 даже), у вас на "in" пришло значение 23. В вычитании, в теории, 23 минус 0 получаем 23. Дальше через абсолют получаем 23. Через сравнение с 20 получаем что 23 больше чем 20 и на выходе имеем логическую единицу. SEL увидев единицу на G такой "настало время переключить на выход значение с IN1", что он успешно и делает. НО проследим цепочку дальше. На выходе с SEL число 23, которое отправляется на SUB. И что же получаем? 23 вычитается 23 и получаем 0, что меньше чем 20 и GE обратно переключается в 0, что дает сигнал на SEL, что переключает обратно на IN0. И теперь программа помнит что на IN0 число 23 и SUB нужно чтобы на "in" было число равное или больше 44 чтобы снова через сравнение пошла единица которая снова переключит SEL и вход IN0 СНОВА запомнит число 44 и будет его вычитать из "in". И так оно по кругу бесконечно будет не исполняться. Поняли цикл как идет у вас? Или запутанно объяснил?
Ближайшее решение это выкинуть SUB и ABS, а на GE заводить "in" и K20. На IN0 будет то же самое значение, что и на выходе, но оно использоваться не будет пока "in" больше 20, а когда станет меньше, то запомнит (ну, как запомнит, выключив и включив контроллер забудет и будет 0 передавать, пока снова больше 20 не будет) что переключилось когда было число 20 и будет его на выход посылать пока на G не появится снова единица. (Хотя нз, нужно ли начальному числу в IN0 определение, что там 0, и не будет ошибки.)

Сообщение отредактировал kaii - 30.01.2021 - 21:07
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Илья Алексеев
сообщение 31.01.2021 - 10:59
Сообщение #6


Читатель
*

Группа: Пользователи
Сообщений: 16
Регистрация: 4.08.2018
Пользователь №: 11060



Цитата(kaii @ 30.01.2021 - 21:40) *
Если в первом варианте у вас просто никогда операция И не будет выполнена т.к. нужно 1 и 1 на входах (это не операция ИЛИ), и выход с этого И как раз и должен включать 1 необходимую, что никогда не произойдет.
Во втором варианте у вас петля получилась. Представьте, в теории (т.к. вряд ли вообще этот цикл будет работать т.к. значение IN0 не определенно как 0 даже), у вас на "in" пришло значение 23. В вычитании, в теории, 23 минус 0 получаем 23. Дальше через абсолют получаем 23. Через сравнение с 20 получаем что 23 больше чем 20 и на выходе имеем логическую единицу. SEL увидев единицу на G такой "настало время переключить на выход значение с IN1", что он успешно и делает. НО проследим цепочку дальше. На выходе с SEL число 23, которое отправляется на SUB. И что же получаем? 23 вычитается 23 и получаем 0, что меньше чем 20 и GE обратно переключается в 0, что дает сигнал на SEL, что переключает обратно на IN0. И теперь программа помнит что на IN0 число 23 и SUB нужно чтобы на "in" было число равное или больше 44 чтобы снова через сравнение пошла единица которая снова переключит SEL и вход IN0 СНОВА запомнит число 44 и будет его вычитать из "in". И так оно по кругу бесконечно будет не исполняться. Поняли цикл как идет у вас? Или запутанно объяснил?
Ближайшее решение это выкинуть SUB и ABS, а на GE заводить "in" и K20. На IN0 будет то же самое значение, что и на выходе, но оно использоваться не будет пока "in" больше 20, а когда станет меньше, то запомнит (ну, как запомнит, выключив и включив контроллер забудет и будет 0 передавать, пока снова больше 20 не будет) что переключилось когда было число 20 и будет его на выход посылать пока на G не появится снова единица. (Хотя нз, нужно ли начальному числу в IN0 определение, что там 0, и не будет ошибки.)


Спасибо.
На самом деле я затупил, и в данном случае если вместо линий на входы послать переменную out, то все работает. Заранее объявив ее при инициализации.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 28.03.2024 - 15:23