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

📄 plc_run.c

📁 以前做的一个仿PLC程序
💻 C
📖 第 1 页 / 共 3 页
字号:
;/****************************************Copyright (C)**************************************************
;**                               	Email:luheding@126.com
;**                                 QQ:614090042                                            
;**                          如有意见或不明可联系,但要注明来意.否则不回                                 
;**--------------文件信息--------------------------------------------------------------------------------
;**文   件   名: PLC_RUN.c
;**版        本: V2.1
;**创   建   人: LuHeDing
;**最后修改日期: 2010年05月08日
;**描        述: PLC指令解释程序
;** 
;********************************************************************************************************/

#include "..\Drive\PLC_PUBLIC.H"
/***********************************************
  函数功能:PLC指令运行
***********************************************/
void PLC_PROG_RUN(void)
{ if(PLC_RUN_BIT==3){		
  if(PLC_PC>=PLC_PROG_END_ADD) PLC_PC=PLC_PROG_START_ADD2;		
  PLC_TEMP1=PLC_RAM16(PLC_PC);										
  switch (PLC_TEMP1){
/********************纯字指令************************************************/
	 case 0xFFF8: //ANB
	 	{PLC_ACC_BIT = (PLC_ACC_BIT >> 1) & (PLC_ACC_BIT & 0x01);
		 PLC_PC+=2;}break;
	 case 0xFFF9: //ORB
	 	{PLC_ACC_BIT = (PLC_ACC_BIT >> 1) | (PLC_ACC_BIT & 0x01);
		 PLC_PC+=2;}break;
	 case 0xFFFA: //MPS
	 	{PLC_MPS_BIT = (PLC_MPS_BIT << 1) | (PLC_ACC_BIT & 0x01);
		 PLC_PC+=2;}break;
	 case 0xFFFB: //MRD
	 	{PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (PLC_MPS_BIT & 0x01);
		 PLC_PC+=2;}break;
	 case 0xFFFC: //MPP
	 	{PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (PLC_MPS_BIT & 0x01);
  		 PLC_MPS_BIT >>= 1;
		 PLC_PC+=2;}break;
	 case 0xFFFD: //INV
	 	{PLC_ACC_BIT = (PLC_ACC_BIT & 0xfe) | (~PLC_ACC_BIT & 0x01);
		 PLC_PC+=2;}break;
	 case 0xFFFF: //NOP
	 	{PLC_PC+=2;}break;
/********************升降沿指令************************************************/
	 case 0x01CA:
	 	{PLC_ACC_BIT <<= 1;
  		 if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
		    PLC_ACC_BIT |=0x01;
		 PLC_PC+=4;}break; //LDP
	 case 0x01CB:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF))
			PLC_ACC_BIT |=0x01;
		 PLC_PC+=4;}break; //LDF
	 case 0x01CC:
	 	{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
			PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=4;}break; //ANDP
	 case 0x01CD:
	 	{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF))
			PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=4;}break; //ANDF
	 case 0x01CE:
	 	{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
			PLC_ACC_BIT |=0x01;
		 PLC_PC+=4;}break; //ORP
	 case 0x01CF:
	 	{if(PLC_O2_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF))
			PLC_ACC_BIT |=0x01;
		 PLC_PC+=4;}break; //ORF
	 case 0x0008://PLS Y M
	 	{if(PLC_ACC_BIT&0x01)
		   {if(PLC_PL_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
		      {PLC_PL_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);
			   PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);	 
			  }
			else{PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);}
		   }//END PLC_ACC_BIT
		 else{PLC_PL_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);}
		 PLC_PC+=4;}break; //PLS
	 case 0x0009://PLF Y M
	 	{if(PLC_ACC_BIT&0x01)
		   {if(PLC_PL_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)==0)
		      {PLC_PL_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}
		   }//END PLC_ACC_BIT
		 else
		 	{if(PLC_PL_BIT_TEST(PLC_RAM16(PLC_PC+2)&0x0FFF)) 
			   {PLC_PL_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);	 
			    PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}	 
			 else{PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);} 
			}
		 PLC_PC+=4;}break; //PLF Y M//Y4 09 00 04 85
/********************复位&步进指令************************************************/
	 case 0x0002:
	 	{if(PLC_ACC_BIT&0x01)PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);
		 else PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
		 PLC_PC+=4;}break; //OUT
	 case 0x0003:
	 	{if(PLC_ACC_BIT&0x01)PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);
		 PLC_PC+=4;}break; //SET
	 case 0x0004:
	 	{if(PLC_ACC_BIT&0x01)PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
		 PLC_PC+=4;}break; //RST
	 case 0x0005:
	 	{if(PLC_ACC_BIT&0x01)
		   {if(PLC_STL_CMD==2)PLC_BIT_OFF(PLC_STL_ADD);
		    PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}
		 else PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);	
		 PLC_PC+=4;}break; //OUT 
	 case 0x0006:
	 	{if(PLC_ACC_BIT&0x01)
		   {if(PLC_STL_CMD==2)PLC_BIT_OFF(PLC_STL_ADD);
		    PLC_BIT_ON(PLC_RAM16(PLC_PC+2)&0x0FFF);}
		 PLC_PC+=4;}break; //SET
	 case 0x0007:
	 	{if(PLC_ACC_BIT&0x01)
		   {PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);}
		 PLC_PC+=4;}break; //RST
	 case 0xF7FF: 
	 	{PLC_RUN_BIT=3;//返回正常程序执行
		 PLC_STL_CMD=0;//复位STL标志
		 PLC_PC+=2;}break;//RET 步进返回
	 case 0x000C:
	 	{if(PLC_RAM8(PLC_PC+3)==0x86)//RST T
		   {if(PLC_ACC_BIT&0x01)
		      {PLC_T_RST_ON(PLC_RAM8(PLC_PC+2));
			   PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);
			   PLC_RAM16(PLC_T_START_ADD+(PLC_RAM8(PLC_PC+2)*2))=0;
		       PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
			  }//END PLC_ACC_BIT
			else{if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2))
				   {PLC_T_RST_OFF(PLC_RAM8(PLC_PC+2));
				    PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
				}//END ELSE
			} //END RST T 
		 else //RST C
		   {if(PLC_ACC_BIT&0x01)
		      {PLC_C_RST_ON(PLC_RAM8(PLC_PC+2));
			   PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);
			   if(PLC_RAM8(PLC_PC+2)<200)//RST C0-199
			     {PLC_RAM16(PLC_C16_START_ADD+(PLC_RAM8(PLC_PC+2)*2))=0;
		          PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
				 }//END RST C0-199
			   else		//RST C200-255
			     {PLC_RAM16(PLC_C32_START_ADD+((PLC_RAM8(PLC_PC+2)-200)*4))=0;
				  PLC_RAM16(PLC_C32_START_ADD+((PLC_RAM8(PLC_PC+2)-200)*4)+2)=0;
		          PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);
			   	 }//END RST C200-255
			  }//ENDPLC_ACC_BIT
			else{if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2))
				   {PLC_C_RST_OFF(PLC_RAM8(PLC_PC+2));
				    PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
			    }//END ELSE
		   }//END RST C	 
		 PLC_PC+=4;}break;
	 case 0x000D:
	 	{if(PLC_ACC_BIT&0x01)
		   {if(PLC_RAM8(PLC_PC+5)==0x86)
		      PLC_RAM16(PLC_D_START_ADD+PLC_RAM8(PLC_PC+2)+(PLC_RAM8(PLC_PC+4)*0x100))=0;
			else if(PLC_RAM8(PLC_PC+5)==0x88)
			  PLC_RAM16(PLC_D1000_START_ADD+PLC_RAM8(PLC_PC+2)+(PLC_RAM8(PLC_PC+4)*0x100))=0;
		   	else if(PLC_RAM8(PLC_PC+5)==0x80)
			  PLC_RAM16(PLC_D8000_START_ADD+PLC_RAM8(PLC_PC+2)+(PLC_RAM8(PLC_PC+4)*0x100))=0;
		   	else {PLC_PROG_ERROR(6501);}//操作的数据数型出错
		   }//END PLC_ACC_BIT
		 PLC_PC+=6;}break; 
/********************功能指令************************************************/
/**																		   **/
/********************程序流程************************************************/
	 case 0x0010:
	 	{PLC_PC+=6;
		 if(PLC_ACC_BIT&0x01)
		   {PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
		}break; //CJ
	 case 0x0012:
	    {PLC_PC+=6;
		 PLC_O_PC=PLC_PC;	 //保存PC
		 if(PLC_ACC_BIT&0x01)
		   {PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
		 }break; //CALL
	 case 0x0014:
	 	{PLC_PC=PLC_O_PC; //返回CALL前PC
		 /*PLC_PC+=2;*/}break; //SRET
	 case 0x001C:
	 	{PLC_END_PROG();}break; //FEND
/********************程序流程(P)*********************************************/
	 case 0x1010:
	 	{PLC_PC+=6;
		 if(PLC_ACC_BIT&0x01)
		   {if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2-6)==0) 
		      {PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2-6);	  
			   PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
		   }
		 else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2-6);} 
		}break; //CJP P1//10 10 02 88 00 80
	 case 0x1012:
	    {PLC_PC+=6;
		 PLC_O_PC=PLC_PC;	 //保存PC
		 if(PLC_ACC_BIT&0x01)
		   {if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2-6)==0) 
		      {PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2-6);	  
			   PLC_PC=PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_RAM8(PLC_PC-4)));}
		   }
		 else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2-6);} 
		}break; //CALLP P1//12 10 02 88 00 80
/********************传送比较指令************************************************/
	 case 0x0024://CMP
	 	{if(PLC_ACC_BIT&0x01){
		 PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);
		 PLC_TEMP2=PLC_ByteRead16(PLC_PC+6);
		 PLC_TEMP3=PLC_ProgAddReturn(PLC_PC+10);
		 if(PLC_TEMP1>PLC_TEMP2)
		   {PLC_BIT_ON(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
		 else if(PLC_TEMP1==PLC_TEMP2)
		 	{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_ON(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
		 else{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_ON(PLC_TEMP3+2);}
		 }//END PLC_ACC_BIT&0x01
		 PLC_PC+=14;}break; //CMP
	 case 0x0026://ZCP
	 	{if(PLC_ACC_BIT&0x01){
		 PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);
		 PLC_TEMP2=PLC_ByteRead16(PLC_PC+6);
		 PLC_TEMP3=PLC_ByteRead16(PLC_PC+10);
		 PLC_TEMP4=PLC_ProgAddReturn(PLC_PC+14);
		 if(PLC_TEMP1>PLC_TEMP3)
		   {PLC_BIT_ON(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
		 else if(PLC_TEMP2<PLC_TEMP3)
		 	{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_ON(PLC_TEMP4+2);}
		 else{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_ON(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
		 }//END PLC_ACC_BIT&0x01
		 PLC_PC+=18;}break; //ZCP
	 case 0x0028://MOV
	 	{if(PLC_ACC_BIT&0x01)
	 		{PLC_ByteWrite16(PLC_PC+6,PLC_ByteRead16(PLC_PC+2));}
		 PLC_PC+=10;}break; //MOV
	 case 0x002E://BMOV(M8024)
	 	{if(PLC_ACC_BIT&0x01){
		 PLC_TEMP5=PLC_ProgAddReturn(PLC_PC+2)+PLC_R_START_ADD;
		 PLC_TEMP6=PLC_ProgAddReturn(PLC_PC+6)+PLC_R_START_ADD;
		 PLC_TEMP3=PLC_ByteRead16(PLC_PC+10)*2;
		 for(PLC_TEMP4=0;PLC_TEMP3>PLC_TEMP4;PLC_TEMP4+=2)
		 	{if(PLC_BIT_TEST(M8024)){PLC_RAM16(PLC_TEMP5+PLC_TEMP4)=PLC_RAM16(PLC_TEMP6+PLC_TEMP4);}
			 else {PLC_RAM16(PLC_TEMP6+PLC_TEMP4)=PLC_RAM16(PLC_TEMP5+PLC_TEMP4);}
			}
		 }//END PLC_ACC_BIT&0x01
		 PLC_PC+=14;}break; //BMOV(M8024)
/********************(D)传送比较指令*********************************************/
	 case 0x0025://CMP
	 	{if(PLC_ACC_BIT&0x01){
		 PLC_TEMP5=PLC_ByteRead32(PLC_PC+2);
		 PLC_TEMP6=PLC_ByteRead32(PLC_PC+10);
		 PLC_TEMP3=PLC_ProgAddReturn(PLC_PC+18);
		 if(PLC_TEMP5>PLC_TEMP6)
		   {PLC_BIT_ON(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
		 else if(PLC_TEMP5==PLC_TEMP6)
		 	{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_ON(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
		 else{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_ON(PLC_TEMP3+2);}
		 }//END PLC_ACC_BIT&0x01
		 PLC_PC+=26;}break; //CMP
	 case 0x0027://ZCP
	 	{if(PLC_ACC_BIT&0x01){
		 PLC_TEMP5=PLC_ByteRead32(PLC_PC+2);
		 PLC_TEMP6=PLC_ByteRead32(PLC_PC+10);
		 PLC_TEMPA=PLC_ByteRead32(PLC_PC+18);
		 PLC_TEMP4=PLC_ProgAddReturn(PLC_PC+26);
		 if(PLC_TEMP5>PLC_TEMPA)
		   {PLC_BIT_ON(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
		 else if(PLC_TEMP6<PLC_TEMPA)
		 	{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_OFF(PLC_TEMP4+1);PLC_BIT_ON(PLC_TEMP4+2);}
		 else{PLC_BIT_OFF(PLC_TEMP4);PLC_BIT_ON(PLC_TEMP4+1);PLC_BIT_OFF(PLC_TEMP4+2);}
		 }//END PLC_ACC_BIT&0x01
		 PLC_PC+=34;}break; //ZCP
	 case 0x0029://MOV
	 	{if(PLC_ACC_BIT&0x01)
	 		{PLC_ByteWrite32(PLC_PC+10,PLC_ByteRead32(PLC_PC+2));}
		 PLC_PC+=18;}break; //MOV
/********************传送比较指令(P)********************************************/
	 case 0x1024:
	 	{if(PLC_ACC_BIT&0x01){
		 if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2)==0) 
		 {PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);	  
		 PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);
		 PLC_TEMP2=PLC_ByteRead16(PLC_PC+6);
		 PLC_TEMP3=PLC_ProgAddReturn(PLC_PC+10);
		 if(PLC_TEMP1>PLC_TEMP2)
		   {PLC_BIT_ON(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
		 else if(PLC_TEMP1==PLC_TEMP2)
		 	{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_ON(PLC_TEMP3+1);PLC_BIT_OFF(PLC_TEMP3+2);}
		 else{PLC_BIT_OFF(PLC_TEMP3);PLC_BIT_OFF(PLC_TEMP3+1);PLC_BIT_ON(PLC_TEMP3+2);}
		 }}//END PLC_ACC_BIT&0x01
		 else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}	  
		 PLC_PC+=14;}break; //CMP
	 case 0x1026:
	 	{if(PLC_ACC_BIT&0x01){
		 if(PLC_FNC_P_BIT_TEST(PLC_PC-PLC_PROG_START_ADD2)==0) 
		 {PLC_FNC_P_BIT_ON(PLC_PC-PLC_PROG_START_ADD2);	  
		 PLC_TEMP1=PLC_ByteRead16(PLC_PC+2);

⌨️ 快捷键说明

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