plc_run.c

来自「以前做的一个仿PLC程序」· C语言 代码 · 共 898 行 · 第 1/3 页

C
898
字号
			   {PLC_BitReset(PLC_ProgAddReturn(PLC_PC+2),PLC_ProgAddReturn(PLC_PC+6));}
			else {PLC_PROG_ERROR(6501);}//操作的数据数型出错
		 }//END PLC_ACC_BIT
		 PLC_PC+=10;}break; //ZRST
/********************数据处理(P)*********************************************/
	 case 0x1060: //ZRSTP
	 	{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);	  
		 if(PLC_TEMP1==0x02)
			  {PLC_TEMP2=PLC_ProgAddReturn(PLC_PC+6)+1;
			   if(PLC_TEMP2>=0x0C00&&PLC_TEMP2<=0x0CDF){PLC_TEMP2+=2;}
			   PLC_ByteReset(PLC_ProgAddReturn(PLC_PC+2),PLC_TEMP2);}
			else if(PLC_TEMP1==0x0b)
			   {PLC_BitReset(PLC_ProgAddReturn(PLC_PC+2),PLC_ProgAddReturn(PLC_PC+6));}
			else {PLC_PROG_ERROR(6501);}//操作的数据数型出错
		 }//END 
		 }//END PLC_ACC_BIT
		 else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}	  
		 PLC_PC+=10;}break; //ZRSTP
/********************高速指令************************************************/
     case 0x0082:
	 	{PLC_BIT_OFF(M8029);
		 if(PLC_ACC_BIT&0x01)
	 	   {PLC_PLSY_RUN(PLC_ByteRead16(PLC_PC+2),PLC_ByteRead16(PLC_PC+6),PLC_ProgAddReturn(PLC_PC+10));}
		 else {PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+10));}
		 PLC_PC+=14;}break; //PLSY
	 case 0x0084://PWM
	 	{if(PLC_ACC_BIT&0x01)
	 	   {PLC_PWM_RUN(PLC_ByteRead16(PLC_PC+2),PLC_ByteRead16(PLC_PC+6),PLC_ProgAddReturn(PLC_PC+10));}
		 else {PLC_PWM_STOP(PLC_ProgAddReturn(PLC_PC+10));}
		 PLC_PC+=14;}break; //PWM
/********************(D)高速指令*********************************************/
     case 0x0083:
	    {PLC_BIT_OFF(M8029);
		 if(PLC_ACC_BIT&0x01)
	 	   {PLC_PLSY_RUN(PLC_ByteRead32(PLC_PC+2),PLC_ByteRead32(PLC_PC+10),PLC_ProgAddReturn(PLC_PC+18));}
		 else {PLC_PLSY_STOP(PLC_ProgAddReturn(PLC_PC+18));}
		 PLC_PC+=26;}break; //PLSY
/********************方便指令************************************************/
	 case 0x0094://ALT
	 	{if(PLC_ACC_BIT&0x01){
		 PLC_TEMP1=PLC_ProgAddReturn(PLC_PC+2);
		 if(PLC_BIT_TEST(PLC_TEMP1)){PLC_BIT_OFF(PLC_TEMP1);}
		 else {PLC_BIT_ON(PLC_TEMP1);}
		 }//END PLC_ACC_BIT
		 PLC_PC+=6;}break; //ALT
/********************方便指令(P)*********************************************/
	 case 0x1094://ALT(P)
	 	{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_ProgAddReturn(PLC_PC+2);
		 if(PLC_BIT_TEST(PLC_TEMP1)){PLC_BIT_OFF(PLC_TEMP1);}
		 else {PLC_BIT_ON(PLC_TEMP1);}
		 }//END 测试执行标志
		 }//END PLC_ACC_BIT
		 else{PLC_FNC_P_BIT_OFF(PLC_PC-PLC_PROG_START_ADD2);}	 
	     PLC_PC+=6;}break; //ALT(P)
/********************接点比较************************************************/
	 case 0x01D0:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead16(PLC_PC+2)==PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //LD=
	 case 0x01D2:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead16(PLC_PC+2)>PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //LD>
	 case 0x01D4:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead16(PLC_PC+2)<PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //LD<
	 case 0x01D8:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead16(PLC_PC+2)!=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //LD<>
	 case 0x01DA:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead16(PLC_PC+2)<=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //LD<=
	 case 0x01DC:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead16(PLC_PC+2)>=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //LD>=

	 case 0x01E0:
	 	{if(PLC_ByteRead16(PLC_PC+2)==PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=10;}break; //AND=
	 case 0x01E2:
	 	{if(PLC_ByteRead16(PLC_PC+2)>PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=10;}break; //AND>
	 case 0x01E4:
	 	{if(PLC_ByteRead16(PLC_PC+2)<PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=10;}break; //AND<
	 case 0x01E8:
	 	{if(PLC_ByteRead16(PLC_PC+2)!=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=10;}break; //AND<>
	 case 0x01EA:
	 	{if(PLC_ByteRead16(PLC_PC+2)<=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=10;}break; //AND<=
	 case 0x01EC:
	 	{if(PLC_ByteRead16(PLC_PC+2)>=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=10;}break; //AND>=

	 case 0x01F0:
	 	{if(PLC_ByteRead16(PLC_PC+2)==PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //OR=
	 case 0x01F2:
	 	{if(PLC_ByteRead16(PLC_PC+2)>PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //OR>
	 case 0x01F4:
	 	{if(PLC_ByteRead16(PLC_PC+2)<PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //OR<
	 case 0x01F8:
	 	{if(PLC_ByteRead16(PLC_PC+2)!=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //OR<>
	 case 0x01FA:
	 	{if(PLC_ByteRead16(PLC_PC+2)<=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //OR<=
	 case 0x01FC:
	 	{if(PLC_ByteRead16(PLC_PC+2)>=PLC_ByteRead16(PLC_PC+6))PLC_ACC_BIT |=0x01;
		 PLC_PC+=10;}break; //OR>=
/********************(D)接点比较************************************************/
	 case 0x01D1:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead32(PLC_PC+2)==PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //LD=
	 case 0x01D3:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead32(PLC_PC+2)>PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //LD>
	 case 0x01D5:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead32(PLC_PC+2)<PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //LD<
	 case 0x01D9:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead32(PLC_PC+2)!=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //LD<>
	 case 0x01DB:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead32(PLC_PC+2)<=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //LD<=
	 case 0x01DD:
	 	{PLC_ACC_BIT <<= 1;
		 if(PLC_ByteRead32(PLC_PC+2)>=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //LD>=

	 case 0x01E1:
	 	{if(PLC_ByteRead32(PLC_PC+2)==PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=18;}break; //AND=
	 case 0x01E3:
	 	{if(PLC_ByteRead32(PLC_PC+2)>PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=18;}break; //AND>
	 case 0x01E5:
	 	{if(PLC_ByteRead32(PLC_PC+2)<PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=18;}break; //AND<
	 case 0x01E9:
	 	{if(PLC_ByteRead32(PLC_PC+2)!=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=18;}break; //AND<>
	 case 0x01EB:
	 	{if(PLC_ByteRead32(PLC_PC+2)<=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=18;}break; //AND<=
	 case 0x01ED:
	 	{if(PLC_ByteRead32(PLC_PC+2)>=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT &=0x01;
		 else PLC_ACC_BIT &=0xfe;
		 PLC_PC+=18;}break; //AND>=

	 case 0x01F1:
	 	{if(PLC_ByteRead32(PLC_PC+2)==PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //OR=
	 case 0x01F3:
	 	{if(PLC_ByteRead32(PLC_PC+2)>PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //OR>
	 case 0x01F5:
	 	{if(PLC_ByteRead32(PLC_PC+2)<PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //OR<
	 case 0x01F9:
	 	{if(PLC_ByteRead32(PLC_PC+2)!=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //OR<>
	 case 0x01FB:
	 	{if(PLC_ByteRead32(PLC_PC+2)<=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //OR<=
	 case 0x01FD:
	 	{if(PLC_ByteRead32(PLC_PC+2)>=PLC_ByteRead32(PLC_PC+10))PLC_ACC_BIT |=0x01;
		 PLC_PC+=18;}break; //OR>=
/********************结束指令************************************************/
	 case 0x000F:{PLC_END_PROG();}break; //END
/********************常规指令************************************************/
/**																		   **/
/********************常规指令************************************************/	 
	 default:	 //default(1)
	 	{PLC_CMD=PLC_TEMP1&0xF000;							   			
	 	 switch (PLC_CMD)//switch(2)
	 	   {case 0x2000: //LD
		   		{PLC_ACC_BIT <<= 1;
				 if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT |=0x01;
				 PLC_PC+=2;}break;
		    case 0x3000: //LDI
				{PLC_ACC_BIT <<= 1;
				 if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF));
				 else	PLC_ACC_BIT |=0x01;
				 PLC_PC+=2;}break;
		    case 0x4000: //AND
				{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT &=0x01;
				 else	PLC_ACC_BIT &=0xfe;
				 PLC_PC+=2;}break;
		    case 0x5000: //ANI
				{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT &=0xfe;
				 else PLC_ACC_BIT &=0x01;
				 PLC_PC+=2;}break;
		    case 0x6000: //OR
				{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF))PLC_ACC_BIT |=0x01;
				 PLC_PC+=2;}break;
		    case 0x7000: //ORI
				{if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF));
				 else PLC_ACC_BIT |=0x01;
				 PLC_PC+=2;}break;
		    case 0xB000: 
				{PLC_PC+=2;}break;
		    case 0xC000: 
				{if(PLC_ACC_BIT & 0x01){PLC_BIT_ON(PLC_TEMP1&0x0FFF);}
				 else{PLC_BIT_OFF(PLC_TEMP1&0x0FFF);}
				 PLC_PC+=2;}break;
		    case 0xD000: 
				{if(PLC_ACC_BIT & 0x01){PLC_BIT_ON(PLC_TEMP1&0x0FFF);}
				 PLC_PC+=2;}break;
		    case 0xE000: 
				{if(PLC_ACC_BIT & 0x01){PLC_BIT_OFF(PLC_TEMP1&0x0FFF);}
				 PLC_PC+=2;}break;
			case 0xF000://STL 
				{if((PLC_TEMP1&0x0fff)>0x03ff){PLC_PROG_ERROR(1916);}	
				 else{
				 if(PLC_BIT_TEST(PLC_TEMP1&0x0FFF)&&PLC_O_BIT_TEST(PLC_TEMP1&0x0FFF))
				 	{PLC_STL_CMD=2;PLC_ACC_BIT =0x01;
					 PLC_STL_ADD=PLC_TEMP1&0x0FFF;}
				 else if(PLC_O2_BIT_TEST(PLC_TEMP1&0x0FFF)==0&&PLC_O_BIT_TEST(PLC_TEMP1&0x0FFF))
				     {PLC_RUN_BIT=4;PLC_STL_CMD=1;}
				 else{PLC_RUN_BIT=4;PLC_STL_CMD=3;}
				     }//END else
				 PLC_PC+=2;}break;
			default: //default(2)
			   {PLC_CMD=PLC_TEMP1&0xFF00;							   			
	 	        switch (PLC_CMD)//switch(3)
				  {case 0x0600:{
				                if(PLC_ACC_BIT & 0x01)
								     {PLC_T_C_BIT_ON(PLC_TEMP1&0x00ff);
									  if(PLC_T_RST_TEST(PLC_TEMP1&0x00ff)==0)
									    {if(PLC_RAM16(PLC_T_START_ADD+((PLC_TEMP1&0x00FF)*2))>=PLC_ByteRead16(PLC_PC+2))//测试量与计数值是否一致
									  	   {PLC_T_OUT_BIT_ON(PLC_TEMP1&0x00ff);}
									    else {PLC_T_OUT_BIT_OFF(PLC_TEMP1&0x00ff);}
									  	}//END 
									  }//END PLC_ACC_BIT
								else {PLC_T_C_BIT_OFF(PLC_TEMP1&0x00ff);
									  PLC_T_OUT_BIT_OFF(PLC_TEMP1&0x00ff);
									  PLC_RAM16(PLC_T_START_ADD+((PLC_TEMP1&0x00FF)*2))=0;}//清除计时
		              			PLC_PC+=6;}break; 
		           case 0x0E00:{if((PLC_TEMP1&0x00FF)<200) 		 
		 				          {if(PLC_ACC_BIT & 0x01)
								     {if(PLC_C_C_BIT_TEST(PLC_TEMP1&0x00FF)==0)  
									    {PLC_C_C_BIT_ON(PLC_TEMP1&0x00FF);		 
										 if(PLC_C_RST_TEST(PLC_TEMP1&0x00FF)==0)
										   {PLC_RAM16(PLC_C16_START_ADD+((PLC_TEMP1&0x00FF)*2))+=1;//加1
									        if(PLC_RAM16(PLC_C16_START_ADD+((PLC_TEMP1&0x00FF)*2))>=PLC_ByteRead16(PLC_PC+2))//测试量与计数值是否一致
									          {PLC_C_OUT_BIT_ON(PLC_TEMP1&0x00FF);}
								            else {PLC_C_OUT_BIT_OFF(PLC_TEMP1&0x00FF);}
										   }//END
										}//END
									 }//END PLC_ACC_BIT
								   else{PLC_C_C_BIT_OFF(PLC_TEMP1&0x00FF);}
						           PLC_PC+=6;}	 				   
		 			            else{//C200-C255
								     
					                 PLC_PC+=10;} 
		 			            }break;//END OUT C
				   default:{PLC_PROG_ERROR(6505);}break;	//指令出错
		   		  }//END switch(3)
		   	   }break;//END default(2)
		   }//END switch(2)
		}break;//END default(1)
	}//END switch(1)									
/***********************************************/
  }//结束PLC_RUN_BIT==3 
  else if(PLC_RUN_BIT==4){PLC_STL_RUN();}//
  else if(PLC_RUN_BIT==1){PLC_PROG_TEST();} 
}

⌨️ 快捷键说明

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