Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2020, 19:21   #1
valeraeu
Новичок
 
Регистрация: 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
в выше приведенном примере все работает, реакция на нажатие кнопок имеется, но как только в программу добавляется сторонняя подпрограмма, находящаяся вне данного программного модуля, прерывание перестает работать, согласно монитора прерываний.
Вопрос состоит в следующем как работать с прерываниями при вызове сторонних подпрограмм с разной глубиной вложения(подпрограмм)
valeraeu вне форума   Ответить с цитированием
Старый 02.03.2020, 20:53   #2
Роботёр
Гуру
 
Регистрация: 20.12.2017
Сообщения: 708
Сказал Спасибо: 18
Сказали Спасибо 142 раз(а) в 135 сообщении
По умолчанию

привет! слушай, с прерываниями конечно работал и такой проблемы не наблюдал. давай разбираться. по примеру который ты прислал значит все ок? давай пример, который не работает, посмотрим как там ты что написал (лучше архив конечно сразу). и никакой синтаксической ошибки нет? в какой момент включенное прерывание перестает работать, в момент перехода на подпрограмму прерывания? или как только ты прописал вызов подпрограммы, то сразу ? вот этот момент не понятен конечно.
Роботёр вне форума   Ответить с цитированием
Старый 02.03.2020, 21:17   #3
ProductManager
Гуру
 
Регистрация: 15.03.2014
Сообщения: 145
Сказал Спасибо: 0
Сказали Спасибо 18 раз(а) в 15 сообщении
По умолчанию

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

или сотрите Ini в подпрограммах.
ProductManager вне форума   Ответить с цитированием
Эти2 пользователи сказал Спасибо ProductManager за это сообщение:
valeraeu (03.03.2020), Роботёр (03.03.2020)
Старый 02.03.2020, 21:46   #4
valeraeu
Новичок
 
Регистрация: 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
valeraeu вне форума   Ответить с цитированием
Старый 02.03.2020, 21:55   #5
valeraeu
Новичок
 
Регистрация: 02.03.2020
Сообщения: 9
Сказал Спасибо: 2
Сказали Спасибо 1 раз(а) в 1 сообщении
По умолчанию

Сообщение от ProductManager Посмотреть сообщение
если в подпрограмме есть папка Ini. то в ней присутствует запись
Global Interrupt Decl 3 When ==true Do Ir_stopm ( )
измените приоритет своего прерывания с 3 на 10 и ниже.

или сотрите Ini в подпрограммах.
Т.е, я правильно понял, в модуле можно просто удалить INI и все?
valeraeu вне форума   Ответить с цитированием
Старый 03.03.2020, 07:22   #6
Роботёр
Гуру
 
Регистрация: 20.12.2017
Сообщения: 708
Сказал Спасибо: 18
Сказали Спасибо 142 раз(а) в 135 сообщении
По умолчанию

Выбери любой, который не занят - при возникновении одновременно нескольких прерываний сначала обрабатывается прерывания с наивысшем приоритетом. Приоритеты 3, 40-80 заняты системой - их не используй. А так можно выбирать любой, на мой взгляд оптимально работать в диапазоне 20-30.
ProductManager полностью прав. В твоем примере используется INTERRUPT 3, который уже занят. Из-за этого и происходит конфликт. Ini в подпрограмме можно удалить, но в основной то программе формуляр INI тоже останется. Лучше выбрать просто другой приоритет.
Роботёр вне форума   Ответить с цитированием
cказали "Спасибо" Роботёр за это сообщение:
valeraeu (03.03.2020)
Старый 03.03.2020, 07:41   #7
valeraeu
Новичок
 
Регистрация: 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. не допустив таких ошибок, я не изучил бы вопрос более глубоко.
valeraeu вне форума   Ответить с цитированием
Старый 03.03.2020, 07:47   #8
Роботёр
Гуру
 
Регистрация: 20.12.2017
Сообщения: 708
Сказал Спасибо: 18
Сказали Спасибо 142 раз(а) в 135 сообщении
По умолчанию

удачи! productmanager - красавчик. я не сразу обратил на это внимание
Роботёр вне форума   Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +2, время: 01:43.

vBulletin v3.6.2, Copyright ©2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co