📄 iopoint.cpp
字号:
{
temp=ANBtest(p);
if (temp!=NULL)
{
NoAnb=FALSE;
returnpoint=ANBcompile(p,temp);
if (i>0)
fprintf(::fp,"%s\n","ANB");
i++;
while (returnpoint->down!=NULL
&& (temp=ORBtest(returnpoint,&point))!=NULL)
{
returnpoint=ORBcompile(temp);
}
while (p->visit==TRUE)
p=p->right;
flag=p->getflag();
}
else
NoAnb=TRUE;
}
if (NoAnb)
{
switch (flag)
{
case 1:
if (i==0)
fprintf(::fp,"%s\t%s\t\t;%s\n",p->code,p->addr,p->name);
else
fprintf(::fp,"%s\t%s\t\t;%s\n","AND",p->addr,p->name);
i++;
break;
case 2:
if (i==0)
fprintf(::fp,"%s\t%s\t\t;%s\n",p->code,p->addr,p->name);
else
fprintf(::fp,"%s\t%s\t\t;%s\n","ANI",p->addr,p->name);
i++;
break;
default:
break;
}//switch(flag)
p->setvisit(TRUE);
if (p->down!=NULL)
{
temp=ORBtest(p,&point);
if (temp!=NULL)
{
returnpoint=ORBcompile(temp);
// while (returnpoint->down!=NULL
// && (temp=ORBtest(returnpoint,&point))!=NULL)
// {
// returnpoint=ORBcompile(temp);
// }
}
}
while (p->visit==TRUE)
p=p->right;
flag=p->getflag();
}//if (NoAnb)
}//while ((flag<7) && (p->right!=NULL))
if (flag>=7)
{
fprintf(fp,"%s\t%s\t\t;%s\n",p->code,p->addr,p->name);
p->setvisit(TRUE);
}
do
{
if (p->unup!=NULL)
{
temp=p;
while (temp->unup!=NULL)
{
temp=temp->unup;
q=temp;
while (q->getflag()!=0 && q->getflag()<7
&& q->right!=NULL)
q=q->right;
if (q->getflag()>=7)
{
found=TRUE;
break;
}
}
if (found)
{
p=temp;
flag=p->getflag();
break;
}
}// end of if (p->unup!=NULL)
p=p->left;
}while(p!=NULL && p->left!=NULL);
if (!found)
break;
else
found=FALSE;
}//end of While(1)
fprintf(fp,"\n;***\n\n");
fclose(fp);
return 0;
}
PLC::PLC()
{
newfile();
Rows=m_nAreRow;
Cols=m_nAreCol;
}
void PLC::newfile()
{
UINT i,j;
for (i=0;i<m_nAreRow;i++)
for (j=0;j<m_nAreCol;j++)
point_array[i][j]=NULL;
for (i=0;i<20;i++)
list_array[i].root=0;
}
void PLC::getstep()
{
int i,j;
int n;
BOOL flag;
for (i=0,n=0;i<Rows;i++)
{
flag=TRUE;
for (j=0;j<Cols;j++)
if ((point_array[i][j] == NULL)
|| (point_array[i][j]->up!=NULL && j!=0))
{
flag=FALSE;
break;
}
if (flag)
{
list_array[n].root=point_array[i][0];
n++;
}
}
step=n;
}
int PLC::testpoint(int row,int col)
{
if (point_array[row][col]==NULL) return 0;
else return 1;
}
void PLC::insert_point(IOPOINT *n)
{
int i,j;
int flag;
IOPOINT *temp;
i=n->getxpoint();
j=n->getypoint();
if (n->getfiveflag()!=5)
{
if (point_array[i][j]!=NULL)
{
flag=point_array[i][j]->getfiveflag();
if (flag!=5 && flag!=9)
remove_point(i,j);
if (flag==5 || flag==9)
{
temp=point_array[i][j];
n->setfiveflag(flag);
n->left=temp->left;
n->right=temp->right;
n->up=temp->up;
n->down=temp->down;
n->unup=temp->unup;
n->undown=temp->undown;
if (n->up!=NULL)
n->up->unup=n;
if (n->unup!=NULL)
n->unup->up=n;
if (n->down!=NULL)
n->down->undown=n;
if (n->undown!=NULL)
n->undown->down=n;
delete (temp);
}
}
point_array[i][j]=n;
if (j==0)
{
if ((i>0) && (point_array[i-1][j]!=NULL))
{
point_array[i-1][j]->unup=n;
n->up=point_array[i-1][j];
}
if (point_array[i+1][j]!=NULL)
{
point_array[i+1][j]->up=n;
n->unup=point_array[i+1][j];
}
}
if (j<Cols-1)
{
if (point_array[i][j+1] != NULL)
{
n->right=point_array[i][j+1];
point_array[i][j+1]->left=n;
if ((n->right->up !=NULL)
&& (n->right->up->left !=NULL))
{
n->right->up->left->down=n;
n->undown=n->right->up->left;
}
if ((i>0)
&& (point_array[i][j+1]->getfiveflag()==9)
&& (point_array[i-1][j]!=NULL))
{
point_array[i-1][j]->down=n;
n->undown=point_array[i-1][j];
}
}
if ((point_array[i+1][j+1]!=NULL)
&& ((point_array[i+1][j+1]->up != NULL)
|| (point_array[i+1][j+1]->getfiveflag()==9))
&& (point_array[i+1][j+1]->left != NULL))
{
n->down=point_array[i+1][j];
point_array[i+1][j]->undown=n;
}
}
if (j>0)
{
if (point_array[i][j-1] != NULL)
{
n->left=point_array[i][j-1];
point_array[i][j-1]->right=n;
if ((n->left->down != NULL)
&& (n->left->down->right != NULL))
{
point_array[i+1][j]->up=n;
n->unup=point_array[i+1][j];
}
if ((i>0) && ((n->left->getfiveflag()==5)
||(n->left->undown!=NULL))
&& (point_array[i-1][j]!=NULL))
{
n->up=point_array[i-1][j];
point_array[i-1][j]->unup=n;
}
}
if ((point_array[i+1][j-1]!=NULL)
&& ((point_array[i+1][j-1]->undown!=NULL)
||(point_array[i+1][j-1]->getfiveflag()==5))
&& (point_array[i+1][j]!=NULL))
{
n->unup=point_array[i+1][j];
point_array[i+1][j]->up=n;
}
if ((i>0) && (point_array[i-1][j-1]!=NULL)
&& (point_array[i-1][j-1]->down != NULL)
&& (point_array[i-1][j] != NULL))
{
n->up=point_array[i-1][j];
point_array[i-1][j]->unup=n;
}
} //if (j>0)
if (point_array[i+1][j]!=NULL &&
point_array[i+1][j]->getfiveflag()==5)
{
n->down=point_array[i+1][j];
point_array[i+1][j]->undown=n;
}
if (point_array[i+1][j]!=NULL &&
point_array[i+1][j]->getfiveflag()==9)
{
n->unup=point_array[i+1][j];
point_array[i+1][j]->up=n;
}
if (point_array[i+1][j]!=NULL &&
(point_array[i+1][j]->getflag()==3
|| point_array[i+1][j]->getflag()==4))
{
n->down=point_array[i+1][j];
point_array[i+1][j]->undown=n;
point_array[i+1][j]->up=n;
n->unup=point_array[i+1][j];
if ((n->left != NULL) && (point_array[i+1][j]->left != NULL))
{
n->left->down=point_array[i+1][j]->left;
point_array[i+1][j]->left->undown=n->left;
}
if ((n->right != NULL) && (point_array[i+1][j]->right != NULL))
{
point_array[i+1][j]->right->up=n->right;
n->right->unup=point_array[i+1][j]->right;
}
}
/* if ((i>0) && ((n->getflag()==3) || (n->getflag()==4)))
{
if (point_array[i-1][j] != NULL)
{
n->up=point_array[i-1][j];
point_array[i-1][j]->unup=n;
point_array[i-1][j]->down=n;
n->undown=point_array[i-1][j];
if ((point_array[i-1][j]->left != NULL)
&& (n->left != NULL))
{
point_array[i-1][j]->left->down=n->left;
n->left->undown=point_array[i-1][j];
}
if ((n->right != NULL)
&& (point_array[i-1][j]->right != NULL))
{
n->right->up=point_array[i-1][j]->right;
point_array[i-1][j]->right->unup=n->right;
}
} //if (point_array[i-1][j] != NULL)
}//if ((i>0) && ((n->getflag()==3) || (n->getflag()==4)))*/
}//if (n->getflag()!=5)
else
{
if (i>0)
{
if (point_array[i][j]!=NULL)
point_array[i][j]->setfiveflag(5);
else
point_array[i][j]=n;
if (j<Cols-1)
{
if (point_array[i][j+1]!=NULL)
{
if (point_array[i][j+1]->getfiveflag()!=5)
point_array[i][j+1]->setfiveflag(9);
point_array[i][j]->right=point_array[i][j+1];
point_array[i][j+1]->left=point_array[i][j];
}
else
{
temp=new IOPOINT;
temp->setwhere(i,j+1);
temp->setfiveflag(9);
point_array[i][j+1]=temp;
point_array[i][j]->right=point_array[i][j+1];
point_array[i][j+1]->left=point_array[i][j];
}
if ((point_array[i-1][j+1]!=NULL)
&&(point_array[i][j]->right!=NULL))
{
point_array[i-1][j+1]->unup=point_array[i][j]->right;
point_array[i][j]->right->up=point_array[i-1][j+1];
}
}// end of if (j<Maxcol-1)
if (point_array[i-1][j]!=NULL)
{
point_array[i-1][j]->down=point_array[i][j];
point_array[i][j]->undown=point_array[i-1][j];
}
if ((point_array[i+1][j]!=NULL)
&& (point_array[i+1][j]->getfiveflag()==5))
{
point_array[i][j]->down=point_array[i+1][j];
point_array[i+1][j]->undown=point_array[i][j];
if (j<Cols)
{
point_array[i][j+1]->unup=point_array[i+1][j+1];
point_array[i+1][j+1]->up=point_array[i][j+1];
}
}
}//end of if (i>0)
}//end of "if(n->getflag()!=5" else
}
void PLC::remove_point(int x,int y)
{
int i,j;
IOPOINT *temp,*p;
i=x;
j=y;
temp=point_array[i][j];
if (temp==NULL) return;
if (temp->getfiveflag()==9)
{
p=new IOPOINT;
p->setfiveflag(9);
if (temp->up!=NULL)
{
p->up=temp->up;
p->up->unup=p;
}
if (temp->unup!=NULL)
{
p->unup=temp->unup;
p->unup->up=p;
}
if (temp->left!=NULL)
{
p->left=temp->left;
p->left->right=p;
}
point_array[i][j]=p;
} // if (temp->getfiveflag()==9)
else
{
point_array[i][j]=NULL;
if (temp->left != NULL)
temp->left->right=NULL;
if (temp->right != NULL)
temp->right->left=NULL;
if (temp->up!=NULL)
{
temp->up->unup=NULL;
temp->up=NULL;
}
if (temp->down!=NULL)
{
temp->down->undown=NULL;
temp->down=NULL;
}
if (temp->unup!=NULL)
{
temp->unup->up=NULL;
temp->unup=NULL;
}
if (temp->undown!=NULL)
{
temp->undown->down=NULL;
temp->undown=NULL;
}
if (temp->getfiveflag()==5)
{
if (temp->right!=NULL)//j<m_nAreCol-1)
{
if (temp->right->getfiveflag()!=5)
temp->right->setfiveflag(0);
int flag=temp->right->getflag();
if (flag==3 || flag==4)
temp->right->setflag(flag-2);
if (temp->right->up!=NULL)
{
temp->right->up->unup=NULL;
temp->right->up=NULL;
}
if (temp->right->getflag()==0
&& temp->right->getfiveflag()!=5)
{
p=temp->right;
if (p->unup!=NULL)
{
p->unup->up=NULL;
p->unup=NULL;
}
if (p->down!=NULL)
{
p->down->undown=NULL;
p->down=NULL;
}
if (p->undown!=NULL)
{
p->undown->down=NULL;
p->undown=NULL;
}
delete p;
point_array[i][j+1]=NULL;
} //if (temp->right->getflag()==0)
} // if (temp->right!=NULL)
if (temp->left!=NULL && temp->left->getfiveflag()==5)
{
IOPOINT * renew;
renew=new IOPOINT;
renew->setfiveflag(9);
renew->setwhere(i,j);
insert_point(renew);
}
}//if (temp->getfiveflag()==5)
}//if (temp->getfiveflag()==9) else
delete temp;
}
int PLC::syntax(CString &m_strlist)
{
IOPOINT *p;
int outflag,topflag,result,flag;
int i,j;
CString str;
result=0;
// m_list.ResetContent();
for (i=0;i<step;i++)
{
outflag=0;
topflag=0;
p=list_array[i].root;
for (j=0;j<Cols;j++)
{
flag=p->getflag();
if (flag>=7)
{
outflag++;
p=p->right;
continue;
}
if (flag!=6 && outflag)
outflag++;
if (flag==3 || flag==4 || p->getfiveflag()==5)
topflag++;
p=p->right;
}
if (outflag!=1)
{
result=1;
str.Format("第 %d 程序段输出语句错误!\r\n",i+1);
m_strlist+=str;
}
if (topflag)
{
result=1;
str.Format("第 %d 程序段首行含有 %d 个OR、ORI或ERECT结点!\r\n",i+1,topflag);
m_strlist+=str;
}
}
CString addr;
int fiveflag;
for (i=0;i<100;i++)
for (j=0;j<Cols;j++)
if (point_array[i][j]!=NULL)
{
flag=point_array[i][j]->getflag();
fiveflag=point_array[i][j]->getfiveflag();
point_array[i][j]->getaddr(&addr);
if ((point_array[i][j]->left==NULL)
&& (point_array[i][j]->up==NULL)
&& (point_array[i][j]->down==NULL)
&& (point_array[i][j]->right==NULL))
{
result=1;
str.Format("第 %d 行,第 %d 列是孤立结点!\r\n",i+1,j+1);
m_strlist+=str;
}
if ((flag==0 && fiveflag!=5 && fiveflag!=9)
|| flag==100)
{
result=1;
str.Format("第 %d 行,第 %d 列结点类型错误!\r\n",i+1,j+1);
m_strlist+=str;
}
if (addr.GetLength()==0 && flag!=0 && flag!=6
&& flag!=12 && flag!=13 && flag!=15)
{
result=1;
str.Format("第 %d 行,第 %d 列结点没进行元器件设置!\r\n",i+1,j+1);
m_strlist+=str;
}
point_array[i][j]->getcode(&addr);
if ((flag==12 || flag==13) && addr.GetLength()!=4)
{
result=1;
str.Format("第 %d 行,第 %d 列结点F、K命令错误!\r\n",i+1,j+1);
m_strlist+=str;
}
}
return result;
}
int PLC::compiled(CString &m_strlist)
{
int i,j;
int flag;
CString str;
getstep();
flag=syntax(m_strlist);
if (flag)
return flag;
if ((fp=fopen(::filename,"w+"))==NULL)
{
str.Format("文件%s不能建立!\r\n",::filename);
m_strlist+=str;
return 1;
}
fclose(fp);
for (i=0;i<Rows;i++)
for (j=0;j<Cols;j++)
if (point_array[i][j]!=NULL)
point_array[i][j]->setvisit(FALSE);
for (i=0;i<step;i++)
{
flag=list_array[i].compile(list_array[i].root);
if (flag)
{
str.Format("编译错误!\r\n");
m_strlist+=str;
return flag;
}
}
int sum=0;
for (i=0;i<Rows;i++)
for (j=0;j<Cols;j++)
{
if (point_array[i][j]!=NULL)
{
flag=point_array[i][j]->getflag();
if (point_array[i][j]->visit==FALSE
&& flag!=0 && flag!=6)
{
str.Format("第 %d 行,第 %d 列结点没有编译!\r\n",i+1,j+1);
m_strlist+=str;
sum++;
if (sum==10)
return 1;
}
}
}
return sum;
}
void PLC::SetRowCol(int row, int col)
{
Rows=row;
Cols=col;
}
int PLC::getrows()
{
return Rows;
}
int PLC::getcols()
{
return Cols;
}
void CIO::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
{
ar<<name;
ar<<addr;
ar<<code;
ar<<Rows;
ar<<Cols;
ar<<flag;
ar<<fiveflag;
ar<<xpoint;
ar<<ypoint;
}
else
{
ar>>name;
ar>>addr;
ar>>code;
ar>>Rows;
ar>>Cols;
ar>>flag;
ar>>fiveflag;
ar>>xpoint;
ar>>ypoint;
}
}
IOPOINT * PLC::getpoint(int row, int col)
{
return (point_array[row][col]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -