• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于Modbus協(xié)議ARM農(nóng)田服務器的設計

      2014-06-28 11:10:02袁福營,史智興
      湖北農(nóng)業(yè)科學 2014年7期
      關鍵詞:現(xiàn)代農(nóng)業(yè)

      袁福營,史智興(等)

      摘要:將Modbus協(xié)議應用到農(nóng)業(yè)信息化領域,設計了一種基于Modbus協(xié)議的嵌入式農(nóng)田信息采集服務器。分析了Modbus協(xié)議,設計了系統(tǒng)各模塊之間的數(shù)據(jù)通信接口,ARM服務器與應用層采用Modbus/TCP通信完成用戶的查詢,ARM服務器與數(shù)據(jù)采集層采用Modbus串口通信進行數(shù)據(jù)的存儲,提出了Modbus/TCP幀與串行鏈路RTU幀的轉換方法,實現(xiàn)了應用層與數(shù)據(jù)采集層的實時通信,提高了系統(tǒng)的有效性和可靠性。

      關鍵詞:現(xiàn)代農(nóng)業(yè);嵌入式服務器;農(nóng)田信息采集;Modbus

      中圖分類號:TP274 文獻標識碼:A 文章編號:0439-8114(2014)07-1667-04

      Modbus Protocol Based Designs of ARM Farmland Server

      YUAN Fu-ying,SHI Zhi-xing,JING Li-wei,ZHANG Yi-jun

      (College of Information Science and Technology, Agricultural University of Hebei, Baoding 071000, Hebei, China)

      Abstract: Modbus protocol was applied in the farmland information collection system and a preliminary design of an embedded farmland information collection server based on Modbus protocol was presented. ARM server using Modbus/TCP to communicate with the application layer for completing the users query, and ARM server using seriallink to communicate with data acquisition layer for data storage were analyzed. The conversion of Modbus/TCP frame with serial link RTU frame was proposed to realize the communication for the application layer and the data acquisition layer. The design improved the effectiveness and reliability of the system.

      Key words: modern agriculture; embedded server; farmland information acquisition; Modbus

      隨著現(xiàn)代農(nóng)業(yè)的推動,信息技術正在迅速滲透到農(nóng)業(yè)的各個領域。采用農(nóng)業(yè)信息化技術,對大田種植、設施園藝和水產(chǎn)養(yǎng)殖等農(nóng)業(yè)生產(chǎn)的各種要素進行信息采集,進一步實行數(shù)字化設計、智能化控制、科學化管理,大大提高了農(nóng)業(yè)生產(chǎn)的標準化、自動化、產(chǎn)業(yè)化,促進了農(nóng)業(yè)生產(chǎn)的高產(chǎn)、高效、生態(tài)和安全。信息采集技術成為了實現(xiàn)農(nóng)業(yè)信息化的必不可少的前提。

      在工業(yè)自動化領域中,控制系統(tǒng)普遍采用Modbus通訊協(xié)議[1]。陸晶[2]設計了一種基于Modbus協(xié)議的電廠數(shù)據(jù)采集系統(tǒng),提高了數(shù)據(jù)采集的精確性和穩(wěn)定性。任清娟[3]針對煉鐵廠的高爐渣粒化工廠,采用Modbus通訊協(xié)議達到了對現(xiàn)場設備遠程實時監(jiān)控的目的。林勇堅[4]將Modbus現(xiàn)場總線應用到水處理流程控制工程項目中,解決了傳統(tǒng)現(xiàn)場總線布線量大、傳輸精度低、信號易受干擾等問題。但是Modbus協(xié)議在農(nóng)業(yè)信息化領域的應用尚且不足,為此,將Modbus協(xié)議應用到農(nóng)業(yè)信息化領域,設計一種基礎Modbus協(xié)議的嵌入式農(nóng)田信息采集服務器。

      1 基于Modbus協(xié)議ARM農(nóng)田服務器的整體設計

      農(nóng)田信息采集系統(tǒng)主要包括數(shù)據(jù)采集層、數(shù)據(jù)處理控制層、應用層。系統(tǒng)的體系結構如圖1所示。在數(shù)據(jù)采集層,數(shù)據(jù)傳感器采集田間CO2濃度、空氣濕度、光照度等田間參數(shù),經(jīng)過一系列數(shù)據(jù)處理之后將采集的數(shù)據(jù)信息匯總通過串口RS485上傳至數(shù)據(jù)處理控制層。服務器接收到田間信息數(shù)據(jù),進行存儲??蛻舳丝赏ㄟ^瀏覽器訪問服務器瀏覽田間信息,也可采用C/S的Windows客戶端訪問服務器讀取田間信息。

      2 服務器到應用層的通信

      設計的ARM服務器使用Linux系統(tǒng)采用Modbus協(xié)議,服務器與客戶端通信采用Modbus/TCP,服務器與數(shù)據(jù)采集層通信采用Modbus串口。Modbus/TCP是可靠連接,保證了客戶端與服務器的有效實時通信。服務器與數(shù)據(jù)采集層通過串口通信,故可將ARM服務器放置于田間,解決了傳統(tǒng)服務器必須放置于室內的問題。

      Modbus屬于應用層報文傳輸協(xié)議,用于不同類型的總線或網(wǎng)絡連接的設備之間的客戶端/服務器通信[5]。數(shù)據(jù)通訊采用一對多的主從查詢模式。主站可以單獨與從機通信,也可以廣播方式和所有從站通信。主站以廣播方式查詢,則從站不做出回應[6]。Modbus/TCP采用以太網(wǎng)技術(IEEE802.3)以一種簡單的方式將Modbus幀嵌入到TCP/IP協(xié)議幀中,在物理層傳輸[7]。Modbus/TCP在TCP/IP上使用專用MBAP報文頭,MBAP報文頭包括傳輸標志(Transaction Identifier)、協(xié)議標志(Protocol Identifier)、長度域(Length)、單元標志(Unit Identifier)。Protocol Identifier為0時,表明是Modbus協(xié)議。Unit Identifier用來定義從站的設備地址。Modbus/TCP是可靠連接,因此在Modbus/TCP中不存在校驗碼。Modbus/TCP數(shù)據(jù)幀格式如圖2所示。

      Modbus有ASCII和RTU兩種串行傳輸方式。ASCII模式通過冒號、回車字符判定數(shù)據(jù)幀的起始和結束,采用LRC 數(shù)據(jù)檢驗。消息中的每一個8位字節(jié)作為2個ASCII字符傳輸。ASCII幀字符之間的最大間隔為1 s,超過1 s則默認發(fā)送錯誤。RTU模式消息中的每一個8位字節(jié)含有兩個4位的16進制的字符傳輸,因此在相同的波特率下其具有更高的數(shù)據(jù)量[8]。RTU 模式中數(shù)據(jù)以非壓縮 BCD 碼表示,通過時間標記實現(xiàn)數(shù)據(jù)幀起始判定,采用CRC數(shù)據(jù)校驗,具有數(shù)據(jù)吞吐量高、傳輸穩(wěn)定、通信效率高的優(yōu)點[9]。此次設計采用了RTU傳輸方式,RTU報文格式如表1所示。

      2.1 服務器到應用層的通信實現(xiàn)

      Modbus客戶端根據(jù)用戶應用向Modbus客戶機接口發(fā)送的要求中所包含的參數(shù)來建立一個Modbus/TCP請求。Modbus服務器一直處于監(jiān)聽TCP502端口的狀態(tài),當檢測到有Modbus請求的時候,經(jīng)過TCP 3次握手連接成功。服務器接收到Modbus請求幀之后,首先進行幀解析,完成事務處理,然后向用戶發(fā)送返回幀。Modbus服務器處理的事件主要有:等待Modbus/TCP連接、接收請求幀、處理應答、處理差錯等。Modbus服務器與客戶端通信流程如圖3所示。

      作為通信服務器端,首先初始化并建立通信socket,bind()本地IP和端口與socket相連,并使用listen方法將其設置為偵聽模式。當Modbus客戶機需要對服務器進行查詢時,首先會向Modbus服務器網(wǎng)關的502端口發(fā)起連接請求,服務器監(jiān)聽到請求與之建立TCP連接后,客戶機發(fā)送Modbus/TCP請求幀并等待響應。服務器收到Modbus客戶機的請求幀,首先進行Modbus PDU處理,依次分析處理消息幀結構,根據(jù)功能碼進行事務處理,并將事物處理結果封裝成Modbus/TCP應答幀,返回至Modbus客戶機,然后斷開連接等待下一次的連接請求。

      程序中最核心的Modbus類的主要方法的聲明如下:

      class CModBus

      {

      public:

      void Connect(const char*ip,ushort port);

      void ReadHoldingRegistersFun(ushort strAddress,ushortnumInputs);

      void WriteMultipleRegistersFun(ushort straddress,int*ptrValue,int nLen);

      void WriteSingleRegistersFun(ushort address,ushort Data);

      private:

      void CreateReadHeader(ushort startReadAddress,ushort lenght,unsigned char function);

      void CreateWriteHeader(ushort starAddaress,ushort len,unsigned char function);

      void CRCChick(unsigned char*messageDate,int nLen);

      void WriteAsyncDate(unsigned char*pWriteDate,int nDataLen);

      void TransformParamDateFun(int len,unsigned char*Data);

      void TransformControlDateFun(int len,unsigned char*Data);

      void RecvReadData();

      ……}

      Modbus類中Connect()實現(xiàn)服務器與客戶端socket的連接,ReadHoldingRegistersFun()用來發(fā)送客戶端讀取數(shù)據(jù)的結果,WriteSingleRegistersFun()、WriteMultipleRegistersFun()分別實現(xiàn)寫單個寄存器和寫多個寄存器。CreateReadHeader()、CreateWriteHeader()分別創(chuàng)建Modbus讀寫寄存器幀的頭部數(shù)據(jù),WriteAsyncDate()將數(shù)據(jù)寫入到socket。TransformControlDateFun()、TransformParamDateFun()轉換讀取控制、參數(shù)數(shù)據(jù)。RecvReadData()從連接套接字中讀取信息。

      服務器向客戶端發(fā)送回應結果,首先調用ReadHoldingRegistersFun(),通過執(zhí)行CreateReadWriteHeader()填寫RTU數(shù)據(jù)幀信息,然后WriteAsyncDate()向緩沖區(qū)用SendData發(fā)送數(shù)據(jù)。具體實現(xiàn)程序如下:

      void CModBus::ReadHoldingRegistersFun(usho

      rt strAddress,ushort numInputs){

      CreateReadWriteHeader(strAddress,numInputs,ReadHoldingRegisters);

      WriteAsyncDate(SendDate,READ_REGISTERS_HEA

      DER_LEN);

      }

      void CModBus::WriteAsyncDate(unsigned char *pWriteDate,int nDataLen)

      {

      if(nSocket>0&&nConnect>=0)

      {

      FD_SET(nSocket,&set);

      neSlect=select(nSocket+1,NULL,&set,NULL,&tv);if(neSlect>0)

      {

      nSend=send(nSocket,(char*)pWriteDate,nDataLen,0);

      }

      if(nDataLen==READ_REGISTERS_HEAD

      ER_LEN)

      {

      RecvReadData();

      }

      else

      {

      RecvWriteReturn();

      }

      }

      FD_ZERO(&set);

      }

      若客戶端要讀取06號設備起始地址為4的連續(xù)2個寄存器,讀取保持寄存器的功能碼function為3。服務器通信結果見圖4。

      2.2 Modbus/TCP幀與RTU幀轉換設計

      當客戶端需要查詢當前的實時數(shù)據(jù),而服務器還未進行存儲,客戶端向服務器發(fā)送Modbus/TCP請求幀并等待服務器應答,服務器接收Modbus/TCP請求幀對其進行分析處理,轉化成Modus RTU串行鏈路響應幀并發(fā)送到與數(shù)據(jù)采集層相連的串行鏈路中去,監(jiān)聽等待數(shù)據(jù)采集層的應答。若服務器收到串行鏈路上的RTU應答幀,則將該應答幀重新封裝成Modbus/TCP應答幀,發(fā)送給客戶端。因此,在服務器端需要進行Modbus/TCP與串行鏈路RTU的轉換。

      ModToRtu()函數(shù)實現(xiàn)Modbus/TCP幀與串行鏈路RTU幀的轉換功能,轉換過程見圖5。

      Modbus/TCP幀與串行鏈路RTU幀相比,增加了MBAP報文,減少了CRC校驗碼。Modbus/TCP轉串行鏈路RTU過程:首先從MBAP報文頭中解析出地址段,并將MBAP的各字段保存。然后從Modbus/TCP幀中分別解析出功能碼和數(shù)據(jù)段,并計算CRC校驗碼,最后封裝成串行鏈路RTU幀。

      串行鏈路RTU幀轉換成Modbus/TCP幀:首先利用已保存MBAP字段重新封裝成MBAP,然后從RTU幀中讀取數(shù)據(jù)段和功能碼,分別填充到Modbus/TCP幀的數(shù)據(jù)段和功能碼,封裝成Modbus/TCP幀。

      2.3 線程池

      在服務器整個工作過程中,系統(tǒng)通過線程與客戶端和與數(shù)據(jù)采集層進行通信。傳統(tǒng)多線程方案的服務器,多個線程在同一時間內并發(fā)運行執(zhí)行相應的任務[10],采用“及時創(chuàng)建,及時銷毀”的策略。當服務器接收到請求之后創(chuàng)建一個線程,由該線程執(zhí)行具體任務,任務結束之后線程退出。若大量用戶同時訪問服務器,在短時間內,服務器將處于不停地創(chuàng)建線程、銷毀線程的狀態(tài),容易導致消耗系統(tǒng)內存。因此,系統(tǒng)增加了線程池,大大減少了線程的開銷。

      線程池采用預創(chuàng)建技術。程序啟動之后,首先創(chuàng)建一定數(shù)量(NUM個)的線程,這些線程處于阻塞狀態(tài),并不消耗CPU。當系統(tǒng)有任務需要執(zhí)行時,程序喚醒一個空閑線程執(zhí)行任務。任務完成之后,該線程再次回到阻塞狀態(tài),等待下次任務的到來。在線程池的數(shù)量設計上,程序所創(chuàng)建的線程總數(shù)不能高于THREAD_MAXNUM,當系統(tǒng)中的空閑線程數(shù)量低于THREAD_Max時,程序將創(chuàng)建一些線程,使得空閑線程維持在THREAD_AvailLow之上。當系統(tǒng)中的空閑線程數(shù)量高于THREAD_AvailHigh時,線程池會自動銷毀一些線程,保持空閑線程的數(shù)量在一個合理的范圍內。

      3 服務器到數(shù)據(jù)采集層的通信

      服務器通過串口定期向數(shù)據(jù)采集層發(fā)送RTU請求幀,并等待接收數(shù)據(jù)采集層的RTU返回幀,將收到的農(nóng)田信息存儲在數(shù)據(jù)庫中。

      服務器端首先打開串口,調用CreatData()準備要發(fā)送的請求數(shù)據(jù),執(zhí)行CreatCRC()生成函數(shù)獲取CRC校驗碼,通過CreatRtu()封裝程序組織生成RTU報文,發(fā)送RTU信息幀,檢測串口等待返回幀。若等待超過Modbus協(xié)議規(guī)定的4個字符延時等待時間,則進行超時處理。否則,接收數(shù)據(jù)采集層的返回幀之后,返回到數(shù)據(jù)準備階段,繼續(xù)檢測串口。服務器端界面采用qt設計,如圖6所示。

      4 小結

      分析了Modbus協(xié)議,將應用在工業(yè)控制中的Modbus協(xié)議引入到農(nóng)田信息采集系統(tǒng),Modbus幀格式簡單、緊湊、高效,同時Modbus/TCP具有實時通信的特點,更適合嵌入式設備,實現(xiàn)遠程數(shù)據(jù)的交互,從而達到遠程監(jiān)測的目的。設計了基于Modbus協(xié)議的ARM農(nóng)田信息采集服務器,實現(xiàn)了服務器與應用層、服務器與數(shù)據(jù)采集層的通信接口,提出了Modbus/TCP幀與串行鏈路RTU幀的轉換方法,增加了線程池完成每一次的通信任務。服務器可訪問數(shù)據(jù)采集端進行田間信息存儲,客戶端可隨時訪問服務器瀏覽田間信息。但是服務器還存在不足,如何健全服務器功能,發(fā)揮Modbus嵌入式服務器的綜合優(yōu)勢,仍需進一步的研究。

      參考文獻:

      [1] 劉西廣.用于西門子Insight軟件的Modbus協(xié)議通用網(wǎng)關設計[D].成都:電子科技大學,2011.

      [2] 陸 晶.基于Modbus的數(shù)據(jù)采集系統(tǒng)[D].江蘇無錫:江南大學,2011.

      [3] 任清娟.基于Modbus和GPRS的高爐渣?;潆姳O(jiān)控系統(tǒng)的設計[D].內蒙古包頭:內蒙古科技大學,2012.

      [4] 林勇堅.基于Modbus現(xiàn)場總線的水處理流程控制的工程設計[J].廣西民族大學學報(自然科學版),2013,19(1):79-81.

      [5] 陳 輝.基于Modbus協(xié)議灌區(qū)遠程智能測控系統(tǒng)研究[D].蘭州:蘭州理工大學,2012.

      [6] 王 諦.基于Modbus協(xié)議的PC機與dsPIC6014處理器的通信[D].呼和浩特:內蒙古大學,2012.

      [7] 景柏豪,沈孟良,唐曄鈞.CAN-Modbus/TCP協(xié)議轉換的設計與實現(xiàn)[J].計算機工程與設計,2013,34(5):1552-1556.

      [8] 李振江.Linux系統(tǒng)下Modbus主協(xié)議棧設計與實現(xiàn)[D].合肥:安徽大學,2012.

      [9] 吳寅華,趙 敏.基于ARM Cortex-M3的Modbus協(xié)議實現(xiàn)及其應用[J].電子科技,2011,24(6):19-21.

      [10] 楊開杰,劉秋菊,徐汀榮.線程池的多線程并發(fā)控制技術研究[J].計算機應用與軟件,2010,27(1):168-169.

      {

      FD_SET(nSocket,&set);

      neSlect=select(nSocket+1,NULL,&set,NULL,&tv);if(neSlect>0)

      {

      nSend=send(nSocket,(char*)pWriteDate,nDataLen,0);

      }

      if(nDataLen==READ_REGISTERS_HEAD

      ER_LEN)

      {

      RecvReadData();

      }

      else

      {

      RecvWriteReturn();

      }

      }

      FD_ZERO(&set);

      }

      若客戶端要讀取06號設備起始地址為4的連續(xù)2個寄存器,讀取保持寄存器的功能碼function為3。服務器通信結果見圖4。

      2.2 Modbus/TCP幀與RTU幀轉換設計

      當客戶端需要查詢當前的實時數(shù)據(jù),而服務器還未進行存儲,客戶端向服務器發(fā)送Modbus/TCP請求幀并等待服務器應答,服務器接收Modbus/TCP請求幀對其進行分析處理,轉化成Modus RTU串行鏈路響應幀并發(fā)送到與數(shù)據(jù)采集層相連的串行鏈路中去,監(jiān)聽等待數(shù)據(jù)采集層的應答。若服務器收到串行鏈路上的RTU應答幀,則將該應答幀重新封裝成Modbus/TCP應答幀,發(fā)送給客戶端。因此,在服務器端需要進行Modbus/TCP與串行鏈路RTU的轉換。

      ModToRtu()函數(shù)實現(xiàn)Modbus/TCP幀與串行鏈路RTU幀的轉換功能,轉換過程見圖5。

      Modbus/TCP幀與串行鏈路RTU幀相比,增加了MBAP報文,減少了CRC校驗碼。Modbus/TCP轉串行鏈路RTU過程:首先從MBAP報文頭中解析出地址段,并將MBAP的各字段保存。然后從Modbus/TCP幀中分別解析出功能碼和數(shù)據(jù)段,并計算CRC校驗碼,最后封裝成串行鏈路RTU幀。

      串行鏈路RTU幀轉換成Modbus/TCP幀:首先利用已保存MBAP字段重新封裝成MBAP,然后從RTU幀中讀取數(shù)據(jù)段和功能碼,分別填充到Modbus/TCP幀的數(shù)據(jù)段和功能碼,封裝成Modbus/TCP幀。

      2.3 線程池

      在服務器整個工作過程中,系統(tǒng)通過線程與客戶端和與數(shù)據(jù)采集層進行通信。傳統(tǒng)多線程方案的服務器,多個線程在同一時間內并發(fā)運行執(zhí)行相應的任務[10],采用“及時創(chuàng)建,及時銷毀”的策略。當服務器接收到請求之后創(chuàng)建一個線程,由該線程執(zhí)行具體任務,任務結束之后線程退出。若大量用戶同時訪問服務器,在短時間內,服務器將處于不停地創(chuàng)建線程、銷毀線程的狀態(tài),容易導致消耗系統(tǒng)內存。因此,系統(tǒng)增加了線程池,大大減少了線程的開銷。

      線程池采用預創(chuàng)建技術。程序啟動之后,首先創(chuàng)建一定數(shù)量(NUM個)的線程,這些線程處于阻塞狀態(tài),并不消耗CPU。當系統(tǒng)有任務需要執(zhí)行時,程序喚醒一個空閑線程執(zhí)行任務。任務完成之后,該線程再次回到阻塞狀態(tài),等待下次任務的到來。在線程池的數(shù)量設計上,程序所創(chuàng)建的線程總數(shù)不能高于THREAD_MAXNUM,當系統(tǒng)中的空閑線程數(shù)量低于THREAD_Max時,程序將創(chuàng)建一些線程,使得空閑線程維持在THREAD_AvailLow之上。當系統(tǒng)中的空閑線程數(shù)量高于THREAD_AvailHigh時,線程池會自動銷毀一些線程,保持空閑線程的數(shù)量在一個合理的范圍內。

      3 服務器到數(shù)據(jù)采集層的通信

      服務器通過串口定期向數(shù)據(jù)采集層發(fā)送RTU請求幀,并等待接收數(shù)據(jù)采集層的RTU返回幀,將收到的農(nóng)田信息存儲在數(shù)據(jù)庫中。

      服務器端首先打開串口,調用CreatData()準備要發(fā)送的請求數(shù)據(jù),執(zhí)行CreatCRC()生成函數(shù)獲取CRC校驗碼,通過CreatRtu()封裝程序組織生成RTU報文,發(fā)送RTU信息幀,檢測串口等待返回幀。若等待超過Modbus協(xié)議規(guī)定的4個字符延時等待時間,則進行超時處理。否則,接收數(shù)據(jù)采集層的返回幀之后,返回到數(shù)據(jù)準備階段,繼續(xù)檢測串口。服務器端界面采用qt設計,如圖6所示。

      4 小結

      分析了Modbus協(xié)議,將應用在工業(yè)控制中的Modbus協(xié)議引入到農(nóng)田信息采集系統(tǒng),Modbus幀格式簡單、緊湊、高效,同時Modbus/TCP具有實時通信的特點,更適合嵌入式設備,實現(xiàn)遠程數(shù)據(jù)的交互,從而達到遠程監(jiān)測的目的。設計了基于Modbus協(xié)議的ARM農(nóng)田信息采集服務器,實現(xiàn)了服務器與應用層、服務器與數(shù)據(jù)采集層的通信接口,提出了Modbus/TCP幀與串行鏈路RTU幀的轉換方法,增加了線程池完成每一次的通信任務。服務器可訪問數(shù)據(jù)采集端進行田間信息存儲,客戶端可隨時訪問服務器瀏覽田間信息。但是服務器還存在不足,如何健全服務器功能,發(fā)揮Modbus嵌入式服務器的綜合優(yōu)勢,仍需進一步的研究。

      參考文獻:

      [1] 劉西廣.用于西門子Insight軟件的Modbus協(xié)議通用網(wǎng)關設計[D].成都:電子科技大學,2011.

      [2] 陸 晶.基于Modbus的數(shù)據(jù)采集系統(tǒng)[D].江蘇無錫:江南大學,2011.

      [3] 任清娟.基于Modbus和GPRS的高爐渣?;潆姳O(jiān)控系統(tǒng)的設計[D].內蒙古包頭:內蒙古科技大學,2012.

      [4] 林勇堅.基于Modbus現(xiàn)場總線的水處理流程控制的工程設計[J].廣西民族大學學報(自然科學版),2013,19(1):79-81.

      [5] 陳 輝.基于Modbus協(xié)議灌區(qū)遠程智能測控系統(tǒng)研究[D].蘭州:蘭州理工大學,2012.

      [6] 王 諦.基于Modbus協(xié)議的PC機與dsPIC6014處理器的通信[D].呼和浩特:內蒙古大學,2012.

      [7] 景柏豪,沈孟良,唐曄鈞.CAN-Modbus/TCP協(xié)議轉換的設計與實現(xiàn)[J].計算機工程與設計,2013,34(5):1552-1556.

      [8] 李振江.Linux系統(tǒng)下Modbus主協(xié)議棧設計與實現(xiàn)[D].合肥:安徽大學,2012.

      [9] 吳寅華,趙 敏.基于ARM Cortex-M3的Modbus協(xié)議實現(xiàn)及其應用[J].電子科技,2011,24(6):19-21.

      [10] 楊開杰,劉秋菊,徐汀榮.線程池的多線程并發(fā)控制技術研究[J].計算機應用與軟件,2010,27(1):168-169.

      {

      FD_SET(nSocket,&set);

      neSlect=select(nSocket+1,NULL,&set,NULL,&tv);if(neSlect>0)

      {

      nSend=send(nSocket,(char*)pWriteDate,nDataLen,0);

      }

      if(nDataLen==READ_REGISTERS_HEAD

      ER_LEN)

      {

      RecvReadData();

      }

      else

      {

      RecvWriteReturn();

      }

      }

      FD_ZERO(&set);

      }

      若客戶端要讀取06號設備起始地址為4的連續(xù)2個寄存器,讀取保持寄存器的功能碼function為3。服務器通信結果見圖4。

      2.2 Modbus/TCP幀與RTU幀轉換設計

      當客戶端需要查詢當前的實時數(shù)據(jù),而服務器還未進行存儲,客戶端向服務器發(fā)送Modbus/TCP請求幀并等待服務器應答,服務器接收Modbus/TCP請求幀對其進行分析處理,轉化成Modus RTU串行鏈路響應幀并發(fā)送到與數(shù)據(jù)采集層相連的串行鏈路中去,監(jiān)聽等待數(shù)據(jù)采集層的應答。若服務器收到串行鏈路上的RTU應答幀,則將該應答幀重新封裝成Modbus/TCP應答幀,發(fā)送給客戶端。因此,在服務器端需要進行Modbus/TCP與串行鏈路RTU的轉換。

      ModToRtu()函數(shù)實現(xiàn)Modbus/TCP幀與串行鏈路RTU幀的轉換功能,轉換過程見圖5。

      Modbus/TCP幀與串行鏈路RTU幀相比,增加了MBAP報文,減少了CRC校驗碼。Modbus/TCP轉串行鏈路RTU過程:首先從MBAP報文頭中解析出地址段,并將MBAP的各字段保存。然后從Modbus/TCP幀中分別解析出功能碼和數(shù)據(jù)段,并計算CRC校驗碼,最后封裝成串行鏈路RTU幀。

      串行鏈路RTU幀轉換成Modbus/TCP幀:首先利用已保存MBAP字段重新封裝成MBAP,然后從RTU幀中讀取數(shù)據(jù)段和功能碼,分別填充到Modbus/TCP幀的數(shù)據(jù)段和功能碼,封裝成Modbus/TCP幀。

      2.3 線程池

      在服務器整個工作過程中,系統(tǒng)通過線程與客戶端和與數(shù)據(jù)采集層進行通信。傳統(tǒng)多線程方案的服務器,多個線程在同一時間內并發(fā)運行執(zhí)行相應的任務[10],采用“及時創(chuàng)建,及時銷毀”的策略。當服務器接收到請求之后創(chuàng)建一個線程,由該線程執(zhí)行具體任務,任務結束之后線程退出。若大量用戶同時訪問服務器,在短時間內,服務器將處于不停地創(chuàng)建線程、銷毀線程的狀態(tài),容易導致消耗系統(tǒng)內存。因此,系統(tǒng)增加了線程池,大大減少了線程的開銷。

      線程池采用預創(chuàng)建技術。程序啟動之后,首先創(chuàng)建一定數(shù)量(NUM個)的線程,這些線程處于阻塞狀態(tài),并不消耗CPU。當系統(tǒng)有任務需要執(zhí)行時,程序喚醒一個空閑線程執(zhí)行任務。任務完成之后,該線程再次回到阻塞狀態(tài),等待下次任務的到來。在線程池的數(shù)量設計上,程序所創(chuàng)建的線程總數(shù)不能高于THREAD_MAXNUM,當系統(tǒng)中的空閑線程數(shù)量低于THREAD_Max時,程序將創(chuàng)建一些線程,使得空閑線程維持在THREAD_AvailLow之上。當系統(tǒng)中的空閑線程數(shù)量高于THREAD_AvailHigh時,線程池會自動銷毀一些線程,保持空閑線程的數(shù)量在一個合理的范圍內。

      3 服務器到數(shù)據(jù)采集層的通信

      服務器通過串口定期向數(shù)據(jù)采集層發(fā)送RTU請求幀,并等待接收數(shù)據(jù)采集層的RTU返回幀,將收到的農(nóng)田信息存儲在數(shù)據(jù)庫中。

      服務器端首先打開串口,調用CreatData()準備要發(fā)送的請求數(shù)據(jù),執(zhí)行CreatCRC()生成函數(shù)獲取CRC校驗碼,通過CreatRtu()封裝程序組織生成RTU報文,發(fā)送RTU信息幀,檢測串口等待返回幀。若等待超過Modbus協(xié)議規(guī)定的4個字符延時等待時間,則進行超時處理。否則,接收數(shù)據(jù)采集層的返回幀之后,返回到數(shù)據(jù)準備階段,繼續(xù)檢測串口。服務器端界面采用qt設計,如圖6所示。

      4 小結

      分析了Modbus協(xié)議,將應用在工業(yè)控制中的Modbus協(xié)議引入到農(nóng)田信息采集系統(tǒng),Modbus幀格式簡單、緊湊、高效,同時Modbus/TCP具有實時通信的特點,更適合嵌入式設備,實現(xiàn)遠程數(shù)據(jù)的交互,從而達到遠程監(jiān)測的目的。設計了基于Modbus協(xié)議的ARM農(nóng)田信息采集服務器,實現(xiàn)了服務器與應用層、服務器與數(shù)據(jù)采集層的通信接口,提出了Modbus/TCP幀與串行鏈路RTU幀的轉換方法,增加了線程池完成每一次的通信任務。服務器可訪問數(shù)據(jù)采集端進行田間信息存儲,客戶端可隨時訪問服務器瀏覽田間信息。但是服務器還存在不足,如何健全服務器功能,發(fā)揮Modbus嵌入式服務器的綜合優(yōu)勢,仍需進一步的研究。

      參考文獻:

      [1] 劉西廣.用于西門子Insight軟件的Modbus協(xié)議通用網(wǎng)關設計[D].成都:電子科技大學,2011.

      [2] 陸 晶.基于Modbus的數(shù)據(jù)采集系統(tǒng)[D].江蘇無錫:江南大學,2011.

      [3] 任清娟.基于Modbus和GPRS的高爐渣?;潆姳O(jiān)控系統(tǒng)的設計[D].內蒙古包頭:內蒙古科技大學,2012.

      [4] 林勇堅.基于Modbus現(xiàn)場總線的水處理流程控制的工程設計[J].廣西民族大學學報(自然科學版),2013,19(1):79-81.

      [5] 陳 輝.基于Modbus協(xié)議灌區(qū)遠程智能測控系統(tǒng)研究[D].蘭州:蘭州理工大學,2012.

      [6] 王 諦.基于Modbus協(xié)議的PC機與dsPIC6014處理器的通信[D].呼和浩特:內蒙古大學,2012.

      [7] 景柏豪,沈孟良,唐曄鈞.CAN-Modbus/TCP協(xié)議轉換的設計與實現(xiàn)[J].計算機工程與設計,2013,34(5):1552-1556.

      [8] 李振江.Linux系統(tǒng)下Modbus主協(xié)議棧設計與實現(xiàn)[D].合肥:安徽大學,2012.

      [9] 吳寅華,趙 敏.基于ARM Cortex-M3的Modbus協(xié)議實現(xiàn)及其應用[J].電子科技,2011,24(6):19-21.

      [10] 楊開杰,劉秋菊,徐汀榮.線程池的多線程并發(fā)控制技術研究[J].計算機應用與軟件,2010,27(1):168-169.

      猜你喜歡
      現(xiàn)代農(nóng)業(yè)
      發(fā)展現(xiàn)代農(nóng)業(yè)念好地里的“致富經(jīng)”
      深入考察調研 攜手打造現(xiàn)代農(nóng)業(yè)高地
      “用好現(xiàn)代農(nóng)業(yè)科技,多種糧、種好糧”
      現(xiàn)代農(nóng)業(yè)離不開化肥
      《現(xiàn)代農(nóng)業(yè)》投稿簡約
      砥礪奮進 打造現(xiàn)代農(nóng)業(yè)強市
      《現(xiàn)代農(nóng)業(yè)》投稿簡約
      現(xiàn)代農(nóng)業(yè)
      計算機技術在現(xiàn)代農(nóng)業(yè)中的應用
      現(xiàn)代農(nóng)業(yè),用上“智慧管家”
      走向世界(2018年11期)2018-12-26 01:12:36
      镇平县| 宜黄县| 铜川市| 宝应县| 青阳县| 固安县| 威宁| 自贡市| 东阿县| 莱西市| 三台县| 农安县| 二连浩特市| 金沙县| 汉沽区| 山西省| 获嘉县| 南木林县| 施甸县| 白银市| 中江县| 玛多县| 承德市| 玉田县| 金乡县| 涪陵区| 黔西| 靖宇县| 孝感市| 汤原县| 姚安县| 类乌齐县| 陕西省| 衡南县| 溧水县| 资阳市| 苏尼特右旗| 沧州市| 新泰市| 民和| 三门县|