⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nccodeparse.cpp

📁 用VC++开发了一个数控加工的三维仿真程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// NCCodeParse.cpp : 实现文件
//

#include "stdafx.h"
#include "NCSimulaSys.h"
#include "NCCodeParse.h"


// CNCCodeParse

IMPLEMENT_DYNAMIC(CNCCodeParse, CWnd)

CNCCodeParse::CNCCodeParse()
{
	for(int i=0;i<=26;i++)
		m_strFuncGroup[i] = '\0';

	m_iCoolingFluid = 0;
	m_iChangeTools = 0;
	m_xBefore_absolute=0,m_yBefore_absolute=0,m_zBefore_absolute=0;
	m_xAfter_absolute=0,m_yAfter_absolute=0,m_zAfter_absolute=0;
	m_x_r=0,m_y_r=0,m_z_r=0;
	m_fScale=1;
}

CNCCodeParse::~CNCCodeParse()
{
}

// 该函数以行为单位解析NC代码,如果判断是需要返回坐标的代码,则将坐标保存在主调函数传来参数的引用上.
bool CNCCodeParse::CodeLineParse(CString strLine,bool willreturnabsolutecoordinate,CArray<CString,CString> &m_ArrayForwardDirection_CodeLineInterpolation)
{
	// 将代码全部转换为大写.
	strLine.MakeUpper();
	// 去掉该行代码中的所有空格.
	strLine.Remove(' ');

	// 寻找功能字.
	for(int i=0;i<strLine.GetLength();i++)
	{
		if(strLine[i]=='G')
		{
			// 如果判断是G00(点定位).
			if(strLine[i+1]=='0'&&strLine[i+2]=='0')
			{}

			// 下列指令是需要插补的指令.
			// 如果判断是G01(直线插补).
			if(strLine[i+1]=='0'&&strLine[i+2]=='1')
			{
				double xEnd_relative,yEnd_relative,zEnd_relative;
				
				// 先默认计算相对坐标,然后判断当前j状态标志位是"绝对尺寸"还是"增量尺寸",如果判断为绝对坐标,则用相对坐标+前绝对坐标=终点绝对坐标.
				// 获取直线插补的终点坐标.
				// x坐标.
				int xPos = strLine.Find('X');
				if(xPos == -1)
				{
					xEnd_relative = 0;
				}
				else
				{
					CString strX;
					for(int j=xPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strX.AppendChar(strLine[j]);
						}
						else
							break;
					}
					xEnd_relative = atof(strX);
				}

				// y坐标.
				int yPos = strLine.Find('Y');
				if(yPos == -1)
				{
					yEnd_relative = 0;
				}
				else
				{
					CString strY;
					for(int j=yPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strY.AppendChar(strLine[j]);
						}
						else
							break;
					}
					yEnd_relative = atof(strY);
				}
				
				// z坐标.
				int zPos = strLine.Find('Z');
				if(zPos == -1)
				{
					zEnd_relative = 0;
				}
				else
				{
					CString strZ;
					for(int j=zPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strZ.AppendChar(strLine[j]);
						}
						else
							break;
					}
					zEnd_relative = atof(strZ);
				}

				if(m_strFuncGroup[10]=="G90")
				{
					m_xAfter_absolute = xEnd_relative;
					m_yAfter_absolute = yEnd_relative;
					m_zAfter_absolute = zEnd_relative;				
				}
				else
				{
					m_xAfter_absolute = m_xBefore_absolute + xEnd_relative;
					m_yAfter_absolute = m_yBefore_absolute + yEnd_relative;
					m_zAfter_absolute = m_zBefore_absolute + zEnd_relative;
				}

				LineInterpolation(xEnd_relative,yEnd_relative,zEnd_relative,m_ArrayForwardDirection_CodeLineInterpolation);

				return true;
			}
			// 如果判断是G02(顺时针圆弧插补).
			if(strLine[i+1]=='0'&&strLine[i+2]=='2')
			{
				double xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative;
				
				// 先默认计算相对坐标,然后判断当前j状态标志位是"绝对尺寸"还是"增量尺寸",如果判断为绝对坐标,则用相对坐标+前绝对坐标=终点绝对坐标.
				// 获取直线插补的终点坐标.
				// x坐标.
				int xPos = strLine.Find('X');
				if(xPos == -1)
				{
					xEnd_relative = 0;
				}
				else
				{
					CString strX;
					for(int j=xPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strX.AppendChar(strLine[j]);
						}
						else
							break;
					}
					xEnd_relative = atof(strX);
				}

				// y坐标.
				int yPos = strLine.Find('Y');
				if(yPos == -1)
				{
					yEnd_relative = 0;
				}
				else
				{
					CString strY;
					for(int j=yPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strY.AppendChar(strLine[j]);
						}
						else
							break;
					}
					yEnd_relative = atof(strY);
				}
				
				// z坐标.
				int zPos = strLine.Find('Z');
				if(zPos == -1)
				{
					zEnd_relative = 0;
				}
				else
				{
					CString strZ;
					for(int j=zPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strZ.AppendChar(strLine[j]);
						}
						else
							break;
					}
					zEnd_relative = atof(strZ);
				}

				// i坐标.
				int iPos = strLine.Find('I');
				if(iPos == -1)
				{
					iStart_relative = 0;
				}
				else
				{
					CString strI;
					for(int j=iPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strI.AppendChar(strLine[j]);
						}
						else
							break;
					}
					iStart_relative = atof(strI);
				}

				// j坐标.
				int jPos = strLine.Find('J');
				if(jPos == -1)
				{
					jStart_relative = 0;
				}
				else
				{
					CString strJ;
					for(int j=jPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strJ.AppendChar(strLine[j]);
						}
						else
							break;
					}
					jStart_relative = atof(strJ);
				}
				
				// k坐标.
				int kPos = strLine.Find('K');
				if(kPos == -1)
				{
					kStart_relative = 0;
				}
				else
				{
					CString strK;
					for(int j=kPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strK.AppendChar(strLine[j]);
						}
						else
							break;
					}
					kStart_relative = atof(strK);
				}
//				char a[200];
//				sprintf(a,"%f,%f,%f,%f,%f,%f",xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative);
//				AfxMessageBox(_T(a));
				ClockwiseInterpolation(xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative,m_ArrayForwardDirection_CodeLineInterpolation);	
				
				return true;
			}
			// 如果判断是G03(逆时针圆弧插补).
			if(strLine[i+1]=='0'&&strLine[i+2]=='3')
			{
				double xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative;
				
				// 先默认计算相对坐标,然后判断当前j状态标志位是"绝对尺寸"还是"增量尺寸",如果判断为绝对坐标,则用相对坐标+前绝对坐标=终点绝对坐标.
				// 获取直线插补的终点坐标.
				// x坐标.
				int xPos = strLine.Find('X');
				if(xPos == -1)
				{
					xEnd_relative = 0;
				}
				else
				{
					CString strX;
					for(int j=xPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strX.AppendChar(strLine[j]);
						}
						else
							break;
					}
					xEnd_relative = atof(strX);
				}

				// y坐标.
				int yPos = strLine.Find('Y');
				if(yPos == -1)
				{
					yEnd_relative = 0;
				}
				else
				{
					CString strY;
					for(int j=yPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strY.AppendChar(strLine[j]);
						}
						else
							break;
					}
					yEnd_relative = atof(strY);
				}
				
				// z坐标.
				int zPos = strLine.Find('Z');
				if(zPos == -1)
				{
					zEnd_relative = 0;
				}
				else
				{
					CString strZ;
					for(int j=zPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strZ.AppendChar(strLine[j]);
						}
						else
							break;
					}
					zEnd_relative = atof(strZ);
				}

				// i坐标.
				int iPos = strLine.Find('I');
				if(iPos == -1)
				{
					iStart_relative = 0;
				}
				else
				{
					CString strI;
					for(int j=iPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strI.AppendChar(strLine[j]);
						}
						else
							break;
					}
					iStart_relative = atof(strI);
				}

				// j坐标.
				int jPos = strLine.Find('J');
				if(jPos == -1)
				{
					jStart_relative = 0;
				}
				else
				{
					CString strJ;
					for(int j=jPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strJ.AppendChar(strLine[j]);
						}
						else
							break;
					}
					jStart_relative = atof(strJ);
				}
				
				// k坐标.
				int kPos = strLine.Find('K');
				if(kPos == -1)
				{
					kStart_relative = 0;
				}
				else
				{
					CString strK;
					for(int j=kPos+1;j<strLine.GetLength();j++)
					{
						if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
						{
							strK.AppendChar(strLine[j]);
						}
						else
							break;
					}
					kStart_relative = atof(strK);
				}
//				char a[200];
//				sprintf(a,"%f,%f,%f,%f,%f,%f",xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative);
//				AfxMessageBox(_T(a));
				AnticlockwiseArcInterpolation(xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative,m_ArrayForwardDirection_CodeLineInterpolation);

				return true;
			}

			// 下列指令是控制状态的指令.
			// 如果判断是G17(XY平面选择).
			if(strLine[i+1]=='1'&&strLine[i+2]=='7')
			{}
			// 如果判断是G18(ZX平面选择).
			if(strLine[i+1]=='1'&&strLine[i+2]=='8')
			{
				m_strFuncGroup[3]=_T("G18");
			}
			// 如果判断是G19(YZ平面选择).
			if(strLine[i+1]=='1'&&strLine[i+2]=='9')
			{
				m_strFuncGroup[3]=_T("G19");
			}
			// 如果判断是G40(刀具补偿/刀具偏置注销).
			if(strLine[i+1]=='4'&&strLine[i+2]=='0')
			{}
			// 如果判断是G41(刀具补偿-左).
			if(strLine[i+1]=='4'&&strLine[i+2]=='1')
			{}
			// 如果判断是G42(刀具补偿-右).
			if(strLine[i+1]=='4'&&strLine[i+2]=='2')
			{}
			// 如果判断是G90(绝对尺寸).
			if(strLine[i+1]=='9'&&strLine[i+2]=='0')
			{}
			// 如果判断是G91(增量尺寸).
			if(strLine[i+1]=='9'&&strLine[i+2]=='1')
			{}
			// 如果判断是G92(预置寄存).
			if(strLine[i+1]=='9'&&strLine[i+2]=='2')
			{}

			m_xBefore_absolute = m_xAfter_absolute;
			m_yBefore_absolute = m_yAfter_absolute;
			m_zBefore_absolute = m_zAfter_absolute;
		}
		if(strLine[i]=='M')
		{}
		if(strLine[i]=='T')
		{}	
	}
	return 0;
}

// 直线插补计算.
bool CNCCodeParse::LineInterpolation(double xEnd_relative, double yEnd_relative, double zEnd_relative, CArray<CString,CString> &m_ArrayForwardDirection_CodeLineInterpolation)
{
	int JP1,JP2;		//JP1为XY平面的误差,JP2为XZ平面的偏差.
	int JE;			//JE为插补总步数.
	int x_iStep,y_iStep,z_iStep;	//动点的坐标(步数坐标).
	int xe,ye,ze;		//各坐标的终点总步数.
	double x_fStep,y_fStep,z_fStep;		//动点的实数坐标.

	JP1=0,JP2=0;
	xe=xEnd_relative/m_fScale,ye=yEnd_relative/m_fScale,ze=zEnd_relative/m_fScale;
	JE = abs(xe) + abs(ye) + abs(ze);
	x_iStep=0,y_iStep=0,z_iStep=0;
	x_fStep=0,y_fStep=0,z_fStep=0;

	if(xe==0 && ye==0 && ze==0)
	{
		return 0;
	}

	bool bHaveInterpolation = false;

	// 当x轴为长轴时.
	if(abs(xe)>=abs(ye) && abs(xe)>=abs(ze))
	{
		bHaveInterpolation = true;

	begin_x:
		if(JP1>=0)
		{
			if(JP2<0)
			{
				//z轴方向进给.
				if(ze>0)
				{
					z_iStep+=1;
					m_ArrayForwardDirection_CodeLineInterpolation.Add("Z+");
				}
				if(ze<0)
				{
					z_iStep-=1;
					m_ArrayForwardDirection_CodeLineInterpolation.Add("Z-");
				}

				//计算偏差.
				if(ze != 0)
				{
					JE--;
					JP2 += abs(xe);

	//				x_fStep = m_fScale*x_iStep;
	//				y_fStep = m_fScale*y_iStep;
	//				z_fStep = m_fScale*z_iStep;
	//				char a[120];									

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -