УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

[BugWrong] Обработка f_start


Автор Сообщение
Сообщение создано: 08. 03. 2015 [18:50]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
Добрый день. Столкнулся с тем что флаг запуска функции f_start при его изменении на вкладке Атрибуты с 0 на 1-цу передаётся со значением 1-ца во внутрь функции на вкладке отладка (так и должно быть), а вот при использовании в блочном вычислителе при его изменении внутрь функции не уходит, а сбрасывается в 0 где-то в другом месте. Как результат - стартовый блок кода функции вида:

if (f_start)//1-й запуск
{
//команды
//концовка 1-го запуска
f_start=false;
}
//дальше идёт тело функции

в теле блочного вычислителя не исполняется, если на вкладке IO задать f_start=1, или в параметрах блока задать f_start=1, или из виджета. При этом f_start сбрасывается в 0. Как результат - не исполняется блок кода 1-го запуска.

При этом, блок кода первого запуска успешно исполняется при первом запуске блочного вычислителя, или если передернуть старт/стоп блочный вычислитель.

Версия Openscada 2216 на Raspberry Pi. Такое ощущение что опять вернулась ошибка inf-error описанная в теме http://oscada.org/ru/forum/posts/otslezhivanie_oshibok/inf_error/ только теперь не при запуске, а при работе блочного вычислителя.

У меня в стартовом блоке функции вынесен тяжёлый код, который исполняется при старте функции, обсчитывает входные теги и результат расчёта кладёт в массив, далее крутиться лёгкий код, который пользуется результатом расчёта, в результате сильно уменьшается цикл. Если оператор из виджета меняет исходные данные, то мне необходимо заново пересчитать однократно тяжелый код, для чего я взвожу флаг f_start=1. Далее в блочном вычислителе он сбрасывается в 0 (это видно из виджета и из атрибутов), а блок тяжёлого кода не выполняется (видно по значениям переменных), что и есть проблема.

[Сообщение редактировалось 2 раз(а), в последний раз 08.03.2015 в 19:01.]
Сообщение создано: 08. 03. 2015 [19:13]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"pentagon128" wrote:

Добрый день. Столкнулся с тем что флаг запуска функции f_start при его изменении на вкладке Атрибуты с 0 на 1-цу передаётся со значением 1-ца во внутрь функции на вкладке отладка (так и должно быть),

Какой ещё вкладки "Атрибуты"?
Если имеется в виду вынос f_start из блока в атрибут параметра, тогда и требовать от него уже обычного поведения не нужно.

"pentagon128" wrote:

Версия Openscada 2216 на Raspberry Pi. Такое ощущение что опять вернулась ошибка inf-error описанная в теме http://oscada.org/ru/forum/posts/otslezhivanie_oshibok/inf_error/ только теперь не при запуске, а при работе блочного вычислителя.

Ничего общего и у меня f_start по прямому назначению и без передавливания с параметра нормально и везде работает.

Не ошибка!

Learn, learn and learn better than work, work and work.
Сообщение создано: 08. 03. 2015 [19:40]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
всё верно - пытаюсь "передавить" f_start атрибутом параметра. Было бы удобно если бы это прокатывало. А так прийдётся городить параллельную переменную флаг init, а также выносить в атрибут параметра, в этом случае стартовый код будет такой...

if (init)//1-й запуск
{
//команды
//концовка 1-го запуска
init=false;
}
//дальше идёт тело функции

тогда спрашивается зачем f_start нужен? Или задумано что область видимости f_start не распространяется на атрибуты параметра.

[Сообщение редактировалось 1 раз(а), в последний раз 08.03.2015 в 20:03.]
Сообщение создано: 09. 03. 2015 [07:22]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
временное решение теперь у меня выглядит так

if (f_start || init)//1-й запуск или переинициализация
{
//блок тяжёлого кода 1-го запуска или переинициализации
//концовка 1-го запуска или переинициализации
f_start=false; init=false;
}

//блок легкого кода

через атрибуты параметров запись 1-цы осуществляю в переменную init, которая по своей сути дублирует f_start. Т.к. с областью видимости f_start проблема при работе через атрибуты параметров. Роман, может как нибудь подправите алгоритм записи в f_start нуля (0) не до исполнения кода java функции, а после, чтобы факт изменения f_start можно было отловить в коде функции при её циклическом исполнении изнутри?

[Сообщение редактировалось 1 раз(а), в последний раз 09.03.2015 в 07:28.]
Сообщение создано: 09. 03. 2015 [07:45]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
"pentagon128" wrote:

Или задумано что область видимости f_start не распространяется на атрибуты параметра.

Да, и в документации написано, а также понятно из того, что "f_start" это далеко не только BlockCalc.

"pentagon128" wrote:

через атрибуты параметров запись 1-цы осуществляю в переменную init, которая по своей сути дублирует f_start. Т.к. с областью видимости f_start проблема при работе через атрибуты параметров. Роман, может как нибудь подправите алгоритм записи в f_start нуля (0) не до исполнения кода java функции, а после, чтобы факт изменения f_start можно было отловить в коде функции при её циклическом исполнении изнутри?

Опять начинаю для Вас повторять! Это не ошибка, точнее не OpenSCADA, а ваша. Раз так, то это и не предмет исправлений, а максимум расширение роли "f_start" для несвойственной ему роли конкретно в BlockCalc.

И всё это уже не вопрос этой темы!

Learn, learn and learn better than work, work and work.
Сообщение создано: 09. 03. 2015 [12:49]
pentagon128
Руслан Кучерявый
Создатель темы
Зарегистрирован(а) с: 15.11.2011
Сообщения: 102
"roman" wrote:

Опять начинаю для Вас повторять! Это не ошибка, точнее не OpenSCADA, а ваша. Раз так, то это и не предмет исправлений, а максимум расширение роли "f_start" для несвойственной ему роли конкретно в BlockCalc.

И всё это уже не вопрос этой темы!


Согласен. То что это не ошибка, а такое "поведение" Openscada это понятно мне уже давно, под эту формулировку попадает почти всё в теме "отслеживание ошибок". Тогда можно и тему перенести "в вопросы". У меня ошибки тоже нет - код работает в соответствии с матмоделью с решением изложенным мною выше. Была проблема, да. А вот "грабли" в виде невозможности пропихивания атрибутов в f_start остались. Ещё кто нибудь наступит. Я проблему выявил (мою проблему), описал, предложил возможное решение и опробывал его, о чём и отписался в форум. Это немаловажно, не надо отмахиваться что это только моя проблема и ошибка. Я мог бы и не писать ничего, просто "взять на карандаш", но в этом случае - я бы и совершил другую ошибку, ошибку умолчания. Чем меньше возможных "граблей" тем лучше! P.S. Роман, тему эту может в вопросы перенести? Пускай там поболтается.

[Сообщение редактировалось 1 раз(а), в последний раз 09.03.2015 в 12:54.]



18203