Где Vt - текущая скорость перемещения манипулятора по координате Y;
Dx - расстояние до целевой координаты Yс;
St - тормозной путь, требуемый для снижения текущей скорости до нуля;
Vm - максимальная скорость;
sost - переменная указывающая предыдущее состояние задачи.
Задача GotoY основана на том же алгоритме, что и Sled_Y, и имеет подобную структуру состояний. Отличаются лишь условия переходов из одного состояния в другое. Дело в том, что на этапе калибровки не известно, где конкретно находится выходное звено и сколько нужно пройти до начала координат. А значит рассчитать временные интервалы мы можем только для состояния ускорения, и при дальнейшем движении ориентироваться по сигналам, полученным с датчика снижения скорости и датчика начального положения.
Таким образом, задача принимает следующую структуру:
). Stop. Состояние останова. В это состояние задача переходит при инициализации. Если была дана команда выхода в ноль, то задача переходит в состояние освобождения тормоза BRAKE.
). BRAKE. В этом состоянии задача выжидает время действия тормоза, которое задано по условию. Если предыдущее состояние было STOP(то есть мы начинаем движение), то проверяются сигналы с датчиков, для того чтобы бы определить следующее состояние задачи.
Если сработал датчик снижения скорости (ДСС) и еще не сработал датчик начального положения (ДНП), то задача переходит в состояние движения на малой скорости, которая должна быть задана пользователем.
Если ни один из датчиков не сработал, то задача переходит в состояние разгона ACCEL.
Если оба датчика сработали, то задача переходит в состояние дожима DOGE.
Если же переход в текущее состояние произошел для блокировки тормоза, то переходим в состояние останова.
). ACCEL. Состояние разгона. В этом состоянии происходит наращивание скорости, пока не сработает ДСС или не будет достигнута максимальная скорость. В первом случае произойдет переход в состояние торможения DEACCEL, во втором - в состояние движения на постоянной скорости CONST.
). SMALL_V. В этом состоянии происходит движение на заданной малой скорости, пока не сработает датчик начального положения. Как только сработает датчик, задача перейдет в состояние дожима DOGE.
). DOGE. Дожим. Здесь мы делаем m импульсов на 1-ой скорости и переходим в состояние BACK.
). CONST. В данном состоянии происходит движение на постоянной скорости пока не сработает ДСС, а затем происходит переход в состояние торможения DEACCEL.
). DEACCEL. Состояние торможения. Здесь происходит снижение скорости до заданного минимального значения , а затем переход в состояние SMALL_V.
). BACK. Выход в нулевую позицию. В данном состоянии мы делаем n импульсов назад, для выхода в заданную позицию, устанавливаем значение текущей координаты равной нулю и переходим в состояние блокировки тормоза BRAKE.
В результате получим структуру состояний задачи GotoY, представленную на рисунке 2.5.
Рисунок 2.5 - Структура состояний задачи GotoY
Таблица 2.4 Состояния задачи GotoY
|
№ |
Имя |
Вход |
Действие |
Выход |
|
0 |
InitState |
- |
- |
Ostanovka=1=>sost=STOP |
|
1 |
STOP |
Ostanovka=1 |
- |
sost=BRAKE |
|
2 |
BRAKE |
sost=1 do T_y=1 else T_y=0 Ttek |
T=Ttek+T_y |
DSS_Y=0 or (DSS_Y=1&(DSP_Y=1orDSP_Y=1) |
|
3 |
ACCEL |
Vt,Tt, Vm,A,Yc, Yt |
|
Vt,dt,Ttek |
|
4 |
SMALL_V |
Yt ,Yc A, Ssh,Tt,Vt |
dy=Yc-Yt
St=Ssh*i - тормозной путь |
DSP=1=>sost=DOGE |
|
5 |
DOGE |
DSP=1 |
Stcount=m |
sost=BACK |
|
6 |
CONST |
Yt ,Yc Ai Ssh |
dy=Yc-Yt
St=Ssh*i - тормозной путь |
DSS=1 =>sost=DEACCEL |
|
7 |
DEACCEL |
Yc Yt |
dy=Yc-Yt
Vt=Vi-ai**dt |
Vt=Vmin Sost=SMALL_V |
|
8 |
BACK |
Yt sost=DOGE |
Stcount=n |
Yt=0 sost=BRAKE |
Где Vt - текущая скорость перемещения манипулятора по координате Y;
Dx - расстояние до целевой координаты Yс;
St - тормозной путь, требуемый для снижения текущей скорости до нуля;
Vm- максимальная скорость;
sost - переменная указывающая предыдущее состояние задачи.
Задача ProgControl:
Читает текущую команду пользователя и соответственно с ней изменяет параметры движения и координаты целевой точки.
Имеет следующие состояния:
. Wait_cmd. Состояние ожидания команды оператора. В этом состоянии задача ожидает, пока оператор откроет файл или пока выполняется текущая команда. Как только получена команда разборки следующей строки задача переходит в состояние расчета Calculation.
. Calculation. В этом состоянии задача разбирает
текущую строку команды оператора и извлекает из нее максимальную скорость
целевые координаты и время останова, рассчитывает временные интервалы между
импульсами на каждом шаге разгона. Рассчитав все это, задача переходит в
состояние ожидания Wait_cmd.
3. Проектирование интерфейса СРВ
Интерфейс оператора (пользователя) служит для организации взаимодействия между человеком и системой управления (ОУ). В зависимости от назначения и функций СРВ может быть использован интерфейс оператора различного типа:
- Командный интерфейс. Для отображения информации используются символьные буквенно-цифровые сообщения. Вводимые команды и параметры также представляют наборы символов. Используется алфавитно-цифровой дисплей и клавиатура. Для временного или удалённого подключения к системе может использоваться последовательная линия. Командный интерфейс требует мало ресурсов процессора, ПОРВ на его основе обладают высокой мобильностью.
- Графический интерфейс. Для отображения информации используется как текстовые, так и графические элементы. Для управления используется клавиатура в сочетании с устройством указания. Как правило применяется цветной графический дисплей высокого разрешения с сенсорной панелью. Графический интерфейс требует большое количество ресурсов и затрудняет перенос ПО на другую аппаратную платформу.
- Приборный интерфейс. Информация отображается с помощью дискретных цифровых шкал, световых индикаторов и.т.п. Ввод команд производится с помощью тумблеров, переключателей, верньеров и.т.п. Требует мало ресурсов. Является специализированным.
- Специальный интерфейс. Ввод и вывод информации производится через специальные органы управления. Пример - штурвал самолёта или руль автомобиля. Применяется в специальных условиях.
Окно интерфейса оператора показано на рисунке 3.1
Рисунок 3.1 - Интерфейс оператора СРВ
Форма интерфейса содержит следующие элементы:
1. Элемент MultiText - открытый файл, в котором содержатся координаты точки X,Y, скорость движения двигателя (мм/с), время ожидания перехода к следующей точке.
2. Кнопка Inicializate - сохраняет все введенные оператором данные (Vmax_X, Vmax_Y(m/c); A_x, A_y(m/c2); Ssh_x, Ssh_y(mm)).
. Кнопка Start - при нажатии начинается выполнение задач из файла.
. Кнопка Stop - останавливает выполнение чтения из файла.
. Кнопка GoTo_0X - устанавливает двигатель в начальное положение по
оси Х.
6. Кнопка GoTo_0Y - устанавливает двигатель в начальное положение по
оси Y.
7. Кнопка Otkrit - чтобы открыть файл выполнения программы,
необходимо указать его название и нажать данную клавишу.
8. Vtek_x(m/c), Vtek_y (m/c) - показывает проходящие точки, для достижения заданной точки.
9. X, Y - показывает координаты заданного
положения.
4. Проектирование на основе вычислительной технологии
.1 Выбор аппаратной архитектуры
Для создания управляющей программы СРВ необходимо преобразовать модель
задач-состояний в код управляющего компьютера. Первый шаг в этом направлении -
определить сколько управляющих вычислительных устройств будет в СРВ и составить
перечень задач для каждого из них. Исходя из сложности проектируемой системы
было принято решение использовать в качестве вычислительного устройства -
персональный компьютер на базе процессора х86,на котором реализуются все задачи
управления. Связь с управляемым объектом осуществляется по параллельному порту.
.2 Выбор базового ПО и инструментальных средств
В качестве базового ПО используется ОСРВ QNX 6.2.1. Эта ОСРВ построена по принципам высоконадежной архитектуры на основе микроядра и четко детерминированного механизма обмена сообщениями, в том числе для взаимодействия процессов по сети.
В состав QNX входит также графическая оболочка Photon microGUI для построения встраиваемых приложений с графическим интерфейсом пользователя.
Инструментальные средства, входящие в состав пакета QNX Momentics, включают: редактор, отладчик (в том числе для удалённой отладки), средства построения встраиваемых систем, различные анализаторы, средства разработки интерфейса пользователя, средства управления версиями, компиляторы с различных языков высокого уровня.
При разработке и отладке основного процесса СРВ использовались:
- редактор WorkSpace для создания исходных текстов программы;
- компилятор gcc версии 2.95.2;
- отладчик gdb.
Интерфейс оператора разрабатывался в интегрированной среде Photon Application Builder на основе визуальных компонентов GUI Photon.
.3 Выбор модели процессов-потоков
Все задачи СРВ должны выполняться параллельно. Так как задачи основного процесса выполняются псевдопараллельно (т.е. на одном и том же процессоре), то для организации их параллельного выполнения был применён метод последовательного совместного диспетчера /1/. Такой метод организации прост и универсален.
Все задачи выполняются совместно в одном потоке и в цикле последовательно получают процессор на определенный интервал времени, который определяет программист при написании кода программ. Так как наши самые сложные задачи имеют структуру состояний, этот метод становится удобным для использования в нашем процессе. Каждая задача в текущем цикле находится только в одном состоянии, и исполняться будет только та часть кода, что соответствует данному состоянию.
Однако необходимо позаботиться о том, чтобы в задачах последовательного диспетчера не было блокировок (главным образом, в перемежающихся). Кроме того, такая организация выполнения задач загружает процессор на 100%, что усложняет процесс быстрого взаимодействия с графическим интерфейсом, исполняющимся на том же процессоре.
Как уже говорилось ранее, мы пришли к решению разделения нашей программы на два исполняемых параллельно потока.
Задача интерфейса оператора реализуется в виде главного потока. Во втором потоке реализуется главный цикл программы MainCicle, который представляет собой последовательный диспетчер, в нем последовательно вызываются задачи, определенные нами ранее.
Помимо двух главных существуют дополнительные кратковременные потоки, которые создаются обработчиками событий нажатий управляющих кнопок. Дело в том, что каждый обработчик направляет соответствующие команды в очередь сообщений для основного процесса, и при переполнении очереди сообщений поток с функцией отправки блокируется до момента освобождения достаточного места в очереди. Поэтому во избежание зависания интерфейса (главного потока) данные функции вызываются в дополнительных потоках.
Графическая схема выбранной модели процессов-потоков представлена на
рисунке 4.1.
Рисунок 4.1 - Выбранная модель процессов-потоков
На рисунке показаны два потока:Interface и MainCicle. В главном потоке выполняется сохранение введенных оператором данных, предоставляется оператору возможность задавать настроечные данные: Во втором потоке представлен последовательный диспетчер, который реализует псевдопараллельное выполнение наших задач.
Потоки обмениваются следующими данными: поток Interface передает настроечные данные(settings), координаты целевой точки (Хс,Yc) и команды калибровки; поток MainCicle передает координаты текущей точки(Xt,Yt) и скорости по обеим осям(Vt_x,Vt_y).
5. Разработка ПО РВ
Разработку ПО РВ можно разделить на два этапа:
1. Разработка интерфейса оператора (главный поток).
2. Разработка второго потока, который непосредственно связан с процессом управления.
Обмен данными между потоками и между самими задачами происходит с использованием глобальных переменных, для удобства все глобальные переменные создаются в файле variable.c, который подключается во всех остальных модулях. Этот файл содержит следующие переменные:
Xc,Yc - координаты целевой точки;
Xt,Yt - координаты текущего положения выходного звена;
vihod_0X, vihod_0Y - переменные, указывающие был ли сделан выход в 0 по соответствующим осям. Если выход в 0 был сделан, то этим переменные присваивается значение 1, в противном случае - 0.
Vt_x, Vt_y- текущие значения скоростей по обеим осям.
Ssh_x, Ssh_y, a_x, a_y, Vmax_x, Vmax_y - параметры движения._x- индекс текущего шага в главном массиве
Vm_step_x - номер шага, соответствующий максимальной скорости.
vihod_0X_cmd, vihod_0Y_cmd - переменные, указывающие была ли оператором введена команда выхода в 0._x - массив ,содержащий характеристики движения на каждом шаге. Он имеет следующую структуру:
uint64_t dt_ms - интервал времени между импульсами в мс;
uint64_t dt - интервал времени между импульсами в тактах процессора;
V - скорость.
Ttormoz_ms, Ttormoz - время срабатывания тормоза в мс и в тактах.
Также здесь определены константы, устанавливающие фазные сигналы для шагового двигателя.
const unsigned short int phases_signals_x[4] = {0x08, 0x02, 0x04,0x01} - сигналы для двигателя, подключенного к первым четверым выходам.
Рассмотрим модули главного потока. Они представляют собой обработчики, каких либо событий.
Спецификация этих модулей представлена в таблице 4.1. Рассмотрим подробнее каждый модуль.
1. Модуль createMain. Эта функция вызывается при нажатии на кнопку Start. Здесь создается второй поток MainCicle и создается мьютекс для синхронизации обоих потоков.
2. Модуль ending Вызывается при нажатии на кнопку Stop. Останавливает цикл выполнения задач, присвоив переменной work значение 0.
. Модуль init. Вызывается при нажатии на кнопку Inicializate. Заполняет переменные a_x, Ssh_x, Vmax_x, a_y, Ssh_y,Vmax_y значениями, введенными оператором.
. Модуль GotoX. Вызывается при нажатии на кнопку Goto_0X. В обработчике этого события переменной vihod_0X_cmd присваивается значение 1