柳 青
(北京電子科技職業(yè)學(xué)院, 北京 100176)
Ethercat 作為一種開放式高速實(shí)時(shí)以太網(wǎng)廣泛應(yīng)用于運(yùn)動(dòng)控制、自動(dòng)化等領(lǐng)域。在當(dāng)前Ethercat 主站的研究中為了追求實(shí)時(shí)性能和高精度時(shí)鐘同步, 對系統(tǒng)的軟件或硬件都提出了特殊要求。 蔣杰等通過改造Linux 內(nèi)核在X86 平臺(tái)上實(shí)現(xiàn)了Ethercat 主站[1],孫躍祥等在Xilinx Zynq-7000 處理器構(gòu)建了嵌入式Ethercat 主站[2]。
然而在物料傳輸、 工件檢測等對實(shí)時(shí)性要求不高的系統(tǒng)中,如果采用上述方案則存在系統(tǒng)復(fù)雜,成本高,開發(fā)周期長等問題。 因此提出了這一種在Windows 平臺(tái)上采用網(wǎng)絡(luò)套接字來實(shí)現(xiàn)Ethercat 主站協(xié)議棧的方法。 該方法基于Ethercat 規(guī)范中Ethercat UDP/IP 報(bào)文格式,將Ethercat 報(bào)文嵌入udp 數(shù)據(jù)包的方式,不需要專用硬件或者特殊網(wǎng)卡驅(qū)動(dòng),協(xié)議棧配置靈活,可移植性好。
Ethercat 主站的主要功能是對從站的配置、 數(shù)據(jù)交換、為應(yīng)用程序提供編程接口,因此該將協(xié)議棧設(shè)計(jì)為三個(gè)線程模塊和一個(gè)數(shù)據(jù)模塊。 三個(gè)工作線程分別負(fù)責(zé)應(yīng)用程序接口、Ethercat 報(bào)文生成、解析與收發(fā)、配置服務(wù)通信。 每個(gè)線程都可以訪問數(shù)據(jù)模塊中的數(shù)據(jù),線程之間通過數(shù)據(jù)模塊交互信息,協(xié)議棧架構(gòu)見圖1。
圖1 Ethercat 主站協(xié)議??蚣?/p>
數(shù)據(jù)模塊包含了每個(gè)從站的信息,包括:基本信息,如從站位置、生產(chǎn)廠商、版本號(hào)等;配置信息,主站對從站初始化時(shí),需要對其SM 和FMMU 進(jìn) 行 配置,否則在從站狀態(tài)轉(zhuǎn)換時(shí)會(huì)出錯(cuò),另外在使用PDO 通信時(shí),也必須對從站1C12、1C13 等對象進(jìn)行配置[3],以映射報(bào)文中的數(shù)據(jù)到從站的字典對象中。 從站結(jié)構(gòu)體代碼如下所示:
Ethercat 協(xié)議使用標(biāo)準(zhǔn)的IEEE 802.3 以太網(wǎng)幀傳輸數(shù)據(jù),作為一種開放式實(shí)時(shí)以太網(wǎng)協(xié)議,支持UDP/IP 傳輸協(xié)議[3],在這種模式下,將Ethercat 報(bào)文作為UDP 的數(shù)據(jù),Ethercat 從站控制器就可以識(shí)別并處理數(shù)據(jù)包。 為了能夠區(qū)分Ethercat 報(bào)文和其他報(bào)文, 協(xié)議規(guī)定了Ethercat 使用的UDP 端口為0x88A4,Ethercat UDP/IP 報(bào)文格式如下:
報(bào)文頭規(guī)定了該報(bào)文的指令類型、 數(shù)據(jù)地址以及數(shù)據(jù)長度,數(shù)據(jù)部分是報(bào)文攜帶的數(shù)據(jù)信息,對于讀報(bào)文,從站控制器將從站數(shù)據(jù)復(fù)制到該區(qū)域,對于寫報(bào)文,從站控制器將該區(qū)域的數(shù)據(jù)復(fù)制到從站對應(yīng)的內(nèi)存中。 從站控制器會(huì)根據(jù)每次報(bào)文的執(zhí)行結(jié)果更新該字段, 主站通過檢查該字段來判斷報(bào)文指令是否執(zhí)行成功。Ethercat 報(bào)文生成函數(shù)如下:
Ethercat 主站在初始化階段需要掃描網(wǎng)絡(luò),并對各個(gè)從節(jié)點(diǎn)進(jìn)行配置[5],另外應(yīng)用程序?qū)缑娣?wù)數(shù)據(jù)的讀寫需要SDO 通信, 這些任務(wù)都需要通過幾個(gè)階段來完成,會(huì)消耗比較多的時(shí)間, 為了避免執(zhí)行這些任務(wù)導(dǎo)致應(yīng)用程序阻塞,將這些任務(wù)在一個(gè)單獨(dú)的線程中執(zhí)行,應(yīng)用程序可以很快得到返回。
該線程不斷查詢數(shù)據(jù)模塊中的控制字, 輪詢應(yīng)用程序請求類型,收到請求則會(huì)調(diào)用相應(yīng)的處理函數(shù),在處理函數(shù)中,不斷改變處理狀態(tài),以使應(yīng)用層可以掌握處理進(jìn)度及結(jié)果。 處理完成后,將請求字段復(fù)位,以便接受下一次請求。 配置流程如下:
(1)采用FBWR 指令掃描總線網(wǎng)絡(luò),讀取設(shè)備ID 等。
(2)配置SM 寄存器。
(3)計(jì)算FMMU,并配置FMMU 寄存器。
(4)配置SDO、PDO。
(5)狀態(tài)轉(zhuǎn)換。
為了驗(yàn)證協(xié)議棧的正確性, 采用德國倍福公司的Ethercat 從站模塊進(jìn)EL2889、EL1889 進(jìn)行通信測試,實(shí)驗(yàn)實(shí)物見圖2。 采用Wireshark 軟件抓取通信數(shù)據(jù)包,抓取的數(shù)據(jù)包見圖3。
圖2 Ethercat 通信實(shí)驗(yàn)平臺(tái)
圖3 Wireshark 抓包數(shù)據(jù)
在圖3 中,以第497 個(gè)數(shù)據(jù)包為例,主站計(jì)算的IP地址為192.168.0.100, 目 的IP 設(shè)置為192.168.0.255,目的端口號(hào)設(shè)置為0X88A4, 十進(jìn)制表示為33980,該數(shù)據(jù)包為協(xié)議棧發(fā)出的APWR 指令,數(shù)據(jù)長度為2,WKC 為0。 第498 個(gè)數(shù)據(jù)包為從站返回的應(yīng)答包, 可以看出數(shù)據(jù)部分發(fā)生變化,WKC 也變?yōu)?, 說明Ethercat 從站已經(jīng)成功處理該數(shù)據(jù)包,協(xié)議棧可以和從站正常進(jìn)行數(shù)據(jù)交互。
闡述了基于Windows 套接字的Ethercat 主站協(xié)議棧設(shè)計(jì)方法,根據(jù)Ethercat UDP/IP 規(guī)范,將Ethercat 報(bào)文嵌入到udp 報(bào)文中, 避免了使用專門硬件或者開發(fā)特殊網(wǎng)卡驅(qū)動(dòng),實(shí)現(xiàn)了主站對從站的寄存器讀寫,并詳細(xì)設(shè)計(jì)了主站對從站的配置流程,最后通過Wireshark 軟件抓取通信數(shù)據(jù)包,實(shí)驗(yàn)表明:協(xié)議棧能夠與從站進(jìn)行數(shù)據(jù)交互,設(shè)計(jì)簡單、配置靈活,有利于Ethercat 協(xié)議在通用Windows平臺(tái)上的應(yīng)用。