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
 
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
kaii
сообщение 30.01.2021 - 20:40
Сообщение #2


Фанат
***

Группа: Пользователи
Сообщений: 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
Сообщение #3


Читатель
*

Группа: Пользователи
Сообщений: 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, то все работает. Заранее объявив ее при инициализации.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Сообщений в этой теме


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

 



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