Диссертация (1143290), страница 53
Текст из файла (страница 53)
С готовой экспертной системой работает непосредственно пользователь (инженер-технолог), аналогично системе, разработанной для процессов ростаи обработки монокристаллов сапфира. Пользователь осуществляет ввод важныхдля него параметров и их значений (рисунок А.29). Окончательной стадией функционирования системы является прогнозирование качества получаемого кристаллакремния (рисунок А.30, рисунок А.31).Рисунок А.29 – Ввод параметров и их значений381Рисунок А.30 – Прогноз качества кристаллаРисунок А.31 – Прогноз качества кристалла382К основным операциям механической обработки сапфира относят резание,шлифование, полирование [93, 325].
Выбор оптимальных режимов резания (подачи, глубины и скорости резания) необходим для обеспечения высокой производительности, качества и точности обработки поверхности сапфира. В работах [92, 93,326] определено, что эффективность операции резания находится в прямо пропорциональной зависимости от скорости подачи S и в обратно пропорциональной зависимости от скорости резания V. Макимальной эффективности резания материалов добиваются путем выбора режимов с большим значением отношения S/V, ноэтот режим ухудшает точность и качество обработки из-за влияния сил резания наобработку. Резание не позволяет добиться требуемого качества приповерхностногослоя кристалла. После резания имеются погрешности формы (неплоскостность, изгиб, непараллельность плоскостей), значительный нарушенный приповерхностныйслой и отклонения по толщине.
Следовательно, для повышения качества приповерхностных слоев материала требуется дальнейшая обработка поверхности с использованием абразивных материалов – шлифование и полирование. Шлифованные поверхности характеризуются 9-12-м классами шероховатости поверхности.Полирование поверхности приводит к 13-14-му классу шероховатости. Изменяятехнологические режимы (скорость резания, вид абразива, размер абразивногозерна и так далее) операций шлифования и полирования, возможно управлениеструктурой приповерхностного слоя кристалла (увеличение или уменьшение глубины нарушенного слоя).
Следовательно, работоспособность и долговечность изделий, прочность, их оптическая однородность, и ряд других параметров во многом зависит от выбора режимов шлифования и полирования монокристаллов.Автором предложен систематизированный подход для оптимизации процесса шлифования поверхности кристаллов сапфира. Разработана программа для расчета основных параметров для плоского шлифования кристаллов сапфира периферией круга. Рекомендуемые режимы шлифования должны привести к получениютребуемого качества приповерхностного слоя шлифуемого материала в процессеобработки.383Для предложенной программы расчета параметров обработки исходнымиданными являлись следующие данные: параметры шлифовального круга (диаметркруга, коэффициент износа шлифовального круга, частота вращения круга, числоактивных вершин абразивных зерен, средний радиус округления вершин абразивных зерен и другие), параметры обработки (требуемая величина шероховатости,глубина шлифования, скорость детали, поперечная подача стола, продольная подача стола, ширина заготовки, длина рабочего хода и другие).
Предложенная программа дает возможность рассчитать толщину приповерхностного нарушенногослоя кристаллов сапфира, толщину среза, удельную производительность с единицы площади поверхности контакта между кругом и образцом, основное время обработки, радиальный износ круга, скорость резания, объемный расход круга на одну заготовку и другие параметры [327-329].На начальном этапе необходимо ввести в программу исходные данные, важные для расчета.
К исходным данным относятся параметры шлифовального круга(рисунок А.32) и параметры обработки (рисунок А.33). Результатом работы программы являются основные параметры плоского шлифования монокристалловсапфира (рисунок А.34). Данный расчет основывается на математических моделях[93, 330-338].Рисунок А.32 – Ввод параметров шлифовального круга384Рисунок А.33 – Ввод параметров обработкиРисунок А.34 – Расчет основных параметров плоского шлифования поверхности монокристаллического сапфираОсновы экспертной системы, предложенные для процессов получения монокристаллов сапфира, нашли свое применение при разработке автором новой базызнаний для поддержки принятия решения при выборе параметров шлифования монокристаллического сапфира.
Долговечность и работоспособность сапфировых из385делий, их оптическая однородность, прочность и ряд других параметров во многомзависит от выбора режимов шлифования и полирования поверхности.Получение требуемого качества приповерхностного слоя кристаллов сапфира является сложной задачей, поскольку существует многофакторная зависимостьпараметров обработки сапфира от контролируемых (и возможно неконтролируемых) воздействий на качество поверхности сапфира. К контролируемым параметрам можно отнести категорию качества выращиваемого сапфира, скорость резания, глубину подачи, вид абразива, скорость подачи и другие. Под неконтролируемыми воздействиями рассматривается тот факт, что ряд факторов корреляционнозависимы, что довольно сложно учесть.
Именно это послужило причиной разработки автором системы, которая поможет оценить и спрогнозировать качество поверхностного слоя сапфира и, как результат, добиться требуемой шероховатостиповерхности.База знаний предложенной системы состоит из набора правил, позволяющегопо данным о категории качества кристалла (оптическое, техническое, механическое качество), виду абразива (закрепленный, свободный и их сочетание), скоростирезания (25-35 м/с), скорости подачи (20-30 м/мин), глубине подачи (1.3-3 мм)проводить анализ и давать возможность оценить качество приповерхностного слоямонокристаллического сапфира.
В экспертной системе используются нейронныесети, то есть каждому признаку присваивается весовая характеристика в зависимости от его влияния на качество приповерхностного слоя сапфира. На рисунке А.35представлены программные модули системы.386Рисунок А.35 – Программные модули системы для выбора параметров обработки кристаллов сапфираПо мере выявления новых критериев и проведения новых экспериментоввозможно расширение системы путем учета новых параметров, влияющих на качество приповерхностного слоя монокристаллов сапфира.Система, предложенная для учета параметров шлифования монокристалловсапфира, позволяет получить зависимости влияния режимов обработки на качествоприповерхностного слоя кристалла, выдать рекомендации по выбору этих режимов, чтобы улучшить качество приповерхностного слоя шлифуемого сапфира.А.4 Электронный интегрированный портал процесса получения изделийиз сапфираДля знакомства с разработками автора предложены Web-страницы, куда помещена самая актуальная информация по проводимым экспериментам, разрабо387танным системам и предложениям по улучшению технологического процесса получения изделий из сапфира.Рисунок А.36 – Разработанная Web-страница с исследованиями автораНа Web-страницах приведены этапы исследования автора, структура разрабатываемых систем для роста и обработки кристаллов сапфира, интерфейс программных модулей и их подробное описание.388Рисунок А.37 – Разработанная Web-страничка на английском языкеА.5 Рекомендации по работе с математическим и информационнымобеспечением получения изделий из сапфираК основным результатам работы с предложенными программными системами для получения изделий из сапфира для микроэлектроники являются следующие:1.Отмечено, что выбор оптимальных режимов получения монокристал-лов сапфира должен осуществляться с помощью методов оптимизации, методованалитического моделирования, экспериментальных исследований и применения389технологий экспертных систем.
Экономический эффект и уменьшение затрат натехнологический процесс проявляется в увеличении выхода годных кристаллов иуменьшении длительности технологического процесса.2.Предложена общая структура для математического и информационно-го обеспечения получения изделий из сапфира, в состав которого включена базаданных, информационная и экспертная системы получения изделий из сапфира длямикроэлектроники.3.Разработаны критерии, на основании которых проведена оптимизациятехнологического процесса получения изделий из сапфира.
Данные критерии базируются на важных показателях процесса (стоимость технологического процесса,качество монокристаллов сапфира) и определяют конкурентоспособность производства и эффективность.4.Предложен алгоритм анализа и сбора данных, который был реализованв виде информационной и экспертной систем получения изделий из сапфира икремния, которые позволяют дать точную характеристику получаемых изделий изкристаллов сапфира и кремния, выявить закономерности влияния факторов на рости обработку кристаллов, что приводит к увеличению выхода кристаллов требуемойкатегории качества.390ПРИЛОЖЕНИЕ B Фрагменты кодов программКласс для работы с решателя#include "StdAfx.h"#include "Solver.h"#include "Condition.h"#include <iostream>namespace{////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Constants//const double CONST_BOLTZMANN = 5.68e-8;const double EPSILON = 0.1;}using namespace std;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CSolver class//CSolver::CSolver(): m_nSize(0){}CSolver::~CSolver(){}// Finds result temperatures for each element from aSourceElementsvoid CSolver::Solve(CConditionI* pCond, const vector<STetrElement>&aSourceElements,vector<double>* paResult){try{_Init(pCond, aSourceElements);_Solve(pCond);*paResult = m_aResultT;}catch(bad_alloc&){_Stop();throw;}391_Stop();}// Creates all matrices, that are required for solvingvoid CSolver::_Init(CConditionI* pCond, const vector<STetrElement>&aSourceElements){m_nSize = aSourceElements.size();m_Aii.resize(m_nSize);m_B.resize(m_nSize);m_Aij.resize(m_nSize);m_aResultT.resize(m_nSize);m_aNewT.resize(m_nSize);vector<STetrElement>::const_iterator it;vector<STetrElement>::const_iterator begin = aSourceElements.begin();vector<STetrElement>::const_iterator end = aSourceElements.end();for (it = begin; it != end; it++){unsigned int nFacesCount = COUNTOF(it->m_anNeighbours);unsigned int nIndex = it - begin;bool bInnerElement = true;double fCoeff = 0.0;unsigned int nFace;for (nFace = 0; nFace < nFacesCount; ++nFace){// get neighbor indexint nNbIndex = it->m_anNeighbours[nFace];if (nNbIndex != -1){// if neighbor exists, calculate its coefficientconst STetrElement& neighbour = aSourceElements[nNbIndex];double fCurr = _GetCoeff(pCond, *it, nFace, neighbour);fCoeff += fCurr;m_Aij[nIndex].m_aValues[nFace] = fCurr;m_Aij[nIndex].m_aNbIndexes[nFace] = nNbIndex;}else{// else have zerosm_Aij[nIndex].m_aValues[nFace] = 0.0;m_Aij[nIndex].m_aNbIndexes[nFace] = 0;}}double fB = 0;if ((it->m_eLocation == esBottom) || (it->m_eLocation == esTop)){// get element's x positiondouble fPosX = it->m_centerPoint.m_x;// it is bottom or top element, calcule its 'q'fCoeff += pow(pCond->GetThot(fPosX), 3) * pCond->GetBetta(fPosX) *CONST_BOLTZMANN;fB = pow(pCond->GetThot(fPosX), 4) * pCond->GetBetta(fPosX) *CONST_BOLTZMANN;392}m_Aii[nIndex] = fCoeff;m_B[nIndex] = fB;}}// Solves SLEvoid CSolver::_Solve(CConditionI* pCond){vector<double>::iterator it, end = m_aResultT.end();for (it = m_aResultT.begin(); it != end; it++)*it = pCond->GetT0();double fMaxError = EPSILON + 1;unsigned int nIteration = 0;while (fMaxError > EPSILON){fMaxError = 0;unsigned int i;for (i = 0; i < m_nSize; ++i){double dNewValue = m_B[i];unsigned int j;for(j = 0; j < FACES_COUNT; ++j)dNewValue += m_Aij[i].m_aValues[j] * m_aResultT[m_Aij[i].m_aNbIndexes[j]];m_aNewT[i] = (dNewValue / m_Aii[i]);double fCurrErr = fabs(m_aNewT[i] - m_aResultT[i]);if (fCurrErr > fMaxError)fMaxError = fCurrErr;}for (i = 0; i < m_nSize; ++i)m_aResultT[i] = m_aNewT[i];cout <<"Iteration = " << ++nIteration << ",Error = " << fMaxError << endl;}}// Un-initializationvoid CSolver::_Stop(){m_Aii.clear();m_Aij.clear();m_B.clear();m_aResultT.clear();m_nSize = 0;}// Calculates coefficient for a specified facedouble CSolver::_GetCoeff (CConditionI* pCond, const STetrElement& elem,unsigned int nFace, const STetrElement& neighbour){CVector vCenter(elem.m_centerPoint, neighbour.m_centerPoint);const CVector& vNormal = elem.m_aNormals[nFace];return (pCond->GetK(elem.m_centerPoint.m_x) *elem.m_aAreas[nFace]) /393(vNormal.GetX() * vCenter.GetX() +vNormal.GetY() * vCenter.GetY() +vNormal.GetZ() * vCenter.GetZ());}Класс для работы с условиями#include "StdAfx.h"#include "Solver.h"#include "Condition.h"#include <iostream>namespace{////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Constants//const double CONST_BOLTZMANN = 5.68e-8;const double EPSILON = 0.1;}using namespace std;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CSolver class//CSolver::CSolver(): m_nSize(0){}CSolver::~CSolver(){}// Finds result temperatures for each element from aSourceElementsvoid CSolver::Solve(CConditionI* pCond, const vector<STetrElement>&aSourceElements,vector<double>* paResult){try{_Init(pCond, aSourceElements);_Solve(pCond);*paResult = m_aResultT;}catch(bad_alloc&)394{_Stop();throw;}_Stop();}// Creates all matrices, that are required for solvingvoid CSolver::_Init(CConditionI* pCond, const vector<STetrElement>&aSourceElements){m_nSize = aSourceElements.size();m_Aii.resize(m_nSize);m_B.resize(m_nSize);m_Aij.resize(m_nSize);m_aResultT.resize(m_nSize);m_aNewT.resize(m_nSize);vector<STetrElement>::const_iterator it;vector<STetrElement>::const_iterator begin = aSourceElements.begin();vector<STetrElement>::const_iterator end = aSourceElements.end();for (it = begin; it != end; it++){unsigned int nFacesCount = COUNTOF(it->m_anNeighbours);unsigned int nIndex = it - begin;bool bInnerElement = true;double fCoeff = 0.0;unsigned int nFace;for (nFace = 0; nFace < nFacesCount; ++nFace){// get neighbor indexint nNbIndex = it->m_anNeighbours[nFace];if (nNbIndex != -1){// if neighbor exists, calculate its coefficientconst STetrElement& neighbour = aSourceElements[nNbIndex];double fCurr = _GetCoeff(pCond, *it, nFace, neighbour);fCoeff += fCurr;m_Aij[nIndex].m_aValues[nFace] = fCurr;m_Aij[nIndex].m_aNbIndexes[nFace] = nNbIndex;}else{// else have zerosm_Aij[nIndex].m_aValues[nFace] = 0.0;m_Aij[nIndex].m_aNbIndexes[nFace] = 0;}}double fB = 0;if ((it->m_eLocation == esBottom) || (it->m_eLocation == esTop)){// get element's x positiondouble fPosX = it->m_centerPoint.m_x;// it is bottom or top element, calcule its 'q'395fCoeff += pow(pCond->GetThot(fPosX), 3) * pCond->GetBetta(fPosX) *CONST_BOLTZMANN;fB = pow(pCond->GetThot(fPosX), 4) * pCond->GetBetta(fPosX) *CONST_BOLTZMANN;}m_Aii[nIndex] = fCoeff;m_B[nIndex] = fB;}}// Solves SLEvoid CSolver::_Solve(CConditionI* pCond){vector<double>::iterator it, end = m_aResultT.end();for (it = m_aResultT.begin(); it != end; it++)*it = pCond->GetT0();double fMaxError = EPSILON + 1;unsigned int nIteration = 0;while (fMaxError > EPSILON){fMaxError = 0;unsigned int i;for (i = 0; i < m_nSize; ++i){double dNewValue = m_B[i];unsigned int j;for(j = 0; j < FACES_COUNT; ++j)dNewValue += m_Aij[i].m_aValues[j] * m_aResultT[m_Aij[i].m_aNbIndexes[j]];m_aNewT[i] = (dNewValue / m_Aii[i]);double fCurrErr = fabs(m_aNewT[i] - m_aResultT[i]);if (fCurrErr > fMaxError)fMaxError = fCurrErr;}for (i = 0; i < m_nSize; ++i)m_aResultT[i] = m_aNewT[i];cout <<"Iteration = " << ++nIteration << ",Error = " << fMaxError << endl;}}// Un-initializationvoid CSolver::_Stop(){m_Aii.clear();m_Aij.clear();m_B.clear();m_aResultT.clear();m_nSize = 0;}// Calculates coefficient for a specified facedouble CSolver::_GetCoeff (CConditionI* pCond, const STetrElement& elem,unsigned int nFace, const STetrElement& neighbour){396CVector vCenter(elem.m_centerPoint, neighbour.m_centerPoint);const CVector& vNormal = elem.m_aNormals[nFace];return (pCond->GetK(elem.m_centerPoint.m_x) *(vNormal.GetX() * vCenter.GetX() +vNormal.GetY() * vCenter.GetY() +vNormal.GetZ() * vCenter.GetZ());elem.m_aAreas[nFace]) /}Класс для работы с векторами#include "StdAfx.h"#include "Vector.h"#include "Structs.h"////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CVector class//CVector::CVector(double x, double y, double z): m_x(x), m_y(y), m_z(z){}CVector::CVector(const SNode& from, const SNode& to){Set(from, to);}CVector::~CVector(){}void CVector::Set(const SNode& from, const SNode& to){_ASSERTE (!((to.m_x == from.m_x) &&(to.m_y == from.m_y) &&(to.m_z == from.m_z) ));m_x = to.m_x - from.m_x;m_y = to.m_y - from.m_y;m_z = to.m_z - from.m_z;}void CVector::Normalize(){double fLength = sqrt((m_x * m_x) + (m_y * m_y) + (m_z * m_z));m_x /= fLength;m_y /= fLength;m_z /= fLength;}void CVector::Reverse(){m_x = -m_x;397m_y = -m_y;m_z = -m_z;}double CVector::GetX() const{return m_x;}double CVector::GetY() const{return m_y;}double CVector::GetZ() const{return m_z;}bool CVector::operator == (const SNode& other) const{return ((m_x == other.m_x) ||(m_y == other.m_y) ||(m_z == other.m_z));}Класс для работы с сеткой#include "StdAfx.h"#include "MeshReader.h"#include <string>#include <iostream>namespace{////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Constants//const char SECTION_NODES[]= "$Nodes";const char SECTION_ELEMENTS[] = "$Elements";constconstconstconstunsignedunsignedunsignedunsignedintintintintTYPE_EDGETYPE_TRIANGLETYPE_TETRAHEDRONTYPE_VERTEX====1;2;4;15;}using namespace std;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CMeshReader class398//CMeshReader::CMeshReader(){}CMeshReader::~CMeshReader(){}void CMeshReader::Read(const char* lpszPath){_ASSERTE(lpszPath != 0);m_fileInput.open(lpszPath);if (!m_fileInput.good())THROW("Error of the input file opening.");while (!m_fileInput.eof()){string strBuff;m_fileInput >> strBuff;if (strBuff == SECTION_NODES)_ReadSectionNodes();if(strBuff == SECTION_ELEMENTS)_ReadSectionElements();}}const vector<SNode>& CMeshReader::GetNodes() const{return m_aNodes;}const vector<STetrahedron>& CMeshReader::GetTetrahedrons() const{return m_aTetrahedrons;}void CMeshReader::_ReadSectionNodes(){unsigned int nNodesCount;m_fileInput >> nNodesCount;cout << "Number of nodes = " << nNodesCount << endl;m_aNodes.resize(nNodesCount);unsigned int i;for (i = 0; i < nNodesCount; ++i){SNode& point = m_aNodes[i];unsigned int nID;m_fileInput >> nID >> point.m_x >> point.m_y >> point.m_z;}}void CMeshReader::_ReadSectionElements()399{unsigned int nElemCount;m_fileInput >> nElemCount;unsigned int i;for(i = 0; i < nElemCount; ++i){unsigned int nID;m_fileInput >> nID;unsigned int nType;m_fileInput >> nType;switch(nType){case TYPE_EDGE:{SEdge edge;_ReadNodeValues(edge.m_nodes, COUNTOF(edge.m_nodes));m_aEdges.push_back(edge);break;}case TYPE_TRIANGLE:{STriangle face;_ReadNodeValues(face.m_nodes, COUNTOF(face.m_nodes));m_aFaces.push_back(face);break;}case TYPE_TETRAHEDRON:{STetrahedron tetr;_ReadNodeValues(tetr.m_nodes, COUNTOF(tetr.m_nodes));m_aTetrahedrons.push_back(tetr);break;}case TYPE_VERTEX:{node_id vertex;_ReadNodeValues(&vertex, 1);m_aVertexes.push_back(vertex);break;}default:{break;}}}}void CMeshReader::_ReadNodeValues(node_id aNodes[], unsigned int nNodesCount){_ASSERTE(aNodes != NULL);int nBuff;m_fileInput >> nBuff >> nBuff >> nBuff;unsigned int nNode;for (nNode = 0; nNode < nNodesCount; ++nNode){m_fileInput >> aNodes[nNode];400aNodes[nNode]--;}}Класс для вывода результата#include "StdAfx.h"#include "PosFileWriter.h"#include <fstream>using namespace std;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CPosFileWriter class//// Write new *.pos file.












