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

📄 muldoc.cpp

📁 VC++ 写的PLC上位机编程软件。非常有用!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						Info_Temp.name=-1;					
					if (Info_Temp.code==20 || Info_Temp.code==21)
						Info_Temp.addr=Addr_Array.Add(code);
					else if (addr.GetAt(0)!=';' && addr!="")
							Info_Temp.addr=Addr_Array.Add(addr);
						else 
							Info_Temp.addr=-1;

					Code_Array.Add(Info_Temp);
				}
				if (errFlag)
				{
					errmsg.Format("第%d行语句错误!\r\n",count);
					errMessage+=errmsg;
					result=1;
				}
			}
			code="";
			addr="";
			name="";
			count++;
		}
		fclose( stream ); 
		if (!(lcount==0 && bcount==0) && lcount!=bcount+1)
		{
			result=1;
			errmsg.Format("程序中LD,ANB不匹配!");
			errMessage+=errmsg;
		}
	}
	if (result==0)
		result=CodeToSeat();
	return result;
}

int CMULDoc::Compile(CString &errMessage)
{
	int errflag;
	int HORcount;
	int next;
	int row;
	int col;
	int insertflag;
	CString str;
	IOPOINT *point;
	IOPOINT *temp;
	CPoint point_seat;
	CPoint curbegin;
	CPoint curend;
	CPoint prebegin;
	CPoint preend;
	POINTINFO code_info;
	CString errmsg;
	errflag=0;
	errflag=preCompile(errMessage);
	if (errflag)
		return errflag;

	CPoint cpoint=GetRowCol();
	if (cpoint.x>::MaxRows || cpoint.y>::MaxCols)
	{
		errflag=1;
		errmsg.Format("程序太大,页面画不下!\r\n\r\n页面最大可画100行梯形图,\r\n每行16个元器件!\r\n\r\n请将程序分解后再编译!");
		errMessage+=errmsg;
		return errflag;
	}
	Rows=cpoint.x;
	Cols=cpoint.y;
	m_mPlc.newfile();
	m_mPlc.SetRowCol(Rows,Cols);
	for (int i=0;i<m_nCodecount;i++)
	{
		insertflag=1;
		code_info=Code_Array.GetAt(i);
		point_seat=seat.GetAt(i);
		row=point_seat.x;
		col=point_seat.y;
		switch(code_info.code)
		{
		case 1:
			point=new LD;
			point->setcode("LD");
			point->setflag(1);
			point->setwhere(row,col);
			break;
		case 2:
			point=new LDI;
			point->setcode("LDI");
			point->setflag(2);
			point->setwhere(row,col);
			break;
		case 3:
		case 4:
			next=FindPort(i-1,curbegin,curend);
			if (curend.y>curbegin.y)
			{
				HORcount=curend.y-curbegin.y;
				AddHOR(row,col+1,HORcount);
				if (col>0)
					AddERECT(row,col-1);
				AddERECT(row,curend.y);
				if (code_info.code==3)
				{
					point=new LD;
					point->setcode("LD");
					point->setflag(1);
				}
				else
				{
					point=new LDI;
					point->setcode("LDI");
					point->setflag(2);
				}
				point->setwhere(row,col);
			}
			else
			{
				point=new OR;
				point->setcode("OR");
				point->setflag(3);
				point->setwhere(row,col);
				if (col>0)
				{
					temp=new ERECT;
					temp->setfiveflag(5);
					temp->setcode("ERECT");
					temp->setwhere(row,col-1);
					m_mPlc.insert_point(temp);
				}
				if (col<Cols)
				{
					temp=new ERECT;
					temp->setfiveflag(5);
					temp->setcode("ERECT");
					temp->setwhere(row,col);
					m_mPlc.insert_point(temp);
				}
			}
			break;
		case 5:
			point=new LD;
			point->setcode("LD");
			point->setflag(1);
			point->setwhere(row,col);
			//MakeUpHOR(row,col-1);
			break;
		case 6:
			point=new LDI;
			point->setcode("LDI");
			point->setflag(2);
			point->setwhere(row,col);
			//MakeUpHOR(row,col-1);
			break;
		case 8:
			insertflag=0;
			next=FindPort(i-1,curbegin,curend);
			next=FindPort(next-1,prebegin,preend);
			curend.x=curbegin.x;
			preend.x=prebegin.x;
			if (preend.y>curend.y)
			{
				HORcount=preend.y-curend.y;
				AddHOR(curend.x,curend.y+1,HORcount);
				curend.y=preend.y;
			}
			else if (curend.y>preend.y)
			{
				HORcount=curend.y-preend.y;
				AddHOR(preend.x,preend.y+1,HORcount);
			}
			if (curbegin.y>0)
				AddERECT(curbegin.x,curbegin.y-1);
			AddERECT(curend.x,curend.y);
			break;
		case 9:
		case 10:
		case 11:
		case 12:
		case 13:
		case 14:
		case 15:
		case 16:
		case 17:
		case 18:
		case 19:
		case 20:
		case 21:
			if (i<(m_nCodecount-1) && Code_Array.GetAt(i+1).code>0)
			{
				temp=new ERECT;
				temp->setcode("ERECT");
				temp->setfiveflag(5);
				temp->setwhere(row+1,col-1);
				m_mPlc.insert_point(temp);
			}
			while (col<Cols-1)
			{
				temp=new HOR;
				temp->setcode("HOR");
				temp->setflag(6);
				temp->setwhere(row,col);
				m_mPlc.insert_point(temp);
				col++;
			}
			if (code_info.code==9)
			{
				point=new OUTPOINT;
				point->setcode("OUT");
				point->setflag(7);
			}
			else
			{
				point=new ADDTION;
				switch(code_info.code)
				{
				case 10:
					point->setcode("SET");
					point->setflag(8);
					break;
				case 11:
					point->setcode("RST");
					point->setflag(18);
					break;
				case 12:
					point->setcode("S");
					point->setflag(9);
					break;
				case 13:
					point->setcode("R");
					point->setflag(19);
					break;
				case 14:
					point->setcode("MC");
					point->setflag(10);
					break;
				case 15:
					point->setcode("MCR");
					point->setflag(11);
					break;
				case 18:
					point->setcode("PLS");
					point->setflag(14);
					break;
				case 19:
					point->setcode("END");
					point->setflag(15);
					break;
				case 20:
					point->setflag(12);
					break;
				case 21:
					point->setflag(13);
					break;
				default:
					break;
				}
			}
			point->setwhere(row,col);
			break;
		default:
			insertflag=0;
		}
		if (insertflag)
		{
			if (code_info.addr>=0)
			{
				str=Addr_Array.GetAt(code_info.addr);
				point->setaddr(str);
				if (point->testaddr())
				{
					errflag=1;
					point->setaddr("");
					errmsg.Format("第 %d 行语句的地址不对!\r\n",i+1);
					errMessage+=errmsg;
				}
				else if (point->getflag()==12 || point->getflag()==13)
				{
					point->setcode(str);
					point->setaddr("");
				}
			}
			if (code_info.name>=0)
			{
				str=Name_Array.GetAt(code_info.name);
				point->setname(str);
			}
			m_mPlc.insert_point(point);
		}
	}
	return errflag;
}

void CMULDoc::MakeUpHOR(int row, int col)
{
	int count;
	IOPOINT *point;
	count=0;
	while(col>0)
	{
		point=m_mPlc.getpoint(row,col);
		if (point==NULL || point->getflag()==0)
			count++;
		else
			break;
		col--;
	}
	AddHOR(row,col,count);
}

void CMULDoc::OnCompileInstr() 
{
	// TODO: Add your command handler code here
	CFile LadFile;
	int errflag;
	CString pathname=this->GetPathName();
	if (pathname=="")
	{
		AfxMessageBox("请先保存文件,再进行编译!");
		return ;
	}
	this->OnSaveDocument(pathname);
	CString fname=pathname+this->GetTitle();
	int i=fname.Find('.');
	if (i!=-1)
		fname=fname.Mid(0,i);
	fname+=".lad";
	if (!LadFile.Open(fname,CFile::modeCreate|CFile::modeWrite))
		AfxMessageBox("Unable to open file");
	else
	{
		CArchive LadArchive(&LadFile,CArchive::store);
		CString compilemsg;
		try{
			if ((errflag=Compile(compilemsg))==0)
				compilemsg.Format("编译成功!");
			if (err_dlg)
			{
				err_dlg->Refresh(compilemsg);
				err_dlg->ShowWindow(SW_RESTORE);
			}
			else
			{
				err_dlg=new CSyntax(compilemsg,AfxGetMainWnd());
				err_dlg->CenterWindow();
				err_dlg->ShowWindow(SW_SHOW);
			}
			
			err_dlg->UpdateData(FALSE);
		}
		catch(...)
		{
			POSITION pos=this->GetFirstViewPosition();
			CView * pView=this->GetNextView(pos);
			pView->MessageBox("PLC程序编写错误!\n可能有逻辑错误!","编译出错",MB_ICONERROR|MB_OK);
		}

		if (!errflag)
		{
			CIO *point;
			IOPOINT *temp;
			CObArray m_pointArray;

			try{
				if (m_pointArray.GetSize()>0)
				{
					int total=m_pointArray.GetSize();
					for (int j=0;j<total;j++)
						delete m_pointArray.GetAt(j);
					m_pointArray.RemoveAll();
				}
				point=new CIO;
				point->name="";
				point->addr="";
				point->code="";
				point->Rows=Rows;
				point->Cols=Cols;
				point->flag=0;
				point->fiveflag=0;
				point->xpoint=0;
				point->ypoint=0;
				m_pointArray.Add(point);
				for (int i=0;i<Rows;i++)
					for(int j=0;j<Cols;j++)
					{
						if (m_mPlc.testpoint(i,j))
						{
							CString str;
							point=new CIO;
							temp=m_mPlc.getpoint(i,j);
							temp->getname(&str);
							point->name=str;
							temp->getaddr(&str);
							point->addr=str;
							temp->getcode(&str);
							point->code=str;
							point->Rows=Rows;
							point->Cols=Cols;
							point->flag=temp->getflag();
							point->fiveflag=temp->getfiveflag();
							point->xpoint=temp->getxpoint();
							point->ypoint=temp->getypoint();
							m_pointArray.Add(point);
						}
					}
				m_pointArray.Serialize(LadArchive);
				LadArchive.Flush();
				LadArchive.Close();
			}
			catch(...)
			{
				POSITION pos=this->GetFirstViewPosition();
				CView * pView=this->GetNextView(pos);
				pView->MessageBox("LAD文件建立错误!","编译出错",MB_ICONERROR|MB_OK);
			}
		}
	}
}




⌨️ 快捷键说明

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