EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

Доступ к объекту Блочного вычислителя


Author Message
Written on: 23. 05. 2016 [01:36]
adsum
Andrew S
Topic creator
registered since: 03.10.2013
Posts: 31
Подскажите пожалуйста, как в функции, указанной в блоке Блочного вычислителя, можно получить доступ к объекту блока и контроллера с которыми она связана.
В Java-like контроллере для этих целей есть "this", в Блочном вычислителе это не работает.
Written on: 23. 05. 2016 [12:40]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"adsum" wrote:

Подскажите пожалуйста, как в функции, указанной в блоке Блочного вычислителя, можно получить доступ к объекту блока и контроллера с которыми она связана.

Зачем?

Learn, learn and learn better than work, work and work.
Written on: 23. 05. 2016 [13:45]
adsum
Andrew S
Topic creator
registered since: 03.10.2013
Posts: 31
У меня одна и та-же функция используется в разных блоках и разных контроллерах (что логично для Блочного вычислителя). В зависимости от значений параметров функция формирует сообщения системы и записывает данные в БД миную систему архивации OpenSCADA. На данный момент я добавляю в функцию дополнительный "искусственный" параметр, в который для каждого блока является неким подобием ID, которое используется в сообщениях для идентификации блока/контроллера. Но это неудобно и чревато ошибками (особенно при копировании). Было бы логичнее, если бы функция сама могла бы определить ID контроллера и блока для использования их в сообщениях.
Ещё есть задача, которую неудобно реализовывать без такого функционала. Например, контроллеры объединяют блоки/параметры по какому либо признаку (локализация, тип, подсистема и т.п.), при этом количество блоков/параметров в разных контролерах может быть разное. Было бы удобно иметь возможность написать функцию (для блока, включённого в контроллер), которая могла бы опросить все параметры контроллера, и имела возможность некое подобие обобщённого сигнала для всего контроллера (обобщающий сигнал для группы). Связывание в данном случае не подходит по причине неизвестного количества параметров. Сейчас можно реализовать только с явным указанием пути к контроллеру (опять же, дополнительные параметры и ошибки при копировании). Сейчас у меня это реализовано на уровне визуализации, но т.к. одни и те-же обобщающие параметры есть на многих мнемосхемах, получается избыточность кода (ну, и наверно, увеличение времени обработки, хотя не замерял).
Written on: 23. 05. 2016 [17:47]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
Добавил, r2372

Learn, learn and learn better than work, work and work.
Written on: 24. 05. 2016 [23:40]
adsum
Andrew S
Topic creator
registered since: 03.10.2013
Posts: 31
Роман, большое спасибо! Разработка упростилась :)
Т.к. работаю ещё в 0.8.15, то перенёс изменения туда и добавил функцию objFuncCall по аналогии с tcontroller.cpp (в т.ч. использовал имя функции start, а не process, для единообразия):
JAVASCRIPT
TVariant Block::objFuncCall( const string &iid, vector<TVariant> &prms, const string &user )
{
    if(iid == "name") return name();
    if(iid == "descr") return descr();
    if(iid == "enable") {
        if(prms.size()) setEnable( prms[0].getB() );
        return enable();
    }
    if(iid == "start") {
        if(prms.size()) setProcess( prms[0].getB() );
        return process();
    }
    return TCntrNode::objFuncCall(iid,prms,user);
}

Ещё есть предложение, добавить в функцию objFuncCall класса TCntrNode обработчик, который возвращал-бы ID узла.
Изменение вроде незначительное, но в отдельных случаях (типа моих), может оказаться полезным и ещё немного упростить программу на JavaLike (я сегодня написал код с разбором результата функции nodePath)
Written on: 25. 05. 2016 [21:22]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"adsum" wrote:

if(iid == "name") return name();
if(iid == "descr") return descr();

Лишнее, есть в cfg(), cfgSet().

"adsum" wrote:

if(iid == "enable") {
if(prms.size()) setEnable( prms[0].getB() );
return enable();
}
if(iid == "start") {
if(prms.size()) setProcess( prms[0].getB() );
return process();
}

Таких функций прямо даже в параметре нет поэтому тут не будет тем более.

"adsum" wrote:

Ещё есть предложение, добавить в функцию objFuncCall класса TCntrNode обработчик, который возвращал-бы ID узла.
Изменение вроде незначительное, но в отдельных случаях (типа моих), может оказаться полезным и ещё немного упростить программу на JavaLike (я сегодня написал код с разбором результата функции nodePath)

Опять cfg(), cfgSet().

Learn, learn and learn better than work, work and work.
Written on: 25. 05. 2016 [22:39]
adsum
Andrew S
Topic creator
registered since: 03.10.2013
Posts: 31
Роман, доброго времени суток.
Лишнее, есть в cfg(), cfgSet().
Так ведь класс Block от них не наследуется.
И сначала я скомпилировал без функции objFuncCall. Увидел, что объект Блока стал доступен и с ним работают все функции описанные для TCntrNode, но при вызове name и descr возвращался "0". Только после этого полез смотреть в чём дело и добавил objFuncCall.
Таких функций прямо даже в параметре нет ...
Ну, собственно, я писал про Блок, а не Параметр. И функции setEnable и setProcess я взял из класса Block. У меня бы не собралось, если бы их там не было.
Written on: 30. 05. 2016 [07:48]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"adsum" wrote:

Лишнее, есть в cfg(), cfgSet().
Так ведь класс Block от них не наследуется.

Речь была о функциях, которые в других местах именно для этого и используются, и если что и добавлять так именно их. Добавлено!

"adsum" wrote:

Таких функций прямо даже в параметре нет ...
Ну, собственно, я писал про Блок, а не Параметр. И функции setEnable и setProcess я взял из класса Block.

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

Learn, learn and learn better than work, work and work.



9579