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

📄 instruction_define.cpp

📁 开发虚拟的被控对象及虚拟的PLC,模似PLC的工作过程进行实验。用户可根据具体的实验,确定其输入和输出的控制条件,用虚拟的连线和虚拟的PLC连接,用户利用梯形图的编程方式编写PLC程序控制被控对象的动
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//指令定义模块
#include "StdAfx.h"
#include "PLC_DEMO.h"
#include "PLC_DEMODoc.h"
#include "PLC_DEMOView.h"
#include "Instruction_define.h"
#include "Runprogram.h"
#include "Phrase_check.h"

bool WX[160];//字输入寄存器
bool WY[160];//字输出寄存器
bool WR[1000];//通用字寄存器(内部寄存器)
bool T[9];//定时器

bool stack[10];//栈
int sp;//栈顶
bool DT[100];//通用数据寄存器
bool objectregister[3];//中间寄存器,存放中间结果
int objectsign;//中间寄存器指向标志
extern int instructionnumber;//指令数
extern int isrunsign;//正执行的指令
extern bool isend;//指令结束标志
extern instructionframe instructionstore[300];//指令存储器
extern CString str;
bool parforDF[300];//for DF and DF/ 指令存储前一触发信号状态

extern CPLC_DEMOView *fortime;
bool *firstaddress,*aimaddress;
int tran16arraytoconst(bool *);
void getfirst16address();

void produceaddress()   //计算下一指令地址
{
  if(instructionstore[isrunsign].instructionname==21)
  {
	  if(!objectregister[objectsign])
	  {
		  for(int i=isrunsign+1;i<instructionnumber;i++)
		  {
			  if((instructionstore[i].instructionname==22)
				  &&(instructionstore[i].thenumber==
				  instructionstore[isrunsign].thenumber))
			  {
				  isrunsign=i;
				  break;
			  }
			  
		  }
		  if(i==instructionnumber)
		  {
			  str.Format("逻辑错误:没有和 MCE 指令对应的指令");
			  AfxMessageBox(str);
		  }
		  else isrunsign=i+1;
	  }
	  else isrunsign+=1;
  }
  else if(instructionstore[isrunsign].instructionname==23)
  {
	  if(!objectregister[objectsign])
	  {
		  for(int i=0;i<instructionnumber;i++)
		  {
			  if((instructionstore[i].instructionname==24)
				  &&(instructionstore[i].thenumber==
				  instructionstore[isrunsign].thenumber))
			  {
				  isrunsign=i;		  
				  break;
			  }
		  }
		  if(i==instructionnumber)
		  {
			  str.Format("逻辑错误:没有和 JP 指令对应的指令");
			  AfxMessageBox(str);
		  }
		  else isrunsign=i+1;
	  }
	  else isrunsign+=1;
  }
  else if(instructionstore[isrunsign].instructionname==113)
  {
	  getfirst16address();
	  int sum=tran16arraytoconst(firstaddress);
	  if(sum<=0)
		  isrunsign+=1;
	  else
		  for(int i=0;i<instructionnumber;i++)
		  {
			  if((instructionstore[i].instructionname==22)
				  &&(instructionstore[i].thenumber==
				  instructionstore[isrunsign].thenumber))
			  {
				  isrunsign=i;
				  break;
			  }		  
		  }
  }
  else if(instructionstore[isrunsign].instructionname==114)
  {
	  if(!objectregister[objectsign])
		  isrunsign+=1;
	  else
	  {
		  for(int i=0;i<instructionnumber;i++)
		  {
			  if((instructionstore[i].instructionname==115)
				  &&(instructionstore[i].thenumber==
				  instructionstore[isrunsign].thenumber))
			  {
				  isrunsign=i;
				  break;
			  }		  
		  }
	  }
  }
  else if(instructionstore[isrunsign].instructionname==116)
  {
	  for(int i=0;i<instructionnumber;i++)
		  {
			  if((instructionstore[i].instructionname==114)
				  &&(instructionstore[i].thenumber==
				  instructionstore[isrunsign].thenumber))
			  {
				  isrunsign=i+1;
				  break;
			  }		  
		  }
  }
  else isrunsign+=1;
}

void instruction1()        //ST指令
{   
	if(objectsign==2)
		objectsign=0;
	else objectsign+=1;
	switch(instructionstore[isrunsign].relaysort)
	{
	case 'X':objectregister[objectsign]=WX[instructionstore[isrunsign].relaynumber];break;
	case 'Y':objectregister[objectsign]=WY[instructionstore[isrunsign].relaynumber];break;
   	case 'R':
		{
			if(instructionstore[isrunsign].relaynumber==600)
				 WR[instructionstore[isrunsign].relaynumber]
				=(WR[instructionstore[isrunsign].relaynumber]?false:true);			
				objectregister[objectsign]=WR[instructionstore[isrunsign].relaynumber];
				break;
		}
    case 'T':objectregister[objectsign]=T[instructionstore[isrunsign].relaynumber];break;
	}
}
void instruction3() //OT指令
{
	switch(instructionstore[isrunsign].relaysort)
	{
	case 'Y':WY[instructionstore[isrunsign].relaynumber]=
				 objectregister[objectsign];break;
   	case 'R':WR[instructionstore[isrunsign].relaynumber]=
				 objectregister[objectsign];break;
	}
}
void instruction4()  ///指令
{
	objectregister[objectsign]=!objectregister[objectsign];	
}
void instruction5()   //AN指令
{
	switch(instructionstore[isrunsign].relaysort)
	{
	case 'X':objectregister[objectsign]=
		(objectregister[objectsign])&&(WX[instructionstore[isrunsign].relaynumber]);
		break;
    case 'Y':objectregister[objectsign]=
		(objectregister[objectsign])&&(WY[instructionstore[isrunsign].relaynumber]);
		break;
    case 'R':objectregister[objectsign]=
		(objectregister[objectsign])&&(WR[instructionstore[isrunsign].relaynumber]);
		break;
	case 'T':objectregister[objectsign]=
		(objectregister[objectsign])&&(T[instructionstore[isrunsign].relaynumber]);
		break;
	}
}	
void instruction6()    //AN/指令
{
	switch(instructionstore[isrunsign].relaysort)
	{
	case 'X':objectregister[objectsign]=
		(objectregister[objectsign])&&(!WX[instructionstore[isrunsign].relaynumber]);
		break;
    case 'Y':objectregister[objectsign]=
		(objectregister[objectsign])&&(!WY[instructionstore[isrunsign].relaynumber]);
		break;
    case 'R':objectregister[objectsign]=
		(objectregister[objectsign])&&(!WR[instructionstore[isrunsign].relaynumber]);
		break;
	case 'T':objectregister[objectsign]=
		(objectregister[objectsign])&&(!T[instructionstore[isrunsign].relaynumber]);
		break;
	}
}	
void instruction7() //OR指令
{
	switch(instructionstore[isrunsign].relaysort)
	{
	case 'X':objectregister[objectsign]=
		(objectregister[objectsign])||(WX[instructionstore[isrunsign].relaynumber]);
		break;
    case 'Y':objectregister[objectsign]=
		(objectregister[objectsign])||(WY[instructionstore[isrunsign].relaynumber]);
		break;
    case 'R':
		if(instructionstore[isrunsign].relaynumber==600)
				 WR[instructionstore[isrunsign].relaynumber]
				=(WR[instructionstore[isrunsign].relaynumber]?false:true);		
		objectregister[objectsign]=
		(objectregister[objectsign])||(WR[instructionstore[isrunsign].relaynumber]);
		break;
	case 'T':objectregister[objectsign]=
		(objectregister[objectsign])||(T[instructionstore[isrunsign].relaynumber]);
		break;
	}
}
void instruction8()   //OR/指令
{
	switch(instructionstore[isrunsign].relaysort)
	{
	case 'X':objectregister[objectsign]=
		(objectregister[objectsign])||(!WX[instructionstore[isrunsign].relaynumber]);
		break;
    case 'Y':objectregister[objectsign]=
		(objectregister[objectsign])||(!WY[instructionstore[isrunsign].relaynumber]);
		break;
    case 'R':objectregister[objectsign]=
		(objectregister[objectsign])||(!WR[instructionstore[isrunsign].relaynumber]);
		break;
	case 'T':objectregister[objectsign]=
		(objectregister[objectsign])||(!T[instructionstore[isrunsign].relaynumber]);
		break;
	}
}
void instruction9()  //ANS指令
{
	if(objectsign==0)
	{		
		objectregister[2]=((objectregister[0])&&(objectregister[2])); 
		objectsign=2;
	}
	else
	{
		objectregister[objectsign-1]=((objectregister[objectsign-1])&&(objectregister[objectsign])); 
		objectsign-=1;
	}
}
void instruction10()  //ORS指令
{
	if(objectsign==0)
	{		
		objectregister[2]=((objectregister[0])||(objectregister[2])); 
		objectsign=2;
	}
	else
	{
		objectregister[objectsign-1]=((objectregister[objectsign-1])||(objectregister[objectsign])); 
		objectsign-=1;
	}
}
void instruction11()  //PSHS指令
{
     stack[sp]=objectregister[objectsign];
	 sp+=1;   
}
void instruction12()  //RDS指令
{
     objectregister[objectsign]=stack[sp-1];
}
void instruction13()  //POPS指令
{
	objectregister[objectsign]=stack[sp-1];
    sp-=1;  
}
void instruction14()  //DF指令
{
	if ((parforDF[isrunsign]==false)&&(objectregister[objectsign]
		==true))
	{
		objectregister[objectsign]=true;
		parforDF[isrunsign]=true;
	}
	else 
	{
		parforDF[isrunsign]=objectregister[objectsign];
		objectregister[objectsign]=false;
	}
}
void instruction15()  //DF/指令
{
	if ((parforDF[isrunsign]==true)&&(objectregister[objectsign]
		==false))
	{
		objectregister[objectsign]=true;
		parforDF[isrunsign]=false;
	}
	else
	{ 
        parforDF[isrunsign]=objectregister[objectsign];
		objectregister[objectsign]=false;
	}
}
void instruction16()  //SET指令
{
    if (objectregister[objectsign])
	{
		switch (instructionstore[isrunsign].relaysort)
		{
		case 'Y':WY[instructionstore[isrunsign].relaynumber]=true;break;
        case 'R':WR[instructionstore[isrunsign].relaynumber]=true;break;
		}
	}
}
void instruction17()  //RET指令
{
    if (!objectregister[objectsign])
	{
		switch (instructionstore[isrunsign].relaysort)
		{
		case 'Y':WY[instructionstore[isrunsign].relaynumber]=false;break;
        case 'R':WR[instructionstore[isrunsign].relaynumber]=false;break;
		}
	}
}
void instruction19()  //KP指令
{
	if (objectregister[objectsign])
	{
		switch (instructionstore[isrunsign].relaysort)
		{
		case 'Y':WY[instructionstore[isrunsign].relaynumber]=false;break;
        case 'R':WR[instructionstore[isrunsign].relaynumber]=false;break;
		}
	}
	else
	{
		int os;
		if(objectsign==0)
			os=2;
		else os=objectsign-1;
		if (objectregister[os])
		{
		  switch (instructionstore[isrunsign].relaysort)
		{
		case 'Y':WY[instructionstore[isrunsign].relaynumber]=true;break;
        case 'R':WR[instructionstore[isrunsign].relaynumber]=true;break;
		}	
		}
	}
}
void instruction20()  //TMX指令
{
	if(!objectregister[objectsign])
	{
		fortime->KillTimer(instructionstore[isrunsign].relaynumber);
        T[instructionstore[isrunsign].relaynumber]=false;	
	}
	bool object=objectregister[objectsign];
	instruction14();
	if (objectregister[objectsign])
	{
		fortime->SetTimer(instructionstore[isrunsign].relaynumber,
		100*instructionstore[isrunsign].thenumber,NULL);
	}
	objectregister[objectsign]=object;
}
void instruction25()  //ED指令
{
  isend=true;
}

int tran16arraytoconst(bool *a)
{
	int sum=0;
	for(int i=15;i>=0;i--)
	{
		if (*(a+i)==true)
			sum=2*sum+1;
		else sum=2*sum;
	}
	return(sum);
}
int tran32arraytoconst(bool *a)
{
	long sum=0;
	for(int i=31;i>=0;i--)
	{
		if (*(a+i)==true)
			sum=2*sum+1;
		else sum=2*sum;
	}
	return(sum);
}
int getconst1()
{
	int sum;
	switch(instructionstore[isrunsign].register1)
	{
	case '1':sum=
		tran16arraytoconst(&WX
		[(instructionstore[isrunsign].register1number)*16]);
		break;
	case '2':sum=
		tran16arraytoconst(&WY
		[(instructionstore[isrunsign].register1number)*16]);
		break;
	case '3':sum=
		tran16arraytoconst(&WR
		[(instructionstore[isrunsign].register1number)*16]);
		break;
    case '4':sum=
		tran16arraytoconst(&DT
		[(instructionstore[isrunsign].register1number)*16]);
		break;
    case '5':sum=instructionstore[isrunsign].register1number;
		break;	
	}
	return(sum);
}
int getconst2()
{
	int sum;
	switch(instructionstore[isrunsign].register2)
	{
	case '1':sum=
		tran16arraytoconst(&WX
		[(instructionstore[isrunsign].register2number)*16]);
		break;
	case '2':sum=
		tran16arraytoconst(&WY
		[(instructionstore[isrunsign].register2number)*16]);
		break;
	case '3':sum=
		tran16arraytoconst(&WR
		[(instructionstore[isrunsign].register2number)*16]);
		break;
    case '4':sum=
		tran16arraytoconst(&DT
		[(instructionstore[isrunsign].register2number)*16]);
		break;
    case '5':sum=instructionstore[isrunsign].register2number;
		break;
	}
	return(sum);
}
int getconst3()
{
	long sum;
	switch(instructionstore[isrunsign].register1)
	{
	case '1':sum=
		tran32arraytoconst(&WX
		[(instructionstore[isrunsign].register1number)*16]);
		break;
	case '2':sum=
		tran32arraytoconst(&WY
		[(instructionstore[isrunsign].register1number)*16]);
		break;
	case '3':sum=
		tran32arraytoconst(&WR
		[(instructionstore[isrunsign].register1number)*16]);
		break;
    case '4':sum=
		tran32arraytoconst(&DT
		[(instructionstore[isrunsign].register1number)*16]);
		break;
    case '5':sum=instructionstore[isrunsign].register1number;
		break;	
	}
	return(sum);
}
 
int getconst4()
{
	long sum;
	switch(instructionstore[isrunsign].register2)
	{
	case '1':sum=
		tran32arraytoconst(&WX
		[(instructionstore[isrunsign].register2number)*16]);
		break;
	case '2':sum=
		tran32arraytoconst(&WY
		[(instructionstore[isrunsign].register2number)*16]);
		break;
	case '3':sum=
		tran32arraytoconst(&WR
		[(instructionstore[isrunsign].register2number)*16]);
		break;
    case '4':sum=
		tran32arraytoconst(&DT
		[(instructionstore[isrunsign].register2number)*16]);
		break;
    case '5':sum=instructionstore[isrunsign].register2number;
		break;
	}
	return(sum);
}
void instruction26()
{
	int sum1,sum2;
	if(objectregister[objectsign])
	{
	sum1=getconst1();
	sum2=getconst2();
	if(sum1==sum2)
		objectregister[objectsign==2?0:objectsign+=1]=true;
	else objectregister[objectsign==2?0:objectsign+=1]=false;
	}
	objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction27()
{
	int sum1,sum2;
	if( objectregister[objectsign])
	{
	sum1=getconst1();
	sum2=getconst2();
	if(sum1>sum2)		
		objectregister[objectsign==2?0:objectsign+=1]=true;
	else objectregister[objectsign==2?0:objectsign+=1]=false;
	}
		objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction28()
{
	int sum1,sum2;
	if(objectregister[objectsign])
	{
	sum1=getconst1();
	sum2=getconst2();
	if(sum1<sum2)		
		objectregister[objectsign==2?0:objectsign+=1]=true;
	else objectregister[objectsign==2?0:objectsign+=1]=false;
	}
	objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction29()
{
	int sum1,sum2;
	if(objectregister[objectsign])
	{
	sum1=getconst1();
	sum2=getconst2();
	if(sum1!=sum2)
		objectregister[objectsign==2?0:objectsign+=1]=true;
	else objectregister[objectsign==2?0:objectsign+=1]=false;
	}
	objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction30()
{
	int sum1,sum2;
	if(objectregister[objectsign])
	{
	sum1=getconst1();
	sum2=getconst2();
	if(sum1>=sum2)		
		objectregister[objectsign==2?0:objectsign+=1]=true;
	else objectregister[objectsign==2?0:objectsign+=1]=false;
	}
		objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction31()
{
	int sum1,sum2;
	if(objectregister[objectsign])
	{
	sum1=getconst1();
	sum2=getconst2();
	if(sum1<=sum2)		
		objectregister[objectsign==2?0:objectsign+=1]=true;
	else objectregister[objectsign==2?0:objectsign+=1]=false;
	}
		objectsign=(objectsign==2?0:objectsign+=1);
}
void instruction32()
{
	int sum1,sum2;
	if(objectregister[objectsign==0?2:objectsign-1])
	{
		if(objectregister[objectsign])
		{
			sum1=getconst1();
	        sum2=getconst2();
	        if(sum1==sum2)		
		    objectregister[objectsign]=true;
        	else objectregister[objectsign]=false;
		}
	}
}
void instruction33()
{
	int sum1,sum2;
	if(objectregister[objectsign==0?2:objectsign-1])
	{
		if(objectregister[objectsign])
		{
			sum1=getconst1();
			sum2=getconst2();
			if(sum1>sum2)		
				objectregister[objectsign]=true;
			else objectregister[objectsign]=false;
		}
	}
}
void instruction34()
{
	int sum1,sum2;
	if(objectregister[objectsign==0?2:objectsign-1])
	{
		if(objectregister[objectsign])
		{
			sum1=getconst1();
			sum2=getconst2();
			if(sum1<sum2)		
				objectregister[objectsign]=true;
			else objectregister[objectsign]=false;
		}
	}
}
void instruction35()
{
	int sum1,sum2;
	if(objectregister[objectsign==0?2:objectsign-1])
	{
		if(objectregister[objectsign])
		{
			sum1=getconst1();
			sum2=getconst2();
			if(sum1!=sum2)		
				objectregister[objectsign]=true;

⌨️ 快捷键说明

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