СТА 2/2010

где больше подходят почтовый ящик и система сообщений. Если при передаче данных драйверу воспользоваться системой сообщений почтового ящика, то нужна будет до полнительная обработка. Вероятно, нужно обработать все сообщения и, со ответственно, пересчитать результат как суперпозицию информации, кото рая находится в них. А делать это при дётся уже после получения данных. Лучше готовить данные заранее, а по сигналу системного таймера (сигналим семафором из прерывания) сразу начи нать обмен. Это позволит сделать жёст ким системный цикл и перенести сложную обработку данных в код с меньшими требованиями к быстродей ствию. Данные от драйвера пульта потоку ин терфейса с пользователем лучше переда вать в виде сообщений, ведь пока опера тор не произвёл никаких действий, не нужна и ответная реакция. Потоком регулятора положения луч ше управлять при помощи семафора, так как его необходимо запускать регу лярно. Данные для этого потока логично передавать в виде сообщений. В этом случае семафор – синхронизирующий элемент, а почтовый ящик используется только как механизм передачи данных. Интерпретатор нужен лишь тогда, когда требуется разобрать команду, ко торая поступит от интерфейса с пользо вателем, а значит, этим потоком лучше управлять при помощи очереди сообще ний и почтового ящика. Запуск интерполятора нужно произво дить при перемещении рабочего органа станка. Такое перемещение может быть результатом выполнения технологичес кой программы или работы программы электроавтоматики станка. Данные для интерполятора удобно передавать в виде очереди сообщений, этой же очередью удобно синхронизировать его работу. В коде это будет выглядеть так, как показано в листинге 3. О ПИСАНИЕ СЧПУ «Ф ЕНИКС », СПРОЕКТИРОВАННОЙ НА ОСНОВЕ O N T IME RTOS 32 По описанным принципам в НПО «Рубикон Инновация» была разрабо тана система ЧПУ «Феникс». Упро щённая структурная схема этой систе мы показана на рис. 2. 70 СТА 2/2010 РАЗ РА БОТ КИ / МАШИНОС Т РОЕ НИЕ www.cta.ru ЛИСТИНГ 1 void RTKAPI threadInterpolator(void*) { while(true) { // выполнение работы ... } } void taskControl(void) { // инициализация данных ... RTKTaskHandle handleInterpolator = RTKRTLCreateThread( // тело threadInterpolator, // приоритет INTERPOLATOR_PRIORITY, // размер стека. Если 0 размер стека // определяется настройками системы 0, // после создания поток "спит" TF_SUSPENDED, // параметр, который передается в тело потока NULL, // имя потока "Thread interpolator"); RTKResume(handleInterpolator); ... RTKSuspend(handleInterpolator); ... } ЛИСТИНГ 2 RTKSemaphore semaphoreInterpolator; void RTKAPI threadInterpolator(void*) { while(true) { RTKWait(semaphoreInterpolator); // выполнение работы ... } } void taskControl(void) { // инициализация данных ... semaphoreInterpolator = RTKCreateSemaphore( ST_EVENT, 0, "Interpolator control"); RTKTaskHandle handleInterpolator = RTKRTLCreateThread( // тело threadInterpolator, // приоритет INTERPOLATOR_PRIORITY, // размер стека. В данном случае 0 // размер стека определяется настройками системы 0, // после создания поток сразу работает 0, // параметр, который передается в тело потока NULL, // имя потока "Thread interpolator"); // запуск потока RTKSignal(semaphoreInterpolator); ... // "просьба" потоку остановиться. // остановится поток только в начале цикла RTKResetEvent(semaphoreInterpolator); } Драйвер пульта управления Драйверы модулей управления приводами Драйверы модулей электроавтоматики Драйверы (поток) Ожидание семафора Ожидание семафора Очередь сообщений Очередь сообщений Очередь сообщений Очередь сообщений Очередь сообщений Очередь сообщений Системный таймер (событие бинарного семафора) Модуль электроавтоматики (поток) Команды электроавтоматике станка Сообщения об ошибках Интерфейс пользователя СЧПУ (поток) Интерпретатор (поток) Данные для перемещения Кадры технологи+ ческой программы Данные для перемещения на один системный такт Регулятор положения (поток) Контроль состояния СЧПУ (поток) Интерполятор (поток) Буфер данных Буфер данных Рис. 2. Структурная схема системы СЧПУ «Феникс», построенной на базе On Time RTOS 32 © СТА-ПРЕСС

RkJQdWJsaXNoZXIy MTQ4NjUy