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

📄 plc_comm.c

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

#include "..\Drive\PLC_PUBLIC.H"
extern void Plc_Program_iap(void);
/*******************************************************************************
函数功能:计算校验和 
*******************************************************************************/
uint8 check(char *MyD_str )                 
{	char sum=3;
    
	MyD_str++;
	while(*MyD_str!=0x03)
		 {sum+=*MyD_str;
	 	  MyD_str++;}
    return  (sum);
}

/*******************************************************************************
函数名称:PLC_Comm_Bit_ADD
函数功能:
入口参数:          
出口参数:
********************************************************************************/

uint16 PLC_Comm_Bit_ADD(uint16 comm_add)
{uint8 h_add;
 h_add=comm_add/0x100;
 comm_add=comm_add&0xFF;
 switch (h_add)
 	{case 0x14: {comm_add+=0x0000;}break; 
	 case 0x15: {comm_add+=0x0100;}break; 
	 case 0x16: {comm_add+=0x0200;}break; 
	 case 0x17: {comm_add+=0x0300;}break; 
	 case 0x12: {comm_add+=0x0400;}break; 
	 case 0x0C: {comm_add+=0x0500;}break; 
	 case 0x10: {comm_add+=0x0600;}break; 
	 case 0x28: {comm_add+=0x1600;}break; 
	 case 0x00: {comm_add+=0x0800;}break; 
	 case 0x01: {comm_add+=0x0900;}break; 
	 case 0x02: {comm_add+=0x0A00;}break; 
	 case 0x03: {comm_add+=0x0B00;}break; 
	 case 0x04: {comm_add+=0x0C00;}break; 
	 case 0x05: {comm_add+=0x0D00;}break; 

	 case 0x0F: {comm_add+=0x0E00;}break; 
	 case 0x27: {comm_add+=0x1E00;}break; 
	 case 0x0E: {comm_add+=0x0F00;}break; 
	 default:   {comm_add =0x1000;}break; 
	} 
 return comm_add;
}

/*******************************************************************************
函数名称:PLC_2AsciiHex(串口通信专用)
函数功能:将2个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码          
出口参数:转换好的Hex码(第一个Ascii码在高4位,第二个Ascii码在低4位)
********************************************************************************/

uint8 PLC_2AsciiHex(char Ascii1,char Ascii2)
{return ((hex[Ascii1]*0x10)+hex[Ascii2]);
}

/*******************************************************************************
函数名称:PLC_4AsciiHex(串口通信专用)
函数功能:将4个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码          
出口参数:转换好的Hex码
********************************************************************************/

uint16 PLC_4AsciiHex(char Ascii1,char Ascii2,char Ascii3,char Ascii4)
{return ((hex[Ascii1]*0x1000)+(hex[Ascii2]*0x100)+(hex[Ascii3]*0x10)+hex[Ascii4]);
}

/*******************************************************************************
函数名称:PLC_BufAsciiHex(串口通信专用)
函数功能:将4个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码          
出口参数:转换好的Hex码
********************************************************************************/

uint8 PLC_Buf2AsciiHex(uint8 S_Add)
{return((hex[PLC_UART_BUFFER[S_Add]]*0x10)+hex[PLC_UART_BUFFER[S_Add+1]]);}

/*******************************************************************************
函数名称:PLC_BufAsciiHex(串口通信专用)
函数功能:将4个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码          
出口参数:转换好的Hex码
********************************************************************************/

uint16 PLC_Buf4AsciiHex(uint8 S_Add)
{return((hex[PLC_UART_BUFFER[S_Add]]*0x1000)+(hex[PLC_UART_BUFFER[S_Add+1]]*0x100)+(hex[PLC_UART_BUFFER[S_Add+2]]*0x10)+hex[PLC_UART_BUFFER[S_Add+3]]);}

/*******************************************************************************
函数名称:PLC_Comm_Bit_ADD
函数功能:通信命令E7,E8的地址重映射
入口参数:通信地址(BIT地址)          
出口参数:映射的实际地址(BIT地址)
********************************************************************************/

void PLC_Iap_data_rst(void)
{uint32 i;
 for(i=PLC_PROG_B_START_ADD;i<(PLC_PROG_B_START_ADD+16000);i++)
      {PLC_RAM8(i)=0xff;}
}

/*******************************************************************************
函数名称:PLC_Comm_Byte_ADD
函数功能:
入口参数:          
出口参数:
********************************************************************************/

uint16 PLC_Comm_Byte_ADD(uint16 comm_add)
{if     (comm_add>=0x4000&&comm_add<=0x7E7F){comm_add-=0x3000;} 
 else if(comm_add>=0x0E00&&comm_add<=0x0FFF){comm_add-=0x0000;} 
 else if(comm_add>=0x1000&&comm_add<=0x11FF){comm_add-=0x0800;} 
 else if(comm_add>=0x0A00&&comm_add<=0x0B8F){comm_add-=0x0000;} 
 else if(comm_add>=0x0C00&&comm_add<=0x0CDF){comm_add-=0x0000;} 
 else if(comm_add>=0x1400&&comm_add<=0x16FF){comm_add+=0x4900;} 
 else if(comm_add>=0x1790&&comm_add<=0x18FF){comm_add+=0x4400;} 
 else if(comm_add>=0x0280&&comm_add<=0x02FC){comm_add-=0x0280;} 
 else if(comm_add>=0x0240&&comm_add<=0x024F){comm_add-=0x01C0;} 	
 else if(comm_add>=0x0180&&comm_add<=0x018F){comm_add-=0x00E0;} 
 else if(comm_add>=0x0200&&comm_add<=0x021F){comm_add-=0x0140;} 
 else if(comm_add>=0x0500&&comm_add<=0x051F){comm_add-=0x0240;} 
 else if(                  comm_add<=0x00BF){comm_add+=0x0100;} 
 else if(comm_add>=0x01E0&&comm_add<=0x01FF){comm_add-=0x0020;} 
 else if(comm_add>=0x04E0&&comm_add<=0x04FF){comm_add-=0x0120;} 
 else if(comm_add>=0x01C0&&comm_add<=0x01DF){comm_add+=0x0020;} 
 else{comm_add=0x0200;}//无效地址
 return comm_add;
}

/*******************************************************************************
函数名称:PLC_Comm_Batch()
函数功能:
入口参数:
出口参数:
********************************************************************************/

void PLC_Comm_Batch(void)
{uint32  PLC_Ins_S_Add,PLC_Ins_S_Add2,PLC_Ins_E_Add;
 uint16  PLC_Ins_Count,PLC_Ins_Temp_Add;
 PLC_Ins_S_Add=PLC_Ins1400_S_Add+4;
 PLC_Ins_E_Add=PLC_Ins_S_Add+(PLC_RAM8(PLC_Ins1400_S_Add)*2);//取寄存器个数
 PLC_Ins_S_Add2=PLC_Ins1790_S_Add;
 for(;PLC_Ins_E_Add>PLC_Ins_S_Add;PLC_Ins_S_Add+=2) //寄存器值(16位访问)
 	{PLC_Ins_Temp_Add=PLC_Comm_Byte_ADD(PLC_RAM16(PLC_Ins_S_Add));
	 PLC_RAM16(PLC_Ins_S_Add2)=PLC_RAM16(PLC_R_START_ADD+PLC_Ins_Temp_Add);
	 PLC_Ins_S_Add2+=2;
	 if(PLC_Ins_Temp_Add>=0x0C00&&PLC_Ins_Temp_Add<0x0CDF)	//测试是否C200-C255
	   {PLC_RAM16(PLC_Ins_S_Add2)=PLC_RAM16(PLC_R_START_ADD+PLC_Ins_Temp_Add+2);
	    PLC_Ins_S_Add2+=2;}
	}
 PLC_Ins_E_Add=PLC_Ins_S_Add+(PLC_RAM8(PLC_Ins1400_S_Add+2)*2);//取位个数
 PLC_Ins_Count=0;
 for(;PLC_Ins_E_Add>PLC_Ins_S_Add;PLC_Ins_S_Add+=2) //位值(位访问)
 	{if(PLC_BIT_TEST(PLC_Comm_Bit_ADD(PLC_RAM16(PLC_Ins_S_Add)))) 
	   {PLC_RAM8(PLC_Ins_S_Add2+(PLC_Ins_Count/8))|=PLC_BIT_OR[PLC_Ins_Count%8];}
	 else{PLC_RAM8(PLC_Ins_S_Add2+(PLC_Ins_Count/8))&=PLC_BIT_AND[PLC_Ins_Count%8];}
	 PLC_Ins_Count++;}
}

/*******************************************************************************
函数名称:PLC_Comm_Send()
函数功能:将指定地址中的数据向串口送出
入口参数:data_s_add 发送数据开始地址(地址只能是寄存器区,不能是程序区)
          Send_count 发送个数          
出口参数:无

⌨️ 快捷键说明

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