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

📄 plc_dataoperating.c

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

/***********************************************
  函数功能:位数据读
  入口参数:BitStartAdd 开始地址 >=0x0000 <=0x0FFF
		   BitCount    读取个数1-32
  出口参数:返回读取的数值
***********************************************/
uint32 PLC_BitDataRead(uint16 BitStartAdd,uint8 BitCount)
{uint32 r_data=0;
 uint16 EndAdd=BitStartAdd+BitCount;
while (1)
 {EndAdd--;
  if(PLC_BIT_TEST(EndAdd))r_data|=0x01;
  if(BitStartAdd==EndAdd)return r_data;
  r_data<<=1;}
}

/***********************************************
  函数功能:位数据写
  入口参数:BitStartAdd 开始地址 >=0x0000 <=0x0FFF
		   BitCount    写入个数1-64
		   data		   要写入的数据
  出口参数:无
***********************************************/
void PLC_BitDataWrite(uint16 BitStartAdd,uint8 BitCount,uint32 data)
{uint16 EndAdd=BitStartAdd+BitCount;
 for(;BitStartAdd<EndAdd;BitStartAdd++)
   {if(data&0x01)PLC_BIT_ON(BitStartAdd);
	else PLC_BIT_OFF(BitStartAdd);
	data>>=1;}
}

/***********************************************
  函数功能:字节数据64位写
  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);
***********************************************/
void PLC_ByteWrite64(uint32 pc,uint32 Data,uint32 Data2)
{uint32 cmd_add;
 uint32 cmd;
 cmd_add=PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc));
 cmd=cmd_add&0xff0000;
 cmd_add&=0x0000ffff;
 switch(cmd)
	{case 0x00020000://变量
		{PLC_RAM16(PLC_R_START_ADD+cmd_add)=Data;
		 PLC_RAM16(PLC_R_START_ADD+cmd_add+2)=(Data/0x10000);
		 PLC_RAM16(PLC_R_START_ADD+cmd_add+4)=Data2;
		 PLC_RAM16(PLC_R_START_ADD+cmd_add+6)=(Data2/0x10000);
		}break;   //END 变量
	 case 0x00030000:
	 	{PLC_BitDataWrite(cmd_add,4,Data);
		 PLC_BitDataWrite(cmd_add+4,4,Data2);}break;    //变量K1(M)
	 case 0x00040000:
	 	{PLC_BitDataWrite(cmd_add,8,Data);
		 PLC_BitDataWrite(cmd_add+8,8,Data2);}break;    //变量K2(M)
	 case 0x00050000:
	 	{PLC_BitDataWrite(cmd_add,12,Data);
		 PLC_BitDataWrite(cmd_add+12,12,Data2);}break;   //变量K3(M)
	 case 0x00060000:
	 	{PLC_BitDataWrite(cmd_add,16,Data);
		 PLC_BitDataWrite(cmd_add+16,16,Data2);}break;   //变量K4(M)
	 case 0x00070000:
	 	{PLC_BitDataWrite(cmd_add,20,Data);
		 PLC_BitDataWrite(cmd_add+20,20,Data2);}break;   //变量K5(M)
	 case 0x00080000:
	 	{PLC_BitDataWrite(cmd_add,24,Data);
		 PLC_BitDataWrite(cmd_add+24,24,Data2);}break;   //变量K6(M)
	 case 0x00090000:
	 	{PLC_BitDataWrite(cmd_add,28,Data);
		 PLC_BitDataWrite(cmd_add+28,28,Data);}break;   //变量K7(M)
	 case 0x000A0000:
	 	{PLC_BitDataWrite(cmd_add,32,Data);
		 PLC_BitDataWrite(cmd_add+32,32,Data);}break;   //变量K8(M)
	 default:{PLC_PROG_ERROR(0x12);}break;	//不支持操作
	}

}

/***********************************************
  函数功能:字节数据32位写
  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);
***********************************************/
void PLC_ByteWrite32(uint32 pc,uint32 Data)
{uint32 cmd_add;
 uint32 cmd;
 cmd_add=PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc));
 cmd=cmd_add&0xff0000;
 cmd_add&=0x0000ffff;
 switch(cmd)
	{case 0x00020000://变量
		{PLC_RAM16(PLC_R_START_ADD+cmd_add)=Data;
		 PLC_RAM16(PLC_R_START_ADD+cmd_add+2)=Data/0x10000;
		}break;   //END 变量
	 case 0x00030000:{PLC_BitDataWrite(cmd_add,4,Data);}break;    //变量K1(M)
	 case 0x00040000:{PLC_BitDataWrite(cmd_add,8,Data);}break;    //变量K2(M)
	 case 0x00050000:{PLC_BitDataWrite(cmd_add,12,Data);}break;   //变量K3(M)
	 case 0x00060000:{PLC_BitDataWrite(cmd_add,16,Data);}break;   //变量K4(M)
	 case 0x00070000:{PLC_BitDataWrite(cmd_add,20,Data);}break;   //变量K5(M)
	 case 0x00080000:{PLC_BitDataWrite(cmd_add,24,Data);}break;   //变量K6(M)
	 case 0x00090000:{PLC_BitDataWrite(cmd_add,28,Data);}break;   //变量K7(M)
	 case 0x000A0000:{PLC_BitDataWrite(cmd_add,32,Data);}break;   //变量K8(M)
	 default:{PLC_PROG_ERROR(0x12);}break;	//不支持操作
	}

}

/***********************************************
  函数功能:字节数据16位写
  1=常量;2=变量;3=变量K1(M);4=变量K2(M);5=变量K3(M);6=变量K4(M);
***********************************************/
void PLC_ByteWrite16(uint32 pc,uint16 Data)
{uint32 cmd_add;
 uint32 cmd;
 cmd_add=PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc));
 cmd=cmd_add&0xff0000;
 cmd_add&=0x0000ffff;
 switch(cmd)
	{case 0x00020000:{PLC_RAM16(PLC_R_START_ADD+cmd_add)=Data;}break;   //变量
	 case 0x00030000:{PLC_BitDataWrite(cmd_add,4,Data);}break;    //变量K1(M)
	 case 0x00040000:{PLC_BitDataWrite(cmd_add,8,Data);}break;    //变量K2(M)
	 case 0x00050000:{PLC_BitDataWrite(cmd_add,12,Data);}break;   //变量K3(M)
	 case 0x00060000:{PLC_BitDataWrite(cmd_add,16,Data);}break;   //变量K4(M)
	 default:{PLC_PROG_ERROR(0x12);}break;	//不支持操作
	}

}

/***********************************************
  函数功能:字节数据32位读
  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);
***********************************************/
uint32 PLC_ByteRead32(uint32 pc)
{uint32 cmd_add;
 uint32 cmd;
 cmd_add=PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc));
 cmd=cmd_add&0xff0000;
 cmd_add&=0x0000ffff;
 switch(cmd)
	{case 0x00010000://常量
		{cmd=((PLC_RAM8(pc+2)*0X100)+PLC_RAM8(pc)+
		      (PLC_RAM8(pc+6)*0X1000000)+(PLC_RAM8(pc+4)*0X10000));
		}break;   //END 常量
	 case 0x00020000://变量
		{cmd=PLC_RAM16(PLC_R_START_ADD+cmd_add)+(PLC_RAM16(PLC_R_START_ADD+cmd_add+2)*0x10000);
		}break;   //END 变量
	 case 0x00030000:{cmd=PLC_BitDataRead(cmd_add,4);}break;    //变量K1(M)
	 case 0x00040000:{cmd=PLC_BitDataRead(cmd_add,8);}break;    //变量K2(M)
	 case 0x00050000:{cmd=PLC_BitDataRead(cmd_add,12);}break;   //变量K3(M)
	 case 0x00060000:{cmd=PLC_BitDataRead(cmd_add,16);}break;   //变量K4(M)
	 case 0x00070000:{cmd=PLC_BitDataRead(cmd_add,20);}break;   //变量K5(M)
	 case 0x00080000:{cmd=PLC_BitDataRead(cmd_add,24);}break;   //变量K6(M)
	 case 0x00090000:{cmd=PLC_BitDataRead(cmd_add,28);}break;   //变量K7(M)
	 case 0x000A0000:{cmd=PLC_BitDataRead(cmd_add,32);}break;   //变量K8(M)
	 default:{PLC_PROG_ERROR(0x12);}break;	//不支持操作
	}
return cmd;
}

/***********************************************
  函数功能:字节数据16位读
  1=常量;2=变量;3=变量K1(M);4=变量K2(M);5=变量K3(M);6=变量K4(M);
***********************************************/
uint16 PLC_ByteRead16(uint32 pc)
{uint32 cmd_add;
 uint32 cmd;
 cmd_add=PLC_DataTypeTest((PLC_RAM16(pc+2)*0X10000)+PLC_RAM16(pc));
 cmd=cmd_add&0xff0000;
 cmd_add&=0x0000ffff;
 switch(cmd)
	{case 0x00010000:{cmd=(PLC_RAM8(pc+2)*0X100)+PLC_RAM8(pc);}break;//END 常量
	 case 0x00020000://变量
		{cmd=PLC_RAM16(PLC_R_START_ADD+cmd_add)+(PLC_RAM16(PLC_R_START_ADD+cmd_add+2)*0x10000);
		}break;   //END 变量
	 case 0x00030000:{cmd=PLC_BitDataRead(cmd_add,4);}break;    //变量K1(M)
	 case 0x00040000:{cmd=PLC_BitDataRead(cmd_add,8);}break;    //变量K2(M)
	 case 0x00050000:{cmd=PLC_BitDataRead(cmd_add,12);}break;   //变量K3(M)
	 case 0x00060000:{cmd=PLC_BitDataRead(cmd_add,16);}break;   //变量K4(M)
	 default:{PLC_PROG_ERROR(0x12);}break;	//不支持操作
	}
return cmd;
}

⌨️ 快捷键说明

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