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

📄 plc_stl.c

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

#include "..\Drive\PLC_PUBLIC.H"
/***********************************************
  函数功能:PLC指令运行
***********************************************/
void PLC_STL_RUN(void)
{ PLC_TEMP1=PLC_RAM16(PLC_PC);										//取指令
  switch (PLC_TEMP1){
/********************纯字指令************************************************/
	 case 0xFFF8: {PLC_PC+=2;}break;//ANB
	 case 0xFFF9: {PLC_PC+=2;}break;//ORB
	 case 0xFFFA: {PLC_PC+=2;}break;//MPS
	 case 0xFFFB: {PLC_PC+=2;}break;//MRD
	 case 0xFFFC: {PLC_PC+=2;}break;//MPP
	 case 0xFFFD: {PLC_PC+=2;}break;//INV
	 case 0xFFFF: {PLC_PC+=2;}break;//NOP
/********************升降沿指令************************************************/
	 case 0x01CA:{PLC_PC+=4;}break; //LDP
	 case 0x01CB:{PLC_PC+=4;}break; //LDF
	 case 0x01CC:{PLC_PC+=4;}break; //ANDP
	 case 0x01CD:{PLC_PC+=4;}break; //ANDF
	 case 0x01CE:{PLC_PC+=4;}break; //ORP
	 case 0x01CF:{PLC_PC+=4;}break; //ORF
	 case 0x0008:
	 	{if(PLC_STL_CMD==1)
		   {PLC_TEMP1=PLC_RAM16(PLC_PC+2)&0x0FFF;
		    if(PLC_PL_BIT_TEST(PLC_TEMP1))
		      {PLC_PL_BIT_OFF(PLC_TEMP1);
			   PLC_BIT_OFF(PLC_TEMP1);}
		   }
		 PLC_PC+=4;}break; 
	 case 0x0009:
	 	{if(PLC_STL_CMD==1)
		   {PLC_TEMP1=PLC_RAM16(PLC_PC+2)&0x0FFF;
		    if(PLC_PL_BIT_TEST(PLC_TEMP1))
		      {PLC_PL_BIT_OFF(PLC_TEMP1);
			   PLC_BIT_OFF(PLC_TEMP1);}
		   }
		 PLC_PC+=4;}break; 
/********************复位&步进指令************************************************/
	 case 0x0002:{if(PLC_STL_CMD==1)PLC_BIT_OFF(PLC_RAM16(PLC_PC+2)&0x0FFF);PLC_PC+=4;}break; 
	 case 0x0003:{PLC_PC+=4;}break; 
	 case 0x0004:{PLC_PC+=4;}break; 
	 case 0x0005:{PLC_PC+=4;}break; 
	 case 0x0006:{PLC_PC+=4;}break; 
	 case 0x0007:{PLC_PC+=4;}break; 
	 case 0xF7FF:{PLC_RUN_BIT=3;PLC_STL_CMD=0;PLC_PC+=2;}break;
	 case 0x000C:
	 	{if(PLC_STL_CMD==1){
		 if(PLC_RAM8(PLC_PC+3)==0x86)
		   {PLC_T_RST_OFF(PLC_RAM8(PLC_PC+2));
			PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
		 else 
		   {PLC_C_RST_OFF(PLC_RAM8(PLC_PC+2));
			PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}
		 }//END PLC_STL_CMD==1
		 PLC_PC+=4;}break; 
	 case 0x000D:{PLC_PC+=6;}break; 
/********************功能指令************************************************/
/**																		   **/
/********************程序流程************************************************/
	 case 0x0010:{PLC_PC+=6;}break; //CJ
	 case 0x0012:{PLC_PC+=6;}break; //CALL
	 case 0x0014:{PLC_PC+=2;}break; //SRET
	 case 0x001C:{PLC_PROG_ERROR(6505);}break; //FEND //无步进返回指令
/********************程序流程(P)************************************************/
	 case 0x1010:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break; 
	 case 0x1012:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break; 
/********************传送比较指令************************************************/
	 case 0x0024:{PLC_PC+=14;}break; //CMP
	 case 0x0026:{PLC_PC+=18;}break; //ZCP
	 case 0x0028:{PLC_PC+=10;}break; //MOV
	 case 0x002E:{PLC_PC+=14;}break; //BMOV(M8024)
/********************(D)传送比较指令*********************************************/
	 case 0x0025:{PLC_PC+=26;}break; //CMP
	 case 0x0027:{PLC_PC+=34;}break; //ZCP
	 case 0x0029:{PLC_PC+=18;}break; //MOV
/********************传送比较指令(P)********************************************/
	 case 0x1024:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //CMP
	 case 0x1026:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //ZCP
	 case 0x1028:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //MOV
	 case 0x102E:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //BMOV(M8024)
/********************(D)传送比较指令(P)******************************************/
	 case 0x1025:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //CMP
	 case 0x1027:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=34;}break; //ZCP
	 case 0x1029:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=18;}break; //MOV
/********************四则.逻辑运算*******************************************/
	 case 0x0038:{PLC_PC+=14;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x003A:{PLC_PC+=14;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x003C:{PLC_PC+=14;}break; //MUL(*)
	 case 0x003E:{PLC_PC+=14;}break; //DIV(/)
	 case 0x0040:{PLC_PC+=6;}break;  //INC(++)
	 case 0x0042:{PLC_PC+=6;}break;  //DEC(--)
	 case 0x0044:{PLC_PC+=14;}break; //WAND
	 case 0x0046:{PLC_PC+=14;}break; //WOR
	 case 0x0048:{PLC_PC+=14;}break; //WXOR
/********************(D)四则.逻辑运算*******************************************/
	 case 0x0039:{PLC_PC+=26;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x003B:{PLC_PC+=26;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x003D:{PLC_PC+=26;}break; //MUL(*)
	 case 0x003F:{PLC_PC+=26;}break; //DIV(/)
	 case 0x0041:{PLC_PC+=10;}break; //INC(++)
	 case 0x0043:{PLC_PC+=10;}break; //DEC(--)
	 case 0x0045:{PLC_PC+=26;}break; //WAND
	 case 0x0047:{PLC_PC+=26;}break; //WOR
	 case 0x0049:{PLC_PC+=26;}break; //WXOR
/********************四则.逻辑运算(P)*******************************************/
	 case 0x1038:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x103A:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x103C:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //MUL(*)
	 case 0x103E:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //DIV(/)
	 case 0x1040:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break;  //INC(++)
	 case 0x1042:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break;  //DEC(--)
	 case 0x1044:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //WAND
	 case 0x1046:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //WOR
	 case 0x1048:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=14;}break; //WXOR
/********************(D)四则.逻辑运算(P)*******************************************/
	 case 0x1039:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x103B:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x103D:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //MUL(*)
	 case 0x103F:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //DIV(/)
	 case 0x1041:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=10;}break; //INC(++)
	 case 0x1043:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=10;}break; //DEC(--)
	 case 0x1045:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //WAND
	 case 0x1047:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //WOR
	 case 0x1049:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=26;}break; //WXOR
/********************数据处理************************************************/
	 case 0x0060:{PLC_PC+=10;}break; //ZRST
/********************数据处理(P)*********************************************/
	 case 0x1060:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=10;}break; //ZRSTP
/********************高速指令************************************************/
     case 0x0082:{if(PLC_STL_CMD==1){PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+10));}PLC_PC+=14;}break; //PLSY(M8029)
	 case 0x0084:{if(PLC_STL_CMD==1){PLC_PWM_STOP(PLC_ProgAddReturn(PLC_PC+10));}PLC_PC+=14;}break;  //PWM
/********************(D)高速指令*********************************************/
     case 0x0083:{if(PLC_STL_CMD==1){PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+18));}PLC_PC+=26;}break; //PLSY(M8029)
/********************方便指令************************************************/
	 case 0x0094:{PLC_PC+=6;}break; //ALT
/********************方便指令(P)*********************************************/
	 case 0x1094:{if(PLC_STL_CMD==1)PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);PLC_PC+=6;}break; //ALT(P)
/********************接点比较************************************************/
	 case 0x01D0:{PLC_PC+=10;}break; //LD=
	 case 0x01D2:{PLC_PC+=10;}break; //LD>
	 case 0x01D4:{PLC_PC+=10;}break; //LD<
	 case 0x01D8:{PLC_PC+=10;}break; //LD<>
	 case 0x01DA:{PLC_PC+=10;}break; //LD<=
	 case 0x01DC:{PLC_PC+=10;}break; //LD>=

	 case 0x01E0:{PLC_PC+=10;}break; //AND=
	 case 0x01E2:{PLC_PC+=10;}break; //AND>
	 case 0x01E4:{PLC_PC+=10;}break; //AND<
	 case 0x01E8:{PLC_PC+=10;}break; //AND<>
	 case 0x01EA:{PLC_PC+=10;}break; //AND<=
	 case 0x01EC:{PLC_PC+=10;}break; //AND>=

	 case 0x01F0:{PLC_PC+=10;}break; //OR=
	 case 0x01F2:{PLC_PC+=10;}break; //OR>
	 case 0x01F4:{PLC_PC+=10;}break; //OR<
	 case 0x01F8:{PLC_PC+=10;}break; //OR<>
	 case 0x01FA:{PLC_PC+=10;}break; //OR<=
	 case 0x01FC:{PLC_PC+=10;}break; //OR>=
/********************(D)接点比较************************************************/
	 case 0x01D1:{PLC_PC+=18;}break; //LD=
	 case 0x01D3:{PLC_PC+=18;}break; //LD>
	 case 0x01D5:{PLC_PC+=18;}break; //LD<
	 case 0x01D9:{PLC_PC+=18;}break; //LD<>
	 case 0x01DB:{PLC_PC+=18;}break; //LD<=
	 case 0x01DD:{PLC_PC+=18;}break; //LD>=

	 case 0x01E1:{PLC_PC+=18;}break; //AND=
	 case 0x01E3:{PLC_PC+=18;}break; //AND>
	 case 0x01E5:{PLC_PC+=18;}break; //AND<
	 case 0x01E9:{PLC_PC+=18;}break; //AND<>
	 case 0x01EB:{PLC_PC+=18;}break; //AND<=
	 case 0x01ED:{PLC_PC+=18;}break; //AND>=

	 case 0x01F1:{PLC_PC+=18;}break; //OR=
	 case 0x01F3:{PLC_PC+=18;}break; //OR>
	 case 0x01F5:{PLC_PC+=18;}break; //OR<
	 case 0x01F9:{PLC_PC+=18;}break; //OR<>
	 case 0x01FB:{PLC_PC+=18;}break; //OR<=
	 case 0x01FD:{PLC_PC+=18;}break; //OR>=
/********************结束指令************************************************/
	 case 0x000F:
	 	{PLC_PROG_ERROR(9999); //无步进返回指令
		}break; //END
/********************常规指令************************************************/	 
	 default:	 //default(1)
	 	{PLC_CMD=PLC_TEMP1&0xF000;							   			//分离指令
	 	 switch (PLC_CMD)//switch(2)
	 	   {case 0x2000:{PLC_PC+=2;}break;
		    case 0x3000:{PLC_PC+=2;}break;
		    case 0x4000:{PLC_PC+=2;}break;
		    case 0x5000:{PLC_PC+=2;}break;
		    case 0x6000:{PLC_PC+=2;}break;
		    case 0x7000:{PLC_PC+=2;}break;
		    case 0xB000:{PLC_PC+=2;}break;
		    case 0xC000:
				{if(PLC_STL_CMD==1){PLC_BIT_OFF(PLC_TEMP1&0x0FFF);}
				 PLC_PC+=2;}break;
		    case 0xD000:{PLC_PC+=2;}break;
		    case 0xE000:{PLC_PC+=2;}break;
			case 0xF000:
				{if((PLC_TEMP1&0x0fff)>0x03ff){PLC_PROG_ERROR(1916);}	//指令与操作数出错
				 else {PLC_RUN_BIT=3;//返回正常程序中测试S
				       PLC_STL_CMD=0;}
				 }break;
			default: //default(2)
			   {PLC_CMD=PLC_TEMP1&0xFF00;							   			//分离指令
	 	        switch (PLC_CMD)//switch(3)
				  {case 0x0600://OUT
				  	  {if(PLC_STL_CMD==1)
				  		 {PLC_T_OUT_BIT_OFF(PLC_TEMP1&0x0FFF);
						  PLC_T_C_BIT_OFF(PLC_TEMP1&0x0FFF);}
				       PLC_PC+=6;}break; 
		           case 0x0E00:
				   	  {if((PLC_TEMP1&0x00FF)<200) 		 
		 				{if(PLC_STL_CMD==1)
				  		  {PLC_C_OUT_BIT_OFF(PLC_TEMP1&0x0FFF);
						   PLC_C_C_BIT_OFF(PLC_TEMP1&0x0FFF);}
						 PLC_PC+=6;}	 				   
		 			   else{
						    PLC_PC+=10;} 
		 			   }break;
				   default:{PLC_PROG_ERROR(6505);}break;	//指令出错
		   		  }//END switch(3)
		   	   }break;//END default(2)
		   }//END switch(2)
		}break;//END default(1)
	}//END switch(1)									
/***********************************************/
}

⌨️ 快捷键说明

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