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

📄 fx_comm.h

📁 PLC编程口通信C语言源代码
💻 H
字号:


fxnew.h



#define DELAY_TIMES 30000L

#define TRUE 1
#define FALSE 0

#define TRUE 1
#define FALSE 0

#define FORCE_ON 0x37
#define FORCE_OFF 0x38

void init_plc(void);
int check_plc(void);
int _read_data_register(unsigned int uAddress,unsigned int number);
int _read_mdata_register(unsigned int uAddress,unsigned int number);
int _write_data_register(unsigned int uAddress,unsigned int number);
int _force_m_contact(unsigned int uAddress,unsigned char ucOn_off);
int read_data_register(unsigned int uAddress,unsigned int number);
int read_mdata_register(unsigned int uAddress,unsigned int number);
int write_data_register(unsigned int uAddress,unsigned int number);
int force_m_contact(unsigned int uAddress,unsigned char ucOn_off);
int _read_m_register(unsigned int uAddress,unsigned int number);
int read_m_register(unsigned int uAddress,unsigned int number);

int TESTING=0;

unsigned int uRead_value[25];
unsigned int uWrite_value[25];

unsigned int COMM_PORT=1;
unsigned int STATS_PORT=0x2fd;
unsigned int DATA_PORT=0x2f8;

void init_plc(void)
{       _AX=0xfa;
	_DX=COMM_PORT;
	geninterrupt(0x14);
	while((inportb(STATS_PORT)&1)!=0)inportb(DATA_PORT);


}
int check_plc(void)
{       long lTmp;

	if(TESTING==1)return TRUE;

	init_plc();
	for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
	{       if((inportb(STATS_PORT)&0x20)!=0)
			break;
	}

	if(lTmp>=DELAY_TIMES)
		return(FALSE);

	outportb(DATA_PORT,5);
	disable();
	for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
	{       if((inportb(STATS_PORT)&1)!=0)
			break;
	}
	if(lTmp>=DELAY_TIMES)
	{	enable();
		return(FALSE);
	}

	if((lTmp=inportb(DATA_PORT))==6)
	{ 	enable();
		return(TRUE);
	}
	else
	{ 	enable();
		return(FALSE);
	}
}
int read_data_register(unsigned int uAddress,unsigned int number)
{	int i;
	for(i=0;i<3;i++)
		if(_read_data_register(uAddress,number)==TRUE)
			return TRUE;
	return FALSE;
}
int _read_data_register(unsigned int uAddress,unsigned int number)
{       unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};
	unsigned char uReceive[104];
	unsigned int uTmp;
	unsigned int uSum;
	unsigned int num;
	long lTmp;
	int i,j;

	if(TESTING==1)
	{       for(i=0;i<number;i++)uRead_value[i]=0;
		return TRUE;
	}

	init_plc();
	num=number*2;
	if((num/16)>=10)
		uSend[6]=(unsigned char)(num/16+0x41-10);
	else
		uSend[6]=(unsigned char)(num/16+0x30);
	if((num%16)>=10)
		uSend[7]=(unsigned char)((num%16)+0x41-10);
	else
		uSend[7]=(unsigned char)((num%16)+0x30);

	uAddress=uAddress*2+0x1000;

	uTmp=uAddress & 0x000f;
	uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>4) & 0x000f;
	uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>8) & 0x000f;
	uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>12)&0x000f;
	uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

	uSum=0;
	for(i=1;i<9;i++)
		uSum=uSum+(unsigned char)uSend[i];
	uTmp=uSum&0x000f;
	uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uSum>>4)&0x000f;
	uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

 
	for(i=0;i<11;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&0x20)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{
			
			return(FALSE);
		}

		outportb(DATA_PORT,uSend[i]);
	}
	disable();


	for(lTmp=0;lTmp<DELAY_TIMES;lTmp++)
	{       if((inportb(STATS_PORT)&1)!=0)
			break;
	}
	if(lTmp>=DELAY_TIMES)
	{
		enable();
		return(FALSE);
	}
	uReceive[0]=inportb(DATA_PORT);
	if(uReceive[0]!=2)
	{
		enable();
		return(FALSE);
	}
	for(i=1;i<number*4+4;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&1)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{
			enable();
			return(FALSE);
		}
		uReceive[i]=inportb(DATA_PORT);
	}
	enable();
	uSum=0;
	for(i=1;i<number*4+2;i++)
		uSum=uSum+(unsigned int)uReceive[i];
	uTmp=uSum&0xf;
	uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);


	if((unsigned char)uTmp!=uReceive[number*4+3])return(FALSE);
	uTmp=(uSum>>4)&0xf;
	uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);


	if((unsigned char)uTmp!=uReceive[number*4+2])return(FALSE);
	for(j=0;j<number;j++)
	{	for(i=j*4+1;i<j*4+5;i++)
			uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;
		uRead_value[j]=(((((uReceive[j*4+3]<<4)+uReceive[j*4+4])<<4)+uReceive[j*4+1])<<4)+uReceive[j*4+2];
	}
	return TRUE;
}
int read_mdata_register(unsigned int uAddress,unsigned int number)
{	int i;
	for(i=0;i<3;i++)
		if(_read_mdata_register(uAddress,number)==TRUE)
			return TRUE;
	return FALSE;
}
int _read_mdata_register(unsigned int uAddress,unsigned int number)
{       unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};
	unsigned char uReceive[104];
	unsigned int uTmp;
	unsigned int uSum;
	unsigned int num;
	long lTmp;
	int i,j;

	if(TESTING==1)
	{       for(i=0;i<number;i++)uRead_value[i]=0;
		return TRUE;
	}

	init_plc();
	num=number*2;
	if((num/16)>=10)
		uSend[6]=(unsigned char)(num/16+0x41-10);
	else
		uSend[6]=(unsigned char)(num/16+0x30);
	if((num%16)>=10)
		uSend[7]=(unsigned char)((num%16)+0x41-10);
	else
		uSend[7]=(unsigned char)((num%16)+0x30);

	/*uAddress=uAddress*2+0x1000;*/

	uTmp=uAddress & 0x000f;
	uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>4) & 0x000f;
	uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>8) & 0x000f;
	uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>12)&0x000f;
	uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

	uSum=0;
	for(i=1;i<9;i++)
		uSum=uSum+(unsigned char)uSend[i];
	uTmp=uSum&0x000f;
	uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uSum>>4)&0x000f;
	uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

	for(i=0;i<11;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&0x20)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{
			
			return(FALSE);
		}

		outportb(DATA_PORT,uSend[i]);
	}
	disable();


	for(lTmp=0;lTmp<DELAY_TIMES;lTmp++)
	{       if((inportb(STATS_PORT)&1)!=0)
			break;
	}
	if(lTmp>=DELAY_TIMES)
	{
		enable();
		return(FALSE);
	}
	uReceive[0]=inportb(DATA_PORT);
	if(uReceive[0]!=2)
	{
		enable();
		return(FALSE);
	}
	for(i=1;i<number*4+4;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&1)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{
			enable();
			return(FALSE);
		}
		uReceive[i]=inportb(DATA_PORT);
	}
	enable();
	uSum=0;
	for(i=1;i<number*4+2;i++)
		uSum=uSum+(unsigned int)uReceive[i];
	uTmp=uSum&0xf;
	uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);


	if((unsigned char)uTmp!=uReceive[number*4+3])return(FALSE);
	uTmp=(uSum>>4)&0xf;
	uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);


	if((unsigned char)uTmp!=uReceive[number*4+2])return(FALSE);
	for(j=0;j<number;j++)
	{	for(i=j*4+1;i<j*4+5;i++)
			uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;
		uRead_value[j]=(((((uReceive[j*4+3]<<4)+uReceive[j*4+4])<<4)+uReceive[j*4+1])<<4)+uReceive[j*4+2];
	}
	return TRUE;
}
int write_data_register(unsigned int uAddress,unsigned int number)
{	int i;
	for(i=0;i<3;i++)
		if(_write_data_register(uAddress,number)==TRUE)
			return TRUE;
	return FALSE;
}
int _write_data_register(unsigned int uAddress,unsigned int number)
{       unsigned char uSend[111];
	unsigned int uTmp,uSum,num;
	long lTmp;

	int i;

	if(TESTING==1)return TRUE;


	init_plc();
	uSend[0]=2;
	uSend[1]=0x31;
	uSend[number*4+8]=3;
	num=(number*2)/16;
	if(num>=10)uSend[6]=num+0x41-10;
	else	 uSend[6]=num+0x30;
	num=(number*2)%16;
	if(num>=10)uSend[7]=num+0x41-10;
	else uSend[7]=num+0x30;

	uAddress=0x1000+2*uAddress;

	uTmp=uAddress&0x000f;
	uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>4)&0x000f;
	uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>8)&0x000f;
	uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>12)&0x000f;
	uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

	for(i=0;i<number;i++)
	{
		uTmp=uWrite_value[i]&0x000f;
		uSend[i*4+9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
		uTmp=(uWrite_value[i]>>4)&0x000f;
		uSend[i*4+8]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
		uTmp=(uWrite_value[i]>>8)&0x000f;
		uSend[i*4+11]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
		uTmp=(uWrite_value[i]>>12)&0x000f;
		uSend[i*4+10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	}

	uSum=0;
	for(i=1;i<9+number*4;i++)
		uSum+=uSend[i];
	uTmp=uSum&0x000f;
	uSend[number*4+10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uSum>>4)&0x000f;
	uSend[number*4+9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	for(i=0;i<11+number*4;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&0x20)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{
			/*enable();*/
			return(FALSE);
		}
		outportb(DATA_PORT,uSend[i]);
	}
	disable();

	for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
	{       if((inportb(STATS_PORT)&1)!=0)
			break;
	}
	if(lTmp>=DELAY_TIMES)
	{
		 enable();
		return(FALSE);
	}
	if(inportb(DATA_PORT)!=6)
	{
		enable();
		return(FALSE);
	}
	else
	{
		enable();
		return(TRUE);
	}

}
int force_m_contact(unsigned uAddress,unsigned char ucOn_off)
{	int i;
	for(i=0;i<3;i++)
		if(_force_m_contact(uAddress,ucOn_off)==TRUE)
			return TRUE;
	return FALSE;
}
int _force_m_contact(unsigned uAddress,unsigned char ucOn_off)
{       unsigned uSend[]={2,0x37,0x30,0x30,0x30,0x30,3,0x30,0x30};
	unsigned uTmp,uSum,i;
	long lTmp;
	if(TESTING==1)return TRUE;

	init_plc();
	uAddress=uAddress+0x800;
	uSend[1]=ucOn_off;
	uTmp=uAddress&0x000f;
	uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>4)&0x000f;
	uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>8)&0x000f;
	uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>12)&0x000f;
	uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uSum=0;
	for(i=1;i<7;i++)
		uSum+=uSend[i];
	uTmp=uSum&0x000f;
	uSend[8]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uSum>>4)&0x000f;
	uSend[7]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

	for(i=0;i<9;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&0x20)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{     
			enable();
			return(FALSE);
		}
		outportb(DATA_PORT,uSend[i]);
	}
	disable();

	for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
	{       if((inportb(STATS_PORT)&1)!=0)
			break;
	}
	if(lTmp>=DELAY_TIMES)
	{       
		enable();
		return(FALSE);
	}
	if(inportb(DATA_PORT)!=6)
	{       
		enable();
		return(FALSE);
	}
	else
	{       enable();
		return(TRUE);
	}
}
int read_m_register(unsigned int uAddress,unsigned int number)
{	int i;
	for(i=0;i<3;i++)
		if(_read_m_register(uAddress,number)==TRUE)
			return TRUE;
	return FALSE;
}
int _read_m_register(unsigned int uAddress,unsigned int number)
{       unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};
	unsigned char uReceive[54];
	unsigned int uTmp;
	unsigned int uSum;
	unsigned int num;
	long lTmp;
	int i,j;

	if(TESTING==1)
	{       for(i=0;i<number;i++)uRead_value[i]=0;
		return TRUE;
	}

	init_plc();
	num=number;
	if((num/16)>=10)
		uSend[6]=(unsigned char)(num/16+0x41-10);
	else
		uSend[6]=(unsigned char)(num/16+0x30);
	if((num%16)>=10)
		uSend[7]=(unsigned char)((num%16)+0x41-10);
	else
		uSend[7]=(unsigned char)((num%16)+0x30);

	uAddress=uAddress/8+0x100;

	uTmp=uAddress & 0x000f;
	uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>4) & 0x000f;
	uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>8) & 0x000f;
	uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uAddress>>12)&0x000f;
	uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

	uSum=0;
	for(i=1;i<9;i++)
		uSum=uSum+(unsigned char)uSend[i];
	uTmp=uSum&0x000f;
	uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
	uTmp=(uSum>>4)&0x000f;
	uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);

   
	for(i=0;i<11;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&0x20)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{
			/*enable();*/
			return(FALSE);
		}

		outportb(DATA_PORT,uSend[i]);
	}
	disable();



	for(lTmp=0;lTmp<DELAY_TIMES;lTmp++)
	{       if((inportb(STATS_PORT)&1)!=0)
			break;
	}
	if(lTmp>=DELAY_TIMES)
	{
		enable();
		return(FALSE);
	}
	uReceive[0]=inportb(DATA_PORT);
	if(uReceive[0]!=2)
	{
		enable();
		return(FALSE);
	}
	for(i=1;i<number*2+4;i++)
	{       for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)
		{       if((inportb(STATS_PORT)&1)!=0)
				break;
		}
		if(lTmp>=DELAY_TIMES)
		{
			enable();
			return(FALSE);
		}
		uReceive[i]=inportb(DATA_PORT);
	}
	enable();

	uSum=0;
	for(i=1;i<number*2+2;i++)
		uSum=uSum+(unsigned int)uReceive[i];
	uTmp=uSum&0xf;
	uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);


	if((unsigned char)uTmp!=uReceive[number*2+3])return(FALSE);
	uTmp=(uSum>>4)&0xf;
	uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);


	if((unsigned char)uTmp!=uReceive[number*2+2])return(FALSE);
	for(j=0;j<number;j++)
	{	for(i=j*2+1;i<j*2+3;i++)
			uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;
		uRead_value[j]=((uReceive[j*2+1])<<4)+uReceive[j*2+2];
	}
	return TRUE;
}

⌨️ 快捷键说明

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