<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > 基于RTU油井遠(yuǎn)程測(cè)控系統(tǒng)的數(shù)據(jù)采集與傳輸層軟件設(shè)

          基于RTU油井遠(yuǎn)程測(cè)控系統(tǒng)的數(shù)據(jù)采集與傳輸層軟件設(shè)

          作者: 時(shí)間:2012-05-30 來(lái)源:網(wǎng)絡(luò) 收藏

          3.1.2 Modbus/TCP通信協(xié)議
          Modbus/TCP是一種應(yīng)用層的協(xié)議,上層為Modbus協(xié)議,下層為TCP協(xié)議,它規(guī)定了網(wǎng)絡(luò)互聯(lián)節(jié)點(diǎn)間的請(qǐng)求/應(yīng)答的通信方式。幀格式必須嚴(yán)格遵守協(xié)議所規(guī)定的ADU(Application Data Unit)格式,才能在以太網(wǎng)上實(shí)現(xiàn)數(shù)據(jù)的傳輸。圖3所示即為Modbus/TCP的數(shù)據(jù)幀格式。

          本文引用地址:http://www.ex-cimer.com/article/193821.htm

          d.jpg


          MBAP報(bào)文頭(Modbus Application Protocol Header)是TCP/IP使用的專用報(bào)文頭,用來(lái)識(shí)別Modbus的應(yīng)用數(shù)據(jù)單元。MBAP共有7個(gè)字節(jié),其具體組成及含義如表2所列。
          國(guó)際互聯(lián)網(wǎng)編號(hào)分配管理機(jī)構(gòu)IANA(Internet Assigned Numbers Authority)專門為其賦予了一個(gè)TCP端口號(hào)502端口,利用TCP發(fā)送所有的Modbus/TCP ADU。
          3.1.3 Modbus/TCP與Modbus 數(shù)據(jù)幀的區(qū)別
          Modbus/TCP雖然包括了從站地址、功能碼和傳輸?shù)臄?shù)據(jù),但是沒有校驗(yàn)控制碼,這是因?yàn)镸odbus/TCP校驗(yàn)功能已經(jīng)在下面的四層如TCP/IP協(xié)議和鏈路層的校驗(yàn)機(jī)制得到了保證。
          3.2 系統(tǒng)軟件設(shè)計(jì)
          油井主要完成的功能:傳感器數(shù)據(jù)的采集、傳輸和對(duì)繼電器的控制。圖1中提到了兩種常見的工作方式。在井場(chǎng)1中存在主站和從站:主站主要負(fù)責(zé)對(duì)各從站進(jìn)行輪詢、數(shù)據(jù)打包和向上位機(jī)發(fā)送數(shù)據(jù),從站主要負(fù)責(zé)數(shù)據(jù)的采集、繼電器的控制和輪詢命令的響應(yīng),主從站之間的通信使用的是Modbus/。在井場(chǎng)2中只存在一個(gè)RTU,主要完成數(shù)據(jù)的采集、繼電器的控制和向上位機(jī)發(fā)送數(shù)據(jù),通信使用的是Modbus/TCP。在的工作過程中,考慮到系統(tǒng)的兼容性,對(duì)RTU軟件設(shè)計(jì)提出了可配置的要求,不需要重新下載程序,只需要使用系統(tǒng)配置軟件就可選擇不同的工作方式和通信方式,這就保證了系統(tǒng)的可操作性和兼容性,系統(tǒng)的適應(yīng)性大大加強(qiáng)。
          在軟件開發(fā)過程中,考慮到串行通信速度較慢的特點(diǎn),采用多線程技術(shù),故引入實(shí)時(shí)操作系統(tǒng)μC/OS_II,將Modbus/RTU通信、Modbus /TCP通信等放在單獨(dú)的線程中進(jìn)行,而數(shù)據(jù)采集和控制等則采用另的線程實(shí)現(xiàn)。
          3.2.1 μC/OS_II的移植
          μC/OS_II是可移植、可剪裁的搶占式實(shí)時(shí)多任務(wù)操作系統(tǒng)內(nèi)核,適用于工業(yè)控制中的實(shí)時(shí)監(jiān)控。本系統(tǒng)成功地將實(shí)時(shí)操作系統(tǒng)μC/ OS_II移植到S3C2440A微處理器上,并實(shí)現(xiàn)了Modbus通信協(xié)議。
          μC/OS_II可以管理64個(gè)任務(wù),具有信號(hào)量、互斥信號(hào)量、消息隊(duì)列、任務(wù)管理、時(shí)間管理和內(nèi)存塊管理等系統(tǒng)功能。μC/OS_II的移植主要包括三部分代碼:μC/OS_II核心代碼、μC/OS_II配置代碼、μC/OS_II移植代碼。其中μC/OS_II移植代碼包括1個(gè)匯編文件、1個(gè)C程序文件和1個(gè)頭文件。這部分代碼與微處理器相關(guān),是移植的關(guān)鍵。
          3.2.2 Modbus通信的實(shí)現(xiàn)
          RTU與上位機(jī)使用Modbus/TCP進(jìn)行以太網(wǎng)通信時(shí),需不斷接收上位機(jī)發(fā)送的查詢命令,處于服務(wù)器(從站)狀態(tài)。RTU在使用。Modbus/ RTU進(jìn)行串口通信時(shí),需單獨(dú)完成主從站功能。在實(shí)際應(yīng)用中,不存在Modbus/TCP和Modbus/RTU的從站并存在同一RTU的情況,因而在程序編寫過程中,Modbus/TCP和Modbus/RTU的從站使用同一個(gè)Modbus從站庫(kù),但對(duì)其幀頭的處理略有不同。以下分別講述Modbus/TCP服務(wù)器(從站)在TCP/IP協(xié)議棧上的實(shí)現(xiàn)以及Modbus/RTU主站在串口通信上的實(shí)現(xiàn)。
          (1)Modbus/TCP通信協(xié)議實(shí)現(xiàn)
          由于操作系統(tǒng)μC/OS_II本身沒有TCP/IP協(xié)議棧,故先移植嵌入TCP/IP協(xié)議棧,再編寫Modbus/TCP服務(wù)器(從站)程序。在μC/OS_II下嵌入了TCP/IP協(xié)議棧后就監(jiān)聽TCP502端口的連接請(qǐng)求,只有在與客戶機(jī)建立了連接之后才能進(jìn)行數(shù)據(jù)處理。服務(wù)器端在收到客戶機(jī)的請(qǐng)求之后,會(huì)確認(rèn)和客戶機(jī)的連接,同時(shí)接收并分析客戶機(jī)的請(qǐng)求報(bào)文。如果MBAP報(bào)文頭正確,則讀完所有的報(bào)文,只有協(xié)議類型值為0x00時(shí)才對(duì)請(qǐng)求幀進(jìn)行下一步操作,否則直接丟棄報(bào)文。接著分析PDU中的功能代碼,不同的功能對(duì)參數(shù)要求也不同,最后根據(jù)數(shù)據(jù)域中的參數(shù)規(guī)定,執(zhí)行相應(yīng)的操作。若有錯(cuò)誤出現(xiàn),直接丟棄報(bào)文,仍繼續(xù)處理PDU的數(shù)據(jù)顯得不必要,影響實(shí)時(shí)性。根據(jù)對(duì)客戶端請(qǐng)求報(bào)文的分析處理,有兩種響應(yīng)結(jié)果,一種是正常的響應(yīng)報(bào)文,另一種是異常響應(yīng)報(bào)文,即返回的是錯(cuò)誤信息。其Modbus/TCP的從站通信流程如圖4所示。

          e.jpg



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();