Реферат по предмету "Информатика"


Конвертирование исходного текста программ для станков с ЧПУ из одной системы программирования в другую

--PAGE_BREAK--1.4.2.  Описание системы программного обеспечения Для реализации и функционирования проекта необходимо следующее  программное обеспечение: ОС Windows 98, XP, Vista в основе, которой лежит ядро, характеризуемое 32-разрядной вычислительной архитектурой и полностью защищенной моделью памяти, что обеспечивает надежную вычислительную среду.
Разработка программы «Наладчик» и ее подсистем будет вестись с использованием среды для разработки приложений Borland Delphi 7. Среды разработки включают в себя высокопроизводительный 32-битный компилятор, что позволяет оптимизировать создаваемый код. В состав каждой среды включен обширный набор средств, которые повышают производительность труда программистов и сокращают продолжительность цикла разработки. Удобство разработки и эффективность созданных в данных средах разработки программ делают их оптимальным выбором для построения конвертирующей системы, какой является программа «Наладчик».
2. РАЗРАБОТКА ЗАДАЧИ «Конвертирование исходного текста программ для станков с ЧПУ» 2.1. Описание постановки задачи 2.1.1. Характеристика задачи          Стоит отметить, что текст программы должен быть написан синтаксически правильно. Программа, конечно исправит некоторые не правильно написанные координаты (их значение), но писавший должен быть профессионал в своём деле и допускать, как можно меньше ошибок программирования.
         Для уменьшения размера обрабатываемой текстовой программы были ведены такие функции как: удаление пустых строк, пробелов и для наглядности упорядоченная нумерация кадров.
Таким образом, задача обработки текста программ для станков с ЧПУ может быть разбита на несколько подзадач:
— разработка алгоритмов реализующих конвертирование исходных текстов программ;
— разработка алгоритма исправления ошибок программирования;
— разработка и реализация алгоритмов способствующих уменьшению объёма программы и одновременно увеличение читабельности текста.
2.1.2. Входная информация          Входной информацией для задачи является файл *.тхт полученный после обработки, либо в графической программе, либо набранный в ручную.
2.1.3. Выходная информация          Выходной информацией задачи является файл *.тхт обработанный заданным методом обработки.
2.1.4. Математическая простановка задачи          Следует отметить, что вся машинная арифметика основывается на декартовой системе координат, где X, Y, Z – основные программные координаты, I, J, K – дополнительные (при расчёте круговой интерполяции и заходов на эквидистанту обрабатываемого контура). Координата A – поворотное устройство.   
                             SHAPE  \* MERGEFORMAT
Рис. 2.1
2.1.4.1. Математическая постановка задачи ПК – Маяк Расчёт радиусов по G2, G3 (круговой интерполяции)
Эта задача предназначена для пересчёта круговой интерполяции и заходов на эквидистанту контура детали.
Алгоритм расчёта радиусов основан на расстоянии удаления точки центра радиуса от начальной точки радиуса (в относительной системе исчисления) и от ноля детали до центра радиуса (в абсолютной системе исчисления).
На рис. 2.2 изображен эскиз обрабатываемой детали (контура).
    
                                 
                                                          Рис. 2.2
Линии a и b отображают разницу расчётов радиусов при программировании системы Вм и Маяк.
Линия со стрелкой a система Маяк (абсолютная система).
Линия со стрелкой b система Вм (относительная система).
Формула пересчёта радиусов.
I – значение I координаты в обрабатываемом кадре.
J – значение J координаты в обрабатываемом кадре.
X_divd – значение координаты X в предыдущем кадре.
Y_divd – значение координаты Y в предыдущем кадре.
I = X_divd + I;
J = Y_divd + J
Результаты приведены в таблице 2.
Таблица 2
Результаты обработки
Входные данные
Выходные данные
N1 G0 X0 Y0
N1 X10 Y10 F100
N1 G42 D30 X17.59 Y18.83
N1 G1 X47.59
N1 G3 X47.59 Y40.83 I0 J11
N1 G1 X17.59
N1G0X0Y0
N2X10.Y10.F100
N3G42D30X17.59Y18.83I30.J0
N4G1X47.59
N5G3X47.59Y40.83I47.59J29.83
N6G1X17.59
         Как мы видим, нумерация кадров в обработанной программе восстановилась, лишние пробелы удалены.
В кадре N2 расставлены пропущенные точки (таков синтаксис программы обработки для станков с ЧПУ).
В кадре N3 рассчитаны и добавлены недостающие координаты захода.
В кадре N5 пересчитаны координаты I и J в соответствии с заданным методом обработки.
Расчёт линейных заходов на эквидистанту контура детали  по G41 G42 рис 2.3.
 
                       
Рис 2.3
Точка захода находится на линейном участке контура.
Находится по формуле:
I – значение I координаты в обрабатываемом кадре.
J – значение J координаты в обрабатываемом кадре.
X_sled – значение Х в следующем кадре.
X_nast – значение Х в настоящем кадре.
Y_sled — значение Y в следующем кадре.
Y_nast – значение Y в настоящем кадре.
I = X_sled – X_nast;
J= Y_sled– Y_nast
Результаты приведены в таблице 3.
                                                                                                                
 Таблица 3
Результаты обработки
Входные данные
Выходные данные
N1G0X0Y0
N2X40Y10
N3G42D30X47.59Y18.83
N4G3X47.59Y40.83I0J11
N1X17.59
N1Y18.83
N1X47.59
N1G0X0Y0
N2X40.Y10.
N3G42D30X47.59Y18.83I29.83J47.59
N4G3X47.59Y40.83I47.59J29.83
N5X17.59
N6Y18.83
N7X47.59
Как видно из таблицы кадры №2, 3, 4 изменились в результате обработки
 Расчёт заходов по радиусу на эквидистанту контура детали  по G41 G42
      
Рис 2.4
Расчёт захода на радиус несколько отличается от захода на линейный размер. Здесь немало важную роль играет вектор направления в зависимости от четверти, на которую направлен вектор рис.2.5.
Формулы:
J_nast – значение J в обрабатываемом кадре.
J_sled – значение J в следующем кадре.
I_nast – значение I в настоящем кадре.
I_sled – значение I в следующем кадре.
Y_nast – значение Y в настоящем кадре.
X_nast – значение X в настоящем кадре.
I и J – служат для определения знака в выражении.
С начала рассчитываем значение (I и J) из следующего кадра.
Логическое решение задачи
Если G3, то проверяем значение заданных координат:
ЕслиI_sled > 0 иJ_sled >= 0, тоI = 1, J = -1;
ЕслиI_sled иJ_sled тоI = -1, J = 1;
ЕслиI_sled иJ_sled >= 0, тоI = 1, J = 1;
ЕслиI_sled > 0 иJ_sled тоI = -1, J = -1
Если G2, то проверяем значение заданных координат:
ЕслиI_sled > 0 иJ_sled >= 0, тоI = -1, J = 1;
ЕслиI_sled иJ_sled тоI = 1, J = -1;
ЕслиI_sled иJ_sled >= 0, тоI = -1, J = -1;
ЕслиI_sled > 0 иJ_sled тоI = 1, J = 1
         Следующее операция описана формулами:
I_nast= Y_nast+ J_sled
J_nast = X_nast + I_sled
         Заключительные вычисления:
если I= -1 и J> 0, то J_nast:= -J_nast;
если I= 1 и JJ_nast:= -J_nast;
еслиJ = -1 иI > 0, тоI_nast:= -I_nast;
еслиJ = 1 иI тоI_nast:= -I_nast

Рис 2.5
2.2. Описание алгоритма метода выбора обработки 2.2.1.  Назначение и характеристика алгоритма Алгоритм описывает метод выбора обработки пользователем в зависимости от назначения конечного результата. 
2.2.2. Используемая информация В алгоритме используется графическая оболочка метода выбора обработки.
2.2.3. Результаты решения В результате реализации алгоритма программа настраивается для обработки заданным методом.
2.2.4. Алгоритм решения 1. Если  Form2.PC_MAYAK.Checked, то переход к п. 2
          2. pc_mayak(bufer);
         3. Если  Form2.PC_VM.Checked, то переход к п. 4
          4. pc_vm(bufer);
         5. Если  Form2.VM_MAYAK.Checked, то переход к п. 6
          6. vm_mayak(bufer);
         7. Если  Form2.MAYAK_VM.Checked, то переход к п.8
          8. mayak_vm(bufer);
         9.  Bufer:= '';   
        10.  Inc(m);  
        11. конец
2.2.5. Список условных обозначений Условные обозначения, используемые в описании алгоритма, приведены в табл. 4.
Таблица 4
Условные обозначения
Обозначение
Расшифровка
bufer
Строка значение процедуры
pc_mayak(bufer);
Процедура пересчёта заданным методом
pc_vm(bufer);
Процедура пересчёта заданным методом
vm_mayak(bufer);
Процедура пересчёта заданным методом
mayak_vm(bufer);
Процедура пересчёта заданным методом
Form2.MAYAK_VM.Checked
Свойства переключателя
Bufer
Переменная хранения строки
Inc()
Функция увеличения
Схема алгоритма метода выбора обработки  SHAPE  \* MERGEFORMAT
Рис 2.6
2.3 Описание алгоритма выбора вспомогательных методов обработки 2.3.1. Назначение и характеристика алгоритма Алгоритм описывает дополнительные (вспомогательные) методы выбора обработки данных.В результате выбора подключаются дополнительные возможности (удаление пробелов, пустых строк и последовательная нумерация кадров).
2.3.2. Используемая информация В алгоритме используется графическая оболочка метода выбора обработки.
2.3.3. Результаты решения В результате реализации алгоритма программа настраивается для обработки дополнительными методами.
2.3.4. Алгоритм решения 1. Если  Form1.Probel.Checked, переходим к п. 2
          2. DelProbel(bufer);
         3. Если  Form1.NomerKadra.Checked, то переходим к п. 4
          4. nomerkadra(bufer);
          5. Если  Form1.PustoStr.Checked, то переход к п. 6
          6. pustostroka;
         7. Bufer:= '';   
          8.  Inc(m);  
          9. конец
                                                                                                 Таблица 5
Список условных обозначений
Название
Описание
Bufer
Переменная хранения строки
Inc()
Функция увеличение значения
DelProbel(bufer);
Функция удаления пробелов
nomerkadra(bufer);
Функция восстановления нумерации кадров
pustostroka;
Функция удаления пустых строк
2.4. Описание алгоритма конвертирования 2.4.1. Назначение и характеристика алгоритма Алгоритм описывает конвертирование исходного текста программы для станков с ЧПУ. В результате программа пересчитывает все исходные координаты из данной системы программирования в заданную.
2.4.2. Алгоритм решения          1. Если (pos('%', kadr) 0) or(pos('$', kadr) 0), то переход к п. 28
         2.Если  pos('X',kadr) 0, то переход к п. 3 иначе к п. 5
         3. NaytiKoordinatu(kadr,'X', vyh);
         4. PreobrazovanieMayak(X_nast, kadr);
         5. uslovie:= FindVstavki('X', kadr);
         6. DobavitTochku(s);
          7. insert(Concat('X', s), kadr, uslovie);
         8. Если (pos('G42', kadr) 0) or(pos('G41', kadr) 0), то пер к п. 9
         9. Если  pos('X', kadr) = 0, то переход к п. 10
         10. uslovie:= FindVstavki('X', kadr);
         11. Insert('X' + s, kadr, uslovie);
         12. Если(pos('I', Stroka.Strings[Succ(m)]) 0) and (pos('J', Stroka.Strings[Succ(m)]) 0), топереходкп. 13 иначекп. 16
         13. Naytikoordinatu(Stroka.Strings[Succ(m)], 'I', st);
         14. Naytikoordinatu(Stroka.Strings[Succ(m)], 'J', st);
         15. Podhod_G41_G42_radius;
         16. Podhod_G41_G42_line; 
         17. Если pos('I', kadr) 0, то переход к п. 18
         18. NaytiKoordinatu(kadr, 'I', st);
         19. PreobrazovanieMayak(X_sled, kadr);
         20. uslovie:= pos('I',kadr);
         21. Если  uslovie 0, топереходкп. 22
         22. NaytiKoordinatu(kadr,'I',vyh);
         23. Если  oshibka = 1, топереходкп. 24
         24. I:= X_divd + I;
         25. divobrazovanieMAYAK(I,kadr);
         26. X_divd:= X_nast;
         27. Y_divd:= Y_nast;
         28. конец
                                                                                                                  Таблица 6
Список условных обозначений
Обозначение
Расшифровка
Kadr
Текущая строка обработки
NaytiKoordinatu(kadr,'X', vyh);
Функция нахождения значения координаты
vyh
Выходное значение процедуры
PreobrazovanieMayak(X_nast, kadr);
Функция преобразования координаты
X_nast и X_divd
Числовая переменная настоящего и предыдущего значения Х
uslovie
Числовая переменная
FindVstavki('X', kadr);
Функция поиска вставки значения заданной координаты в строке
DobavitTochku(s);
Функция вставляет точку в строку, если её нет
insert(Concat('X', s), kadr, uslovie);
Функция вставляет и сцепляет строки
(pos('I', Stroka.Strings[Succ(m)])
Функция поиска и проверки заданной позиции в строке
Podhod_G41_G42_radius
Функция расчёта радиусов на заходах
Podhod_G41_G42_line; 
Функция расчёта линейных заходов
I и J
Координаты круговой интерполяции в программе
Y_nast и Y_divd
Числовая переменная настоящего и предыдущего значения Y
Схема описание алгоритма конвертирования  SHAPE  \* MERGEFORMAT     продолжение
--PAGE_BREAK----PAGE_BREAK--Таблица 9
Смета затрат на разработку системы
Статьи затрат
Сумма затрат, руб.
Расходы на материалы
340
Расходы на оплату труда исполнителей
17080
Социальные налоги
4470
Расходы на содержание ВТ
3660
Накладные расходы
20190
Прочие расходы
1550
Итого
47290
Структура затрат на разработку


\s
                                                                    Рис 3.1
4. БЕЗОПАСНОСТЬ И ЭКОЛОГИЧНОСТЬ ПРОЕКТА Компьютеры в настоящее время широко используются во всех сферах  человеческой деятельности. Они стали основным рабочим инструментом человека в его ежедневной деятельности. В связи с этим необходимо уделять внимание охране труда при работе с ПК. Несоблюдение санитарно-гигиенических правил и норм при работе с компьютером может повлечь за собой развитие ряда заболеваний.
Охрана труда имеет не только социальный, но и экономический аспект. В результате улучшения условий труда наблюдается повышение производительности труда, снижение непроизводительных затрат времени, увеличение фонда рабочего времени, экономия расходов на оплату больничных и компенсации за работу в неблагоприятных условиях труда.
В данном разделе дипломного проекта освещаются основные вопросы техники безопасности и экологии труда.
4.11 Анализ вредных и опасных производственных факторов Постоянное напряжение глаз
Работа с компьютером характеризуется высокой напряженностью зрительной работы. Постоянное напряжение глаз может привести к снижению остроты зрения. Экран видеомонитора должен находиться от глаз пользователя на оптимальном расстоянии 600…700 мм, но не ближе 500 мм с учетом размеров алфавитно-цифровых знаков и символов. Также для снижения утомляемости рекомендуется делать 15-минутные перерывы в работе за компьютером в течение каждого часа.
Влияние электростатических и электромагнитных полей
Точное действие электромагнитных полей не изучено, однако исследования показали, что излучение осложняет сердечнососудистые заболевания, отрицательно влияет на развитие беременности, снижает иммунитет. Учитывая, что программист проводит много времени с компьютером, воздействие электромагнитных полей может отрицательно отразиться на его здоровье.
Допустимые значения параметров неионизирую­щих электромагнитных излучений от монитора компьютера представлены в табл. 4.1.
Максимальный уровень рентгеновского излучения на рабочем месте оператора ком­пьютера обычно не превышает 10 мкбэр/ч, а интенсивность ультрафиолетового и ин­фра­красного излучений от экрана монитора лежит в пределах 10…100 мВт/м2 /18/.
Таблица 4.1
Допустимые значения параметров неионизирующих электро­магнитных излучений (в соответствии с СанПиН 2.2.2.542-96)
Для снижения воздействия этих видов излучения рекомендуется применять мониторы с пониженным уровнем излучения (MPR-II, TCO-92, TCO-99), устанавливать защитные экраны, а также соблюдать регламентированные режимы труда и отдыха.
Длительное неизменное положение тела
Работа с компьютером характеризуется значительным умственным напряжением и нервно-эмоциональной нагрузкой операторов, высокой напряженностью зрительной работы и достаточно большой нагрузкой на мышцы рук при работе с клавиатурой ЭВМ. Большое значение имеет рациональная конструкция и расположение элементов рабочего места, что важно для поддержания оптимальной рабочей позы человека-оператора.
Шум
Шум ухудшает условия труда, оказывая вредное действие на организм человека. Работающие в условиях длительного шумового воздействия испытывают раздражитель­ность, головные боли, головокружение, снижение памяти, повышенную утомляемость, понижение аппетита, боли в ушах и т. д. В табл. 4.2 указаны предельные уровни звука в зависимости от категории тяжести и напряженности труда, являющиеся безопасными в отношении сохранения здоровья и работоспособности/21/.
Таблица 4.2
Предельные уровни звука, дБ, на рабочих местах
Категория
напряженности труда
Категория тяжести труда
I. Легкая
II. Средняя
III. Тяжелая
IV. Очень тяжелая
I. Мало напряженный
80
80
75
75
II. Умеренно напряженный
70
70
65
65
III. Напряженный
60
60


IV. Очень напряженный
50
50


Уровень шума на рабочем месте инженеров-программистов и операторов видеоматериалов не должен превышать 50дБА, а в залах обработки информации на вычислительных машинах— 65дБА. Для снижения уровня шума стены и потолок помещений, где установлены компьютеры, могут быть облицованы звукопоглощающими материалами.
4.2. Техника безопасности при работе с компьютером Принцип защиты расстоянием
Основную опасность при работе с компьютером представляет электромагнитное излучение. Наиболее сильно оно проявляется в зоне до 30 см от экрана, а также от задней и боковых поверхностей. Поэтому монитор необходимо располагать так, чтобы глаза находились на расстоянии не ближе 60-70 см от экрана. Между боковыми поверхностями соседних компьютеров должно быть не менее 1,2м. При расположении рядами: между тыльными сторонами компьютеров должно быть не менее 2м. Рекомендуется располагать компьютеры вдоль стены.
Принцип защиты временем
По санитарным правилам и нормам СанПиН 2.2.2.542-96 «Гигиенические требования к видеодисплейным терминалам, персональным электронным вычислительным машинам и организации работы» /18/ виды трудовой деятельности подразделяются на три группы:
−       группа А — работа по считыванию информации с экрана;
−       группа Б — работа по вводу информации;
−       группа В — творческая работа в режиме диалога с ЭВМ.
Деятельность разработчика программного обеспечения относится к группе В. При выполнении работ, относящихся к разным видам трудовой деятельности, за основную работу с ЭВМ принимают такую, которая занимает не менее 50% времени в течение рабочей смены или рабочего дня.
Для видов трудовой деятельности устанавливаются три категории тяжести и напряженности работ с ЭВМ и видеотерминалом (табл. 4.3).
                                                                                                                                   Таблица 4.3
Категории тяжести и напряженности работ
При 8-ми часовой рабочей смене и работе на ПК регламентированные перерывы следует устанавливать:
–       для I-ой категории работ через 2 часа от начала рабочей смены и через 2 часа после обеденного перерыва продолжительностью 15 минут каждый;
–       для II-ой категории работ через 2 часа от начала рабочей смены и через 1,5 — 2 часа после обеденного перерыва продолжительностью 15 минут каждый или 10 минут через каждый час работы;
–       для III-ой категории работ через 1,5 — 2 часа от начала рабочей смены и через 1,5 — 2 часа после обеденного перерыва продолжительностью 20 минут каждый или 15 минут через каждый час работы.
При 12-ти часовой смене и работе на ПК регламентированные перерывы следует устанавливать: в первые 8 часов работы аналогично перерывам при 8-ми часовом рабочей смене, а в течении последующих 4-х часов работы не зависимо от категории и вида работ 15 минут через каждый час.
4.3. Электробезопасность при работе с компьютером Электрические установки, к которым относится практически все оборудование ЭВМ, представляют для человека большую потенциальную опасность, так как в процессе эксплуатации или проведении профилактических работ человек может коснуться частей, находящихся под напряжением.
Любое воздействие тока может привести к электрической травме, то есть к повреждению организма, вызванному действием электрического тока или электрической дуги /19/.
При рассмотрении вопроса обеспечения электробезопасности разработчика необходимо выделить три основных фактора:
–       электроустановки рабочего места программиста;
–       вспомогательное электрооборудование;
–       окружающая среда помещения.
К электроустройствам рабочего места относятся: компьютер, видеомонитор, принтер. К вспомогательному оборудованию относятся лампы местного освещения, вентиляторы и другие электрические приборы. Электрооборудование, перечисленное выше, относится к установкам напряжением до 1000 В, исключение составляют лишь дисплей, электронно-лучевые трубки, которых имеют напряжение в несколько киловольт.
Окружающая среда помещений, в которых работает программист, воздействует на электрическую изоляцию приборов и устройств, электрическое сопротивление тела человека и может создавать условия для поражения электрическим током.
Помещения, оборудованные вычислительной техникой, как правило, относятся к категории помещений без повышенной опасности так как:
–       относительная влажность воздуха не превышает 75%;
–       нет токопроводящей пыли;
–       температура не превышает длительное время 30 °С;
–       отсутствует возможность одновременного прикосновения человека с имеющими соединение с землей металлическими конструкциями;
–       отсутствие  доступа  к токоведущим частям оборудования;
–       нет токопроводящих полов.
Таким образом, для предотвращения электротравматизма пользователя, необходимо соблюдать требования безопасности, как при работе с обычной бытовой техникой.
4.4. Требования к освещению рабочего места и его расчет 4.4.1. Требования к освещению рабочего места К современному освещению помещений, где работают с вычислительной техникой, предъявляют высокие требования как гигиенического, так и технического характера. Правильно спроектированное и выполненное освещение обеспечивает высокий уровень работоспособности, оказывает положительное психологическое воздействие, способствует повышению производительности труда. Условия деятельности пользователя в системе «человек-машина» связаны с явным преобладанием зрительной информации — до 90% общего объема.
В помещениях с компьютерной техникой применяется совмещенная система освещения/17/. К таким системам предъявляют следующие требования:
–       соответствие уровня освещенности рабочих мест характеру выполняемых зрительных работ;
–       достаточно равномерное распределение яркости на рабочих поверхностях и в окружающем пространстве;
–       отсутствие резких теней, прямой и отраженной блеклости;
–       постоянство освещенности во времени;
–       оптимальная направленность излучаемого осветительными приборами светового потока;
–       долговечность, экономичность, электро- и пожаробезопасность, эстетичность, удобство и простота эксплуатации.
Для искусственного освещения помещений с вычислительной техникой следует использовать главным образом люминесцентные лампы, у которых высокая световая отдача (до 75 лм/Вт и более); продолжительный срок службы (до 10 000 ч), малая яркость светящейся поверхности, близкий к естественному спектр излучения, что обеспечивает хорошую цветопередачу. Наиболее приемлемыми являются люминесцентные лампы белого света и тепло-белого света мощностью 20, 40, 80 Вт.
Для исключения засветки экранов дисплеев прямым световым потоком, светильники общего освещения располагают сбоку от рабочего места, параллельно линии зрения оператора и стене с окнами. Такое расположение светильников позволяет производить их последовательное включение по мере необходимости и исключает раздражение глаз чередующимися полосами света и тени, возникающее при поперечном расположении светильников.
Рекомендуемая освещенность для работы с экраном дисплея составляет 150 лк, а при работе с экраном в сочетании с работой над документами — 300 лк. Рекомендуемая яркость в поле зрения программиста должна лежать в пределах 1:5-1:10.
4.4.2.  Расчет освещенности рабочего места Расчет освещенности рабочего места сводится к выбору системы освещения, определению необходимого числа светильников, их типа и размещения. Процесс работы программиста в таких условиях, когда естественное освещение недостаточно или отсутствует. Исходя из этого, рассчитаем параметры искусственного освещения.
Расчет освещения производится для комнаты площадью 42 м2: длина – 7 м, ширина — 6 м, высота — 3 м. Равномерное освещение горизонтальной рабочей поверхности достигается при определенных отношениях расстояния между центрами светильников L, м (L=1,75*Н) к высоте их подвеса над рабочей поверхностью Н, м (в расчетах Н=Н).
L = 1,75*Н = 1,75*3 = 5,25 м.
Число светильников с люминесцентными лампами (ЛЛ)
,                                                    (4.1)
где    S – площадь помещения, м;
         М – расстояние между параллельными рядами, м.
М0,6 Н
М0,6*3=1,8 принимаем М=2;
;
Для достижения равномерной горизонтальной освещенности светильники с ЛЛ рекомендуется располагать сплошными рядами, параллельно стенам с окнами или длинным сторонам помещения.
Для расчета общего равномерного освещения горизонтальной рабочей поверхности используют метод светового потока, учитывающий световой поток, отраженный от потолка и стен.
Для определения количества светильников определим световой поток, падающий на поверхность по формуле:
                                                        ,                                                 (4.2)
где Fp — рассчитываемый световой поток, Лм;
      Еn — нормированная минимальная освещенность, Лк (определяется по таблице). Работу программиста, в соответствии с этой таблицей, можно отнести к разряду точных работ, следовательно, минимальная освещенность будет Е = 300 Лк при газоразрядных лампах;
      S — площадь освещаемого помещения ( в нашем случае S = 42 м2 );
      Z — отношение средней освещенности к минимальной (обычно принимается равным 1.1-1.2, пусть Z = 1.1);
      К — коэффициент запаса, учитывающий уменьшение светового потока лампы в результате загрязнения светильников в процессе эксплуатации (его значение определяется по таблице коэффициентов запаса для различных помещений  и в нашем случае К = 1.5);
       η — коэффициент использования, (выражается отношением светового потока, падающего на расчетную поверхность, к суммарному потоку всех ламп и исчисляется в долях единицы; зависит от характеристик светильника, размеров помещения, окраски стен и потолка, характеризуемых коэффициентами отражения от стен (Рс) и потолка (Рп)), значение коэффициентов Рс и Рп определим по таблице зависимостей коэффициентов отражения от характера поверхности: Рс=30%, Рп=50%. Значение η определим по таблице коэффициентов использования различных светильников. Для этого вычислим индекс помещения по формуле:
    продолжение
--PAGE_BREAK--                                                             ,                                                       (4.3)
где  S — площадь помещения, S = 42 м2;
       h — расчетная высота подвеса, h = 3 м;
       A — ширина помещения, А = 6 м;
       В — длина помещения, В =7 м.
Подставив значения получим:
                                                   
Зная индекс помещения I, Рс иРп, по таблице находим η = 0.3
Подставим все значения в формулу для определения светового потока F:
 Лм                    
Учитывая, что в светильнике по 4 лампы, световой поток одной лампы будет равен  .  Для освещения выбираем люминесцентные лампы типа ЛБ20, световой поток которых  Fл = 1180 Лм.
                                             (i)                  Рассчитываем потребляемую мощность осветительной установки в соответствии с формулой:                                      ,                                                    (4.4)
где  р – мощность лампы, Вт;
       N– число светильников, шт.N=4;
       n– число ламп в светильнике; для ЛЛ  n=4.
P=20*4*4=320 Вт=0,32 кВт.
Рассчитаем действительное освещение.
В рабочем  помещении имеется 4 светильников, в каждом из которых используется по 4 лампы ЛДЦ20. Рассчитаем световой поток:
Ф= 820*4*4 = 3280 лк;
Рассчитаем значение нормированной освещенности:
Е  = (Ф*N*η)/(S*Z*K) = 227 лк ≤ 300 лк.
Полученное значение нормированной освещенности оказалось меньше нормированной минимальной освещенности. Рекомендуется заменить используемые лампы, на  лампы с большим световым потоком.
4.5. Параметры микроклимата, загрязнение воздуха рабочей зоны вредными веществами Под метеорологическими условиями понимают сочетание температуры, относительной влажности, скорости движения и запыленности воздуха. Перечисленные параметры оказывают огромное влияние на функциональную деятельность человека, его самочувствие и здоровье и на надежность средств вычислительной техники. Эти микроклиматические параметры влияют как каждый в отдельности, так и в различных сочетаниях.
Температура воздуха является одним из основных параметров, характеризующих тепловое состояние микроклимата. Суммарное тепловыделение в помещении поступает от следующих источников:
–       ЭВМ;
–       вспомогательного оборудования;
–       приборов освещения;
–       людей;
–       внешних источников.
Наибольшее количество теплоты выделяют ЭВМ и вспомогательное оборудование. Средняя величина тепловыделения от компьютеров колеблется до 100 Вт/м2. Тепловыделения от приборов освещения также велики. Удельная величина их составляет 35 Вт/м2.При этом, чем больше уровень освещенности, тем выше удельные величины тепловыделений. Количество теплоты от обслуживающего персонала незначительно. Оно зависит от числа работающих в помещении, интенсивности работы, выполняемой человеком.
К внешним источникам поступления теплоты относят теплоту, поступающую через окна от солнечной радиации, приток теплоты через непрозрачные ограждения конструкций. Интенсивность этих источников зависит от расположения здания, ориентации по частям света, цветовой гаммы и прочее/15/.
С целью создания нормальных условий труда программиста установлены оптимальные и допустимые значения всех параметров микроклимата (табл. 4.4.).
Таблица 4.4
Параметры микроклимата производственных помещений
Параметры
Значения параметров
оптимальные
допустимые
Температура
20-22 °С
17-22 °С
Относительная влажность
40-60 %
до 75%
Скорость движения воздуха
0,1 м/с
не более 0,3 м/с
В целях поддержания температуры и влажности воздуха в помещении можно использовать системы отопления, вентиляции и кондиционирования воздуха.
На исследуемом рабочем месте температура воздуха, влажность и скорость движения воздуха держится в рамках оптимальных параметров. Вредные вещества в воздухе рабочей зоны не превышают предельной допустимой концентрации.
4.6. Пожаробезопасность при работе с компьютером Помещение, в котором установлено рабочее место инженера-программиста, относится к категории Д по взрывопожароопасности, так как не содержит горючих веществ, но лишь негорючие вещества и материалы в холодном состоянии.
Пожары в помещении, в котором находится ЭВМ, представляют особую опасность, так как сопряжены с большими материальными потерями. Площадь помещения, в котором ведется проектирование, невелика и составляет 8 м2. Как известно пожар может возникнуть при взаимодействии горючих веществ, окисления и источников зажигания. В помещении присутствуют все три основные фактора, необходимые для возникновения пожара. Горючими компонентами являются: строительные материалы для акустической и эстетической отделки помещений, двери, полы, бумага, изоляция кабелей и др.
Противопожарная защита — это комплекс организационных и технических мероприятий, направленных на обеспечение безопасности людей, на предотвращение пожара, ограничение его распространения, а также на создание условий для успешного тушения пожара.
Источниками зажигания в помещении, содержащем ЭВМ, могут быть электронные схемы от ЭВМ, приборы, применяемые для технического обслуживания, устройства электропитания, где в результате различных нарушений образуются перегретые элементы, электрические искры и дуги, способные вызвать загорания горючих материалов.
В современных ЭВМ очень высока плотность размещения элементов электронных схем. В непосредственной близости друг от друга располагаются соединительные провода, кабели. При протекании по ним электрического тока выделяется значительное количество теплоты. При этом возможно оплавление изоляции. Для отвода избыточной теплоты от ЭВМ служат системы вентиляции и кондиционирования воздуха. При постоянном действии эти системы представляют собой дополнительную пожарную опасность.
Одной из наиболее важных задач пожарной защиты является защита строительных помещений от разрушений и обеспечение их достаточной прочности в условиях воздействия высоких температур при пожаре. Учитывая высокую стоимость электронного оборудования, а также категорию его пожарной опасности, здания, в которых предусмотрено размещение ЭВМ, должны быть 1 и 2 степени огнестойкости.
К средствам тушения пожара, предназначенных для локализации небольших возгораний, относятся пожарные стволы, внутренние пожарные водопроводы, огнетушители, сухой песок, асбестовые одеяла и т. п.
В соответствии с “Типовыми правилами пожарной безопасности для промышленных предприятий” залы ЭВМ, помещения для внешних запоминающих устройств, подготовки данных, сервисной аппаратуры, архивов, копировально-множительного оборудования и т.п. необходимо оборудовать дымовыми пожарными извещателями. Так как в этих помещениях при возгорании различных пластмассовых, изоляционных материалов и бумажных изделий выделяется значительное количество дыма и мало теплоты.
Помещение, в котором производится разработка данного проекта, необходимо оборудовать средствами оповещения о пожаре, а также средствами для тушения пожара.
Электрические установки представляют для человека большую потенциальную опасность, так как в процессе эксплуатации или проведении профилактических работ человек может коснуться частей, находящихся под напряжением. Специфическая опасность электроустановок: токоведущие проводники, корпуса стоек ЭВМ и прочего оборудования, оказавшегося под напряжением в результате повреждения (пробоя) изоляции, не подают каких-либо сигналов, которые предупреждают человека об опасности. Реакция человека на электрический ток возникает лишь при протекании последнего через тело человека. Разрядные токи статического электричества чаще всего возникают при прикосновении к любому из элементов ЭВМ. Такие разряды опасности для человека не представляют, но кроме неприятных ощущений они могут привести к выходу из строя ЭВМ. Для снижения величины возникающих зарядов статического электричества покрытие технологических полов следует выполнить из однослойного поливинилхлоридного антистатического линолеума.
В ходе дипломного работы были выявлены вредные факторы, влияющие на работоспособность инженера-программиста. Для обеспечения безопасных условий труда инженера-программиста были выдвинуты требования к электро- и пожаробезопасности на рабочем месте. Также был произведен расчет общего освещения,  в результате которого была выявлена недостаточность освещения. Предлагаемые меры: замена ламп на лампы с большим световым потоком.
ЗАКЛЮЧЕНИЕ          В ходе дипломной работы было разработано ПО, позволяющее решать задачу  автоматизированного пересчёта программного кода для станков с ЧПУ с использованием различных систем программирования. Программа была написана на языке высокого уровня Object Pascal в среде разработки Borland Delphi 7.
         В процессе разработки были досконально исследованы системы программирования станков с ЧПУ, такие как (Вм, Маяк, Sinumerik). Результаты тестирования показали что, программа верно пересчитывает программный код в различные системы программирования при этом устраняет ошибки допущенные программистом, а так же имеет много вспомогательных настроек. Что значительно упрощает человеко-машинное взаимодействие и повышает время разработки программного кода и ввод его в эксплуатацию.
СПИСОК ЛИТЕРАТУРЫ Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. — М.: Наука, 1979. – 720с. Никита Культин Delphi 6. Программирование на Object Pascal. – СПб.: БХВ – Петербург, 2002. – 528 с.: ил. tnr.kulichki.com/techedit/te.html — TechEdit 2.1.1 относится к разряду специального ПО. С его помощью можно автоматизировать процесс разработки программ для ЧПУ. Гофман В. Э., Хомоненко А. Д. Delphi 6. – СПБ.: БХВ – Петербург, 2002. – 1152 с.: ил ГОСТ 12.0.002-80. Система стандартов безопасности труда. Термины и определения. – М.: ИПК Издательство стандартов, 2002 СанПиН 2.2.4. 548 – 96. Гигиенические требования к микроклимату производственных помещений. – М.: Госкомсанэпиднадзор, 1996. ГОСТ 12.1.006–84. ССБТ. Электромагнитные поля радиочастот. Допустимые уровни на рабочих местах и требования к проведению контроля — М.: Издательство стандартов, 1985. СанПиН 2.2.2. 542-96. Гигиенические требования к видеодисплейным терминалам, персональным электронно-вычислительным машинам и организации работы. – М.: Госкомсанэпиднадзор, 1996. ГОСТ 12.1.038-83. Система стандартов безопасности труда.  Электробезопасность. Термины и определения. – М.: Издательство стандартов, 1983. ГОСТ 12.1.004-91. Система стандартов безопасности труда. Пожарная  безопасность. Общие положения. – М.: Издательство стандартов, 1991. ГОСТ 12.1.003–83. ССБТ. Шум. Общие  требования безопасности (с изменениями по И-1-III-89). Почерняев С.В., Килин И.В., Сенилов М.А. Методические указания по дипломному  проектированию. – Ижевск: Издательство ИжГТУ, 1994. ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. – М.: Издательство стандартов, 1991 ГОСТ 19.105-78 ЕСПД. Общие требования  к  программным документам. – М.: Издательство стандартов, 1988 ГОСТ 19.401-78 ЕСПД. Текст программы. Требования  к содержанию и оформлению. – М.: Издательство стандартов, 1988 ГОСТ 19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению. – М.: Издательство стандартов, 1988 ГОСТ 19.504-79 ЕСПД. Руководство программиста. Требования  к содержанию и оформлению. – М.: Издательство стандартов, 1988 ГОСТ 19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению. – М.: Издательство стандартов, 1988 ПРИЛОЖЕНИЕ 1                                 ТЕКСТ ПРОГРАММЫ Файл Project1.dpr
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {AboutBox},
  Unit5 in 'Unit5.pas' {Form5},
  Unit6 in 'Unit6.pas' {Form6};
{$R *.res}
begin
  Application.Initialize;
  Application.Title := 'Наладчик 1.6.1';
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm5, Form5);
  Application.CreateForm(TForm6, Form6);
  Form1.Label3.Caption:= 'Всего строк';
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TAboutBox, AboutBox);
  Application.Run;
end.
ФайлUnit1.pas
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ExtCtrls, ToolWin, ComCtrls, ImgList, Printers,
  DBCtrls, Registry, IniFiles;
type
  TForm1 = class(TForm)
    memo1: TMemo;
    MainMenu1: TMainMenu;
    OpenDialog1: TOpenDialog;
    FontDialog1: TFontDialog;
    PrinterSetupDialog1: TPrinterSetupDialog;
    PrintDialog1: TPrintDialog;
    fayl: TMenuItem;
    Nastroyki: TMenuItem;
    fond: TMenuItem;
    Printery: TMenuItem;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ImageList1: TImageList;
    Parametry: TMenuItem;
    ToolButton2: TToolButton;
    SaveDialog1: TSaveDialog;
    ToolButton3: TToolButton;
    Label1: TLabel;
    Help: TMenuItem;
    Versia: TMenuItem;
    Vyhod: TMenuItem;
    Save: TMenuItem;
    Open: TMenuItem;
    Print: TMenuItem;
    ToolButton4: TToolButton;
    ToolButton6: TToolButton;
    NomerKadra: TCheckBox;
    Probel: TCheckBox;
    Pustostr: TCheckBox;
    PanelSostoyaniya: TStatusBar;
    Indikator: TProgressBar;
    ToolButton9: TToolButton;
    ReplaceDialog1: TReplaceDialog;
    Cancel: TButton;
    Obrabotka: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Panel1: TPanel;
    Panel2: TPanel;
    ToolButton5: TToolButton;
    ToolButton8: TToolButton;
    procedure ButPrinterClick(Sender: TObject);
    procedure ButPechatClick(Sender: TObject);
    procedure fondClick(Sender: TObject);
    procedure PrinteryClick(Sender: TObject);
    procedure PechatClick(Sender: TObject);
    procedure ButParametrClick(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure ParametryClick(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure VersiaClick(Sender: TObject);
    procedure VyhodClick(Sender: TObject);
    procedure SaveClick(Sender: TObject);
    procedure OpenClick(Sender: TObject);
    procedure PrintClick(Sender: TObject);
    procedure CancelClick(Sender: TObject);
    procedure ToolButton6Click(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
    procedure ToolButton9Click(Sender: TObject);
    procedure ReplaceDialog1Replace(Sender: TObject);
    procedure ObrabotkaClick(Sender: TObject);
    procedure memo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure ToolButton5Click(Sender: TObject);
    procedure ToolButton8Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
  st = ' Параметры: ';  // текст в строке состояния + в модуле 2
  Code_Begin       = 100;
var
  Form1: TForm1;
  Code_My, nach, oshibka, m, uslovie: Integer;
  Code_Reg: longint;
  proverka_sushesvovania_ini: byte;
  reestra, reestrc, reestrb, reestrMy_Code, reestrReg_Code: integer;
  reestrversia: string[20];
  nach_period, Hac: integer;
  Stroka: TStrings;
  memo1mod: boolean;
  I, J, I_sled, J_sled: real;
  X_nast, X_divd, X_sled, Y_nast, Y_divd, Y_sled: real;
  Z, A, Uvmmayak, K: real;
 
implementation
    продолжение
--PAGE_BREAK--uses Unit2, Unit3, Unit5;
{$R *.dfm}
procedure TForm1.ButPrinterClick(Sender: TObject);
begin
  PrinterSetupDialog1.Execute
end;
procedure TForm1.ButPechatClick(Sender: TObject);
begin
  PrintDialog1.Execute
end;
procedure TForm1.FondClick(Sender: TObject);
begin
  if FontDialog1.Execute then
      Memo1.Font:= FontDialog1.Font;
end;
procedure TForm1.PrinteryClick(Sender: TObject);
begin
  PrinterSetupDialog1.Execute
end;
procedure TForm1.PechatClick(Sender: TObject);
begin
  ToolButton3Click(Sender);
end;
procedure TForm1.ButParametrClick(Sender: TObject);
begin
  Form2.ShowModal;
end;
Procedure TForm1.FormResize( Sender: TObject);  // Изменение размера формы
begin
  Memo1.Left:= 10;                        //  Положение слева
  Memo1.Top:= 60;                         //  Положение сверху
  Memo1.Width:= Form1.ClientWidth-130;    //  Ширина
  Memo1.Height:= Form1.ClientHeight-100;  //  Высота
  NomerKadra.Left:= Form1.ClientWidth-15-NomerKadra.Width;
  Probel.Left:= Form1.ClientWidth-15-Probel.Width;
  Pustostr.Left:= Form1.ClientWidth-15-Pustostr.Width;
  Cancel.Left:= Form1.ClientWidth-20-Cancel.Width;
  Obrabotka.Left:= Form1.ClientWidth-20-Obrabotka.Width;
  Label2.Left:= Form1.ClientWidth-40-Cancel.Width;
  Label3.Left:= Form1.ClientWidth-40-Cancel.Width;
  Panel1.Left:= Form1.ClientWidth-18-Panel1.Width;
  Panel2.Left:= Form1.ClientWidth-18-Panel2.Width;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if Memo1mod then    // Если поле Мемо1 изменилось
    begin
      CanClose:= MessageDlg(' Содержимое редактора изменилось '#10#13' Хотите сохранить данные?', mtConfirmation,[mbYes, mbNo], 0) = mrYes;
      if CanClose then ToolButton2Click(Sender);
      CanClose:= true;
    end;
end;
procedure TForm1.FormCreate(Sender: TObject);
const
  Reg_Code = 1234567890;
  My_Code = 469103;
var
  RegIni: TRegistry;
  Ini: TIniFile;
  data: TDatetime;
begin
  DateSeparator:= '.';
  DecimalSeparator:= '.';
  ShortDateFormat:= 'dd/mm/yyyy';
  memo1mod:= false;
  reestrMy_Code:= 0;
  reestrReg_Code:= 0;
  data:= Date;                                 // получаем сегодняшнюю дату
  nach_period:= Trunc(data);
  Ini:= TIniFile.Create('Nal.ini');
  proverka_sushesvovania_ini:= Ini.ReadInteger('START', 'CountStart', 0);
  if proverka_sushesvovania_ini = 0 then
    begin
      ini.WriteInteger('START', 'CountStart', 1);
      ini.WriteDate('DateBegin', 'DateBegin', data);   //в формате дд.мм.гггг
      ini.WriteDate('DateEnd', 'DateEnd', data + 30);  //в формате дд.мм.гггг
      ini.WriteString('Versia', 'Versia', Application.Title);
      ini.WriteInteger('CodeBegin', 'CodeBegin', Code_Begin);
      ini.WriteInteger('Hac','Hac', nach_period);
    end
  else
    begin
      Code_My:= ini.ReadInteger('Code_My', 'Code_My', 0);
      Code_Reg:= ini.ReadInteger('Code_Reg', 'Code_Reg', 0);
      Hac:= Ini.ReadInteger('Hac','Hac',0);
    end;
  Ini.Free;
  Form1.Caption:= Application.Title;
  Form1.memo1.Clear;
  Form1.PanelSostoyaniya.Panels[0].Text:= st + ' Не обрабатывать ';
  Form1.Panel1.Caption:= '0';
  Form1.Panel2.Caption:= '0';
  RegIni:= TRegistry.Create;
  RegIni.RootKey:= HKEY_LOCAL_MACHINE;
  RegIni.OpenKey('Software\Naladchik', true);
  if not RegIni.KeyExists('a') then   // Если нет этого ключа то прописываем.
    begin
      RegIni.CreateKey('a');
      RegIni.WriteInteger('a', 100);
      RegIni.WriteString('Versia', Application.Title);
      RegIni.WriteInteger('b', nach_period);         // в формате 00000
      RegIni.WriteInteger('c', nach_period + 30);    // в формате 00000
      RegIni.CloseKey;
      RegIni.Free;
    end;
  RegIni:= TRegistry.Create;
  RegIni.RootKey:= HKEY_LOCAL_MACHINE;
  RegIni.OpenKey('Software\Naladchik', false);
  reestra:= RegIni.ReadInteger('a');
  reestrversia:= RegIni.ReadString('Versia');
  reestrb:= RegIni.ReadInteger('b');
  reestrc:= RegIni.ReadInteger('c');
  if proverka_sushesvovania_ini = 2 then
    begin
      reestrMy_Code:= RegIni.ReadInteger('d');
      reestrReg_Code:= RegIni.ReadInteger('e');
    end;
  RegIni.CloseKey;
  RegIni.Free;
  if Hac > nach_period then nach_period:= Hac //  защита от перевода даты
  else  Hac:= nach_period;
  Ini:= TIniFile.Create('Nal.ini');
  ini.WriteInteger('Hac', 'Hac', Hac);
  ini.Free;
  //  Code_My и Code_Reg  из ini файла
  if (Code_My = My_Code) and (Code_Reg = Reg_Code) and (reestrMy_Code = My_Code) and (reestrReg_Code = Reg_Code)
  then Form1.Caption:= Application.Title + '(Зарегистрированная версия)'
  else
    begin
      if reestrc > nach_period then
        Form1.Caption:= Application.Title + '   (Осталось '+IntToStr(reestrc — nach_period)+' дней)';
      if reestrc
      begin
        ShowMessage('Демонстрационный период закончен' + #13 + 'За регистрацией обратитесь к разработчику'+#13'dimasoft1@mail.ru');
        Halt(1);
      end;
    end;
end;
procedure TForm1.ToolButton1Click(Sender: TObject);
var
  kol: integer;
begin
  Indikator.Position:= 0;
  Form1.PanelSostoyaniya.Panels[1].Text:= '';
  Memo1.Clear;
  if OpenDialog1.Execute then
    begin
      Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
      label1.Caption:= OpenDialog1.FileName;
      kol:= Memo1.Lines.Count;
      Panel2.Caption:= '0';
      Panel1.Caption:= IntToStr(kol — 1);
    end;
  Form2.PC_VM.Enabled:= true;
  Form2.PC_MAYAK.Enabled:= true;
  Form2.VM_MAYAK.Enabled:= true;
  Form2.MAYAK_VM.Enabled:= true;
  Form2.FormActivate(Sender);
end;
procedure TForm1.ParametryClick(Sender: TObject);
begin
   Form2.ShowModal;
end;
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
    begin
      Memo1.Lines.SaveToFile(SaveDialog1.FileName);
      Memo1.Modified:= false;
    end;
end;
procedure TForm1.ToolButton3Click(Sender: TObject);  //  Печать
var
  line: System.TextFile;
  i: integer;
begin
  if PrintDialog1.Execute then
    begin
      AssignPrn(line);
      rewrite(line);
      Printer.Canvas.Font:= Memo1.Font;
      for i:= 0 to memo1.Lines.Count-1 do writeln(line,'                  ', Memo1.Lines[i]);
      System.CloseFile(line);
    end;
end;
procedure TForm1.VersiaClick(Sender: TObject);
begin
  AboutBox.ShowModal;
end;
procedure TForm1.VyhodClick(Sender: TObject);
begin
  Form1.Close;
end;
procedure TForm1.SaveClick(Sender: TObject);
begin
  ToolButton2Click(Sender);
end;
procedure TForm1.OpenClick(Sender: TObject);
begin
  ToolButton1Click(Sender);
end;
procedure TForm1.PrintClick(Sender: TObject);
begin
  ToolButton3Click(Sender);
end;
procedure TForm1.CancelClick(Sender: TObject);
begin
  Form1.Close;
end;
procedure NaytiKoordinatu(kadr: string; koordinata: char; var poluchenaya: string);
var
  p: integer;
  poz_10: string[100];
  per: string[10];
  r: real;
begin
  per:='          ';
  kadr:= Concat(kadr, ' ');
  nach:= pos(koordinata,kadr);
  nach:= Succ(nach);
  poz_10:= copy(kadr, nach, 100);
  val(poz_10,r,oshibka);
  for p:=1 to oshibka — 1 do
    per[p]:= poz_10[p];
  if poz_10 = ' ' then oshibka:= 1;
  poluchenaya:= TrimRight(per);
end;
function DobavitTochku( f: string): string; // Добавляет точку, если её нет
begin
  if pos('.', f) = 0
    then f:= Concat(f, '.');
  Result:= f;
end;
procedure Podhod_G41_G42_radius;
begin                   //  Х и Y уже найдены
  if pos('G3', Stroka.Strings[Succ(m)]) 0 then
    begin
      if (I > 0) and (J >= 0) then
        begin
          I_sled:= 1;
          J_sled:= -1;
          exit;
        end;
      if (I
        begin
          I_sled:= -1;
          J_sled:= 1;
          exit;
        end;
      if (I 0) then
        begin
          I_sled:= 1;
          J_sled:= 1;
          exit;
        end;
      if (I >= 0) and (J
        begin
          I_sled:= -1;
          J_sled:= -1;
          exit;
        end;
    end;
  if pos('G2', Stroka.Strings[Succ(m)]) 0 then
    begin
      if (I >= 0) and (J > 0) then
        begin
          I_sled:= -1;
          J_sled:= 1;
          exit;
        end;
      if (I
        begin
          I_sled:= 1;
          J_sled:= -1;
          exit;
        end;
      if (I = 0) then
        begin
          I_sled:= -1;
          J_sled:= -1;
          exit;
        end;
      if (I > 0) and (J
        begin
          I_sled:= 1;
          J_sled:= 1;
          exit;
        end;
    end;
end;
               // Преобразует строку, удаляет и вставляет подстроку ВМ
function divobrazovanieVM( vhod_v_divobrazovanie: real ;var kadr: string): string;
var
  stroka: string[10];
begin
  delete(kadr,nach,oshibka-1);
  stroka:= FloatToStr(vhod_v_divobrazovanie);  // Преобразуем в число строку
  insert(stroka, kadr, nach);
end;
              // Преобразует строку, удаляет и вставляет подстроку МАЯК
function divobrazovanieMAYAK( vhod_v_divobrazovanie: real ;var kadr: string): string;
var
  stroka: string[10];
begin
  delete(kadr,nach,oshibka-1);
  if vhod_v_divobrazovanie 0 then
    begin
      stroka:= FloatToStrF(vhod_v_divobrazovanie, fffixed, 12, 3);  // Преобразуем в число строку
      vhod_v_divobrazovanie:= StrToFloat(stroka);     // Был глюк при конвертации
      stroka:= FloatToStr(vhod_v_divobrazovanie);      //  Сейчас вроде работает
      stroka:= DobavitTochku(stroka);  // Добавляет точку, если её нет
    end
  else stroka:= '0';      // вставляем без точки
  insert(stroka, kadr, nach);
end;
procedure Podhod_G41_G42_line;
var
  str: String;
begin
  str:= stroka.Strings[Succ(m)];
  if Pos('X', str) 0 then
    begin
      NaytiKoordinatu(str, 'X', str);
      X_sled:= StrToFloat(str);
    end
  else
    begin
      if (Form2.PC_VM.Checked) or (Form2.MAYAK_VM.Checked) then
        X_sled:= X_nast / 1000
      else
        X_sled:= X_nast;
    end;
  str:= stroka.Strings[Succ(m)];
  if Pos('Y', str) 0 then
    begin
      NaytiKoordinatu(str, 'Y', str);
      Y_sled:= StrToFloat(str);
    end
  else
    begin
      if (Form2.PC_VM.Checked) or (Form2.MAYAK_VM.Checked) then
        Y_sled:= Y_divd / 1000
      else
        Y_sled:= Y_nast;
    end;
  if (Form2.PC_VM.Checked) or (Form2.MAYAK_VM.Checked) then
    begin
      X_sled:= X_sled * 1000;
      Y_sled:= Y_sled * 1000;
      X_sled:= X_sled — X_nast;
      Y_sled:= Y_sled — Y_nast;
    end
  else
    begin
      X_sled:= X_sled — X_nast;
      Y_sled:= Y_sled — Y_nast;
    end;
end;
function FindVstavki(koordinata: char; kadr: string): integer;
begin
  case koordinata of
    'X': begin
           if pos('Y', kadr) 0 then Result:= pos('Y', kadr)
           else if pos('I', kadr) 0 then Result:= pos('I', kadr)
             else if pos('J', kadr) 0 then Result:= pos('J', kadr)
               else if pos('F', kadr) 0 then Result:= pos('F', kadr)
                 else if pos('M', kadr) 0 then Result:= pos('M', kadr)
                   else Result:= Length(kadr) + 1;
         end;
    'Y': begin
           if pos('I', kadr) 0 then Result:= pos('I', kadr)
           else if pos('J', kadr) 0 then Result:= pos('J', kadr)
             else if pos('F', kadr) 0 then Result:= pos('F', kadr)
               else if pos('M', kadr) 0 then Result:= pos('M', kadr)
                 else Result:= Length(kadr) + 1;
         end;
    'I': begin
           if pos('J', kadr) 0 then Result:= pos('J', kadr)
           else if pos('F', kadr) 0 then Result:= pos('F', kadr)
             else if pos('M', kadr) 0 then Result:= pos('M', kadr)
               else Result:= Length(kadr) + 1;
         end;
    'J': begin
           if pos('F', kadr) 0 then Result:= pos('F', kadr)
           else if pos('M', kadr) 0 then Result:= pos('M', kadr)
             else Result:= Length(kadr) + 1;
         end;
  else
    Result:= Length(kadr) + 1;
  end;
end;
procedure TForm1.ObrabotkaClick(Sender: TObject);
label
  metka;
var
  kol, buf: integer;
  Proc, proci, u: integer;
  vyh: string;
  PolChisla_1Proc, uvel: real;
  bufer: string;
  Priz_pusto_memo: boolean;
procedure DelProbel(var kadr: string);   // Удаление пробелов
var
  k: integer;
begin
  while pos(' ', kadr) 0 do
    begin
      k:= pos(' ', kadr);
      delete(kadr, k, 1);
    end;
end;
procedure pustostroka;
begin
  stroka.Delete(m);            //  Удаляем пустую строку
  Dec(kol);                    //  Уменьшаем кол-во строк на 1
  Dec(m);                      //  Уменьшаем на одну стороку
end;
procedure nomerkadra(var kadr: string);
var
  error, nach, x: integer;
  poz_N7: string [10];
begin
  poz_N7:= '          ';
  nach:= pos('N',kadr);    // Номер позиции 'N'
  if nach 0 then         // Позиция найдена
    begin
      Inc(nach);  // Наращиваем на 1
      poz_N7:= copy(kadr, nach, 10);
      val(poz_N7,x,error);      // проверяем на ошибку
      if error = 1 then
      else
        begin
          delete(kadr,nach,error-1); // Удаляем старое значение
          Inc(buf);                    // Наращиваем кадр на 1
          insert(IntToStr(buf), kadr, nach); // Вставляем новое число
        end;
    end;
end;
Procedure PC_MAYAK(var kadr: string);
var
  I_est: boolean;
  st: string;
  s: string[10];
begin
  if (pos('%', kadr) 0) or (pos('$', kadr) 0) then exit;
  I_est:= False;
  if (pos('I',kadr) 0) or (pos('J',kadr) 0) then I_est:= true;
  if pos('X',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'X', vyh);
      if oshibka 1 then
        begin
          X_nast:= StrToFloat(vyh);
          PreobrazovanieMayak(X_nast, kadr); // не было точки
        end;
    end
  else
    if I_est then  // Добавление Х Если нет
      begin
        uslovie:= FindVstavki('X', kadr);
        s:= FloatToStr(X_nast);
        if X_nast 0 then s:= DobavitTochku(s);
        insert(Concat('X', s), kadr, uslovie);
      end;
  if pos('Y',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'Y', vyh);
      if oshibka 1 then
        begin
          Y_nast:= StrToFloat(vyh);
          PreobrazovanieMayak(Y_nast, kadr)  // не было точки
        end;
    end
  else
    if I_est then       // Добавление Y Если нет
      begin
        uslovie:= FindVstavki('Y', kadr);
        s:= FloatToStr(Y_nast);
        if Y_nast 0 then s:= DobavitTochku(s);
        insert(Concat('Y',s), kadr, uslovie);
      end;                                          // Подходы
  if (pos('G42', kadr) 0) or (pos('G41', kadr) 0) then
    begin
      try
        s:= Stroka.Strings[Succ(m)]; // ошибка нет строки вообще
      except                         // так не должно быть это ошибка оператора
      on EStringListError do       // добавляем пустую строку и исключаем ошибку
        stroka.Add('');
      end;
      if pos('X', kadr) = 0 then
        begin                                  // Вставка Х и Y если нет
          uslovie:= FindVstavki('X', kadr);
          s:= FloatToStr(X_nast);              // В позиции X Y I J F M
          if X_nast 0 then s:= DobavitTochku(s);
          Insert('X' + s, kadr, uslovie);
        end;
      if pos('Y', kadr) = 0 then
        begin
          uslovie:= FindVstavki('Y', kadr);
          s:= FloatToStr(Y_nast);
    продолжение
--PAGE_BREAK--          if Y_nast 0 then s:= DobavitTochku(s);
          Insert('Y' + s, kadr, uslovie);
        end;
      if (pos('I', Stroka.Strings[Succ(m)]) 0) and (pos('J', Stroka.Strings[Succ(m)]) 0)
      then
        begin
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'I', st);
          I:= StrToFloat(st);
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'J', st);
          J:= StrToFloat(st);
          Podhod_G41_G42_radius;
          J:= J + Y_nast;
          if (I_sled = -1) and (J > 0) then J:= -J;   // ЛОГИЧЕСКИЙ ПЕРЕСЧЁТ
          if (I_sled = 1) and (J
          I:= I + X_nast;
          if(J_sled = -1) and (I > 0) then I:= -I;
          if(J_sled = 1) and (I
          if pos('J', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'J', st);
              PreobrazovanieMayak(I, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('J', kadr);
              Insert('J' + FloatToStr(I), kadr, uslovie);
            end;
          if pos('I', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'I', st);
              PreobrazovanieMayak(J, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('I', kadr);
              Insert('I' + FloatToStr(J), kadr, uslovie);
            end;
          X_divd:= X_nast;
          Y_divd:= Y_nast;
          exit;
        end
      else
        begin
          Podhod_G41_G42_line;             // ЛИНЕЙНЫЕ ПОДХОДЫ РАСЧЁТ
          if pos('I', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'I', st);
              PreobrazovanieMayak(X_sled, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('I', kadr);
              Insert('I' + FloatToStr(X_sled) + '.', kadr, uslovie);
            end;
          if pos('J', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'J', st);
              PreobrazovanieMayak(Y_sled, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('J', kadr);
              Insert('J' + FloatToStr(Y_sled) + '.', kadr, uslovie);
            end;
          exit;
        end;
    end;
  uslovie:= pos('I',kadr);            // расчёт радиусов
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'I',vyh);
      if oshibka = 1 then
      else
        begin
          I:= StrToFloat(vyh);
          I:= X_divd + I;
          divobrazovanieMAYAK(I,kadr);
        end;
    end;
  uslovie:= pos('J',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'J',vyh);
      if oshibka = 1 then
      else
        begin
          J:= StrToFloat(vyh);
          J:= Y_divd + J;
          divobrazovanieMAYAK(J,kadr);
        end;
    end;
  X_divd:= X_nast;
  Y_divd:= Y_nast;
end;
Function VM_MAYAK(var kadr: string): string;
var
  I_est: boolean;
  s, st: string;
begin    
  if (pos('%', kadr) 0) or (pos('$', kadr) 0) then exit;
  I_est:= False;
  if (pos('I',kadr) 0) or (pos('J',kadr) 0) then I_est:= true;
  uslovie:= pos('X',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'X', vyh);
      if oshibka = 1 then
      else
        begin
          vyh:= TrimRight(vyh);      // Удаляем лишние пробелы справа
          X_nast:= StrToFloat(vyh) / 1000;
          divobrazovanieMAYAK(X_nast,kadr);
        end;
    end
  else
    if I_est = true then  // Добавление Х Если нет
      begin
        uslovie:= pos('Y',kadr);
        insert('X'+ vyh, kadr, uslovie);
      end;
  uslovie:= pos('Y',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'Y', vyh);
      if oshibka = 1 then
      else
        begin
          vyh:= TrimRight(vyh);      // Удаляем лишние пробелы справа
          Y_nast:= StrToFloat(vyh) / 1000;
          divobrazovanieMAYAK(Y_nast,kadr);
        end;
    end
  else
    if I_est = true then       // Добавление Y Если нет
      begin
        uslovie:= pos('I',kadr);
        insert('Y' + vyh, kadr, uslovie);
      end;
  if (pos('G42', kadr) 0) or (pos('G41', kadr) 0) then
    begin
      try
        s:= Stroka.Strings[Succ(m)]; // ошибка нет строки вообще
      except
      on EStringListError do       // добавляем пустую строку и исключаем ошибку
        stroka.Add('');
      end;
      if pos('X', kadr) = 0 then
        begin                                  // Вставка Х и Y если нет
          uslovie:= FindVstavki('X', kadr);
          s:= FloatToStr(X_nast);    // В позиции X Y I J F M
          if X_nast 0 then s:= DobavitTochku(s);
          Insert('X' + s, kadr, uslovie);
        end;
      if pos('Y', kadr) = 0 then
        begin
          uslovie:= FindVstavki('Y', kadr);
          s:= FloatToStr(Y_nast);
          if Y_nast 0 then s:= DobavitTochku(s);
          Insert('Y' + s, kadr, uslovie);   
        end;
      if (pos('I', Stroka.Strings[Succ(m)]) 0) and (pos('J', Stroka.Strings[Succ(m)]) 0)
      then
        begin
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'I', st);
          I:= StrToFloat(st);
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'J', st);
          J:= StrToFloat(st);
          Podhod_G41_G42_radius;
          J:= J / 1000;
          J:= J + Y_nast;
          if (I_sled = -1) and (J > 0) then J:= -J;
          if (I_sled = 1) and (J
          I:= I / 1000;
          I:= I + X_nast;
          if(J_sled = -1) and (I > 0) then I:= -I;
          if(J_sled = 1) and (I
          if pos('J', kadr) 0 then
            begin
               NaytiKoordinatu(kadr, 'J', st);
               PreobrazovanieMayak(I, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('J', kadr);
              Insert('J' + FloatToStr(I), kadr, uslovie);
            end;
          if pos('I', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'I', st);
              PreobrazovanieMayak(J, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('I', kadr);
              Insert('I' + FloatToStr(J), kadr, uslovie);
            end;
          X_divd:= X_nast;
          Y_divd:= Y_nast;
          exit;
        end
      else
        begin             // Линейный подход
          st:= Stroka.Strings[Succ(m)];
          uslovie:= Pos('X', st);
            if uslovie 0 then
              begin
                NaytiKoordinatu(st, 'X', st);
                X_sled:= StrToFloat(st) / 1000;
                X_sled:= X_sled — X_nast;
              end
            else X_sled:= 0;            // Если нет в кадре то 0
          st:= stroka.Strings[Succ(m)];
          uslovie:= Pos('Y', st);
          if uslovie 0 then
            begin
              NaytiKoordinatu(st, 'Y', st);
              Y_sled:= StrToFloat(st) / 1000;
              Y_sled:= Y_sled — Y_nast;
            end
          else Y_sled:= 0;
          if pos('I', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'I', st);
              PreobrazovanieMayak(X_sled, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('I', kadr);
              Insert('I' + FloatToStr(X_sled) + '.', kadr, uslovie);
            end;
          if pos('J', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'J', st);
              PreobrazovanieMayak(Y_sled, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('J', kadr);
              Insert('J' + FloatToStr(Y_sled) + '.', kadr, uslovie);
            end;
          exit;
        end;
    end;
  uslovie:= pos('Z',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'Z', vyh);
      if oshibka = 1 then
      else
        begin
          vyh:= TrimRight(vyh);      // Удаляем лишние пробелы справа
          Z:= StrToFloat(vyh) / 1000;
          divobrazovanieMAYAK(Z,kadr);
        end;
    end;
  uslovie:= pos('I',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'I',vyh);
      if oshibka = 1 then
      else
        begin
          vyh:= TrimRight(vyh);      // Удаляем лишние пробелы справа
          I:= StrToFloat(vyh) / 1000;
          I:= X_divd + I;
          divobrazovanieMAYAK(I,kadr);
        end;
    end;
  uslovie:= pos('J',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'J',vyh);
      if oshibka = 1 then
      else
        begin
          vyh:= TrimRight(vyh);      // Удаляем лишние пробелы справа
          J:= StrToFloat(vyh) / 1000;
          J:= Y_Pred + J;
          divobrazovanieMAYAK(J,kadr);
        end;
    end;
  uslovie:= pos('U',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'U', vyh);
      if oshibka = 1 then
      else
        begin
          vyh:= TrimRight(vyh);      // Удаляем лишние пробелы справа
          Uvmmayak:= StrToFloat(vyh) / 1000;
          divobrazovanieMAYAK(Uvmmayak,kadr);
        end;
    end;
  uslovie:= pos('K',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'K', vyh);
      if oshibka = 1 then
      else
        begin
          vyh:= TrimRight(vyh);      // Удаляем лишние пробелы справа
          K:= StrToFloat(vyh) / 1000;
          divobrazovanieMAYAK(K,kadr);
        end;
    end;
  X_divd:= X_nast;
  Y_divd:= Y_nast;
end;
Function MAYAK_VM(var kadr: string): string;
var
  I_est: boolean;
  uslovie: integer;
  strok: string[10];
  s, st: string;
begin
  if pos('%', kadr) 0 then exit;
  if pos('$', kadr) 0 then exit;
  I_est:= False;
  uslovie:= pos('I',kadr);
  if uslovie 0 then I_est:= true;
  uslovie:= pos('X',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'X',vyh);
      if oshibka = 1 then
      else
        begin
          X_nast:= StrToFloat(vyh) * 1000;
          X_nast:= Int(X_nast);                 // Отбрасываем дробную часть
          divobrazovanieVM(X_nast,kadr);
        end;
    end
  else
    if I_est then
      begin
        uslovie:= pos('Y',kadr);
        strok:= FloatToStr(X_divd);  // Преобразуем в число строку
        insert('X' + strok, kadr, uslovie);
      end;
  uslovie:= pos('Y',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'Y',vyh);
      if oshibka = 1 then
      else
        begin
          Y_nast:= StrToFloat(vyh) * 1000;
          Y_nast:= Int(Y_nast);                 // Отбрасываем дробную часть
          divobrazovanieVM(Y_nast,kadr);
        end;
    end
  else
    if I_est then
      begin
        uslovie:= pos('I',kadr);
        strok:= FloatToStr(Y_divd);  // Преобразуем в число строку
        insert('Y' + strok, kadr, uslovie);
      end;
  if (pos('G42', kadr) 0) or (pos('G41', kadr) 0) then
    begin
      try
        s:= Stroka.Strings[Succ(m)]; // ошибка нет строки вообще
      except
      on EStringListError do       // добавляем пустую строку и исключаем ошибку
        stroka.Add('');
      end;
      if pos('X', kadr) = 0 then
        begin                                  // Вставка Х и Y если нет
          uslovie:= FindVstavki('X', kadr);    // В позиции X Y I J F M
          Insert('X' + FloatToStr(X_nast), kadr, uslovie);
        end;
      if pos('Y', kadr) = 0 then
        begin
          uslovie:= FindVstavki('Y', kadr);
          Insert('Y' + FloatToStr(Y_nast), kadr, uslovie);
        end;
      if (pos('I', Stroka.Strings[Succ(m)]) 0) and (pos('J', Stroka.Strings[Succ(m)]) 0)
      then
        begin
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'I', st);
          I:= StrToFloat(st);
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'J', st);
          J:= StrToFloat(st);
          J:= J * 1000;
          I:= I * 1000;
          I:= I — X_nast;
          J:= J — Y_nast;
          Podhod_G41_G42_radius;
          if (I_sled = -1) and (J > 0) then J:= -J;
          if (I_sled = 1) and (J
          if(J_sled = -1) and (I > 0) then I:= -I;
          if(J_sled = 1) and (I
          if pos('J', kadr) 0
          then
            begin
              NaytiKoordinatu(kadr, 'J', st);
              PreobrazovanieVM(I, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('J', kadr);
              Insert('J' + FloatToStr(I), kadr, uslovie);
            end;
          if pos('I', kadr) 0
          then
            begin
              NaytiKoordinatu(kadr, 'I', st);
              PreobrazovanieVM(J, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('I', kadr);
              Insert('I' + FloatToStr(J), kadr, uslovie);
            end;
          X_divd:= X_nast;
          Y_divd:= Y_nast;
          exit;
        end
      else
        begin
          Podhod_G41_G42_line;
          if pos('I', kadr) 0
          then
            begin
              NaytiKoordinatu(kadr, 'I', st);
              PreobrazovanieVM(X_sled, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('I', kadr);
              Insert('I' + FloatToStr(X_sled), kadr, uslovie);
            end;
          if pos('J', kadr) 0
          then
            begin
              NaytiKoordinatu(kadr, 'J', st);
              PreobrazovanieVM(Y_sled, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('J', kadr);
              Insert('J' + FloatToStr(Y_sled), kadr, uslovie);
            end;
          exit;
        end;
    end;
  uslovie:= pos('I',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'I',vyh);
      if oshibka = 1 then
      else
        begin
          I:= StrToFloat(vyh) * 1000;
          I:= Int(I);                 // Отбрасываем дробную часть
          I:= I — X_divd;
          divobrazovanieVM(I,kadr);
        end;
    end;
  uslovie:= pos('J',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'J',vyh);
      if oshibka = 1 then
      else
        begin
          J:= StrToFloat(vyh) * 1000;
          J:= Int(J);                  // Отбрасываем дробную часть
          J:= J — Y_divd;
          divobrazovanieVM(J,kadr);
        end;
    end;
  uslovie:= pos('Z',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'Z',vyh);
      if oshibka = 1 then
      else
        begin
          Z:= StrToFloat(vyh) * 1000;
          Z:= Int(Z);                  // Отбрасываем дробную часть
          divobrazovanieVM(Z,kadr);
        end;
    end;
  uslovie:= pos('A',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'A',vyh);
      if oshibka = 1 then
      else
        begin
          A:= StrToFloat(vyh) * 1000;
          A:= Int(A);                   // Отбрасываем дробную часть
          divobrazovanieVM(A,kadr);
          Delete(kadr, uslovie, 1);
          Insert('U',kadr,uslovie);
        end;
    end;
  uslovie:= pos('K',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'K',vyh);
      if oshibka = 1 then
      else
        begin
          K:= StrToFloat(vyh) * 1000;
          K:= Int(K);                  // Отбрасываем дробную часть
    продолжение
--PAGE_BREAK--          divobrazovanieVM(K,kadr);
        end;
    end;
  X_divd:= X_nast;
  Y_divd:= Y_nast;
end;
procedure PC_VM(var kadr: string);
var
  uslovie: integer;
  I_est: boolean;
  s, st: string;
begin
  if (pos('%', kadr) 0) or (pos('$', kadr) 0) then exit;
  I_est:= False;
  if (pos('I',kadr) 0) or (pos('J',kadr) 0) then I_est:= true;
  if pos('X',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'X',vyh);
      if oshibka = 1 then
      else
        begin
          X_nast:= StrToFloat(vyh) * 1000;
          X_nast:= Int(X_nast);                 // Отбрасываем дробную часть
          divobrazovanieVM(X_nast,kadr);
        end;
    end
  else
    if I_est then
      begin
        uslovie:= pos('Y',kadr);            // Преобразуем в число строку
        insert('X' + FloatToStr(X_divd), kadr, uslovie);
      end;
  if pos('Y',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'Y',vyh);
      if oshibka = 1 then
      else
        begin
          Y_nast:= StrToFloat(vyh) * 1000;
          Y_nast:= Int(Y_nast);                 // Отбрасываем дробную часть
          divobrazovanieVM(Y_nast,kadr);
        end;
    end
  else
    if I_est then
      begin
        uslovie:= pos('I',kadr);                 // Преобразуем в число строку
        insert('Y' + FloatToStr(Y_divd), kadr, uslovie);
      end;
  if (pos('G42', kadr) 0) or (pos('G41', kadr) 0) then
    begin
      try
        s:= Stroka.Strings[Succ(m)]; // ошибка нет строки вообще
      except
      on EStringListError do       // добавляем пустую строку и исключаем ошибку
        stroka.Add('');
      end;
      if pos('X', kadr) = 0 then
        begin                                  // Вставка Х и Y если нет
          NaytiKoordinatu(Stroka.Strings[Succ(m)], 'X', s);
          if oshibka 1 then
            begin
              uslovie:= FindVstavki('X', kadr);
              s:= TrimRight(s);
              X_nast:= StrToFloat(s) * 1000;    // В позиции X Y I J F M
              Insert('X' + FloatToStr(X_nast), kadr, uslovie);
            end
          else
            begin
              X_nast:= X_divd;
              uslovie:= FindVstavki('X', kadr); // В позиции X Y I J F M
              Insert('X' + FloatToStr(X_nast), kadr, uslovie);
            end;
        end;
      if pos('Y', kadr) = 0 then
        begin
          uslovie:= FindVstavki('Y', kadr);
          NaytiKoordinatu(Stroka.Strings[Succ(m)], 'Y', s);
          s:= TrimRight(s);
          Y_nast:= StrToFloat(s) * 1000;
          Insert('Y' + FloatToStr(Y_nast), kadr, uslovie);
        end;
      if (pos('I', Stroka.Strings[Succ(m)]) 0) and (pos('J', Stroka.Strings[Succ(m)]) 0)
      then
        begin
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'I', st);
          I:= StrToFloat(st);
          Naytikoordinatu(Stroka.Strings[Succ(m)], 'J', st);
          J:= StrToFloat(st);
          Podhod_G41_G42_radius;
          J:= J * 1000;
          J:= Int(J);
          if (I_sled = -1) and (J > 0) then J:= -J;
          if (I_sled = 1) and (J
          if Pos('I', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'I', s);
              PreobrazovanieVM(J, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('I', kadr);
              Insert('I' + FloatToStr(J), kadr, uslovie);
            end;
          I:= I * 1000;
          I:= Int(I);
          if(J_sled = -1) and (I > 0) then I:= -I;
          if(J_sled = 1) and (I
          if Pos('J', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'J', s);
              PreobrazovanieVM(I, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('J', kadr);
              Insert('J' + FloatToStr(I), kadr, uslovie);
            end;
          Exit;
        end
      else
        begin
          Podhod_G41_G42_line;
          X_sled:= Int(X_sled);
          if Pos('X', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'I', s);
              PreobrazovanieVM(X_sled, kadr);
            end
          else
            begin
              uslovie:= FindVstavki('Y', kadr);
              Insert(FloatToStr(X_sled), kadr, uslovie);
            end;
          Y_sled:= Int(Y_sled);
          if Pos('Y', kadr) 0 then
            begin
              NaytiKoordinatu(kadr, 'J', s);
              PreobrazovanieVM(Y_sled, kadr);
              X_divd:= X_nast;
              Y_divd:= Y_nast;
              exit;
            end
          else
            begin
              uslovie:= FindVstavki('X', kadr);
              Insert(FloatToStr(Y_sled), kadr, uslovie);
            end;
        end;
    end;
  if pos('I',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'I',vyh);
      if oshibka = 1 then
      else
        begin
          I:= StrToFloat(vyh) * 1000;
          I:= Int(I);                 // Отбрасываем дробную часть
          divobrazovanieVM(I,kadr);
        end;
    end;
  if pos('J',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'J',vyh);
      if oshibka = 1 then
      else
        begin
          J:= StrToFloat(vyh) * 1000;
          J:= Int(J);                  // Отбрасываем дробную часть
          divobrazovanieVM(J,kadr);
        end;
    end;
  if pos('Z',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'Z',vyh);
      if oshibka = 1 then
      else
        begin
          Z:= StrToFloat(vyh) * 1000;
          Z:= Int(Z);                  // Отбрасываем дробную часть
          divobrazovanieVM(Z,kadr);
        end;
    end;
  uslovie:= pos('A',kadr);
  if uslovie 0 then
    begin
      NaytiKoordinatu(kadr,'A',vyh);
      if oshibka = 1 then
      else
        begin
          A:= StrToFloat(vyh) * 1000;
          A:= Int(A);                   // Отбрасываем дробную часть
          divobrazovanieVM(A,kadr);
          Delete(kadr, uslovie, 1);
          Insert('U',kadr,uslovie);
        end;
    end;
  if pos('K',kadr) 0 then
    begin
      NaytiKoordinatu(kadr,'K',vyh);
      if oshibka = 1 then
      else
        begin
          K:= StrToFloat(vyh) * 1000;
          K:= Int(K);                  // Отбрасываем дробную часть
          divobrazovanieVM(K,kadr);
        end;
    end;
    X_divd:= X_nast;
    Y_divd:= Y_nast;
end;
       //  НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ  obrabotka
begin
  if (Form1.NomerKadra.State = cbUnchecked) and (Form1.Probel.State = cbUnchecked) and
    (Form1.Pustostr.State = cbUnchecked) and (Form2.Ne_obrabatyvat.Checked) then
    begin
      ShowMessage(' Обработка не задана ');
      Goto metka;
    end;
  Priz_pusto_memo:= false;
  kol:= Memo1.Lines.Count;    //   Количество строк
  if kol = 0 then             //   Если поле пусто
    begin
      ShowMessage(' В поле редактирования пусто ');
      Goto metka;
    end;
  memo1mod:= true;
  Panel1.Caption:= IntToStr(kol);
  buf:= 0;   m:= 0;   I:= 0;   J:= 0;
  PolChisla_1Proc:= kol div 100;
  uvel:= PolChisla_1Proc;
  Indikator.Position:= 0;
  Proc:= Succ(Indikator.Position);
  u:= 100 div kol;
  Proci:= u;
  stroka:= TStringList.Create();
  stroka.Text:= Memo1.Text;
  Memo1.Clear;
  repeat
    bufer:= stroka.Strings[m];
    Panel2.Caption:= IntToStr(Succ(m));
    Panel2.Refresh;
    if (Form1.Probel.Checked)then
      DelProbel(bufer);                                // Удаляем пробелы
    if Form1.NomerKadra.Checked then                 // включен переключатель
      nomerkadra(bufer);
    if Form2.PC_MAYAK.Checked then
      pc_mayak(bufer);
    if Form2.PC_VM.Checked then
      pc_vm(bufer);
    if Form2.VM_MAYAK.Checked then
      VM_MAYAK(bufer);
    if Form2.MAYAK_VM.Checked then
      Mayak_vm(bufer);
    if kol >= 100 then
      begin
        if m >= PolChisla_1Proc then
          begin
            Indikator.Position:= Proc;
            Form1.PanelSostoyaniya.Panels[1].Text:= ' Выполнено ' + IntToStr(Indikator.Position) + ' %';
            PanelSostoyaniya.Refresh;  // Перерисовка панели
            Inc(proc);
            PolChisla_1Proc:= PolChisla_1Proc + uvel;
          end;
      end
        else
          begin
            Indikator.Position:= Proci;
            Form1.PanelSostoyaniya.Panels[1].Text:= ' Выполнено ' + IntToStr(Indikator.Position) + ' %';
            PanelSostoyaniya.Refresh;  // Перерисовка панели
            Inc(proci, u);
          end;
    stroka.Strings[m]:= bufer;   // Для токарного станка
    if Length(bufer) = 0 then
      if Form1.PustoStr.Checked then
        pustostroka;
    Bufer:= '';        //  Очистка строки Буфер
    Inc(m);       // Следующая строка (+1)
  until m >= kol;
  Panel1.Caption:= IntToStr(Stroka.Count);  // Сколько реально осталось
  Form1.PanelSostoyaniya.Panels[1].Text:= ' Выполнено ' + '100' + ' %';
  Indikator.Position:= 100;
  if (Form2.PC_MAYAK.Checked) or (Form2.PC_VM.Checked) or (Form2.VM_MAYAK.Checked) or (Form2.MAYAK_VM.Checked) then
    begin
      Form2.PC_VM.Enabled:= false;
      Form2.PC_MAYAK.Enabled:= false;
      Form2.VM_MAYAK.Enabled:= false;
      Form2.MAYAK_VM.Enabled:= false;
      Form2.Ne_obrabatyvat.Checked:= true;
    end;
  try      //  Ошибка если в Memo1 пробелы
  if Stroka.Strings[0] '' then    // Вставить пустую строку если её нет
    Stroka.Insert(0, '');
  except
    on EStringListError do
  end;
  Memo1.Text:= Stroka.Text;
  stroka.Free;
  metka:                     // если Поле пустое то выход сюда
end;
procedure TForm1.ToolButton6Click(Sender: TObject);  // Кнопка очистить
begin
  Memo1.Clear;
  Panel1.Caption:= '0';
  Panel2.Caption:= '0';
  Form2.PC_VM.Enabled:= true;
  Form2.PC_MAYAK.Enabled:= true;
  Form2.VM_MAYAK.Enabled:= true;
  Form2.MAYAK_VM.Enabled:= true;
  Label1.Caption:= '';
  Form2.FormActivate(Sender);
  Memo1.SetFocus;
  Indikator.Position:= 0;
end;
procedure TForm1.ToolButton4Click(Sender: TObject);  // Кнопка параметры
begin
  Form2.ShowModal;
end;
procedure TForm1.Toolbutton9Click(Sender: TObject); // Кнопка найти и заменить
begin
  ReplaceDialog1.Execute;
end;
procedure TForm1.ReplaceDialog1Replace(Sender: TObject); // Кнопка найти и заменить
label
  10;
begin
  Memo1.HideSelection:= true;
  10:
  if pos(ReplaceDialog1.FindText, Memo1.Text) 0 then
    begin
      Memo1.SelStart:= pos(ReplaceDialog1.FindText, Memo1.Text) — 1;
      Memo1.SelLength:= Length(ReplaceDialog1.FindText);
      Memo1.SelText:= ReplaceDialog1.ReplaceText;
      goto 10;
    end;
  Memo1.HideSelection:= false;
end;
procedure TForm1.memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Panel1.Caption:= IntToStr(Memo1.Lines.Count);
end;
procedure TForm1.ToolButton5Click(Sender: TObject); // Кнопка в верхний регистр
begin
  Memo1.Text:= UpperCase(Memo1.Text);
end;
procedure TForm1.ToolButton8Click(Sender: TObject);
begin
  Form5.Visible:= true;
end;
end.
ФайлUnit2.pas
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
  TForm2 = class(TForm)
    PereschotProg: TGroupBox;
    PC_MAYAK: TRadioButton;
    Ne_obrabatyvat: TRadioButton;
    PC_VM: TRadioButton;
    VM_MAYAK: TRadioButton;
    MAYAK_VM: TRadioButton;
    Button1: TButton;
    Mayk223mp: TRadioButton;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure Sostoyanie_perekluchateley;
begin
  if Form2.Ne_obrabatyvat.Checked then
    Form1.PanelSostoyaniya.Panels[0].Text:= st + Form2.Ne_obrabatyvat.Caption
  else
    if Form2.PC_MAYAK.Checked then
      Form1.PanelSostoyaniya.Panels[0].Text:= st + Form2.PC_MAYAK.Caption
  else
    if Form2.PC_VM.Checked then
      Form1.PanelSostoyaniya.Panels[0].Text:= st + Form2.PC_VM.Caption
  else
    if Form2.VM_MAYAK.Checked then
      Form1.PanelSostoyaniya.Panels[0].Text:= st + Form2.VM_MAYAK.Caption
  else
    if Form2.MAYAK_VM.Checked then
      Form1.PanelSostoyaniya.Panels[0].Text:= st + Form2.MAYAK_VM.Caption
  else
    if Form2.Mayk223mp.Checked then
      Form1.PanelSostoyaniya.Panels[0].Text:= st + Form2.Mayk223mp.Caption;
end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  Sostoyanie_perekluchateley;
  If Mayk223mp.Checked then
    begin
      Form2.Close;
    end;
end;
procedure TForm2.FormActivate(Sender: TObject);
begin
  Sostoyanie_perekluchateley;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
  Sostoyanie_perekluchateley;
  Form2.Close;
end;
end.
ФайлUnit5.pas
unit Unit5;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;
type
  TForm5 = class(TForm)
    GroupBox1: TGroupBox;
    RadioButton1: TRadioButton;
    Edit1: TEdit;
    Label1: TLabel;
    ButtonObpabotka: TButton;
    ButtonNastroyka: TButton;
    procedure FormActivate(Sender: TObject);
    procedure ButtonObpabotkaClick(Sender: TObject);
    procedure ButtonNastroykaClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form5: TForm5;
implementation
uses unit1, unit6;
{$R *.dfm}
procedure TForm5.FormActivate(Sender: TObject);
begin
  Form5.Caption:= Application.Title;
end;
procedure TForm5.ButtonObpabotkaClick(Sender: TObject);
var
  stroka, stroka1: TStrings;
  Name_File, kol_v_stroka: integer;
  chast, chot, ObshiySchot: integer;
  st, name: WideString;
begin
  stroka:= TStringList.Create();
  stroka1:= TStringList.Create();
  chot:= 0;  Name_File:= 1; chast:= 0;
  chast:= StrToInt(Edit1.Text) * 955;
  kol_v_stroka:= 0;
  ObshiySchot:= 0;
  stroka1.Text:= Form1.memo1.Text;
  repeat
    try
      st:= stroka1.Strings[ObshiySchot];
    except
      on EStringListError do
        begin
          Stroka.Free;
          stroka1.Free;
          Form1.memo1.Text:= ' Ошибка в редакторе: Возможно в поле редактирования пусто или одни пробелы';
          Form5.Close;
          Exit;
        end;
    end;
    if chot
      begin
        stroka.Insert(kol_v_stroka, st);
        Inc(chot, Length(st));                  //  Увеличиваем на длину строки
        Inc(kol_v_stroka);
        Inc(ObshiySchot);
      end
    else
      begin
        name:= Concat('E:\Наладчик\Пров\', IntToStr(Name_File), '.txt');
        stroka.SaveToFile(name);
        stroka.Clear;
        chot:= 0;
        kol_v_stroka:= 0;
        Name_File:= Succ(Name_File);
      end;
    if (stroka1.Count = ObshiySchot) and (Length(stroka.Text) 0) then
      begin
        name:= Concat('E:\Наладчик\Пров\', IntToStr(Name_File), '.txt');
        stroka.SaveToFile(name);
      end;
  until stroka1.Count = ObshiySchot;
  stroka.Free;
  stroka1.Free;
  Form5.Close;
  ShowMessage(' Обработка завершена ');
end;
procedure TForm5.ButtonNastroykaClick(Sender: TObject);
var
  NameF: WideString;
begin
  Form6.Visible:= true;
end;
end.
ФайлUnit6.pas
unit Unit6;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Registry, FileCtrl;
    продолжение
--PAGE_BREAK--


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.