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

Составной виджет. Не отрабатывает взаимодействие кнопок с контроллером логического уровня.


Автор Сообщение
Сообщение создано: 08. 05. 2013 [10:44]
feofankss
Сергей Костяев
Создатель темы
Зарегистрирован(а) с: 07.05.2013
Сообщения: 16
Здравствуйте. По тестовой задаче создал небольшой шаблон:
JAVASCRIPT
// 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
Сообщения: 3747
"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
Хорошо. Тогда буду задавать более конкретные уточняющие вопросы. Я так понял, обработку событий виджета нужно делать во вкладке "Обработка", в поле "Программа". Поправьте, если ошибаюсь. Там есть поле "период вычисления", значит ли это, что не нужно дополнительно указывать бесконечный цикл и/или циклическое выполнение, вроде:
JAVASCRIPT
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
Сообщения: 3747
"feofankss" wrote:

Хорошо. Тогда буду задавать более конкретные уточняющие вопросы. Я так понял, обработку событий виджета нужно делать во вкладке "Обработка", в поле "Программа".

http://wiki.oscada.org/Doc/QuickStart#h988-19

"feofankss" wrote:

Там есть поле "период вычисления", значит ли это, что не нужно дополнительно указывать бесконечный цикл и/или циклическое выполнение, вроде:
JAVASCRIPT
if((tm_cnt-=1/f_frq) <= 0)  //Декремент
{
    tm_cnt = 10; //Установка счётчика в значение 10 секунд
    //Выполнение других действий с периодичностью 10 секунд
}


http://wiki.oscada.org/Doc/QuickStart#h988-26

"feofankss" wrote:

Необходимые к обработке события нужно указывать в поле "обработка событий" составного виджета и/или дочерних виджетов?

Для операций со страницами - да, для остального в тексте программы, взято из "Быстрого Старта":
JAVASCRIPT
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 мс. Код программы:
JAVASCRIPT
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
Сообщения: 3747
"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
Сообщения: 3747
"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
Запустил из консоли, исправил несколько синтаксических ошибок. Получил такую ошибку:
JAVASCRIPT
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
Сообщения: 3747
"feofankss" wrote:

Запустил из консоли, исправил несколько синтаксических ошибок. Получил такую ошибку:
JAVASCRIPT
3|/AGLKS/sub_UI/mod_Vision/ | Ошибка открытия: /dev/input/by-path/platform-pcspkr-event-spkr


Эта ошибка Вас интересовать не должна, поскольку не касается предмета этой темы.

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



16496