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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Linux的EtherCAT主站的研究

          基于Linux的EtherCAT主站的研究

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

          引言

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

          隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,當(dāng)今的工業(yè)現(xiàn)場(chǎng)總線技術(shù)均逐漸過(guò)渡到實(shí)時(shí)工業(yè)以太網(wǎng)階段。如西門(mén)子公司的PROHBUS到PROFINET;博世力士樂(lè)公司的SERCOS?到SERCOSIII等。同時(shí)一些新興的工業(yè)實(shí)時(shí)以太網(wǎng)技術(shù)也以其全新的起點(diǎn)和優(yōu)越的性能脫穎而出。其中EtherCAT(Ethernetfor Control Automation Technology)技術(shù)(也稱(chēng)為以太網(wǎng)現(xiàn)場(chǎng)總線),便是其中較為突出的一個(gè)。現(xiàn)場(chǎng)總線技術(shù)的實(shí)現(xiàn)主要依賴(lài)于主站與從站兩大部分,其中尤以主站技術(shù)最為復(fù)雜,同時(shí)也是控制系統(tǒng)中通訊部分的核心。從歷史上看現(xiàn)場(chǎng)總線主站技術(shù)的演變經(jīng)歷了主動(dòng)卡(如SERCOS一代卡)、被動(dòng)卡(如SoftSERCANS卡)、軟主站(不需要專(zhuān)門(mén)的硬件卡,如可支持Eme疋AT總線的TwinCAT和Codesys軟件)。這使得運(yùn)動(dòng)控制器的開(kāi)發(fā)對(duì)特殊硬件板卡的需求逐漸降低,直至徹底拋開(kāi),從而實(shí)現(xiàn)其開(kāi)放性和靈活性。研究Linux下的EtherCAT主站系統(tǒng)在研究軟主站的基礎(chǔ)上又有兩個(gè)意義:一是Linux操作系統(tǒng)為開(kāi)源系統(tǒng),在其基礎(chǔ)上的任何軟件方面的研究都可直至底層,為自主創(chuàng)新提供可能。二是Linux操作系統(tǒng)很容易移植到ARM處理器平臺(tái)上,而ARM架構(gòu)相對(duì)X86硬件系統(tǒng)具有諸多靈活性和開(kāi)發(fā)性,方便國(guó)內(nèi)廠商開(kāi)發(fā)出基于自身硬件平臺(tái)的高性能控制器。因而此項(xiàng)研究即有助于開(kāi)發(fā)基于軟主站的開(kāi)放式運(yùn)動(dòng)控制器,同時(shí)可為研制我國(guó)自主的工業(yè)實(shí)時(shí)以太網(wǎng)標(biāo)準(zhǔn)提供借鑒,具有較強(qiáng)的實(shí)際意義。

          1 Linux-FEtherCAT主站系統(tǒng)結(jié)構(gòu)

          Linux系統(tǒng)總體分為內(nèi)核層與應(yīng)用層。其中內(nèi)核層運(yùn)行系統(tǒng)的核心調(diào)度與驅(qū)動(dòng)程序,內(nèi)核層中的程序稱(chēng)為模塊,實(shí)時(shí)性較高。應(yīng)用層運(yùn)行各種桌面程序和應(yīng)用程序,實(shí)時(shí)性差。Linux系統(tǒng)下EtherCAT軟主站系統(tǒng)結(jié)構(gòu)如圖1所示。

          1)網(wǎng)絡(luò)設(shè)備部分。EtherCAT軟主站不使用特殊硬件,而是普通的網(wǎng)絡(luò)設(shè)備(如PCI網(wǎng)卡)。內(nèi)核層中含有網(wǎng)絡(luò)設(shè)備模塊,但為了實(shí)現(xiàn)EtherCAT協(xié)議,需要對(duì)普通嘲絡(luò)設(shè)備驅(qū)動(dòng)進(jìn)行修改。

          2)主站模塊與應(yīng)用程序。為了保證實(shí)時(shí)性的要求,EtherCAT主站模塊與應(yīng)用程序模塊均在內(nèi)核層。其中EtherCAT主站模塊實(shí)現(xiàn)全部的協(xié)議解析、任務(wù)調(diào)度并為網(wǎng)絡(luò)設(shè)備與應(yīng)用程序提供函數(shù)接口。應(yīng)用程序模塊最終實(shí)現(xiàn)對(duì)各種自動(dòng)化系統(tǒng)的控制,由用戶(hù)根據(jù)具體的控制對(duì)象和控制要求進(jìn)行編寫(xiě)。

          3)EtherCAT工具。該程序提供了各種可以在Linux用戶(hù)層運(yùn)行的命令。可以直接實(shí)現(xiàn)對(duì)從站的訪問(wèn)和設(shè)置。如:設(shè)置從站地址、顯示總線配置、顯示PDO數(shù)據(jù)、讀寫(xiě)SDO參數(shù)等。由于用戶(hù)層無(wú)法直接訪問(wèn)內(nèi)核層的數(shù)據(jù),因此需要構(gòu)造Linux字符設(shè)備。通過(guò)對(duì)字符設(shè)備的訪問(wèn)間接實(shí)現(xiàn)與EtherCAT主站模塊的通汛。

          圖1主站系統(tǒng)結(jié)構(gòu)

          2數(shù)據(jù)幀的傳輸過(guò)程

          數(shù)據(jù)幀的傳輸是EtherCAT主站模塊的重要功能,是實(shí)現(xiàn)EtherCAT協(xié)議傳輸?shù)幕A(chǔ)。EtherCAT主站的工作主要分為三個(gè)階段如圖2所示。

          圖2主站線程工作狀態(tài)

          2.1孤兒階段

          當(dāng)EtherCAT主站模塊被加載到內(nèi)核后,狀態(tài)處于孤兒階段,等待網(wǎng)絡(luò)設(shè)備模塊的加載與正常啟動(dòng)。

          2.2空閑階段

          當(dāng)存在可用的網(wǎng)絡(luò)設(shè)備后,主站進(jìn)入空閑階段,并啟動(dòng)線程發(fā)送廣播數(shù)據(jù)幀,對(duì)從站進(jìn)行循環(huán)掃描。當(dāng)掃描到可用從站,便對(duì)其進(jìn)行配置。同時(shí)隨時(shí)以?huà)呙璧姆绞奖O(jiān)控總線上的變化。實(shí)現(xiàn)方法如圖3(a)所示。主要過(guò)程分為接收數(shù)據(jù)幀、執(zhí)行當(dāng)前狀態(tài)機(jī)(詳見(jiàn)數(shù)據(jù)通訊管理的實(shí)現(xiàn)一節(jié))、將數(shù)據(jù)幀添加至鏈表、發(fā)送數(shù)據(jù)幀鏈表中的全部數(shù)據(jù)。

          2.3操作階段

          當(dāng)有應(yīng)用程序模塊運(yùn)行時(shí),主站進(jìn)入操作階段。如圖3(C)所示,應(yīng)用程序通過(guò)調(diào)用ecrt_master_activate()函數(shù),停止主站模塊中運(yùn)行的“空閑線程”,啟動(dòng)“操作線程”。該線程只調(diào)用了執(zhí)行當(dāng)前狀態(tài)機(jī)的函數(shù),如圖3(b)所示,以便監(jiān)控總線中的變化,而將原本主站模塊執(zhí)行的收發(fā)數(shù)據(jù)幀的函數(shù)放到了應(yīng)用程序中,為實(shí)現(xiàn)實(shí)時(shí)控制提供條件。


          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(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); })();