Разработка программного обеспечения автоматизированной системы проектирования операций сверления отверстий
Местом прохождения практики студента пятого курса металлургического факультета группы ЗлМ-507 Бейцешвили Г. С. являлась кафедра «Технологии машиностроения, станки и инструменты» (ТМСИ) Южно-Уральского государственного университета (ЮУрГУ). Выбор языка и среды программирования Для реализации программного обеспечения выбор был сделан в пользу объектно-ориентированного языка C#, так как язык прост… Читать ещё >
Разработка программного обеспечения автоматизированной системы проектирования операций сверления отверстий (реферат, курсовая, диплом, контрольная)
СОДЕРЖАНИЕ ВВЕДЕНИЕ
1. АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ
1.1 Постановка задачи
1.2 Данные для реализации
1.3 Выбор языка и среды программирования
2. РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
2.1 Структура автоматизированной системы
2.2 Разработка алгоритма подготовки и ввода данных
2.2.1 Ввод данных метода обработки и инструмента
2.2.2 Ввод данных о материале инструмента
2.2.3 Ввод данных о материале детали
2.2.4 Проверка и корректировка данных ЗАКЛЮЧЕНИЕ БИБЛИОГРАФИЧЕСКИЙ СПИСОК ПРИЛОЖЕНИЕ
ВВЕДЕНИЕ
Местом прохождения практики студента пятого курса металлургического факультета группы ЗлМ-507 Бейцешвили Г. С. являлась кафедра «Технологии машиностроения, станки и инструменты» (ТМСИ) Южно-Уральского государственного университета (ЮУрГУ).
Производственная практика проходила с 28.01.2012 по 28.02.2012.
Руководитель-преподаватель — доктор технических наук, профессор Дерябин Игорь Петрович.
Цель практики: разработка программного обеспечения автоматизированной системы проектирования операций сверления отверстий.
1. АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ
1.1 Постановка задачи В ходе прохождения практики руководителем практики были поставлены следующие задачи:
— Изучение и разработка алгоритмов сверления.
— Разработка программного обеспечения автоматизированной системы проектирования операций сверления отверстий.
1.2 Данные для реализации Для реализации поставленных задач была выдана программа, написанная на языке Turbo Basic.
1.3 Выбор языка и среды программирования Для реализации программного обеспечения выбор был сделан в пользу объектно-ориентированного языка C#, так как язык прост в обращении и достаточно гибок. Среда разработки — Visual Studio 2010, Net Framework 3.5.
2. РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
2.1 Структура автоматизированной системы Для компьютерных исследований была разработана программа моделирования обработки отверстий с расчетами параметров точности. Основные этапы структурной схемы обработки данных (рисунок 1.) рассмотрены ниже.
Рисунок 1. Структура системы компьютерного моделирования Этап 1. Ввод исходных данных о материале детали и режущей части инструмента; геометрии, погрешности заточки и размерах инструмента; об условиях обработки (осевая подача, точность оборудования, размеры и погрешность заготовки и др.).
Этап 2. Выбор компьютерной модели расчета параметров точности. Сначала рассчитывается положение на режущих лезвиях точки М. В зависимости от положения точки М и наличия отверстия в заготовке (D0 = 0 или D00) выбирается соответствующая компьютерная модель. После выбора модели рассчитываются коэффициенты.
Этап 3. Расчет параметров точности. Поскольку в процессе обработки отверстия происходит накопление погрешностей, определяющих параметры точности, то расчет производится на последнем обороте инструмента.
Этап 4. Вывод результатов моделирования, сравнение расчетных параметров с заданными значениями. При несовпадении каких-либо параметров в режиме отладки на экран дисплея выдаются причины данной погрешности и даются рекомендации по их устранению или снижению, после чего необходимо внести коррективы в некоторые исходные данные.
2.2 Разработка алгоритма подготовки и ввода данных Для реализации программы был разработан алгоритм, представленный на рисунке 2, из которого видно, что ввод данных в программу происходит в несколько этапов.
Рисунок 2. Структура системы компьютерного моделирования
2.2.1 Ввод данных метода обработки и инструмента При запуске программы выводится диалоговое окно (рисунок 3.) типа обработки, по умолчанию сразу загружается окно выбора сверления:
Рисунок 3. Выбор перехода в котором можно выбрать режим сверления «в сплошном материале» или «по предварительно просверленному отверстию». На вкладке «сверление» можно выбрать тип сверла:
спиральные перовые шнековые ружейные Также можно выбрать, будет ли применяться для сверла двойная заточка. После того, как все параметры выбраны, нажимается кнопка «далее» .
2.2.2 Ввод данных о материале инструмента При вводе данных о материале инструмента и детали для пользователя открывается диалоговое окно выбора материалов (рисунок 4.), на котором в вкладке «инструмент» вначале выбирается группа материала, затем марка используемой стали. Используемая в программе база данных формата .xml может быть с легкостью отредактирована в любом текстовом редакторе, т. е. можно добавить новые группы и марки сталей, либо удалить ненужные.
Рисунок 4. Выбор материала инструмента
2.2.3 Ввод данных о материале детали Ввод данных о материале детали (рисунок 5.) происходит после выбора материала инструмента. Далее также выбирается группа материала детали и марка стали. База данных также реализована в формате .xml.
Рисунок 5. Выбор материала детали
2.3 Проверка и корректировка данных Для безошибочного ввода данных параметров обработки был разработан алгоритм подготовки ввода данных и проверки введенных данных, который представлен на рисунке 2.
Из этого алгоритма видно, что соблюдение правильности всех введенных данных обеспечивается в несколько этапов.
На первом этапе происходит интерактивная проверка и корректировка всех вводимых данных. На этом этапе предусмотрено, что нельзя ввести «.» вместо «,» для разделения целой и дробной части числа (программа сама исправит точку на запятую). При вводе символов проверяется каждый символ и при этом блокируется возможность ввести букву или другой нечисловой символ.
На втором этапе ввода данных по нажатию кнопки «ОК» происходит проверка на согласованность данных, например: при сверлении по предварительно просверленному отверстию нельзя ввести диаметр инструмента < диаметра отверстия, или допуски инструмента = 0. Если параметры модели нереальны, программа выдает сообщение об ошибке с указанием рекомендаций по исправлению ошибки (рисунок 6.).
Рисунок 6. Сообщение об ошибке.
На третьем этапе введенные и проверенные программой данные выводятся в результирующую форму. Пользователь может визуально проверить параметры обработки, которые будут в дальнейшем использованы программой для отладки. При необходимости данные можно откорректировать в соответствии с требованиями пользователя (рисунок 7.).
Рисунок 7. Визуальная проверка данных алгоритм программирование сверление компьютерный
ЗАКЛЮЧЕНИЕ
Я проходил практику в течение 6-и недель на кафедре ТМСИ Южно-Уральского Государственного Университета. В ходе прохождения практики я достиг поставленной цели — изучил различные типы сверления, разработал алгоритмы для их реализации и написал программу, рассчитывающую параметры точности и позволяющую скорректировать исходные данные для наиболее приемлемых параметров точности.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Джейсон, Прайс; Майк, Гандэрлой — Visual C# .NET. Полное руководство; КОРОНА принт, 2004. — 960 c.
2. Рихтер, Джефри — Программирование на платформе Microsoft .NET Framework 3.5 на языке C#; Питер, 2007. — 656 c.
3. Робинсон, С.; Корнес, О.; Глинн, Д. и др. C# для профессионалов; М.: Лори, 2005. — 306 c.
ПРИЛОЖЕНИЕ Пример исходного кода главного меню программы
using System;
using System.Collections.Generic;
using System. Globalization;
using System. Drawing;
using System. Linq;
using System.Windows.Forms;
using System. Reflection;
using System. IO;
using System. Threading;
using System.Text.RegularExpressions;
namespace HoleMachining {
public partial class MainForm: Form {
public enum EnMode {
ModeMainMenu,
ModeID1,
ModeID9,
ModeID10,
ModeID23,
ModeIDS568,
ModeID578,
ModeID41,
ModeTAB1K,
ModeOTV01,
ModeOTV02,
ModeOTV03,
ModeOTV04,
ModeOTV05,
ModeOTV06,
ModeOTV07,
ModeOTV08,
ModeOTV09,
ModeOTV10,
ModeUU
}
private Thread ThreadMain;
public bool ExitEvent;
// Строка с версией программы.
public string VersionString = Assembly. GetExecutingAssembly ().GetName ().Version.ToString ();
public double Input;
public EnMode Mode;
public Keys Inkey;
public ManualResetEvent mreInkey;
public ManualResetEvent mreInput;
public Logger Log;
public Terminal terminal;
public MainMenu mainMenu;
public ID41 id41;
public ID1 id1;
public ID9 id9;
public ID10 id10;
public ID23 id23;
public ID578 id578;
public IDS568 ids568;
public TAB1K tab1k;
public OTV01 otv01;
public OTV02 otv02;
public OTV03 otv03;
public OTV04 otv04;
public OTV05 otv05;
public OTV06 otv06;
public OTV07 otv07;
public OTV08 otv08;
public OTV09 otv09;
public OTV10 otv10;
public UU uu;
/// Чтение заголовка сборки.
/// Заголовок сборки.
public string AssemblyTitle {
get {
// Get all Title attributes on this assembly
object[] attributes = Assembly. GetExecutingAssembly ().GetCustomAttributes (typeof (AssemblyTitleAttribute), false);
// If there is at least one Title attribute
if (attributes.Length > 0) {
// Select the first one
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute) attributes[ 0 ];
// If it is not an empty string, return it
if (titleAttribute.Title ≠ «»)
return titleAttribute. Title;
}
// If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name
return Path. GetFileNameWithoutExtension (Assembly.GetExecutingAssembly ().CodeBase);
}
}
public MainForm () {
InitializeComponent ();
// Создаём экземпляр класса, передавая в качестве параметра компонент,
// на котором будем отображать данные.
terminal = new Terminal (pictureBox1, 80, 25);
// Экземпляры модулей программы.
mainMenu = new MainMenu (this);
id1 = new ID1(this);
id9 = new ID9(this);
id10 = new ID10(this);
id23 = new ID23(this);
id41 = new ID41(this);
id578 = new ID578(this);
ids568 = new IDS568(this);
tab1k = new TAB1K (this);
otv01 = new OTV01(this);
otv02 = new OTV02(this);
otv03 = new OTV03(this);
otv04 = new OTV04(this);
otv05 = new OTV05(this);
otv06 = new OTV06(this);
otv07 = new OTV07(this);
otv08 = new OTV08(this);
otv09 = new OTV09(this);
otv10 = new OTV10(this);
uu = new UU (this);
}
private void ExitToolStripMenuItem_Click (object sender, EventArgs e) {
// Завершаем работу потока.
ExitEvent = true;
Inkey = Keys. Q;
mreInkey.Set ();
mreInput.Set ();
// Ожидаем завершения потока.
if (ThreadMain ≠ null) {
ThreadMain.Abort ();
ThreadMain.Join ();
}
// Выходим из программы.
Close ();
}
private void MainForm_Load (object sender, EventArgs e) {
// Третья цифра сборки (build) будет равна числу дней начиная с 1 января 2000 года по местному времени.
// Четвертая цифра ревизии (revision) будет установлена в количество секунд от полуночи по местному времени,
// делёное пополам.
int build = Assembly. GetExecutingAssembly ().GetName ().Version.Build;
int revision = Assembly. GetExecutingAssembly ().GetName ().Version.Revision;
DateTime bdate = new DateTime (2000, 1, 1);
bdate = bdate. AddDays (build);
bdate = bdate. AddSeconds (2 * revision);
// Создаём экземпляр журнала ошибок.
Log = new Logger (String.Format («{0}\{1}.log», Application. StartupPath, AssemblyTitle), true);
Log.StartLogging (Logger.EnLogMode.lmLogToFile);
Log.info (String.Format («{0}, версия {1} от {2} {3}», AssemblyTitle, VersionString, bdate. ToLongDateString (), bdate. ToLongTimeString ()));
// Первоначальные настройки.
Mode = EnMode. ModeMainMenu;
// Событие для выхода из потока.
ExitEvent = false;
// Событие для работы с клавиатурой в потоке.
mreInkey = new ManualResetEvent (false);
mreInput = new ManualResetEvent (false);
// Выводим текст в заголовке формы.
Text = String. Format («{0}, версия {1} от {2}», AssemblyTitle, VersionString, bdate. ToLongDateString ());
// Выводим текст с описанием работы.
terminal.SetColor (Color.Black, Color. LightGray);
terminal.ClearScreen ();
terminal.Print («ЭМУЛЯТОР КОНСОЛИ (РЕЖИМ ОТЛАДКИ)», 4, 22);
terminal.Print («1. Выход из программы: Alt + X (если зависло, то через Диспетчер задач)», 6, 2);
terminal.Print («2. Работу меню, списков, базы, ввода проверять при помощи пути:», 8, 2);
terminal.Print («Сверление\в сплошном материале\Спиральные», 9, 2);
terminal.Print («3. Клавиша Q завершает работу эмулируемой программы. Клавиша ESC позволяет», 11, 2);
terminal.Print («вернуться по иерархическому меню или закрыть текущее окно выбора.», 12, 2);
terminal.Print («4. Файл data. xml обязательно должен присутствовать в текущей папке.», 14, 2);
}
private void pictureBox1_Paint (object sender, PaintEventArgs e) {
// Перерисвываем окно терминала.
Image img = new Bitmap (pictureBox1.ClientRectangle.Width, pictureBox1.ClientRectangle.Height);
Graphics g = Graphics. FromImage (img);
terminal.DrawScreen (g);
e.Graphics.DrawImage (img, pictureBox1. ClientRectangle);
}
public void SetInput (string Text, int Y, int X, int Length, bool Visible) = StringFormatFlags. MeasureTrailingSpaces;
SizeF sz = g. MeasureString («A», new Font («Consolas», 10), Point. Empty, strfmt);
g.Dispose ();
textBoxInput.Left = (int) ((X — 1) * sz. Width);
textBoxInput.Top = pictureBox1. Top + (int) ((Y — 1) * sz. Height);
textBoxInput.Width = (int) (Length * sz. Width);
textBoxInput.Text = Text;
textBoxInput.Visible = Visible;
ActiveControl = textBoxInput;
public void NotImplemented () {
Invoke (new Action (terminal.Screen), 0);
Invoke (new Action (terminal.SetColor), Color. Black, Color. LightGray);
Invoke (new Action (terminal.ClearScreen));
terminal.Print (««, 10, 30, Color. Black, Color. Red);
for (int i = 11; i < 14; i++) {
terminal.Print (««, i, 30);
terminal.Print (««, i, 47);
}
terminal.Print (««, 14, 30);
terminal.Print («НЕ РЕАЛИЗОВАНО «, 12, 31, Color. Red, Color. LightGray);
}
// Симуляция Inkey$.
private void MainForm_KeyDown (object sender, KeyEventArgs e) {
// Запоминаем нажатую клавишу.
Inkey = e. KeyCode;
// Устанавливаем состояние триггера.
mreInkey.Set ();
}
private void textBoxInput_KeyDown (object sender, KeyEventArgs e) {
if (e.KeyCode == Keys. Return) {
e.SuppressKeyPress = true;
NumberFormatInfo provider = new NumberFormatInfo () { NumberDecimalSeparator = «.» };
Input = 0;
// Проверяем, является ли введённое число типом double.
if ((new Regex (@" ^[-+]?[0−9]*.?[0−9]+([eE][-+]?[0−9]+)?$")).IsMatch (textBoxInput.Text)) {
Input = Convert. ToDouble (textBoxInput.Text, provider);
if (Input == 0) {
MessageBox.Show («Число должно быть отличным от 0.»);
} else {
textBoxInput.Visible = false;
ActiveControl = pictureBox1;
// Устанавливаем состояние триггера.
mreInput.Set ();
}
} else {
MessageBox.Show («Число должно иметь тип double.»);
}
}
}
private void textBoxInput_Leave (object sender, EventArgs e) {
// Возвращаем фокус обратно на поле ввода.
this.ActiveControl = textBoxInput;
}
private void Scheduler () {
try {
// Переключение программ.
do {
switch (Mode) {
case EnMode. ModeMainMenu: { mainMenu. MainThreadProcedure (); break; }
case EnMode. ModeID1: { id1. MainThreadProcedure (); break; }
case EnMode. ModeID9: { id9. MainThreadProcedure (); break; }
case EnMode. ModeID10: { id10. MainThreadProcedure (); break; }
case EnMode. ModeID23: { id23. MainThreadProcedure (); break; }
case EnMode. ModeID41: { id41. MainThreadProcedure (); break; }
case EnMode. ModeIDS568: { ids568. MainThreadProcedure (); break; }
case EnMode. ModeOTV01: { otv01. MainThreadProcedure (); break; }
case EnMode. ModeOTV02: { otv02. MainThreadProcedure (); break; }
case EnMode. ModeOTV03: { otv03. MainThreadProcedure (); break; }
case EnMode. ModeOTV04: { otv04. MainThreadProcedure (); break; }
case EnMode. ModeOTV05: { otv05. MainThreadProcedure (); break; }
case EnMode. ModeOTV06: { otv06. MainThreadProcedure (); break; }
case EnMode. ModeOTV07: { otv07. MainThreadProcedure (); break; }
case EnMode. ModeOTV08: { otv08. MainThreadProcedure (); break; }
case EnMode. ModeOTV09: { otv09. MainThreadProcedure (); break; }
case EnMode. ModeOTV10: { otv10. MainThreadProcedure (); break; }
} while (!ExitEvent);
Invoke (new Action (terminal.Screen), 0);
Invoke (new Action (terminal.SetColor), Color. Black, Color. LightGray);
Invoke (new Action (terminal.ClearScreen));
Invoke (new Action (terminal.Print),
" «, 10, 30, Color. Black, Color. Blue);
for (int i = 11; i < 14; i++) {
Invoke (new Action (terminal.Print), ««, i, 30);
Invoke (new Action (terminal.Print), ««, i, 47);
}
Invoke (new Action (terminal.Print),
" «, 14, 30);
Invoke (new Action (terminal.Print),
" ЗАВЕРШЕНО «, 12, 33, Color. Blue, Color. LightGray);
Thread.Sleep (2000);
} catch (ThreadAbortException) { }
}
private void MainMenuItem_Click (object sender, EventArgs e) {
Graphics g = pictureBox1. CreateGraphics ();
// Узнаём размеры символа для выбранного шрифта.
StringFormat strfmt = StringFormat. GenericTypographic;
strfmt.FormatFlags |= StringFormatFlags. MeasureTrailingSpaces;
SizeF sz = g. MeasureString («A», new Font («Consolas», 10), Point. Empty, strfmt);
g.Dispose ();
Size = new Size ((int) (80 * sz. Width) + panel1.Padding.Horizontal,
(int) (25 * sz. Height) + pictureBox1.Location.Y + panel1.Padding.Top);
// Запускаем основной поток программы.
MainMenuItem.Enabled = false;
ExitEvent = false;
Inkey = Keys. None;
Input = 0;
mreInkey.Reset ();
mreInput.Reset ();
// Режим главного меню.
Mode = EnMode. ModeMainMenu;
if (ThreadMain ≠ null) {
ThreadMain.Abort ();
ThreadMain.Join ();
ThreadMain = null;
}
ThreadMain = new Thread (Scheduler);
ThreadMain.Start ();
MainMenuItem.Enabled = true;
}
}