三菱PLC编程口通信C语言源代码
三菱(Mitsubishi)PLC, 三菱(Mitsubishi)触摸屏 三菱plc编程软件 三菱(Mitsubishi)伺服
fxnew.h
n#define DELAY_TIMES 30000L
n#define TRUE 1
n#define FALSE 0
#define TRUE 1
n#define FALSE 0
#define FORCE_ON 0x37
n#define FORCE_OFF 0x38
void init_plc(void);
nint check_plc(void);
nint _read_data_register(unsigned int uAddress,unsigned int number);
nint _read_mdata_register(unsigned int uAddress,unsigned int number);
nint _write_data_register(unsigned int uAddress,unsigned int number);
nint _force_m_contact(unsigned int uAddress,unsigned char ucOn_off);
nint read_data_register(unsigned int uAddress,unsigned int number);
nint read_mdata_register(unsigned int uAddress,unsigned int number);
nint write_data_register(unsigned int uAddress,unsigned int number);
nint force_m_contact(unsigned int uAddress,unsigned char ucOn_off);
nint _read_m_register(unsigned int uAddress,unsigned int number);
nint read_m_register(unsigned int uAddress,unsigned int number);
int TESTING=0;
nunsigned int uRead_value[25];
nunsigned int uWrite_value[25];
unsigned int COMM_PORT=1;
nunsigned int STATS_PORT=0x2fd;
nunsigned int DATA_PORT=0x2f8;
void init_plc(void)
n{ _AX=0xfa;
n _DX=COMM_PORT;
n geninterrupt(0x14);
n while((inportb(STATS_PORT)&1)!=0)inportb(DATA_PORT);
n}
nint check_plc(void)
n{ long lTmp;
if(TESTING==1)return TRUE;
n init_plc();
n for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&0x20)!=0)
n break;
n }
if(lTmp>=DELAY_TIMES)
n return(FALSE);
outportb(DATA_PORT,5);
n disable();
n for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n { enable();
n return(FALSE);
n }
if((lTmp=inportb(DATA_PORT))==6)
n { enable();
n return(TRUE);
n }
n else
n { enable();
n return(FALSE);
n }
n}
nint read_data_register(unsigned int uAddress,unsigned int number)
n{ int i;
n for(i=0;i<3;i++)
n if(_read_data_register(uAddress,number)==TRUE)
n return TRUE;
n return FALSE;
n}
nint _read_data_register(unsigned int uAddress,unsigned int number)
n{ unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};
n unsigned char uReceive[104];
n unsigned int uTmp;
n unsigned int uSum;
n unsigned int num;
n long lTmp;
n int i,j;
if(TESTING==1)
n { for(i=0;i
n return TRUE;
n }
init_plc();
n num=number*2;
n if((num/16)>=10)
n uSend[6]=(unsigned char)(num/16+0x41-10);
n else
n uSend[6]=(unsigned char)(num/16+0x30);
n if((num%16)>=10)
n uSend[7]=(unsigned char)((num%16)+0x41-10);
n else
n uSend[7]=(unsigned char)((num%16)+0x30);
uAddress=uAddress*2+0x1000;
n uTmp=uAddress & 0x000f;
n uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>4) & 0x000f;
n uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>8) & 0x000f;
n uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>12)&0x000f;
n uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
uSum=0;
n for(i=1;i<9;i++)
n uSum=uSum+(unsigned char)uSend[i];
n uTmp=uSum&0x000f;
n uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uSum>>4)&0x000f;
n uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n for(i=0;i<11;i++)
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&0x20)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n
n return(FALSE);
n }
outportb(DATA_PORT,uSend[i]);
n }
n disable();
n for(lTmp=0;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n uReceive[0]=inportb(DATA_PORT);
n if(uReceive[0]!=2)
n {
n enable();
n return(FALSE);
n }
n for(i=1;i
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n uReceive[i]=inportb(DATA_PORT);
n }
n enable();
n uSum=0;
n for(i=1;i
n uSum=uSum+(unsigned int)uReceive[i];
n uTmp=uSum&0xf;
n uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n if((unsigned char)uTmp!=uReceive[number*4+3])return(FALSE);
n uTmp=(uSum>>4)&0xf;
n uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n if((unsigned char)uTmp!=uReceive[number*4+2])return(FALSE);
n for(j=0;j
n { for(i=j*4+1;i
n uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;
n uRead_value[j]=(((((uReceive[j*4+3]<<4)+uReceive[j*4+4])<<4)+uReceive[j*4+1])<<4)+uReceive[j*4+2];
n }
n return TRUE;
n}
nint read_mdata_register(unsigned int uAddress,unsigned int number)
n{ int i;
n for(i=0;i<3;i++)
n if(_read_mdata_register(uAddress,number)==TRUE)
n return TRUE;
n return FALSE;
n}
nint _read_mdata_register(unsigned int uAddress,unsigned int number)
n{ unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};
n unsigned char uReceive[104];
n unsigned int uTmp;
n unsigned int uSum;
n unsigned int num;
n long lTmp;
n int i,j;
if(TESTING==1)
n { for(i=0;i
n return TRUE;
n }
init_plc();
n num=number*2;
n if((num/16)>=10)
n uSend[6]=(unsigned char)(num/16+0x41-10);
n else
n uSend[6]=(unsigned char)(num/16+0x30);
n if((num%16)>=10)
n uSend[7]=(unsigned char)((num%16)+0x41-10);
n else
n uSend[7]=(unsigned char)((num%16)+0x30);
/*uAddress=uAddress*2+0x1000;*/
n uTmp=uAddress & 0x000f;
n uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>4) & 0x000f;
n uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>8) & 0x000f;
n uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>12)&0x000f;
n uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
uSum=0;
n for(i=1;i<9;i++)
n uSum=uSum+(unsigned char)uSend[i];
n uTmp=uSum&0x000f;
n uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uSum>>4)&0x000f;
n uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
for(i=0;i<11;i++)
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&0x20)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n
n return(FALSE);
n }
outportb(DATA_PORT,uSend[i]);
n }
n disable();
n for(lTmp=0;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n uReceive[0]=inportb(DATA_PORT);
n if(uReceive[0]!=2)
n {
n enable();
n return(FALSE);
n }
n for(i=1;i
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n uReceive[i]=inportb(DATA_PORT);
n }
n enable();
n uSum=0;
n for(i=1;i
n uSum=uSum+(unsigned int)uReceive[i];
n uTmp=uSum&0xf;
n uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n if((unsigned char)uTmp!=uReceive[number*4+3])return(FALSE);
n uTmp=(uSum>>4)&0xf;
n uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n if((unsigned char)uTmp!=uReceive[number*4+2])return(FALSE);
n for(j=0;j
n { for(i=j*4+1;i
n uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;
n uRead_value[j]=(((((uReceive[j*4+3]<<4)+uReceive[j*4+4])<<4)+uReceive[j*4+1])<<4)+uReceive[j*4+2];
n }
n return TRUE;
n}
nint write_data_register(unsigned int uAddress,unsigned int number)
n{ int i;
n for(i=0;i<3;i++)
n if(_write_data_register(uAddress,number)==TRUE)
n return TRUE;
n return FALSE;
n}
nint _write_data_register(unsigned int uAddress,unsigned int number)
n{ unsigned char uSend[111];
n unsigned int uTmp,uSum,num;
n long lTmp;
int i;
nif(TESTING==1)return TRUE;
n
n init_plc();
n uSend[0]=2;
n uSend[1]=0x31;
n uSend[number*4+8]=3;
n num=(number*2)/16;
n if(num>=10)uSend[6]=num+0x41-10;
n else uSend[6]=num+0x30;
n num=(number*2)%16;
n if(num>=10)uSend[7]=num+0x41-10;
n else uSend[7]=num+0x30;
uAddress=0x1000+2*uAddress;
n uTmp=uAddress&0x000f;
n uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>4)&0x000f;
n uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>8)&0x000f;
n uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>12)&0x000f;
n uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
for(i=0;i
n {
n uTmp=uWrite_value[i]&0x000f;
n uSend[i*4+9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uWrite_value[i]>>4)&0x000f;
n uSend[i*4+8]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uWrite_value[i]>>8)&0x000f;
n uSend[i*4+11]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uWrite_value[i]>>12)&0x000f;
n uSend[i*4+10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n }
uSum=0;
n for(i=1;i<9+number*4;i++)
n uSum+=uSend[i];
n uTmp=uSum&0x000f;
n uSend[number*4+10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uSum>>4)&0x000f;
n uSend[number*4+9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n for(i=0;i<11+number*4;i++)
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&0x20)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n /*enable();*/
n return(FALSE);
n }
n outportb(DATA_PORT,uSend[i]);
n }
n disable();
for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n if(inportb(DATA_PORT)!=6)
n {
n enable();
n return(FALSE);
n }
n else
n {
n enable();
n return(TRUE);
n }
}
nint force_m_contact(unsigned uAddress,unsigned char ucOn_off)
n{ int i;
n for(i=0;i<3;i++)
n if(_force_m_contact(uAddress,ucOn_off)==TRUE)
n return TRUE;
n return FALSE;
n}
nint _force_m_contact(unsigned uAddress,unsigned char ucOn_off)
n{ unsigned uSend[]={2,0x37,0x30,0x30,0x30,0x30,3,0x30,0x30};
n unsigned uTmp,uSum,i;
n long lTmp;
n if(TESTING==1)return TRUE;
init_plc();
n uAddress=uAddress+0x800;
n uSend[1]=ucOn_off;
n uTmp=uAddress&0x000f;
n uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>4)&0x000f;
n uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>8)&0x000f;
n uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>12)&0x000f;
n uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uSum=0;
n for(i=1;i<7;i++)
n uSum+=uSend[i];
n uTmp=uSum&0x000f;
n uSend[8]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uSum>>4)&0x000f;
n uSend[7]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
for(i=0;i<9;i++)
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&0x20)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n outportb(DATA_PORT,uSend[i]);
n }
n disable();
for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n if(inportb(DATA_PORT)!=6)
n {
n enable();
n return(FALSE);
n }
n else
n { enable();
n return(TRUE);
n }
n}
nint read_m_register(unsigned int uAddress,unsigned int number)
n{ int i;
n for(i=0;i<3;i++)
n if(_read_m_register(uAddress,number)==TRUE)
n return TRUE;
n return FALSE;
n}
nint _read_m_register(unsigned int uAddress,unsigned int number)
n{ unsigned char uSend[]={2,0x30,0x30,0x30,0x30,0x30,0x30,0x32,3,0x30,0x30};
n unsigned char uReceive[54];
n unsigned int uTmp;
n unsigned int uSum;
n unsigned int num;
n long lTmp;
n int i,j;
if(TESTING==1)
n { for(i=0;i
n return TRUE;
n }
init_plc();
n num=number;
n if((num/16)>=10)
n uSend[6]=(unsigned char)(num/16+0x41-10);
n else
n uSend[6]=(unsigned char)(num/16+0x30);
n if((num%16)>=10)
n uSend[7]=(unsigned char)((num%16)+0x41-10);
n else
n uSend[7]=(unsigned char)((num%16)+0x30);
uAddress=uAddress/8+0x100;
n uTmp=uAddress & 0x000f;
n uSend[5]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>4) & 0x000f;
n uSend[4]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>8) & 0x000f;
n uSend[3]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uAddress>>12)&0x000f;
n uSend[2]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
uSum=0;
n for(i=1;i<9;i++)
n uSum=uSum+(unsigned char)uSend[i];
n uTmp=uSum&0x000f;
n uSend[10]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n uTmp=(uSum>>4)&0x000f;
n uSend[9]=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n for(i=0;i<11;i++)
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&0x20)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n /*enable();*/
n return(FALSE);
n }
outportb(DATA_PORT,uSend[i]);
n }
n disable();
n
for(lTmp=0;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n uReceive[0]=inportb(DATA_PORT);
n if(uReceive[0]!=2)
n {
n enable();
n return(FALSE);
n }
n for(i=1;i
n { for(lTmp=0L;lTmp
n { if((inportb(STATS_PORT)&1)!=0)
n break;
n }
n if(lTmp>=DELAY_TIMES)
n {
n enable();
n return(FALSE);
n }
n uReceive[i]=inportb(DATA_PORT);
n }
n enable();
uSum=0;
n for(i=1;i
n uSum=uSum+(unsigned int)uReceive[i];
n uTmp=uSum&0xf;
n uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n if((unsigned char)uTmp!=uReceive[number*2+3])return(FALSE);
n uTmp=(uSum>>4)&0xf;
n uTmp=(uTmp<10)?(uTmp+0x30):(uTmp+0x41-0xa);
n if((unsigned char)uTmp!=uReceive[number*2+2])return(FALSE);
n for(j=0;j
n { for(i=j*2+1;i
n uReceive[i]=(uReceive[i]>0x39)?uReceive[i]-0x41+0xa:uReceive[i]-0x30;
n uRead_value[j]=((uReceive[j*2+1])<<4)+uReceive[j*2+2];
n }
n return TRUE;
n}
n
相关关键词:三菱PLC,三菱PLC编程口通信,三菱PLC通信C语言