【新閣教育】基于EtherNet/IP實(shí)現(xiàn)歐姆龍NX系列PLC通信
1、引言
工業(yè)以太網(wǎng)協(xié)議 (Ethernet/IP) 是由ODVA所開(kāi)發(fā)并得到了羅克韋爾自動(dòng)化的強(qiáng)大支持。它使用已用于ControlNet和DeviceNet的控制和信息協(xié)議 (CIP) 為應(yīng)用層協(xié)議。+vx:xiketang777領(lǐng)取資料

CIP提供了一系列標(biāo)準(zhǔn)的服務(wù),提供“隱式”和“顯示”方式對(duì)網(wǎng)絡(luò)設(shè)備中的數(shù)據(jù)進(jìn)行訪問(wèn)和控制。CIP數(shù)據(jù)包必須在通過(guò)以太網(wǎng)發(fā)送前經(jīng)過(guò)封裝,并根據(jù)請(qǐng)求服務(wù)類型而賦予一個(gè)報(bào)文頭。這個(gè)報(bào)文頭指示了發(fā)送數(shù)據(jù)到響應(yīng)服務(wù)的重要性。通過(guò)以太網(wǎng)傳輸?shù)腃IP數(shù)據(jù)包具有特殊的以太網(wǎng)報(bào)文頭,一個(gè)IP頭、一個(gè)TCP頭和封裝頭。封裝頭包括了控制命令、格式和狀態(tài)信息、同步信息等。這允許CIP數(shù)據(jù)包通過(guò)TCP或UDP傳輸并能夠由接收方解包。相對(duì)于DeviceNet或ControlNet,這種封裝的缺點(diǎn)是協(xié)議的效率比較低。以太網(wǎng)的報(bào)文頭可能比數(shù)據(jù)本身還要長(zhǎng),從而造成網(wǎng)絡(luò)負(fù)擔(dān)過(guò)重。因此,EtherNet/IP更適用于發(fā)送大塊的數(shù)據(jù) (?如程序 ) ,而不是DeviceNet和ControlNet更擅長(zhǎng)的模擬或數(shù)字的I/O數(shù)據(jù)。
EtherNet/IP指的是"以太網(wǎng)工業(yè)協(xié)議"(Ethernet Industrial Protocol)。它定義了一個(gè)開(kāi)放的工業(yè)標(biāo)準(zhǔn),將傳統(tǒng)的以太網(wǎng)與工業(yè)協(xié)議相結(jié)合。該標(biāo)準(zhǔn)是由國(guó)際控制網(wǎng)絡(luò)(CI, ControlNet International)和開(kāi)放設(shè)備網(wǎng)絡(luò)供應(yīng)商協(xié)會(huì) (ODVA)在工業(yè)以太網(wǎng)協(xié)會(huì) (IEA, Industrial Ethernet Association)的協(xié)助下聯(lián)合開(kāi)發(fā)的,并于2000年3月推出。EtherNet/IP是基于TCP/IP系列協(xié)議,因此采用以原有的形式OSI層模型中較低的4層。所有標(biāo)準(zhǔn)的以太網(wǎng)通信模塊,如PC接口卡、電纜、連接器、集線器和開(kāi)關(guān)都能與 EtherNet/IP 一起使用。【公眾號(hào)dotNet工控上位機(jī):thinger_swj】
2、 EtherNet/IP_報(bào)文格式
注冊(cè)請(qǐng)求幀:EtherNet/IP與Fins類似,在正式通信前需要進(jìn)行注冊(cè)請(qǐng)求,獲取到會(huì)話句柄。
注冊(cè)請(qǐng)求幀報(bào)文格式如下:

因此,一個(gè)完整的注冊(cè)請(qǐng)求幀發(fā)送實(shí)例:
65 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
注冊(cè)應(yīng)答幀:顧名思義,注冊(cè)應(yīng)答幀就是注冊(cè)請(qǐng)求幀的應(yīng)答報(bào)文,包含了我們需要的會(huì)話句柄。
注冊(cè)應(yīng)答幀報(bào)文格式如下:

注冊(cè)請(qǐng)求幀接收實(shí)例:
65 00 04 00 71 01 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
根據(jù)應(yīng)答報(bào)文,提取會(huì)話句柄為:0x71 0x01 0x0E 0x00
其中狀態(tài)相當(dāng)于錯(cuò)誤代碼,如下所示:

讀取信息報(bào)文幀 EtherNet/IP
PLC標(biāo)簽:TAG1
讀取報(bào)文:
封裝頭:6F 00 28 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
命令數(shù)據(jù):00 00 00 00 01 00 02 00 00 00 00 00 B2 00 18 00 52 02 20 06 24 01 0A F0 0A 00 4C 03 91 04 54 41
47 31 01 00 01 00 01 00
報(bào)文解析:
6F 00 命令碼
28 00 后面數(shù)據(jù)報(bào)文長(zhǎng)度
70 01 27 00 會(huì)話句柄
00 00 00 00 狀態(tài),默認(rèn)值0
00 00 00 00 00 00 00 00 發(fā)送方描述
00 00 00 00 選項(xiàng)默認(rèn)
00 00 00 00 接口句柄 00 00 00 00 代表CIP
01 00 超時(shí)
02 00 項(xiàng)數(shù)
00 00 空地址項(xiàng)
00 00 空地址項(xiàng)長(zhǎng)度
B2 00 未連接項(xiàng) 默認(rèn)
18 00 CIP報(bào)文包的長(zhǎng)度
52 命令
02 請(qǐng)求路徑長(zhǎng)度
20 06 24 01 默認(rèn)請(qǐng)求路徑
0A F0 0A 00 默認(rèn)超時(shí)
4C 服務(wù)標(biāo)識(shí)
03 CIP長(zhǎng)度多少字
91 固定
04 PLC標(biāo)簽長(zhǎng)度 多少個(gè)字節(jié)
01 00 讀取長(zhǎng)度
01 00 01 00 槽號(hào)
返回信息報(bào)文幀 EtherNet/IP
返回報(bào)文:
封裝頭:6F 00 18 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
命令數(shù)據(jù):00 00 00 00 01 00 02 00 00 00 00 00 B2 00 08 00 CC 00 00 00 C1 00 00 00
報(bào)文解析:
6F 00 命令
18 00 長(zhǎng)度 (總長(zhǎng)度 -封裝頭長(zhǎng)度 )
71 01 14 00 會(huì)話句柄(會(huì)話ID)
00 00 00 00 會(huì)話狀態(tài)
00 00 00 00 00 00 00 00 發(fā)送方描述 固定
00 00 00 00 選項(xiàng) 默認(rèn)
00 00 00 00 接口句柄 ,00000000 指CIP
01 00 超時(shí)
02 00 項(xiàng)數(shù) 默認(rèn)2
00 00 連接的地址項(xiàng)
00 00 連接地址項(xiàng)長(zhǎng)度
B2 00 未連接數(shù)據(jù)項(xiàng)
08 00 連接長(zhǎng)度
CC 服務(wù)標(biāo)識(shí)
00 填充字節(jié)
00 00 狀態(tài)
C1 00 數(shù)據(jù)類型 BOOL (0x00C3(195) 為整型,0x00CA(202)為實(shí)型, 0x00C1(193)為布爾型,long 型為0x00C4,BYTE為0x00C2 )
00 00 數(shù)據(jù)值
寫入信息報(bào)文幀 EtherNet/IP
PLC標(biāo)簽:TAG1
寫入報(bào)文:
封裝頭:6F 00 2C 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
命令數(shù)據(jù):00 00 00 00 01 00 02 00 00 00 00 00 B2 00 1C 00 52 02 20 06 24 01 0A F0 0E 00 4D 03 91 04 54
41 47 31 C1 00 01 00 00 00 01 00 01 00
解析報(bào)文:
6F 00 命令碼
2C 00 長(zhǎng)度(去除header后報(bào)文長(zhǎng)度 字節(jié)為單位)
71 01 14 00 會(huì)話句柄
00 00 00 00 會(huì)話狀態(tài)
00 00 00 00 00 00 00 00 發(fā)送方描述 固定
00 00 00 00 選項(xiàng) 默認(rèn)
00 00 00 00 接口句柄 ( 00 00 00 00 指CIP)
01 00 超時(shí)
02 00 項(xiàng)數(shù) 默認(rèn)2
00 00 空地址項(xiàng) 默認(rèn)
00 00 空地址項(xiàng)長(zhǎng)度 默認(rèn)
B2 00 未連接數(shù)據(jù)項(xiàng) 默認(rèn)
1C 00 數(shù)據(jù)長(zhǎng)度 指后面數(shù)據(jù)長(zhǎng)度 (字節(jié))
52 請(qǐng)求服務(wù)代碼
02 請(qǐng)求路徑長(zhǎng)度
20 06 24 01 請(qǐng)求路徑 默認(rèn)
0A F0 超時(shí)默認(rèn) 245760ms
OE 00 長(zhǎng)度(從服務(wù)標(biāo)識(shí)開(kāi)始 到 寫入的值 結(jié)束 )
4D 服務(wù)標(biāo)識(shí)
03 長(zhǎng)度(91 04 54 41 47 31 )
91 固定
04 標(biāo)簽長(zhǎng)度
54 41 47 31 TAG1(標(biāo)簽名)
C1 00 數(shù)據(jù)類型 bool0x00C3(195) 為整型,0x00CA(202)為實(shí)型,0x00C1(193)為布爾型,long 型為0x00C4,BYTE為0x00C2
01 00 寫入數(shù)量
00 00 寫入的值 false:0 TRUE:任意非0數(shù)
01 00 01 00 PLC槽號(hào)
返回報(bào)文:
封裝頭:6F 00 14 00 71 01 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
命令數(shù)據(jù):00 00 00 00 01 00 02 00 00 00 00 00 B2 00 04 00 cd 00 00 00
解析報(bào)文:
71 01 14 00 會(huì)話句柄
B2 00 未連接數(shù)據(jù)項(xiàng) 默認(rèn)
CD 服務(wù)標(biāo)識(shí)(寫)固定
00 填充字節(jié)
0000 狀態(tài):成功
多標(biāo)簽讀取
參考單標(biāo)簽的報(bào)文幀,讀取TAG1 和TAG2
54 41 47 31 TAG1
54 41 47 32 TAG2
發(fā)送報(bào)文:
6F 00 3E 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 2E 00 52 02 20 06 24 01 0A F0 20 00 0A 02 20 02 24 01 02 00 06 00 10 00 4C 03 91 04 54 41 47 31 01 00 4C 03 91 04 54 41 47 32 01 00 01 00 01 00
返回報(bào)文:
6F 00 2A 00 70 01 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 1A 00 8A 00 00 00 02 00 06 00 0E 00 CC 00 00 00 C1 00 01 00 CC 00 00 00 C1 00 01 00
注銷會(huì)話:注銷會(huì)話顧名思義就是通信結(jié)束時(shí)發(fā)送,注銷會(huì)話是沒(méi)有返回值的。
注銷會(huì)話報(bào)文:
66 00 00 00 71 01 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
報(bào)文解析:
66 00 :命令
00 00 :長(zhǎng)度
71 01 04 00:要注銷的會(huì)話句柄
00 00 00 00 狀態(tài) 默認(rèn)0
00 00 00 00 00 00 00 00:發(fā)送內(nèi)容 默認(rèn)0
00 00 00 00:選項(xiàng) 默認(rèn)0
3、 EtherNet/IP通信應(yīng)用
歐姆龍NX系列PLC不支持Fins通信,也不支持OPCUA,綜合考慮,只能通過(guò)Ethernet/IP與其進(jìn)行通信。這里使用CMSPro進(jìn)行通信應(yīng)用,CMSPro集成了EtherNet/IP通信庫(kù),并支持項(xiàng)目應(yīng)用。
新增設(shè)備:打開(kāi)CMSPro軟件,PLC設(shè)備>新增PLC設(shè)備>歐姆龍CIP,新增一個(gè)PLC設(shè)備,如下所示:

新增通信組:在PLC設(shè)備上右擊新增通信組,添加一個(gè)通信組,這里的通信組沒(méi)有實(shí)際具體的意義,只是為了便于管理通信變量。
添加變量前,首先注意一下上位機(jī)變量類型與PLC變量類型的對(duì)應(yīng)關(guān)系,如下所示:

標(biāo)簽變量添加:標(biāo)簽變量是指無(wú)結(jié)構(gòu)體和數(shù)組參與的變量,在通信組中,右擊新增變量,添加一個(gè)通信變量,對(duì)于標(biāo)簽變量,直接按照實(shí)際PLC中的變量名稱輸入即可,我們添加一個(gè)PLC中名為grHWCs_PV變量:


結(jié)構(gòu)體變量添加:對(duì)于結(jié)構(gòu)體中的變量添加,可以按照標(biāo)簽變量的方式,變量地址填寫結(jié)構(gòu)體名稱.變量名,也可以通過(guò)先添加一個(gè)結(jié)構(gòu)體變量,然后在這個(gè)結(jié)構(gòu)體變量下,添加一個(gè)變量,一般建議用后者,這樣比較直觀,后續(xù)也便于管理。



數(shù)組變量添加:對(duì)于數(shù)組變量添加,可以按照標(biāo)簽變量的方式,變量地址填寫數(shù)組名[索引],也可以通過(guò)先添加一個(gè)數(shù)組變量,然后在這個(gè)數(shù)組變量下,添加一個(gè)變量,一般建議用后者,這樣比較直觀,后續(xù)也便于管理。【公眾號(hào)dotNet工控上位機(jī):thinger_swj】



按照這種方式添加好變量后,保存并運(yùn)行,然后測(cè)試結(jié)果是否正確。


測(cè)試完成讀取后,通過(guò)修改查看,是否可以修改變量。
