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

📄 plc_progtest.c

📁 以前做的一个仿PLC程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	 case 0x1048:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //WXOR
/********************(D)四则.逻辑运算(P)*******************************************/
	 case 0x1039:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //ADD(+)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x103B:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //SUB(-)M8020(零标志)M8021(借位)M8022(进位)
	 case 0x103D:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //MUL(*)
	 case 0x103F:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //DIV(/)
	 case 0x1041:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //INC(++)
	 case 0x1043:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //DEC(--)
	 case 0x1045:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //WAND
	 case 0x1047:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //WOR
	 case 0x1049:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //WXOR
/********************数据处理************************************************/
	 case 0x0060:
	 	{PLC_ProgDataTest(PLC_PC+2,2);
		 if(PLC_ProgTypeReturn(PLC_PC+2)!=PLC_ProgTypeReturn(PLC_PC+6))
		   {PLC_PROG_ERROR(6501);}//操作类型不一至
		 PLC_PC+=10;}break; //ZRST
/********************数据处理(P)*********************************************/
	 case 0x1060:
	 	{PLC_ProgDataTest(PLC_PC+2,2);
		 if(PLC_ProgTypeReturn(PLC_PC+2)!=PLC_ProgTypeReturn(PLC_PC+6))
		   {PLC_PROG_ERROR(6501);}//操作类型不一至
		 PLC_PC+=10;}break; //ZRSTP
/********************高速指令************************************************/
     case 0x0082:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //PLSY
	 case 0x0084:{PLC_ProgDataTest(PLC_PC+2,3);PLC_PC+=14;}break; //PWM
/********************(D)高速指令*********************************************/
     case 0x0083:{PLC_ProgDataTest(PLC_PC+2,6);PLC_PC+=26;}break; //PLSY
/********************方便指令************************************************/
	 case 0x0094:{PLC_ProgDataTest(PLC_PC+2,1);PLC_PC+=6;}break; //ALT
	 case 0x1094:{PLC_ProgDataTest(PLC_PC+2,1);PLC_PC+=6;}break; //ALT(P)
/********************接点比较************************************************/
	 case 0x01D0:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //LD=
	 case 0x01D2:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //LD>
	 case 0x01D4:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //LD<
	 case 0x01D8:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //LD<>
	 case 0x01DA:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //LD<=
	 case 0x01DC:{PLC_ProgDataTest(PLC_PC+2,2);PLC_PC+=10;}break; //LD>=

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

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

	 case 0x01E1:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //AND=
	 case 0x01E3:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //AND>
	 case 0x01E5:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //AND<
	 case 0x01E9:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //AND<>
	 case 0x01EB:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //AND<=
	 case 0x01ED:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //AND>=

	 case 0x01F1:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //OR=
	 case 0x01F3:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //OR>
	 case 0x01F5:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //OR<
	 case 0x01F9:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //OR<>
	 case 0x01FB:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //OR<=
	 case 0x01FD:{PLC_ProgDataTest(PLC_PC+2,4);PLC_PC+=18;}break; //OR>=
/********************结束指令************************************************/
	 case 0x000F:{for(PLC_TEMP1=0;PLC_TEMP1<128;PLC_TEMP1++)				//测试P0-P127
				  	 {if(PLC_P_TEST(PLC_TEMP1))	//测试P(x)
					    {if(PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_TEMP1*2)))//测试保存的地址是否为0
						   {if(PLC_RAM16(PLC_PROG_START_ADD2+PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_TEMP1*2)))!=(0xB000+PLC_TEMP1))
						      {PLC_PC=PLC_RAM16(PLC_R_START_ADD+0x5700+(PLC_TEMP1*2));
							   PLC_PROG_ERROR(9501); //指令出错 CJ,CALL,无地址(P)
							   PLC_TEMP1=128;}}		   //退出测试
						}
					 }
				  if(PLC_STL_CMD!=0){PLC_PROG_ERROR(9501);} //无步进返回指令
				  if(D8065==0&&D8068==0)
				  	{PLC_RUN_BIT=3;				 //启动PLC运行标志
					 BOT_BIT=0xaa;				 //启动掉电标志
					 PLC_BIT_ON(M8002);
					 PLC_BIT_OFF(M8003);
					 PLC_BIT_ON(M8000);}		 //启动M8000
	              PLC_PC=PLC_PROG_END_ADD;       //返回PC指针
	             }break; //END 运行PLC(M8000)
/********************常规指令************************************************/	 
	 default:	 //default(1)
	 	{PLC_CMD=PLC_TEMP1&0Xf000;							   			//分离指令
	 	 switch (PLC_CMD)//switch(2)
	 	   {case 0x2000: {PLC_PC+=2;}break;//LD 
		    case 0x3000: {PLC_PC+=2;}break;//LDI 
		    case 0x4000: {PLC_PC+=2;}break;//AND 
		    case 0x5000: {PLC_PC+=2;}break;//ANI 
		    case 0x6000: {PLC_PC+=2;}break;//OR  
		    case 0x7000: {PLC_PC+=2;}break;//ORI 
		    case 0xB000: 
			   {if((PLC_TEMP1&0xff00)==0xb000)//P(x)
				   {PLC_P_ON(PLC_RAM8(PLC_TEMP1&0x00ff));   //启动测试位
				    PLC_RAM16(PLC_R_START_ADD+0x5700+((PLC_TEMP1&0x00ff)*2))=PLC_PC-PLC_PROG_START_ADD2;}
				//else if((PLC_TEMP1&0xff00)==0xb000)//I(x)
				else{PLC_PROG_ERROR(6501);}	//指令出错
			    PLC_PC+=2;}break;//P(1)I(1) 	
		    case 0xC000: {PLC_PC+=2;}break;//OUT Y M	
		    case 0xD000: {PLC_PC+=2;}break;//SET Y M	
		    case 0xE000: {PLC_PC+=2;}break;//RST Y M	
			case 0xF000://STL 
				{if((PLC_TEMP1&0x0fff)>0x03ff){PLC_PROG_ERROR(1916);}	//指令与操作数出错
			     PLC_STL_CMD=1;
				 PLC_PC+=2;}break;//STL S
			default: //default(2)
			   {PLC_CMD=PLC_TEMP1&0xFF00;							   			//分离指令
	 	        switch (PLC_CMD)//switch(3)
				  {case 0x0600:{PLC_ProgDataTest(PLC_PC+2,1);
		              			PLC_PC+=6;}break; //OUT 
		           case 0x0E00:{if((PLC_TEMP1&0x00FF)<200) 		 
		 				          {PLC_ProgDataTest(PLC_PC+2,1);
						           PLC_PC+=6;}	 				   
		 			            else{PLC_ProgDataTest(PLC_PC+2,2);
					                 PLC_PC+=10;} 
		 			            }break;//END OUT C
				   default:{PLC_PROG_ERROR(6506);}break;	//指令出错
		   		  }//END switch(3)
		   	   }break;//END default(2)
		   }//END switch(2)
		}break;//END default(1)
	}//END switch(1)									
/***********************************************/  
   }//END while
   }//END test_M8000
}

⌨️ 快捷键说明

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