Ошибка data flow did not rich part of network, Ошибка data flow did not rich part of network |
Здравствуйте, гость ( Вход | Регистрация )
Ошибка 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
Прикрепленные файлы
|
|
|
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 |
Если в первом варианте у вас просто никогда операция И не будет выполнена т.к. нужно 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, то все работает. Заранее объявив ее при инициализации. |
|
|
Текстовая версия | Сейчас: 28.03.2024 - 23:17 |