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

📄 iopoint.cpp

📁 PLC程序集成开发平台
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{
				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 + -