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

📄 k_modbus.c

📁 用于在线仪表的 modbus,仅供参考
💻 C
📖 第 1 页 / 共 2 页
字号:
       else if (lstat & LSTAT_BREAK_INT)
	  comerror = BREAK_ERROR;
      return(TRUE);
      case 0xc:
	while(inportb(REG_LSTAT) & LSTAT_DATA_READY)
	  {
	    chr = inportb(REG_RX);
	    putbuf(&inring, chr);
	  }
	return(TRUE);
   }
    inport(REG_LSTAT);
    inport(REG_MSTAT);
    inport(REG_RX);
  return(FALSE);        //this is really an error condition
}

/*-------------------------------------------------------------------------*/
void comput(unsigned char c)
{
 if(outring.count ||!(inportb(REG_LSTAT)&LSTAT_THRE))
     putbuf(&outring, c);  //add it to the output buffer
 else {
     outportb(REG_TX, c);
     send_num++;
   }
}

/*-------------------------------------------------------------------------*/
void computs(unsigned int put_date)
{
  static  unsigned char a[2]={0,0};
  if(put_date<=0xff) {
    a[0]=(unsigned char)put_date&0x00ff;
    a[1]=0;
    }
  if(put_date>0xff)  {
    a[1]=(unsigned char)((put_date>>8)&0x00ff);
    a[0]=(unsigned char)(put_date&0x00ff);
    }
  comput(a[1]);
  comput(a[0]);
}
/*-------------------------------------------------------------------------*/
unsigned int crc_check(unsigned char sys[],int no)
{
 const unsigned short NUM1=65535;
 const unsigned short NUM2=40961;
 unsigned int sum=NUM1;
 int n,i,j;
 for(i=0;i<no;i++)  {
    sum^=sys[i];
    for(j=0;j<=7;j++)
      { n=sum&1;
	if(n==1)
	  { sum>>=1;
	    sum^=NUM2;}
	else
	    sum>>=1;
    }
 }
 sum=sum>>8|sum<<8;
 return(sum);
}
static unsigned char comh[]={
 0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
 0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,
 0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,
 0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,
 0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,
 0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,
 0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,
 0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
 0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
 0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
 0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,
 0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
 0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
 0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x01,0xc0,
 0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,
 0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
 0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,
 0x40};
/******************table of crc value for low-order byte****************/
 static char coml[]={
 0x00,0xc0,0xc1,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,0x07,0xc7,0x05,0xc5,0xc4,
 0x04,0xcc,0x0c,0x0d,0xcd,0x0f,0xcf,0xce,0x0e,0x0a,0xca,0xcb,0x0b,0xc9,0x09,
 0x08,0xc8,0xd8,0x18,0x19,0xd9,0x1b,0xdb,0xda,0x1a,0x1e,0xde,0xdf,0x1f,0xdd,
 0x1d,0x1c,0xdc,0x14,0xd4,0xd5,0x15,0xd7,0x17,0x16,0xd6,0xd2,0x12,0x13,0xd3,
 0x11,0xd1,0xd0,0x10,0xf0,0x30,0x31,0xf1,0x33,0xf3,0xf2,0x32,0x36,0xf6,0xf7,
 0x37,0xf5,0x35,0x34,0xf4,0x3c,0xfc,0xfd,0x3d,0xff,0x3f,0x3e,0xfe,0xfa,0x3a,
 0x3b,0xfb,0x39,0xf9,0xf8,0x38,0x28,0xe8,0xe9,0x29,0xeb,0x2b,0x2a,0xea,0xee,
 0x2e,0x2f,0xef,0x2d,0xed,0xec,0x2c,0xe4,0x24,0x25,0xe5,0x27,0xe7,0xe6,0x26,
 0x22,0xe2,0xe3,0x23,0xe1,0x21,0x20,0xe0,0xa0,0x60,0x61,0xa1,0x63,0xa3,0xa2,
 0x62,0x66,0xa6,0xa7,0x67,0xa5,0x65,0x64,0xa4,0x6c,0xac,0xad,0x6d,0xaf,0x6f,
 0x6e,0xae,0xaa,0x6a,0x6b,0xab,0x69,0xa9,0xa8,0x68,0x78,0xb8,0xb9,0x79,0xbb,
 0x7b,0x7a,0xba,0xbe,0x7e,0x7f,0xbf,0x7d,0xbd,0xbc,0x7c,0xb4,0x74,0x75,0xb5,
 0x77,0xb7,0xb6,0x76,0x72,0xb2,0xb3,0x73,0xb1,0x71,0x70,0xb0,0x50,0x90,0x91,
 0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9c,0x5c,
 0x5d,0x9d,0x5f,0x9f,0x9e,0x5e,0x5a,0x9a,0x9b,0x5b,0x99,0x59,0x58,0x98,0x88,
 0x48,0x49,0x89,0x4b,0x8b,0x8a,0x4a,0x4e,0x8e,0x8f,0x4f,0x8d,0x4d,0x4c,0x8c,
 0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,
 0x40};
unsigned short crc16(unsigned char *sys,unsigned short datelen)
{
 unsigned char numh=0xff;
 unsigned char numl=0xff;
 unsigned index;
 while(datelen--)
  { index=numh^*sys++;
    numh=numl^comh[index];
    numl=coml[index];
   }
   return (numh<<8|numl);
 }

/*------------------------------------------------------------------------*/
void init_data()
{
 char c;
 int i;
 unsigned short int fvalve;
 char covdt(char no);
 unsigned short int  conc;
 extern struct peak_str peaka_bf[];
 extern struct peak_str peakb_bf[];
 extern struct ao_table ao_tab[];
 initbuf(&dataout, dataout_buf,BUFFER_SIZE);
/*-----------------------PGC-time----------------------------------*/
  //  for(i=0;i<20;i++)
    // peak[i]=300;
     putbuf1(&dataout,peak[0]);
     putbuf1(&dataout,peak[1]);
     putbuf1(&dataout,peak[2]);
     putbuf1(&dataout,peak[3]);
     putbuf1(&dataout,peak[4]);
     putbuf1(&dataout,peak[5]);
     putbuf1(&dataout,peak[6]);
     putbuf1(&dataout,peak[7]);
     putbuf1(&dataout,peak[8]);
     putbuf1(&dataout,peak[9]);
     putbuf1(&dataout,peak[10]);
     putbuf1(&dataout,peak[11]);
     putbuf1(&dataout,peak[12]);
     putbuf1(&dataout,peak[13]);
     putbuf1(&dataout,peak[14]);
     putbuf1(&dataout,peak[15]);
     putbuf1(&dataout,peak[16]);
     putbuf1(&dataout,peak[17]);
     putbuf1(&dataout,peak[18]);
     putbuf1(&dataout,peak[19]);
     putbuf1(&dataout,peak[20]);
    // for(i=0;i<80;i++)
 // putbuf1(&dataout,0x00);
    }
/*-------------------------------------------------------------------------*/
char covdt(char no)
 {
     extern char date_str[];
     extern char time_str[];
     unsigned char cc[2],ca;
     unsigned int ii;
     switch(no) {
       case 0:
	  cc[0]=date_str[3];
	  cc[1]=date_str[4];
	  ii=atoi(cc);
	  ca=(char)ii&0x00ff;
	  return(ca);
       case 1:
	  cc[0]=date_str[0];
	  cc[1]=date_str[1];
	  ii=atoi(cc);
	  ca=(char)ii&0x00ff;
	  return(ca);
       case 2:
	  cc[0]=date_str[8];
	  cc[1]=date_str[9];
	  ii=atoi(cc);
	  ca=(char)ii&0x00ff;
	  return(ca);
      case 3:
	  cc[0]=time_str[0];
	  cc[1]=time_str[1];
	  ii=atoi(cc);
	  ca=(char)ii&0x00ff;
	  return(ca);
      case 4:
	  cc[0]=time_str[3];
	  cc[1]=time_str[4];
	  ii=atoi(cc);
	  ca=(char)ii&0x00ff;
	  return(ca);
      case 5:
	  cc[0]=time_str[6];
	  cc[1]=time_str[7];
	  ii=atoi(cc);
	  ca=(char)ii&0x00ff;
	  return(ca);
    }
  return(TRUE);
 }
/*-------------------------------------------------------------------------*/
void v_get(long miliseconds)
 {
 unsigned int j,i,n,m;
 unsigned char func=0;//outchar[1024]={0};
 unsigned short crc=0;
 m=(ch[4]<<8|ch[5]);
 n=(ch[2]<<8|ch[3]);
if((inportb(REG_MCONT)&0x02)==0x02){
initbuf(&outring, out_buf,BUFFER_SIZE );

//2 setbreak(miliseconds);
 send_num=0;
 func=ch[1];
// switch(func)
  //   {
    //  case 3:
      //	  {
	   init_data();
	   outchar[0]=ch[0];
	   outchar[1]=ch[1];
	   outchar[2]=m*2;
	   for(i=0;i<m*2;i++)
	     outchar[3+i]=dataout.buffer[n+i];
	   crc=crc_check(outchar,m*2+3);
	   comput(outchar[0]);
	   comput(outchar[1]);
	   comput(outchar[2]);
	 for(j=0,i=0;i<m*2;i++,j++)
	     {
	     // outchar[3+j]=dataout.buffer[n+i];
	      comput(dataout.buffer[n+i]);//outchar[3+j]);
	      }
	     // crc=crc_check(outchar,m*2+3);
	      computs(crc);

	// break;
	  //   }
      /*	case 4:
		 {
	   init_data();
	   outchar[0]=ch[0];
	   outchar[1]=ch[1];
	   outchar[2]=m*2;
	   comput(outchar[0]);
	   comput(outchar[1]);
	   comput(outchar[2]);
	 for(j=0,i=0;i<m*2;i++,j++)
	     {
	      outchar[3+j]=dataout.buffer[n+i];
	      comput(outchar[3+j]);
	      }
	      crc=crc_check(outchar,m*2+3);
	      computs(crc);
	 break;
	 }
	}*/
	for(;;){
	 if((send_num>=m*2+5)&&(inportb(REG_LSTAT)&0x40)) {
	  //setbreak(miliseconds);
	  mcont=inportb(REG_MCONT);
	  mcont=mcont&0xfd;
	  disable();
	  outportb(REG_MCONT,mcont);
	  outportb(REG_INT_EN,0x0d);
	  enable();
	  send_num=0;
	  send_flag=FALSE;
	  break;}
	  }
      // for(i=0;i<10;i++)
       //	ch[i]=0;

       initbuf(&inring, in_buf,BUFFER_SIZE);
       initbuf(&outring, out_buf,BUFFER_SIZE );
       initbuf(&dataout, datain_buf,BUFFER_SIZE);
      // com_buffers(FALSE, BUFFER_SIZE, BUFFER_SIZE);
	   // free(in_buf);
	   // free(out_buf);
	   // free(dataout_buf);
	   // free(datain_buf);


    }
 }


/*---------------------------------------------------------------------*/
void self(long milisecods)
{
int n=0,i=0;
unsigned char c;

unsigned short int modcheck=0;
long  rcv_time=0l,start_time=0l;
if(inring.count==0)     return;
initbuf(&datain, datain_buf,BUFFER_SIZE);
//initbuf(&inring, in_buf,BUFFER_SIZE);

start_time=ReadTime();
while(rcv_time<=milisecods){
 //  while(n<=7){
 rcv_time=ReadTime()-start_time;
  if(getbuf(&inring, &c))
     {
      putbuf(&datain,c);
  //   n++ ;
    start_time=ReadTime();
     }
   }
  for(i=0;i<8;i++)
    getbuf(&datain, &ch[i]);
    modcheck=(ch[6]<<8)|ch[7];
  if((ch[0]==com_param.ipadd)&&(modcheck==crc_check(ch,6)))//{
     { mcont=inportb(REG_MCONT);
     mcont=mcont|0x02;
     disable();
     outportb(REG_MCONT,mcont);
     outportb(REG_INT_EN,0x0a);
     enable();
     send_flag=TRUE;
    }
   initbuf(&inring, in_buf,BUFFER_SIZE);
   initbuf(&outring, out_buf,BUFFER_SIZE );
   initbuf(&datain, datain_buf,BUFFER_SIZE);

   }

int IdleFunction(void)
  {
    return(TRUE);
  }
long ReadTime(void)
  {
     union REGS r;
     long milliseconds;
     r.h.ah=0x2c;
     int86(0x21,&r,&r);
     milliseconds=(long)r.h.dl*10;
     milliseconds=milliseconds+(long)r.h.dh*1000;
     milliseconds=milliseconds+(long)r.h.cl*6000l;
     milliseconds=milliseconds+(long)r.h.ch*3600000l;
     return(milliseconds);
   }
void setbreak(long milliseconds)
  {
     int IdleFunction(void);
     int lcr;
     long timer=0l;
     timer=ReadTime()+milliseconds;
     while(ReadTime()<timer)
	 IdleFunction();
  }

⌨️ 快捷键说明

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