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

📄 plc_comm.c

📁 以前做的一个仿PLC程序
💻 C
📖 第 1 页 / 共 2 页
字号:
********************************************************************************/

void PLC_Comm_Send(uint16 data_s_add,uint8 count)
{uint32 PLC_Send_S_Add,PLC_Send_E_Add;
 uint8  PLC_Send_temp,PLC_Send_Sum;
 if(data_s_add>=0x5b90&&data_s_add<=0x5b90){PLC_Comm_Batch();}	//批量数据读
 if(data_s_add>=0x8000&&data_s_add<0xBEDC)	//读程序区
   {PLC_Send_S_Add=(PLC_PROG_START_ADD+data_s_add)-0x8000;}
 else{PLC_Send_S_Add=PLC_R_START_ADD+data_s_add;}	//读RAM区开始地址
      PLC_Send_E_Add=PLC_Send_S_Add+count;
 if((PLC_Send_E_Add>=PLC_R_START_ADD&&PLC_Send_E_Add<=PLC_R_END_ADD)||	  //测试地址是否超出
    (PLC_Send_E_Add>=PLC_PROG_START_ADD&&PLC_Send_E_Add<=PLC_PROG_END_ADD))
 	{PLC_UART_T_CNT=0;
	 PLC_UART_T_BUFFER[0]=0x02;
	 PLC_UART_T_CNT++;
 	 PLC_Send_Sum=0x03;
 	 for(;PLC_Send_E_Add>PLC_Send_S_Add;PLC_Send_S_Add++)
		{PLC_Send_temp=asc[PLC_RAM8(PLC_Send_S_Add)/0x10];
		 PLC_UART_T_BUFFER[PLC_UART_T_CNT]=PLC_Send_temp;
	     PLC_UART_T_CNT++;
	 	 PLC_Send_Sum+=PLC_Send_temp;
	 	 PLC_Send_temp=asc[PLC_RAM8(PLC_Send_S_Add)&0x0f];
		 PLC_UART_T_BUFFER[PLC_UART_T_CNT]=PLC_Send_temp;
	     PLC_UART_T_CNT++;
	 	 PLC_Send_Sum+=PLC_Send_temp;}
	 PLC_UART_T_BUFFER[PLC_UART_T_CNT]=0x03;
	 PLC_UART_T_CNT++;
	 PLC_UART_T_BUFFER[PLC_UART_T_CNT]=asc[PLC_Send_Sum/0x10];
	 PLC_UART_T_CNT++;
	 PLC_UART_T_BUFFER[PLC_UART_T_CNT]=asc[PLC_Send_Sum%0x10];
	 PLC_UART_T_CNT++;
	 UART_COUNT=PLC_UART_T_CNT;UART_COUNT2=0; 
	}
  else{PLC_UART_SEND(0x15);}
}


/*******************************************************************************
函数名称:PLC_UART_CMD()
函数功能:串口数据处理
入口参数:
          
出口参数:
********************************************************************************/

void PLC_UART_CMD(void)
{uint8 PLC_Uart_Sum; 
 if (PLC_UART_RECEIVE_CNT)
	 {if(PLC_UART_BUFFER[0]==0x05)
	 	{PLC_UART_RECEIVE_CNT=0;
		 PLC_UART_SEND(0x06);}
	  else if(PLC_UART_BUFFER[0]==0x02)
	  	{if(PLC_UART_BUFFER[PLC_UART_RECEIVE_CNT-3]==0x03)
		   { PLC_Uart_Sum=check(PLC_UART_BUFFER);
		 	 if(PLC_Uart_Sum/0x10==hex[PLC_UART_BUFFER[PLC_UART_RECEIVE_CNT-2]]&&\
			    PLC_Uart_Sum%0x10==hex[PLC_UART_BUFFER[PLC_UART_RECEIVE_CNT-1]])//和校验
		 		{PLC_UART_RECEIVE_CNT=0;
				 PLC_UART_HANDLE();		 //处理串口数据
				 PLC_UART_RECEIVE_CNT=0;
				}						   //正确处理数据		
			 else {PLC_UART_RECEIVE_CNT=0;
			       PLC_UART_SEND(0x15);	   //错误返回错误码(NCK)
				   PLC_UART_RECEIVE_CNT=0; //置错误标志
				  }
		   }
		}	
	  else{PLC_UART_RECEIVE_CNT=0;
	       PLC_UART_SEND(0x15);}  
	  }
}

/*******************************************************************************
函数名称: PLC_UART_HANDLE(void)
函数功能: 处理串口数据
入口参数:
出口参数:
********************************************************************************/
uint8 PLC_PROG_W_BIT=0;
void PLC_UART_HANDLE(void)
{uint32 PLC_Uart_Add,PLC_Uart_Add_temp;
 uint16 PLC_Uart_S_Add;
 uint8  PLC_Uart_Temp,PLC_Uart_Count;
 if(PLC_UART_BUFFER[1]==0X30)	  //0读数据
   {PLC_Uart_S_Add=PLC_Buf4AsciiHex(2);
   	PLC_Uart_Count=PLC_Buf2AsciiHex(6);
	PLC_Comm_Send(PLC_Uart_S_Add,PLC_Uart_Count);   
   }/********************************END读数据********************************************/
 else if(PLC_UART_BUFFER[1]==0X31)  //1写数据
 		{PLC_Uart_Add=PLC_R_START_ADD+PLC_Buf4AsciiHex(2);	//开始地址
		 PLC_Uart_Add_temp=PLC_Uart_Add+PLC_Buf2AsciiHex(6);
		 PLC_Uart_Temp=8;
		 for(;PLC_Uart_Add_temp>PLC_Uart_Add;PLC_Uart_Add++)
			{PLC_RAM8(PLC_Uart_Add)=PLC_Buf2AsciiHex(PLC_Uart_Temp);			 
			 PLC_Uart_Temp+=2;}
		 PLC_UART_SEND(0x06);
		}/********************************END写数据********************************************/
 else if(PLC_UART_BUFFER[1]==0X37) //7强制ON
 		{PLC_Uart_S_Add=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[2]]<<4)+hex[PLC_UART_BUFFER[3]];
		 PLC_BIT_ON(PLC_Uart_S_Add);
		 PLC_UART_SEND(0x06);
		}/********************************END强制ON********************************************/
 else if(PLC_UART_BUFFER[1]==0X38) //8强制OFF
 		{PLC_Uart_S_Add=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)\
					    +(hex[PLC_UART_BUFFER[2]]<<4)+hex[PLC_UART_BUFFER[3]];
		 PLC_BIT_OFF(PLC_Uart_S_Add);
		 PLC_UART_SEND(0x06);
		}/********************************END强制OFF********************************************/
 else if(PLC_UART_BUFFER[1]==0X45) //强制FNC
        {if(PLC_UART_BUFFER[2]==0x30)
		   {if(PLC_UART_BUFFER[3]==0x30)//E00读配置
		   	  {PLC_Uart_S_Add=PLC_Comm_Byte_ADD((hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]]);
   	           PLC_Uart_Count=(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
	           PLC_Comm_Send(PLC_Uart_S_Add,PLC_Uart_Count);
			  }/*********************END读配置*************************/
		    else if(PLC_UART_BUFFER[3]==0x31)//E01读程序
				 {PLC_Uart_S_Add=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]];
   	              PLC_Uart_Count=(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
	              PLC_Comm_Send(PLC_Uart_S_Add,PLC_Uart_Count);
				 }/*********************END读程序*************************/
		    else{PLC_UART_SEND(0x15);}	 //通信出错
			}
		else if(PLC_UART_BUFFER[2]==0x31)
			   {if(PLC_UART_BUFFER[3]==0x30)//E10写配置
			   	  {PLC_Uart_Add_temp=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]];	//开始地址
				   PLC_Uart_Add=PLC_R_START_ADD+PLC_Comm_Byte_ADD(PLC_Uart_Add_temp);	
				   PLC_Uart_Add_temp=PLC_Uart_Add+(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
				   PLC_Uart_Temp=10;
				   for(;PLC_Uart_Add_temp>PLC_Uart_Add;PLC_Uart_Add++)
						 {PLC_RAM8(PLC_Uart_Add)=(hex[PLC_UART_BUFFER[PLC_Uart_Temp]]<<4)+hex[PLC_UART_BUFFER[PLC_Uart_Temp+1]];			 			
			 			  PLC_Uart_Temp+=2;}
		 		   PLC_UART_SEND(0x06);
				  }/*********************END写配置*************************/
				else if(PLC_UART_BUFFER[3]==0x31)//E11写程序
				  {PLC_Uart_Add=PLC_PROG_B_START_ADD+(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]]-0X805C;
				   PLC_Uart_Add_temp=PLC_Uart_Add+(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
				   PLC_Uart_Temp=10;
				   if(PLC_Uart_Add==PLC_PROG_B_START_ADD){PLC_Iap_data_rst();PLC_PROG_W_BIT=1;}
		 			for(;PLC_Uart_Add_temp>PLC_Uart_Add;PLC_Uart_Add++)
						{PLC_RAM8(PLC_Uart_Add)=(hex[PLC_UART_BUFFER[PLC_Uart_Temp]]<<4)+hex[PLC_UART_BUFFER[PLC_Uart_Temp+1]];			 			
			 			 PLC_Uart_Temp+=2;}
		 			PLC_UART_SEND(0x06);
				   }/*********************END写程序*************************/
			   else{PLC_UART_SEND(0x15);}//通信出错
		       }
		else if(PLC_UART_BUFFER[2]==0x37)//E7强制ON
			   {PLC_Uart_S_Add=PLC_Comm_Bit_ADD((hex[PLC_UART_BUFFER[5]]*0x1000)\
			   								   +(hex[PLC_UART_BUFFER[6]]*0x100)\
											   +(hex[PLC_UART_BUFFER[3]]*0x10)\
											   +hex[PLC_UART_BUFFER[4]]);	
			    PLC_BIT_ON(PLC_Uart_S_Add);
				PLC_UART_SEND(0x06);
				}
		else if(PLC_UART_BUFFER[2]==0x38)//E8强制OFF
			   {PLC_Uart_S_Add=PLC_Comm_Bit_ADD((hex[PLC_UART_BUFFER[5]]*0x1000)\
			   								    +(hex[PLC_UART_BUFFER[6]]*0x100)\
											    +(hex[PLC_UART_BUFFER[3]]*0x10)\
											    +hex[PLC_UART_BUFFER[4]]);	
			    PLC_BIT_OFF(PLC_Uart_S_Add);
				PLC_UART_SEND(0x06);
				}
		else{PLC_UART_SEND(0x15);}  //通信出错
		}/********************************END强制FNC********************************************/
 else if(PLC_UART_BUFFER[1]==0x42)	//程序下载完成    
 		{if(PLC_PROG_W_BIT==1){Plc_Program_iap();PLC_PROG_W_BIT=0;PLC_RUN_BIT=0;D8065=0;}	//写入程序
		 PLC_UART_SEND(0x06);}
 else if(PLC_UART_BUFFER[1]==0x34)
 		{PLC_UART_SEND(0x06);}
 else{PLC_UART_SEND(0x15);}//通信出错
}

/*******************************************************************************
函数名称:PLC_CommCmd
函数功能:通信命令重定义及执行
入口参数:Cmd命令          
出口参数:映射的实际地址(BIT地址)
********************************************************************************/

void PLC_CommCmd(uint8 Cmd,uint16 Add)
{;
}

⌨️ 快捷键说明

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