亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? read_reg.c

?? linux下的modbus協議,很好用,歡迎大家下載,在國外網站上獲得的
?? C
字號:
#include <fcntl.h>
#include <time.h>
#include <ctype.h>
#include <termio.h>
#include <stdio.h>

#define FALSE 0
#define TRUE 1


/***************************************************************************************
 *  This Program is a simple demo of how to read a table of 65 holding registers       *
 *  from a modicon 984 plc via an rs232 serial port using the Linux operating system   *
 *	please feel free to use and modify .                                               * 
 *	I have tested it on a free modicon plc simulator available from www.win-tech.com . * 
 *	Any comments to                                                                    *
 *	paul@pmcrae.freeserve.co.uk   (http://www.pmcrae.freeserve.co.uk)                  *
 *                                                                                     *
 ***************************************************************************************/



int set_up_comms(void);

unsigned int crc(unsigned char buf[],int start,int cnt);

int read_hold_reg(int slave, int com_port, int baud,char parity,
             int timeout,int offset,int num_regs,int *reg_table);

struct termio tnew,tsaved;
int ttyfd;               

int table[100];


int main()
{
  int result;
  int tabindex;
  
  /* setup communication parameters */

  set_up_comms();

  result = read_hold_reg(1,2,9600,'O',10,101,65,table);
  
  /* Read a table of 65 registers from plc address 1 holding register 400101 */

  if(result == FALSE) /* if no comms erros */
  {
    for(tabindex=0;tabindex < 66;tabindex++)       
      printf("%d\n",table[tabindex]);
  }
  
  ioctl(ttyfd,TCSETA,&tsaved);

  close(ttyfd);

  getchar();
  
  return 0;
}  
  


               
               
int read_hold_reg(int slave, int com_port, int baud,char parity,
               int timeout,int offset,int num_regs,int *reg_table)
    {
     
       int byte_count;
       int bytes_required;
       int bytes_received = 0;
       int function;
       unsigned short crc_calc = 0;
       unsigned short crc_received = 0;
       unsigned int temp;
       int i;
       int error_flag;
       unsigned char recv_crc_hi;
       unsigned char recv_crc_lo;      
       char rxchar = -1;
       unsigned char query[8];
       unsigned char recv[1024];
       unsigned char offset_hi;
       unsigned char offset_lo;
       unsigned char crc_hi;
       unsigned char crc_lo;
       unsigned char numreg_hi;
       unsigned char numreg_lo;
       time_t start;
       time_t finish;
       int diff_time;
       
       
      /****************** Initialise Variables  ***********************/
       
       offset = offset - 1;             /* split offset into hi & lo bytes */
       offset_hi = offset >> 8;
       offset_lo = offset & 0x00FF;
       
       function = 3;                    /* set code to read holding reg   */
       error_flag = FALSE;
       
       numreg_hi = num_regs >> 8;        /*split numregs int hi & lo bytes */
       numreg_lo = num_regs & 0x00FF; 
       
       bytes_required = 5 + (num_regs * 2);    /* two bytes per register read */
                                            /* plus 5 bytes header         */
                                            
                                                  
              
       query[0] = slave;       /* plc address */
       query[1] = function;    /* function code to read holding register */
       query[2] = offset_hi;   /* base address of register table Hi byte */
       query[3] = offset_lo;   /* base address of register table lo byte */
       query[4] = numreg_hi;   /* num of registers to read hi byte       */  
       query[5] = numreg_lo;   /* num of registers to read lo byte       */
       
       /* Calculate 16 bit CRC on query message */
       temp = crc(query,0,6);
       crc_hi = temp >> 8;
       crc_lo = temp & 0x00FF;
       
       query[6] = crc_hi;
       query[7] = crc_lo;
       query[8] = NULL;
       
 /****************************************************************/
       
       
 /******************** Communications Setup  *********************/       
                         
      /* ttyfd = setup_comms(com_port,baud,parity); */
      
      /* function to be finished when I've got time */     
       
 /****************************************************************/      
       
       
  /**************  send message to slave *************************/
       
       ioctl(ttyfd,TCFLSH,0);   /*  clear serial input  buffer */
       ioctl(ttyfd,TCFLSH,1);   /*  clear serial output buffer */
       
       write(ttyfd,query,8);    /*  send message to slave      */
       
       ioctl(ttyfd,TCFLSH,0);   /*  clear serial input  buffer */      
              
  /***************************************************************/     
       
       
  /*************  save time message was sent to slave*************/
         
       time(&start);
            
  /************** get slave response *****************************/
  
       bytes_received = 0;
  
        
       while(bytes_received < bytes_required)
       {         
         read(ttyfd,&rxchar,1);
         
         if (rxchar != -1)
         {
           recv[bytes_received] = rxchar;  
           printf("%s%d\n","char rx ",rxchar);
           bytes_received++;
           printf("%s%d\n","bytes received ",bytes_received);
         }  
         
         
                            
         time(&finish);
         
         diff_time = difftime(finish,start);
                       
         if(diff_time > timeout)
         {
           printf("timeout \n");
           error_flag = TRUE;
         }
       } /* end while */                               
               
                              
  /**************** Decode Response from Plc *******************/             
       
       /*********** check CRC of response ************/
       if(bytes_required == bytes_received)
       {
         crc_calc = crc(recv,0, bytes_received - 2);
       
         recv_crc_hi = (unsigned) recv[bytes_received -2];
         recv_crc_lo = (unsigned) recv[bytes_received -1];
       
         
         crc_received = recv[bytes_received -2];
         crc_received = (unsigned)  crc_received << 8;
         crc_received = crc_received | (unsigned) recv[bytes_received -1];
         
       
         if (crc_calc != crc_received)
         {
           printf("crc error \n");
           printf("%s%x\n","crc_received ",crc_received);
           printf("%s%x\n","crc_calc ",crc_calc);

           error_flag = TRUE;         
         }  
       }  
              
      /*********************************************/
      

      /********** check for exception response *****/
      
      if(bytes_received < bytes_required)
      {
        if (recv[1] != function)
        {
          printf("exception response \n");
          error_flag = TRUE;
        }    
      }
      
      /******** extract data part of message ******/

      
        
      if(error_flag == FALSE)
      {  
                     
        for(i = 0; i < num_regs; i++)
        {
          temp = recv[3 + i *2] << 8;     /* shift reg hi_byte to temp */
          temp = temp | recv[4 + i*2];    /* OR with lo_byte           */
        
          reg_table[i] = temp;
        }
       } 
      
      /********************************************/
      
      if(error_flag)
      {    
        return TRUE;
      }
      else
      {  
        return FALSE;
      }
      
     
 } 
 /*************************END OF READ_HOLD_REG**********************/
 
  
  
  
 
int set_up_comms( )
{


  ttyfd = open("/dev/ttyS1",O_RDWR);
  
  ioctl(ttyfd,TCGETA,&tsaved);
  
  tnew.c_line = 0;
  tnew.c_oflag &=~ OPOST;
  tnew.c_lflag &=~ ICANON;
  tnew.c_cflag &=~ CBAUD;
  tnew.c_cflag |= B9600;                     /* baud rate 9600 */
  tnew.c_cflag &=~ CSIZE;
  tnew.c_cflag |= CS8;                       /* 8 bits RTU */
  tnew.c_cflag |= (PARENB | PARODD);         /* odd parity */
  tnew.c_cflag |= CREAD;                     /* enable read */
  tnew.c_cflag |= CLOCAL;                    /* ignore modem lines */
  tnew.c_cc[VMIN] = 0;
  tnew.c_cc[VTIME] = 0;
  ioctl(ttyfd,TCSETA,&tnew);

}
 
  
  
  


/*
*****************************************************************************
***************************** [  BEGIN:  crc ] ******************************
*****************************************************************************
INPUTS:
   buf   ->  Array containing message to be sent to controller.
   start ->  Start of loop in crc counter, usually 0.
   cnt   ->  Amount of bytes in message being sent to controller/
OUTPUTS:
   temp  ->  Returns crc byte for message.
COMMENTS:
   This routine receives the data message to be sent down to the controller
and calculates the crc high and low byte of that message.
*****************************************************************************
*/
unsigned int crc(unsigned char buf[],int start,int cnt)
{
   int      i,j;
   unsigned temp,temp2,flag;

   temp=0xFFFF;

   for (i=start; i<cnt; i++){
      temp=temp ^ buf[i];

      for (j=1; j<=8; j++){
	 flag=temp & 0x0001;
	 temp=temp >> 1;
	 if (flag) temp=temp ^ 0xA001;
      }
   }

   /*
   ** Reverse byte order.
   */
   temp2=temp >> 8;
   temp=(temp << 8) | temp2;
   return(temp);
}
/*
************************** [ END:  crc ] ************************************
*/

  
/*******************************************************************************************
    Please Note  There should be a gap of at least 20ms between multiple modbus messages
	as comms errors can result this has been ommited for simplicity .
	I will try and find the time to correct this but the aim of this little project was
	to try and spark off other peoples interest in producing linux software for modbus
	and not to produce a perfect system as I don't have the time.
********************************************************************************************/
  
  
  
  
  
  
  
  
  
  
                
                 
                       

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线这里只有精品| 欧美一级xxx| 欧美精品在线观看播放| 久久久亚洲高清| 亚洲午夜免费视频| 国产一区二区精品久久99| 久久久不卡网国产精品二区| 亚洲在线观看免费视频| 国产精一品亚洲二区在线视频| 91国产福利在线| 欧美国产日韩在线观看| 日韩专区中文字幕一区二区| 99re成人精品视频| 日韩区在线观看| 午夜精品爽啪视频| 色综合天天综合网国产成人综合天| 久久无码av三级| 免费精品视频在线| 欧美精品色综合| 亚洲一级二级在线| 99久久夜色精品国产网站| 日韩女同互慰一区二区| 午夜精彩视频在线观看不卡| 色又黄又爽网站www久久| 国产亚洲欧美一区在线观看| 久久99国产精品免费| 欧美久久久久久蜜桃| 一区二区欧美精品| 色婷婷国产精品久久包臀 | 日本精品免费观看高清观看| 国产农村妇女毛片精品久久麻豆 | 亚洲色图一区二区三区| 成人性生交大片免费看视频在线| 精品盗摄一区二区三区| 久草精品在线观看| 日韩精品一区二区三区在线观看| 日本亚洲一区二区| 7777女厕盗摄久久久| 日本在线不卡一区| 欧美成人乱码一区二区三区| 免费在线观看一区| 欧美v国产在线一区二区三区| 久久成人久久鬼色| 久久久久免费观看| www.欧美亚洲| 伊人性伊人情综合网| 欧美在线免费视屏| 亚洲chinese男男1069| 欧美日本在线播放| 免费xxxx性欧美18vr| 日韩欧美国产综合一区| 久久99国产精品尤物| 日本一区二区三区免费乱视频 | 久久久久久免费毛片精品| 国产精品综合av一区二区国产馆| 国产欧美日韩精品在线| 99精品久久只有精品| 亚洲影视资源网| 欧美一区二区视频在线观看| 国产精品自拍三区| 亚洲日本中文字幕区| 欧美影院一区二区三区| 蜜臀久久99精品久久久久久9 | 国产精品一区二区视频| 国产精品乱人伦| 精品视频在线免费看| 免费在线看一区| 国产精品国产三级国产普通话蜜臀| 日本高清成人免费播放| 欧美最猛黑人xxxxx猛交| 日韩精品三区四区| 久久免费视频一区| 在线精品视频一区二区三四| 久久 天天综合| 一区二区在线电影| 久久免费的精品国产v∧| 欧美性色欧美a在线播放| 精品一区二区成人精品| 一区二区在线免费| 久久久99精品免费观看不卡| 欧美日韩在线一区二区| 国产成人精品综合在线观看 | 国产69精品久久久久777| 亚洲精品成人精品456| 2021中文字幕一区亚洲| 色婷婷国产精品| 国产精品亚洲一区二区三区在线| 一级精品视频在线观看宜春院| 精品国产免费人成在线观看| 欧洲亚洲精品在线| 国v精品久久久网| 美女在线视频一区| 亚洲一区中文在线| 中文字幕精品一区二区精品绿巨人| 91精品国产全国免费观看| 91麻豆免费看片| 懂色av噜噜一区二区三区av| 麻豆精品一二三| 亚洲高清视频的网址| 亚洲日韩欧美一区二区在线| 久久精品欧美日韩精品| 精品国产制服丝袜高跟| 欧美一区二区视频在线观看| 欧美日韩在线亚洲一区蜜芽| 色哟哟欧美精品| 99精品桃花视频在线观看| 国产成人免费视频精品含羞草妖精| 一本大道久久a久久综合婷婷| 国产高清亚洲一区| 国内精品免费**视频| 日本亚洲三级在线| 日本怡春院一区二区| 午夜精品免费在线| 亚洲大片免费看| 亚洲韩国一区二区三区| 亚洲女与黑人做爰| 亚洲免费资源在线播放| 亚洲柠檬福利资源导航| 亚洲免费av高清| 国产精品久久久久一区二区三区 | 国产成人综合在线| 国产精品538一区二区在线| 国产在线视频一区二区三区| 激情综合色丁香一区二区| 久久99久久精品| 国精品**一区二区三区在线蜜桃| 久久精品国产亚洲a| 极品美女销魂一区二区三区| 国产福利精品一区二区| 成人免费va视频| 91香蕉视频污在线| 91福利社在线观看| 在线不卡一区二区| 精品国精品国产| 国产精品美女久久久久av爽李琼| 日韩理论在线观看| 午夜精品久久久久久不卡8050| 美女国产一区二区三区| 国产乱理伦片在线观看夜一区| www.成人网.com| 欧美怡红院视频| 欧美电影免费观看高清完整版在线 | 日韩一级大片在线观看| 久久综合久色欧美综合狠狠| 国产精品人人做人人爽人人添| 亚洲视频一二三| 天天综合日日夜夜精品| 久草在线在线精品观看| av一本久道久久综合久久鬼色| 在线视频欧美精品| 日韩美女天天操| 日韩美女视频一区二区| 日韩精品91亚洲二区在线观看| 国产精品亚洲专一区二区三区| 96av麻豆蜜桃一区二区| 日韩手机在线导航| 国产精品久久久久影院老司| 亚洲mv大片欧洲mv大片精品| 国产一区二区三区黄视频 | 欧美日本一区二区在线观看| 久久亚洲精品国产精品紫薇| 亚洲免费伊人电影| 麻豆国产一区二区| 亚洲综合色噜噜狠狠| 欧美性猛交xxxx黑人交| 91精品在线一区二区| 国产亚洲1区2区3区| 亚洲成人午夜影院| 粉嫩av一区二区三区| 欧美精品aⅴ在线视频| 中文字幕av一区二区三区免费看| 亚州成人在线电影| 粉嫩在线一区二区三区视频| 日韩欧美视频在线| 亚洲理论在线观看| 国产精品91一区二区| 欧美性感一类影片在线播放| 日本一区二区动态图| 久久综合综合久久综合| 欧美性感一区二区三区| 国产精品精品国产色婷婷| 黄色资源网久久资源365| 欧美日韩国产区一| 亚洲免费观看高清完整版在线观看熊 | 国产超碰在线一区| 日韩欧美在线123| 午夜国产不卡在线观看视频| 色偷偷成人一区二区三区91 | 欧美一级黄色大片| 亚洲一区二区三区爽爽爽爽爽| 成人午夜av在线| 久久精品一级爱片| 久久国产尿小便嘘嘘尿| 91精品一区二区三区在线观看| 亚洲一级片在线观看| 一本到三区不卡视频| 自拍偷拍国产精品| 99久久99久久精品免费看蜜桃| 国产欧美日韩不卡| 国产福利一区二区三区视频在线|