PDA

Просмотр полной версии : обработка прерываний


valeraeu
02.03.2020, 19:21
Приветствую всех.
На форуме впервые, поэтому прошу сильно не пинать.
Суть вопроса заключается в следующем, при реализации простейшей программы обработки прерываний например:
signal start_btn $in[277]
signal stop_btn $in[278]
INI
GLOBAL INTERRUPT DECL 3 WHEN stop_btn==true DO pausa ()
PTP_HOME
INTERRUPT ON
INTERRUPT ENABLE
LIN POINT 1
PTP_HOME
END
----------------
def pausa ()
BRAKE F
while $in[277]==false
endwhile
end
в выше приведенном примере все работает, реакция на нажатие кнопок имеется, но как только в программу добавляется сторонняя подпрограмма, находящаяся вне данного программного модуля, прерывание перестает работать, согласно монитора прерываний.
Вопрос состоит в следующем как работать с прерываниями при вызове сторонних подпрограмм с разной глубиной вложения(подпрограмм)

Роботёр
02.03.2020, 20:53
привет! слушай, с прерываниями конечно работал и такой проблемы не наблюдал. давай разбираться. по примеру который ты прислал значит все ок? давай пример, который не работает, посмотрим как там ты что написал (лучше архив конечно сразу). и никакой синтаксической ошибки нет? в какой момент включенное прерывание перестает работать, в момент перехода на подпрограмму прерывания? или как только ты прописал вызов подпрограммы, то сразу ? вот этот момент не понятен конечно.

ProductManager
02.03.2020, 21:17
если в подпрограмме есть папка Ini. то в ней присутствует запись
Global Interrupt Decl 3 When $stopmess==true Do Ir_stopm ( )
измените приоритет своего прерывания с 3 на 10 и ниже.

или сотрите Ini в подпрограммах.

valeraeu
02.03.2020, 21:46
Вот тут вопрос, какой уровень приоритета выбрать, т.к 4,10 и некоторые другие заняты ArcTech, так указано в мануале, да и монитор прерываний показывает 10е занято.
Да, подпрограмма - это отдельный модуль(синтаксически модуль абсолютно рабочий) естественно в нем есть INI, по функционалу модуль отслеживает в цикле while значения портов $in[] и выставляет соответствующие значения портов $out[],проще говоря имитирует работу кнопок основного пульта управления.
signal start_btn $in[277]
signal stop_btn $in[278]
INI
GLOBAL INTERRUPT DECL 3 WHEN stop_btn==true DO pausa ()
PTP_HOME
INTERRUPT ON
INTERRUPT ENABLE
uprav_pulta () ; подпрог-ма вход в которую и вызывает ошибку в работе прерывания,так указывает монитор прерываний
LIN POINT 1
PTP_HOME
END
----------------
def pausa ()
BRAKE F
while $in[277]==false
endwhile
end

valeraeu
02.03.2020, 21:55
если в подпрограмме есть папка Ini. то в ней присутствует запись
Global Interrupt Decl 3 When ==true Do Ir_stopm ( )
измените приоритет своего прерывания с 3 на 10 и ниже.

или сотрите Ini в подпрограммах.

Т.е, я правильно понял, в модуле можно просто удалить INI и все?

Роботёр
03.03.2020, 07:22
Выбери любой, который не занят - при возникновении одновременно нескольких прерываний сначала обрабатывается прерывания с наивысшем приоритетом. Приоритеты 3, 40-80 заняты системой - их не используй. А так можно выбирать любой, на мой взгляд оптимально работать в диапазоне 20-30.
ProductManager полностью прав. В твоем примере используется INTERRUPT 3, который уже занят. Из-за этого и происходит конфликт. Ini в подпрограмме можно удалить, но в основной то программе формуляр INI тоже останется. Лучше выбрать просто другой приоритет.

valeraeu
03.03.2020, 07:41
Да, Вы абсолютно правы, просто произошло интересное совпадение, причем дважды, изначально мной был установлен приоритет 10, но он как оказалось зарезервирован ArcTech (прерыв. 4,7,8,9,10,11,12,13,17).Я решил - если диапазон автоматического распределения системой от 40 до 80, то я ничего не нарушаю и установил приоритет 3, как оказалось неверно.
На данный момент указал приоритет 5, и в подпрограмме которая вызывается при наступлении события в прерывании удалил INI, т.к генерировался аварийный останов.
Теперь все работает.
p.s. не допустив таких ошибок, я не изучил бы вопрос более глубоко.

Роботёр
03.03.2020, 07:47
удачи! productmanager - красавчик. я не сразу обратил на это внимание