關 閉

新聞中心

EEPW首頁 > 工控自動化 > 設計應用 > 對歐姆龍PLC使用Python程序連接使用方法的研究

對歐姆龍PLC使用Python程序連接使用方法的研究

作者:牛凱,李冰融,李鑫(國網上海市電力公司,上海 200235) 時間:2023-08-20 來源:電子產品世界 收藏
編者按:在工業(yè)上PLC的使用十分廣泛,其是許多大規(guī)模工作系統(tǒng)的基礎控件。歐姆龍PLC提供Fins協(xié)議作為與其通信的方法,為了搭建計算機主機與PLC通信的橋梁,需要專門的Python程序用于與歐姆龍通信。本文介紹了使用Python程序與歐姆龍PLC進行通信的基本步驟以及在項目中Python通信程序的具體構建方法,在如今基于Python程序進行Fins協(xié)議進行通信的資料較少的情況下,對同類型的項目有著借鑒作用。


本文引用地址:http://2s4d.com/article/202308/449750.htm

0 引言

( 可編程邏輯控制器) 是一種專門為在工業(yè)環(huán)境下應用而設計的數字運算操作電子系統(tǒng)。在工業(yè)上的使用十分廣泛,其是許多大規(guī)模工作系統(tǒng)包括鋼鐵、石油、化工、電力、建材、機械制造、汽車、輕紡、交通、環(huán)保、文化娛樂等各行業(yè)中得到廣泛的應用的基礎控件。雖然 對基礎的工業(yè)控制能起到很好的效果,但對于更加復雜的應用場景,單純使用PLC 進行控制難度較大。因此為了實現(xiàn)較為復雜的功能,在PLC 的上層,往往需要使用應用更加廣泛的編程語言如C++、編寫的復雜程序等進行控制,由于PLC 的運行與承載程序的上位計算機的底層邏輯并不相同,PLC 與上位計算機的成為工程上的重要課題。在實際應用中不同廠家所提供的PLC 方法并不相同,因此需要根據實際需求設計針對性的程序[1]。

歐姆龍PLC提供Fins協(xié)議作為與其通信的方法,為了搭建計算機主機與PLC 通信的橋梁,當計算機使用語言編寫控制邏輯時,需要專門的 通信程序用于與PLC 通信。由于大部分的PLC 設備都不直接與Python程序直連,而是通過C/C++ 的方式作為中間層的程序,這使得網上公開的使用Python 程序基于Fins 協(xié)議通信歐姆龍PLC 的程序難以尋找且僅有的程序注釋解釋不足,在實際運行過程中容易出現(xiàn)各種問題,自己根據實際要求開發(fā)對應的Python 通信程序是必要的[2]。

本文介紹了使用Python 程序與歐姆龍PLC 進行通信的基本步驟以及在項目中Python 通信程序的具體構建方法,在如今基于Python 程序進行Fins 協(xié)議進行通信的資料較少的情況下,對同類型的項目有著借鑒作用。

1 Python程序與歐姆龍PLC通信

在進行程序上的通信前首先要建立物理上的連接。此次使用的歐姆龍PLC 型號為CP1H,其狀態(tài)如圖1 所示。此次選擇的通訊方式是通過網線連接,一端連接計算機,一端連接PLC,用以傳輸數據,該PLC 還能夠使用USB 連接,此時可以使用對應的調試程序對其進行修改,主要用于程序調試和測試。

硬件連接后,下一步則是進行軟件的連接通訊,F(xiàn)ins協(xié)議屬于數據層的協(xié)議,依賴于TCP/IP 協(xié)議,該型號的PLC 使用TCP 協(xié)議進行通訊,這里Fins 協(xié)議將作為TCP協(xié)議的數據進行傳輸。TCP協(xié)議的可靠性較好,但傳輸數據需要經過多次確認,因此在速度上略有損失。同時Fins 協(xié)議也規(guī)定了自己的返回信息。Fins 協(xié)議的數據傳遞邏輯如下。

1692475083141464.png

圖1 CP1H型PLC與連接

1.1 TCP連接

在主機與PLC 溝通之前,首先要建立TCP 的連接。這一部分可以調用Socket 包來實現(xiàn),對于不同語言來說,需要設置的結構會存在一些差別。TCP 協(xié)議共需要經過3 次握手,第1 次握手為客戶端向服務端發(fā)送網絡包,以此發(fā)起連接,同時向服務端告知自己的傳輸能力。第2 次為服務端向客服端回發(fā),以測試客戶端的接受能力以及服務端的發(fā)送能力。第3 次客戶端再次向服務端發(fā)信,進行進一步確認,從而進行聯(lián)系。在TCP 層面,之后每次傳遞數據都會收到回復。

1.2 Fins連接

完成TCP 連接后,接下來依靠TCP 協(xié)議進行Fins協(xié)議的連接。對于Fins 協(xié)議連接也需要進行一次請求,這里的請求與TCP 不同,只需要進行兩次,一次由主機向PLC 發(fā)送請求信息,另一次由PLC 發(fā)送確認信息,這一過程規(guī)定了Fins 協(xié)議通信中的一些基礎信息,包括節(jié)點地址、節(jié)點網絡號等。

1.3 PLC通信

當主機和PLC 完成確認后就可以進行信息的傳輸工作。對于Fins 協(xié)議通信,最重要的特點就是所有的數據請求都由主機發(fā)出,PLC 只進行被動應答操作。如對于讀入操作,由主機發(fā)送信息,確認要進行讀取以及讀取的位置,PLC 接受到信號后按照信號進行操作,之后將數據進行返回[3],在這種情況下,主機被稱為發(fā)送方,而PLC 被稱為接收方。在這種框架下,命令只能由發(fā)送方發(fā)出,PLC 會將數據存儲在實現(xiàn)規(guī)定的地方,讓主機發(fā)布命令獲取。

2 Fins數據幀

Fins 數據幀包括Fins header、Fins command 和Fins data3 部分,其中Fins header 用于對地址目標進行識別,F(xiàn)ins command 用于傳遞命令,而Fins data 用于傳輸所需數據。在Fins 協(xié)議中,發(fā)送方使用的命令幀和接收方使用的響應幀的結構是有所區(qū)別的,其中命令幀的主要結構如下。

2.1 Fins header

該部分共有10個字節(jié),按順序依次為ICF(Information Control Field),用于顯示框架信息,由4 個子字段組成,有效信息包括是否使用網關、該數據的具體類型(響應或命令)以及是否必須進行回應,該字節(jié)還有5個保留位,在一些情況下可以指定一些特殊信息;RSV(Reserved),系統(tǒng)保留字;GCT(Gateway count),網關的允許數量;DNA(Destination  network address)發(fā)送目標的網絡地址,用于指定目標的節(jié)點網絡號;DA1(Destination node number)目標節(jié)點地址,此處需要注意的是可以設置為FF,此時為廣播編號;DA2(Source unit number)目的單位地址,指定目標節(jié)點的單元編號;SNA(Source network address)發(fā)送方的網絡地址,用于指定發(fā)送方所在的節(jié)點網絡號,SA1(Source node number)發(fā)送方的節(jié)點地址;SA2(Source Unit address)發(fā)送方的目的單位地址;SID(Service ID)服務序列號,用于標識生成傳輸過程,響應中返回相同數字來匹配命令和響應。以上各單元均占1 個字節(jié)。

2.2 Fins command

該部分共占兩個字節(jié),包括MRC 和SRC,分別儲存了1 個字節(jié)的請求代碼,其中MRC 為主代碼,決定命令類別,SRC 為次要代碼,決定類別下的具體命令。例如當MRC 為01 時,類型為I/O 讀寫,此時當SRC為01 時,該命令為讀取I/O。讀取Fins 協(xié)議能夠指定的命令相當多,常見的操作包括讀寫I/O 信息、讀寫參數區(qū)信息、操作模式切換、狀態(tài)讀取、時間讀取、讀寫故障信息、讀寫文件和強制設置某些位等。

2.3 Fins data

存放需要傳輸的數據,最大2 000 字節(jié),實際結構受到Fins command部分的約束,即不同命令需要傳輸的數據格式是不同的。例如讀取I/O 區(qū)時,data 區(qū)的結構為一個字節(jié)的I/O 儲存區(qū)的對應編號、3 個字節(jié)的數據起始位置和兩個字節(jié)的讀取數據大小。

對于響應幀,其與命令幀的區(qū)別在于Fins data 部分增加了兩個字節(jié),分別為MRES、SRES,存儲了命令幀的主相應和子響應代碼,其和實際的傳輸數據合一起組成了FINS 數據域,這使得響應幀能夠傳輸的實際數據最大值變?yōu)? 998 個字節(jié)。

確定了歐姆龍PLC 傳輸數據的基本格式后,接下來就是設計所需的Python 程序了。本設計使用了Python包的socket 進行編寫,通過調用該包的方式,可以避免對TCP 協(xié)議的頭部進行設計和模擬,簡化操作。

3 PLC連接過程的程序設計

3.1 對PLC進行初步連通

在對PLC 進行Fins 協(xié)議通信前,首先要確認連通了PLC 本身。此時應輸入PLC 的IP 地址,還需要PLC的端口號,歐姆龍PLC 的端口號默認為9 600,基本不會改變。計算機的IP 地址由函數進行獲取,由于不同系統(tǒng)獲取IP 地址的方式不同,需要對應編寫函數,再進行匯總,再使用socket 包自帶的TCP 通訊函數在TCP 層面將主機與PLC 進行連通,測試成功連接后就可以進行下一步驟。

3.2 對PLC進行握手

根據之前的PLC 溝通過程,對PLC 進行握手是進行數據傳輸的必要步驟。拼接PLC 幀的方式是首先根據通信幀的具體結構對得出各個部分的具體數據,根據要求轉換為十六進制,再轉化為字符串,拼接在一起。拼接完數據后,再將數據發(fā)送出去,等待PLC 的響應和對應的連接數據傳回。數據傳回后,對其進行核對,不為空則成功連接,否則輸出連接失敗。如果數據超過一定時間沒有傳回,同樣輸出連接失敗。

3.3 使用PLC

本項目中,主要通過程序對PLC的數據區(qū)進行操作。一共涉及讀數據和寫數據兩種操作。在讀數據的過程中,需要分別設計Fins 幀中的3 部分,其中Fins header由于主要用于輸出連接信息,F(xiàn)ins command 則需要輸出命令的具體內容,包括讀命令,讀取的具體區(qū)域,本項目中指DM 區(qū),讀數據的具體起始地址以及讀取的長度,F(xiàn)ins data 則為空。然后將3 段拼接起來進行輸出。之后線程開始等待PLC 返回的具體數值,數據返回后,對命令進行解析判斷,當格式符合要求時,讀取對應的數據,并對其進行格式轉換。等待需要設計1 個時限,當超過一定時間數據仍為進行返回或者沒有返回正確數據時,認為發(fā)生了未知錯誤,程序報錯并退出,并及時通知主程序。寫數據與讀數據存在一些區(qū)別,包括Finsdata 將輸出寫入命令,寫入的具體區(qū)域,寫數據的具體起始區(qū)域以及寫入長度,之后還要傳輸經過格式轉換后的寫入數據。當命令傳輸后,只需要解析返回幀是否符合要求即可。

3.4 注意事項

除了對于讀寫數據需要設計專門的函數外,由于不同的數據類型數據結果區(qū)別很大,且PLC 的數據類型與Python 不能簡單兼容,需要將數據分為Bool、UShort、Int、Float 和String 幾類,根據具體情況分別設計讀寫函數,且不同情況下的字符轉換方式也需要分別設計。對于Bool 類型的數據,由于Python 中將Bool和數字分為兩類,讀取后需要將其轉換為對應的數字,對于數字類型,則需要根據實際存放的要求轉換為對應的十六進制數。對于Float 類型數據需要注意小數點的位置。對于String 類型則需要逐一讀取字符,先轉換回十進制字符,再根據對應的ASCII 碼值替換成對應的字符。對于寫操作則按以上進行相反的操作。對于位操作,由于其不需要進行類型轉換,為了提高讀取寫入速度,需要設計專門的寫入讀取函數,以簡化操作步驟,提高運行效率。最后對于所有操作都需要設計1 個時鐘計數,當1 個操作經過一定時間沒有被響應,則判斷連接出現(xiàn)問題,需要及時向上層程序進行反饋。

在實際一般的需求通信的程序運行過程中,一般需要單獨開辟1 個線程負責與PLC 的連接通信操作,并將其全程掛起,以達到實時接收發(fā)送數據的目的,但這樣可能會占用大量的內存資源。鑒于Fins 協(xié)議可以只從主機一端開始通信的特點,可以設計專門的線程函數,在未使用時將其掛起,當需要使用是再進行喚醒和調用,從而提高使用效率,將更多內存放松給主機使用。這種操作的缺點在于,當系統(tǒng)需要與PLC 進行通信時,才可能得知現(xiàn)在的連接狀態(tài)是否出現(xiàn)問題。如果需要對連接狀態(tài)進行實時控制,還是應當使用連續(xù)的進程。

為了保證數據進行平穩(wěn)傳輸,還需要為線程設計1個鎖對象,用于鎖定通訊流程,使流程過程中其操作的數據不會被隨意改變且線程不會被隨意中斷,保證整個讀取過程的穩(wěn)定性。此外當通信的中間環(huán)節(jié)發(fā)生錯誤時,需要及時將信號發(fā)送給上層程序,之后退出通信。值得注意的是,F(xiàn)ins 協(xié)議中不存在實際上的退出過程,這意味著實際上通訊是能夠隨時中斷的,并不會影響端口的使用和占用[4]。

由于PLC 存在多個接口,所以可以在連通的情況下使用另一根導線連接另一個接口,這樣可以使用另一臺主機對PLC 的實時狀態(tài)進行監(jiān)測,以在沒有讓PLC實際運行線下設備的狀態(tài)下進行調試。

在設計完成后,需要對程序設計測試。本次測試使用CX-Programmer 軟件在另一臺監(jiān)控主機上進行,在運行Python 程序前先查看PLC 的DM 區(qū)的具體數據,再使用程序進行PLC 進行讀寫操作,然后再使用軟件查看具體數據變化,對于讀操作則查看是否讀取了對應數據,對于寫操作則查看是否寫入正確數據,結果完美完成了讀出寫入數據的任務,反應時長達到使用要求,且當人為設計了連接錯誤后,能較好地將連接錯誤反應到上層程序。

4 結束語

本文設計了歐姆龍PLC 使用Python 程序基于Fins協(xié)議的進行通信的具體步驟,并設計了一種基于Python的軟件通信方法,該方法完成了主機與PLC的連接通信,并完成了讀取數據區(qū)數據和寫入數據的操作,在Python軟件程序與歐姆龍PLC 通過Fins 協(xié)議進行通訊的網絡資料較少的現(xiàn)狀下,具有一定的借鑒作用。由于現(xiàn)存的實際項目對于通訊的功能要求不高,不要求通過軟件對PLC 進行實際控制,本文只研究了讀取和寫入數據區(qū)的兩類功能,在今后的研究中,還需要繼續(xù)研究對PLC 進行控制以及讀寫大文件的軟件程序編寫方法,從而提高程序的泛用性和功能性。

參考文獻:

[1] 黃燕民,陳宏軒,羅友高,等.基于Python與S7-1500的清洗機器人運動控制系統(tǒng)[J].機電一體化,2022,28(Z2):79-84.

[2] 王奚,王新月,李航,等.面向PLC產品的自動化測試系統(tǒng)平臺設計與實現(xiàn)[J].自動化儀表,2022,43(5):8-11+19.

[3] 韓志三.基于Python的豐煒系列PLC與PC串行通信的實現(xiàn)[J].硅谷,2013,6(22):59-60+15.

[4] 周任杰,劉宇,張子立,等.基于Python的龍骨成型機通信方案設計[J].計算機應用與軟件,2019,36(06):93-96+135.

(本文來源于《電子產品世界》雜志2023年8月期)



關鍵詞: 202308 PLC Python 通信

評論


相關推薦

技術專區(qū)

關閉