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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
ВВЕДЕНИЕ
В настоящее время главной задачей автоматизации производства является сохранение и развитие отечественной технологической среды, обеспечивающей выпуск конкурентоспособных на мировом рынке национальных продуктов. В решении этой актуальной задачи главенствующая роль принадлежит созданию высокоэффективных производственных систем, реализующих современные технологии. Такие производства должны обладать высоким уровнем автоматизации всех составляющих элементов. Создание производств базируется на реконструкции действующих и проектировании новых. В современных условиях предъявляются особые требования к проектированию автоматизированных производств, к срокам и качеству выполнения проектных работ. Проектирование является сферой, аккумулирующей новейшие достижения науки и преобразующей их в действующие производственные системы, в частности, автоматизированные и автоматические участки и цеха.
Рисунок 1 Общая структура автоматизированной системы управления цехом
Основными этапами автоматизации технологических процессов является:
Технологическая подготовка включает комплекс работ, обеспечивающих наиболее эффективное применение новых, высокопроизводительных технологических процессов (ТП) с использованием передовых достижений науки и техники на базе максимальной механизации и автоматизации.
Под технологической подготовкой производства (ТПП) в общем случае понимается комплекс работ по обеспечению технологичности конструкции запускаемого в производство изделия, проектированию технологических процессов и средств технологического обеспечения, расчету технически обоснованных материальных и трудовых нормативов, необходимого количества технологического оборудования и производственных площадей, внедрению технологических процессов и управлению ими в производствах, обеспечивающих возможность выпуска нового изделия в заданных объемах.
Целью технологической подготовки является достижение в процессе изготовления продукции оптимального отношении между затратами и получаемыми результатами.
Технологическая подготовка производства для станков с ЧПУ состоит из трех этапов.
Первый этап совпадает с ТПП для обычного производства.
Второй этап геометрические расчеты описание обрабатываемых поверхностей для целей последующего программирования.
Геометрические расчеты включают в себя снятие координат с чертежа и задание базовой и опорных точек.
Базовая точка такая точка, куда выводится инструмент перед началом и после завершения обработки.
Опорная точка точка в которой осуществляется изменение направления движения инструмента.
Третий этап
В соответствии с сопроводительной информацией подбирается и налаживается режущий инструмент, технологическая оснастка. Производится наладка станка: заготовка устанавливается на стол в системе координат. Инструменты, предварительно настроенные на размер, закрепляются в соответствующих ячейках, зафиксированных в программе. Первый пуск программы осуществляется в присутствии технолога или программиста. Сначала станок работает по программе без заготовки, затем обрабатывается первая заготовка. Обработка идет в режиме покадрового считывания. Если обработке подлежит сложная и дорогостоящая заготовка, отладка программы производится на модели (деревянной или пластмассовой).
Автоматизированные системы ТПП включают решение следующих задач, отсутствующих в ТПП обычных производств:
автоматизация геометрических расчетов. Программно осуществляются расчеты, особенно сложные для криволинейных поверхностей и расчетов перемещений по эквидистанте;
автоматизация программирования. Для простых задач например, для сверлильных станков с ЧПУ вводится информация о координатах, диаметрах и глубинах отверстий, после чего программа формируется автоматически. Для более сложных задач программа формируется в диалоге с технологом. Далее осуществляется синтаксический анализ правильности программы компьютер ищет и указывает ошибки, технолог исправляет. Следующий этап кодирование программы в коды требуемого станка и вывод перфоленты (или запись на магнитную ленту или гибкий диск) осуществляется автоматически;
графическое моделирование траектории движения инструмента для тестирования программ ЧПУ. Данная задача ТПП станков с ЧПУ может быть решена только с использованием вычислительной техники. Построение траектории движения инструмента и вывод ее на экран дисплея или графопостроителя позволяет провести тестирование программы ЧПУ на этапе ее разработки и значительно снизить время на наладку станка с ЧПУ.
В конечном итоге технологическая подготовка производства при использовании станков с ЧПУ сводится к разработке управляющей программы (УП).
Существует три метода программирования обработки для станков с ЧПУ:
Ручное программирование является довольно утомительным занятием, так как все геометрические расчёты необходимо выполнять технологу-программисту. Особенно трудоёмко такие расчёты осуществлять для сложных криволинейных поверхностей. Однако все программисты-технологи должны иметь хорошее представление о технике ручного программирования независимо от того, как на самом деле они работают. В нашей стране существует еще немало предприятий, на которых используют метод ручного программирования. Действительно, если завод имеет несколько станков с ЧПУ, а изготавливаемые детали просты, то грамотный программист способен довольно успешно работать и без средств автоматизации собственного труда.
Метод программирования на пульте ЧПУ приобрёл особую популярность лишь в последние годы. Это связано с техническим развитием систем ЧПУ, улучшением интерфейса и возможностей. В этом случае, программы создаются и вводятся прямо на стойке ЧПУ, используя клавиатуру и дисплей. Современные системы ЧПУ действительно позволяют работать. Например, оператор станка может произвести верификацию УП или выбрать требуемый постоянный цикл при помощи специальных пиктограмм и вставить его в код УП. Некоторые системы ЧПУ предлагают диалоговый язык программирования, который значительно упрощает процесс создания УП, делает «общение» с ЧПУ удобным для оператора.
Программирование с помощью CAD/CAM систем позволяет «поднять» процесс написания программ обработки на более высокий уровень. Работая с CAD/CAM системой технолог-программист избавляет себя от трудоёмких математических расчётов и получает инструменты, значительно повышающие скорость написания УП.
Сегодня для достижения успеха на рынке промышленное предприятие вынужденно работать над сокращением срока выпуска продукции, снижению её себестоимости и повышения качества. Стремительное развитие компьютерных и информационных технологий привело к появлению CAD/CAM/CAE систем, которые являются наиболее продуктивными инструментами для решения этих задач.
Под CAD системой понимают программное обеспечение, которое автоматизирует труд инженера-конструктора и позволяет решать задачи проектирования изделий и оформления технической документации при помощи персонального компьютера.
CAM системы автоматизируют расчёты траекторий перемещения инструмента для обработки на станках с ЧПУ, и обеспечивают выдачу управляющей программы с помощью компьютера.
CAE системы предназначены для решения различных инженерных задач, например, для расчётов конструктивной прочности, анализа тепловых процессов, расчётов гидравлических систем и механизмов.
Общая схема работы с CAD/CAM системой:
Рассмотрев все методы создания программ для станков с ЧПУ можно выделить метод с использованием CAD/CAM систем. Данный метод обладает следующими преимуществами:
1 Исследовательский раздел
1.1 Программирование работы фрезерного станка
Детали, обрабатываемые на станке с ЧПУ можно рассматривать как геометрические объекты. Во время обработки вращающийся инструмент и заготовка перемещаются относительно друг друга по некоторой траектории. УП описывает движение определенной точки инструмента его центра. Траекторию инструмента представляют состоящей из отдельных, переходящих друг в друга участков. Этими участками могут быть прямые линии, дуги окружностей, кривые второго порядка или высших порядков. Точки пересечения этих участков называются опорными или узловыми точками. Как правило, в УП содержатся координаты именно опорных точек.
Рисунок 1.1 Геометрическое представление детали
1.1.1 Программирование работы фрезерного станка при помощи стойки ЧПУ станка (цеховое программирование)
Рассмотрим методику создания УП для обработки конструктивного элемента «паз» изображённого на рисунке 1.2. Для создания УП необходимо знать координаты опорных точек. Подробнее остановимся на создании строк программы непосредственно отвечающей за перемещение через опорные точки паза. Для обработки паза сначала нужно переместить фрезу в точку Т1 и опустить её на соответствующую глубину далее необходимо переместить фрезу последовательно через все опорные точки и вывести инструмент из материала заготовки. Для удобства определения координат опорных точек сведём их в таблицу.
Рисунок 1.2 Конструктивный элемент «паз»
Рисунок 1.3 Деталь в прямоугольной системе координат
Таблица 1.1 Координаты опорных точек паза
Точка |
Координата по оси Х |
Координата по оси Y |
Т1 |
3 |
8 |
Т2 |
3 |
3 |
Т3 |
7 |
3 |
Т4 |
7 |
8 |
Подвод режущего инструмента к первой опорной точке:
N50 G00 X3 Y8
Следующие два кадра заставляют инструмент опуститься на требуемую глубину в материал заготовки:
N60 G00 Z0.5
N70 G01 Z-1 F25
Как только инструмент окажется на нужной глубине (1 мм), можно перемещать его через все опорные точки для обработки паза:
N80 G01 X3 Y3
N90 G01 X7 Y3
N100 G01 X7 Y8
Теперь следует вывести инструмент из материала заготовки поднять на небольшую высоту:
N110 G01 Z5
Соберем все кадры вместе, добавим несколько вспомогательных команд и получим окончательный вариант программы.
Таблица 1.2 Управляющая программа
Кадры управляющей программы |
Пояснения |
% |
Символ начала программы |
О0001 |
Номер программы |
N10 G21 G49 G54 G80 G90 |
Строка безопасности |
N20 M06 T01 |
Вызов инструмента №1 |
N30 G43 H01 |
Компенсация длины инструмента №1 |
N40 M03 S1000 |
Включение оборотов шпинделя (1000 об/мин) |
N50 G00 X3 Y8 |
Ускоренное перемещение в опорную точку Т1 |
N60 G00 Z0.5 |
Ускоренное перемещение инструмента в Z0.5 |
N70 G01 Z-1 F25 |
Перемещение на глубину 1 мм на подаче 25 мм/мин |
N80 G01 X3 Y3 |
Перемещение инструмента в точку Т2 (25 мм/мин) |
N90 G01 X7 Y3 |
Перемещение инструмента в точку Т3 (25 мм/мин) |
N100 G01 X7 Y8 |
Перемещение инструмента в точку Т4 (25 мм/мин) |
N110 G01 Z5 |
Подъём инструмента вверх в Z5 (25 мм/мин) |
Таблица 1.2 Продолжение
N 120 M05 |
Выключение оборотов шпинделя |
N130 M30 |
Завершение программы |
% |
Символ конца программы |
1.1.2 Программирование на ПК с последующей передачей в стойку ЧПУ
Набор текста программы на ПК с последующей передачей в станок является гораздо более эффективным способом работы. Код УП можно набирать в любом текстовом редакторе и сохранять в соответствующем формате. Например, используя «Блокнот» из стандартного набора Windows.
Есть множество различных текстовых редакторов, которые были специально созданы для работы с кодом УП. Такие редакторы предоставляют широкие возможности по написанию и редактированию станочного кода. Например, они позволяют добавлять или удалять пробелы, автоматически нумеровать строки и перемещать курсор к коду смены инструмента. Эти функции не нужны обычному текстовому редактору, но очень полезны при создании и отладке программ обработки. Наиболее продвинутые редакторы УП имеют инструменты графической проверки кода и трансляции его в станок.
Некоторые тестовые редакторы сохраняют файлы в специальном формате, который содержит информацию о размере шрифта, полях и т.д. Код УП не содержит таких данных, а состоит исключительно из «чистого» текста в формате ASCII. Стандарт ASCII является открытым и может читаться любым текстовым редактором. Файлы такого формата, скорее всего, будут иметь расширение «*.txt».
Станки с ЧПУ работаю в формате G и M кодов в соответствии с стандартами EIA/ISO. Код этого стандарта аналогичен ASCII, но есть ряд небольших отличий. Формат ASCII использует коды окончания строки и переводка каретки в конце каждой строки. В текстовом редакторе для перехода на новую строку выполняется нажатием «Enter», код при этом не отображается, который переводит каретку на новую строку, хотя на самом деле он присутствует. Система ЧПУ требует, чтобы в конце каждого кадра УП стоял знак конца кадра, например «;» или «*». Поэтому, если вы пишите программу на компьютере, то она выглядит так:
…
N50 G00 X230
N60 G01 Y300
N70 G01 Z100
…
Если вы создаёте программу на компьютере и затем передаёте её на станок, то знак конца кадра помещается в конец каждого кадра УП при передаче в большинстве случаев автоматически.
Ошибка в программе обработки может повлечь за собой массу проблем. В лучшем случае ошибка обернется сломанным инструментом или брачной деталью, а в худшем может привести к повреждению станка или травме оператора. Опытный программист знает, что дешевле и проще проверить программу заранее на компьютере, чем ошибиться при выполнении обработки на станке. Основной метод проверки УП на компьютере заключается в графической симуляции обработки. Такая симуляция может выглядеть как прорисовка траектории центра инструмента или как полная имитация механической обработки на станке с демонстрацией удаления материала.
1.1.3 Передача управляющей программы в станок
После того, как вы создали и проверили программу обработки при помощи ПК, её необходимо передать на станок. Для передачи УП с компьютера в СЧПУ станка используется специальное коммуникационное программное обеспечение. В большинстве случаев связь осуществляется в соответствии со стандартом RS-232. При этом COM-порт компьютера соединяется с кабелем со специальным разъемом на корпусе станка или панели УЧПУ. Для передачи данных необходимо, чтобы УЧПУ станка и коммуникационная программа были синхронизированы. Это достигается соответствующей настройкой параметров СЧПУ и коммуникационной программы. Как правило, коммуникационная программа и кабель поставляются вместе со станком, а информация о настройке параметров СЧПУ для связи станка и компьютера можно получить из документации станка. Стоит отметить, что при передаче данных в соответствии с RS-232 желательно, чтобы длина кабеля не превышала 15 метров.
Для передачи УП, размер которых превышает свободный размер свободной памяти СЧПУ, используется режим DNC. Режим DNC или режим прямого числового управления позволяет выполнять программу обработки прямо из компьютера, не записывая её в память СЧПУ. УП считывается из компьютера в буфер памяти СЧПУ кадр за кадром. Как только система определяет, что один кадр выполнен, она его удаляет и загружает следующий, и так далее - до конца программы. Для работы в режиме прямого числового управления необходимо, чтобы СЧПУ станка было соответствующим образом подготовлено производителем, а на персональном компьютере находилась коммуникационная программа с поддержкой DNC режима.
Некоторые станки оборудованы собственными дисководами, что даёт возможность передавать УП и другие данные в СЧПУ при помощи традиционных программных носителей дискет и флэш-карт.
«Продвинутые» СЧПУ поддерживают интерфейс Ethernet, что позволяет более быстро и удобно передавать данные. Также предусмотрена возможность выхода в Интернет для дистанционного мониторинга системы и решения проблем непосредственно производителем станка в режиме реального времени.
1.2 Программирование УЧПУ для токарного станка
Перед программированием УЧПУ необходимо выполнить ряд подготовительных вычислений и операций:
Рисунок 1.4 Чертёж детали
1.2.1 Анализ, формы и конфигурации детали
Деталь представляет собой тело вращение (возможность изготовления на станках токарной группы). При изготовлении детали необходимо проточить три канавки различного размера, нарезать резьбу и просверлить отверстие.
1.2.2 Выбор заготовки
Заготовку выбираем таким образом, чтобы как можно меньше металла уходило в стружку для экономии материала в соответствии с этим принимается форма заготовки, изображённая на рисунке 1.5. Заготовка выполняется штамповкой из стали 45 ГОСТ 1050-74 методом горячего прессования.
Рисунок 1.5 Эскиз заготовки
1.2.3 Выбор инструмента
Для черновой и чистовой обработки основных поверхностей детали выбираем проходной подрезной резец с многогранной режущей пластиной (φ = 95°, φ1 = 5°), ГОСТ 27301-87 Т5К10.
Рисунок 1.6 Резец для черновой и чистовой обработки
Для прорезания канавок выбираем отрезной резец из быстрорежущей стали по ГОСТ 18874-83 из сплава Т5К10. Номер инструмента в управляющей программе Т2.
Рисунок 1.7 Резец для обработки канавок
Для нарезания резьбы выбираем резьбовой резец с пластиной из твёрдого сплава Т15К6 по ГОСТ 18885-73.
Рисунок 1.8 Резец для нарезания резьбы
Для сверления отверстия выбираем сверло Ø20 из сплава Т15К6 для сверления глубоких отверстий по ОСТ И-20-2-80.
Рисунок 1.9 Сверло
1.2.4 Технологический маршрут детали
Для данной детали технологический маршрут выглядит следующим образом.
Операция 010 Заготовительная. Штамповка.
Операция 020 Фрезерно-центровалъная. Фрезеровать торцы в размер
290, выполнить центровые отверстия до 010.
Операция 030 Токарная.
Переход 1. Точить основные поверхности предварительно согласно указанных размеров, оставив припуск на чистовую обработку инструментом Т1.
Переход 2. Точить основные поверхности окончательно согласно указанных размеров инструментом Т1.
Переход 3. Точить прямоугольные канавку согласно указанных размеров инструментом Т2.
Переход 4. Точить галтель и фаску согласно указанных размеров инструментом Т1.
Переход 5. Нарезать резьбу согласно указанных размеров инструментом Т3.
Переход 6. Просверлить отверстие согласно указанных размеров инструментом Т4.
1.2.5 Определение режимов резания
Определение режимов резания сводится к определению материала режущей части инструмента, числа оборотов вращения шпинделя, скорости вращения шпинделя, хода и подачи инструмента. Полученные данные представлены в таблице 1.3.
Таблица 1.3 Режимы резания
Номер перехода |
Номер инструмента |
Материал режущей части |
n, об/мин |
V, м/мин |
S, мм/об |
t, мм |
1 |
Т1 |
Т5К10 |
800 |
80 |
1,0 |
2,0 |
2 |
Т1 |
Т5К10 |
800 |
108 |
0,6 |
2,0 |
3 |
Т1 |
Т5К10 |
800 |
108 |
0,6 |
2,0 |
4 |
Т2 |
Т5К10 |
800 |
110 |
0,15 |
0,1 |
5 |
Т1 |
Т5К10 |
800 |
108 |
0,6 |
0,1 |
6 |
Т3 |
Т15К6 |
800 |
25 |
3 |
0,1 |
1.2.6 Разработка управляющей программы
По рассчитанным в таблице 1.3 режимам резания составим управляющую программу. Кадры программы представлены в таблице 1.4 с пояснениями.
Таблица 1.4 Управляющая программа
Кадры управляющей программы |
Пояснения |
N00 T1 |
Выбор инструмента |
N01 M3 |
Правое вращение шпинделя |
N02 M39 |
Второй диапазон вращения шпинделя |
N03 P800* |
Максимальная частота вращения шпинделя |
N04 P500 |
Минимальная частота вращения шпинделя |
N05 S80 |
Здание скорости резания |
N06 G95 |
Программирование режима подачи в мм/об |
N07 F100 |
Программирование значения подачи |
N08 ~X33400* |
Перемещение на ускоренном ходу по двум осям |
N09 Z850 |
|
N10 G77 |
Многопроходный черновой продольный цикл резания |
N11 X16600 |
Координата конечного диаметра резания |
N12 Z4000 |
Координата конечной точки рабочего хода |
N13 F000100 |
Минутная подача |
N14 P1000400 |
Величина припуска на рабочий ход инструмента |
N15 P2004500 |
Величина скоса конической поверхности по оси Х |
N16 ~X58000* |
Перемещение на укоренном ходу по двум осям |
N17 Z8500 |
|
N18 S108 |
Установка скорости резания |
N19 F60 |
Установка подачи |
N20 G77 |
Многопроходный черновой продольный цикл резания |
N21 X9600 |
Координата конечного диаметра резания |
N22 Z20700 |
Координата конечной точки рабочего хода |
N23 F000060 |
Минутная подача |
N24 P1000400 |
Величина припуска на рабочий ход инструмента |
N25 P2003300 |
Величина скоса конической поверхности по оси Х |
N26 ~X9600* |
Перемещение на укоренном ходу по двум осям |
Таблица 1.4 - Продолжение
N27 Z8500 |
|
N28 G77 |
Многопроходный черновой продольный цикл резания |
N29 X8000 |
Координата конечного диаметра резания |
N30 Z24000 |
Координата конечной точки рабочего хода |
N31 P1000400 |
Величина припуска на рабочий ход инструмента |
N32 P20000000 |
Величина скоса конической поверхности по оси Х |
N33 ~X33000* |
Перемещение на укоренном ходу по двум осям |
N34 Z20700 |
|
N35 S127 |
Задание скорости резания |
N36 G70 |
Однопроходный цикл продольного чистового точения |
N37 X16600 |
Координаты профиля детали |
N38 Z4000 |
|
N39 F000030 |
Минутная подача |
N40 P1000450 |
Промежуточные параметры детали |
N41 P20000000 |
|
N42 ~X12000* |
Перемещение на укоренном ходу по двум осям |
N43 Z9000 |
|
N44 G70 |
Однопроходный цикл продольного чистового точения |
N45 X8000 |
Координаты профиля детали |
N46 Z20700 |
|
N47 F000030 |
Минутная подача |
N48 P1003300 |
Промежуточные параметры детали |
N49 P2002300 |
|
N50 ~Z9000* |
Перемещение на укоренном ходу по двум осям |
N51 Z24000 |
|
N52 T2 |
Выбор инструмента |
N53 S101 |
Установка скорости резания |
N54 G75 |
Многопроходный цикл нарезания цилиндрических канавок |
N56 X7200 |
Координата дна канавки |
N57 Z24000 |
Координата точки последней канавки |
N58 F000015 |
Минутная подача |
N59 P000500 |
Шаг канавки |
N60 ~X16600* |
Перемещение на укоренном ходу по двум осям |
N61 Z16500 |
|
N62 G75 |
Многопроходный цикл нарезания цилиндрических канавок |
N63 X10000 |
Координата дна канавки |
N64 Z15500 |
Координата точки последней канавки |
N65 F000015 |
Минутная подача |
N66 P000500 |
Шаг канавки |
N67 ~X16600* |
Перемещение на укоренном ходу по двум осям |
N68 Z12300 |
|
N69 G75 |
Многопроходный цикл нарезания цилиндрических канавок |
N70 X12000 |
Координата дна канавки |
N71 Z12000 |
Координата точки последней канавки |
N72 F000015 |
Минутная подача |
N73 P000500 |
Шаг канавки |
N74 X8000* |
Перемещение на укоренном ходу по двум осям |
N75 Z400 |
|
N76 S108 |
Установка скорости резания |
Таблица 1.4 Продолжение
N77 F60 |
Установка подачи |
N78 T1 |
Выбор инструмента |
N79 -45°X8000 |
Снятие фаски |
N80 ~X16600* |
Перемещение на укоренном ходу по двум осям |
N81 Z19800 |
|
N82 G13 |
Круговая интерполяция против часовой стрелки |
N83 X12000 |
Снятия галтели |
N84 Z20700 |
|
N85 ~X10000 |
Перемещение на укоренном ходу по двум осям |
N86 300000 |
|
N87 T3 |
Выбор инструмента |
N88 S25 |
Установка скорости резания |
N89 G31 |
Многопроходный цикл нарезания резьбы |
N90 X71500 |
Наружный диаметр резьбы |
N91 Z4500 |
Координата конечной точки резьбы |
N92 F000030 |
Минутная подача |
N93 T4 |
Выбор инструмента |
N94 G73 |
Цикл глубокого сверления |
N95 X10000 |
Координата смещения оси сверла после сверления |
N96 Z11000 |
Координата конечной точки сверления |
N97 F000020 |
Минутная подача |
N98 P2750 |
Глубина сверления за один проход |
N99 ~X15000* |
Отвод инструмента на быстром ходу |
N10 Z5000 |
|
N101 M30 |
Конец программы |
1.2.7 Ввод программы в УЧПУ
Настройка станка и ввод программы осуществляются в следующем порядке. Прежде всего, выполняется размерная привязка каждого инструмента к системе координат станка. Эта процедура осуществляется методом пробных рабочих ходов с обработкой цилиндрических поверхностей (ось X) и торцов (ось Z) с последующим измерением фактически полученных размеров, которые учитываются затем при вводе в память УЧПУ координат исходных точек движения инструментов.
Программа набирается на пульте оператора, предварительно составленная технологом-программистом на специальном бланке.
1.3 Программирование работы координатно-пробивного пресса
Программирование координатно-пробивного пресса осуществляется с помощью ручного ввода программы непосредственно на пульте УЧПУ, с внешнего гибкого диска, с помощью ПК через порт RS-232. В целом методика программирования и ввода программы в память УЧПУ соответствует методикам, применяемым для фрезерного станка, описанным ранее.
Перед началом программирования необходимо выполнить ряд подготовительных операций:
Рисунок 1.10 Чертёж детали
1.3.1 Определение метода обработки
Деталь, изображённая на Рисунке 1.10, изготавливается из листового металла. Следовательно, данную деталь можно изготовить методом холодной листовой штамповки.
1.3.2 Определение положения зажимов.
Зажимы листа необходимо выставить таким образом, чтобы обеспечить равномерную фиксацию заготовки. При неравномерной фиксации возможны повышенные вибрации листа и как следствие неточности в изготовлении деталей. Также при программировании необходимо избежать попадания детали в мёртвую зону зажима.
1.3.3 Проверка номера инструмента и номера станции
Круглое отверстие Ø4 мм вырубка пуансоном Ø4 мм.
Круглое отверстие Ø8 мм вырубка пуансоном Ø8 мм.
Круглое отверстие Ø60 мм вырубка пуансоном Ø60 мм.
Контур детали вырубка пуансоном 5*85 мм и пуансоном 10*110 мм.
1.3.4 Определение последовательности штамповки
1.3.5 Вычисление значения координат
Таблица 1.5 Определение значения координат
Инструмент |
Координата по X |
Координата по Y |
Т304(Ø8 мм) |
10 |
10 |
10 |
370 |
|
10 |
210 |
|
370 |
210 |
|
Т203(Ø4 мм) |
102.32 |
92.32 |
102.32 |
121.68 |
|
137.68 |
92.32 |
|
137.68 |
121.68 |
|
242.32 |
92.32 |
|
242.32 |
121.68 |
|
277.68 |
92.32 |
|
277.68 |
121.68 |
|
Т219(Ø60 мм) |
120 |
110 |
260 |
110 |
После выполнения всех подготовительных операций можно перейти непосредственно к составлению текста программы.
Таблица 1.6 Управляющая программа
Строка кода |
Комментарии |
G06 A1.6 B0 |
Определение толщины и сорта металла |
G92 X1210. Y1270. |
Задание координат центра штамповки |
G98 X 30. Y100. I400. J250 P3 K2 |
Задание параметров штамповки многих деталей |
G90 |
Задание системы отсчета |
U1 |
Начало записи блока данных в память под адресом U1 |
X370. Y210. T304 |
Выбор инструмента и координаты первого удара в точке (X370; Y210) |
Y10. |
Удар в координатах (X370;Y10) |
X10. |
Удар в координатах (X10;Y10) |
Y210. |
Удар в координатах (X10;Y210) |
G72 X120. Y110. |
Задание координат точки отсчёта |
A1 G26 I50. J45. K4 T203 |
Штамповка группы отверстий и запоминание строки в качестве шаблона под адресом А1 |
G72 X260. |
Задание координат точки отсчёта |
B1 |
Вызов шаблона А1 в координатах (X260;Y110) |
V1 |
Окончание записи блока данных под адресом U1 |
Таблица 1.6 Продолжение
U2 |
Начало записи блока данных в память под адресом U2 |
X260. Y110. T219 |
Выбор инструмента и координаты первого удара в точке (X260; Y110) |
X120. |
Удар в координатах (X120;Y110) |
V2 |
Окончание записи блока данных под адресом U2 |
U3 |
Начало записи блока данных в память под адресом U3 |
G72 X380. Y220. |
Задание координат точки отсчёта |
G66 I220. J-90 P85. Q5. D-0.15 T255 |
Выбор инструмента и штамповка отрезка заданной длинны |
G72 X0.Y0. |
Задание координат точки отсчёта |
G66 I220. J90. P85. Q5. D-0.15 |
Штамповка отрезка заданной длинны |
V3 |
Окончание записи блока данных под адресом U3 |
U4 |
Начало записи блока данных в память под адресом U4 |
G72 X 0. Y220. |
Задание координат точки отсчёта |
G66 I380. J0. P110. Q10. D-0.15 T201 |
Выбор инструмента и штамповка отрезка заданной длинны |
G72 X 380. Y0. |
Задание координат точки отсчёта |
G66 I380. J180. P110. Q10. D-0.15 |
Штамповка отрезка заданной длинны |
V4 |
Окончание записи блока данных под адресом U4 |
G76 W1 Q4 |
Вызов и выполнение команд из участка памяти с адресом U1 в направлении оси Y |
G76 W2 Q3 |
Вызов и выполнение команд из участка памяти с адресом U2 в направлении оси Y |
G76 W3 Q2 |
Вызов и выполнение команд из участка памяти с адресом U3 в направлении оси Y |
G75 W4 Q3 |
Вызов и выполнение команд из участка памяти с адресом U4 в направлении оси X |
M13 |
Отмена режима штамповки |
G50 |
Код окончания программы, возвращение осей станка X и Y в нулевые координаты |
Схематично результат выполнения программы изображён на Рисунке 1.18.
Рисунок 1.18 Схема размещения деталей на заготовке
Рисунок 1.19 Масштаб А микро соединение
1.4 Постановка задачи проектирования
Рассмотренные способы и методы программирования различного оборудования с ЧПУ позволяют сделать следующие выводы:
2 СПЕЦИАЛЬНЫЙ РАЗДЕЛ
2.1 Разработка структуры программы
Транслятор по существу это компилятор, который осуществляет перевод программы с одного немашинного и необъектного языка на другой немашинный и необъектный язык. Если рассматривать ситуацию, когда реализуется перевод только с одного языка на один другой, то процесс такого преобразования состоит из двух этапов анализа и синтеза.
На этапе анализа выполняется распознавание текста исходной программы. Создание и заполнение таблиц идентификаторов. Результатом его работы является внутреннее представление программы, понятное транслятору.
На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице идентификаторов, порождается текст результирующе программы.
Кроме того, в составе конвертора присутствует часть, ответственная за анализ и исправление ошибок, которая должна при наличии ошибки в тексте исходной программы максимально полно информировать пользователя о типе ошибки и месте ее возникновения. В лучшем случае конвертор должен предложить пользователю вариант исправления ошибки.
С учетом этого конвертор с одного языка на один другой имеет обобщенную структурную схему, изображенную на рисунке 2.1.
С точки зрения теории формальных языком конвертор выполняет две основные функции:
- функцию распознавателя для языка исходной программы;
- функцию генератора для результирующей программы.
Распознаватель должен получить на вход цепочку символов входного зыка. Проверить ее принадлежность языку и выявить правила, по которым эта цепочка была построена. Генератором цепочек входного языка является пользователь автор входной программы.
Рисунок 2.1 - Обобщенная структурная схема конвертора (один канал)
Генератор языка результирующей программы должен построить на выходе цепочку выходного языка по его правилам. Распознавателем этой цепочки является устройство формирования управляющей программы для ЧПУ.
В соответствии с теорией построения компиляторов блок анализа решает три задачи:
- лексический анализ;
- синтаксический разбор;
- семантический анализ.
Вместе с тем, программирование для станков с ЧПУ имеет ряд существенных особенностей, в первую очередь связанных с необходимостью выполнения различных математических преобразований.
2.2 Разработка математического обеспечения
Машинная арифметика основывается на декартовой системе координат, где X, Y, Z основные программные координаты, I, J, K дополнительные (при расчёте круговой интерполяции и заходов на эквидистанту обрабатываемого контура). Координата A поворотное устройство. Расположение основных осей координат в станках с ЧПУ представлено на рисунке 2.2.
Рисунок 2.2 - Расположение осей координат в станках с ЧПУ (а); правосторонняя система координат (б)
Математический переход из системы ПК в систему Маяк осуществляется по следующей методике, которая показана на примере расчёта радиусов по G2, G3 (круговой интерполяции).
Эта задача предназначена для пересчёта круговой интерполяции и заходов на эквидистанту контура детали.
Алгоритм расчёта радиусов основан на расстоянии удаления точки центра радиуса от начальной точки радиуса (в относительной системе исчисления) и от ноля детали до центра радиуса (в абсолютной системе исчисления).
На рисунке 2.3 изображен эскиз обрабатываемой детали (контура).
Рисунок 2.3 - Эскиз обрабатываемой детали (контура)
Линии a и b отображают разницу расчётов радиусов при программировании в системах ВМ и Маяк.
Линия со стрелкой a - система Маяк (абсолютная система).
Линия со стрелкой b - система ВМ (относительная система).
Формула пересчёта радиусов.
I значение I координаты в обрабатываемом кадре.
J значение J координаты в обрабатываемом кадре.
X_pred значение координаты X в предыдущем кадре.
Y_pred значение координаты Y в предыдущем кадре.
I = X_pred + I;
J = Y_pred + J
Результаты преобразования приведены в таблице 2.1.
Таблица 2.1 - Результаты преобразования
Входные данные (Маяк) |
Выходные данные (ВМ) |
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 |
Из таблицы 2.1 следует, что нумерация кадров в обработанной программе восстановилась, лишние пробелы удалены.
В кадре N2 расставлены пропущенные точки (таков синтаксис программы обработки для станков с ЧПУ).
В кадре N3 рассчитаны и добавлены недостающие координаты захода.
В кадре N5 пересчитаны координаты I и J в соответствии с заданным методом обработки.
Эскиз линейных заходов на эквидистанту контура детали по G41 G42 представлен на рисунке 2.4.
Рисунок 2.4 - Эскиз линейных заходов на эквидистанту контура детали по G41 G42
Точка захода находится на линейном участке контура.
В данном случае вычисление производится по формуле:
I = X_sled X_nast;
J = Y_sled Y_nast,
где I значение I координаты в обрабатываемом кадре.
J значение J координаты в обрабатываемом кадре.
X_sled значение Х в следующем кадре.
X_nast значение Х в настоящем кадре.
Y_sled - значение Y в следующем кадре.
Y_nast значение Y в настоящем кадре.
Результаты преобразования приведены в таблице 2.2.
Таблица 2.2 - Результаты преобразования
Входные данные (Маяк) |
Выходные данные (ВМ) |
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.2 следует, что изменению подверглись кадры №2, 3, 4.
Эскиз заходов по радиусу на эквидистанту контура детали по G41 G42 изображен на рисунке 2.5
Рисунок 2.5 - Эскиз заходов по радиусу на эквидистанту контура детали по G41 G42
Расчёт захода на радиус несколько отличается от захода на линейный размер. Здесь важную роль играет вектор направления в зависимости от четверти, на которую направлен вектор на рисунке 2.6.
Рисунок 2.6 Выбор вектора направления в зависимости от четверти
Расчет осуществляется в соответствии с логическими условиями.
Сначала рассчитывается значение (I и J) из следующего кадра.
Логическое решение задачи.
Если G3, то проверяется значение заданных координат:
Если I_sled > 0 и J_sled >= 0, то I = 1, J = -1;
Если I_sled < 0 и J_sled <= 0, то I = -1, J = 1;
Если I_sled < 0 и J_sled >= 0, то I = 1, J = 1;
Если I_sled > 0 и J_sled <= 0, то I = -1, J = -1
Если G2, то проверяется значение заданных координат:
Если I_sled > 0 и J_sled >= 0, то I = -1, J = 1;
Если I_sled < 0 и J_sled <= 0, то I = 1, J = -1;
Если I_sled < 0 и J_sled >= 0, то I = -1, J = -1;
Если I_sled > 0 и J_sled <= 0, то I = 1, J = 1,
где J_nast значение J в обрабатываемом кадре;
J_sled значение J в следующем кадре.
I_nast значение I в настоящем кадре.
I_sled значение I в следующем кадре.
Y_nast значение Y в настоящем кадре.
X_nast значение X в настоящем кадре.
I и J служат для определения знака в выражении.
Расчет производится по формулам:
I_nast = Y_nast + J_sled
J_nast = X_nast + I_sled
с учетом условий:
если I = -1 и J > 0, то J_nast:= -J_nast;
если I = 1 и J < 0, то J_nast:= -J_nast;
если J = -1 и I > 0, то I_nast:= -I_nast;
если J = 1 и I < 0, то I_nast:= -I_nast.
2.3 Разработка алгоритмического обеспечения
2.3.1 Разработка обобщенного алгоритма программы конвертирования
Схема обобщенного алгоритма программы-конвертера приведена на листе 39.
2.3.2 Разработка алгоритма метода выбора обработки
Алгоритм описывает метод выбора обработки пользователем в зависимости от назначения конечного результата. В алгоритме используется графическая оболочка метода выбора обработки. В результате реализации алгоритма программа настраивается для обработки заданным методом.
Алгоритм выполняется по шагам.
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.
. vm_mayak(bufer).
7. Если Form2.MAYAK_VM.Checked, то переход к п.8.
8. mayak_vm(bufer).
9. Bufer:= ''.
10. Inc(m).
11. конец.
Условные обозначения, используемые в описании алгоритма, приведены в таблице 2.3.
Таблица 2.3 - Условные обозначения
Обозначение |
Расшифровка |
bufer |
Строка значение процедуры |
pc_mayak(bufer); |
Процедура пересчёта заданным методом |
pc_vm(bufer); |
Процедура пересчёта заданным методом |
vm_mayak(bufer); |
Процедура пересчёта заданным методом |
mayak_vm(bufer); |
Процедура пересчёта заданным методом |
Form2.MAYAK_VM.Checked |
Свойства переключателя |
Bufer |
Переменная хранения строки |
Inc() |
Функция увеличения |
Схема алгоритма модуля выбора метода обработки изображена на листе 40.
2.3.3 Разработка алгоритма выбора вспомогательных методов обработки
Алгоритм описывает дополнительные (вспомогательные) методы выбора обработки данных. В результате выбора подключаются дополнительные возможности (удаление пробелов, пустых строк и последовательная нумерация кадров). В алгоритме используется графическая оболочка метода выбора обработки. В результате реализации алгоритма программа настраивается для обработки дополнительными методами.
Алгоритм выполняется по шагам.
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. конец.
Условные обозначения, используемые в описании алгоритма, приведены в таблице 2.4.
Таблица 2.4 - Условные обозначения
Название |
Описание |
Bufer |
Переменная хранения строки |
Inc() |
Функция увеличение значения |
DelProbel(bufer); |
Функция удаления пробелов |
nomerkadra(bufer); |
Функция восстановления нумерации кадров |
pustostroka; |
Функция удаления пустых строк |
2.4 Разработка алгоритма конвертирования
Алгоритм описывает конвертирование исходного текста программы для станков с ЧПУ. В результате программа пересчитывает все исходные координаты из одной системы программирования в другую.
Алгоритм выполняется по шагам.
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_pred + I.
25. preobrazovanieMAYAK(I,kadr).
26. X_pred:= X_nast.
27. Y_pred:= Y_nast.
28. конец.
Условные обозначения, используемые в описании алгоритма, приведены в таблице 2.4.
Обозначение |
Расшифровка |
Kadr |
Текущая строка обработки |
NaytiKoordinatu(kadr,'X', vyh). |
Функция нахождения значения координаты |
vyh |
Выходное значение процедуры |
PreobrazovanieMayak(X_nast, kadr). |
Функция преобразования координаты |
X_nast и X_pred |
Числовая переменная настоящего и предыдущего значения Х |
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_pred |
Числовая переменная настоящего и предыдущего значения Y |
Таблица 2.4 Условные обозначения
Схема алгоритма конвертирования изображена на листе 43.
2.5 Разработка программного обеспечения
Программа-конвертер применяется для автоматизации процесса пересчёта исходного текста (кода) программ для станков с ЧПУ. При этом программа использует человеко-машинный интерфейс: человек выбирает, чем оперировать и параметры обработки данных, а программа выполняет все необходимые расчеты.
Для начала работы следует загрузить текстовый файл (программный код для станка с ЧПУ), и задать параметры его обработки. После этого программа производит пересчёт координат из данной в заданную систему программирования.
Программа разработана в среде программирования Borland Delphi 7.
2.5.1 Функциональное назначение
Программа выполняет конвертирование (пересчёт) исходных координат в заданную систему ЧПУ. Программа использует алгоритмы, описанные в подразделах 2.2-2.4.
Для функционирования программы необходим следующий комплекс технических средств:
процессор Pentium III 500 МГц и выше;
подсистема занимает около 5 Мб оперативной памяти. Дополнительно к этому программа выделяет дополнительную память под текстовые файлы, загруженные в её оболочку;
для размещения ОС Windows XP и прикладных задач на жестком диске необходимо минимально 1,5 Гб свободного пространства. На диске программа занимает 625 килобайт памяти. Дополнительное место на диске занимают текстовые файлы используемые программой, а также файлы создаваемые программой. С учетом этого на диске необходимо выделить достаточное пространство для всех файлов (от 10 Мб и выше);
видеоподсистема с объемом памяти 32 Мб;
цветной SVGA монитор с диагональю не менее 15 и разрешением не ниже 800x600 (рекомендуется 1024x768);
русифицированная клавиатура;
манипулятор «мышь».
2.5.2 Описание информации
Вся входная и выходная информация это текстовые файлы, написанные программистом вручную либо сгенерированные специальной графической программой обработки.
2.5.3 Используемые подпрограммы
В программе использованы следующие подпрограммы:
NaytiKoordinatu нахождения значения заданной координаты;
DobavitTochku добавление необходимой точки;
Podhod_G41_G42_radius расчёт радиусов при заходе инструмента на эквидистанту контура обрабатываемой детали;
preobrazovanieVM - преобразует строку, удаляет и вставляет подстроку (система ВМ);
preobrazovanieMAYAK - преобразует строку, удаляет и вставляет подстроку (система Маяк);
Podhod_G41_G42_line расчёт линейных заходов на эквидистанту контура обрабатываемой детали;
FindVstavki поиск места вставки заданной координаты;
DelProbel удаление всех пробелов;
Pustostroka удаление всех пустых строк;
Nomerkadra восстановление последовательной нумерации кадров;
PC_MAYAK пересчёт координат из системы Синумерик в систему Маяк;
VM_MAYAK пересчёт координат из системы ВМ в систему Маяк;
MAYAK_VM пересчёт координат из системы Маяк в систему ВМ;
PC_VM пересчёт координат из системы Синумерик в систему ВМ;
2.6 Контрольный пример
Контрольный пример предназначен для проверки корректности работы программы. В качестве исходных данных использовался текстовый файл программы обработки. В результате обработки (конвертирования) правильной исходной программы получается полностью работоспособная программа для станков с ЧПУ. Обработка подразумевает использование всех методов конвертирования. При использовании заведомо неверных координат и создании исключительных ситуаций выдается сообщение об ошибке.
В результате обработки данных контрольного примера получены текстовые файлы для различных систем программирования. Они проверены и просчитаны вручную и полностью соответствуют выбранной системе конвертирования.
3 ТЕХНОЛОГИЧЕСКИЙ РАЗДЕЛ
3.1 Технология разработки интерфейса пользователя
В соответствии с техническим заданием программа конвертирования исходного текста программы работы станка с ЧПУ из одной системы программирования в другую разработана под ОС Windows. Такие программы могут быть написаны на различных языках программирования, но в настоящее время считается наиболее целесообразным использование языков Object Pascal, C++, С#. При этом, практически все достаточно сложные приложения создаются с использованием систем программирования, под которыми понимают комплекс программных средств, предназначенных для кодирования, тестирования и отладки прикладного и системного программного обеспечения [7]. В качестве таких систем наиболее широкое применение в настоящее время находят системы программирования С++ Builder, Delphi и Visual C#.net.
Применение систем программирования существенно изменило и технологию разработки программ. Это обусловлено внедрением в современные системы программирования так называемых «языков четвертого поколения» - 4GL (four generation languages), а также поддержки ими систем «быстрой разработки программного обеспечения» - RAD (rapid application development). В данном разделе дипломного проекта использовалась технология разработки программы с использованием системы программирования Borland Delphi 7.
Borland Delphi 7 - одна из самых мощных систем, позволяющих на самом современном уровне создавать как отдельные прикладные программы Windows, так и разветвленные комплексы, предназначенные для работы в корпоративных сетях и Internet [8].
C одной стороны Borland Delphi 7, совмещая все прогрессивные возможности визуального проектирования и методологии объектно-ориентированного программирования, представляет собой по существу - средство автоматизации программирования, позволяющего существенно упростить и ускорить процесс создания проекта [8], с другой требует от разработчика знаний основных концепций и средств ОС Windows.
Программа на Delphi 7 состоит из объявлений (переменных, констант, типов, классов, функций) и описаний функций. Среди функций всегда имеется главная функция для работы с приложениями Windows WinMain. Эта функция формируется автоматически, с нее начинается работа программы. Она выполняет только некоторые подготовительные операции, необходимые для начала работы. Вся дальнейшая работа приложения определяется происходящими событиями и реакцией на них объектов.
Программы строятся по модульному принципу и состоят из нескольких модулей. Все объекты компонентов размещаются в объектах формах. Для каждой формы Borland Delphi 7 создает отдельный модуль.
После написания программы на ее основе создан выполняемый файл (модуль). Вначале работает препроцессор, осуществляющий преобразование исходного текста в соответствии со специальными директивами препроцессора, имеющимися в исходном тексте. После завершения работы препроцессора начинает работать компилятор, выполняя перевод текстов модулей в машинный (объектный) код. После окончания работы компилятора начинает работать компоновщик, объединяющий объектные файлы в единый загрузочный выполняемый модуль, имеющий расширение .ехе. Этот модуль можно запускать на выполнение.
Существует несколько возможных технологических подходов к проектированию приложений в Borland Delphi 7. В данном дипломном проекте выбрана технология на основе списка действий, управляемых специальными компонентами.
В соответствии с этой технологией разработка приложения (проекта в терминах системы программирования) включает два основных этапа, выполняемые в следующей последовательности:
1) составление первоначального (базового) списка действий, которые пользователь может выполнять с помощью данного приложения через разделы меню, инструментальные панели, кнопки и другие элементы управления. В дальнейшем этот базовый список может корректироваться - дополняться и уточняться;
2) разработка графического интерфейса пользователя.
Под действием (action) в проекте понимается реализация некоторого поведения, являющегося реакцией на поступок пользователя, такой, как щелчок мыши, щелчок по соответствующей кнопке или на разделе меню инициаторе действия или интерфейсном компоненте действия. Обработчики подобных стандартных действий реализованы в Borland Delphi 7 классами, наследующими базовому классу TAction.
В дипломном проекте с использованием среды программирования Borland Delphi 7 разработан графический интерфейс пользователя. Под графическим интерфейсом пользователя понимается тип экранного представления, при котором пользователь может выбирать команды, запускать Задачи и просматривать списки файлов, указывая на пиктограммы или пункты в списках меню, показанных на экране [11]. Существует множество рекомендаций по разработке графического интерфейса пользователя, но все они сводятся к двум основным понятиям:
- интерфейс должен быть «дружественным» для пользователя (обеспечение необходимой достаточности);
- дизайн используемых окон должен соответствовать психофизиологическим возможностям человека.
В данном дипломном проекте разработка графического интерфейса осуществлена на основе методики, изложенной в [16] и учитывающей психофизиологические особенности и человека.
В соответствии с этой методикой графический интерфейс программы включает следующие элементы.
1. Главное меню. Реализовано компонентом MainMenu.
2. Инструментальную панель быстрых кнопок, дублирующих основные разделы меню. Реализована через компонент ToolBar.
3. Контекстное меню. Реализовано компонентом PopupMenu, всплывающим при щелчке пользователем правой кнопкой мыши на том или ином компоненте.
4. Клавиши быстрого доступа ко всем разделам меню и всем управляющим элементам, «горячие» клавиши для доступа к основным командам.
5. Ярлычки подсказок, всплывающие при перемещении курсора мыши над быстрыми кнопками и иными компонентами.
6. Полосу состояния, реализуемую компонентом StatusBar и используемую для развернутых подсказок и выдачи различной информации пользователю.
7. Файл справки, темы которого отображаются при нажатии клавиши F1 или при выборе пользователем соответствующего раздела меню.
8. Информацию о версии, доступную пользователю при щелчке на пиктограмме приложения правой кнопкой мыши.
9. Возможность настройки приложения и запоминания настроек, чтобы при очередном сеансе работы восстанавливались настройки, установленные предыдущем сеансе.
Основные особенности интерфейса пользователя разработанной программы. Внешний вид главного окна интерфейса пользователя показан на рисунке 3.1.
Рисунок 3.1 Главное окно интерфейса пользователя
При нажатии кнопки «Открыть», открывается диалоговое окно выбора файла (рисунок 3.2):
Рисунок 3.2 - Диалоговое окно выбора файла
Выбираем вид обработки и нажимаем «Закрыть» (рисунок 3.3):
Рисунок 3.3 Диалоговое окно выбора вида обработки
Нажимаем кнопку «Обработка» (рисунок 3.4):
Рисунок 3.4 Окно контроля за выполнением программы
Программа полностью обработана заданным методом обработки.
Окно приложения использует стиль BorderStyle=bsSingle, что позволяет пользователю сворачивать окно и восстанавливать его, а также позволяет разворачивать на весь экран или изменять размер окна.
Мощным средством воздействия на психику человека является цвет, поэтому использованию цветовой гаммы уделено особое внимание. Неудачное цветовое решение может привести к быстрой утомляемости пользователя, к рассеянию его внимания и возникновению частых ошибок. Цвет должен связываться с различными состояниями объектов: нормальное состояние зеленый, аварийное красный. Количество используемых цветов ограничено и правильно сочетается (нежелательно использование красного на зеленом или черном это ведет к расфокусированию зрения). Использованы дополнительные цвета. Для фона использован нейтральный цвет - светло-серый (используется в большинстве приложения Microsoft).
Вся форма сначала выполнена в черно-белом варианте, а затем раскрашена с использованием только 16-ти системных цветов.
Шрифт надписей и текстов компонентов Borland Delphi 7 задается свойством Font. Выбран тип, цвет и размеры шрифта так, чтобы они соответствовали передаваемой пользователю информации.
Разработанное приложение имеет меню, поскольку именно оно дает наиболее удобный доступ к функциям программы. Для создания меню использованы компоненты MainMenu (для создания главного меню) и PopupMenu (для всплывающих меню). С целью сохранения сформированного у пользователей Windows автоматизма все меню стандартизированы.
Особое внимание уделено компоновке элементов на форме. Элементы ввода исходных данных и отображения результатной информации разделены по разным группам. В отдельную группу сведены управляющие элементы. Реализация такого разделения выполнена путем создания отдельных панелей.
В разработанном интерфейсе все действия пользователя с приложением сводятся к перемещению мыши и нажатию кнопок мыши и клавиатуры. В дипломном проекте принят стандарт общего пользовательского доступа, разработанный с учетом одного типа клавиатуры, а именно, расширенной клавиатуры фирмы IBM и различных манипуляторов «мышь». Пользовательский интерфейс позволяет пользователю легко переключаться с одного устройства на другое.
3.2 Технология тестирования программы
Программа-транслятор предназначена для конвертирования исходного текста программ для станков с ЧПУ и предназначена для использования на производстве в различных областях.
Программа позволяет:
конвертировать программный текст в любою из доступных программе систем;
удалять лишние пробелы;
удалять пустые строки;
устанавливать периодическую нумерацию кадров;
задавать шрифт (цвет, размер, тип);
печать документа;
визуальный контроль обработки;
менять регистр букв к заглавным(что требует синтаксис программ);
разбивать программу на заданное количество частей;
осуществляет поиск и замену по образцу.
Разработанная программа является приложением MS Windows. Для ее работы требуется наличие на компьютере операционной системы MS Windows NT4.0/2000/XP и все вытекающее отсюда техническое обеспечение.
Кроме того, требуется:
физическая память 1Mб + память на используемые и создаваемые текстовые файлы (не менее 5 Мб);
оперативная память 2*размер текстового файла. При нехватке оперативной памяти может использоваться виртуальная память. А за счет того, что все данные находятся в памяти, сильно сокращается время решения задач.
Для написания программы использовалась среда разработки Borland Delphi 7.
После запуска программы пользователь может запускать решение задачи в следующей последовательности:
- выбор (открытие) текстового файла;
- выбор метода конвертирования;
- выбор шрифта;
- выбор дополнительных методов обработки
Запустить программу можно из оболочки Windows, посредством запуска файла Наладчик.ехе.
В качестве входных и выходных данных используются текстовые файлы.
Сообщения, выдаваемые оператору, приведены в таблице 3.1.
Таблица 3.1 Сообщения, выдаваемые оператору
Вид сообщения |
Описание |
Действие |
В поле редактирования пусто |
В поле редактирования нет ни какого текста |
Введите текст в поле редактирования |
Обработка не задана |
Не поставлена ни одна галочка задач обработки |
Задайте обработку |
4 ЭКОНОМИЧЕСКИЙ РАЗДЕЛ
4.1 Планирование разработки программы с построением графика выполнения работ
Планирование и разработка программного средства содержит следующие этапы:
4.1.1 Основные этапы разработки программного средства
Все работы по разработке и внедрению программы разделены на 5 стадий:
В таблице 4.1 приведено содержание основных работ по каждому этапу
разработки программного комплекса.
Таблица 4.1 Состав работ по этапам
№ |
Перечень работ |
Этапы |
1 |
Постановка задачи |
Техническое задание (ТЗ) |
2 |
Определение требований |
|
3 |
Технико-экономическое обоснование |
|
4 |
Сбор и обработка справочных данных |
|
5 |
Анализ существующих программных комплексов |
|
6 |
Согласование и утверждение ТЗ |
|
7 |
Выбор программно-аппаратных средств |
Эскизный проект (ЭП) |
8 |
Разработка структурной схемы системы |
|
9 |
Согласование и утверждение ЭП |
|
10 |
Разработка алгоритмов программы |
Технический проект (ТП) |
11 |
Разработка интерфейса пользователя |
|
12 |
Согласование и утверждение ТП |
|
13 |
Программная реализация |
Рабочий проект (РП) |
14 |
Определение взаимодействия между различными частями системы |
|
15 |
Отладка |
|
16 |
Проверка работоспособности на реальных исходных данных |
|
17 |
Разработка технической документации |
|
18 |
Опытная эксплуатация |
Внедрение (ВР) |
19 |
Корректировка системы |
|
20 |
Сдача в эксплуатацию |
4.1.2 Расчет трудоемкости отдельных этапов разработки программного средства
В расчете стоимости разработки ПС используются “Укрупненные нормы времени на разработку программных средств вычислительной техники”.
Расчет затрат на разработку программы производится с учетом следующих факторов:
Все расчеты, были выполнены для СМ ЭВМ, имеющих слабые средства автоматизации проектирования баз данных и разработки программного обеспечения, по отношению к ПЭВМ, на которых будет реализован программный комплекс. Следует ввести коэффициент, учитывающий понижение сложности за счет более производительных программных средств автоматизации программирования: Ксап = 0,15, кроме того, современные ПЭВМ имеют более мощные аппаратные средства, которые тоже необходимо учитывать введением коэффициента понижения сложности за счет более производительных средств Ктс = 0,2.
Таким образом, общая расчётная трудоемкость может быть вычислена по формуле:
. (4.1)
Рассчитываем трудоемкость каждой операции разработки программного средства по формулам:
, (4.2)
, (4.3)
, (4.4)
, (4.5)
, (4.6)
где LТЗ, LЭП, LТП, LРП, LВН удельный вес трудоемкости отдельной стадии разработки (таблица 4.2).
Таблица 4.2 Значение коэффициентов удельных весов для стадий разработки
Стадия |
Удельный вес трудоемкости i-ой стадии разработки Li |
ТЗ |
0,09 |
ЭП |
0,07 |
ТП |
0,07 |
РП |
0,61 |
ВН |
0,16 |
Итоговая трудоемкость Тсум равна сумме трудоемкости каждого из этапов:
Тсум = 13 + 10 + 10 + 63 + 23 = 119 чел·дн.
Трудоемкость каждого вида работ Траб от общей трудоемкости стадии (Тi) определяется по формуле:
Траб = Кв Тi, (4.7)
где - весовой коэффициент (0 < Кв < 1, ).
Расчет продолжительности работ в днях по всем работам определяется по формуле:
, (4.8)
где - трудоемкость работы, чел*дн;
- количество работников, одновременно занятых в работе;
- коэффициент выполнения нормы ().
Количество рабочих дней в году Траб.дн.=251, общее число дней Тгод =365.
Коэффициент календарных дней вычисляется по формуле:
(4.9)
Продолжительность каждой работы в календарных днях определяется по формуле:
(4.10)
Данные по продолжительности каждого вида работ в календарных днях приведены в таблице 4.3.
Таблица 4.3 Перечень и продолжительность работ
№ |
Содержание работ |
Трудоем-кость каждой стадии разработки, чел/дни |
Трудоем- кость каждой работы, , чел/дни |
Продолжи-тельность работы, , рабочие дни |
Продол-житель-ность каждой работы, ,календарные дни |
|
ТЗ |
||||||
1 |
Постановка задачи |
26 |
0,16 |
2 |
2 |
3 |
2 |
Определение требований |
0,16 |
2 |
2 |
3 |
|
3 |
Технико-экономическое обоснование |
0,17 |
2 |
1 |
1 |
|
4 |
Сбор и обработка справочных данных |
0,18 |
2 |
2 |
3 |
|
5 |
Анализ существующих программных средств |
0,16 |
2 |
2 |
3 |
|
6 |
Согласование и утверждение ТЗ |
0,16 |
2 |
1 |
1 |
Таблица 4.3 Продолжение
ЭП |
||||||
7 |
Выбор программно-аппаратных средств |
20 |
0,25 |
3 |
3 |
4 |
8 |
Разработка структурной схемы системы |
0,4 |
4 |
2 |
3 |
|
9 |
Согласование и утверждение ЭП |
0,35 |
4 |
2 |
3 |
|
ТП |
||||||
10 |
Разработка алгоритмов программы |
20 |
0,25 |
3 |
3 |
4 |
11 |
Разработка интерфейса пользователя |
0,35 |
4 |
4 |
6 |
|
12 |
Согласование и утверждение ТП |
0,4 |
4 |
2 |
3 |
|
РП |
||||||
13 |
Программная реализация |
124 |
0,3 |
19 |
10 |
14 |
14 |
Определение взаимодействия между различными частями системы |
0,2 |
13 |
7 |
10 |
|
15 |
Отладка |
0,3 |
19 |
21 |
30 |
|
16 |
Проверка работоспособности на реальных исходных данных |
0,1 |
6 |
7 |
10 |
|
17 |
Разработка технической документации |
0,1 |
6 |
3 |
4 |
|
ВН |
||||||
18 |
Опытная эксплуатация |
47 |
0,3 |
7 |
8 |
12 |
19 |
Корректировка системы |
0,5 |
12 |
13 |
19 |
|
20 |
Сдача в эксплуатацию |
0,2 |
5 |
6 |
9 |
4.1.3 Построение сетевого графика выполнения работ
Календарный график выполнения работ составлен методом сетевого планирования и управления. Использование этого метода позволяет наглядно представить в комплексе и взаимосвязи перечень и объем работ и событий, совершение которых необходимо для осуществления поставленной цели [14].
Сетевой график планирования работ по разработке ПС (до оптимизации) представлен на листе 62. После расчета сетевого графика произведена его оптимизация за счет перераспределения исполнителей с работ подкритического пути, имеющего минимальные резервы времени, на работы критического пути, которые могут выполняться работниками тех же специальностей. Сначала определяем количество исполнителей, которые можно перевести на работу критического пути, затем продолжительность (новая) работ критического пути, на которые переведены исполнители.
Коэффициент напряженности работы (пути kнij) это отношение продолжительности несовпадающих (заключенных между одними и теми же событиями) отрезков пути, одним из которых является путь максимальной продолжительности, проходящий через данную работу, а другим критический путь. Он позволяет определить степень трудности выполнения в срок каждой группы работ некритического пути.
Если совпадающую с критическим путем величину отрезка пути обозначить , длину критического пути ТLкр, а протяженность максимального пути, проходящего через данные работы ТLмах, то коэффициент напряженности данного пути определяется по формуле:
(4.11)
Напряженным участком работ является путь, проходящий через работы
1-2, 2-4, 4-6, 6-7, но нет исполнителей, которых можно было перевести с однородных работ на этот путь.
Напряженным участком работ является путь, проходящий через работы
8-10, 10-11. Работа 9-11 имеет свободный резерв времени. Следовательно, с этой работы можно перевести часть исполнителей на однородную работу (8-10).
На участке 9-11 занято 2 человека, на участке 8-10 1 человек. В этом случае трудоемкость работ определяется по формуле:
Тцij=WpijTij, (4.12)
Тц(9-11)=Wp(9-11)T(9-11)=23=6 чел·дн.,
Тц(8-10)=Wp(8-10)T(8-10)=16=6 чел·дн.
Количество исполнителей (х), которых можно перевести с работы 9-11 на работу 8-10, увеличив продолжительность 9-11 на 1 день:
Тогда новая продолжительность (8-10):
,
А новая продолжительность (9-11):
Напряженным участком работ является путь, проходящий через работы 11-12, но нет исполнителей, которых можно было перевести с однородных работ на этот путь.
Сетевой график планирования работ по разработке ПС (после оптимизации) представлен на листе 64.
В результате оптимизации удалось сократить продолжительность работ на 3 дня, т.е. на 2,7 %, т.к. новая продолжительность критического пути составила 107 дней.
4.2 Расчет затрат на разработку и экономической эффективности проекта
4.2.1 Определение затрат на разработку программного комплекса
Затраты на разработку ПС определяются на базе расчетной трудоёмкости разработки и включает в себя следующие расходы [5]:
Заработная плата работников непосредственно участвующих в разработке ПС вычисляется по формуле:
Зисп = Со.зп + Сдоп.зп , (4.13)
где Со.зп основная зарплата работника, руб;
Сдоп.зп дополнительная зарплата работника, руб.
Заработная плата категориям работников определяется в соотвестсвие со штатным расписание ведомства предприятия.
Дополнительная заработная плата составляет 12% от основной заработной платы.
Сдоп.зп =7945,6 руб.
Зисп =66213,6+ 7945,6= 74159,2 руб.
Отчисления во внебюджетные фонды Свф составляет 34% от заработной платы работников.
Свф= руб.
Накладные расходы, связанные с организацией работ и управлением определяются по формуле:
Нр = 3исп . К, (4.14)
где Нр - накладные расходы, руб;
3исп зарплата исполнителей, руб;
К коэффициент учета накладных расходов (К=0,8).
Нр= руб.
Стоимость машинного времени определяется по формуле:
Смаш=Тмаш·Т·8, (4.15)
где Тмаш - час машинного времени (Тмаш=7 руб.);
T - общая трудоемкость.
Смаш=7·185·8=10360 руб.
Себестоимость разработки приведена в таблице 4.15.
Таблица 4.4 Себестоимость разработки
Статья расходов |
Обозначение |
Сумма расходов, руб. |
Зарплата исполнителей |
3исп |
74159,2 |
Отчисления во внебюджетные фонды |
Свф |
|
Стоимость материалов |
Смат |
812 |
Накладные расходы |
Нр |
|
Прочие расходы |
Смаш |
10360 |
ИТОГО: Сразр |
164088,3 |
4.2.2 Расчет экономической эффективности от внедрения проекта
Цена разработки определяется по формуле:
Цразр = 1.5 . Сразр = 1,5 · 164088,3 = 246132,4 руб , (4.16)
где 1,5 коэффициент наценки на издержки.
Годовой экономический эффект рассчитывается по формуле:
Э = ∆С Ен . Кдоп , (4.17)
где ∆С - годовая экономия текущих затрат;
Ен - нормативный коэффициент сравнительной экономической
эффективности капиталовложений (Ен=0,15);
Кдоп - дополнительные капиталовложения при внедрении проекта.
Годовая экономия текущих затрат рассчитывается по формуле:
∆С=Сбаз - Спроек , (4.18)
где Сбаз - текущие затраты по базовому варианту, руб;
Спроек текущие затраты по проектному варианту, руб.
Текущие затраты по базовому варианту рассчитываются по формуле:
Сбаз=Со.зп+Сдоп.зп+Свф+Нр+Смат+Саренд+Сотоп+ Стэ +Саморт , (4.19)
где Смат - затраты на материалы, руб;
Саренд - арендная плата, руб;
Сотоп - плата за отопление помещения, руб;
Стэ - затраты электроэнергии на создания ПС, руб;
Саморт - амортизационные начисления, руб.
По базовому варианту работу выполняют двое программистов, имеющих 10 разряд. Заработная плата программиста 8863,5 рублей в месяц, следовательно, годовой фонд зарплаты составит 164088,3 руб.
Свф=164088,3. 0,34 = 55790,1 руб.
Нр=164088,3. 0,8 = 131270,6 руб.
Затраты на материалы примем 5 пачек бумаги (150 руб.) и 2 картриджа для принтера (450 руб.) и составляют 1650 руб.
Арендная плата (Саренд) рассчитывается из расчета 6 м2 на человека, стоимость 1 м2 3000 рублей в месяц и составляет 432000 руб. в год.
Плата за отопление помещения (Сотоп) составляет 1000 руб. в месяц и за год составит 12000 руб.
Затраты электроэнергии на создания ПС определяются по формуле:
Стэ = Ny k ст Fд d, (4.20)
где Ny мощность ЭВМ, кВт/час;
к коэффициент использования оборудования по мощности и во
времени, применяемый в пределах 0,7 0,9;
ст коэффициент, учитывающий потери электричества в сети и равный 1,04;
Fд действительный фонд времени работы оборудования в часах равный
1200 час.;
d тариф за 1кВт/час электроэнергии 3,36 руб. (2011 г.).
Подставляя значения в (4.8), находим Стэ.
Стэ = 0,6 · 0,7 · 1,04 · 1200 · 3,36 = 1761,2 руб.
Амортизационные начисления рассчитываются по формуле:
, (4.21)
где Nп - кол-во программистов;
Цкомп - цена компьютера, руб;
Цпри - цена принтера, руб;
Тсл - срок службы оборудования.
Текущие затраты по базовому варианту в соответствии с формулой (4.19) составляют:
Сбаз=164088,3+42991,1+131270,6+1650+432000+12000+1761,2+13400=
= 799161,2 руб.
Использование программного средства для повышения оперативности перепрограммирования станков с ЧПУ позволяет снизить трудоёмкость работ в два раза, т.к. автоматизирует процесс конвертирования кода программы работы станка с ЧПУ. По проектному варианту ту же работу будет выполнять один человек.
При той же зарплате годовой фонд зарплаты составляет:
Со.зп+Сдоп.зп = 8863,5.12 +8863,5.12.0,12 = 119125,4 руб.
Свф=119125,4 . 0,34 = 40502,6 руб.
Нр=119125,4 . 0,8 = 95300,3 руб.
Затраты на материалы 2 пачки бумаги (150 руб.) и 1 картридж для принтера (450 руб.) и составляют 750 руб.
Арендная плата (Саренд) рассчитывается из расчета 6 м2 на 1 человека, стоимость 1 м2 3000 рублей в месяц и составит 216000 руб. в год.
Плата за отопление помещения (Сотоп) составляет 1000 руб. в месяц и за год составит 12000 руб.
Затраты электроэнергии на создания ПС в соответствии с формулой (4.20):
Стэ = 0,6 · 0,7 · 1,04 · 1200 · 2,05 = 1074,5 руб.
Саморт определяется по формуле (4.21) и составляет 8400 руб.
Себестоимость по проектному варианту составит:
=119125,4+31210,9+95300,3+750 +216000 +12000+1761,2+8400=
= 484547,8 руб.
Годовая экономия текущих затрат составит:
=799161,2 483861,1 = 315301,1 руб.
Дополнительные капитальные вложения определяются по формуле:
Кдоп= Цразр +Црес , (4.22)
где Цразр стоимость программного продукта, руб;
Црес стоимость внедрения, отсутствует, руб.
Кдоп= 164088,3 руб.
Годовой экономический эффект:
Э = 315301,1+ 0,15 ·164088,3 = 339914,4 руб.
Срок окупаемости капитальных вложений определяем по формуле:
Ток=Кдоп/С (4.23)
С=315301,1 руб.
Ток=164088,3 / 315301,1=0,52 года.
Основные технико-экономические показатели проекта, полученные в результате расчетов, приведены в таблице 4.5
Таблица 4.5 Основные экономические показатели проекта
Наименование показателей |
Единица измерения |
Варианты |
Проектный вариант в % к базовому |
|
Базовый |
Проектный |
|||
Трудоемкость разработки |
чел/дни |
- |
185 |
- |
Продолжительность разработки |
кал/дни |
- |
190 |
- |
Затраты на разработку |
руб. |
- |
164088,3 |
- |
Количество работников |
чел. |
2 |
1 |
50% |
Годовые текущие затраты |
руб. |
799161,2 |
484547,8 |
61% |
Годовая экономия текущих затрат |
руб. |
- |
315301,1 |
- |
Годовой экономический эффект |
руб. |
- |
339914,4 |
- |
Срок окупаемости |
год |
0,52 |
Полученные значения технико-экономических показателей позволяют сделать следующие выводы:
Таким образом, введение в эксплуатацию транслятора текста программы работы станка с ЧПУ из одной системы программирования в другую является экономически целесообразным.
5 БЕЗОПАСНОСТЬ ЖИЗНЕДЕЯТЕЛЬНОСТИ
На любом рабочем месте присутствуют факторы, негативно влияющие на человека.
В связи с увеличением числа компьютеров, многие тысячи людей проводят большую часть рабочего дня за экраном дисплея. Наряду с признанием несомненной пользы применения компьютерной техники она вызывает беспокойство за свое здоровье и многочисленные жалобы пользователей ПК.
5.1 Анализ опасных и вредных факторов, возникающих в процессе эксплуатации ПЭВМ
Задача охраны труда это обеспечение комфортных условий работы и сведение к минимуму вероятности воздействия вредных производственных факторов на работающих людей.
Анализ опасных, вредных факторов и возможных чрезвычайных ситуаций проведен в соответствии с ГОСТ 12.1.003 74 [19].
Особенностью работы оператора является наличие на рабочем месте сложного по конструкции монитора, причем оператор ПК. Туловище оператора, его конечности (руки и ноги), а также органы зрения имеют крайне ограниченную зону перемещения и зрительного обзора. Кроме того оператор ПК перерабатывает большой объем информации в относительно короткое время, выполняя сложную по своему характеру работу.
Особенностью работы за компьютером является иной принцип чтения информации, чем при обычном чтении. При обычном чтении текст на бумаге, расположенный горизонтально на столе, считывается оператором с наклоненной головой при падении светового потока на текст. При работе на компьютере считывание текста производится почти не наклоненной головой, глаз смотрят прямо или почти прямо вперед, текст (источник - люминесцирующее вещество экрана) формируется по другую сторону экрана, поэтому пользователь считывает не отраженный текст, а смотрит непосредственно на источник света, что очень вредно для глаз. Они испытывают большое напряжение. Это называется синдромом длительных зрительных нагрузок [21]. Также установлено, что в процессе считывания информации с монитора компьютера, оператор начинает моргать в несколько раз реже, что усиливает напряжение глаз и приводит к усталости и чувству утомления.
Существует еще синдром длительных статических нагрузок. Пользователю приходится длительное время сидеть практически неподвижно. От этого сильно страдает позвоночник, мышцы поясницы, области солнечного сплетения находятся в постоянном напряжении. Это вызывает боли в этих отделах. Особенно страдает шейный отдел. Человек сидит часто неправильно, наклонив голову что вызывает напряжение области седьмого позвонка, затеканию шеи, и впоследствии - остеохондроз. При печатании идет нагрузка на руки и плечевой отдел (она незначительная), но со временем очень ощутимая. Проявляются боли от перенапряжения в этой области. Кроме того, страдают суставы на пальцах от постоянных ударов о клавиши, стирается суставная жидкость, что приводит к болезни.
Синдром нагрузок излучений от компьютера проявляется в сонливости и чувстве утомленности. Кроме того, страдает щитовидная железа.
Синдром длительных психологических нагрузок проявляется в ухудшении памяти, рассеянности внимания, депрессивном состоянии.
5.1.1 Физические опасные и вредные факторы
При работе оператора ПЭВМ возникают следующие опасные и вредные факторы.
5.1.1.1 Электромагнитное излучение
Источниками излучения высоких и низких частот являются трансформаторы, микропроцессоры и провода, по которым проходит переменный ток высокого напряжения.
Перечисленные виды излучения, действующие в пределах норм, безопасны для здоровья человека [2]. Но систематическое воздействие электромагнитных излучений, превышающих допустимую величину, может вызвать функциональные изменения в состоянии нервной и сердечно-сосудистой систем, что проявляется в повышении утомляемости, нарушении сна, гипертонии или гипотонии, появлении болей в области сердца, нервно-психических расстройствах.
Систематическое воздействие ЭМП, превышающих допустимую величину, может оказать неблагоприятное влияние на человека, выражающееся в функциональных нарушениях нервной, эндокринной и сердечнососудистой систем.
Цветной видеомонитор имеет свойство накапливать статические заряды на поверхности экрана [2]. Уровни напряженности электростатического поля невелики, напряженность электрического поля между экраном видеотерминала и оператором составляет 5-15 кВ/м, что не выше нормы, и не оказывают существенного воздействия на организм человека, но приводит к загрязнению экрана и притягивания к нему отрицательных ионов и частиц пыли.
Положительные ионы, которыми электростатическое поле обогащает окружающую среду, оказывают неблагоприятное воздействие на здоровье человека, вызывая головную боль, быструю утомляемость, снижая работоспособность человека.
5.1.1.2 Повышенный уровень шума
Источниками шума являются вентилятор и электромеханические устройства. Согласно классификации, шум при работе на ПЭВМ является широкополосным с непрерывным спектром шириной более одной октавы.
Непрерывное воздействие шума на слух людей разрушает нервную систему; шумовые явления обладают свойством кумуляции: накапливаясь в организме, он все больше угнетает нервную систему. Шум причина преждевременного утомления, ослабления внимания, памяти.
5.1.1.3 Недостаток естественного освещения
При недостаточной освещенности и плохом качестве освещения состояние зрительных функций находится на низком исходном уровне, повышается утомление зрения в процессе выполнения работы.
Чрезмерно яркое освещение вызывает ослепление, раздражение и резь в глазах. Неправильное направление света на рабочем месте может создавать резкие тени, блики, дезориентировать работающего [1]. Все эти причины могут привести к несчастному случаю или профзаболеваниям, поэтому столь важен правильный расчет освещенности.
Коэффициент естественного освещения (КЕО) должен быть не ниже 1,2% в зонах с устойчивым снежным покровом и не ниже 1,5% на остальной территории.
5.1.1.4 Пожарная опасность
Пожары на рабочем месте представляют особую опасность, так как сопряжены с большими материальными потерями и угрозой получения травм, ожогов или гибели людей. Пожар может возникнуть при взаимодействии горючих веществ, окисления и источников зажигания. В помещениях, предназначенных для работы за ПК, присутствуют все три основных фактора, необходимые для возникновения пожара. Горючими компонентами являются: строительные материалы для акустической и эстетической отделки помещений, перегородки, двери, полы, изоляция кабелей и др.
Проектирование и эксплуатация всех промышленных предприятий (кроме предприятий по изготовлению взрывчатых веществ, имеющих свои особые нормы и правила) регламентируются «Строительными нормами и правилами» (СНиП II-90-81, СНиП IL2-80), «Правилами устройства электроустановок» (ПУЭ-2000), а также «Типовыми правилами пожарной безопасности для промышленных предприятий». В соответствии со НПБ 01-03 все производства делят по пожарной и взрывопожарной опасности на 4 категории.
Категория производства по пожарной опасности в значительной степени определяет требования к зданию, его конструкциям и планировке, организацию пожарной охраны и ее техническую оснащенность, требования к режиму и эксплуатации. Поэтому вопрос отнесения производства к той или иной категории является исключительно важным.
Источниками зажигания могут быть электронные схемы от ЭВМ, приборы, применяемые для технического обслуживания, устройства электропитания, кондиционирования воздуха, где в результате различных нарушений образуются перегретые элементы, электрические искры и дуги, способные вызвать загорания горючих материалов [2].
Вследствие очень высокой плотности размещения элементов электронных схем в непосредственной близости друг от друга располагаются соединительные провода, кабели. При протекании по ним электрического тока выделяется значительное количество теплоты. При этом возможно оплавление изоляции. Для отвода избыточной теплоты от ЭВМ служат системы вентиляции и кондиционирования воздуха. При постоянном действии эти системы представляют собой дополнительную пожарную опасность. Энергоснабжение осуществляется от трансформаторной станции и двигатель-генераторных агрегатов. На трансформаторных подстанциях особую опасность представляют трансформаторы с масляным охлаждением. В связи с этим предпочтение следует отдавать сухим трансформаторам.
5.1.2 Психофизиологические опасные и вредные факторы
5.1.2.1 Статические перегрузки
Длительная и постоянная работа на ПЭВМ приводит к болезни рук, спины, плеч и шеи, а также тенденитам (воспалением тканей сухожилия) в результате длительных статических нагрузок, и связаны с использованием клавиатуры. Длительное пребывание в сидячем положении при работе с ПЭВМ приводит к перенапряжению мышц спины и ног. Это происходит в основном из-за нерациональной высоты рабочей поверхности стола и кресла, отсутствия опорной спинки и подлокотников, неудобное размещение рабочих документов, ПЭВМ и клавиатуры, отсутствия подставки для ног.
5.1.2.2 Нагрузка на органы зрения
Одной из основных особенностей работы на ПЭВМ является иной принцип чтения информации, который приводит к нарушению функционального состояния зрительного анализатора и центральной нервной системы из-за постоянного и направленного характера труда.
Нарушение функционального состояния зрительного анализатора проявляется в снижении остроты зрения и аккомодации, электрической чувствительности и лабильности, нарушении мышечного баланса. Установлено, что случаи заболевания конъюнктивитом у пользователей ПК встречаются в два раза чаще, чем у людей, не связанных с работой на ПК. Причинами расстройства органов зрения при работе на ПК является: повышенное зрительное напряжение при напряженной работе, постоянная переадаптация глаз в условиях наличия в поле зрения объекта различения и фона различной яркости, наличием разно удаленных объектов, недостаточной четкостью и контрастностью изображения на экране, строчностью структуры, воспринимаемой информации, невысоким качеством информации исходного документа, наличием ярких пятен, за счет отражения светового потока на клавиатуре и экране, большой разницей между яркостью рабочей поверхности и окружающими поверхностями неравномерной и недостаточной освещенностью на рабочем месте [1].
5.2 Мероприятия по обеспечению безопасных условий труда специалиста
Для обеспечения безопасных условий труда специалиста, необходимо провести расчёт параметров искусственного освещения.
5.2.1 Расчёт искусственного освещения
В таблице 5.1 приведены параметры помещения, в котором размещены ПК [20].
Таблица 5.1 Параметры помещения
Название производственного помещения |
Габариты помещения |
Тип лампы общего освещения |
Нормы освещённости Ен, лк |
|||
Длина l1, м |
Ширина l2, м |
Высота l3, м |
При комбинированном освещении, не менее |
При общем освещении, не менее |
||
Операционный зал |
18 |
12 |
3 |
ЛЛ |
500 |
300 |
Расстояние между светильниками L определяется по формуле:
L = λ∙Hр = 1,5 · 4 = 4,5 м, (5.)
где λ коэффициент наивыгоднейшего расположения светильников,
Нр высота подвеса светильника над рабочей поверхностью.
Количество ламп N вычисляется по формуле:
N = l1 l2 /L2 = 18 · 12 / 20,25 = 11 шт, (5.2)
где l1, l2 габариты помещения;
L расстояние между светильниками.
Индекс помещения j определяется по формуле:
j = a∙b/(a+b)∙Hр = 18 · 12 / 30 / 3 =2,4, (5.3)
где а и b длина и ширина помещения соответственно;
р высота помещения.
По индексу помещения выбираем η = 0,6.
Требуемый световой поток определяется по формуле:
, 5.4)
где Е нормируемая освещённость;
S площадь помещения;
k коэффициент запаса;
z поправочный коэффициент;
n количество ламп в светильнике.
Находим ближайший подходящий светильник. Среди ЛЛ люминесцентных ламп ЛБ-80 со световым потоком 5220 лм.
Рассчитываем количество светильников с заданным световым потоком по формуле:
, (5.5)
где Fл требуемый световой поток;
Е нормируемая освещённость;
S площадь помещения;
k коэффициент запаса;
z поправочный коэффициент;
n количество ламп в светильнике.
Количество светильников в ряду M определяется по формуле:
M = l1/L = 18 / 4,5 = 4 (5.6)
Количество рядов m вычисляется по формуле:
m = N/M = 20,5 / 4 = 6 (5.7)
Организация искусственного освещения рабочего помещения оператора в соответствии с рассчитанными выше параметрами, позволит предотвратить расстройства органов зрения, снизить утомляемость, а также повысить работоспособность при работе на ПК.
5.2.2 Вентиляция в помещении
Устройство механической вентиляции способно обеспечить необходимое снижение концентрации вредных веществ и нормализацию параметров микроклимата на рабочих местах. К достоинствам механической вентиляции можно отнести:
5.2.3 Пожарная безопасность
Противопожарная защита помещения обеспечивается применением автоматической установки пожарной сигнализации, а также применением основных строительных конструкций здания с регламентированными пределами огнестойкости. Дополнительно можно установить автоматические системы пожаротушения. В соответствии со СНиП 21-01-03 обеспечивается
необходимая степень огнестойкости строительных конструкций.
Для соблюдения теплового режима в корпусе ЭВМ предусмотрены вентиляционные отверстия и охлаждающий вентилятор.
Кроме того, в соответствии с нормами первичных средств пожаротушения при площади помещения, не превышающей 100м2, в распоряжении персонала имеется углекислотный огнетушитель ОУ-5, предназначенный для тушения загорания различных веществ и электроустановок с напряжением до 10 кВ при температуре окружающего воздуха от -40 до +50°С.
5.2.4 Рабочее место оператора
Рабочее место и взаимное расположение всех его элементов должно соответствовать антропометрическим, физическим и психологическим требованиям [1]. Большое значение имеет и характер работы. При организации рабочего места оператора должны быть соблюдены основные условия: оптимальное размещение оборудования, входящего в состав рабочего места и достаточное рабочее пространство, позволяющее осуществлять все необходимые движения и перемещения.
Для предупреждения статических перегрузок используется стол с выдвижной доской для клавиатуры и с размерами: длина стола - 800-1200 см, ширина - 800-1000 см, высота - 725 см. Для ног рекомендуется использовать подставку для ног с рифленой поверхностью с углом наклона 200, а в качестве стула подъемно-поворотное кресло, регулируемое по высоте и углам наклона сиденья и спинки. Организация рабочего места представлена на рисунке 5.1.
Рисунок 5.1 Организация рабочего места
ПЭВМ, на которой работает оператор, должна отвечать следующим требованиям:
5.2.5 Защита от поражения электрическим током
Чтобы исключить несчастные случаи при использовании человеком оборудования, работающего от сети с высоким напряжением, необходимо провести среди персонала предприятия инструктаж по технике безопасности.
Существует несколько видов инструктажа:
Кроме того, необходимо обеспечить надежное заземление. Эффективным заземлением является заземление трубчатого типа с толщиной стенки 3,5 мм. Длина трубы обычно составляет 250 см, диаметр 5 см. Заземлители располагаются по четырехугольному контуру, с глубиной заложения около 80 см, причем сопротивление заземлителя не должно превышать 4 Ом. Такое заземление помогает избежать несчастных случаев на объекте даже при возникновении многих аварийных ситуаций.
5.2.6 Защита от электромагнитных и ионизирующих излучений
Для защиты от электромагнитных полей и ионизирующего излучения применяются методы экранирования и защиты расстоянием [2]. Оператор должен находиться от экрана монитора на расстоянии не менее 50-70 сантиметров, т.е. на расстоянии вытянутой руки. Для каждого монитора необходимо наличие защитного фильтра, обладающего следующими характеристиками:
Разнообразные нейлоновые сеточки и фильтры из обычного тонированного стекла из рассмотрения автоматически выпадают из-за своей неэффективности. Способы защиты от излучений представлены на рисунке 5.2.
Рисунок 5.2 Способы защиты от излучений
На рабочем месте оператора ПК используются мониторы, соответствующие общепринятому европейскому стандарту TCO-03. На сегодняшний день стандарт TCO03 считается наиболее совершенным, и половина выпускающихся в мире мониторов соответствует его требованиям. Основная таблица ограничений на уровни полей в этой версии стандарта: значение яркости 100 кд на кв. метр, частота обновления экрана 60 Гц, высокое разрешение и контрастность изображения.
В настоящее время жидкокристаллические мониторы уже почти вытеснили классические мониторы на основе катодно-лучевой трубки, т.к. по всем параметрам превосходят их. Во-первых, от них практически не исходит ионизирующее излучение. Во-вторых, частота обновления свыше 60 Гц. Намного выше четкость изображения. Поэтому для обеспечения более безопасных условий труда на рабочем месте целесообразно использовать именно жидкокристаллические мониторы.
Режим труда и отдыха операторов ПК зависит от вида выполняемой работы: при вводе, редактировании данных, программ, чтения информации с экрана, непрерывная продолжительность работы не должна превышать 4-х часов при 8-часовом рабочем дне; через каждый час работы необходимо вводить перерыв на 5-10 мин, а через 2 часа - на 15 мин [1].
Оптимальный режим работы - 40-45 мин работы за ПК и 15-20 мин перерыв, в течение которого желательно выполнять специальный комплекс упражнений для отдыха глаз.
В разделе проведён анализ опасных и вредных факторов, возникающих в процессе эксплуатации ПЭВМ. Среди них выявленные наиболее опасные:
Для обеспечения безопасных условий труда произведён расчёт параметров искусственного освещения рабочего места специалиста.
ЗАКЛЮЧЕНИЕ
В дипломном проекте в соответствии с заданием разработано программное средство, позволяющее решать задачу автоматизированного пересчёта программного кода для станков с ЧПУ с использованием различных систем программирования. Программа написана на языке высокого уровня Object Pascal в среде разработки Borland Delphi 7.
В процессе решения задачи:
- проведен анализ систем программирования станков с ЧПУ, таких как ВМ, Маяк и Sinumerik. При этом установлено, что на сегодняшний день существует большое количество программных продуктов, предоставляющих возможность конвертирования программного текста. Однако эти программы сложны в настройке и эксплуатации, либо стоимость их непомерно велика;
- на основании проведенного анализа разработана структура программного интерфейса, позволяющая автоматизировать процесс перевода кодов программ из одной системы программирования в другую, а также выбрать дополнительные параметры обработки;
- разработано программное средство, реализующее программный интерфейс и проведено тестирование разработанной программы. Результаты тестирования показали что, программа, верно, пересчитывает программный код в различные системы программирования, при этом устраняет ошибки, допущенные программистом, а также имеет много вспомогательных настроек, таких как последовательная нумерация кадров, удаление пустых строк и пробелов. Это значительно упрощает человеко-машинное взаимодействие и снижает время разработки программного кода и ввода его в эксплуатацию.
Учитывая, что возможности использования любой программы во многом определяются взаимодействием пользователя с ней, в дипломном проекте разработан также дружественный эргономичный оконный интерфейс.
В результате анализа опасных и вредных производственных факторов, действующих на разработчика в процессе разработки программы и пользователя при ее применении, установлено, что они соответствуют установленным нормам, а разработанная программа при своей эксплуатации не наносит существенный вред окружающей среде.
Разработанная программа соответствует современному научно-техническому уровню программно-методического обеспечения и признана экономически целесообразной.
Таким образом, задание на дипломное проектирование выполнено в полном объеме и цель дипломного проектирования достигнута.
Разработанное программное обеспечение постоянно находится в доработке, добавляются новые возможности конвертирования, а также по мере использования программы устраняются чисто человеческие ошибки программиста.
Результаты научной работы докладывались на IV конкурсе научно-практических работ студентов учебных подразделений Института инженерной физики. Статья опубликована в сборнике трудов Международной конференции молодых учёных южного Подмосковья в 2010 году.
ЗАКЛЮЧЕНИЕ
В дипломном проекте в соответствии с заданием разработано программное средство, позволяющее решать задачу автоматизированного пересчёта программного кода для станков с ЧПУ с использованием различных систем программирования. Программа написана на языке высокого уровня Object Pascal в среде разработки Borland Delphi 7.
В процессе решения задачи:
- проведен анализ систем программирования станков с ЧПУ, таких как ВМ, Маяк и Sinumerik. При этом установлено, что на сегодняшний день существует большое количество программных продуктов, предоставляющих возможность конвертирования программного текста. Однако эти программы сложны в настройке и эксплуатации, либо стоимость их непомерно велика;
- на основании проведенного анализа разработана структура программного интерфейса, позволяющая автоматизировать процесс перевода кодов программ из одной системы программирования в другую, а также выбрать дополнительные параметры обработки;
- разработано программное средство, реализующее программный интерфейс и проведено тестирование разработанной программы. Результаты тестирования показали что, программа, верно, пересчитывает программный код в различные системы программирования, при этом устраняет ошибки, допущенные программистом, а также имеет много вспомогательных настроек, таких как последовательная нумерация кадров, удаление пустых строк и пробелов. Это значительно упрощает человеко-машинное взаимодействие и снижает время разработки программного кода и ввода его в эксплуатацию.
Учитывая, что возможности использования любой программы во многом определяются взаимодействием пользователя с ней, в дипломном проекте разработан также дружественный эргономичный оконный интерфейс.
В результате анализа опасных и вредных производственных факторов, действующих на разработчика в процессе разработки программы и пользователя при ее применении, установлено, что они соответствуют установленным нормам, а разработанная программа при своей эксплуатации не наносит существенный вред окружающей среде.
Разработанная программа соответствует современному научно-техническому уровню программно-методического обеспечения и признана экономически целесообразной.
Таким образом, задание на дипломное проектирование выполнено в полном объеме и цель дипломного проектирования достигнута.
Разработанное программное обеспечение постоянно находится в доработке, добавляются новые возможности конвертирования, а также по мере использования программы устраняются чисто человеческие ошибки программиста.
Список литературы
1. Бакаева Т.Н. Системный анализ безопасности: Методическая разработка к самостоятельной работе по курсу «Безопасность жизнедеятельности». Москва: МРТУ, 2005, 18 с.
2. Бакаева Т.Н. Безопасность жизнедеятельности. Часть 2: Безопасность в условиях производства: Учебное пособие. Москва: МРТУ, 2007, 318 с.
3. Гофман В. Э., Хомоненко А. Д. Delphi 6. СПБ.: БХВ Петербург, 2005. 1152 с.
4. Грис Д. Конструирование компиляторов для цифровых вычислитель-
ных машин. Пер. с англ. - М.: Мир. 2005.544 с.
5. Густав О.,Джангуидо П. Цифровые системы автоматизации и управ-
ления. - СПб.: Невский диалект, 2007.
6. Дерябин А.Л. “Программирование технологических процессов для станков с ЧПУ”, М. Машиностроение, 2004.
7. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. - М.: Наука, 2008. 720с.
8. Культин Н. Delphi 6. Программирование на Object Pascal. СПб.: БХВ Петербург, 2004. 528 с.
9. Лещенко В.А., Богданов Н. А., ВайнштейнИ.В. и др. Станки с число-
вым программным управлением (специализированные). - М.: Маши-
ностроение, 2008.
10. Мартинов Г. М. Виртуальные приборы диагностики в системе ЧПУ //
Информатика-машиностроение. 2008. №4. С. 8-12.
11. Сосонкин В.Л. Задачи числового программного управления и их архи-
тектурная Реализация // Станки и инструмент. 2004. №10. С. 39-40.
12. Сосонкин В.Л., Мартинов Г. М. Концепция систем ЧПУ типа PCNC с открытой архитектурой // СТИН. 2006. №5. С. 7-12.
13. Сосонкин В.Л. Некоторые принципы разработки систем ЧПУ нового
поколения // СТИН. 2007. №9. С. 24-29.
14. Сосонкин В.Л., Мартинов Г.М. Принципы построения систем ЧПУ с
открытой Архитектурой // Приборы и системы управления. 1996. №8.
С. 18-21.
15. Сосонкин В.Л., ТилешЮ. Представление о процессорном устройстве
числового программного управления оборудованием как виртуальном
вычислителе//Машиноведение. 2007. №6. С. 50-57.
16. Сосонкин В.Л., Мартинов Г.М. Системы числового программного управления. Учебное пособие. М.: Логос, 2005. - 296 с.
17. Стискин Г.М., Гаевский В.Д. Токарные станки с оперативным программным управлением. К. Техника, 2007.
18. SINUMERIK 840D,840Di,810D, основы. Руководство по программированию, выпуск 10-2004.
19. ГОСТ 12.1.038-04. Система стандартов безопасности труда. Электробезопасность. Термины и определения. М.: Издательство стандартов, 2004.
20. ГОСТ 12.1.004-07. Система стандартов безопасности труда. Пожарная безопасность. Общие положения. М.: Издательство стандартов, 2007.
21. ГОСТ 12.1.00305. ССБТ. Шум. Общие требования безопасности (с изменениями по И-1-III-05),2005.
22. ГОСТ 12.0.002-80. Система стандартов безопасности труда. Термины и определения. М.: ИПК Издательство стандартов, 2006.
23. ГОСТ 12.1.00604. ССБТ. Электромагнитные поля радиочастот. Допустимые уровни на рабочих местах и требования к проведению контроля - М.: Издательство стандартов, 2004.
24. СанПиН 2.2.4. 548 1. 2006. Гигиенические требования к микроклимату производственных помещений. М.: Госкомсанэпиднадзор, 2006.
25. СанПиН 2.2.2. 542-06. Гигиенические требования к видеодисплейным терминалам, персональным электронно-вычислительным машинам и организации работы. М.: Госкомсанэпиднадзор, 2006.
Приложение А
(обязательное)
Тема: Конвертер для повышения оперативности перепрограммирования станков с ЧПУ
Текст программы
Всего листов - 30
2009
Файл 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_pred, X_sled, Y_nast, Y_pred, Y_sled: real;
Z, A, Uvmmayak, K : real;
implementation
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 <= nach_period then
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 < 0) and (J <= 0) then
begin
I_sled:= -1;
J_sled:= 1;
exit;
end;
if (I <= 0) and (J > 0) then
begin
I_sled:= 1;
J_sled:= 1;
exit;
end;
if (I >= 0) and (J < 0) then
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 <= 0) and (J < 0) then
begin
I_sled:= 1;
J_sled:= -1;
exit;
end;
if (I < 0) and (J >= 0) then
begin
I_sled:= -1;
J_sled:= -1;
exit;
end;
if (I > 0) and (J <= 0) then
begin
I_sled:= 1;
J_sled:= 1;
exit;
end;
end;
end;
// Преобразует строку, удаляет и вставляет подстроку ВМ
function preobrazovanieVM( vhod_v_preobrazovanie: real ;var kadr: string): string;
var
stroka: string[10];
begin
delete(kadr,nach,oshibka-1);
stroka:= FloatToStr(vhod_v_preobrazovanie); // Преобразуем в число строку
insert(stroka, kadr, nach);
end;
// Преобразует строку, удаляет и вставляет подстроку МАЯК
function preobrazovanieMAYAK( vhod_v_preobrazovanie: real ;var kadr: string): string;
var
stroka: string[10];
begin
delete(kadr,nach,oshibka-1);
if vhod_v_preobrazovanie <> 0 then
begin
stroka:= FloatToStrF(vhod_v_preobrazovanie, fffixed, 12, 3); // Преобразуем в число строку
vhod_v_preobrazovanie:= StrToFloat(stroka); // Был глюк при конвертации
stroka:= FloatToStr(vhod_v_preobrazovanie); // Сейчас вроде работает
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_pred / 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);
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 < 0) then J:= -J;
I:= I + X_nast;
if(J_sled = -1) and (I > 0) then I:= -I;
if(J_sled = 1) and (I < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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_pred + I;
preobrazovanieMAYAK(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_pred + J;
preobrazovanieMAYAK(J,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(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 < 0) then J:= -J;
I:= I / 1000;
I:= I + X_nast;
if(J_sled = -1) and (I > 0) then I:= -I;
if(J_sled = 1) and (I < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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;
preobrazovanieMAYAK(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_pred + I;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(K,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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); // Отбрасываем дробную часть
preobrazovanieVM(X_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('Y',kadr);
strok:= FloatToStr(X_pred); // Преобразуем в число строку
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); // Отбрасываем дробную часть
preobrazovanieVM(Y_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('I',kadr);
strok:= FloatToStr(Y_pred); // Преобразуем в число строку
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 < 0) then J:= -J;
if(J_sled = -1) and (I > 0) then I:= -I;
if(J_sled = 1) and (I < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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_pred;
preobrazovanieVM(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_pred;
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(K,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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); // Отбрасываем дробную часть
preobrazovanieVM(X_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('Y',kadr); // Преобразуем в число строку
insert('X' + FloatToStr(X_pred), 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); // Отбрасываем дробную часть
preobrazovanieVM(Y_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('I',kadr); // Преобразуем в число строку
insert('Y' + FloatToStr(Y_pred), 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_pred;
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 < 0) then J:= -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 < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(K,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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 <= chast then
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;
type
TForm6 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
ButtonRedEndFile: TButton;
ButtonRedPapku: TButton;
Label1: TLabel;
SaveDialog1: TSaveDialog;
procedure FormActivate(Sender: TObject);
procedure ButtonRedPapkuClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form6: TForm6;
RegIni: TRegistry;
implementation
uses unit1;
{$R *.dfm}
procedure TForm6.FormActivate(Sender: TObject);
begin
Form6.Caption:= Application.Title;
RegIni:= TRegistry.Create;
RegIni.RootKey:= HKEY_LOCAL_MACHINE;
RegIni.OpenKey('Software\Naladchik', false);
Label1.Caption:= RegIni.ReadString('pach');
RegIni.CloseKey;
RegIni.Free;
end;
procedure TForm6.ButtonRedPapkuClick(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
Label1.Caption:= SaveDialog1.FileName;
RegIni:= TRegistry.Create;
RegIni.RootKey:= HKEY_LOCAL_MACHINE;
RegIni.OpenKey('Software\Naladchik', true);
RegIni.CreateKey('a');
RegIni.WriteString('pach', SaveDialog1.FileName);
RegIni.CloseKey;
RegIni.Free;
end;
end;
end.
Приложение Б
(рекомендуемое)
Тема: Конвертер для повышения оперативности перепрограммирования станков с ЧПУ
Основные типы станков с ЧПУ и их характеристики
Всего листов - 6
2009
Токарные станки с ЧПУ предназначены для наружной и внутренней обработки сложных заготовок деталей типа тел вращения. Они сотавляют самую значительную группу по номенклатуре в парке станков с ЧПУ. На токарных станках с ЧПУ выполняют традиционный комплекс технологических операций: точение, отрезку, сверление, нарезание резьбы и др.
В основе классификации токарных станков с ЧПУ лежат следующие признаки:
- расположение оси шпинделя (горизонтальные и вертикальные станки);
- число ипользуемых в работе инструментов (одно- и многоинструментальные станки);
- способы их закрепления (на суппорте, в револьверной головке, в магазине инструментов);
- вид выполняемых работ (центровые, патронные, патронно-центровые, карусельные, прутковые станки);
- степень автоматизации (полуавтоматы и автоматы).
Центровые станки с ЧПУ служат для обработки заготовок деталей типа валов с прямолинейным и криволинейным контурами. На этих станках можно нарезать резьбу резцом по программе.
Патронные станки с ЧПУ предназначенны для обточки, сверления, развертывания, зенкерования, цекования, нарезания резьбы метчиками в осевых отверстиях деталей типа фланцев, зубчатых колес, крышек, шкивов и др.; возможно нарезание резцом внутренней и наружной резьбы по программе.
Патронно-центровые станки с ЧПУ служат для наружной и внутренней обработки разнообразных сложных заготовок деталей типа тел вращения и обладают технологическими возможностями токарных центровых и патронных станков.
Карусельные станки с ЧПУ применяют для обработки заготовок сложных корпусов.
Токарные станки с ЧПУ (рисунок ПБ1) оснащают револьверными головками и магазином инструментов. Револьверные головки бывают четырех-, шести- и двенадцатипозиционные, причем на каждой позиции можно устанавливать по два инструмента для наружной и внутренней обработки заготовки. Ось вращения головки может распологаться параллельно оси шпинделя, перпендикулярно к ней или наклонно.
Рисунок ПБ1 Токарный станок с ЧПУ:
1, 2 револьверные головки
Фрезерные станки с ЧПУ предназначены для обработки плоских и пространнственных поверхностей заготовок сложной формы. Конструкции фрезерных станков с ЧПУ аналогичны конструкциям традиционных фрезерных станков, отличие от последних заключается в автоматизации перемещений по УП при формообразовании.
В сонове классификации фрезерных станков с ЧПУ лежат следующие признаки:
- расположение шпинделя (горизонтальное вертикальное);
- число координатных перемещений стола или фрезерной бабки;
- число используемых инструметнов (одноинструментные и многоинструментные);
- способ установки инструментов в шпиндель станка (вручную или автоматически).
По компоновке фрезерные станки с ЧПУ делят на четыре группы:
- вертикально-фрезерные с крестовым столом;
- консольно-фрезерные;
- продольно-фрезерные;
- широкоуниверсальные инструментальные.
В отдельных случаях на фрезерных станках при обработке заготовок простой формы в условиях средне- и крупносерийного производства также применяют системы ЧПУ.
Во фрезерных станках с ЧПУ в качестве привода главного движения используют асинхронные двигатели (в этих случаях имеется коробка скоростей) или электродвигатели постоянного тока.
На небольших фрезерных станках с прямоугольным ЧПУ применяют один приводной электродвигатель постоянного тока и коробку передач с автоматически переключаемыми электромагнитными муфтами, а на тяжелых станках с контурным управлением каждое управляемое координатное перемещение осуществляется от автономного электропривода постоянного тока.
Приводы движения подач фрезерных станков с ЧПУ имеют короткие кинематические цепи, передающие движение от двигателя непосредственно исполнительному органу.
Компоновка вертикально-фрезерного консольного станка с ЧПУ (рисунок ПБ2) мало отличается от компоновки традиционного станка без ЧПУ. На станине 8 монтируют узлы и механизмы станка. Станина спереди имеет направляющие, закрытые кожухом 9, по которым перемещается консоль 1. На горизонтальных направляющих смонтированы салазки 2, по продольным направляющим которых передвигается стол 3. На привалочной плоскости станины закреплена фрезерная бабка 6, по вертикальным направляющим которой перемещается ползун 7 со шпинделем 5. В соответствии с требованиями безопасности труда ползун имеет защитный щиток 4. Сзади станка расположен шкаф 10 с электрооборудованием и УЧПУ.
Рисунок ПБ2 Фрезерный станок с ЧПУ:
1 консоль; 2 салазки; 3 стол; 4 защитный щиток; 5 шпиндель; 6 фрезерная бабка;
7 ползун; 8 станина; 9 кожух; 10 - шкаф
Вертикально-сверлильные станки с ЧПУ в отличии от аналогичных станков с ручным управлением оснащены крестовыми столами, автоматически перемещающими заготовку по осям X и Y, в результате чего отпадает необходимость в кондукторах или в ее предварительной резметке.
Радиально-сверлильные станки с ЧПУ имеют подвижную по оси X колонну, подвижный по оси Y рукав со шпиндельной бабкой, в которой смонтирован сверлильный шпиндель, перемещающийся по оси Z. Помимо этого рукав при наладке может перемещаться в вертикальном направлении.
Автоматизированные перемещения рабочих органов сверлильных станков по осям X и Y обеспечивают выполнение обработки отверстий и фрезерования.
Сверлильные станки оснащают позиционными УЧПУ, позволяющими автоматически установить рабочие органы в позицию, заданную программой. Режущий инструмент на сверлильных станках с УЧПУ закрепляют непосредственно в коническом отверстии шпинделя или с помощью промежуточных втулок и оправок.
Общий вид вертикально-сверлильного станка модели 2Р135Ф2-1, оснащенного ЧПУ, показан на рис. 6. На основании 1 смонтирована колонна 10, по прямоугольным вертикальным направляющим которой перемещается суппорт 4, несущий револьверную головку 3. На колонне 10 смонтированы коробки скоростей 5 и редуктор подач 6. Салазки 2 крестового стола перемещаются по горизонтальным направляющим основания 1, а верхняя часть 11 стола-по направляющим салазок. С правой стороны станка расположены шкафы 8 с электрооборудованием и УЧПУ 9. Станок имеет подвесной пульт 7 управления.
Рисунок ПБ3 Вертикально-сверлильный станок с ЧПУ:
1 основание; 2 салазки стола; 3 револьверная головка; 4 суппорт; 5 коробка скоростей; 6 редуктор подач; 7 подвесной пульт управления; 8 шкаф электрооборудования; 9 устройство ЧПУ; 10 колонна; 11 - стол
Благодаря оснащению многоцелевых станков (МС) устройствами ЧПУ и автоматической смены инструмента существенно сокращается вспомогательное время при обработке и повышается мобильность переналадки. Сокращение вспомогательного времени достигается благодаря автоматическим установке инструмента (заготовки) по координатам, выполнению всех элеметнов цикла, смене инструметнов, кантованию и смене заготовки, изменению режимов резания, выполнению контрольных операций, а также большим скоростям вспомогательных перемещений.
По назначению МС делятся на две группы: для обработки заготовок корпусных и плоских деталей и для обработки заготовок деталей типа тел вращения. В первом случае для обработки используют МС сверлильно-фрезерно-расточной группы, а во втором-токарной и шлифовальной групп. Рассмотрим МС первой группы, как наиболее часто используемые.
МС имеют следующие характерные особенности: наличие инструментального магазина, обеспечивающего оснащенность большим числом режущих инструментов для высокой концентрации операций (черновых, получистовых и чистовых), в том числе точения, растачивания. фрезерования, сверления, зенкерования, развертывания, нарезания резьб, контроля качества обработки и др.; высокая точность выполнения чистовых операций (6...7-й квалитеты).
Рисунок ПБ4 Горизонтальный многоцелевой сверлильно-фрезерно-расточной станок с ЧПУ:
1 поворотный стол; 2 зажимные приспособления; 3 шпиндель; 4 шпиндельная бабка;
5 автооператор; 6 иструментальный магазин; 7 стойка; 8 поворотная платформа;
9 заготовка; 10 стол-спутник; 11 система ЧПУ; 12 шкаф для электрооборудования
Приложение В
(обязательное)
Тема: Конвертер для повышения оперативности перепрограммирования станков с ЧПУ
Руководство пользователя
Всего листов - 13
2009
Назначение программы. Программа предназначена для конвертирования исходного текста программ для станков с ЧПУ и предназначена для использования на производстве в различных областях.
Программа позволяет:
конвертировать программный текст в любою из доступных программе систем;
удалять лишние пробелы;
удалять пустые строки;
восстанавливать периодическую нумерацию кадров;
задавать шрифт(цвет, размер, тип);
печать документа;
визуальный контроль обработки;
менять регистр букв к заглавным(что требует синтаксис программ);
разбивать программу на заданное количество частей;
осуществляет поиск и замену по образцу.
Условия выполнения программы. Разработанная программа является приложением MS Windows. Для ее работы требуется наличие на компьютере операционной системы MS Windows 98/NT4.0/2000/XP и все вытекающее отсюда техническое обеспечение.
Кроме того, требуется:
физическая память 1Mб + память на используемые и создаваемые из текстовые файлы (не менее 10 Мб);
оперативная память 2*размер используемого файла. При нехватке оперативной памяти может использоваться виртуальная память. А за счет того, что все данные находятся в памяти, сильно сокращается время решения задач.
Для написания программы использовалась среда разработки Borland Delphi 7.
Выполнение программы. Программа представлена в виде формы, в главном окне которого производится выбор функции программы. Режим работы программы диалоговый. Все выполняемые программой функции запускаются с помощью соответствующих кнопок.
Для запуска программы оператор из оболочки системы Windows должен произвести запуск файла Наладчик.ехе
Рисунок ПВ1 - Главное окно программы
Рисунок ПВ2 - Панель инструментов
----- открыть файл
----- сохранить файл
----- распечатать содержимое поля редактирования
----- при нажатии этой кнопки появляется дополнительный диалог обработки (см. далее)
----- очистить поле редактирования
----- при нажатии этой кнопки появляется дополнительный диалог замены (см. далее)
----- при нажатии всё содержимое поля редактирования преобразуется к верхнему регистру
------ при нажатии появляется дополнительный диалог (разбивка файла на несколько частей)
Меню файл:
Выход выход из программы;
Сохранить вызов диалогового окна (Сохранить как);
Открыть вызов диалогового окна (Сохранить как);
Печать вызов диалогового окна (Печать).
Меню настройки:
Шрифт - вызов диалогового окна(Шрифт);
Принтер - вызов диалогового окна(Настройка печати);
Параметры - вызов диалогового окна(Параметры).
Работа начинается с открытия текстового файла либо выбором пункта меню Файл открыть. В результате открывается диалог выбора файла (Рисунок ПВ4):
Рисунок ПВ4 - Диалог выбора файла
Выбрать файл, нажать «открыть». Следующим действием нажать, появляется диалог, в котором выбрать желаемый метод обработки.
Рисунок ПВ5 Диалог выбора метода обработки
Не обрабатывать пересчет производится не будет.
ПК МАЯК выбрана обработка конвертирование системы (Sinumeric Маяк).
ПК ВМ выбрана обработка конвертирование системы (Sinumeric ВМ).
ВМ МАЯК выбрана обработка конвертирование системы (ВМ Маяк).
МАЯК ВМ выбрана обработка конвертирование системы (Маяк - ВМ).
Кнопка «Закрыть» закрывает диалог. В результате выбранных вами действий результат выбора отображается в левом нижнем углу главной формы (рисунок ПВ6):
Рисунок ПВ6 Левый нижний угол главного окна программы
Выбрано: обработка ПК МАЯК.
Дополнительная панель настройки обработки
Рисунок ПВ7 - Дополнительная панель настройки обработки
Номера кадров упорядочить номера кадров, начиная с 1.
Пробелы будут удалены все пробелы.
Пустые строки будут удалены все пустые строки.
4.4 Информация во время обработки
Рисунок ПВ8 Диалоговое окно начала обработки
Нажимаем кнопку <Обработка>.
На рисунке ПВ9 изображена информационная панель, отображающая в процентах и графически, сколько уже обработано данных файла во время обработки (рисунок ПВ9):
Рисунок ПВ9 Информационная панель
Во время обработки в верхней части окна показано, сколько обработано строк, в нижней сколько всего (рисунок ПВ10):
Рисунок ПВ10 Ход выполнения программы
Файл обработан, сохраняем или меню файл сохранить.
В результате нажатия вышесказанной кнопки появляется следующий диалог.
Выберите желаемый файл из списка или напишите имя в поле «Имя файла» (рисунок ПВ11):
Рисунок ПВ11 Диалговое окно сохранение файла
Закрытие программы производится кнопкой «Закрыть».
Функция разделения файла. При нажатии кнопки на панели инструментов (Рисунок ПВ12) появляется диалог «Разбивка файла на несколько частей»:
Рисунок ПВ12 Разбивка файла на несколько частей
При нажатии на кнопку «Обработка» происходит разбивка файла на файлы заданной ёмкости. Нажать кнопку «Настройка».
В этом диалоге при нажатии кнопки «Редактирование вставки в конец файла» текст набранный в поле редактора (находится внизу формы) вставляется в каждую часть файла (рисунок ПВ13):
Рисунок ПВ13 Диалговое окно редактирования
При нажатии кнопки «Редактировать конечную папку» появляется диалог «Сохранить как».
Дополнительные настройки. Меню Настройки.
Шрифт выбор шрифта для поля редактирования (рисунок ПВ14):
Рисунок ПВ14 - Выбор шрифта для поля редактирования
Принтер установка свойств принтера для вывода на печать представлена на рисунке ПВ15:
Рисунок ПВ15 - Установка свойств принтера для вывода на печать
Этот диалог вызывается нажатием кнопки и работает как замена чего-то чем-то. В данном примере все вхождения X заменяются Y (рисунок ПВ16):
Рисунок ПВ16 Диалог замены X на Y
4.6. Инструкции по обработке исключительных ситуаций
Во время работы программы могут поступать сообщения пользователю (исключительные ситуации), которые запрограммированы лишь для повышения надёжности программы и исключения, как можно больше ошибок.
Это сообщение поступает при нажатии кнопки <Обработка>, но в поле редактирования пусто.
Действия открыть не пустой файл и повторить обработку.
Рисунок ПВ17 В поле редактирования пусто
Сообщение появляется при попытке закрыть программу, не сохранив изменившееся поле редактирования.
Действия если хотите сохранить изменённый файл, нажать <Yes>, иначе - <No>.
Рисунок ПВ18 Окно подтверждения
Дополнительные инструкции по программированию и математическая постановка. Как отмечалось выше, эта версия программы обрабатывает исходный код, который генерирует программа Unigraphics.
Пример кода из Unigraphics.
Программа 1.
N0800 X90.91 Y-160.881
N0810 G3 X91.643 Y-166.402 I423.693 J53.462
N0820 X92.657 Y-173.301 I350.64 J47.998
N0830 G1 X91.625 Y-178.443
N0840 G2 X91.623 Y-178.442 I2.026 J6.7
N0850 X90.181 Y-177.736 I1.441 J4.76
N0860 G1 X89.494 Y-177.174
N0870 X89.242 Y-176.969
Из примера следует, что координаты задаются в миллиметрах до 0.001 долей (при обработке в программе Наладчик размеры разрядностью более 0.001 отбрасываются).
Пример Unigraphics 0.0016 после обработки Наладчик 0.001.
Центр радиуса задаётся относительно начальной точки радиуса (относительно).
N0810 G3 X91.643 Y-166.402 I423.693 J53.462
ПК МАЯК
У Маяков, как известно координаты задаются тоже в миллиметрах, но I, J координаты центра радиусов задаются относительно начала системы координат (абсолютно) (таблица ПВ1).
Таблица ПВ1 - Программа до и после обработки.
Программа до обработки (программа 1) |
Программа после обработки ПК МАЯК (программа 2) |
N0800 X90.91 Y-160.881 N0810 G3 X91.643 Y-166.402 I423.693 J53.462 N0820 X92.657 Y-173.301 I350.64 J47.998 N0830 G1 X91.625 Y-178.443 N0840 G2 X91.623 Y-178.442 I2.026 J6.7 N0850 X90.181 Y-177.736 I1.441 J4.76 N0860 G1 X89.494 Y-177.174 N0870 X89.242 Y-176.969 |
N73X90.91Y-160.881 N74G3X91.643Y-166.402I514.603J-107.419 N75X92.657Y-173.301I442.283J-118.404 N76G1X91.625Y-178.443 N77G2X91.623Y-178.442I93.651J-171.743 N78X90.181Y-177.736I93.064J-173.682 N79G1X89.494Y-177.174 N80X89.242Y-176.969 |
Принцип пересчёта радиусов.
Iнаст = Xпред + Iнаст Это формулы пересчёта радиусов с относительной в
Jнаст = Yпред + Jнаст абсолютную систему координат.
То есть, для кадра N74 (программа 2) берём из кадра N0800 (программа 1) X, Y из N0810 берём I, J получаем:
Iнаст = X90.91 + I423.693 = 514.603 результат обработки в программе 2 (кадр N74)
Jнаст = Y-160.881 + J53.462 = -107.419
Расчёт линейных заходов (функции G41, G42) на эквидистанту контура обрабатываемой детали.
Таблица ПВ2 - Добавление недостающих координат
до обработки (программа 1) |
после обработки (программа 2) |
N5G1Z-25.F500M8 N6G90G42D20X-104.6Y0F20 N7Y-23. |
N5G1Z-25.F500M8 N6G90G42D20X-104.6Y0I0J-23.F20 N7Y-23. |
Здесь видим, что в программу были вставлены недостающие части кадра I и J координаты таблицы ПВ2.
I = X_sled X_nast; Это формулы расчёта координат заходов на линейный
J = Y_sled Y_nast контур детали.
То есть для кадра N6 (программа 2) берутся из кадра N6 и N7 (программа 1) настоящие и следующие значения координат X и Y.
I = (его нет значит значение то же, что и предыдущее) 104.6 104.6 = 0
J = 23 0 = 23.
Расчёт заходов на радиус (функции G41, G42) на эквидистанту контура обрабатываемой детали.
С начала рассчитываем значение (I и J) из следующего кадра.
Логическое решение задачи
Если G3, то проверяем значение заданных координат:
Если I_sled > 0 и J_sled >= 0, то I = 1, J = -1;
Если I_sled < 0 и J_sled <= 0, то I = -1, J = 1;
Если I_sled < 0 и J_sled >= 0, то I = 1, J = 1;
Если I_sled > 0 и J_sled <= 0, то I = -1, J = -1
Если G2, то проверяем значение заданных координат:
Если I_sled > 0 и J_sled >= 0, то I = -1, J = 1;
Если I_sled < 0 и J_sled <= 0, то I = 1, J = -1;
Если I_sled < 0 и J_sled >= 0, то I = -1, J = -1;
Если I_sled > 0 и J_sled <= 0, то 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 и J < 0, то J_nast:= -J_nast;
если J = -1 и I > 0, то I_nast:= -I_nast;
если J = 1 и I < 0, то I_nast:= -I_nast.
В данном примере срабатывает условие, если I_sled > 0 и J_sled >= 0,
значит I = 1, J = -1, то есть I будет положительным, а J - отрицательным
Далее по формулам: I_nast = Y_nast + J_sled; J_nast = X_nast + I_sled
находим: I_nast = 0 + 0 = 0; J_nast = 104.6 + (-2.5) = 102.1
Залючительные вычисления, если I = 1 и J < 0, то J_nast:= -J_nast;
J_nast = -102.1, что видно в таблице ПВ3.
Таблица ПВ3 - Расчёт заходов на радиус (функции G41, G42)
до обработки (программа 1) |
после обработки (программа 2) |
N5G1Z-25.F500M8 N6G90G42D20X-104.6Y0I0J-23.F20 N8G3X-102.1Y-25.5I2.5J0.0 |
N1G1Z-25.F500M8 N2G90G42D20X-104.6Y0I0J-102.1F20 N3G3X-102.1Y-25.5I-102.1J0 |
Не пересчитывайте программу дважды.
1. Бакаева Т.Н. Системный анализ безопасности: Методическая разработка к самостоятельной работе по курсу «Безопасность жизнедеятельности». Москва: МРТУ, 2005, 18 с.
2. Бакаева Т.Н. Безопасность жизнедеятельности. Часть 2: Безопасность в условиях производства: Учебное пособие. Москва: МРТУ, 2007, 318 с.
3. Гофман В. Э., Хомоненко А. Д. Delphi 6. СПБ.: БХВ Петербург, 2005. 1152 с.
4. Грис Д. Конструирование компиляторов для цифровых вычислитель-
ных машин. Пер. с англ. - М.: Мир. 2005.544 с.
5. Густав О.,Джангуидо П. Цифровые системы автоматизации и управ-
ления. - СПб.: Невский диалект, 2007.
6. Дерябин А.Л. “Программирование технологических процессов для станков с ЧПУ”, М. Машиностроение, 2004.
7. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. - М.: Наука, 2008. 720с.
8. Культин Н. Delphi 6. Программирование на Object Pascal. СПб.: БХВ Петербург, 2004. 528 с.
9. Лещенко В.А., Богданов Н. А., ВайнштейнИ.В. и др. Станки с число-
вым программным управлением (специализированные). - М.: Маши-
ностроение, 2008.
10. Мартинов Г. М. Виртуальные приборы диагностики в системе ЧПУ //
Информатика-машиностроение. 2008. №4. С. 8-12.
11. Сосонкин В.Л. Задачи числового программного управления и их архи-
тектурная Реализация // Станки и инструмент. 2004. №10. С. 39-40.
12. Сосонкин В.Л., Мартинов Г. М. Концепция систем ЧПУ типа PCNC с открытой архитектурой // СТИН. 2006. №5. С. 7-12.
13. Сосонкин В.Л. Некоторые принципы разработки систем ЧПУ нового
поколения // СТИН. 2007. №9. С. 24-29.
14. Сосонкин В.Л., Мартинов Г.М. Принципы построения систем ЧПУ с
открытой Архитектурой // Приборы и системы управления. 1996. №8.
С. 18-21.
15. Сосонкин В.Л., ТилешЮ. Представление о процессорном устройстве
числового программного управления оборудованием как виртуальном
вычислителе//Машиноведение. 2007. №6. С. 50-57.
16. Сосонкин В.Л., Мартинов Г.М. Системы числового программного управления. Учебное пособие. М.: Логос, 2005. - 296 с.
17. Стискин Г.М., Гаевский В.Д. Токарные станки с оперативным программным управлением. К. Техника, 2007.
18. SINUMERIK 840D,840Di,810D, основы. Руководство по программированию, выпуск 10-2004.
19. ГОСТ 12.1.038-04. Система стандартов безопасности труда. Электробезопасность. Термины и определения. М.: Издательство стандартов, 2004.
20. ГОСТ 12.1.004-07. Система стандартов безопасности труда. Пожарная безопасность. Общие положения. М.: Издательство стандартов, 2007.
21. ГОСТ 12.1.00305. ССБТ. Шум. Общие требования безопасности (с изменениями по И-1-III-05),2005.
22. ГОСТ 12.0.002-80. Система стандартов безопасности труда. Термины и определения. М.: ИПК Издательство стандартов, 2006.
23. ГОСТ 12.1.00604. ССБТ. Электромагнитные поля радиочастот. Допустимые уровни на рабочих местах и требования к проведению контроля - М.: Издательство стандартов, 2004.
24. СанПиН 2.2.4. 548 1. 2006. Гигиенические требования к микроклимату производственных помещений. М.: Госкомсанэпиднадзор, 2006.
25. СанПиН 2.2.2. 542-06. Гигиенические требования к видеодисплейным терминалам, персональным электронно-вычислительным машинам и организации работы. М.: Госкомсанэпиднадзор, 2006.
Приложение А
(обязательное)
Тема: Конвертор для повышения эффективности перепрограммирования станков с ЧПУ
Текст программы
Всего листов - 30
2011
Файл 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_pred, X_sled, Y_nast, Y_pred, Y_sled: real;
Z, A, Uvmmayak, K : real;
implementation
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 <= nach_period then
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 < 0) and (J <= 0) then
begin
I_sled:= -1;
J_sled:= 1;
exit;
end;
if (I <= 0) and (J > 0) then
begin
I_sled:= 1;
J_sled:= 1;
exit;
end;
if (I >= 0) and (J < 0) then
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 <= 0) and (J < 0) then
begin
I_sled:= 1;
J_sled:= -1;
exit;
end;
if (I < 0) and (J >= 0) then
begin
I_sled:= -1;
J_sled:= -1;
exit;
end;
if (I > 0) and (J <= 0) then
begin
I_sled:= 1;
J_sled:= 1;
exit;
end;
end;
end;
// Преобразует строку, удаляет и вставляет подстроку ВМ
function preobrazovanieVM( vhod_v_preobrazovanie: real ;var kadr: string): string;
var
stroka: string[10];
begin
delete(kadr,nach,oshibka-1);
stroka:= FloatToStr(vhod_v_preobrazovanie); // Преобразуем в число строку
insert(stroka, kadr, nach);
end;
// Преобразует строку, удаляет и вставляет подстроку МАЯК
function preobrazovanieMAYAK( vhod_v_preobrazovanie: real ;var kadr: string): string;
var
stroka: string[10];
begin
delete(kadr,nach,oshibka-1);
if vhod_v_preobrazovanie <> 0 then
begin
stroka:= FloatToStrF(vhod_v_preobrazovanie, fffixed, 12, 3); // Преобразуем в число строку
vhod_v_preobrazovanie:= StrToFloat(stroka); // Был глюк при конвертации
stroka:= FloatToStr(vhod_v_preobrazovanie); // Сейчас вроде работает
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_pred / 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);
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 < 0) then J:= -J;
I:= I + X_nast;
if(J_sled = -1) and (I > 0) then I:= -I;
if(J_sled = 1) and (I < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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_pred + I;
preobrazovanieMAYAK(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_pred + J;
preobrazovanieMAYAK(J,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(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 < 0) then J:= -J;
I:= I / 1000;
I:= I + X_nast;
if(J_sled = -1) and (I > 0) then I:= -I;
if(J_sled = 1) and (I < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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;
preobrazovanieMAYAK(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_pred + I;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(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;
preobrazovanieMAYAK(K,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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); // Отбрасываем дробную часть
preobrazovanieVM(X_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('Y',kadr);
strok:= FloatToStr(X_pred); // Преобразуем в число строку
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); // Отбрасываем дробную часть
preobrazovanieVM(Y_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('I',kadr);
strok:= FloatToStr(Y_pred); // Преобразуем в число строку
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 < 0) then J:= -J;
if(J_sled = -1) and (I > 0) then I:= -I;
if(J_sled = 1) and (I < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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_pred;
preobrazovanieVM(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_pred;
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(K,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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); // Отбрасываем дробную часть
preobrazovanieVM(X_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('Y',kadr); // Преобразуем в число строку
insert('X' + FloatToStr(X_pred), 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); // Отбрасываем дробную часть
preobrazovanieVM(Y_nast,kadr);
end;
end
else
if I_est then
begin
uslovie:= pos('I',kadr); // Преобразуем в число строку
insert('Y' + FloatToStr(Y_pred), 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_pred;
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 < 0) then J:= -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 < 0) then I:= -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_pred:= X_nast;
Y_pred:= 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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(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); // Отбрасываем дробную часть
preobrazovanieVM(K,kadr);
end;
end;
X_pred:= X_nast;
Y_pred:= 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 <= chast then
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;
type
TForm6 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
ButtonRedEndFile: TButton;
ButtonRedPapku: TButton;
Label1: TLabel;
SaveDialog1: TSaveDialog;
procedure FormActivate(Sender: TObject);
procedure ButtonRedPapkuClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form6: TForm6;
RegIni: TRegistry;
implementation
uses unit1;
{$R *.dfm}
procedure TForm6.FormActivate(Sender: TObject);
begin
Form6.Caption:= Application.Title;
RegIni:= TRegistry.Create;
RegIni.RootKey:= HKEY_LOCAL_MACHINE;
RegIni.OpenKey('Software\Naladchik', false);
Label1.Caption:= RegIni.ReadString('pach');
RegIni.CloseKey;
RegIni.Free;
end;
procedure TForm6.ButtonRedPapkuClick(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
Label1.Caption:= SaveDialog1.FileName;
RegIni:= TRegistry.Create;
RegIni.RootKey:= HKEY_LOCAL_MACHINE;
RegIni.OpenKey('Software\Naladchik', true);
RegIni.CreateKey('a');
RegIni.WriteString('pach', SaveDialog1.FileName);
RegIni.CloseKey;
RegIni.Free;
end;
end;
end.
Приложение Б
(рекомендуемое)
Тема: Конвертор для повышения эффективности перепрограммирования станков с ЧПУ
Основные типы станков с ЧПУ и их характеристики
Всего листов - 6
2011
Токарные станки с ЧПУ предназначены для наружной и внутренней обработки сложных заготовок деталей типа тел вращения. Они сотавляют самую значительную группу по номенклатуре в парке станков с ЧПУ. На токарных станках с ЧПУ выполняют традиционный комплекс технологических операций: точение, отрезку, сверление, нарезание резьбы и др.
В основе классификации токарных станков с ЧПУ лежат следующие признаки:
- расположение оси шпинделя (горизонтальные и вертикальные станки);
- число ипользуемых в работе инструментов (одно- и многоинструментальные станки);
- способы их закрепления (на суппорте, в револьверной головке, в магазине инструментов);
- вид выполняемых работ (центровые, патронные, патронно-центровые, карусельные, прутковые станки);
- степень автоматизации (полуавтоматы и автоматы).
Центровые станки с ЧПУ служат для обработки заготовок деталей типа валов с прямолинейным и криволинейным контурами. На этих станках можно нарезать резьбу резцом по программе.
Патронные станки с ЧПУ предназначенны для обточки, сверления, развертывания, зенкерования, цекования, нарезания резьбы метчиками в осевых отверстиях деталей типа фланцев, зубчатых колес, крышек, шкивов и др.; возможно нарезание резцом внутренней и наружной резьбы по программе.
Патронно-центровые станки с ЧПУ служат для наружной и внутренней обработки разнообразных сложных заготовок деталей типа тел вращения и обладают технологическими возможностями токарных центровых и патронных станков.
Карусельные станки с ЧПУ применяют для обработки заготовок сложных корпусов.
Токарные станки с ЧПУ (рисунок ПБ1) оснащают револьверными головками и магазином инструментов. Револьверные головки бывают четырех-, шести- и двенадцатипозиционные, причем на каждой позиции можно устанавливать по два инструмента для наружной и внутренней обработки заготовки. Ось вращения головки может распологаться параллельно оси шпинделя, перпендикулярно к ней или наклонно.
Рисунок ПБ1 Токарный станок с ЧПУ:
1, 2 револьверные головки
Фрезерные станки с ЧПУ предназначены для обработки плоских и пространнственных поверхностей заготовок сложной формы. Конструкции фрезерных станков с ЧПУ аналогичны конструкциям традиционных фрезерных станков, отличие от последних заключается в автоматизации перемещений по УП при формообразовании.
В сонове классификации фрезерных станков с ЧПУ лежат следующие признаки:
- расположение шпинделя (горизонтальное вертикальное);
- число координатных перемещений стола или фрезерной бабки;
- число используемых инструметнов (одноинструментные и многоинструментные);
- способ установки инструментов в шпиндель станка (вручную или автоматически).
По компоновке фрезерные станки с ЧПУ делят на четыре группы:
- вертикально-фрезерные с крестовым столом;
- консольно-фрезерные;
- продольно-фрезерные;
- широкоуниверсальные инструментальные.
В отдельных случаях на фрезерных станках при обработке заготовок простой формы в условиях средне- и крупносерийного производства также применяют системы ЧПУ.
Во фрезерных станках с ЧПУ в качестве привода главного движения используют асинхронные двигатели (в этих случаях имеется коробка скоростей) или электродвигатели постоянного тока.
На небольших фрезерных станках с прямоугольным ЧПУ применяют один приводной электродвигатель постоянного тока и коробку передач с автоматически переключаемыми электромагнитными муфтами, а на тяжелых станках с контурным управлением каждое управляемое координатное перемещение осуществляется от автономного электропривода постоянного тока.
Приводы движения подач фрезерных станков с ЧПУ имеют короткие кинематические цепи, передающие движение от двигателя непосредственно исполнительному органу.
Компоновка вертикально-фрезерного консольного станка с ЧПУ (рисунок ПБ2) мало отличается от компоновки традиционного станка без ЧПУ. На станине 8 монтируют узлы и механизмы станка. Станина спереди имеет направляющие, закрытые кожухом 9, по которым перемещается консоль 1. На горизонтальных направляющих смонтированы салазки 2, по продольным направляющим которых передвигается стол 3. На привалочной плоскости станины закреплена фрезерная бабка 6, по вертикальным направляющим которой перемещается ползун 7 со шпинделем 5. В соответствии с требованиями безопасности труда ползун имеет защитный щиток 4. Сзади станка расположен шкаф 10 с электрооборудованием и УЧПУ.
Рисунок ПБ2 Фрезерный станок с ЧПУ:
1 консоль; 2 салазки; 3 стол; 4 защитный щиток; 5 шпиндель; 6 фрезерная бабка;
7 ползун; 8 станина; 9 кожух; 10 - шкаф
Вертикально-сверлильные станки с ЧПУ в отличии от аналогичных станков с ручным управлением оснащены крестовыми столами, автоматически перемещающими заготовку по осям X и Y, в результате чего отпадает необходимость в кондукторах или в ее предварительной резметке.
Радиально-сверлильные станки с ЧПУ имеют подвижную по оси X колонну, подвижный по оси Y рукав со шпиндельной бабкой, в которой смонтирован сверлильный шпиндель, перемещающийся по оси Z. Помимо этого рукав при наладке может перемещаться в вертикальном направлении.
Автоматизированные перемещения рабочих органов сверлильных станков по осям X и Y обеспечивают выполнение обработки отверстий и фрезерования.
Сверлильные станки оснащают позиционными УЧПУ, позволяющими автоматически установить рабочие органы в позицию, заданную программой. Режущий инструмент на сверлильных станках с УЧПУ закрепляют непосредственно в коническом отверстии шпинделя или с помощью промежуточных втулок и оправок.
Общий вид вертикально-сверлильного станка модели 2Р135Ф2-1, оснащенного ЧПУ, показан на рис. 6. На основании 1 смонтирована колонна 10, по прямоугольным вертикальным направляющим которой перемещается суппорт 4, несущий револьверную головку 3. На колонне 10 смонтированы коробки скоростей 5 и редуктор подач 6. Салазки 2 крестового стола перемещаются по горизонтальным направляющим основания 1, а верхняя часть 11 стола-по направляющим салазок. С правой стороны станка расположены шкафы 8 с электрооборудованием и УЧПУ 9. Станок имеет подвесной пульт 7 управления.
Рисунок ПБ3 Вертикально-сверлильный станок с ЧПУ:
1 основание; 2 салазки стола; 3 револьверная головка; 4 суппорт; 5 коробка скоростей; 6 редуктор подач; 7 подвесной пульт управления; 8 шкаф электрооборудования; 9 устройство ЧПУ; 10 колонна; 11 - стол
Благодаря оснащению многоцелевых станков (МС) устройствами ЧПУ и автоматической смены инструмента существенно сокращается вспомогательное время при обработке и повышается мобильность переналадки. Сокращение вспомогательного времени достигается благодаря автоматическим установке инструмента (заготовки) по координатам, выполнению всех элеметнов цикла, смене инструметнов, кантованию и смене заготовки, изменению режимов резания, выполнению контрольных операций, а также большим скоростям вспомогательных перемещений.
По назначению МС делятся на две группы: для обработки заготовок корпусных и плоских деталей и для обработки заготовок деталей типа тел вращения. В первом случае для обработки используют МС сверлильно-фрезерно-расточной группы, а во втором-токарной и шлифовальной групп. Рассмотрим МС первой группы, как наиболее часто используемые.
МС имеют следующие характерные особенности: наличие инструментального магазина, обеспечивающего оснащенность большим числом режущих инструментов для высокой концентрации операций (черновых, получистовых и чистовых), в том числе точения, растачивания. фрезерования, сверления, зенкерования, развертывания, нарезания резьб, контроля качества обработки и др.; высокая точность выполнения чистовых операций (6...7-й квалитеты).
Рисунок ПБ4 Горизонтальный многоцелевой сверлильно-фрезерно-расточной станок с ЧПУ:
1 поворотный стол; 2 зажимные приспособления; 3 шпиндель; 4 шпиндельная бабка;
5 автооператор; 6 иструментальный магазин; 7 стойка; 8 поворотная платформа;
9 заготовка; 10 стол-спутник; 11 система ЧПУ; 12 шкаф для электрооборудования
Приложение В
(обязательное)
Тема: Конвертер для повышения оперативности перепрограммирования станков с ЧПУ
Руководство пользователя
Всего листов - 13
2011
Назначение программы. Программа предназначена для конвертирования исходного текста программ для станков с ЧПУ и предназначена для использования на производстве в различных областях.
Программа позволяет:
конвертировать программный текст в любою из доступных программе систем;
удалять лишние пробелы;
удалять пустые строки;
восстанавливать периодическую нумерацию кадров;
задавать шрифт(цвет, размер, тип);
печать документа;
визуальный контроль обработки;
менять регистр букв к заглавным(что требует синтаксис программ);
разбивать программу на заданное количество частей;
осуществляет поиск и замену по образцу.
Условия выполнения программы. Разработанная программа является приложением MS Windows. Для ее работы требуется наличие на компьютере операционной системы MS Windows 98/NT4.0/2000/XP и все вытекающее отсюда техническое обеспечение.
Кроме того, требуется:
физическая память 1Mб + память на используемые и создаваемые из текстовые файлы (не менее 10 Мб);
оперативная память 2*размер используемого файла. При нехватке оперативной памяти может использоваться виртуальная память. А за счет того, что все данные находятся в памяти, сильно сокращается время решения задач.
Для написания программы использовалась среда разработки Borland Delphi 7.
Выполнение программы. Программа представлена в виде формы, в главном окне которого производится выбор функции программы. Режим работы программы диалоговый. Все выполняемые программой функции запускаются с помощью соответствующих кнопок.
Для запуска программы оператор из оболочки системы Windows должен произвести запуск файла Наладчик.ехе
Рисунок ПВ1 - Главное окно программы
Рисунок ПВ2 - Панель инструментов
----- открыть файл
----- сохранить файл
----- распечатать содержимое поля редактирования
----- при нажатии этой кнопки появляется дополнительный диалог обработки (см. далее)
----- очистить поле редактирования
----- при нажатии этой кнопки появляется дополнительный диалог замены (см. далее)
----- при нажатии всё содержимое поля редактирования преобразуется к верхнему регистру
------ при нажатии появляется дополнительный диалог (разбивка файла на несколько частей)
Меню файл:
Выход выход из программы;
Сохранить вызов диалогового окна (Сохранить как);
Открыть вызов диалогового окна (Сохранить как);
Печать вызов диалогового окна (Печать).
Меню настройки:
Шрифт - вызов диалогового окна(Шрифт);
Принтер - вызов диалогового окна(Настройка печати);
Параметры - вызов диалогового окна(Параметры).
Работа начинается с открытия текстового файла либо выбором пункта меню Файл открыть. В результате открывается диалог выбора файла (Рисунок ПВ4):
Рисунок ПВ4 - Диалог выбора файла
Выбрать файл, нажать «открыть». Следующим действием нажать, появляется диалог, в котором выбрать желаемый метод обработки.
Рисунок ПВ5 Диалог выбора метода обработки
Не обрабатывать пересчет производится не будет.
ПК МАЯК выбрана обработка конвертирование системы (Sinumeric Маяк).
ПК ВМ выбрана обработка конвертирование системы (Sinumeric ВМ).
ВМ МАЯК выбрана обработка конвертирование системы (ВМ Маяк).
МАЯК ВМ выбрана обработка конвертирование системы (Маяк - ВМ).
Кнопка «Закрыть» закрывает диалог. В результате выбранных вами действий результат выбора отображается в левом нижнем углу главной формы (рисунок ПВ6):
Рисунок ПВ6 Левый нижний угол главного окна программы
Выбрано: обработка ПК МАЯК.
Дополнительная панель настройки обработки
Рисунок ПВ7 - Дополнительная панель настройки обработки
Номера кадров упорядочить номера кадров, начиная с 1.
Пробелы будут удалены все пробелы.
Пустые строки будут удалены все пустые строки.
4.4 Информация во время обработки
Рисунок ПВ8 Диалоговое окно начала обработки
Нажимаем кнопку <Обработка>.
На рисунке ПВ9 изображена информационная панель, отображающая в процентах и графически, сколько уже обработано данных файла во время обработки (рисунок ПВ9):
Рисунок ПВ9 Информационная панель
Во время обработки в верхней части окна показано, сколько обработано строк, в нижней сколько всего (рисунок ПВ10):
Рисунок ПВ10 Ход выполнения программы
Файл обработан, сохраняем или меню файл сохранить.
В результате нажатия вышесказанной кнопки появляется следующий диалог.
Выберите желаемый файл из списка или напишите имя в поле «Имя файла» (рисунок ПВ11):
Рисунок ПВ11 Диалговое окно сохранение файла
Закрытие программы производится кнопкой «Закрыть».
Функция разделения файла. При нажатии кнопки на панели инструментов (Рисунок ПВ12) появляется диалог «Разбивка файла на несколько частей»:
Рисунок ПВ12 Разбивка файла на несколько частей
При нажатии на кнопку «Обработка» происходит разбивка файла на файлы заданной ёмкости. Нажать кнопку «Настройка».
В этом диалоге при нажатии кнопки «Редактирование вставки в конец файла» текст набранный в поле редактора (находится внизу формы) вставляется в каждую часть файла (рисунок ПВ13):
Рисунок ПВ13 Диалговое окно редактирования
При нажатии кнопки «Редактировать конечную папку» появляется диалог «Сохранить как».
Дополнительные настройки. Меню Настройки.
Шрифт выбор шрифта для поля редактирования (рисунок ПВ14):
Рисунок ПВ14 - Выбор шрифта для поля редактирования
Принтер установка свойств принтера для вывода на печать представлена на рисунке ПВ15:
Рисунок ПВ15 - Установка свойств принтера для вывода на печать
Этот диалог вызывается нажатием кнопки и работает как замена чего-то чем-то. В данном примере все вхождения X заменяются Y (рисунок ПВ16):
Рисунок ПВ16 Диалог замены X на Y
4.6. Инструкции по обработке исключительных ситуаций
Во время работы программы могут поступать сообщения пользователю (исключительные ситуации), которые запрограммированы лишь для повышения надёжности программы и исключения, как можно больше ошибок.
Это сообщение поступает при нажатии кнопки <Обработка>, но в поле редактирования пусто.
Действия открыть не пустой файл и повторить обработку.
Рисунок ПВ17 В поле редактирования пусто
Сообщение появляется при попытке закрыть программу, не сохранив изменившееся поле редактирования.
Действия если хотите сохранить изменённый файл, нажать <Yes>, иначе - <No>.
Рисунок ПВ18 Окно подтверждения
Дополнительные инструкции по программированию и математическая постановка. Как отмечалось выше, эта версия программы обрабатывает исходный код, который генерирует программа Unigraphics.
Пример кода из Unigraphics.
Программа 1.
N0800 X90.91 Y-160.881
N0810 G3 X91.643 Y-166.402 I423.693 J53.462
N0820 X92.657 Y-173.301 I350.64 J47.998
N0830 G1 X91.625 Y-178.443
N0840 G2 X91.623 Y-178.442 I2.026 J6.7
N0850 X90.181 Y-177.736 I1.441 J4.76
N0860 G1 X89.494 Y-177.174
N0870 X89.242 Y-176.969
Из примера следует, что координаты задаются в миллиметрах до 0.001 долей (при обработке в программе Наладчик размеры разрядностью более 0.001 отбрасываются).
Пример Unigraphics 0.0016 после обработки Наладчик 0.001.
Центр радиуса задаётся относительно начальной точки радиуса (относительно).
N0810 G3 X91.643 Y-166.402 I423.693 J53.462
ПК МАЯК
У Маяков, как известно координаты задаются тоже в миллиметрах, но I, J координаты центра радиусов задаются относительно начала системы координат (абсолютно) (таблица ПВ1).
Таблица ПВ1 - Программа до и после обработки.
Программа до обработки (программа 1) |
Программа после обработки ПК МАЯК (программа 2) |
N0800 X90.91 Y-160.881 N0810 G3 X91.643 Y-166.402 I423.693 J53.462 N0820 X92.657 Y-173.301 I350.64 J47.998 N0830 G1 X91.625 Y-178.443 N0840 G2 X91.623 Y-178.442 I2.026 J6.7 N0850 X90.181 Y-177.736 I1.441 J4.76 N0860 G1 X89.494 Y-177.174 N0870 X89.242 Y-176.969 |
N73X90.91Y-160.881 N74G3X91.643Y-166.402I514.603J-107.419 N75X92.657Y-173.301I442.283J-118.404 N76G1X91.625Y-178.443 N77G2X91.623Y-178.442I93.651J-171.743 N78X90.181Y-177.736I93.064J-173.682 N79G1X89.494Y-177.174 N80X89.242Y-176.969 |
Принцип пересчёта радиусов.
Iнаст = Xпред + Iнаст Это формулы пересчёта радиусов с относительной в
Jнаст = Yпред + Jнаст абсолютную систему координат.
То есть, для кадра N74 (программа 2) берём из кадра N0800 (программа 1) X, Y из N0810 берём I, J получаем:
Iнаст = X90.91 + I423.693 = 514.603 результат обработки в программе 2 (кадр N74)
Jнаст = Y-160.881 + J53.462 = -107.419
Расчёт линейных заходов (функции G41, G42) на эквидистанту контура обрабатываемой детали.
Таблица ПВ2 - Добавление недостающих координат
до обработки (программа 1) |
после обработки (программа 2) |
N5G1Z-25.F500M8 N6G90G42D20X-104.6Y0F20 N7Y-23. |
N5G1Z-25.F500M8 N6G90G42D20X-104.6Y0I0J-23.F20 N7Y-23. |
Здесь видим, что в программу были вставлены недостающие части кадра I и J координаты таблицы ПВ2.
I = X_sled X_nast; Это формулы расчёта координат заходов на линейный
J = Y_sled Y_nast контур детали.
То есть для кадра N6 (программа 2) берутся из кадра N6 и N7 (программа 1) настоящие и следующие значения координат X и Y.
I = (его нет значит значение то же, что и предыдущее) 104.6 104.6 = 0
J = 23 0 = 23.
Расчёт заходов на радиус (функции G41, G42) на эквидистанту контура обрабатываемой детали.
С начала рассчитываем значение (I и J) из следующего кадра.
Логическое решение задачи
Если G3, то проверяем значение заданных координат:
Если I_sled > 0 и J_sled >= 0, то I = 1, J = -1;
Если I_sled < 0 и J_sled <= 0, то I = -1, J = 1;
Если I_sled < 0 и J_sled >= 0, то I = 1, J = 1;
Если I_sled > 0 и J_sled <= 0, то I = -1, J = -1
Если G2, то проверяем значение заданных координат:
Если I_sled > 0 и J_sled >= 0, то I = -1, J = 1;
Если I_sled < 0 и J_sled <= 0, то I = 1, J = -1;
Если I_sled < 0 и J_sled >= 0, то I = -1, J = -1;
Если I_sled > 0 и J_sled <= 0, то 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 и J < 0, то J_nast:= -J_nast;
если J = -1 и I > 0, то I_nast:= -I_nast;
если J = 1 и I < 0, то I_nast:= -I_nast.
В данном примере срабатывает условие, если I_sled > 0 и J_sled >= 0,
значит I = 1, J = -1, то есть I будет положительным, а J - отрицательным
Далее по формулам: I_nast = Y_nast + J_sled; J_nast = X_nast + I_sled
находим: I_nast = 0 + 0 = 0; J_nast = 104.6 + (-2.5) = 102.1
Залючительные вычисления, если I = 1 и J < 0, то J_nast:= -J_nast;
J_nast = -102.1, что видно в таблице ПВ3.
Таблица ПВ3 - Расчёт заходов на радиус (функции G41, G42)
до обработки (программа 1) |
после обработки (программа 2) |
N5G1Z-25.F500M8 N6G90G42D20X-104.6Y0I0J-23.F20 N8G3X-102.1Y-25.5I2.5J0.0 |
N1G1Z-25.F500M8 N2G90G42D20X-104.6Y0I0J-102.1F20 N3G3X-102.1Y-25.5I-102.1J0 |
Не пересчитывайте программу дважды.
Приложение Г
(обязательное)
Тема: Конвертор для повышения эффективности перепрограммирования станков с ЧПУ
Таблицы расчётов сетевых графиков
Всего листов - 6
2011
Таблица Г1 Определение коэффициентов для расчета затрат
Название ПС |
Степень новизны |
Коэффициент использования типовых ПС, Кт |
Группа сложности |
|
Код |
Кн |
|||
Конвертер исходного текста программы работы станка с ЧПУ из одной системы программирования в другую |
B |
0,7 |
0,7 |
2 |
Дополнительные характеристики ПС ВТ |
Коэффициент, учитывающий уровень повышения сложности ПС ВТ, Кi |
|||
1 |
Функционирование ПС ВТ в расширенной операционной среде (связь с другими ПС ВТ) |
0,08 |
||
2 |
Интерактивный доступ |
0,06 |
||
Дополнительные характеристики ПС ВТ |
Коэффициент, учитывающий уровень повышения сложности ПС ВТ, Кi |
|||
3 |
Наличие у ПС ВТ одновременно нескольких характеристик: 2 |
0,12 |
||
Итого |
0,26 |
|||
Дополнительный коэффициент сложности ПС ВТ
|
1,26 |
Таблица Г2 Определение состава функций ПС ВТ
№ п/п |
Наименование (содержание) функции |
Номер функции по каталогу |
Объем функции Vi |
По каталогу функции ПС ВТ |
|||
1 |
Организация ввода информации |
101 |
870 |
2 |
Контроль, предварительная обработка и ввод информации |
102 |
2100 |
3 |
Анализ входного языка (синтетический и семантический) |
103 |
2900 |
4 |
Преобразование операторов входного языка в команды другого языка |
104 |
3850 |
Таблица Г2 Продолжение
5 |
Преобразование входного языка в машинные команды (транслятор, препроцессор, макрогенератор) |
106 |
3260 |
6 |
Организация ввода-вывода информации с сети терминалов |
110 |
2700 |
7 |
Обработка файлов в диалоговом режиме |
306 |
5130 |
8 |
Совместная обработка группы файлов |
307 |
6660 |
9 |
Управление файлами |
308 |
4100 |
10 |
Генерация рабочих программ |
401 |
7440 |
11 |
Отладка прикладных программ в интерактивном режиме |
601 |
10180 |
12 |
Математическая статистика и прогнозирование |
701 |
9970 |
13 |
Графический вывод результатов |
707 |
2030 |
Итого |
62090 |
Таблица Г3 Определение общей трудоемкости разработки ПС ВТ
Общий объем разрабатываемого ПС ВТ, условные машинные команды |
Vо |
62090 |
Затраты труда на разработку ПС ВТ в зависимости от уточненного объема ПС ВТ (Vо) и группы сложности ПС ВТ, человеко-дни |
Tр |
5402 |
Общая трудоемкость разработки ПС ВТ Tо = Ксл·Tр , человеко-дни |
Tо |
6807 |
Таблица Г4 Состав исполнителей
Перечень работ |
Исполнитель |
Количество человек |
Постановка задачи |
Руководитель проекта |
1 |
Определение требований |
Системный аналитик |
1 |
Технико-экономическое обоснование |
Руководитель и программист |
2 |
Сбор и обработка справочных данных |
Руководитель |
1 |
Анализ существующих ПС |
Программист |
1 |
Согласование и утверждение ТЗ |
Руководитель проекта, программист |
2 |
Выбор программно-аппаратных средств |
Программист |
1 |
Разработка структурной схемы системы |
Руководитель и программист |
2 |
Согласование и утверждение ЭП |
Руководитель проекта, системный аналитик |
2 |
Таблица Г4 Продолжение
Разработка алгоритмов программы |
Программист |
1 |
Разработка интерфейса пользователя |
Программист |
1 |
Согласование и утверждение ТП |
Руководитель проекта, системный аналитик |
2 |
Программная реализация |
Программист и руководитель |
2 |
Определение взаимодействия между различными частямя системы |
Программист и системный аналитик |
2 |
Отладка |
Программист |
1 |
Проверка работоспособности на реальных исходных данных |
Программист |
1 |
Разработка технической документации |
Руководитель и программист |
2 |
Перечень работ |
Исполнитель |
Количество человек |
Опытная эксплуатация |
Руководитель |
1 |
Корректировка системы |
Программист |
1 |
Сдача в эксплуатацию |
Руководитель |
1 |
Таблица Г5 Перечень событий и работ до оптимизации сетевого графика
Код собы-тия |
Содержание события |
Код работ |
Содержание работ |
Коли-чество рабочих |
Продолжи-тельность |
0 |
Принято решение о начале разработки |
0-1 |
Постановка задачи |
1 |
3 |
1 |
Задача поставлена |
1-2 |
Определение требований |
1 |
3 |
1-3 |
Технико-экономическое обоснование |
2 |
1 |
||
2 |
Требования определены |
2-4 |
Сбор и обработка справочных данных |
1 |
3 |
3 |
Технико-экономическое обоснование выполнено |
3-5 |
Анализ существующих ПС |
1 |
3 |
4 |
Справочные данные собраны и обработаны |
4-6 |
Согласование и утверждение ТЗ |
2 |
1 |
5 |
Анализ существующих ПС завершен |
5-7 |
Выбор программно-аппаратных средств |
1 |
4 |
6 |
ТЗ согласовано и утверждено |
6-7 |
Разработка структурной схемы системы |
2 |
3 |
Таблица Г5 Продолжение
7 |
Выбор программно-аппаратных средств произведен, структурная схема системы разработана |
7-8 |
Согласование и утверждение ЭП |
2 |
3 |
8 |
ЭП согласован и утвержден |
8-9 |
Разработка алгоритмов программы |
1 |
4 |
8-10 |
Разработка интерфейса пользователя |
1 |
6 |
||
9 |
Алгоритм программы разработан |
9-11 |
Согласование и утверждение ТП |
2 |
3 |
10 |
Интерфейс пользователя разработан |
10-11 |
Программная реализация |
2 |
14 |
11 |
ТП согласован и утвержден, программная реализация завершена |
11-12 |
Определение взаимодействия между различными частями системы |
2 |
10 |
11-13 |
Отладка |
1 |
30 |
||
12 |
Взаимодействия между различными частями системы определено |
12-13 |
Проверка работоспособности на реальных исходных данных |
1 |
10 |
13 |
Отладка произведена, работоспособности на реальных исходных данных проверена |
13-14 |
Разработка технической документации |
2 |
4 |
14 |
Техническая документация разработана |
14-15 |
Опытная эксплуатация |
1 |
12 |
15 |
Опытная эксплуатация произведена |
15-16 |
Корректировка системы |
1 |
19 |
16 |
Системы откорректирована |
16-17 |
Сдача в эксплуатацию |
1 |
9 |
17 |
ПС сдано в эксплуатацию |
Таблица Г6 Перечень событий и работ после оптимизации сетевого графика
Код события |
Содержание события |
Код работ |
Содержание работ |
Кол-во раб-их |
Прод-сть |
0 |
Принято решение о начале разработки |
0-1 |
Постановка задачи |
1 |
3 |
1 |
Задача поставлена |
1-2 |
Определение требований |
1 |
3 |
1-3 |
Технико-экономическое обоснование |
2 |
1 |
||
2 |
Требования определены |
2-4 |
Сбор и обработка справочных данных |
1 |
3 |
3 |
Технико-экономическое обоснование выполнено |
3-5 |
Анализ существующих ПС |
1 |
3 |
4 |
Справочные данные собраны и обработаны |
4-6 |
Согласование и утверждение ТЗ |
2 |
1 |
5 |
Анализ существующих ПС завершен |
5-7 |
Выбор программно-аппаратных средств |
1 |
4 |
6 |
ТЗ согласовано и утверждено |
6-7 |
Разработка структурной схемы системы |
2 |
3 |
7 |
Выбор программно-аппаратных средств произведен, структурная схема системы разработана |
7-8 |
Согласование и утверждение ЭП |
2 |
3 |
8 |
ЭП согласован и утвержден |
8-9 |
Разработка алгоритмов программы |
1 |
4 |
8-10 |
Разработка интерфейса пользователя |
1 |
3 |
||
9 |
Алгоритм программы разработан |
9-11 |
Согласование и утверждение ТП |
2 |
4 |
10 |
Интерфейс пользователя разработан |
10-11 |
Программная реализация |
2 |
30 |
11 |
ТП согласован и утвержден, программная реализация завершена |
11-12 |
Определение взаимодействия между различными частями системы |
2 |
20 |
11-13 |
Отладка |
1 |
59 |
||
12 |
Взаимодействия между различными частями системы определено |
12-13 |
Проверка работоспособности на реальных исходных данных |
1 |
19 |
13 |
Отладка произведена, работоспособности на реальных исходных данных проверена |
13-14 |
Разработка технической документации |
2 |
10 |
14 |
Техническая документация разработана |
14-15 |
Опытная эксплуатация |
1 |
22 |
Таблица Г6 Продолжение
15 |
Опытная эксплуатация произведена |
15-16 |
Корректировка системы |
1 |
38 |
16 |
Системы откорректирована |
16-17 |
Сдача в эксплуатацию |
1 |
14 |
17 |
ПС сдано в эксплуатацию |
Таблица Г7 Заработная плата исполнителей
Исполнитель |
3/п за месяц, руб. |
Количество рабочих дней, дни |
3/п за разработку, руб. |
Программист (специалист) |
8863,5 |
109 |
43914,6 |
Руководитель (руководитель подразделения) |
11335,9 |
33 |
17003,8 |
Системный аналитик (специалист) |
9707,9 |
12 |
5295,2 |
ИТОГО Со.зп |
66213,6 |
Таблица Г8 Стоимость материалов
Наименование товара |
Цена за ед., руб. |
Количество, шт. |
Стоимость, руб. |
Картридж для принтера |
450 |
1 |
450 |
Бумага для принтера |
0,5 (1 лист) |
100 |
50 |
CD-R |
12 |
1 |
12 |
Канцтовары |
300 |
||
ИТОГО: |
812 |
PAGE \* MERGEFORMAT 7
Таблица идентификаторов
Блок синтеза
Блок внутреннего представления
Блок анализа
Исходная программа
Блок анализа и локализации ошибок
Результирующая программа
Сообщение об ошибке
Изм.
Лист
№ докум.
Подписььь
Дата
Лист
39
ДП-СА-06-007-157/4-220201-11-ПЗ
Студент
Богданов Е.В.
Руковод.
Меша К.И.
Консульт.
Смирнов В.Е.
Н. Контр.
Цимбал В.А.
Зав. каф.
Харитонов В.И
Конвертор для повышения эффективности перепрограммирования станков с ЧПУ.
Схема обобщенного алгоритма программы
Лит.
Листов
149
МГТУ «МАМИ»
10-УИ-к-С-9
Да
Нет
Да
Нет
Нет
Да
начало
Открытие
файла
Редактор не пуст и метод задан
Обработка заданными методом
Выход
конец
Выбор основного метода обработки
Выбор дополнительных методов обработки
1
2
3
4
5
6
Изм.
Лист
№ докум.
Подписьь
Дата
Лист
40
ДП-СА-06-007-157/4-220201-11-ПЗ
Студент
Богданов Е.В.
Руковод.
Меша К.И.
Консульт.
Смирнов В.Е.
Н. Контр.
Цимбал В.А.
Зав. каф.
Харитонов В.И
Конвертор для повышения эффективности перепрограммирования станков с ЧПУ
Схема алгоритма модуля выбора метода обработки
Лит.
Листов
149
МГТУ «МАМИ»
10-УИ-к-С-9
Да
Нет
Нет
Нет
Нет
Нет
Нет
Нет
Да
Да
Да
Да
Да
Да
Начало
If DelProbel
DelProbel(bufer);
pc_mayak(bufer);
pc_vm(bufer);
nomerkadra(bufer);
vm_mayak(bufer);
Mayak_vm(bufer);
If pc_mayak
If pc_vm
If nomerkadra
If vm_mayak
If Mayak_vm
Bufer:= ''; Inc(m);
Конец файла
Конец
1
2
3
44
6
8
10
12
5
7
9
11
13
14
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
Конец
Завершение
?
X_pred:= X_nast;
Y_pred:= Y_nast;
NaytiKoordinatu(kadr,'J',vyh);
preobrazovanieMAYAK(J,kadr);
NaytiKoordinatu(kadr,'I',vyh);
preobrazovanieMAYAK(I,kadr);
Podhod_G41_G42_line;
Podhod_G41_G42_radius;
Insert('X' + s, kadr, uslovie);
Insert('Y' + s, kadr, uslovie);
if (pos('G42', kadr) <> 0) or (pos('G41', kadr) <> 0)
insert(Concat('Y', s), kadr, uslovie);
PreobrazovanieMayak(Y_nast, kadr);
If oshibka <> 1
NaytiKoordinatu(kadr,'Y', vyh);
PreobrazovanieMayak(X_nast, kadr);
pos('Y',kadr) <> 0
insert(Concat('X', s), kadr, uslovie);
pos('X',kadr) <> 0
NaytiKoordinatu(kadr,'X', vyh);
pos('%', kadr) <> 0) or (pos('$', kadr) <> 0)
Начало
Да
ет
Нет
Да
Да
if (pos('I', Stroka.Strings[Succ(m)]) <> 0) and (pos('J', Stroka.Strings[Succ(m)]) <> 0)
Да
Нет
Нет
Да
Нет
Да
Нет
Изм.
Лист
№ докум.
Подпись
Дата
Лист
43
ДП-СА-06-007-157/4-220201-11-ПЗ
Студент
Богданов Е.В.
Меша К.И.
Смирнов В.Е.
Цимбал В.А.
Харитонов В.И
Богданов Е.В.
Меша К.И.
Смирнов В.Е.
Цимбал В.А.
Харитонов В.И
Руковод.
Меша К.И.
Меша К.И.
Смирнов В.Е.
Цимбал В.А.
Харитонов В.И
Богданов Е.В.
Меша К.И.
Смирнов В.Е.
Цимбал В.А.
Харитонов В.И
Консульт.
Смиронов В.Е.
Меша К.И.
Смирнов В.Е.
Цимбал В.А.
Харитонов В.И
Богданов Е.В.
Меша К.И.
Смирнов В.Е.
Цимбал В.А.
Харитонов В.И
Н. Контр.
Цимбал В.А.
Меша К.И.
Смирнов В.Е.
Цимбал В.А.
Харитонов В.И
Зав. каф.
Харитонов В.И.
Конвертор для повышения эффективности перепрограммирования станков с ЧПУ.
Схема алгоритма конвертирования
Лит.
Листов
149
МГТУ «МАМИ»
10-УИ-к-С-9
Изм.
Лист
№ докум.
Подпись
Дата
Лист
62
ДП-СА-06-007-157/4-220201-11-П3
Студент
Богданов Е.В.
Руковод.
Меша К.И.
Консульт.
Смирнов В.Е.
Н. Контр.
Цимбал В.А.
Зав. каф.
Харитонов В.И.
А
Конвертор для повышения эффективности перепрограммирования станков с ЧПУ.
Сетевой график планирования работ по разработке ПС (до оптимизации)
Лит.
Листов
149
МГТУ «МАМИ»
10-УИ-к-С-9
Изм.
Лист
№ докум.
Подпись
Дата
Лист
64
ДП-СА-06-007-157/4-220201-11-П3
Студент
Богданов Е.В.
Руковод.
Меша К.И.
Консульт.
Смирнов В.Е.
Н. Контр.
Цимбал В.А.
Зав. каф.
Харитонов В.И.
Конвертор для повышения эффективности перепрограммирования станков с ЧПУ.
Сетевой график планирования работ по разработке ПС (после оптимизации)
Лит.
Листов
149
МГТУ «МАМИ»
10-УИ-к-С-9
EMBED MSPhotoEd.3
EMBED MSPhotoEd.3
EMBED MSPhotoEd.3
EMBED MSPhotoEd.3