Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Mitsubishi Electric. Контроллеры, преобразователи частоты, HMI _ Общие вопросы _ Ошибка data flow did not rich part of network

Автор: Илья Алексеев 26.03.2019 - 17:48

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

 

Автор: Sergei Troizky 27.03.2019 - 01:19

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

Автор: Илья Алексеев 27.03.2019 - 11:15

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

Спасибо

Автор: Илья Алексеев 30.01.2021 - 19:42

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

Спасибо


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

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

Спасибо.

Автор: kaii 30.01.2021 - 20: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, и не будет ошибки.)

Автор: Илья Алексеев 31.01.2021 - 10:59

Цитата(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, то все работает. Заранее объявив ее при инициализации.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)