?? muldoc.cpp
字號(hào):
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行語句錯(cuò)誤!\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個(gè)元器件!\r\n\r\n請(qǐng)將程序分解后再編譯!");
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 行語句的地址不對(duì)!\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("請(qǐng)先保存文件,再進(jìn)行編譯!");
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程序編寫錯(cuò)誤!\n可能有邏輯錯(cuò)誤!","編譯出錯(cuò)",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文件建立錯(cuò)誤!","編譯出錯(cuò)",MB_ICONERROR|MB_OK);
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -