66615

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

Отчет о прохождении практики

Информатика, кибернетика и программирование

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

Русский

2014-08-25

198 KB

0 чел.


Выбор материала детали и инструмента

ыбор метода обработки и инструмента

Визуальная проверка и корректировка данных.

Проверка всего блока данных.

Интерактивный контроль правильности вводимых данных.

Ввод данных параметров операций.


СОДЕРЖАНИЕ

ВВЕДЕНИЕ………………………………………………………………………..3

1. СТРУКТУРА ПРЕДПРИЯТИЯ

1.1 Общая структура предприятия……………………………………….. 4

1.2 Структура ОИТ………………………………………......……………. 4

1.3 Основные задачи ОИТ ………………………………………………....4

2. АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ

2.1 Постановка задачи………………………………….............................5

2.2 Данные для реализации ……………………………………………...5

2.3 Выбор языка и среды программирования …………………………..5

3. РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

3.1 Структура автоматизированной системы….………………………..5

3.2 Разработка алгоритма подготовки и ввода данных……………….5

 3.2.1 Ввод данных метода обработки и инструмента…………...5

 3.2.2 Ввод данных о материале инструмента……………………5

 3.2.3 Ввод данных о материале детали…………………………...5

 3.2.4 Проверка и корректировка данных………………………..5

ЗАКЛЮЧЕНИЕ………………………………………………………………….хз

БИБЛИОГРАФИЧЕСКИЙ СПИСОК…………………………………………..хз

ПРИЛОЖЕНИЕ…………………………………………...……………………..хз


ВВЕДЕНИЕ

Местом прохождения практики студента пятого курса металлургического факультета группы ЗлМ-507 Бейцешвили Г.С. являлась кафедра “Технологии машиностроения, станки и инструменты” (ТМСИ)  Южно-Уральского государственного университета (ЮУрГУ).

Производственная практика проходила с 28.01.2012 по 28.02.2012.

Руководитель-преподаватель – доктор технических наук, профессор Дерябин Игорь Петрович.

Цель практики: разработка программного обеспечения автоматизированной системы проектирования операций сверления отверстий.


1. СТРУКТУРА ПРЕДПРИЯТИЯ

1.1. Общая структура ЮУрГУ

1.2. Структура кафедры ТМСИ

1.3 Основные задачи ТМСИ


2. АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ

2.1. Постановка задачи

В ходе прохождения практики руководителем практики были поставлены следующие задачи:

- Изучение и разработка алгоритмов сверления.

- Разработка программного обеспечения автоматизированной системы проектирования операций сверления отверстий.

2.2. Данные для реализации.

Для реализации поставленных задач была выдана программа, написанная на языке Turbo Basic.

2.3. Выбор языка и среды программирования.

Для реализации программного обеспечения выбор был сделан в пользу объектно-ориентированного языка C#, так как язык прост в обращении и достаточно гибок. Среда разработки – Visual Studio 2010, Net Framework 3.5.


3.
РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

3.1 Структура автоматизированной системы

Для компьютерных исследований была разработана программа моделирования обработки отверстий с расчетами параметров точности. Основные этапы структурной схемы  обработки данных (рисунок 1.) рассмотрены ниже.

Рисунок 1. Структура системы компьютерного моделирования

Этап 1. Ввод исходных  данных о материале детали и режущей части инструмента; геометрии, погрешности заточки и размерах инструмента; об условиях обработки (осевая подача, точность оборудования, размеры и погрешность заготовки и др.).

Этап 2. Выбор компьютерной модели расчета параметров точности. Сначала рассчитывается положение на режущих лезвиях точки М. В зависимости от положения точки М и наличия отверстия в заготовке (D0 = 0 или   D00) выбирается соответствующая компьютерная модель. После выбора модели рассчитываются коэффициенты.

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

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

3.2 Разработка алгоритма подготовки и ввода данных

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

 

Рисунок 2. Структура системы компьютерного моделирования


3.2.1 Ввод данных метода обработки и инструмента

При запуске программы выводится диалоговое окно (рисунок 3.) типа обработки, по умолчанию сразу загружается окно выбора сверления:

Рисунок 3. Выбор перехода

в котором можно выбрать режим сверления "в сплошном материале" или "по предварительно просверленному отверстию". На вкладке "сверление" можно выбрать тип сверла:

  •  спиральные
  •  перовые
  •  шнековые
  •  ружейные

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

3.2.2 Ввод данных о материале инструмента 

При вводе данных о материале инструмента и детали для пользователя открывается диалоговое окно выбора материалов (рисунок 4.), на котором в вкладке "инструмент"  вначале выбирается группа материала, затем марка используемой стали. Используемая в программе база данных формата .xml может быть с легкостью отредактирована в любом текстовом редакторе, т.е. можно добавить новые группы и марки сталей, либо удалить ненужные.

Рисунок 4. Выбор материала инструмента

3.2.3 Ввод данных о материале детали

Ввод данных о материале детали (рисунок 5.) происходит после выбора материала инструмента. Далее также выбирается группа материала детали и марка стали. База данных также реализована в формате .xml.

Рисунок 5. Выбор материала детали

3.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;

       /// <summary>

       /// Чтение заголовка сборки.

       /// </summary>

       /// <value>Заголовок сборки.</value>

       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 ) {

           // Вычисление координат для поля редактирования.

           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();

           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<int>( terminal.Screen ), 0 );

           Invoke( new Action<Color, Color>( 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<int>( terminal.Screen ), 0 );

               Invoke( new Action<Color, Color>( terminal.SetColor ), Color.Black, Color.LightGray );

               Invoke( new Action( terminal.ClearScreen ) );

               Invoke( new Action<string, int, int, Color, Color>( terminal.Print ),

                   "                  ", 10, 30, Color.Black, Color.Blue );

               for ( int i = 11; i < 14; i++ ) {

                   Invoke( new Action<string, int, int>( terminal.Print ), " ", i, 30 );

                   Invoke( new Action<string, int, int>( terminal.Print ), " ", i, 47 );

               }

               Invoke( new Action<string, int, int>( terminal.Print ),

                   "                  ", 14, 30 );

               Invoke( new Action<string, int, int, Color, Color>( 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;

       }

   }

}


 

А также другие работы, которые могут Вас заинтересовать

83199. СТРАТЕГІЧНІ АСПЕКТИ ФІНАНСОВО-ЕКОНОМІЧНОЇ БЕЗПЕКИ ПІДПРИЄМСТВА 53.5 KB
  У сучасних умовах процес успішного функціонування і економічного розвитку вітчизняних підприємств багато в чому залежить від міри забезпечення їх економічної безпеки. Економічна безпека будьякого підприємства це захищеність його діяльності від негативних впливів зовнішнього середовища спроможність швидко усунути різноманітні погрози...
83200. Проблемы высвобождения и конверсии РЧС в Российской Федерации 185 KB
  Государственные решения по регулированию использования частот должны быть направлены на гармонизацию использования радиочастотного спектра в соответствии с международными договорами Российской Федерации (РФ) путем высвобождения и конверсии РЧС. В результате этих решений Постановлением Правительства РФ должна быть определена доля РЧС...
83201. КОМПОЗИЦИОННЫЕ МАТЕРИАЛЫ НА ОСНОВЕ МАГНЕЗИАЛЬНОГО ВЯЖУЩЕГО И СИНТЕТИЧЕСКОГО ВОЛЛАСТОНИТА 56.91 KB
  В статье показана возможность получения композиционных материалов на основе магнезиального вяжущего и синтетического волластонита, полученного на основе электротермофосфорного шлака, с повышенным пределом прочности при сжатии.
83202. Положительные и отрицательные черты главного героя в повести «Над пропастью во ржи» 34.56 KB
  Но для меня Холден является скорее предметом подражания нежели негодования. Углубляясь в детали в своем рассказе Холден дает понять как дороги они для него насколько настоящие они и как действительно приятно было бы встречать в жизни только таких людей. Сильнее всего в людях Холдену не нравится их желание быть тем кем они на самом деле не являются.
83204. Моя семья в Великой Отечественной войне 18.02 KB
  Я хочу рассказать о своих прадедушках и прабабушке. Мой прадедушка Белоусов Леонид Яковлевич был кадровым военным. Участвовал прадедушка и во взятии Рейхстага на стене которого потом расписался. Прадедушка вернулся с войны и еще много лет работал в колхозе Архангельского района.
83205. Томск сокровенный 12.82 KB
  За все мои прожитые годы у меня сложилось мнение в какой-то степени сокровенные чувства которые я бы не смогла рассказать на публике но именно сейчас я хочу поделиться о своей влюбленности к любимому Томску. Конечно как и в любом другом городе в Томске стоит множество памятников.
83206. Изготовление светильника, творческий проект 1.82 MB
  Столярный верстак шаблон карандаш ножовка. Изготовить шип Столярный верстак угольник линейка карандаш ножовка долото киянка. Изготовить проушину Столярный верстак угольник линейка карандаш ножовка долото киянка. Столярный верстак киянка кисть клей ПВА.
83207. Анализ научного текста 38.83 KB
  Как правило, для фиксирования точки конца титрования в комплексонометрии используют так называемые металл-индикаторы, которые представляют собой органические красители, образующие с катионами определяемых металлов растворимые в воде окрашенные комплексные соединения.