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;
}