Разработка системы управления механической системы в режиме мягкого реального времени

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

Введение

1. Техническое задание

2. Техническое проектирование СРВ

2.1 Разработка диаграммы задач

2.1.1 Operator_IF

2.1.2 ProgControl

2.1.3 Sled_X

2.1.4 Sled_Y

2.1.5 GotoX

2.1.6 GotoY

2.1.7 PWM_Task

2.1.8 InTask

2.1.9 OutTask

2.2 Разработка структуры состояний задач

3. Проектирование интерфейса СРВ

4. Проектирование на основе вычислительной технологии

4.1 Выбор аппаратной архитектуры

4.2 Выбор базового ПО и инструментальных средств

4.3 Выбор модели процессов-потоков

5. Разработка П О РВ

6. Отладка П О РВ

Заключение

Список использованных источников

Приложения

Введение

реальный время управление интерфейс

Система реального времени (СРВ) — компьютерная система управления или сбора информации, обеспечивающая предоставление (расчёт) верных управляющих (запрошенных) данных за необходимый интервал времени. Вне зависимости от числа, порядка наступления и временных соотношений внешних событий (срабатывание датчиков, изменение режима пользователем и т. п.) время реакции СРВ будет находиться в заданном допустимом диапазоне.

Общие положения по СРВ:

1) Система управления (СУ) и, в частности, её программная часть должна быть построена так, чтобы исключить неконтролируемые задержки, блокировки и.т.п. в любых возможных ситуациях. Процесс управления должен быть четко детерминирован.

2) Необходимо правильно оценить требуемое абсолютное быстродействие СУ на основе изучения и моделирования объекта управления — для того, чтобы выбрать аппаратную платформу с нужным быстродействием, предусмотреть устройства предварительной обработки, произвести разделение вычислительной нагрузки между несколькими устройствами, оптимизировать программы по быстродействию.

3) Задачи управления в реальном времени возникают в основном при управлении механическими или энергетическими объектами — т. е. там, где временные характеристики определяются физической природой.

4) Применение СРВ характерно для определённого диапазона временных интервалов. Их быстродействие всегда ниже аппаратных цифровых или аналоговых устройств. Если управление не критично по времени, то необходимо обеспечить надёжность СРВ.

5) Необходимо правильно оценить стоимости ошибки (управления).

Принято различать системы мягкого (soft) и жесткого (hard) реального времени. В системах жесткого реального времени неспособность обеспечить реакцию на какие-либо события в заданное время ведет к отказам и невозможности выполнения поставленной задачи. Системами мягкого реального времени называются системы, не попадающие под определение «жесткие», т.к. в литературе четкого определения для них пока нет. Системы мягкого реального времени могут не успевать решать задачу, но это не приводит к отказу системы в целом. В системах реального времени необходимо введение некоторого директивного срока (в англоязычной литературе — deadline), до истечения которого задача должна обязательно (для систем мягкого реального времени — желательно) выполниться.

Данная работа посвящена разработке системы управления МС в режиме мягкого реального времени. Согласно принятой модели, разработка СРВ включает следующие два основных этапа:

1) Техническое проектирование системы — описание процесса управления как совокупности взаимодействующих процессов. Осуществляется на основе изучения и моделирования объекта управления (ОУ). Техническое описание является программно-независимым.

2) Проектирование на основе вычислительной технологии — реализация результатов технического проектирования в виде конкретных программно-аппаратных средств, позволяющих обеспечить требуемые технические характеристики с учётом существующих ограничений.

В связи с учебным характером СРВ в данной работе не включаются этапы исследования, описания или моделирования ОУ. Вся необходимая информация уже сформирована на этапе технического задания.

1. Техническое задание

Разработать программное обеспечение, работающее в режиме реального времени (ПОРВ) и выполняющее функции системы управления мехатронным объектом.

Объект управления — манипулятор с 2-мя степенями подвижности. Каждая степень подвижности представляет собой электромеханический модуль, в котором выходное звено перемещается относительно входного звена с помощью электропривода, включающего:

1) Электродвигатель постоянного тока или шаговый.

2) Датчик начального положения (НП), формирующий сигнал лог. 1, когда выходное звено находится на расстоянии менее или равном 1 мм от начала координат (входного звена) и сигнал лог.0 при любом другом расстоянии.

3) Датчик снижения скорости (СК) для шагового двигателя, формирующий сигнал лог. 1, когда выходное звено находится на расстоянии менее или равном 1 мм от датчика, и сигнал лог.0 при любом другом расстоянии.

4) Электромагнитный фрикционный тормоз, фиксирующий положение выходного звена относительно входного звена, пока на вход усилителя электромагнита подан сигнал лог. 0, и разрешающий движение выходного звена при подаче на вход сигнала лог.1. Время переключения механизма тормоза задано по варианту задания.

Шаговый двигатель управляется за счёт последовательного включения-выключения обмоток фаз, причём направление движения определяется порядком переключения, а скорость — частотой переключения.

Для правильной работы объекта управления, необходимо при включении питания выполнить процедуру 'калибровки', или 'привязки к 0', датчика положения или счётчика шагов шагового двигателя.

Каждый привод осуществляет независимое перемещение в заданное положение с заданной скоростью. В процессе движения на первом участке скорость движения увеличивается до максимальной, затем на втором участке остаётся постоянной и наконец на третьем участке уменьшается до нуля. При этом ускорение на участке разгона и торможения должно изменяться по 'треугольному' закону. При малых перемещениях 2-ой участок траектории отсутствует, а максимальная скорость может быть меньше заданной.

Система управления (СУ) мехатронного объекта предназначена для выполнения программного управления перемещением. Перед началом работы оператор должен выбрать одну из заранее подготовленных программ работы мехатронной системы. Эта программа должна включать команды трёх типов:

1) Команда на перемещение (задаются координаты конечной точки X, Y в мм).

Команды задания максимальной скорости (задаётся максимальная скорость перемещения Vmax в мм/сек).

Команды временной остановки (задаётся время остановки в сек).

Программа может быть просмотрена, запущена на исполнение и выполняться, приостановлена, выполнена по одному шагу, начата с начала.

ПОРВ должно поддерживать интерфейс оператора: на дисплее должна показываться информация о текущем состоянии: координате, скорости текущем шаге программы и.т.п. В качестве устройства указания и ввода информации могут использоваться как стандартные устройства компьютера: клавиатура, мышь, джойстик так и устройства ввода, подключаемые к устройству связи с объектом (УСО).

Исходные данные:

Тип двигателя 1: шаговый;

Тип управления двигателем 1: униполярный полушаговый;

Тип двигателя 2: шаговый;

Тип управления двигателем 2: биполярный полушаговый;

Режим разгона: треугольный;

Максимальная скорость: 0,5 м/с;

Дискретность: 0,1 мм;

Время срабатывания тормоза: 0,3 с;

Основная функция: программное управление.

2. Техническое проектирование СРВ

2.1 Разработка диаграммы задач

Объект управления представляет собой сложный механизм, состоящий из нескольких комплексов элементов, которые работают независимо друг от друга. Поэтому целесообразно выделить в составе единого процесса управления мехатронной системой несколько задач, независимых друг от друга, но связанных между собой каналами передачи данных.

В результате исследований объекта управления мы разбили весь процесс управления на три уровня иерархии и выделили шесть задач.

2.1.1 Operator_IF

Задача представляет собой визуальный интерфейс для удобного взаимодействия с оператором. По сути дела, это единственная задача, с которой оператор может каким-либо образом взаимодействовать. Так как по заданию мы реализуем программное управление, именно OP будет загружать и обрабатывать сценарии выполнения действий, а затем в структурированном виде посылать команды обработчику.

Функции данной задачи следующие:

— загрузка и проверка на наличие ошибок сценариев работы;

— структурирование и отправка команд по специальному каналу интерпретатору команд;

— отображение параметров текущего состояния ОУ;

— предоставление оператору визуальных средств для удобного управления МС.

Входными данными для задачи OP являются сценарии работы МС в виде загружаемых файлов, а также действия оператора, регистрируемые посредством визуальных компонентов ввода. Со стороны основного процесса поступают данные о текущих координатах Xc и Yc, а также мгновенной скорости каждого двигателя Vx и Vy.

В качестве выходных данных служит структура, содержащая номер команды и необходимые аргументы.

Так как задача OP создана для взаимодействия с человеком, она находится на высоком уровне иерархии и является перемежающейся.

2.1.2 ProgControl

Является посредником между задачей оператора и задачами управления скоростями двигателей. Задача ProgControl интерпретирует поступившие от задачи OP команды и устанавливает в соответствии с ними соответствующие параметры для задач более низкого уровня. В ответ ProgControl отправляет данные о текущем состоянии МС.

Входные данные:

— со стороны задачи оператора — структура, содержащая номер команды и аргументы;

— со стороны задач среднего уровня — текущие координаты Xc и Yc, а также значения мгновенной скорости каждого двигателя Vx и Vy.

Выходные данные:

— в сторону среднего уровня — целевые координаты Xt и Yt, максимальная скорость на данном участке Vm и время остановки Ts.

— в сторону задачи оператора — структура, содержащая данные о текущих координатах Xc и Yc, а также мгновенной скорости каждого двигателя Vx и Vy.

Данная задача также является перемежающейся, но вследствие высокой частоты отправки текущих данных задаче оператора она требует достаточно большое процессорное время. Так как она работает на одном уровне с задачей оператора, но со стороны процесса управления МС, мы отнесли ProgControl к задачам высокого уровня иерархии.

2.1.3 Sled_X

Задача управления скоростью ШД1. Предназначена для управления скоростью вращения ШД1 и текущей координатой выходного звена по оси X.

Функции:

— расчет временных интервалов каждого из режимов движения;

— расчет мгновенных значений ускорения, скорости, координаты X;

— формирование сигналов на выводах блока ввода-вывода к обмоткам ШД1;

— управление фрикционным тормозом по координате X;

— выдержка времени стоянки.

Входными данными задачи являются целевая координата Xt, максимальная скорость на данном участке Vm и время остановки Ts.

Выходными данными являются значения состояний фрикционного тормоза B0 по координате X и сигналы на выводы блока ввода-вывода, обозначенные как массив из четырех выходов.

Расчет временных характеристик производится с использованием типов данных с плавающей точкой, поэтому задача очень требовательна к машинному времени и относится к непрерывным задачам.

2.1.4 Sled_Y

Задача управления скоростью ШД2. Предназначена для управления скоростью вращения ШД2 и текущей координатой выходного звена по оси Y.

Функции:

— расчет временных интервалов каждого из режимов движения;

— расчет мгновенных значений ускорения, скорости, координаты Y;

— формирование сигналов на выводах параллельного порта к обмоткам ШД2;

— управление фрикционным тормозом по координате Y;

— выдержка времени стоянки.

Входными данными задачи являются целевая координата Yt, максимальная скорость на данном участке Vm и время остановки Ts.

Выходными данными являются значения состояний фрикционного тормоза B1 по координате Y и сигналы на выводы параллельного порта, обозначенные как массив из четырех выходов.

Расчет временных характеристик производится с использованием типов данных с плавающей точкой, поэтому задача очень требовательна к машинному времени и относится к непрерывным задачам.

2.1.5 GotoX

Задача выхода в ноль выходного звена по координате X. Напоминает задачу управления скоростью ШД1 Sled_X. Однако в отличие от последней объект движется только в отрицательном направлении и переходит в режим торможения и останова согласно сигналам датчика снижения скорости и датчика начального положения, а не временных интервалов. Когда значение сигнала датчика начального положения устанавливается в единицу, считается, что выходное звено находится в начале координат и текущая координата Xc обнуляется.

Входные данные:

— значение датчика начального положения для координаты X PSP0.

Выходные данные:

— значение состояния фрикционного тормоза B0 по координате X;

— сигналы на выводах блока ввода-вывода к обмоткам ШД1.

2.1.6 GotoY

Задача выхода в ноль выходного звена по координате Y. Напоминает задачу управления скоростью ШД2 Sled_Y. Однако в отличие от последней объект движется только в отрицательном направлении и переходит в режим торможения и останова согласно сигналам датчика снижения скорости и датчика начального положения, а не временных интервалов. Когда значение сигнала датчика начального положения устанавливается в единицу, считается, что выходное звено находится в начале координат и текущая координата Yc обнуляется.

Входные данные:

— значение датчика начального положения для координаты Y PSP1.

Выходные данные:

— значение состояния фрикционного тормоза B1 по координате Y;

— сигналы на выводах параллельного порта к обмоткам ШД2.

Задача I/O в нашем случае отсутствует, так как остальные задачи среднего и низкого уровней взаимодействуют с устройством ввода/вывода напрямую, формируя готовые сигналы, которые впоследствии нужно только усилить.

2.1.7 PWM_Task

Задача ШИМ модуляции. На вход задачи поступает ширина импульса, и данная задача включает/выключает сигнал, поступающие на ДПТ.

2.1.8 InTask

Задача получения данных от устройства ввода/вывода.

2.1.9 OutTask

Данная задача передает данные устройству ввода/вывода.

Таким образом, описанные задачи составляют комплекс управления МС. И теперь на основе всего вышесказанного мы можем построить диаграмму задач системы управления мехатронным объектом. Диаграмма задач представлена на рисунке 2.1.

Рисунок 2.1 — Диаграмма задач системы управления мехатронным объектом

2.2 Разработка структуры состояний задач

Многие задачи СРВ могут быть структурированы в соответствии с моделью состояний. Тогда все операции в составе одной задачи можно разделить по группам, соответствующим состояниям процесса, выделенным по определенным критериям и представить всю задачу в виде конечного автомата. Так как наш процесс управляет движением, целесообразным было бы в качестве таких критериев принять характеристики движения — ускорение и скорость.

В нашем процессе мы выделили шесть задач, которые имеют структуру состояний. Это — задачи управления скоростью. В общем случае, в движении выходного звена можно выделить три состояния: ускорение, равномерное движение, торможение. Рассмотрим каждую задачу.

Как уже говорилось, задача Sled_X ответственна за расчет временных характеристик и координат движения ШД1. Так как Привод с ШД не имеет обратной связи, вся траектория должна рассчитываться до начала движения. Расчет характеристик движения осуществляется при помощи мгновенного значения времени и независящего от него параметра. Так как по заданию ускорение изменяется по треугольному закону, то этим параметром можно считать модуль производной от ускорения k.

В задаче Sled_X можно выделить следующие состояния:

1). STOP. Состояние ожидания действий. В это состояние задача переходит при инициализации. В нем проверяется выполнение выхода в ноль по обеим координатам. Если выход в ноль сделан, то проверяется условие движения, а именно разница между текущей и целевой координатами по оси X. Если условие выполняется, то задача переходит в состояние освобождения тормоза BRAKE.

2). BRAKE. В этом состоянии задача выжидает время действия тормоза, которое задано по условию, и затем переходит в состояние ускорения либо останова.

3). ACCEL. Состояние ускорения. В этом состоянии происходит разгон, то есть увеличение текущей скорости до максимальной. Так как система следящая, и пользователь может в любой момент времени изменить координаты целевой точки, то мы должны учитывать эти изменения введенные пользователем. В данном состоянии мы рассчитываем разницу между текущей и целевой координатами по оси X (dx).

Далее проверяются условия перехода в другие состояния.

Если перемещение dx не совпадает по направлению с текущей скоростью или dx по модулю меньше или равно пути, требуемого для снижения текущей скорости до нуля, то происходит переход в состоянии DEACCEL. Если же уже набрана максимальная скорость и не выполняется условия перехода в состояние DEACCEL, то происходит переход в состояние движения на постоянной скорости CONST. Если же не происходит переходов в состояния DEACCEL и CONST, то мы остаемся в текущем состоянии и рассчитываем следующие параметры:

— интервал времени между импульсами, то есть время необходимое для того чтобы произошло перемещение, равное одному шагу двигателя.

, (1. 1)

где — текущая скорость;

-ускорение;

Ускорение изменяется по треугольному закону. Мы задаем количество шагов необходимых для достижения заданной максимальной скорости n. Тогда ускорение растет, пока не наступит шаг номер n/2, затем происходит снижение ускорения до нуля.

, если i? n/2

, если i> n/2

— длина шага.

— значение текущей скорости, по истечении времени dt

(1. 2)

— тормозной путь- путь необходимый для снижения текущей скорости до нуля. St=

— время окончания dt

TendStep=Ttek+dt

Затем устанавливаются сигналы на шаговый двигатель BSM_x[4] и задача ждет пока пройдет время dt, рассчитанное раннее.

4). CONST. Состояние движения на постоянной скорости. В этом состоянии мы вычисляем dx, и проверяем нужно ли переходить в состояние снижения скорости. Если этого не требуется, то мы рассчитываем параметры: dt, Vt, St и т. д. Формируем сигналы на шаговый двигатель и ожидаем окончания рассчитанного времени dt.

5). DECCEL. Состояние торможения. В этом состоянии рассчитываем dx и проверяем условия переходов в состояния ACCEL, CONST. Если направления скорости и перемещения совпадают, перемещение по модулю больше тормозного пути и текущая скорость меньше максимальной, то переходим в состояние наращивания скорости, если же скорость равна максимальной, то переходим в состояние движения на постоянной скорости.

Если не выполняются предыдущие условия, то если текущая скорость равна нулю, переходим в состояние блокировки тормоза BRAKE.

В противном случае рассчитываем параметры движения, формируем сигналы на порты управления шаговым двигателем и ожидаем окончания времени dt.

В результате описания структуры получим конечный автомат состояний задачи Sled_x, представленный на рисунке 2.2.

Рисунок 2.2 — Структура состояний задачи Sled_X

Таблица 2.1. Состояния задачи Sled_X

Имя

Вход

Действие

Выход

0

InitState

-

-

sost=STOP_SX

1

STOP_SX

-

Xt, Yt=0

sost=BRAKE_SX

2

BRAKE_SX

-

TendT=Tt+Ttormoz

sost=STOP_SX

sost=ACCEl_SX

3

ACCEL_SX

Vi, A, Xt, Xc

Vi+1=Vi+ai*dt

sost=CONST_SX

sost=DEACCEL_SX

sost=ACCEL_SX

4

CONST_SX

Xt, Xc Ai Ssh

dx=Xc-Xt

St=Ssh*i

Vt=Vi+ai*dt

sost=DEACCEL_SX

5

DEACCEL_SX

Xc Xt

dx=Xc-Xt

Vt=Vi-ai**dt

sost=BRAKE_SX

sost=DEACCEL_SX

6

STEP_SX

Tt

Vi

Ai

Ssh

TendStep=Tt+dt

sost=CONST_SX

sost=DEACCEL_SX

sost=ACCEL_SX

Где Vt — текущая скорость перемещения манипулятора по координате Y;

Dx — расстояние до целевой координаты Xс;

St — тормозной путь, требуемый для снижения текущей скорости до нуля;

Vm — максимальная скорость;

sost — переменная указывающая предыдущее состояние задачи.

Задача GotoX основана на том же алгоритме, что и Sled_X, и имеет подобную структуру состояний. Отличаются лишь условия переходов из одного состояния в другое. Дело в том, что на этапе калибровки не известно, где конкретно находится выходное звено и сколько нужно пройти до начала координат. А значит рассчитать временные интервалы мы можем только для состояния ускорения, и при дальнейшем движении ориентироваться по сигналам, полученным с датчика снижения скорости и датчика начального положения.

Таким образом, задача принимает следующую структуру:

1). STOP. Состояние останова. В это состояние задача переходит при инициализации. Если была дана команда выхода в ноль, то задача переходит в состояние освобождения тормоза BRAKE.

2). BRAKE. В этом состоянии задача выжидает время действия тормоза, которое задано по условию. Если предыдущее состояние было STOP (то есть мы начинаем движение), то проверяются сигналы с датчиков, для того чтобы бы определить следующее состояние задачи.

Если сработал датчик снижения скорости (ДСС) и еще не сработал датчик начального положения (ДНП), то задача переходит в состояние движения на малой скорости, которая должна быть задана пользователем.

Если ни один из датчиков не сработал, то задача переходит в состояние разгона ACCEL.

Если оба датчика сработали, то задача переходит в состояние дожима DOGE.

Если же переход в текущее состояние произошел для блокировки тормоза, то переходим в состояние останова.

3). ACCEL. Состояние разгона. В этом состоянии происходит наращивание скорости, пока не сработает ДСС или не будет достигнута максимальная скорость. В первом случае произойдет переход в состояние торможения DEACCEL, во втором — в состояние движения на постоянной скорости CONST.

4). SMALL_V. В этом состоянии происходит движение на заданной малой скорости, пока не сработает датчик начального положения. Как только сработает датчик, задача перейдет в состояние дожима DOGE.

5). DOGE. Дожим. Здесь мы делаем m импульсов на 1-ой скорости и переходим в состояние BACK.

6). CONST. В данном состоянии происходит движение на постоянной скорости пока не сработает ДСС, а затем происходит переход в состояние торможения DEACCEL.

7). DEACCEL. Состояние торможения. Здесь происходит снижение скорости до заданного минимального значения, а затем переход в состояние SMALL_V.

8). BACK. Выход в нулевую позицию. В данном состоянии мы делаем n импульсов назад, для выхода в заданную позицию, устанавливаем значение текущей координаты равной нулю и переходим в состояние блокировки тормоза BRAKE.

В результате получим структуру состояний задачи Goto0_X, представленную на рисунке 2.3.

Рисунок 2.3 — Структура состояний задачи GotoX

Таблица 2.2 Состояния задачи GotoX

Имя

Вход

Действие

Выход

0

InitState

-

-

Ostanovka=1=> sost=STOP

1

STOP

Ostanovka=1

-

sost=BRAKE

2

BRAKE

sost=1 do T_x=1 else

T_x=0

Tt

T=Tt+T_x

DSS_X=0 or (DSS_X=1& (DSP_X=1orDSP_X=1)

3

ACCEL

Vt, Tt,

Vm, A, Xc, Xt

Vt, dt, Ttek

4

SMALL_V

Xt, Xc Ai Ssh, Tt, Vt

dx=Xc-Xt

St=Ssh*i

Vt=Vi+ai*dt

DSP=1=> sost=DOGE

5

DOGE

DSP=1

Stcount=m

sost=BACK

6

CONST

Xt, Xc Ai Ssh

dx=Xc-Xt

St=Ssh*i

Vt=Vi+ai*dt

DSS=1 => sost=DEACCEL

7

DEACCEL

Xc Xt

dx=Xc-Xt

Vt=Vi-ai**dt

Vt=Vmin

Sost=SMALL_V

8

BACK

Xt

sost=DOGE

Stcount=n

Xt=0

sost=BRAKE

Где Vt — текущая скорость перемещения манипулятора по координате Y;

Dx — расстояние до целевой координаты Xс;

St — тормозной путь, требуемый для снижения текущей скорости до нуля;

Vm — максимальная скорость;

sost — переменная указывающая предыдущее состояние задачи.

Как уже говорилось, задача Sled_Y ответственна за расчет временных характеристик и координат движения ШД2. Так как Привод с ШД не имеет обратной связи, вся траектория должна рассчитываться до начала движения. Расчет характеристик движения осуществляется при помощи мгновенного значения времени и независящего от него параметра. Так как по заданию ускорение изменяется по треугольному закону, то этим параметром можно считать модуль производной от ускорения k.

В задаче Sled_Y можно выделить следующие состояния:

1). READY. Состояние ожидания действий. В это состояние задача переходит при инициализации. В нем проверяется условие движения, а именно разница между текущей и целевой координатами по оси Y. Если условие выполняется, рассчитываются временные интервалы для каждого состояния движения:

T2=Tr/2

Sr=T2*Vm

Tconst=(S-2*Sr)/Vm

k=Vm/T2/T2,

где Tr — время разгона/торможения (устанавливается в соответствии с оборудованием);

T2 — период времени, по истечении которого k поменяет знак в ускоренном режиме;

Sr — путь, который пройдет выходное звено на этапе ускорения/торможения;

S — общий путь;

Vm — заданная максимальная скорость на пути;

k — производная ускорения.

Рассчитав данные характеристики, задача переходит в состояние освобождения тормоза BRAKE.

2). BRAKE. В этом состоянии задача выжидает время действия тормоза, которое задано по условию, и затем переходит в состояние ускорения либо останова.

3). ACCEL. Состояние ускорения. В этом состоянии ускорение в течение первого периода T2 растет, в течение второго — уменьшается до нуля. Расчет ускорения, скорости и координаты ведется по итерационным формулам:

a=k*t, если t< =T2

a=-k*t+Tr*k, если t> T2

v=v0+(a+a0)/2*(t-t0)

y=y0+(v0+a*(t-t0)/2)*(t-t0),

где a — мгновенное ускорение;

t — время от начала состояния;

t0 — момент времени прошлого расчета;

v — мгновенная скорость;

v0 — начальная скорость;

y — расчетное значение текущей координаты;

y0 — начальная координата.

При достижении очередного целого значения y задача производит шаг выходного звена в нужном направлении. По истечении времени Tr задача переходит в состояние CONST.

4). CONST. В этом состоянии параметр k и ускорение равны нулю, а скорость постоянная, что соответствует равномерному движению. Поэтому в этом состоянии рассчитывается только текущая координата:

y=y0+v0*(t-t0).

При достижении очередного целого значения x задача производит шаг выходного звена в нужном направлении. По истечении времени Tconst с момента вхождения в состояние задача переходит в состояние DECCEL.

При малых перемещениях выходного звена данное состояние должно было бы игнорироваться. Однако для упрощения условий перехода между состояниями задача обязательно пройдет через данное состояние, возможно и не сделав ни одного шага в нём.

5). DECCEL. Состояние торможения. В этом состоянии ускорение в течение первого периода T2 уменьшается, в течение второго — растет до нуля. Расчет ускорения, скорости и координаты ведется по следующим итерационным формулам:

a=-k*t, если t< =T2

a=k*t-Tr*k, если t> T2

v=v0+(a+a0)/2*(t-t0)

y=y0+(v0+a*(t-t0)/2)*(t-t0)

где t — время с момента перехода в состояние.

При достижении очередного целого значения y задача производит шаг выходного звена в нужном направлении. По истечении времени Tr с момента перехода в состояние задача переходит в состояние блокировки тормоза BRAKE.

6). WAIT. Состояние останова. В этом состоянии задача выдерживает заданное время остановки Tstop и переходит в состояние READY.

В результате описания структуры получим конечный автомат состояний задачи Sled_Y, представленный на рисунке 2.4.

Рисунок 2.4 — Структура состояний задачи Sled_Y

Таблица 2.3. Состояния задачи Sled_Y

Имя

Вход

Действие

Выход

0

InitState

-

-

sost=STOP_SY

1

STOP_SY

-

Yt=0

sost=BRAKE_SY

2

BRAKE_SY

-

TendT=Tt+ Ttormoz

sost=STOP_SY

sost=ACCEl_SY

3

ACCEL_SY

Vi, Ai, Yt, Yc

Vi+1=Vi+ai*dt

sost=CONST_SY

sost=DEACCEL_SY

sost=ACCEL_SY

4

CONST_SY

Yt, Yc Ai Ssh

dy=Yc-Yt

St=Ssh*i

Vt=Vi+ai*dt

sost=DEACCEL_SY

5

DEACCEL_SY

Yc Yt

dy=Yc-Yt

Vt=Vi-ai**dt

sost=BRAKE_SY

sost=DEACCEL_SY

6

STEP_SY

Tt

Vi

Ai

Ssh

TendStep=Tt+dt

sost=CONST_SY

sost=DEACCEL_SY

sost=ACCEL_SY

Где Vt — текущая скорость перемещения манипулятора по координате Y;

Dx — расстояние до целевой координаты Yс;

St — тормозной путь, требуемый для снижения текущей скорости до нуля;

Vm — максимальная скорость;

sost — переменная указывающая предыдущее состояние задачи.

Задача GotoY основана на том же алгоритме, что и Sled_Y, и имеет подобную структуру состояний. Отличаются лишь условия переходов из одного состояния в другое. Дело в том, что на этапе калибровки не известно, где конкретно находится выходное звено и сколько нужно пройти до начала координат. А значит рассчитать временные интервалы мы можем только для состояния ускорения, и при дальнейшем движении ориентироваться по сигналам, полученным с датчика снижения скорости и датчика начального положения.

Таким образом, задача принимает следующую структуру:

1). Stop. Состояние останова. В это состояние задача переходит при инициализации. Если была дана команда выхода в ноль, то задача переходит в состояние освобождения тормоза BRAKE.

2). BRAKE. В этом состоянии задача выжидает время действия тормоза, которое задано по условию. Если предыдущее состояние было STOP (то есть мы начинаем движение), то проверяются сигналы с датчиков, для того чтобы бы определить следующее состояние задачи.

Если сработал датчик снижения скорости (ДСС) и еще не сработал датчик начального положения (ДНП), то задача переходит в состояние движения на малой скорости, которая должна быть задана пользователем.

Если ни один из датчиков не сработал, то задача переходит в состояние разгона ACCEL.

Если оба датчика сработали, то задача переходит в состояние дожима DOGE.

Если же переход в текущее состояние произошел для блокировки тормоза, то переходим в состояние останова.

3). ACCEL. Состояние разгона. В этом состоянии происходит наращивание скорости, пока не сработает ДСС или не будет достигнута максимальная скорость. В первом случае произойдет переход в состояние торможения DEACCEL, во втором — в состояние движения на постоянной скорости CONST.

4). SMALL_V. В этом состоянии происходит движение на заданной малой скорости, пока не сработает датчик начального положения. Как только сработает датчик, задача перейдет в состояние дожима DOGE.

5). DOGE. Дожим. Здесь мы делаем m импульсов на 1-ой скорости и переходим в состояние BACK.

6). CONST. В данном состоянии происходит движение на постоянной скорости пока не сработает ДСС, а затем происходит переход в состояние торможения DEACCEL.

7). DEACCEL. Состояние торможения. Здесь происходит снижение скорости до заданного минимального значения, а затем переход в состояние SMALL_V.

8). 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 — тормозной путь

Vt=Vi+ai*dt

DSP=1=> sost=DOGE

5

DOGE

DSP=1

Stcount=m

sost=BACK

6

CONST

Yt, Yc Ai Ssh

dy=Yc-Yt

St=Ssh*i — тормозной путь

Vt=Vi+ai*dt

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:

Читает текущую команду пользователя и соответственно с ней изменяет параметры движения и координаты целевой точки.

Имеет следующие состояния:

1. Wait_cmd. Состояние ожидания команды оператора. В этом состоянии задача ожидает, пока оператор откроет файл или пока выполняется текущая команда. Как только получена команда разборки следующей строки задача переходит в состояние расчета Calculation.

2. 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)).

3. Кнопка Start — при нажатии начинается выполнение задач из файла.

4. Кнопка Stop — останавливает выполнение чтения из файла.

5. Кнопка GoTo_0X — устанавливает двигатель в начальное положение по

оси Х.

6. Кнопка GoTo_0Y — устанавливает двигатель в начальное положение по

оси Y.

7. Кнопка Otkrit — чтобы открыть файл выполнения программы,

необходимо указать его название и нажать данную клавишу.

8. Vtek_x (m/c), Vtek_y (m/c) — показывает проходящие точки, для достижения заданной точки.

9. X, Y — показывает координаты заданного положения.

4. Проектирование на основе вычислительной технологии

4.1 Выбор аппаратной архитектуры

Для создания управляющей программы СРВ необходимо преобразовать модель задач-состояний в код управляющего компьютера. Первый шаг в этом направлении — определить сколько управляющих вычислительных устройств будет в СРВ и составить перечень задач для каждого из них. Исходя из сложности проектируемой системы было принято решение использовать в качестве вычислительного устройства -- персональный компьютер на базе процессора х86, на котором реализуются все задачи управления. Связь с управляемым объектом осуществляется по параллельному порту.

4.2 Выбор базового ПО и инструментальных средств

В качестве базового ПО используется ОСРВ QNX 6.2.1. Эта ОСРВ построена по принципам высоконадежной архитектуры на основе микроядра и четко детерминированного механизма обмена сообщениями, в том числе для взаимодействия процессов по сети.

В состав QNX входит также графическая оболочка Photon microGUI для построения встраиваемых приложений с графическим интерфейсом пользователя.

Инструментальные средства, входящие в состав пакета QNX Momentics, включают: редактор, отладчик (в том числе для удалённой отладки), средства построения встраиваемых систем, различные анализаторы, средства разработки интерфейса пользователя, средства управления версиями, компиляторы с различных языков высокого уровня.

При разработке и отладке основного процесса СРВ использовались:

— редактор WorkSpace для создания исходных текстов программы;

— компилятор gcc версии 2. 95. 2;

— отладчик gdb.

Интерфейс оператора разрабатывался в интегрированной среде Photon Application Builder на основе визуальных компонентов GUI Photon.

4.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 — параметры движения.

indexstep_x- индекс текущего шага в главном массиве

Vm_step_x — номер шага, соответствующий максимальной скорости.

vihod_0X_cmd, vihod_0Y_cmd — переменные, указывающие была ли оператором введена команда выхода в 0.

mainmass_x — массив, содержащий характеристики движения на каждом шаге. Он имеет следующую структуру:

uint64_t dt_ms — интервал времени между импульсами в мс;

uint64_t dt — интервал времени между импульсами в тактах процессора;

V — скорость.

Ttormoz_ms, Ttormoz — время срабатывания тормоза в мс и в тактах.

Также здесь определены константы, устанавливающие фазные сигналы для шагового двигателя.

const unsigned short int phases_signals_x[4] = {0×08, 0×02, 0×04,0×01} - сигналы для двигателя, подключенного к первым четверым выходам.

Рассмотрим модули главного потока. Они представляют собой обработчики, каких либо событий.

Спецификация этих модулей представлена в таблице 4.1. Рассмотрим подробнее каждый модуль.

1. Модуль createMain. Эта функция вызывается при нажатии на кнопку Start. Здесь создается второй поток MainCicle и создается мьютекс для синхронизации обоих потоков.

2. Модуль ending Вызывается при нажатии на кнопку Stop. Останавливает цикл выполнения задач, присвоив переменной work значение 0.

3. Модуль init. Вызывается при нажатии на кнопку Inicializate. Заполняет переменные a_x, Ssh_x, Vmax_x, a_y, Ssh_y, Vmax_y значениями, введенными оператором.

4. Модуль GotoX. Вызывается при нажатии на кнопку Goto_0X. В обработчике этого события переменной vihod_0X_cmd присваивается значение 1

5. Модуль GotoY. Вызывается при нажатии на кнопку Goto_0Y. В обработчике этого события переменной vihod_0Y_cmd присваивается значение 1

6. Модуль Openfile. Открывает файл с командами и записывает его содержимое в переменную program, которая представляет собой указатель на строку.

7. Модуль Start. Разрешает задаче ProgControl начать выполнение команд оператора.

8. Модуль Stop. Останавливает выполнение команд оператора.

Теперь рассмотрим разработку второго — основного потока, который непосредственно выполняет задачи управления движением.

Разработка велась по методике /1/, согласно которой каждая задача, имеющая структуру состояний программируется как отдельная Cи-функция. Для обмена данными между задачами используются глобальные переменные. Если имеется необходимость настройки некоторой задачи, т. е выполнения каких либо действий, касающихся этой задачи до начала или после окончания ей работы, для этой задачи программируются функции инициализации и окончания работы. Все функции и данные, относящиеся к задаче, помещаются в c-файл. В соответствующем заголовочном h-файле объявляются функции и переменные, используемые в других частях программы. Спецификация модулей СРВ представлена в таблице 4.1. Листинги программного кода функций основного процесса приведены в приложении А.

Для того чтобы использовать меньше машинного времени в процессе выполнения движения, мы пришли к решению: рассчитать характеристики движения на этапе инициализации и занести их в определенный массив, тем самым в основном цикле для управления ШД мы будем обращаться к данному массиву.

Главная функция c-программы состоит из трёх секций:

1. Секция инициализации, в которой вызываются функции инициализации тех задач, для которых они предусмотрены. Среди таких функций:

— InOutTask_init () — инициализация портов ввода/вывода;

Так же в этом разделе происходит инициализация переменных, используемых в задачах;

Это функция рассчитывает характеристики движения по формулам (1. 1),(1. 2) на каждом шаге в процессе разгона и заносит их в массивы mainmass_x и mainmass_y. Они имеют следующую структуру:

uint64_t dt_ms — интервал времени между импульсами в мс;

uint64_t dt — интервал времени между импульсами в тактах процессора;

V — скорость.

Также здесь происходит инициализация глобальных переменных, если это необходимо.

2. Основной цикл, в котором поочерёдно вызываются функции каждой задачи. Выход из цикла контролируется специальной переменной work.

3. Секция завершения, в которой вызываются функции завершения:

— InOutTask_close () — завершение работы портов ввода/вывода;

— Save () — сохранение записей в файле log. dat;

Для тестирования программы создается файл log. dat, в котором записываются переходы каждой задачи из одного состояния в другое и сохраняются моменты времени этих переходов. Тем самым, использую данный файл, мы сможем проанализировать работу нашей программы, сможем определить, насколько приближенны реальные характеристики движения (интервалы времени, скорость, ускорения) к своим рассчитанным значениям.

Каждая функция задачи программируется по определённому шаблону /4/. Для задачи должны быть определены: набор уникальных имён состояний и уникальный идентификатор задачи. Для каждого состояния программируются три секции:

— секция входа, в которой программируются действия, выполняемые при входе задачи в состояние;

— секция действия, в котором программируется содержательная часть работы в данном состоянии; секция перехода, в которой проверяются условия и выполняются действия, связанные с переходом в следующее состояние.

6. Отладка П О РВ

При запуске программы производится чтение из файла. Для проверки

правильности работы программы мы смотрим файл Log. dat. Переход состояний происходит согласно диспетчеру состояний.

Рисунок 6.1 — Программа в рабочем состоянии.

Заключение

В ходе выполнения данной работы были рассмотрены и применены при разработке ПО РВ основные принципы и метода проектирования систем реального времени.

На этапе технического проектирования были выделены и описаны задачи будущей СРВ в соответствии с конструктивными и функциональными особенностями объекта управления, после чего была построена диаграмма задач, в которой размещены все задачи проектируемой СРВ и указаны каналы связи между ними. Для каждой задачи была подробно рассмотрена специфика процесса управления, на основании которой была построена структура задач. Для задач, не имеющих структуру состояний, были изложены алгоритмы в текстовой форме.

В результате проделанной работы были сформулированы конкретные требования к каждой из задач для будущего проектирования с привязкой к вычислительной технологии и разработки ПО РВ.

Список использованных источников

1. Управляющие программы для механических систем: объектно-ориентированное проектирование систем реального времени/ Д. М. Ослэндер, Дж.Р. Риджли, Дж.Д. Ринггенберг; Пер. с англ. — М.: БИНОМ. Лаборатория знаний, 2004.

2. Операционная система реального времени QNX от теории к практике / С. Зыль. — СПб.: БХВ-Санкт-Петербург, 2004 г.

3. Введение в QNX/Neutrino-2. Руководство для разработчиков приложений реального времени. / Р. Кёртен, К. Херборт; Пер. с англ. — СПб.: Петрополис. Санкт-Петербург, 2001 г.

Приложения

А.1 Листинг кода задачи Main_cicle.

void* work_thread (void* arg)

{

int i;

double timed;

double vardt;

FILE *fp;

i=1;

mainmass_x[0]. V=0;

mainmass_x[0]. St=0;

mainmass_x[0]. dt=0;

mainmass_x[0]. dt_ms=0;

mainmass_y[0]. V=0;

mainmass_y[0]. St=0;

mainmass_y[0]. dt=0;

mainmass_y[0]. dt_ms=0;

fp = fopen («log1. dat», «w»);

while (mainmass_x[i-1]. V<=Vmax_x) {

//while (i< 4) {

vardt=(-mainmass_x[i-1]. V+sqrt (mainmass_x[i-1]. V*mainmass_x[i-1]. V+2*a_x*Ssh_x))/a_x;

mainmass_x[i]. dt_ms=round (vardt*1000);

timed=vardt*1000;

mainmass_x[i]. dt=SYSPAGE_ENTRY (qtime)->cycles_per_sec *vardt;

mainmass_x[i]. V=mainmass_x[i-1]. V+a_x*vardt;

mainmass_x[i]. St=i*Ssh_x;

fprintf (fp,"dt: %d n", mainmass_x[i]. dt_ms);

fprintf (fp," V_x: %f n", mainmass_x[i]. V);

i=i+1;

}

Vm_step_x=i-1;

fprintf (fp," a_x: %f n", a_x);

fprintf (fp," Vmaxindexstep: %d n", Vm_step_x);

fprintf (fp," Vmax_x: %f n", Vmax_x);

fprintf (fp," Ssh_x: %f n", Ssh_x);

fprintf (fp," Vmaxx_x: %f n", mainmass_x[Vm_step_x]. V);

fclose (fp);

i=1;

fp = fopen («log2. dat», «w»);

while (mainmass_y[i-1]. V<=Vmax_y) {

//while (i< 4) {

vardt=(-mainmass_y[i-1]. V+sqrt (mainmass_y[i-1]. V*mainmass_y[i-1]. V+2*a_y*Ssh_y))/a_y;

mainmass_y[i]. dt_ms=round (vardt*1000);

timed=vardt*1000;

mainmass_y[i]. dt=SYSPAGE_ENTRY (qtime)->cycles_per_sec *vardt;

mainmass_y[i]. V=mainmass_y[i-1]. V+a_y*vardt;

mainmass_y[i]. St=i*Ssh_y;

fprintf (fp,"dt: %d n", mainmass_y[i]. dt_ms);

fprintf (fp," V_y: %f n", mainmass_y[i]. V);

i=i+1;

}

Vm_step_y=i-1;

fprintf (fp," a_y: %f n", a_y);

fprintf (fp," Vmaxindexstep: %d n", Vm_step_y);

fprintf (fp," Vmax_y: %f n", Vmax_y);

fprintf (fp," Ssh_y: %f n", Ssh_y);

fprintf (fp," Vmaxx_y: %f n", mainmass_y[Vm_step_y]. V);

fclose (fp);

// if (fp ≠ NULL)

// for (i=0; i <= Vm_step_x; i++)

trace_init (1 000 000);

// инициализация задач

if (InOutTask_init () ≠ 0) { return -1; };

if (sled_x_init () ≠ 0) {return -1; }

if (goto_0X_init () ≠ 0) {return -1; }

work = 1;

while (work)

{

InTask (); // Задача ввода входных данных

sled_x ();

// task3();

goto_0X ();

sled_y ();

goto_0Y ();

OutTask (); // Задача вывода выходных данных

};

putoutbuf (0);

OutTask ();

//деинициализация задач

if (InOutTask_close () ≠0) {return -1; };

// сохраним протокол работы системы

Save ();

return (0);

}

int

main_cicle (PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo)

{

pthread_attr_t attr;

/* eliminate 'unreferenced' warnings */

widget = widget, apinfo = apinfo, cbinfo = cbinfo;

pthread_attr_init (& attr);

pthread_attr_setdetachstate (& attr, PTHREAD_CREATE_DETACHED);

pthread_create (NULL, & attr, & work_thread, NULL);

pthread_mutex_init (& mutex, NULL);

return (Pt_CONTINUE);

}

А.2 Листинг кода задачи Sled_X

int sled_x (void)

{

static FILE *fp1;

unsigned short int temp;

// переменные состояний

static int STATE = INITSTATE; // текущее состояние задачи

static int NEXTSTATE = STOP_Sx; // следующее состояние задачи (если задача не изменила своё состояние, то =-1 Если на данном просмотре она не меняет своего состояния, то NextStatee=-1*/;

static int RUNENTRY; // признак выполнения секции входа для данного состояния

static int phase=1;

//интервалы

static uint64_t dt; // временной интервал между шагами в тактах

// Переменные

static uint64_t TendStep; // время окончания шага в тактах

static uint64_t TendT; // время окончания срабатывания тормоза в тактах

static int sost; //

static int64_t dx;

if (NEXTSTATE ≠ -1) // задача изменила своё состояние

{

logE (TASKID, STATE, NEXTSTATE); // зарегистрируем это событие

STATE = NEXTSTATE;

NEXTSTATE = -1;

RUNENTRY = 1;

}

else RUNENTRY = 0;

switch (STATE)

{

case STOP_Sx:

// секция входа

if (RUNENTRY) {

};

if ((vihod_0X==1) & & (vihod_0Y==1)) {

// //printf («xtn%dn», Xt);

// //printf («xcn%dn», Xc);

dx=Xc-Xt;

if (dx≠0) {

Vt_x=0;

NEXTSTATE = BRAKE_Sx;

sost=STOP_Sx;

}

}

break;

case BRAKE_Sx:

// секция входа

if (RUNENTRY) {

if (sost==STOP_Sx)

setpin (num_Tx);

temp = getoutbuf () & phases_mask_x;

putoutbuf (temp else

clrpin (num_Tx);

temp = getoutbuf () & phases_mask_x;

putoutbuf (temp

TendT=ClockCycles ()+Ttormoz;

}

if (ClockCycles () > =TendT) {

if (sost==STOP_Sx) {

if (dx==1) {NEXTSTATE=STEP_Sx;} else {

NEXTSTATE =ACCEL_Sx; }

} else {NEXTSTATE =STOP_Sx; }

}

break;

case ACCEL_Sx:

// секция входа

if (RUNENTRY) {

};

dx=(Xc-Xt);

if (((dx> 0) & & (Vt_x< 0)) || ((dx< 0) & & (Vt_x> 0))) {NEXTSTATE=DEACCEL_Sx; }

if (abs (dx)< =indexstep_x) {NEXTSTATE=DEACCEL_Sx; }

else {

indexstep_x=indexstep_x+1;

dt=mainmass_x[indexstep_x]. dt; //v taktah

if (dx>0) { if (++phase > 4) { phase = 1; }; };

if (dx<0) { if (--phase < 1) { phase = 4; }; };

temp = getoutbuf () & phases_mask_x;

ПоказатьСвернуть
Заполнить форму текущей работой