02.03.2020, 19:21
|
#1
|
Новичок
Регистрация: 02.03.2020
Сообщения: 9
Сказал Спасибо: 2
Сказали Спасибо 1 раз(а) в 1 сообщении
|
обработка прерываний
Приветствую всех.
На форуме впервые, поэтому прошу сильно не пинать.
Суть вопроса заключается в следующем, при реализации простейшей программы обработки прерываний например:
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
|
#2
|
Гуру
Регистрация: 20.12.2017
Сообщения: 708
Сказал Спасибо: 18
Сказали Спасибо 142 раз(а) в 135 сообщении
|
привет! слушай, с прерываниями конечно работал и такой проблемы не наблюдал. давай разбираться. по примеру который ты прислал значит все ок? давай пример, который не работает, посмотрим как там ты что написал (лучше архив конечно сразу). и никакой синтаксической ошибки нет? в какой момент включенное прерывание перестает работать, в момент перехода на подпрограмму прерывания? или как только ты прописал вызов подпрограммы, то сразу ? вот этот момент не понятен конечно.
|
|
|
|
02.03.2020, 21:17
|
#3
|
Гуру
Регистрация: 15.03.2014
Сообщения: 145
Сказал Спасибо: 0
Сказали Спасибо 18 раз(а) в 15 сообщении
|
если в подпрограмме есть папка Ini. то в ней присутствует запись
Global Interrupt Decl 3 When $stopmess==true Do Ir_stopm ( )
измените приоритет своего прерывания с 3 на 10 и ниже.
или сотрите Ini в подпрограммах.
|
|
|
Эти2 пользователи сказал Спасибо ProductManager за это сообщение:
|
|
|
02.03.2020, 21:46
|
#4
|
Новичок
Регистрация: 02.03.2020
Сообщения: 9
Сказал Спасибо: 2
Сказали Спасибо 1 раз(а) в 1 сообщении
|
Вот тут вопрос, какой уровень приоритета выбрать, т.к 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
|
|
|
|
02.03.2020, 21:55
|
#5
|
Новичок
Регистрация: 02.03.2020
Сообщения: 9
Сказал Спасибо: 2
Сказали Спасибо 1 раз(а) в 1 сообщении
|
Сообщение от ProductManager
|
если в подпрограмме есть папка Ini. то в ней присутствует запись
Global Interrupt Decl 3 When ==true Do Ir_stopm ( )
измените приоритет своего прерывания с 3 на 10 и ниже.
или сотрите Ini в подпрограммах.
|
Т.е, я правильно понял, в модуле можно просто удалить INI и все?
|
|
|
|
03.03.2020, 07:22
|
#6
|
Гуру
Регистрация: 20.12.2017
Сообщения: 708
Сказал Спасибо: 18
Сказали Спасибо 142 раз(а) в 135 сообщении
|
Выбери любой, который не занят - при возникновении одновременно нескольких прерываний сначала обрабатывается прерывания с наивысшем приоритетом. Приоритеты 3, 40-80 заняты системой - их не используй. А так можно выбирать любой, на мой взгляд оптимально работать в диапазоне 20-30.
ProductManager полностью прав. В твоем примере используется INTERRUPT 3, который уже занят. Из-за этого и происходит конфликт. Ini в подпрограмме можно удалить, но в основной то программе формуляр INI тоже останется. Лучше выбрать просто другой приоритет.
|
|
|
cказали "Спасибо" Роботёр за это сообщение:
|
|
|
03.03.2020, 07:41
|
#7
|
Новичок
Регистрация: 02.03.2020
Сообщения: 9
Сказал Спасибо: 2
Сказали Спасибо 1 раз(а) в 1 сообщении
|
Да, Вы абсолютно правы, просто произошло интересное совпадение, причем дважды, изначально мной был установлен приоритет 10, но он как оказалось зарезервирован ArcTech (прерыв. 4,7,8,9,10,11,12,13,17).Я решил - если диапазон автоматического распределения системой от 40 до 80, то я ничего не нарушаю и установил приоритет 3, как оказалось неверно.
На данный момент указал приоритет 5, и в подпрограмме которая вызывается при наступлении события в прерывании удалил INI, т.к генерировался аварийный останов.
Теперь все работает.
p.s. не допустив таких ошибок, я не изучил бы вопрос более глубоко.
|
|
|
|
03.03.2020, 07:47
|
#8
|
Гуру
Регистрация: 20.12.2017
Сообщения: 708
Сказал Спасибо: 18
Сказали Спасибо 142 раз(а) в 135 сообщении
|
удачи! productmanager - красавчик. я не сразу обратил на это внимание
|
|
|
|
Опции темы |
Поиск в этой теме |
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +2, время: 05:15.
|
|