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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    528,11 Кб
  • Опубликовано:
    2014-03-02
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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














КУРСОВАЯ РАБОТА

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

Введение

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

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

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

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

Основой проектируемого устройства является микроконтроллер. Применение микроконтроллеров в последнее время нашло широкое применение, так как он в своем составе содержит все необходимое для проектирования практически любой системы автоматического управления различными объектами (память, АЦП, таймера и так далее.). Использование микроконтроллеров в системах управления обеспечивает достижение высоких показателей эффективности при относительно низкой стоимости. Это объясняет массовое применение различных микроконтроллеров в самых различных областях промышленности. Более двух третей мирового рынка микропроцессорных средств составляют именно микроконтроллеры.

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

1. Анализ технологического процесса

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

Физический метод неразрушающего контроля (или их совокупность), близкий к идеальному решению, должен удовлетворять следующим требованиям:

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

локальность контроля 10-4 -10-6 m;

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

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

определение долговечности и остаточного ресурса, основных локальных усталостных (предел выносливости) и прочностных (предел текучести) характеристик на уровне зерен (10-4 -10-5 m) и фрагментов
 (10-6 m).

Однако ни один из вышеприведенных методов не удовлетворяет ни сейчас, ни в перспективе вышеуказанным требованиям. Ближе всего к идеальному решению находится неразрушающий ультразвуковой (у. з.) метод обратного рассеяния с помощью электромагнитного (ЭМА) и иммерсионного у.з. преобразователей на частотах заполнения 10-100 MHz.

В нашем случае применяется второй вариант, где пъезопреобразователь, работающий в совмещённом режиме излучения - приёма, позволяет получить распределение коэффициент затухания у. з. волн d a по глубине образца (до 10-1 m) и в конечном итоге построить акустическую кривую усталости (АКУ) - зависимость d a от числа циклов N (рис. 1.1).

Рисунок 1.1 - Зависимость коэффициента затухания ультразвуковых волн d a от числа циклов

моделирование прецедент технологический программный

Для этого разработана и опробована установка на базе испытательной машины УП50. Внешний вид установки изображен на рисунке 2.2. Устройство установки представлено на рисунке 2.3.

Рисунок 1.2 - Общий вид установки для усталостных испытаний стальных образцов с применением неразрушающего контроля

Рисунок 1.3 - Конструкция (схема) экспериментальной установки

Установка состоит из двух колеблющихся масс 2, установленных на пружинах 3, которые закреплены на основании 1. В одной из масс находится закреплённый на валу эксцентрик 6, который приводится во вращение двигателем 8 посредством гибкой связи 7. Скорость вращения вала двигателя регулируется реостатом 9. Исследуемый образец 5 крепится клиновым распором между массами. На испытуемый образец устанавливается локальная иммерсионная ванна 4, в которой крепится у.з. пъезопреобразователь. Габариты стола установки 850 x 1200 мм.

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

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

Для введения у. з. волн в образец использована локальная иммерсионная ванна с плоской поверхностью контакта 48x30 мм.

В качестве средства регистрации использован ультразвуковой дефектоскоп УД2-12 с комплектом преобразователей на 10 МГц. На этапе опытного образца установки перевод аналогового сигнала на экран монитора компьютера производится с помощью цифрового фотоаппарата. Для полупромышленных установок этот перевод можно произвести с помощью АЦП-плат российского или западного производства.

В качестве критерия остаточного ресурса использован критерий нулевого остаточного ресурса. Этот критерий связан с максимумом акустической кривой усталости при числе циклов Nmax, где начинается объединение микротрещин в магистральную трещину. При N >Nmax образец или деталь уже не подлежит восстановлению и может привести к аварии в реальной конструкции.

При N <Nmax деталь может быть восстановлена путём «залечивания» микротрещин с помощью ряда методов ОМД.

Объектом автоматизации является сама установка по определению остаточного ресурса изделия.

Автоматизируются такие стадии технологического процесса как:

задание очередности скоростей работы установки;

загрузка шаблона задания из файла;

сбор и хранение данных с установки;

работа с сохраненными данными.

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

2. Статическое моделирование

.1 Прецеденты

Имя прецедента: Отслеживание состояний программы.

Актер: Пользователь.

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

Описание:

После запуска программы таймер 1 вырабатывает событие с определенным интервалом. А обработчик этого события проверяет состояние программы.

Если пользователь находится в режиме работы «опыт» то обработчик события таймера 1, показывает пользователю меню этого режима. А так же проверяет состояние создания файла базы данных, задание на проведение опыта. Если хоть один из этих пунктов не выполняется, то блокирует кнопку старта опыта.

Альтернатива:

Если пользователь находится в режиме работы «Анализ» обработчик события таймера 1, показывает пользователю меню режима «Анализ». И проверяет, загружена ли база данных, если база данных загружена или импортирована из опыта, то разблокирует кнопки работы с базой данных.

Прецеденты для режима работы «опыт»

Имя прецедента: Загрузить, создать задание для установки.

Сводка: Пользователь загружает или задает задание для установки.

Актер: Пользователь.

Предусловие: Установка не работает, задание отсутствует.

Описание:

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

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

Альтернативы:

Если пользователь не может загрузить задание, либо у него нет подготовленного ранее задания, то он задает задание в ручную, заполняя таблицу задания.

Если задание отсутствует то кнопка «старт» блокируется.

Постусловие:

Задано задание для установки.

Имя прецедента: создать новый файл (новый тех процесс).

Сводка: Пользователь создает новый файл базы данных для проведения опыта.

Актер: Пользователь.

Предусловие: на установке не проводится опыт.

Описание:

По нажатию кнопки «новый файл» обработчик события нажатия кнопки генерирует событие, которое открывает диалоговое окно «создания нового файла базы данных».

Альтернативы:

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

Если нет созданной базы данных для сохранения опыта, то кнопка старт блокируется.

Постусловие: создана база данных для сохранения опыта.

Имя прецедента: Запустить опыт.

Актеры: Пользователь.

Предусловие: Была создана база данных для записи в нее данных опыта, а так же получено задание для установки.

Описание:

После нажатия кнопки «старт» обработчик события передает установке задание работы, разблокирует кнопки «стоп» и «пауза». Следующий шаг работы выше указанного события - это запуск таймера 2, который вырабатывает событие, которое определяет конец выполнения задания, записи данных с опыта в базу данных и передача последующего задания установке. Эта процедура повторяется до тех пор, пока установка не отработает все задания, после чего приводит установку в исходное состояние, сохраняет данные в базу данных и закрывает ее, после чего отключает таймер 2, и блокирует кнопки «старт», «пауза», «стоп».

Альтернатива:

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

После нажатия кнопки «продолжить» установка и все остальные элементы возвращаются в рабочее состояние.

Если была нажата кнопка «стоп», то работа установки останавливается, а таймер записывает данные сохраненные до этого момента и время, прошедшее с начала задания до времени нажатия кнопки «стоп» и закрывает базу, а также разблокирует кнопку «очистить базу», и блокирует кнопки «старт», «пауза», «стоп».

Имя прецедента: Проверка подключения микро контролера.

Актеры: Пользователь

Предусловие: Программа была запущена, данные инициализируется.

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

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

Альтернатива: Контролер отсоединён и ввод, вывод данных невозможен.

Постусловие: Проведение опыта и запись данных в файл.

Имя прецедента: Очистить базу данных.

Актеры: Пользователь.

Зависимость: «была нажата кнопка стоп»

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

Описание:

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

Альтернатива:

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

Прецеденты для режима работы «анализ»

Имя прецедента: импорт базы данных с опыта.

Актер: Пользователь.

Предусловие: Был проведен опыт.

Описание:

Пользователем была нажата клавиша «Текущая Б.Д.», обработчик которой разблокировал кнопки работы с базой данных.

Альтернатива: В случае ошибки импорта базы выдается окно с сообщением об ошибке.

Постусловие: была импортирована база только что проведенного опыта.

Имя прецедента: загрузка базы данных из старого опыта.

Актер: Пользователь.

Предусловие: Ранее были проведены опыты, и которые надо проанализировать.

Описание:

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

Альтернатива:

Пользователь не загрузил базу данных, либо загрузил поврежденный файл вследствие этого - база не была загружена, кнопки работы с базой не доступны.

Постусловие: Была загружена база данных со старого опыта.

Имя прецедента: Просмотр записей базы данных.

Актер: Пользователь.

Предусловие: Была загружена, импортирована база данных с данными опыта.

Описание:

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

По нажатию клавиш «<» и «>» пользователь генерирует события, которые переключают записи в базе данных, что отображается в текстовом поле в виде: [количества записей/ текущая запись]. Данные выбранной записи извлекаются, и проектируется на графики дефектоскопа и датчика положения.

Альтернатива:

Пользователь ввел в текстовое поле «количество записей / текущая», номер нужной ему записи, и нажал кнопку «ок», обработчик события которой проверил введенное значение на соответствие правильности ввода и если такая запись есть, то выдал ее значения на графики.

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

Имя прецедента: Анализ базы данных.

Актер: Пользователь.

Зависимость: Была выбрана анализируемая запись.

Предусловие: Была загружена, импортирована база данных с данными опыта.

Пользователь, анализируя графики, по которым перемещается с помощью зажатой правой клавишей мышки, просматривая при этом все фрагменты. По окончанию анализа записи пользователь записывает в текстовое поле записи выводы результата проведенного опыта. После чего нажимает клавишу «Сохранить», в результате чего обработчик события ищет в базе выбранную пользователем запись и сохраняет в нее сделанные пользователем выводы.

Альтернатива:

- Если в поле вывода к выбранной записи уже есть выводы, и они не удовлетворяют пользователя, то он может их редактировать, и по нажатию клавиши «Сохранить», в результате чего обработчик события ищет в базе выбранную пользователем запись и заменяет в ней сделанные ранее пользователем выводы.

Постусловие: Проведен анализ опыта, и сохранены выводы.

2.2 Диаграммы классов

Всего в программном коде используется 4 класса. Класс «Дефектоскоп», «Датчик положения», «База данных» и класс «Задание». Каждый из них является обычным классом, не содержащим в себе дружественные классы (т.е. не являются родительскими классами) и не являются дружественными относительно других классов. Экземпляры этих классов используются относительно технологических объектов и технологического процесса в целом для упрощения понимания программного кода и сокращения строк кода.

На рисунке 2.1 показана диаграмма класса «Дефектоскоп»:

Рисунок 2.1 - Диаграмма класса «Дефектоскоп»

На рисунке 2.2 показана диаграмма класса «Датчик положения»:

Рисунок 2.2 - Диаграмма класса «Датчик положения»

На рисунке 2.3 показана диаграмма класса «База данных»

Рисунок 2.3 - Диаграмма класса «База данных»

На рисунке 2.4 показана диаграмма класса «Задание».

Рисунок 2.4 - Диаграмма класса «Задание»

На диаграммах в первой строке написано название класса, во второй строке - свойства, а в третьей строке (если имеется) - функции класса.

Класс «Датчик положения» отвечает за принятие данных датчика положения с микроконтроллера.

Класс «Дефектоскоп» служит для принятия данных с пъезопреобразователя, и надстройку дефектоскопа.

Класс «База данных» служит для создания, хранения и обработки базы данных.

Класс «Задания» используется для загрузки задания, и передачи его на установку.

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

На рисунке 2.5 приведена статическая модель программного обеспечения в двух режимах работы.

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

На рисунке 2.6 приведена статическая модель программного обеспечения в режиме работы «Опыт».

Рисунок 2.6 - Статическая модель программного обеспечения в режиме работы «опыт»

На рисунке 2.7 приведена статическая модель программного обеспечения в режиме работы «Анализ».

Рисунок 2.7 - Статическая модель программного обеспечения в режиме работы «Анализ»

3. Динамическое моделирование

.1 Диаграммы взаимодействий

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

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

Диаграммы кооперации соответствуют прецедентам, описанным в разделе 2. На них изображаются объекты, прецеденты, в которых они участвуют, и сообщения, которыми они обмениваются.

Рассмотрим диаграмму коопераций для клиент-серверных прецедентов дежурного оператора.

Сначала рассмотрим прецедент общий для всех режимов. Он относится к типу клиент-сервер, причем клиентом является объект пользовательского интерфейса. Начнем с прецедента «Отслеживание состояний программы», (рис. 3.1):

S1.1: Оператор отсылает запрос на выбор одного из режимов работы программы.

S1.2: Выбранный режим работы с минимальным интервалом опрашивается событием таймера.

S1.3: передаются таймеру состояние выбранного режима, и состояние основных переменных.

S1.4: после чего таймер ведет проверку данных для выборного режима и отправляет интерфейсу программы соотносящиеся к нему пользовательское меню, и блокирует-разблокирует некоторые возможности программы в зависимости от ее состояния.

S1.5: Полученный интерфейс отправляется пользователю.

Рисунок 3.1 - Диаграмма кооперации для прецедента «Отслеживание состояний программы».

Далее рассмотрим диаграммы прецедентов для режима работы «Опыт».

На рисунке 3.2 изображена диаграмма для прецедента «Загрузить, создать задание для установки».

V1.1: Пользователь в интерфейсе режима «Опыт», нажимает «загрузить задание».

V1.1.1: пользователь задает задание в ручную.

V1.2: Открывается окно для загрузки файла.

V1.3: Пользователю предлагается выбрать файл.

V1.4: В открывшемся окне пользователь задает файл.

V1.5: Задание с файла передается в интерфейс.

V1.6: Полученное задание отображается пользователю.

На рисунке 3.3 изображена диаграмма для прецедента «Создать новый файл».

G1.1: Пользователь в интерфейсе режима «Опыт», нажимает «Новый файл».

G1.2: Открывается окно для создания файла.

G1.3: Пользователю предлагается создать файл.

G1.4: В открывшемся окне пользователь задает имя и расширение файла.

Рисунок 3.2 - Диаграмма кооперации для прецедента «Загрузить, создать задание для установки»

G1.5: Создается файл и передается в интерфейс пользователя для дальнейшей работы.

G1.6: Если был создан файл, и задано задание, то интерфейс выводит информацию о готовности программы выполнить опыт.

Рисунок 3.3 - Диаграмма кооперации для прецедента «Создать новый файл»

На рисунке 3.4 изображена диаграмма для прецедента «Запустить опыт». Надо отметить, что этот прецедент работает в клиент-серверном режиме.

С1.1: Пользователь нажимает кнопку «Старт».

С1.2.1: Передача данных задания выполнение опыта «Таймеру 2».

С1.2.2: Передача данных задания на установку.

С1.3: Опрос «Таймером 2» установки.

С1.4: Передача «Таймеру 2» данных с установки.

С1.5: Передача полученных с установки данных на графики интерфейса.

С1.6.1: Проверка «Таймером 1», нажатия клавиш «Пауза», «Стоп»

Была нажата клавиша «Пауза».

С1.6.2: Отправка информации «Таймеру 1» об нажатии кнопки.

С1.6.3.1: Отсылает запрос на остановку «Таймера 2».

С1.6.3.2: Запрос на остановку установки.

Была нажата клавиша «Продолжить».

С1.6.4.1: Отсылает запрос на возобновление работы «Таймера 2».

С1.6.4.2: Запрос на возобновление работы установки.

Была нажата клавиша «Стоп».

С1.6.5.1: Запрос на запись сохраненных на данный момент данных в файл.

С1.6.5.3: Запрос на остановку установки.

С1.7: По окончанию задания запись полученных данных в файл.

С1.8: Информация об окончании выполнения задания.


На рисунке 3.5 изображена диаграмма для прецедента «Проверка подключения микро контролера».

U1.1: Пользователь запускает опыт.

U1.2: Данные отсылаются микро контролеру.

U1.3: Данные считываются с контролера.

U1.4: Считанные данные отображаются пользователю.

Рисунок 3.5 - Диаграмма кооперации для прецедента «Проверка подключения микро контролера»

На рисунке 3.6 изображена диаграмма для прецедента «Очистить базу данных».

F1.1: Пользователь отсылает запрос на очищение базы данных.

F1.2: Производится очистка базы данных.

F1.3: пользователь информируется что База данных успешно очищена.

Рассмотрим диаграммы прецедентов для режима работы «Анализ».

На рисунке 3.6 изображена диаграмма для прецедента «Импорт базы данных с опыта».

Рисунок 3.5 - Диаграмма кооперации для прецедента «Очистить базу данных»

Q1.1: Пользователь нажал кнопку «Текущая Б. Д».

Q1.2: Выдача данных Б.Д. на экран.

Рисунок 3.6 - Диаграмма кооперации для прецедента «Импорт базы данных с опыта»

Прецедент «загрузка базы данных из старого опыта» не рассматривается, так как он аналогичен прецеденту «Загрузить, создать задание для установки».

На рисунке 3.7 изображена диаграмма для прецедента «Просмотр записей базы данных».

Z1.1: Пользователь отдает запрос на выбор записи.

Z1.2: Базе данных отсылается запрос на выдачу указанной записи.

Z1.3: База данных выдает данные выбранной записи.

Z1.4: Полученные данные выводятся на экран.

Рисунок 3.7 - Диаграмма кооперации для прецедента «Просмотр записей базы данных»

На рисунке 3.8 изображена диаграмма для прецедента «Анализ базы данных».

W1.1: Пользователь сохраняет сделанные им по просмотренной записи выводы.

W1.2: Данные вывода сохраняются в поле выводов указанной записи.

W1.3: Данные в из записи выводятся на экран.

W1.4: Пользователю выдается сообщение что данные успешно сохранены.

Рассмотрим диаграмму состояний программы.

Диаграмма состояний программы включает в себя две ортогональные диаграммы: «Опыт» и «Анализ». Они представлены в виде над состояний, на диаграмме верхнего уровня, и разделены пунктирной линией (рис. 3.8). В любой момент времени программа находится в одном из под состояний состояния «Опыт», которое соответствует текущей стадии проведения опыта на данной установке, и в под состояний состояния «Анализ», когда производятся выводы по проведенному опыту. Сказанное не означает, что внутри программы имеется какой-то параллелизм, просто так удобнее моделировать эти относительно независимые события.

Рисунок 3.7 - Диаграмма кооперации для прецедента «Анализ базы данных»

Рисунок 3.3 - Диаграмма состояний программы

4. Разработка визуальных компонентов

Визуальный интерфейс программного обеспечения представляет собой две вкладки режимов работы «опыт» и «анализ».

В режиме «опыт» производится настройка и выполнение опыта, который сопровождается выводам данных на графики дефектоскопа и датчика положения, а также сохранением их в базу данных.

В режиме «анализ» производится просмотр выполненного опыта, что позволяет просмотреть более детально данные проведенного опыта и сделать по ним выводы.

Панель управления режима «Опыт» представлена в виде элементов Button, MainMenu, StringGrid, CheckBox и Char. После нажатия кнопки «старт» происходит передача данных работы установке, и считываются данные с датчиков, которые в дальнейшем выводятся на графики.

Панель управления режима «Анализ» представлена в виде элементов Button, MainMenu, StringGrid, Edit, Memo и Char. После загрузки базы данных, с помощью кнопок управления поочередно просматриваются данные каждой записи, которые выводятся на графики. После анализа каждой записи по ней делаются выводы, которые сохраняются по нажатию кнопки «сохранить».

Заключение

В процессе исследования «стенда определения остаточного ресурса изделия», выявил недостатки существующей установки. Имеющийся стенд требовал большого объема ручного труда по сбору и анализу показаний от датчиков. Поэтому было принято решение создать новую цифровую систему управления.

Программное обеспечение было написано на языке высокого уровня Delphi 7, а также языка разработки структуры UML.

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

Список использованной литературы

1. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++. Пер. с англ. М. Бином, СП. 1998. 115 с.

. Буч Г., Рамбо Д., Джекобсон А. Язык UML. Руководство пользователя. Пер. с англ. М.: ДМК. 1995 185 с.

. Гома Х. UML проектирование систем реального времени, параллельных и распределенных приложений. Пер. с англ. - М. ДМК Пресс, 2011. - 704 с.

Приложение

unit Unit1;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, libusb, ExtCtrls, ComCtrls, TeeProcs, TeEngine, Chart, Series, FMTBcd, DBXpress, ADODB, DB, SqlExpr, SQLite3, SQLiteTable3, Grids, ValEdit, unit2, Simoreg, XPMan, ComObj, DBCtrls, ExtDlgs, Buttons, Menus, jpeg;= class(TForm)

{Private declarations}: pusb_dev_handle;_res: integer;: TSQLiteDatabase;_select: Integer;: String;set_engine_speed (value: Double);UpdateDefscope();;: TMainForm;_D_Poloj, danie_Defektoskopa1, danie_Defektoskopa2, NameFileBase, Danie_Do_P_S2, Danie_Do_P_S1_1, Danie_Do_P_S1_2: String;, bila_najata_pauza, Pauza_Schitivania_dannih: Integer;: Boolean;_past, current_interval, ReqAddress, nach, kon: Integer;: Byte;: Integer = 0;_count: Integer = 0;: Integer = 1;: integer = 0;StrUtils;

{$R *.dfm}_EP = $83;_EP = $82;_EP = $02;USBDeviceOpen (var devhandle:pusb_dev_handle; VID, PID: word): bool;: pusb_bus;: pusb_device;_init;_find_busses;_find_devices;:= usb_get_busses;:= false;:=nil;Assigned(bus) do:= bus^.devices;Assigned(dev) dobegin:= usb_open(dev);:= true;;:= dev^.next; end;:= bus^.next;; end;TMainForm. Timer1Timer (Sender: TObject);_read: Integer;: array [0..127] of byte;: String;_count:= 0;:=True; end;TMainForm.onIdle (Sender: TObject; var done: Boolean);_read: Integer;: array [0..127] of byte;, str_time: String;: Double;, j: Integer;:string;:int64;: TFileStream;(conn_res <> 0) or not Assigned(udev) then;(ReqStep) then:=ReqAddrIdx+1;ReqAddrIdx>5 then ReqAddrIdx:=0;ReqAddrIdx of

: ReqAddress:=$83;

: ReqAddress:=$85;

: ReqAddress:=$88;

: ReqAddress:=$8B;

: ReqAddress:=$8E;

: ReqAddress:=$8F;;_read:= usb_bulk_read (udev, ReqAddress, @Buffer, 48, 10);(str, PChar(@Buffer), res_read);:=False;;_read:= usb_bulk_read (udev, $82, @Buffer, 128, 10);(res_read >= 0) then(str, PChar(@Buffer), res_read);_count:= Received_count + res_read;:= PLONGINT(@Buffer)^*47408.0/1000.0 /1000;_time:= TimeToStr(Time);:= IntToStr (PLONGINT(@Buffer)^);(value<200) then(Pauza_Schitivania_dannih=0) then_D_Poloj:=danie_D_Poloj+FloatToStr(value)+', ';;:= counter1 + 1;. AddXY (counter1, value); end;chkRunning. Checked then. BottomAxis. Maximum:= counter1;. BottomAxis. Minimum:= Chart2. BottomAxis. Maximum - 400;; end;:= True; end;TMainForm. FormCreate (Sender: TObject);: Integer;. Enabled:=False;. Enabled:=False;. Enabled:=False;. Pages[1].TabVisible:=false;. Pages[2].TabVisible:=false;:=0;_Schitivania_dannih:=1;_najata_pauza:=0;_select:= -1;. Cells [1, 0]:= 'Время';. Cells [2, 0]:= 'Интенсивность';. Cells [0, 0]:= 'Время';. Cells [1, 0]:= 'Интенс.';. Cells [1, 1]:= '5';. Cells [2, 1]:= '100';. Cells [1, 2]:= '5';. Cells [2, 2]:= '200';. OnIdle:= MainForm.onIdle;USBDeviceOpen (udev,$C251, $1307) = true then:= usb_set_configuration (udev, 1);res = 0 then_res:= usb_claim_interface (udev, 0);conn_res = 0 then. Caption:= MainForm. Caption + ' - Connection OK';; end; end;. Clear;;TMainForm. FormDestroy (Sender: TObject);Assigned(udev) then_release_interface (udev, 0);_close(udev); end;. Free; end;string_to_hex (str:string): String;_str: String;: Integer;i:= 1 to length(str) do_str:= res_str + format ('%.2x ', [Ord (str[i])]);;:= res_str; end;TMainForm. Button3Click (Sender: TObject);, res_read: Integer;: array [0..127] of byte;: word;: Integer;: String;, j: Integer;i:= 1 to 1 do:= Random(20);:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_VENDOR or USB_ENDPOINT_IN, 0, val, 0, @Buffer2, 2, 100);:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_VENDOR or USB_ENDPOINT_IN, 12, j, 0, @Buffer2, 2, 100);:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_VENDOR or USB_ENDPOINT_IN, 13, j, 0, @Buffer2, 2, 100);:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_VENDOR or USB_ENDPOINT_IN, 14, j, 0, @Buffer2, 2, 100);:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_VENDOR or USB_ENDPOINT_IN, 15, j, 0, @Buffer2, 2, 100);j:= 1 to 2 do:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_VENDOR or USB_ENDPOINT_IN, 17, Counter, 0, @Buffer, 2, 100);(res > 0) then(str, PChar(@Buffer), res);; end; end; end;TMainForm.set_engine_speed (value: Double);: double;, res: Integer;: Smallint;_thread: TSimoreg;:= value;. Caption:= Format (' % 3f', [pos]);:= round (pos * 1500);not Assigned(udev) then;_thread:= TSimoreg. Create(True);_thread.udev:= udev;_thread.main_form:=Self;_thread. EngineSpeed_Task:= value;_thread. Resume; end;TMainForm. TrackBar1Change (Sender: TObject);_thread: TSimoreg;_thread:= TSimoreg. Create(True);_thread.udev:= udev;_thread.main_form:=Self;_thread. Resume; end;TMainForm. ListBox1DblClick (Sender: TObject);: String;:TSQLiteTable;, j:integer;. Clear;j:= 10 to 1000 do_Defektoskopa1:=danie_Defektoskopa1+IntToStr (byte(str[j]))+', ';_Defektoskopa2:=danie_Defektoskopa2+ IntToStr(j)+', ';. AddXY (j, byte (str[j]));; end;TMainForm. ListBox1KeyPress (Sender: TObject; var Key: Char);key = #13 thenDblClick(Sender);; end;TMainForm. StringGrid1GetEditText (Sender: TObject; ACol, ARow: Integer; var Value: String);Value:= StringGrid1. Cells [Acol, ARow]; end;TMainForm. StringGrid1KeyDown (Sender: TObject; var Key: Word;: TShiftState);: Integer;(Key = 46) and (last_select >= 0) then(state >= last_select) then;(last_select = 0) or (StringGrid1. RowCount < 3) then;(last_select <= StringGrid1. RowCount-2) theni:= last_select to StringGrid1. RowCount-2 do. Rows[i]:= StringGrid1. Rows [i+1];. Cells [StringGrid1. RowCount-1, 1]:= «;. Cells [StringGrid1. RowCount-1, 2]:= «;. RowCount:= StringGrid1. RowCount - 1;;(Key = 45) and (last_select >= 0) then // Insert. RowCount:= StringGrid1. RowCount + 1;i:= StringGrid1. RowCount-1 downto last_select+1 do. Rows[i]:= StringGrid1. Rows [i-1];. Cells [1, last_select]:= «;. Cells [2, last_select]:= «;; end;TMainForm. StringGrid1SelectCell (Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);last_select:= ARow; end;TMainForm. StringGrid1SetEditText (Sender: TObject; ACol, ARow: Integer; const Value: String);ARow = StringGrid1. RowCount - 1 then(Value <> «) then. RowCount:= StringGrid1. RowCount + 1;; end;TMainForm. Button7Click (Sender: TObject);: Integer;: TSQLiteDatabase;_table: TSQLiteTable;. Enabled:= true;. Enabled:=false;. Enabled:=false;:=TSQLiteDatabase. Create(NameFileBase);. ExecSQL ('INSERT INTO pics (Datchik_Polojenia, vremia, intensivnost) VALUES («'+danie_D_Poloj+'», '+StringGrid1. Cells [1, state]+', '+StringGrid1. Cells [2, state]+ ')');. Destroy;:= 1;_interval:= 0;_minute. Enabled:= False;_past:= 0;i:= 1 to StringGrid1. RowCount do. Cells [0, i]:= «;;_engine_speed(0); end;TMainForm. Timer_minuteTimer (Sender: TObject);: TSQLiteDatabase;_table: TSQLiteTable;:=TSQLiteDatabase. Create(NameFileBase);_past:= mins_past + 1;current_interval <= mins_past then. ExecSQL ('INSERT INTO pics (Datchik_Polojenia, vremia, intensivnost, danie_Defektoskopa1, danie_Defektoskopa2) VALUES («'+danie_D_Poloj+'», '+StringGrid1. Cells [1, state]+', '+StringGrid1. Cells [2, state]+', «'+danie_Defektoskopa1+'», «'+danie_Defektoskopa2+'»)');_D_Poloj:='';_Defektoskopa1:='';_Defektoskopa2:='';_Schitivania_dannih:=1;_past:= 0;. Cells [0, state]:= 'Готово';:= state + 1;(state >= StringGrid1. RowCount) or

(StringGrid1. Cells [1, state] = «) then:= 1;_interval:= 0;_minute. Enabled:= False;_past:= 0;_engine_speed(0);. Destroy;. Enabled:=False;. Enabled:=False;. Enabled:=False;. Enabled:=True;; end;_Schitivania_dannih:=0;. Cells [0, state]:= '->';_engine_speed (StrToInt(StringGrid1. Cells [2, state])/1500);_interval:= StrToInt (StringGrid1. Cells [1, state]);; end;TMainForm. Button5Click (Sender: TObject);: Integer;: TSQLiteDatabase;_table: TSQLiteTable;. Caption:= 'Старт';. Enabled:= true;. Enabled:= true;. Enabled:=false;:=TSQLiteDatabase. Create(NameFileBase);not Pictures. TableExists('pics') then. ExecSQL ('CREATE TABLE pics (id INTEGER PRIMARY KEY AUTOINCREMENT, Datchik_Polojenia TEXT, vremia int, intensivnost int, vivod text, danie_Defektoskopa1 text, danie_Defektoskopa2 text)');;(0,'неудача', 'ошибка', MB_OK+MB_ICONERROR);. Terminate;;(bila_najata_pauza=0) then_D_Poloj:=Danie_Do_P_S2;_Schitivania_dannih:=0;i:= 1 to StringGrid1. RowCount do. Cells [0, i]:= «;;_minute. Enabled:= True;_interval:= StrToInt (StringGrid1. Cells [1, state]);. Cells [0, state]:= '->';_engine_speed (StrToInt(StringGrid1. Cells [2, state])/1500);;TMainForm. Button6Click (Sender: TObject);. Caption:= 'продолжить';. Enabled:=true;. Enabled:=False;. Enabled:=false;_minute. Enabled:= False;_najata_pauza:=1;_Schitivania_dannih:=1;_Do_P_S2:=danie_D_Poloj;_engine_speed(0); end;TMainForm. Button2Click (Sender: TObject);_thread: Defscope;_thread:= Defscope. Create(True);_thread.udev:= udev;_thread.main_form:= self;_thread. Resume; end;TMainForm. UpdateDefscope();: Integer;: TStream;: String;. Clear;i:= 10 to Length(rslt) do. AddXY (i, Byte (rslt[i])); {показания на дифекто скоп};;:= TStringStream.create(rslt);:= TimeToStr(Time);. ExecSQL ('insert into Defscope (TIME) values («'+str+'»)');. UpdateBlob ('UPDATE Defscope SET DATA =? WHERE ID = «' + IntToStr (sldb. GetLastInsertRowID()) +'» ', stream);. Free; end;TMainForm. Button8Click (Sender: TObject);: Integer;: Integer;:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 25, 0, 0, @Buffer2, 4, 100); end;TMainForm. Button9Click (Sender: TObject);: Integer;: Integer;:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 25, 0, 0, @Buffer2, 4, 100); end;TMainForm. Button10Click (Sender: TObject);_table: TSQLiteTable;: TSQLiteDatabase;:integer;OpenDialog2. Execute then:=TSQLiteDatabase. Create (ExtractFileName(OpenDialog2. FileName));(0,'неудача', 'ошибка', MB_OK+MB_ICONERROR);. Terminate;; end;_table:=Pictures. GetTable ('SELECT Datchik_Polojenia FROM pics');li:= 0 to SQLite_table. Count - 1 do_table. Next;;_table. Destroy; end;TMainForm. Button11Click (Sender: TObject);: Variant;, ListAktivn: OleVariant;:integer;:= CreateOleObject ('Excel. Application');OpenDialog1. Execute then:= Excel. WorkBooks. Open (OpenDialog1. FileName);:=Excel. ActiveWorkbook. ActiveSheet;. RowCount:=ListAktivn. UsedRange. Rows. Count;I:= 2 to ListAktivn. UsedRange. Rows. Count do. Cells [1, I-1]:=Excel. Range ['B'+inttostr(I)];. Cells [2, I-1]:=Excel. Range ['C'+inttostr(I)];;. ActiveWorkbook. Close;. Application. Quit;_najata_pauza:=0;:=0;_D_Poloj:='';; end;TMainForm. Button13Click (Sender: TObject);, konec: String;: TSQLiteDatabase;_table: TSQLiteTable;(fla=0) then:=InputBox ('Пользователь', 'Введите название БД латинскими буквами', 'opit')+'.sqlite';:=1;(NameFileBase);;(NameFileBase);:=TSQLiteDatabase. Create(NameFileBase);not Pictures. TableExists('pics') then. ExecSQL ('CREATE TABLE pics (id INTEGER PRIMARY KEY AUTOINCREMENT, Datchik_Polojenia TEXT)');;(0,'неудача', 'ошибка', MB_OK+MB_ICONERROR);. Terminate;;. ExecSQL ('INSERT INTO pics (Datchik_Polojenia) VALUES («'+danie_D_Poloj+'@'+'»)');. Destroy;:=TSQLiteDatabase. Create(NameFileBase); SQLite_table:=Pictures. GetTable ('SELECT Datchik_Polojenia FROM pics');. Destroy; end;TMainForm. OpenbClick (Sender: TObject);_table: TSQLiteTable;: TSQLiteDatabase;:integer;OpenDialog2. Execute then:=ExtractFileName (OpenDialog2. FileName);:=TSQLiteDatabase. Create(NameFileBase);(0,'неудача', 'ошибка', MB_OK+MB_ICONERROR);. Terminate;;_table:=Pictures. GetTable ('SELECT Datchik_Polojenia, vremia, intensivnost FROM pics');. Text:=IntToStr (SQLite_table. Count)+'\0';. RowCount:= SQLite_table. Count+1;li:= 0 to SQLite_table. Count - 1 do_D_Poloj:=danie_D_Poloj+SQLite_table. FieldAsString(0);. Cells [0, li+1]:= SQLite_table. FieldAsString(1);. Cells [1, li+1]:= SQLite_table. FieldAsString(2);_table. Next;;_table. Destroy;. Destroy;; end;TMainForm. Button14Click (Sender: TObject);, kn, i, j:integer;: string;:='';:=0;:=1;. Text:='all';. Clear;(i<Length (danie_D_Poloj) - 1) do(danie_D_Poloj[i]=', ') then. AddXY (j, StrToInt(zn));:=j+1;:='';:=i+1; end;:=zn+danie_D_Poloj[i];:=i+1;; end;TMainForm. SpeedButton1Click (Sender: TObject);_table: TSQLiteTable;: TSQLiteDatabase;, j, li:integer;, str: string;:=1;:=0;:='';(Edit1. Text='all') then Edit1. Text:= IntToStr (SQLite_table. Count)+'\0'; Pictures:=TSQLiteDatabase. Create(NameFileBase); SQLite_table:=Pictures. GetTable ('SELECT Datchik_Polojenia, vivod FROM pics');(StrToInt(ExtractFileName (Edit1. Text))>0) then. Text:=IntToStr (SQLite_table. Count)+'\'+IntToStr (StrToInt(ExtractFileName (Edit1. Text)) - 1);;li:= 0 to SQLite_table. Count - 1 do((li+1)=StrToInt (ExtractFileName(Edit1. Text))) then:=SQLite_table. FieldAsString(0);. Text:= SQLite_table. FieldAsString(1); end;_table. Next; end;_table. Destroy;. Destroy;. Clear;(StrToInt(ExtractFileName (Edit1. Text))>0) then(i<Length(str)) do(str[i]=', ') then. AddXY (j, StrToInt(zn));:=j+1;:='';:=i+1;;:=zn+str[i];:=i+1;; end; end;TMainForm. SpeedButton2Click (Sender: TObject);_table: TSQLiteTable;: TSQLiteDatabase;, j, li:integer;, str: string;:=1;:=0;:='';(Edit1. Text='all') then Edit1. Text:= IntToStr (SQLite_table. Count)+'\0'; Pictures:=TSQLiteDatabase. Create(NameFileBase); SQLite_table:=Pictures. GetTable ('SELECT Datchik_Polojenia, vivod FROM pics');(StrToInt(ExtractFileName (Edit1. Text))<(SQLite_table. Count)) then. Text:=IntToStr (SQLite_table. Count)+'\'+IntToStr (StrToInt(ExtractFileName (Edit1. Text))+1);;li:= 0 to SQLite_table. Count - 1 do((li+1)=StrToInt (ExtractFileName(Edit1. Text))) then:=SQLite_table. FieldAsString(0);. Text:= SQLite_table. FieldAsString(1); end;_table. Next; end;_table. Destroy;. Destroy;. Clear;(i<Length(str)) do(str[i]=', ') then. AddXY (j, StrToInt(zn));:=j+1;:='';:=i+1;;:=zn+str[i];:=i+1; end; end;TMainForm. Button15Click (Sender: TObject);_table: TSQLiteTable;: TSQLiteDatabase;, j, li:integer;, str: string;:=1;:=0;:='';:=TSQLiteDatabase. Create(NameFileBase); SQLite_table:=Pictures. GetTable ('SELECT Datchik_Polojenia FROM pics');(StrToInt(Edit1. Text)<(SQLite_table. Count)) then. Text:= IntToStr (SQLite_table. Count)+'\'+Edit1. Text;else begin. Text:=IntToStr (SQLite_table. Count)+'\'+IntToStr (SQLite_table. Count); end;li:= 0 to SQLite_table. Count - 1 do((li+1)=StrToInt (ExtractFileName(Edit1. Text))) then:=SQLite_table. FieldAsString(0);;_table. Next;;_table. Destroy;. Destroy;. Clear;(StrToInt(ExtractFileName (Edit1. Text))>0) then(i<Length(str)) do(str[i]=', ') then. AddXY (j, StrToInt(zn));:=j+1;:='';:=i+1;;:=zn+str[i];:=i+1;; end; end;TMainForm. Button16Click (Sender: TObject);SaveDialog1. Execute then:=SaveDialog1. FileName;:=1;. Enabled:=true;. Enabled:=true;(NameFileBase);else begin. Free; end; end;TMainForm. TekusiaBDClick (Sender: TObject);_table: TSQLiteTable;: TSQLiteDatabase;:integer;(NameFileBase<>'') then:=TSQLiteDatabase. Create(NameFileBase);(0,'неудача', 'ошибка', MB_OK+MB_ICONERROR);. Terminate;;_table:=Pictures. GetTable ('SELECT Datchik_Polojenia, vremia, intensivnost FROM pics');. Text:=IntToStr (SQLite_table. Count)+'\0';. RowCount:= SQLite_table. Count+1;li:= 0 to SQLite_table. Count - 1 do_D_Poloj:=danie_D_Poloj+SQLite_table. FieldAsString(0);. Cells [0, li+1]:= SQLite_table. FieldAsString(1);. Cells [1, li+1]:= SQLite_table. FieldAsString(2);_table. Next; end;_table. Destroy;. Destroy; else begin

MessageBox (0,'Извените, при данном запуске программы в не создавали базы данных, пожайлуста загрузите созданную рание, или создайте новую базу', 'Ошибка', MB_OK+MB_ICONERROR); end; end;

procedure TMainForm. SavebClick (Sender: TObject);_table: TSQLiteTable;: TSQLiteDatabase;, j, li:integer;, str: string;(NameFileBase<>'') then(StrToInt (ExtractFileName(Edit1. Text))>0) then:=TSQLiteDatabase. Create(NameFileBase);. ExecSQL ('UPDATE pics SET vivod = «'+Memo3. Text+'» WHERE id='+ExtractFileName (Edit1. Text));. Destroy;else begin('Вы можете сохранять выводы только на активные фрагменты графика');; end else begin(0,'Извените, база данных не загружена!!!', 'Ошибка', MB_OK+MB_ICONERROR); end; end;TMainForm. Timer2Timer (Sender: TObject);. Panels[1].Text:=' '+DateToStr(now)+' '+TimeToStr(now);(NameFileBase<>'') then. Enabled:=true;. Enabled:=true;. Enabled:=true;. Enabled:=true;. Enabled:=true;. Enabled:=true; end else begin. Enabled:=false;. Enabled:=false;. Enabled:=false;. Enabled:=false;. Enabled:=false;. Enabled:=false; end;(pgcUnits. Pages[0].CanFocus=true) then. Visible:=true;. Visible:=false; end else. Visible:=false;. Visible:=true; end; end;TMainForm. Button18Click (Sender: TObject);(NameFileBase);. Enabled:=true;. Enabled:=false;; end.

{Private declarations}Execute; override;: pusb_dev_handle;_form: TObject;ms: Boolean;UpdateDefscope(); end;Unit1, sysutils;Defscope. Execute;, res, res_read: Integer;: array [0..1500] of byte;: word;: String;: Boolean;: String;not Assigned(udev) then Exit;len400ms then:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 30, 0, 0, @Buffer2, 2, 50) else:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 20, 0, 0, @Buffer2, 2, 50);_read:= usb_bulk_read (udev, $81, @Buffer, 100, 50);(res_read >= 0) then(str, PChar(@Buffer), res_read); end;:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 23, 0, 0, @Buffer2, 2, 50);(100);:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 24, 0, 0, @Buffer2, 2, 50);:= False;:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 18, 0, 0, @Buffer2, 2, 50);i:= 1 to 100 do_read:= usb_bulk_read (udev, $81, @Buffer, 64, 50);(res_read < 0) thenpoked thenelse begin:= usb_control_msg (udev, USB_RECIP_INTERFACEor USB_TYPE_CLASS or USB_ENDPOINT_IN, 21, 0, 0, @Buffer2, 2, 50);:= True; end; end;(res_read >= 0) then(str, PChar(@Buffer), res_read);; end;:= False;:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 19, 0, 0, @Buffer2, 2, 50);i:= 1 to 100 do_read:= usb_bulk_read (udev, $81, @Buffer, 64, 50);(res_read < 0) thenpoked thenelse begin:= usb_control_msg (udev, USB_RECIP_INTERFACE or USB_TYPE_CLASS or USB_ENDPOINT_IN, 21, 0, 0, @Buffer2, 2, 50);:= True;; end;(res_read >= 0) then(str, PChar(@Buffer), res_read);:= myrslt + str;; end;(main_form).rslt:= myrslt;(UpdateDefscope);;Defscope. UpdateDefscope;(main_form).UpdateDefscope;; end.

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!