LINUX.ORG.RU

[Tcl][Events] Отследить значение переменной

 ,


0

1

Добрый день, коллеги. Это снова я с Tcl и последовательным портом. Суть такова — имеется устройство, с которым я общаюсь через последовательный порт. Общение идет в режиме «запрос-ответ», в основном ответом являются показания датчиков, которые я расшифровываю и кладу в глобальные переменные. Иногда подается запрос на запись в регистр. Работа реализована через файлэвенты, каркас приведен вот тут . Все прекрасно работает, но есть один нюанс. Мне нужно отслеживать значения некоторых переменных и по достижении ими определенных величин запускать соответствующие функции. Например, есть функции stop_motor и start_motor. Я запускаю двигатель, происходит постоянное чтение показаний датчика усилия, и если переменная force = 100 — я должен вызвать stop_motor. Делал так:

start_motor

while {1} {
    if {$force == 100} {stop_motor; break}
} 

Однако при этом GUI замерзает, а мне это не нужно.

Вроде бы мою задачу можно решить с помощью команды trace — но я пока не въехал в тонкости ее использования. Посоветуйте, пожалуйста, как мне лучше поступить. Заранее спасибо.

где-то так:

proc onchangeforce {name1 name2 op} {
 global force
 if {$force >= 100} {stop_motor}
 }
trace variable force w onchangeforce

в новых версиях tcl добавлен новый синтаксис trace, но и старый будет работать.

а можно и побыдлокодить:

start_motor

while {1} {
    if {$force == 100} {stop_motor; break}
    update
    after 5
} 

тоже не будет замерзать :D

anonymous
()
Ответ на: комментарий от anonymous

где-то так:

Спасибо большое, сейчас попробую.

А можно подробнее растолковать смысл переметров процедуры onchangeforce? Я так понимаю, op — это операция, примененная к трассируемой переменной (read или write). А остальные два параметра? В вики как-то мутновато об этом написано.

а можно и побыдлокодить:

Нет уж, спасибо, в этом случае быдлокодить мне нельзя — слишком ответственная задача :-)

decadent
() автор топика
Ответ на: комментарий от anonymous

где-то так:

Урра, заработало! (с) Матроскин :-)

Спасибо большое!

decadent
() автор топика
Ответ на: комментарий от decadent

> А остальные два параметра?

первый параметр - имя отслеживаемой переменной. второй - используется, если отслеживается целый массив, тогда в первом параметре имя массива, а во втором - индекс конкретного элемента (в который произошла запись, например). ну а третий параметр - правильно, операция.

Нет уж, спасибо, в этом случае быдлокодить мне нельзя — слишком ответственная задача

Да там нормально все будет работать. Только, если я правильно понял контекст задачи, вместо if {$force == 100} надо писать if {$force >= 100} чтобы ненароком не проскочить пороговое значение.

anonymous
()
Ответ на: комментарий от anonymous

первый параметр - имя отслеживаемой переменной. второй - используется, если отслеживается целый массив, тогда в первом параметре имя массива, а во втором - индекс конкретного элемента (в который произошла запись, например). ну а третий параметр - правильно, операция.

Спасибо, теперь понятно.

вместо if {$force == 100} надо писать if {$force >= 100} чтобы ненароком не проскочить пороговое значение

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

decadent
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.