ÈýÁâFXϵÁÐPLC±à³Ì¿ÚͨÐÅÔ´´úÂë

¸ÐлÍøÓÑvisualboyÌṩ×ÊÁÏ¡£ SinanÕûÀí
Ϊ±ãÓÚÍøÉÏä¯ÀÀ£¬ÒÔÏÂÎĵµÔö¼ÓÁËÈ«½Ç×Ö·û£¬>>´Ë´¦ÏÂÔØÔ´Îļþfx_comm.h£¬¿ÉÖ±½ÓÓÃÓÚ±àÒë

fx_comm.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;
}
//·µ»Ø¶¥²¿

 

 




Çë×ðÖØÕ¾³¤µÄÀͶ¯£¬×ªÔØʱÇ븽ÉÏSinanµÄÓÊÏä»òÖ÷Ò³Á´½Ó
sinan@sina.com¡¡¡¡http://www.gkong.com