[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
Повідомлення: 3750
|
"pentagon128" wrote:
Добрый день. Столкнулся с тем что флаг запуска функции f_start при его изменении на вкладке Атрибуты с 0 на 1-цу передаётся со значением 1-ца во внутрь функции на вкладке отладка (так и должно быть),
Какой ещё вкладки "Атрибуты"?
Если имеется в виду вынос f_start из блока в атрибут параметра, тогда и требовать от него уже обычного поведения не нужно.
Ничего общего и у меня 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
Повідомлення: 3750
|
"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.]
|
|
|