榮 鋒,朱瑞華
(1.天津工業(yè)大學(xué) 電子與信息工程學(xué)院,天津 300387;2.天津市光電檢測(cè)技術(shù)與系統(tǒng)重點(diǎn)實(shí)驗(yàn)室,天津 300387)
PROFINET是工業(yè)控制領(lǐng)域廣泛應(yīng)用的一種工業(yè)以太網(wǎng),具備成熟的解決方案[1]。在HMS Networks對(duì)工業(yè)網(wǎng)絡(luò)市場(chǎng)研究報(bào)告中發(fā)現(xiàn)PROFINET的市場(chǎng)份額位居首位,尤其是在工廠自動(dòng)化、過(guò)程自動(dòng)化、安全應(yīng)用領(lǐng)域[2]。截止到2022年初,PROFINET約已連接1 600萬(wàn)個(gè)節(jié)點(diǎn),足以證明PROFINET的應(yīng)用是如此廣泛。而國(guó)內(nèi)在“中國(guó)制造2025”的國(guó)家戰(zhàn)略推動(dòng)下,PROFINET也將有更大的發(fā)展,因此對(duì)PROFINET的研究也應(yīng)該更深層次和多方面。
對(duì)于PROFINET的研究可大致分為性能分析、產(chǎn)品開(kāi)發(fā)、診斷、安全等。張國(guó)棟等人對(duì)PROFINET RT和IRT的數(shù)據(jù)轉(zhuǎn)發(fā)方式進(jìn)行了分析,并利用公式推導(dǎo)出了IO設(shè)備的刷新時(shí)間[3]。KLEINES H等人通過(guò)數(shù)值模擬PROFINET IO網(wǎng)絡(luò)性能[4]。劉柯等人對(duì)RT通信幀的結(jié)構(gòu)、周期組成以及通信周期的相關(guān)參數(shù)計(jì)算進(jìn)行了研究[5]。對(duì)于PROFINET IO設(shè)備的開(kāi)發(fā),從原理上普通以太網(wǎng)網(wǎng)卡不能完全實(shí)現(xiàn)PROFINET IO功能,目前市場(chǎng)上廣泛應(yīng)用的解決方案是依賴西門子公司的ERTEC芯片、瑞薩公司的TPS-1芯片、赫優(yōu)訊公司的Netx51/52芯片等專用網(wǎng)絡(luò)控制芯片來(lái)實(shí)現(xiàn)PROFINET IO通信。如閆菲等人用ERTEC200P芯片開(kāi)發(fā)了PROFINET IO工業(yè)以太網(wǎng)接口[6]。徐建明等人基于TPS-1芯片設(shè)計(jì)了一種PROFINET耦合器設(shè)備[7]。劉振杰以NETX51芯片設(shè)計(jì)了一款PROFINET從站接口模塊[8]。但這些方案開(kāi)發(fā)成本較高,對(duì)于一些非運(yùn)動(dòng)控制領(lǐng)域有一定的冗余性。因此本文利用普通網(wǎng)卡通過(guò)軟件設(shè)計(jì)實(shí)現(xiàn)PROFINET IO通信的NRT、RT功能。為證明廣泛性,在樹(shù)莓派3B+硬件平臺(tái)上移植協(xié)議棧,實(shí)現(xiàn)樹(shù)莓派接入PROFINET網(wǎng)絡(luò)。PROFINET IO協(xié)議棧依照設(shè)備類型Class B進(jìn)行設(shè)計(jì),支持非同步實(shí)時(shí)數(shù)據(jù)交換,可以實(shí)現(xiàn)LLDP、DCP、SNMP協(xié)議。本設(shè)計(jì)可以實(shí)現(xiàn)對(duì)實(shí)時(shí)性要求不苛刻的非運(yùn)動(dòng)控制領(lǐng)域的工業(yè)控制。
PROFINET通信系統(tǒng)中,DCP在系統(tǒng)啟動(dòng)時(shí)分配設(shè)備名稱和IP地址,是PROFINET網(wǎng)絡(luò)中數(shù)據(jù)交互的基礎(chǔ),對(duì)于PROFINET的研究和實(shí)現(xiàn)通信功能離不開(kāi)DCP。因此本文在實(shí)現(xiàn)PROFINET IO通信功能的基礎(chǔ)上對(duì)協(xié)議棧中的DCP子協(xié)議進(jìn)行深入研究,從DCP協(xié)議的原理出發(fā),對(duì)DCP在PROFINET系統(tǒng)中的作用及軟件實(shí)現(xiàn)進(jìn)行研究和分析。利用西門子PLC S7-1200控制器搭建通信測(cè)試平臺(tái),驗(yàn)證DCP協(xié)議在PROFINET中的作用及樹(shù)莓派RT和NRT通信的實(shí)現(xiàn),并將Wireshark軟件抓取到的數(shù)據(jù)幀解析,得出IO設(shè)備的更新時(shí)間抖動(dòng)。本文的研究將會(huì)幫助自動(dòng)化工程師加深對(duì)PROFINET協(xié)議棧的理解,從而更好的去應(yīng)用PROFINET。
PROFINET根據(jù)不同的應(yīng)用類型提供了兩種解決方案,PROFINET CBA和PROFINET IO[9]。其中PROFINET CBA主要用于實(shí)現(xiàn)控制器之間的通信,而PROFINET IO主要用于實(shí)現(xiàn)控制器與IO設(shè)備之間的通信。
PROFINET IO定義了3個(gè)設(shè)備角色:IO控制器、IO監(jiān)控器和IO設(shè)備。
1)IO設(shè)備是構(gòu)成自動(dòng)化過(guò)程接口的外圍現(xiàn)場(chǎng)設(shè)備,分為塊IO設(shè)備和模塊化IO設(shè)備兩種類型。塊IO設(shè)備具有固定模塊配置,而模塊化IO設(shè)備可靈活添加和刪除模塊。
2)IO控制器用于控制自動(dòng)化過(guò)程,負(fù)責(zé)其相關(guān)的現(xiàn)場(chǎng)設(shè)備的 IP 地址分配、配置、參數(shù)設(shè)置、警報(bào)處理。
3)IO監(jiān)視器用于完成對(duì)設(shè)備的遠(yuǎn)程控制、檢查、維護(hù)或參數(shù)化 IO設(shè)備的客戶端功能,通過(guò)在監(jiān)視器禁用IO控制器來(lái)臨時(shí)強(qiáng)制過(guò)程輸出值,通常是HMI、工程工具充當(dāng)監(jiān)視器。
PROFINET IO設(shè)備在應(yīng)用層定義了插槽/子插槽的設(shè)備模型,其中插槽表示設(shè)備的物理或邏輯模塊,又被分為多個(gè)子插槽,子插槽相當(dāng)于過(guò)程數(shù)據(jù)的接口,每個(gè)插槽的IO數(shù)據(jù)、報(bào)警、診斷數(shù)據(jù)都被分配到這些子插槽中[10]。IO設(shè)備不同模塊和子模塊在通用站點(diǎn)描述文件(GSD,general station description)中描述。塊IO設(shè)備具有通用站點(diǎn)描述文件中描述的固定模塊配置,而模塊化IO設(shè)備允許根據(jù)需要添加和刪除模塊,GSD文件中包含所有可能的模塊,但I(xiàn)O設(shè)備的實(shí)際模塊需要在工程工具中定義,下載到控制器后,由控制器告訴IO設(shè)備需要的配置。
PROFINET IO針對(duì)數(shù)據(jù)對(duì)實(shí)時(shí)性不同的要求,劃分為標(biāo)準(zhǔn)通道,實(shí)時(shí)通道和等實(shí)時(shí)通道[11]。標(biāo)準(zhǔn)通道是基于UDP/IP,用于上下文管理,處理IO設(shè)備的配置和診斷。實(shí)時(shí)通道(RT)用于傳輸循環(huán)過(guò)程數(shù)據(jù)、事件和警報(bào),它在標(biāo)準(zhǔn)通道的基礎(chǔ)上,將實(shí)時(shí)數(shù)據(jù)幀嵌入到以太網(wǎng)幀中,不使用任何高層協(xié)議。也就是直接在數(shù)據(jù)鏈路層進(jìn)行封裝,在以太網(wǎng)報(bào)文頭后加上PROFINET報(bào)文頭,因此能繞過(guò)UDP/IP堆棧,直接由PROFINET的協(xié)議棧處理,以此來(lái)減少數(shù)據(jù)的開(kāi)銷量,高效利用帶寬,提高PROFINET的實(shí)時(shí)性能。等實(shí)時(shí)通道用于對(duì)時(shí)間要求嚴(yán)格的通信,如運(yùn)動(dòng)控制,它通過(guò)特殊的IRT硬件使IRT數(shù)據(jù)在預(yù)先配置和計(jì)劃的時(shí)隙中發(fā)送,從而達(dá)到更高實(shí)時(shí)性。
DCP為“發(fā)現(xiàn)和基本配置協(xié)議”是一種數(shù)據(jù)鏈路層協(xié)議,它為PROFINET提供多種服務(wù),例如用于PROFINET網(wǎng)絡(luò)中的發(fā)現(xiàn)識(shí)別設(shè)備,配置設(shè)備名稱、配置IP地址等[12]。
為實(shí)現(xiàn)這些服務(wù)DCP提供了“Identify All”、“Identify”、“Set”、“Set-Flash”、“Set-Reset to Factory”、“Get”和“Hello”作為主要功能。PROFINET工程工具、控制器和設(shè)備中都集成了DCP服務(wù),但他們所側(cè)重的功能不同,如在IO設(shè)備上要能對(duì)控制器所發(fā)布的命令做出響應(yīng),要能主動(dòng)利用Hello功能向控制器發(fā)送消息,而IO控制器要能利用Identify功能來(lái)查找具體設(shè)備。主要功能具體描述如下。
Identify All:識(shí)別全部設(shè)備。以廣播的方式向整個(gè)網(wǎng)絡(luò)發(fā)送消息,所有設(shè)備收到消息都要做出響應(yīng)。工程工具中利用此功能可以獲得所有設(shè)備信息列表來(lái)確定網(wǎng)絡(luò)中是否存如下問(wèn)題:1)設(shè)備有無(wú)連接;2)設(shè)備名稱是否設(shè)置;3)設(shè)備中有無(wú)重復(fù)的IP地址或重復(fù)的設(shè)備名稱;4)設(shè)備名稱和IP地址設(shè)置是否合規(guī);5)設(shè)備類型或供應(yīng)商是否正確,利用Identify All功能工程工具可以輕松實(shí)現(xiàn)網(wǎng)絡(luò)管理。
Identify:查找具體設(shè)備和檢查設(shè)備參數(shù)設(shè)置。系統(tǒng)啟動(dòng)前,IO控制器會(huì)用它來(lái)識(shí)別設(shè)備,通過(guò)設(shè)備名稱來(lái)進(jìn)行查找,具有該設(shè)備名稱的設(shè)備進(jìn)行響應(yīng),但如果查找的設(shè)備名稱長(zhǎng)度為零則所有未分配名稱的設(shè)備都要做出響應(yīng)。
Get:獲取設(shè)備信息。比如獲取設(shè)備名稱、IP地址和制造商信息等。
Set:向設(shè)備寫入?yún)?shù)。將設(shè)備名稱和IP地址寫入尋址到的設(shè)備中,可以在一個(gè)幀中依次請(qǐng)求多個(gè)條件,用來(lái)找到相匹配的設(shè)備。
Set-Flash:讓指定IO設(shè)備的LED燈閃爍,當(dāng)同一網(wǎng)絡(luò)中有多個(gè)同類設(shè)備時(shí),可以通過(guò)閃爍LED的方式來(lái)確定要操作的對(duì)象。
Hello:IO設(shè)備主動(dòng)給IO控制器發(fā)送信息。主要在快速啟動(dòng)時(shí)使用Hello功能,表示IO設(shè)備已經(jīng)準(zhǔn)備就緒,從而縮短控制器查找IO設(shè)備的時(shí)間,實(shí)現(xiàn)系統(tǒng)的快速啟動(dòng)。
DCP是PROFINET重要的組成部分,實(shí)現(xiàn)PROFINET IO系統(tǒng)啟動(dòng)時(shí)設(shè)備名稱、IP地址的分配,是PROFINET網(wǎng)絡(luò)中數(shù)據(jù)交互的基礎(chǔ)[13]。同時(shí)DCP使PROFINET IO設(shè)備實(shí)現(xiàn)無(wú)需組態(tài)工具替換成為可能。
2.2.1 啟動(dòng)時(shí)的DCP
DCP協(xié)議是實(shí)現(xiàn)PROFINET IO通信的條件,在系統(tǒng)組態(tài)時(shí),工程工具會(huì)先給IO控制器分配IP地址,然后給組態(tài)好的IO設(shè)備分配設(shè)備名稱。隨后將組態(tài)好的信息下載到IO控制器中,這樣IO控制器就擁有尋址IO設(shè)備和數(shù)據(jù)交換所需的所有信息。IO控制器在根據(jù)設(shè)備名稱為IO設(shè)備分配IP地址。IP地址和設(shè)備名稱的分配都依賴于DCP子協(xié)議,在系統(tǒng)通電后,IO控制器與IO設(shè)備建立通信關(guān)系和應(yīng)用關(guān)系,然后IO控制器和IO設(shè)備交換過(guò)程數(shù)據(jù)、報(bào)警和非循環(huán)數(shù)據(jù)。從組態(tài)到系統(tǒng)啟動(dòng)的步驟如圖1所示。
圖1 組態(tài)到系統(tǒng)啟動(dòng)
PROFINET系統(tǒng)中,指定DCP協(xié)議分配設(shè)備名稱和IP地址。每個(gè)PROFINET設(shè)備會(huì)根據(jù)DNS和IP地址分配唯一的設(shè)備名稱。這個(gè)設(shè)備名稱用于系統(tǒng)啟動(dòng)時(shí)的PROFINET IO設(shè)備尋址。設(shè)備名稱和IP地址的成功分配是控制器和設(shè)備之間正常通信的前提。DCP協(xié)議分配IO設(shè)備名稱和IP地址的具體步驟如下。
1)IO設(shè)備分配名稱。
自動(dòng)化系統(tǒng)啟動(dòng)時(shí)需要進(jìn)行基于符號(hào)名稱的設(shè)備地址解析,在IO控制器和IO設(shè)備真正建立連接之前,IO設(shè)備就已經(jīng)分配了名字,該名稱是由IO監(jiān)視器分配并保存在IO設(shè)備中。這個(gè)名稱用作設(shè)備運(yùn)行期間對(duì)它明確的標(biāo)識(shí)。具體流程如圖2所示。
圖2 DCP分配設(shè)備名稱
2) IO設(shè)備分配IP地址。
IO控制器以設(shè)備名稱作為尋址標(biāo)準(zhǔn)向IO設(shè)備發(fā)送請(qǐng)求,具有該名字的設(shè)備發(fā)送響應(yīng)。ARP請(qǐng)求在子網(wǎng)內(nèi)以廣播的方式發(fā)送,用于尋找對(duì)應(yīng)IP地址,該IP地址的設(shè)備發(fā)送自己的MAC地址作為響應(yīng),以此來(lái)檢查IP地址所對(duì)應(yīng)的MAC地址。如果沒(méi)有接收到ARP響應(yīng),則代表該IP地址的設(shè)備在此子網(wǎng)內(nèi)不存在或者沒(méi)有處在活動(dòng)的狀態(tài)。然后利用DCP_Set設(shè)置IP地址并等待IO設(shè)備發(fā)送相應(yīng)響應(yīng)進(jìn)行確認(rèn)。具體步驟如圖3所示。
圖3 DCP分配IP地址
PROFINET 網(wǎng)絡(luò)中也可以選用動(dòng)態(tài)主機(jī)配置協(xié)議(DHCP)對(duì)IO設(shè)備進(jìn)行地址分配[14]。但DHCP在地址分配時(shí),依賴一個(gè)可以使用的服務(wù)器,通常在自動(dòng)化應(yīng)用的范圍外,服務(wù)器會(huì)因?yàn)楦鞣N原因關(guān)閉導(dǎo)致地址分配不成功。PROFINET網(wǎng)絡(luò)依賴于靜態(tài)地址,而DHCP提供的是動(dòng)態(tài)地址這使設(shè)備更換困難。MAC地址通常與DHCP服務(wù)器進(jìn)行綁定,如果需要更換一個(gè)設(shè)備,MAC地址即發(fā)生改變,這會(huì)阻止新設(shè)備獲取地址,并且使進(jìn)程處于停滯狀態(tài),直到重新配置DHCP服務(wù)器。而使用DCP可以本地化管理地址,IP地址不會(huì)過(guò)期,并且設(shè)備名稱對(duì)每個(gè)設(shè)備來(lái)說(shuō)都是唯一的,DCP可以在不使用組態(tài)工具的情況下完成設(shè)備替換。
2.2.2 設(shè)備替換
DCP和LLDP結(jié)合使用可以實(shí)現(xiàn)“無(wú)需組態(tài)工具的設(shè)備替換”[15]。LLDP通過(guò)交換機(jī)端口交換鄰居設(shè)備的信息,LLDP幀中包括發(fā)送端口的端口ID、發(fā)送設(shè)備的MAC地址或設(shè)備名稱、目的端口等?,F(xiàn)場(chǎng)設(shè)備接通后,相鄰設(shè)備之間會(huì)周期性的發(fā)送LLDP幀用于交換設(shè)備信息。設(shè)備解析收到的LLDP報(bào)文,將端口ID和設(shè)備名稱結(jié)合形成設(shè)備別名,這個(gè)別名將用于替換設(shè)備的尋址。
如果設(shè)備發(fā)生故障,則將停止與其鄰居設(shè)備循環(huán)交換LLDP幀,這樣可以檢測(cè)出設(shè)備故障。當(dāng)響應(yīng)超時(shí),鄰居設(shè)備會(huì)刪除故障設(shè)備的信息,控制器也將檢測(cè)出這個(gè)設(shè)備不再“可尋址”。更換設(shè)備后,控制器會(huì)循環(huán)的嘗試用原設(shè)備名稱和新設(shè)備建立聯(lián)系。因?yàn)樾略O(shè)備的設(shè)備名稱為空,所以不能成功建立聯(lián)系,此時(shí)控制器使用DCP_Identify服務(wù),設(shè)置請(qǐng)求參數(shù)“Alias Name Of Station”,通過(guò)設(shè)備別名詢問(wèn)設(shè)備,新設(shè)備進(jìn)行應(yīng)答,控制器再通過(guò)DCP_Set將新設(shè)備重新命名。
PROFINET IO提供了主要用于IO控制器和IO設(shè)備之間通信的服務(wù)和協(xié)議[16]。PROFINET IO協(xié)議是由一組協(xié)議機(jī)器定義,協(xié)議??偧軜?gòu)如圖4所示[17]。圖3描繪了IO設(shè)備內(nèi)提供應(yīng)用關(guān)系應(yīng)用服務(wù)元素(AR ASE,Application Relationship Application Service Element)行為的協(xié)議機(jī)器及協(xié)議機(jī)器之間的交互?;疑?yàn)镻ROFINET IO協(xié)議中主要的協(xié)議機(jī)器,箭頭代表協(xié)議機(jī)器之間的主要交互。本文所實(shí)現(xiàn)的PROFINET IO協(xié)議棧以RT為最高通信標(biāo)準(zhǔn)實(shí)現(xiàn)數(shù)據(jù)收發(fā)和診斷報(bào)警功能。
圖4 PROFINET IO 協(xié)議總架構(gòu)
圖5 PROFINET IO數(shù)據(jù)交互流程
PROFINET IO用戶通過(guò)IO設(shè)備的應(yīng)用層服務(wù)協(xié)議映射機(jī)(FSPM,F(xiàn)AL service protocol machines)發(fā)布或接收服務(wù)原語(yǔ)。IO設(shè)備上下文協(xié)議機(jī)(CMDEV, context management protocol machine device)用于控制通信關(guān)系的建立和啟動(dòng)停止其他協(xié)議機(jī)。上下文管理RPC設(shè)備協(xié)議機(jī)(CMRPC, context management RPC protocol machine)中映射并封裝了與遠(yuǎn)程過(guò)程調(diào)用協(xié)議(DCE RPC,distributed computing environment remote procedure call)相關(guān)的服務(wù)。管理IP和名稱分配協(xié)議機(jī)器(CMINA,context management Ip and name assignment)主要用于處理站名和IP地址的分配,幫助處理DCP_Set和DCP_Identify請(qǐng)求和管理發(fā)送DCP_HELLO請(qǐng)求。消費(fèi)者協(xié)議機(jī)器(CPM,consumer protocol machine)處理接收循環(huán)數(shù)據(jù),為傳入的實(shí)時(shí)數(shù)據(jù)幀注冊(cè)處理程序并監(jiān)視傳入的數(shù)據(jù)幀。提供者協(xié)議機(jī)器(PPM,provider protocol machine)處理數(shù)據(jù)的循環(huán)發(fā)送并初始化傳輸緩沖區(qū)。報(bào)警協(xié)議啟動(dòng)機(jī)器(ALPMI,alarm protocol machine initiator)用于觸發(fā)警報(bào)。報(bào)警協(xié)議應(yīng)答機(jī)器(ALPMR,alarm protocol machine responder)用于響應(yīng)傳入的警報(bào)。非循環(huán)協(xié)議接收機(jī)器(APMR,acyclic protocol machine receiver)用于接收傳入的報(bào)警幀。非循環(huán)協(xié)議發(fā)送機(jī)器(APMS,acyclic protocol machine sender)用于向IO控制器發(fā)送報(bào)警以太網(wǎng)幀。
在PROFINET IO通信中,發(fā)送數(shù)據(jù)調(diào)度是周期進(jìn)行,網(wǎng)絡(luò)中的每個(gè)設(shè)備的數(shù)據(jù)傳輸開(kāi)始于循環(huán)RT數(shù)據(jù),隨后是傳輸非循環(huán)RT數(shù)據(jù),例如警報(bào)數(shù)據(jù),最后才傳輸NRT數(shù)據(jù)。
PROFINET配置階段,控制器告訴IO設(shè)備實(shí)際的模塊和子模塊。IO設(shè)備會(huì)在app_plug_dap()函數(shù)中利用app_get_module_cfg()函數(shù)、app_get_submodule_cfg()函數(shù)、app_get_parameter_cfg函數(shù)獲取所需要模塊、子模塊、參數(shù)配置,再調(diào)用pnet_plug_module()、pnet_plug_submodule()將特定模塊插入特定的插槽,特定子插槽插入特定的子模塊,最終實(shí)現(xiàn)IO設(shè)備的實(shí)際應(yīng)用模塊所有與組態(tài)信息相一致的模塊信息。配置完成后,IO設(shè)備和控制器之間連續(xù)交換循環(huán)數(shù)據(jù)。
PROFINET IO設(shè)備和IO控制器之間的實(shí)際數(shù)據(jù)傳輸只能通過(guò)應(yīng)用關(guān)系(AR,application relationship)建立通信,而一個(gè)AR中可以包含一個(gè)或者多個(gè)用于交換數(shù)據(jù)的通信關(guān)系(CR,communication relationship)。CR在多個(gè)隊(duì)列或緩沖區(qū)之間建立,用于交換不同的數(shù)據(jù),循環(huán)RT數(shù)據(jù)使用IO數(shù)據(jù)CR,配置和其他非循環(huán)數(shù)據(jù)在記錄數(shù)據(jù)CR中交換,實(shí)時(shí)報(bào)警在報(bào)警CR中交換??刂破髋cIO設(shè)備之間的數(shù)據(jù)交互根據(jù)不同事件調(diào)用不同的回調(diào)函數(shù)進(jìn)行處理,反復(fù)調(diào)用Events_Stata()函數(shù)判斷不同事件。PROFINET數(shù)據(jù)交互流程如圖5所示。
PROFINET IO通信是按照生產(chǎn)者/消費(fèi)者的模式進(jìn)行,在循環(huán)數(shù)據(jù)交換時(shí),不僅要包含數(shù)據(jù)單元還要包含兩個(gè)數(shù)據(jù)狀態(tài)屬性,輸入輸出生產(chǎn)者狀態(tài)(IOPS,input output provider status)和輸入輸出消費(fèi)者狀態(tài)(IOCS,input output consumer status)。IOCS和IOPS狀態(tài)指示收到或發(fā)送的數(shù)據(jù)是否有效。
當(dāng)IO設(shè)備向IO控制器發(fā)送輸入數(shù)據(jù)時(shí),IO設(shè)備即是生產(chǎn)者也是消費(fèi)者。作為生產(chǎn)者時(shí),Set_Output_Data()函數(shù)發(fā)送過(guò)程數(shù)據(jù)并利用Set_Output_IOPS()函數(shù)為輸入數(shù)據(jù)設(shè)置IOPS狀態(tài),然后通過(guò)輸出數(shù)據(jù)CR將過(guò)程數(shù)據(jù)提供給IO控制器。作為消費(fèi)者時(shí),用Set_Intput_IOCS()函數(shù)向控制器報(bào)告自己之前接收到的數(shù)據(jù)是否可以使用。
當(dāng)IO控制器向IO設(shè)備發(fā)送輸出數(shù)據(jù)時(shí),IO設(shè)備調(diào)用Get_Intput_Data()函數(shù)獲取輸入緩沖區(qū)中數(shù)據(jù),Get_Intput_IOPS()函數(shù)讀取指定模塊的IOPS狀態(tài),Get_Output_IOCS()函數(shù)獲取IO控制器報(bào)告的接收到的數(shù)據(jù)是否可用信息。Data_Status_Changed()函數(shù)通知應(yīng)用程序接收到的數(shù)據(jù)狀態(tài)已更改。循環(huán)數(shù)據(jù)交換過(guò)程如圖6所示。
圖6 循環(huán)數(shù)據(jù)交互過(guò)程
PROFINET IO設(shè)備中集成的DCP協(xié)議實(shí)現(xiàn)程序主要包括處理DCP_Identify請(qǐng)求程序、處理DCP_Set請(qǐng)求程序、處理DCP_Get請(qǐng)求程序、處理DCP_Hello請(qǐng)求程序、閃爍信號(hào)燈、重置設(shè)置等。要求IO設(shè)備能夠?qū)刂破靼l(fā)出的DCP服務(wù)請(qǐng)求作出正確的響應(yīng)。IO控制器和IO設(shè)備上電后,IO設(shè)備接收到來(lái)自控制器的數(shù)據(jù)包,先判斷此包是否為PROFINET數(shù)據(jù)包,數(shù)據(jù)類型是否等于0x8892。再將接收到的數(shù)據(jù)包解析,根據(jù)frame ID發(fā)送到不同處理程序。本節(jié)主要分析DCP_Identify請(qǐng)求程序和處理DCP_Set請(qǐng)求程序的具體實(shí)現(xiàn)過(guò)程。
DCP是一種通過(guò)不同過(guò)濾判據(jù)進(jìn)行讀取和寫入設(shè)備參數(shù)及發(fā)現(xiàn)設(shè)備的協(xié)議。DCP服務(wù)的實(shí)現(xiàn)是根據(jù)設(shè)備選項(xiàng)進(jìn)行過(guò)濾判斷再執(zhí)行,IO控制器中發(fā)送的請(qǐng)求命令中包含篩選條件,滿足篩選條件的設(shè)備才會(huì)作出響應(yīng)。因此協(xié)議中定義了很多選項(xiàng)和子選項(xiàng),選項(xiàng)及子選項(xiàng)如表1所示。
表1 DCP用到的選項(xiàng)及子選項(xiàng)
DCP_Identify_Req()是處理傳入的DCP_Identify請(qǐng)求函數(shù),是實(shí)現(xiàn)構(gòu)造響應(yīng)并發(fā)送響應(yīng)的過(guò)程。請(qǐng)求中包含篩選條件,只有所有的條件都匹配的設(shè)備才發(fā)送響應(yīng)。接收到請(qǐng)求中的frame ID=0xfefe時(shí),表示接收到的是DCP_Identify請(qǐng)求需要發(fā)送DCP_Identify響應(yīng)。
先獲取本設(shè)備的MAC地址并給響應(yīng)分配緩沖區(qū),從接收到的請(qǐng)求幀中讀取信息準(zhǔn)備構(gòu)造響應(yīng)幀,其中響應(yīng)幀中的目的地址就是請(qǐng)求幀中的源地址,響應(yīng)幀中的源地址就是本設(shè)備的MAC地址。構(gòu)造響應(yīng)幀的報(bào)文頭,從請(qǐng)求幀的報(bào)文頭中修改所需要的內(nèi)容,包括以太網(wǎng)報(bào)文頭、PROFINET報(bào)文頭、DCP報(bào)文頭,DCP block報(bào)文頭。通過(guò)DCP_Get_Req_()函數(shù)來(lái)讀取請(qǐng)求幀中block頭中的選項(xiàng)和子選項(xiàng)。如果Option為PF_DCP_OPT_ALL并且子選項(xiàng)為PF_DCP_SUB_ALL時(shí),則將變量Identify_all賦值為ture,表示請(qǐng)求幀是要尋址所有設(shè)備,不過(guò)濾此條信息,IO設(shè)備也準(zhǔn)備做出響應(yīng)。根據(jù)讀取請(qǐng)求幀中的Option的值來(lái)改變變量match和ret的值,當(dāng)ret=0并且match=true時(shí),PF_dcp_Get_Req()函數(shù)插入Device_Option的元素個(gè)數(shù)個(gè)block構(gòu)造響應(yīng)幀。造響應(yīng)幀的流程圖如圖7所示。
圖7 處理DCP_Identify請(qǐng)求程序
DCP_Get_Set()是處理DCP_Set請(qǐng)求程序函數(shù),發(fā)送DCP_Set響應(yīng)的流程圖如圖8所示。使用Get_Device_Macaddr()函數(shù)檢查請(qǐng)求幀中的目的地址與本設(shè)備的MAC地址是否相匹配,如果匹配則修改請(qǐng)求幀為構(gòu)造響應(yīng)幀做準(zhǔn)備。包括在響應(yīng)幀中插入frame ID,設(shè)置以太網(wǎng)報(bào)頭,并從請(qǐng)求幀中復(fù)制DCP頭等。然后判斷請(qǐng)求幀中的Service_ID是否為PF_DCP_SERVICE_SET,在響應(yīng)中插入塊構(gòu)造完成響應(yīng)后發(fā)送響應(yīng),再通過(guò)DCP_Set_Commit()函數(shù)提交對(duì)ip_suite的更改。
圖8 處理DCP_Set請(qǐng)求程序
GSD是由元素和屬性構(gòu)成,基于可擴(kuò)展標(biāo)記語(yǔ)言(XML,eXtensible markup language)的通用工作站標(biāo)識(shí)語(yǔ)言(GSDML,general station description markup language )編寫,用來(lái)描述PROFINET設(shè)備功能的文件[18]。該文件主要描述了可在PROFINET IO設(shè)備中使用的可插拔硬件模塊類型,但設(shè)備實(shí)際要使用的硬件模塊需要在工程工具中進(jìn)行配置。配置好的組態(tài)信息下載到控制器中,控制器會(huì)告訴IO設(shè)備需要插入的IO模塊的類型,只有IO設(shè)備中所插入的模塊與組態(tài)信息中的配置模塊一致才能控制器和IO設(shè)備才能組態(tài)成功。GSD文件由
圖9 GSD文件結(jié)構(gòu)圖
圖10 GSD文件
PROFINET是在標(biāo)準(zhǔn)以太網(wǎng)的基礎(chǔ)上精簡(jiǎn)協(xié)議棧,不僅提高了實(shí)時(shí)性還使PROFINET的實(shí)現(xiàn)更加簡(jiǎn)單[19]。這種優(yōu)化是在軟件層面,因此主要要求硬件平臺(tái)能夠接受和發(fā)送以太網(wǎng)二層的數(shù)據(jù)幀就可以實(shí)現(xiàn)作為 IO設(shè)備接入PROFINET網(wǎng)絡(luò)中。本文選用Raspberry Pi 3B+(樹(shù)莓派)作為硬件平臺(tái),它是基于Linux系統(tǒng)的Cortex-A53架構(gòu)微型電腦主板,搭配千兆網(wǎng)卡LAN7515,不僅可以實(shí)現(xiàn)數(shù)據(jù)幀的收發(fā)還可以實(shí)現(xiàn)PC的基本功能[20]。樹(shù)莓派和PLC通過(guò)交換機(jī)連接,但此次測(cè)試采用的交換機(jī)不是鏡像交換機(jī),因此需要在樹(shù)莓派上運(yùn)行Wireshark軟件來(lái)抓取硬件平臺(tái)和IO控制器之間的數(shù)據(jù)交互。系統(tǒng)測(cè)試連接如圖11所示。
圖11 實(shí)驗(yàn)平臺(tái)結(jié)構(gòu)
在工程工具TAL Portal V15中對(duì)PROFINET IO系統(tǒng)進(jìn)行組態(tài),將IO設(shè)備的GSD文件加載到工程工具中[21]。組態(tài)連接如圖12所示。
圖12 TAL Portal組態(tài)
控制器上電后發(fā)送DCP廣播消息,子網(wǎng)上的所有IO設(shè)備用其MAC地址應(yīng)答。控制器向IO設(shè)備發(fā)送帶有特定MAC地址的DCP消息,其中包含IO設(shè)備應(yīng)使用的IP地址和站名。IO設(shè)備相應(yīng)地設(shè)置自己的IP地址和站名。 然后,PLC使用在IP上的UDP運(yùn)行的DCE/RPC協(xié)議啟動(dòng)IO設(shè)備的實(shí)際配置。配置完成后,IO設(shè)備和控制器之間連續(xù)交換循環(huán)數(shù)據(jù)。
樹(shù)莓派上運(yùn)行Wireshark對(duì)設(shè)備和控制器之間的通信進(jìn)行抓包分析。在設(shè)備剛啟動(dòng)時(shí),控制器先通過(guò)設(shè)備名稱“pndev”尋址設(shè)備并通過(guò)DCP_Set服務(wù)分配IP地址,ARP確認(rèn)過(guò)設(shè)備后開(kāi)始建立連接。系統(tǒng)的初始化數(shù)據(jù)是NRT非實(shí)時(shí)數(shù)據(jù),通過(guò)IP地址傳輸,其中192.168.0.1為PLC控制器的IP地址,192.168.0.50是樹(shù)莓派的IP地址。IO控制器和IO設(shè)備之間的連接建立分為四步:第一步建立AR和CR,控制器發(fā)送連接請(qǐng)求,樹(shù)莓派對(duì)建立連接的請(qǐng)求進(jìn)行響應(yīng),只有在能保證建立連接的時(shí)候才會(huì)發(fā)送響應(yīng),然后開(kāi)始建立數(shù)據(jù)交互所需的AR和CR。第二步傳輸參數(shù),控制器發(fā)送寫請(qǐng)求,樹(shù)莓派進(jìn)行響應(yīng)后給IO設(shè)備傳輸參數(shù),每個(gè)模塊或子模塊的參數(shù)都要進(jìn)行傳輸。第三步傳輸結(jié)束,控制器發(fā)出“DControl”請(qǐng)求也就代表著控制器對(duì)參數(shù)的傳輸結(jié)束,樹(shù)莓派進(jìn)行響應(yīng)后連接就完全建立起來(lái)了。第四步確認(rèn),樹(shù)莓派在發(fā)送“CControl”請(qǐng)求對(duì)連接的建立進(jìn)行確認(rèn),收到控制器的響應(yīng)后就開(kāi)始進(jìn)行數(shù)據(jù)交換。Wireshark在啟動(dòng)期間的抓包如圖13所示。
圖13 啟動(dòng)期間的數(shù)據(jù)交換
在工程工具中組態(tài)時(shí)設(shè)置IO設(shè)備的更新時(shí)間為4 ms,利用Wireshark軟件對(duì)系統(tǒng)數(shù)據(jù)交互進(jìn)行抓包,組態(tài)工具中的更新時(shí)間如圖14所示。將抓取到的數(shù)據(jù)進(jìn)行篩選,篩選出IO設(shè)備發(fā)送給控制器的RT數(shù)據(jù)并導(dǎo)出為CSV文件。在Excel中處理數(shù)據(jù),計(jì)算出相鄰兩個(gè)數(shù)據(jù)的發(fā)送時(shí)間差值得到更新時(shí)間,再計(jì)算相鄰兩個(gè)更新時(shí)間的差值得到更新時(shí)間抖動(dòng)值。利用Matlab繪制更新時(shí)間折線圖和抖動(dòng)折線圖,如圖15所示發(fā)送周期在所設(shè)置的4 ms上下浮動(dòng),并且可以看到抖動(dòng)值不超過(guò)50 μs,所實(shí)現(xiàn)的IO設(shè)備符合PROFINET RT實(shí)時(shí)性的要求。
圖14 工程工具中的更新時(shí)間
圖15 更新時(shí)間及抖動(dòng)值
PROFINET是工業(yè)實(shí)時(shí)以太網(wǎng)絡(luò)中的典型代表,在PROFINET應(yīng)用廣泛的今天,對(duì)PROFINET的研究應(yīng)該更加深入和多面化。針對(duì)同類設(shè)備依賴特定芯片,成本較高,可移植性差的問(wèn)題,通過(guò)軟件設(shè)計(jì)在普通網(wǎng)卡下實(shí)現(xiàn)PROFINET IO的RT和NRT通信。為證明廣泛性,在樹(shù)莓派硬件平臺(tái)上移植協(xié)議棧實(shí)現(xiàn)樹(shù)莓派接入PROFINET網(wǎng)絡(luò)。本文在實(shí)現(xiàn)通信功能的基礎(chǔ)上對(duì)PROFIENT協(xié)議棧中的DCP協(xié)議進(jìn)行重點(diǎn)研究。闡述了DCP協(xié)議的功能、原理和在PROFINET網(wǎng)絡(luò)中所起的作用,對(duì)DCP的軟件程序進(jìn)行了設(shè)計(jì)與實(shí)現(xiàn)。最后為所設(shè)計(jì)的IO設(shè)備搭建了一套測(cè)試系統(tǒng),并完成硬件組態(tài)。驗(yàn)證了從組態(tài)到系統(tǒng)啟動(dòng)中DCP的作用和IO設(shè)備所實(shí)現(xiàn)的RT和NRT通信功能。通過(guò)在樹(shù)莓派上運(yùn)行Wireshark抓包軟件對(duì)IO設(shè)備和控制器PLC建立通信前的流程和DCP的功能實(shí)現(xiàn)過(guò)程進(jìn)行分析,對(duì)所抓取的數(shù)據(jù)進(jìn)行了篩選分析,得出了IO設(shè)備更新時(shí)間的抖動(dòng)值,設(shè)備的實(shí)時(shí)性及可靠性滿足自動(dòng)化生產(chǎn)控制中的需要,具有廣泛的應(yīng)用前景。本文對(duì)PROFINET IO通信的實(shí)現(xiàn)和對(duì)集成協(xié)議DCP的分析與研究,可以幫助從事相關(guān)方向的工程師掌握PROFINET技術(shù)的應(yīng)用。