Ethernet/IP是一種工業(yè)自動化領(lǐng)域中常用的網(wǎng)絡(luò)通信協(xié)議,它是基于標(biāo)準(zhǔn)以太網(wǎng)技術(shù)的應(yīng)用層協(xié)議。作為工業(yè)領(lǐng)域的通信協(xié)議之一,Ethernet/IP 提供了一種在工業(yè)自動化設(shè)備之間實現(xiàn)通信和數(shù)據(jù)交換的標(biāo)準(zhǔn)化方法。python要實現(xiàn)Ethernet/IP的客戶端,可以采用pycomm3模塊,但不一定是pycomm3,其中原委咋們慢慢聊,本文為第二篇。
一、模塊選型
1、查找模塊的方式
(1)可以去python官方網(wǎng)站查詢
在查詢時注意輸入Ethernet/IP時,將/去掉,這跟官網(wǎng)的查詢方式有關(guān)。
PyPI · The Python Package Index
(2)EthernetIP
GitHub: Let’s build from here · GitHub
(3)搜索引擎
可以通過百度、谷歌等查找模塊。
2、備選模塊
(1)pycomm3
簡單看一下模塊的介紹,還是跟PLC相關(guān)的,因此這個EIP比較靠譜。
pycomm3?started as a Python 3 fork of?pycomm, which is a Python 2 library for communicating with Allen-Bradley PLCs using Ethernet/IP. The initial Python 3 port was done in this?fork?and was used as the base for?pycomm3. Since then, the library has been almost entirely rewritten and the API is no longer compatible with?pycomm. Without the hard work done by the original?pycomm?developers,?pycomm3?would not exist. This library seeks to expand upon their great work.
(2)cpppo
也是跟PLC相關(guān)的,不過實現(xiàn)的是與Allen-Bradley通信,而且一些實現(xiàn)并不完整。
A subset of the EtherNet/IP client and server protocol is implemented, and a simulation of a subset of the Tag communications capability of a Allen-Bradley ControlLogix 5561 Controller is provided. It is capable of simulating ControlLogix Tag access, via the Read/Write Tag [Fragmented] services.
Only EtherNet/IP “Unconnected” type connections are supported. These are (somewhat anomalously) a persistent TCP/IP connection from a client to a single EtherNet/IP device (such as a *Logix Controller), which allow the client to issue a sequence of CIP service requests (commands) to be sent to arbitrary CIP objects resident on the target device. Cpppo does not implement “Connected” requests (eg. those typically used between *Logix PLCs, in an industrial LAN environment).
A Tag is simply a shortcut to a specific EtherNet/IP CIP Object Instance and Attribute. Instead of the Client needing to know the specific Instance and Attribute numbers, the more easily remembered and meaningful Tag may be supplied in the request path.
(3)其他
還有一些模塊跟EtherNet/IP相關(guān),大家可以跟據(jù)上述提供的查找方式進(jìn)行查詢,我們先以這兩個相對靠譜模塊實驗一把。
二、實驗方式
1、如何實驗
(1)先抓一個正常的交互包,作為基準(zhǔn)
(2)使用模塊安裝官方文檔進(jìn)行請求,查看包的情況
(3)根據(jù)包的情況與官方文檔調(diào)整請求參數(shù)
(4)一步步實驗直到通訊正常
2、已知EDS文件的情報
(1)包含了連接與請求的相關(guān)信息
(2)不確定這些信息該在模塊中如何使用
三、開始實驗
1、使用pycomm3的哪個類?
通過上一篇文章,我們知道pycomm3的三個類情況,而我們的實驗對象不是標(biāo)準(zhǔn)的PLC,因此先實驗 CIPDriver 。
from pycomm3 import CIPDriver
print(CIPDriver.discover())
如下圖,這個模塊是可以查詢 EIP的相關(guān)設(shè)備的,有點(diǎn)靠譜。
而通過以下方法可以獲取指定IP的EIP設(shè)備信息:
CIPDriver.list_identity('192.168.1.189')
現(xiàn)在我們連接一下EIP設(shè)備,看看表現(xiàn):
from pycomm3 import CIPDriver
CIPDriver("192.168.1.189").open()
如下圖,沒有報錯說明是可連的。
但當(dāng)進(jìn)一步想要獲取設(shè)備的模塊信息時,卻無法進(jìn)行:
from pycomm3 import CIPDriver
driver=CIPDriver("192.168.1.189")
driver.open()
driver.get_module_info(0) # Slot 0: PLC
很顯然,報錯表明無法獲取EIP設(shè)備的模塊信息,猜測其原因可能是EIP設(shè)備沒有相關(guān)獲取信息的服務(wù)提供給出來。這個模塊看起來可以獲取PLC的其他插槽的板卡信息。
我們查看數(shù)據(jù)包的情況,發(fā)現(xiàn)我們的請求時不連接發(fā)送,可能這種請求方式不被服務(wù)器處理:
經(jīng)過上述實驗,使用CIPDriver類還是比較靠譜的,而其他兩個類是針對指定型號的PLC,基于CIPDriver類進(jìn)行的封裝,因此不需要再去嘗試其他類。
2、后續(xù)實驗
經(jīng)過上述操作,我們簡單了解了實驗過程,并且確定了使用哪個模塊哪個類去做實驗,而后續(xù)實驗將基于這個類慢慢展開。