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

📄 plc_dataoperating.c

📁 以前做的一个仿PLC程序
💻 C
📖 第 1 页 / 共 2 页
字号:
;/****************************************Copyright (C)**************************************************
;**                               
;**                                                                            
;**                                   
;**--------------文件信息--------------------------------------------------------------------------------
;**文   件   名: PLC_DataOperating.c
;**版        本: V2.1
;**创   建   人: LuHeDing
;**最后修改日期: 2010年05月08日
;**描        述: PLC数据操作函数集合
;** 
;********************************************************************************************************/

#include "..\Drive\PLC_PUBLIC.H"
/***********************************************
  函数功能:PLC 数据类型测试(pc(data))
  入口:已提取的数据
  出口:高16位为类型识别号  
  	   0和其它=无效操作; 
	   1=常量;2=变量;3=变量K1(M);4=变量K2(M);5=变量K3(M);6=变量K4(M);
	   7=变量K5(M);8=变量K6(M);9=变量K7(M);A=变量K8(M);B=位变量;
	   低16位为地址   
***********************************************/
uint32 PLC_DataTypeTest(uint32 Data)
{uint32 cmd;
 uint32 TempAdd=((Data&0x0f0000)/0x100)+(Data%0x100);
 cmd=Data&0xff00ff00;
 switch(cmd)
    {case 0x80008000:{cmd=0x010000;}break;//常量
	 case 0x86008600:{cmd=0x020000|(TempAdd+0x1000);}break;//变量D0-D999
	 case 0x88008600:{cmd=0x020000|(((Data&0xFF0000)/0x100)+(Data%0x100)+0x17D0);}break;//变量D1000-D7999  
	 case 0x80008600:{cmd=0x020000|(TempAdd+0x0E00);}break;//变量D8000-D8255
	 case 0x82008600:{cmd=0x020000|(TempAdd+0x0800);}break;//变量T0-T255
	 case 0x84008600:{cmd=0x020000|(TempAdd+0x0A00);}break;//变量C0-C255
	 case 0x82008400:{cmd=0x030000|TempAdd;}break;//变量K1(M0) M10 0A 84 08 82
	 case 0x84008400:{cmd=0x040000|TempAdd;}break;//变量K2(M0) M10 0A 84 08 84
	 case 0x86008400:{cmd=0x050000|TempAdd;}break;//变量K3(M0) M10 0A 84 08 86
	 case 0x88008400:{cmd=0x060000|TempAdd;}break;//变量K4(M0) M10 0A 84 08 88
 	 case 0x8A008400:{cmd=0x070000|TempAdd;}break;//变量K5(M0) M10 0A 84 08 8A
	 case 0x8C008400:{cmd=0x080000|TempAdd;}break;//变量K6(M0) M10 0A 84 08 8C
	 case 0x8E008400:{cmd=0x090000|TempAdd;}break;//变量K7(M0) M10 0A 84 08 8E
	 case 0x90008400:{cmd=0x0A0000|TempAdd;}break;//变量K8(M0) M10 0A 84 08 90
	 case 0x80008400:{cmd=0x0B0000|TempAdd;}break;//Bit变量
//(Z)
	 case 0x8600A600://变量D0-D999 Z0-Z3
	 	{cmd=Data&0x00f00000;
		 switch(cmd)
		    {case 0x00000000:{cmd=D8028;}break;   //Z0
			 case 0x00400000:{cmd=D8182;}break;   //Z1
			 case 0x00800000:{cmd=D8184;}break;   //Z2
			 case 0x00c00000:{cmd=D8186;}break;   //Z3
			 default:{cmd=0xFF6000;}break;	//变址Z地址未知
			}
		 cmd=(cmd*2)+TempAdd+0x1000;
		 if(cmd>0x4E7E||cmd<0x1000){cmd=0xFF6000;}//数据读取地址超出
		 else cmd|=0x020000;
		 }break;//END变量D0-D999 Z0-Z3
	 case 0x8700A600://变量D0-D999 Z4-Z7
	 	{cmd=Data&0x00f00000;
		 switch(cmd)
		    {case 0x00000000:{cmd=D8188;}break;   //Z4
			 case 0x00400000:{cmd=D8190;}break;   //Z5
			 case 0x00800000:{cmd=D8192;}break;   //Z6
			 case 0x00c00000:{cmd=D8194;}break;   //Z7
			 default:{cmd=0xFF6000;}break;	//变址Z地址未知
			}
		 cmd=(cmd*2)+TempAdd+0x1000;
		 if(cmd>0x4E7E||cmd<0x1000){cmd=0xFF6000;}//数据读取地址超出
		 else cmd|=0x020000;
		 }break;//END 变量D0-D999 Z4-Z7
	 case 0x8800A600://变量D1000-D7999 Z0-Z3
	 	{cmd=(Data&0x00f00000)-((Data&0x00F00000)%0x00400000);
		 switch(cmd)
		    {case 0x00000000:{cmd=D8028;}break;   //Z0
			 case 0x00400000:{cmd=D8182;}break;   //Z1
			 case 0x00800000:{cmd=D8184;}break;   //Z2
			 case 0x00c00000:{cmd=D8186;}break;   //Z3
			 default:{cmd=0xFF6000;}break;	//变址Z地址未知
			}
		 cmd=((cmd*2)+TempAdd+(((Data&0x00F00000)%0x00400000)/0x100)+0x17D0);
		 if(cmd>0x4E7E||cmd<0x1000){cmd=0xFF6000;}//数据读取地址超出
		 else cmd|=0x020000;
		}break;//END 变量D1000-D7999 Z0-Z3
	 case 0x8900A600://变量D1000-D7999 Z4-Z7
	 	{cmd=(Data&0x00f00000)-((Data&0x00F00000)%0x00400000);
		 switch(cmd)
		    {case 0x00000000:{cmd=D8188;}break;   //Z4
			 case 0x00400000:{cmd=D8190;}break;   //Z5
			 case 0x00800000:{cmd=D8192;}break;   //Z6
			 case 0x00c00000:{cmd=D8194;}break;   //Z7
			 default:{cmd=0xFF6000;;}break;	//变址Z地址未知
			}
		 cmd=((cmd*2)+TempAdd+(((Data&0x00F00000)%0x00400000)/0x100)+0x17D0);
		 if(cmd>0x4E7E||cmd<0x1000){cmd=0xFF6000;}//数据读取地址超出
		 else cmd|=0x020000;
		}break;//END 变量D1000-D7999 Z4-Z7
	default:{cmd=0xFF6000;}break;	//非法操作
	}
return cmd;
}

/***********************************************
  函数功能:专用于开始程序操作数据测试
  入口参数:pc数据开始地址
           count测试个数
***********************************************/
void PLC_ProgDataTest(uint32 pc,uint8 count)
{uint32 temp;
 for(;count!=0;count--){
 temp=PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc));
 pc+=4;
 if     ((temp&0xff0000)==0x010000){;}
 else if((temp&0xff0000)==0x020000){if((temp&0xFFFF)>0x4E7F)PLC_PROG_ERROR(1020);}//字节操作数出错
 else if((temp&0xff0000)==0x030000){;}//K1(M0)
 else if((temp&0xff0000)==0x040000){;}//K2(M0)
 else if((temp&0xff0000)==0x050000){;}//K3(M0)
 else if((temp&0xff0000)==0x060000){;}//K4(M0)
 else if((temp&0xff0000)==0x070000){;}//K5(M0)
 else if((temp&0xff0000)==0x080000){;}//K6(M0)
 else if((temp&0xff0000)==0x090000){;}//K7(M0)
 else if((temp&0xff0000)==0x0A0000){;}//K8(M0)
 else if((temp&0xff0000)==0x0B0000){;}//Bit
 else {PLC_PROG_ERROR(1020);count=0;}//操作数出错
 }//end for	
}

/***********************************************
  函数功能:从程序中返回地址
***********************************************/
uint16 PLC_ProgAddReturn(uint32 pc)
{return PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc))&0xffff;
}

/***********************************************
  函数功能:从程序中返回类型
  0和其它=无效类型; 
  1=常量;2=变量;3=变量K1(M);4=变量K2(M);5=变量K3(M);6=变量K4(M);
  7=变量K5(M);8=变量K6(M);9=变量K7(M);A=变量K8(M);B=位变量;
***********************************************/
uint16 PLC_ProgTypeReturn(uint32 pc)
{return (PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc))&0xff0000)/0x10000;
}

/***********************************************
  函数功能:从程序中返回类型及地址
  0和其它=无效类型; 
  1=常量;2=变量;3=变量K1(M);4=变量K2(M);5=变量K3(M);6=变量K4(M);
  7=变量K5(M);8=变量K6(M);9=变量K7(M);A=变量K8(M);B=位变量;
***********************************************/
uint32 PLC_ProgTypeAddReturn(uint32 pc)
{return PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc));
}


/***********************************************
  函数功能:字节数据批量复位
***********************************************/
void PLC_ByteReset(uint16 BitStartAdd,uint16 BitEndAdd)
{uint32 SAdd,EAdd;
 uint16 Temp;
 if(BitStartAdd>BitEndAdd)//如果地址倒序
   {Temp=BitStartAdd;
    BitStartAdd=BitEndAdd;
	BitEndAdd=Temp;}
 SAdd=PLC_R_START_ADD+BitStartAdd;
 EAdd=PLC_R_START_ADD+BitEndAdd;
 while (SAdd<=EAdd)
    {if(SAdd%4==0&&(EAdd-SAdd)>=4)
	   {PLC_RAM32(SAdd)=0;
		SAdd+=4;}
	 else{PLC_RAM8(SAdd)=0;SAdd++;}
 	} 
}

/***********************************************
  函数功能:位数据批量复位
***********************************************/
void PLC_BitReset(uint16 BitStartAdd,uint16 BitEndAdd)
{while (BitStartAdd<=BitEndAdd)
    {if(BitStartAdd%8==0&&(BitEndAdd-BitStartAdd)>=8)
	   {PLC_RAM8(PLC_R_START_ADD+(BitStartAdd/8))=0;
		BitStartAdd+=8;}
	 else{PLC_BIT_OFF(BitStartAdd);BitStartAdd++;}
	}
}

⌨️ 快捷键说明

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