|
|
fx_comm.h </P><P> #define DELAY_TIMES 30000L<BR> #define TRUE 1<BR> #define FALSE 0<BR> #define TRUE 1<BR> #define FALSE 0<BR> #define FORCE_ON 0x37<BR> #define FORCE_OFF 0x38<BR> void init_plc(void);<BR> int check_plc(void);<BR> int _read_data_register(unsigned int uAddress,unsigned int number);<BR> int _read_mdata_register(unsigned int uAddress,unsigned int number);<BR> int _write_data_register(unsigned int uAddress,unsigned int number);<BR> int _force_m_contact(unsigned int uAddress,unsigned char ucOn_off);<BR> int read_data_register(unsigned int uAddress,unsigned int number);<BR> int read_mdata_register(unsigned int uAddress,unsigned int number);<BR> int write_data_register(unsigned int uAddress,unsigned int number);<BR> int force_m_contact(unsigned int uAddress,unsigned char ucOn_off);<BR> int _read_m_register(unsigned int uAddress,unsigned int number);<BR> int read_m_register(unsigned int uAddress,unsigned int number);<BR> int TESTING=0;<BR> unsigned int uRead_value[25];<BR> unsigned int uWrite_value[25];<BR> unsigned int COMM_PORT=1;<BR> unsigned int STATS_PORT=0x2fd;<BR> unsigned int DATA_PORT=0x2f8;</P><P> <BR> void init_plc(void)<BR> { _AX=0xfa;<BR> _DX=COMM_PORT;<BR> geninterrupt(0x14);<BR> while((inportb(STATS_PORT)&1)!=0) inportb(DATA_PORT);<BR> <BR> }<BR> //返回頂部 </P><P> <BR> int check_plc(void)<BR> { long lTmp;<BR> if(TESTING==1)return TRUE;<BR> init_plc();<BR> for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&0x20)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> return(FALSE);<BR> outportb(DATA_PORT,5);<BR> disable();<BR> for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> { enable();<BR> return(FALSE);<BR> }<BR> if((lTmp=inportb(DATA_PORT))==6)<BR> { enable();<BR> return(TRUE);<BR> }<BR> else<BR> { enable();<BR> return(FALSE);<BR> }<BR> }<BR> //返回頂部 </P><P> </P><P> <BR> int read_data_register(unsigned int uAddress,unsigned int number)<BR> { int i;<BR> for(i=0;i<3;i++)<BR> if(_read_data_register(uAddress,number)==TRUE)<BR> return TRUE;<BR> return FALSE;<BR> }<BR> //返回頂部 </P><P> <BR> int _read_data_register(unsigned int uAddress,unsigned int number)<BR> { unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};<BR> unsigned char uReceive[104];<BR> unsigned int uTmp;<BR> unsigned int uSum;<BR> unsigned int num;<BR> long lTmp;<BR> int i,j;<BR> if(TESTING==1)<BR> { for(i=0;i<number;i++)uRead_value[i]=0;<BR> return TRUE;<BR> }<BR> init_plc();<BR> num=number*2;<BR> if((num/16)>=10)<BR> uSend[6]=(unsigned char)(num/16+0x41-10);<BR> else<BR> uSend[6]=(unsigned char)(num/16+0x30);<BR> if((num%16)>=10)<BR> uSend[7]=(unsigned char)((num%16)+0x41-10);<BR> else<BR> uSend[7]=(unsigned char)((num%16)+0x30);<BR> uAddress=uAddress*2+0x1000;<BR> uTmp=uAddress & 0x000f;<BR> uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>4) & 0x000f;<BR> uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>8) & 0x000f;<BR> uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>12)&0x000f;<BR> uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uSum=0;<BR> for(i=1;i<9;i++)<BR> uSum=uSum+(unsigned char)uSend[i];<BR> uTmp=uSum&0x000f;<BR> uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uSum>>4)&0x000f;<BR> uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);</P><P> for(i=0;i<11;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&0x20)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> <BR> return(FALSE);<BR> }<BR> outportb(DATA_PORT,uSend[i]);<BR> }<BR> disable();<BR> <BR> for(lTmp=0;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> uReceive[0]=inportb(DATA_PORT);<BR> if(uReceive[0]!=2)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> for(i=1;i<number*4+4;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> uReceive[i]=inportb(DATA_PORT);<BR> }<BR> enable();<BR> uSum=0;<BR> for(i=1;i<number*4+2;i++)<BR> uSum=uSum+(unsigned int)uReceive[i];<BR> uTmp=uSum&0xf;<BR> uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> <BR> if((unsigned char)uTmp!=uReceive[number*4+3]) return(FALSE);<BR> uTmp=(uSum>>4)&0xf;<BR> uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> <BR> if((unsigned char)uTmp!=uReceive[number*4+2]) return(FALSE);<BR> for(j=0;j<number;j++)<BR> { for(i=j*4+1;i<j*4+5;i++)<BR> uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;<BR> uRead_value[j]=(((((uReceive[j*4+3]<<4)+uReceive[j*4+4])<<4)+uReceive[j*4+1])<<4)+uReceive[j*4+2];<BR> }<BR> return TRUE;<BR> }<BR> //返回頂部 </P><P> </P><P> int read_mdata_register(unsigned int uAddress,unsigned int number)<BR> { int i;<BR> for(i=0;i<3;i++)<BR> if(_read_mdata_register(uAddress,number)==TRUE)<BR> return TRUE;<BR> return FALSE;<BR> }<BR> //返回頂部 </P><P> <BR> int _read_mdata_register(unsigned int uAddress,unsigned int number)<BR> { unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};<BR> unsigned char uReceive[104];<BR> unsigned int uTmp;<BR> unsigned int uSum;<BR> unsigned int num;<BR> long lTmp;<BR> int i,j;<BR> if(TESTING==1)<BR> { for(i=0;i<number;i++)uRead_value[i]=0;<BR> return TRUE;<BR> }<BR> init_plc();<BR> num=number*2;<BR> if((num/16)>=10)<BR> uSend[6]=(unsigned char)(num/16+0x41-10);<BR> else<BR> uSend[6]=(unsigned char)(num/16+0x30);<BR> if((num%16)>=10)<BR> uSend[7]=(unsigned char)((num%16)+0x41-10);<BR> else<BR> uSend[7]=(unsigned char)((num%16)+0x30);<BR> /*uAddress=uAddress*2+0x1000;*/<BR> uTmp=uAddress & 0x000f;<BR> uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>4) & 0x000f;<BR> uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>8) & 0x000f;<BR> uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>12)&0x000f;<BR> uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uSum=0;<BR> for(i=1;i<9;i++)<BR> uSum=uSum+(unsigned char)uSend[i];<BR> uTmp=uSum&0x000f;<BR> uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uSum>>4)&0x000f;<BR> uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> for(i=0;i<11;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&0x20)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> <BR> return(FALSE);<BR> }<BR> outportb(DATA_PORT,uSend[i]);<BR> }<BR> disable();<BR> <BR> for(lTmp=0;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> uReceive[0]=inportb(DATA_PORT);<BR> if(uReceive[0]!=2)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> for(i=1;i<number*4+4;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> uReceive[i]=inportb(DATA_PORT);<BR> }<BR> enable();<BR> uSum=0;<BR> for(i=1;i<number*4+2;i++)<BR> uSum=uSum+(unsigned int)uReceive[i];<BR> uTmp=uSum&0xf;<BR> uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> <BR> if((unsigned char)uTmp!=uReceive[number*4+3])return(FALSE);<BR> uTmp=(uSum>>4)&0xf;<BR> uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> <BR> if((unsigned char)uTmp!=uReceive[number*4+2])return(FALSE);<BR> for(j=0;j<number;j++)<BR> { for(i=j*4+1;i<j*4+5;i++)<BR> uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;<BR> uRead_value[j]=(((((uReceive[j*4+3]<<4)+uReceive[j*4+4])<<4)+uReceive[j*4+1])<<4)+uReceive[j*4+2];<BR> }<BR> return TRUE;<BR> }<BR> //返回頂部 </P><P> <BR> </P><P> int write_data_register(unsigned int uAddress,unsigned int number)<BR> { int i;<BR> for(i=0;i<3;i++)<BR> if(_write_data_register(uAddress,number)==TRUE)<BR> return TRUE;<BR> return FALSE;<BR> }<BR> //返回頂部 </P><P> <BR> int _write_data_register(unsigned int uAddress,unsigned int number)<BR> { unsigned char uSend[111];<BR> unsigned int uTmp,uSum,num;<BR> long lTmp;<BR> int i;<BR> if(TESTING==1)return TRUE;<BR> <BR> init_plc();<BR> uSend[0]=2;<BR> uSend[1]=0x31;<BR> uSend[number*4+8]=3;<BR> num=(number*2)/16;<BR> if(num>=10)uSend[6]=num+0x41-10;<BR> else uSend[6]=num+0x30;<BR> num=(number*2)%16;<BR> if(num>=10)uSend[7]=num+0x41-10;<BR> else uSend[7]=num+0x30;<BR> uAddress=0x1000+2*uAddress;<BR> uTmp=uAddress&0x000f;<BR> uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>4)&0x000f;<BR> uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>8)&0x000f;<BR> uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>12)&0x000f;<BR> uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> for(i=0;i<number;i++)<BR> {<BR> uTmp=uWrite_value[i]&0x000f;<BR> uSend[i*4+9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uWrite_value[i]>>4)&0x000f;<BR> uSend[i*4+8]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uWrite_value[i]>>8)&0x000f;<BR> uSend[i*4+11]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uWrite_value[i]>>12)&0x000f;<BR> uSend[i*4+10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> }<BR> uSum=0;<BR> for(i=1;i<9+number*4;i++)<BR> uSum+=uSend[i];<BR> uTmp=uSum&0x000f;<BR> uSend[number*4+10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uSum>>4)&0x000f;<BR> uSend[number*4+9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> for(i=0;i<11+number*4;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&0x20)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> /*enable();*/<BR> return(FALSE);<BR> }<BR> outportb(DATA_PORT,uSend[i]);<BR> }<BR> disable();<BR> for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> if(inportb(DATA_PORT)!=6)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> else<BR> {<BR> enable();<BR> return(TRUE);<BR> }<BR> }</P><P> </P><P> <BR> int force_m_contact(unsigned uAddress,unsigned char ucOn_off)<BR> { int i;<BR> for(i=0;i<3;i++)<BR> if(_force_m_contact(uAddress,ucOn_off)==TRUE)<BR> return TRUE;<BR> return FALSE;<BR> }<BR> //返回頂部 </P><P> <BR> int _force_m_contact(unsigned uAddress,unsigned char ucOn_off)<BR> { unsigned uSend[]={2,0x37,0x30,0x30,0x30,0x30,3,0x30,0x30};<BR> unsigned uTmp,uSum,i;<BR> long lTmp;<BR> if(TESTING==1)return TRUE;<BR> init_plc();<BR> uAddress=uAddress+0x800;<BR> uSend[1]=ucOn_off;<BR> uTmp=uAddress&0x000f;<BR> uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>4)&0x000f;<BR> uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>8)&0x000f;<BR> uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>12)&0x000f;<BR> uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uSum=0;<BR> for(i=1;i<7;i++)<BR> uSum+=uSend[i];<BR> uTmp=uSum&0x000f;<BR> uSend[8]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uSum>>4)&0x000f;<BR> uSend[7]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> for(i=0;i<9;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&0x20)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> { <BR> enable();<BR> return(FALSE);<BR> }<BR> outportb(DATA_PORT,uSend[i]);<BR> }<BR> disable();<BR> for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> { <BR> enable();<BR> return(FALSE);<BR> }<BR> if(inportb(DATA_PORT)!=6)<BR> { <BR> enable();<BR> return(FALSE);<BR> }<BR> else<BR> { enable();<BR> return(TRUE);<BR> }<BR> }<BR> //返回頂部 </P><P> <BR> </P><P> int read_m_register(unsigned int uAddress,unsigned int number)<BR> { int i;<BR> for(i=0;i<3;i++)<BR> if(_read_m_register(uAddress,number)==TRUE)<BR> return TRUE;<BR> return FALSE;<BR> }<BR> //返回頂部 </P><P> <BR> int _read_m_register(unsigned int uAddress,unsigned int number)<BR> { unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};<BR> unsigned char uReceive[54];<BR> unsigned int uTmp;<BR> unsigned int uSum;<BR> unsigned int num;<BR> long lTmp;<BR> int i,j;<BR> if(TESTING==1)<BR> { for(i=0;i<number;i++)uRead_value[i]=0;<BR> return TRUE;<BR> }<BR> init_plc();<BR> num=number;<BR> if((num/16)>=10)<BR> uSend[6]=(unsigned char)(num/16+0x41-10);<BR> else<BR> uSend[6]=(unsigned char)(num/16+0x30);<BR> if((num%16)>=10)<BR> uSend[7]=(unsigned char)((num%16)+0x41-10);<BR> else<BR> uSend[7]=(unsigned char)((num%16)+0x30);<BR> uAddress=uAddress/8+0x100;<BR> uTmp=uAddress & 0x000f;<BR> uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>4) & 0x000f;<BR> uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>8) & 0x000f;<BR> uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uAddress>>12)&0x000f;<BR> uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uSum=0;<BR> for(i=1;i<9;i++)<BR> uSum=uSum+(unsigned char)uSend[i];<BR> uTmp=uSum&0x000f;<BR> uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> uTmp=(uSum>>4)&0x000f;<BR> uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);</P><P> for(i=0;i<11;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&0x20)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> /*enable();*/<BR> return(FALSE);<BR> }<BR> outportb(DATA_PORT,uSend[i]);<BR> }<BR> disable();<BR> <BR> <BR> for(lTmp=0;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> uReceive[0]=inportb(DATA_PORT);<BR> if(uReceive[0]!=2)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> for(i=1;i<number*2+4;i++)<BR> { for(lTmp=0L;lTmp<DELAY_TIMES;lTmp++)<BR> { if((inportb(STATS_PORT)&1)!=0)<BR> break;<BR> }<BR> if(lTmp>=DELAY_TIMES)<BR> {<BR> enable();<BR> return(FALSE);<BR> }<BR> uReceive[i]=inportb(DATA_PORT);<BR> }<BR> enable();<BR> uSum=0;<BR> for(i=1;i<number*2+2;i++)<BR> uSum=uSum+(unsigned int)uReceive[i];<BR> uTmp=uSum&0xf;<BR> uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> <BR> if((unsigned char)uTmp!=uReceive[number*2+3]) return(FALSE);<BR> uTmp=(uSum>>4)&0xf;<BR> uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);<BR> <BR> if((unsigned char)uTmp!=uReceive[number*2+2]) return(FALSE);<BR> for(j=0;j<number;j++)<BR> { for(i=j*2+1;i<j*2+3;i++)<BR> uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;<BR> uRead_value[j]=((uReceive[j*2+1])<<4)+uReceive[j*2+2];<BR> }<BR> return TRUE;<BR> }<BR> //返回頂部 </P><P> <BR> (本站下載區(qū)有源代碼下載。)
|
|
狀 態(tài):
離線
公司簡介
產(chǎn)品目錄
|
|
公司名稱:
|
中華工控網(wǎng)
|
聯(lián) 系 人: |
客服中心
|
電 話: |
0755-26546361
|
傳 真: |
0755-26585268 |
地 址: |
深圳市南山區(qū)創(chuàng)業(yè)路現(xiàn)代城華庭1棟6A |
郵 編: |
518054 |
主 頁: |
|
|
|
|
|