Автор |
Сообщение |
Сообщение создано: 08. 05. 2013 [10:44]
|
feofankss
Сергей Костяев
Создатель темы
Зарегистрирован(а) с: 07.05.2013
Сообщения: 16
|
Здравствуйте. По тестовой задаче создал небольшой шаблон:
// if tap to stop when bur is started, bur must stoped
if (stop) {
stop = false;
if (started) {
start = false;
right1 = false;
right2 = false;
left = false;
LR = 0;
}
}
if (right1) {
if (LR == 0 || LR == 1) {
if (stoped) {
LR = 1;
start = true;
}
} else {
right1 = false;
}
}
if (right2) {
if (LR == 0 || LR == 2) {
if (stoped) {
LR = 2;
start = true;
}
} else {
right2 = false;
}
}
if (left) {
if (LR == 0 || LR == 3) {
if (stoped) {
LR = 3;
start = true;
}
} else {
left = false;
}
}
Создал контроллер логического уровня по этому шаблону и привязал его к тестовому модбас-контроллеру. Всё корректно отрабатывает. Далее создал составной виджет с четырьмя кнопками. Не могу грамотно привязать этот виджет к контроллеру логического уровня (пробовал разные способы, описанные в QuickStart и в документации). Пока наполовину работает только задание кнопкам свойств chekable и value и привязка value как полная связь с переменными контроллера логического уровня. Но при изменении состояния этих переменных внутри контроллера логического уровня состояние кнопки не меняется. Нужно либо изменение состояния кнопок вместе с изменением этих переменных внутри логического контроллера, либо возможность использовать кнопки без свойства chekable (и, например, изменение цвета кнопок в зависимости от другой переменной логического уровня). Прошу помочь мне разобраться.
|
Сообщение создано: 08. 05. 2013 [16:45]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"feofankss" wrote:
Создал контроллер логического уровня по этому шаблону и привязал его к тестовому модбас-контроллеру. Всё корректно отрабатывает. Далее создал составной виджет с четырьмя кнопками. Не могу грамотно привязать этот виджет к контроллеру логического уровня (пробовал разные способы, описанные в QuickStart и в документации). Пока наполовину работает только задание кнопкам свойств chekable и value и привязка value как полная связь с переменными контроллера логического уровня. Но при изменении состояния этих переменных внутри контроллера логического уровня состояние кнопки не меняется.
Описывайте отображение состояние в виджете.
"feofankss" wrote:
Нужно либо изменение состояния кнопок вместе с изменением этих переменных внутри логического контроллера, либо возможность использовать кнопки без свойства chekable (и, например, изменение цвета кнопок в зависимости от другой переменной логического уровня). Прошу помочь мне разобраться.
В ДемоБД полно примеров. Мало того, из обработки событий в "Быстром старте", должно быть понятно как обновлять состояние их источника данных с функцией смены состояния по событию.
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 13. 05. 2013 [05:28]
|
feofankss
Сергей Костяев
Создатель темы
Зарегистрирован(а) с: 07.05.2013
Сообщения: 16
|
Хорошо. Тогда буду задавать более конкретные уточняющие вопросы. Я так понял, обработку событий виджета нужно делать во вкладке "Обработка", в поле "Программа". Поправьте, если ошибаюсь. Там есть поле "период вычисления", значит ли это, что не нужно дополнительно указывать бесконечный цикл и/или циклическое выполнение, вроде:
if((tm_cnt-=1/f_frq) <= 0) //Декремент
{
tm_cnt = 10; //Установка счётчика в значение 10 секунд
//Выполнение других действий с периодичностью 10 секунд
}
Необходимые к обработке события нужно указывать в поле "обработка событий" составного виджета и/или дочерних виджетов? Почему при привязке к кнопке переменной контроллера логического уровня в режиме "полная связь" по факту получаем связь одностороннюю (состояние кнопки не меняется при смене значения переменной внутри контроллера логического уровня)? К сожалению, чтение документации не пролило свет на данные вопросы.
[Сообщение редактировалось 1 раз(а), в последний раз 13.05.2013 в 05:32.]
|
Сообщение создано: 13. 05. 2013 [10:21]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"feofankss" wrote:
Хорошо. Тогда буду задавать более конкретные уточняющие вопросы. Я так понял, обработку событий виджета нужно делать во вкладке "Обработка", в поле "Программа".
http://wiki.oscada.org/Doc/QuickStart#h988-19
"feofankss" wrote:
Там есть поле "период вычисления", значит ли это, что не нужно дополнительно указывать бесконечный цикл и/или циклическое выполнение, вроде:
if((tm_cnt-=1/f_frq) <= 0) //Декремент
{
tm_cnt = 10; //Установка счётчика в значение 10 секунд
//Выполнение других действий с периодичностью 10 секунд
}
http://wiki.oscada.org/Doc/QuickStart#h988-26
"feofankss" wrote:
Необходимые к обработке события нужно указывать в поле "обработка событий" составного виджета и/или дочерних виджетов?
Для операций со страницами - да, для остального в тексте программы, взято из "Быстрого Старта":
ev_wrk = ev_rez = "";
for(off = 0; true; )
{
ev_wrk = event.parse(0,"\n",off);
if(!ev_wrk.length) break;
if(ev_wrk == "ws_CombChange:/cw") Cw = cw_value;
else ev_rez += ev_wrk+"\n";
}
event = ev_rez;
"feofankss" wrote:
Почему при привязке к кнопке переменной контроллера логического уровня в режиме "полная связь" по факту получаем связь одностороннюю (состояние кнопки не меняется при смене значения переменной внутри контроллера логического уровня)?
В "Быстром Старте" по факту получается как нужно!
"feofankss" wrote:
К сожалению, чтение документации не пролило свет на данные вопросы.
К сожалению пересказывать документацию, где всё описано, у меня времени нет!
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 20. 05. 2013 [06:58]
|
feofankss
Сергей Костяев
Создатель темы
Зарегистрирован(а) с: 07.05.2013
Сообщения: 16
|
Делаю всё по документации и вашим рекомендациям. В составе виджета bur1 есть 4 кнопки: left, stop, right1, right2. И 4 переменных с такими же именами, к которым привязаны переменные контроллера логического уровня. Во вкладке "Обработка" Язык программы: JavaLikeCalc.JavaScript, период вычисления 50 мс. Код программы:
for(off = 0; true; )
{
ev_cur=Special.FLibSYS.strParse(event,0,"\n",off);
if(!ev_cur.length) break;
//SYS.messErr("TEST","Event: "+ev_cur);
else if( ev_cur == "ws_BtPress:/left") left=true;
else if( ev_cur == "ws_BtPress:/wdg_stop") stop=true;
else if( ev_cur == "ws_BtPress:/wdg_right1") right1=true;
else if( ev_cur == "ws_BtPress:/wdg_right2") right2=true;
else ev_rez += (ev_cur+"\n");
}
event=ev_rez;
Не обрабатывается нажатие ни одной из кнопок. Что я делаю не так?
|
Сообщение создано: 20. 05. 2013 [07:57]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"feofankss" wrote:
Не обрабатывается нажатие ни одной из кнопок. Что я делаю не так?
Что Вы там делаете не так мне отсюда не видно!
Но, если к атрибутам "left" и т.д. выполнена прямая привязка, то указанный скрипт бессмыслен и при полной связи модификация будет идти прямо в привязанный атрибут LogicLev, если он конечно доступен на запись!
Кроме того, в коде обработки событий есть ошибки, как минимум разброд с именами событий.
P.S. Ещё раз повторяю, в ДемоБД масса рабочих примеров с подобным и ещё более сложным — изучайте!
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 20. 05. 2013 [08:12]
|
feofankss
Сергей Костяев
Создатель темы
Зарегистрирован(а) с: 07.05.2013
Сообщения: 16
|
"roman" wrote:
Но, если к атрибутам "left" и т.д. выполнена прямая привязка, то указанный скрипт бессмыслен и при полной связи модификация будет идти прямо в привязанный атрибут LogicLev, если он конечно доступен на запись!
Ну почему же бессмыслен? Мне и нужно, чтобы по нажатию кнопки модифицировался атрибут LogicLev, только вот этого не происходит.
"roman" wrote:
Кроме того, в коде обработки событий есть ошибки, как минимум разброд с именами событий.
Это потому, что я не уверен, как правильно. Я назначил кнопке id=left, в документации используют в этом случае /wdg_left, как источник события. Это правильное использование?
"roman" wrote:
P.S. Ещё раз повторяю, в ДемоБД масса рабочих примеров с подобным и ещё более сложным — изучайте!
Спасибо за ваш труд и за помощь. Но пока не удалось разобраться. Не смог найти аналогичного примера в демобд - дьявол в деталях, о них я Вас и спрашиваю.
|
Сообщение создано: 20. 05. 2013 [08:22]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"feofankss" wrote:
Это потому, что я не уверен, как правильно. Я назначил кнопке id=left, в документации используют в этом случае /wdg_left, как источник события. Это правильное использование?
Так и запишите корректно обработку, а затем раскомментируйте строку "SYS.messErr("TEST","Event: "+ev_cur);", после чего увидите в консоли или сообщениях какие события там идут.
Learn, learn and learn better than work, work and work.
|
Сообщение создано: 20. 05. 2013 [10:02]
|
feofankss
Сергей Костяев
Создатель темы
Зарегистрирован(а) с: 07.05.2013
Сообщения: 16
|
Запустил из консоли, исправил несколько синтаксических ошибок. Получил такую ошибку:
3|/AGLKS/sub_UI/mod_Vision/ | Ошибка открытия: /dev/input/by-path/platform-pcspkr-event-spkr
|
Сообщение создано: 20. 05. 2013 [10:29]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
|
"feofankss" wrote:
Запустил из консоли, исправил несколько синтаксических ошибок. Получил такую ошибку:
3|/AGLKS/sub_UI/mod_Vision/ | Ошибка открытия: /dev/input/by-path/platform-pcspkr-event-spkr
Эта ошибка Вас интересовать не должна, поскольку не касается предмета этой темы.
Learn, learn and learn better than work, work and work.
|