熟女俱乐部五十路二区av,又爽又黄禁片视频1000免费,国产卡一卡二卡三无线乱码新区,中文无码一区二区不卡αv,中文在线中文a

關(guān) 閉

新聞中心

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

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

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


本文引用地址:http://www.bjwjmy.cn/article/202308/449750.htm

0 引言

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

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

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

1 Python程序與歐姆龍PLC通信

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

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

1692475083141464.png

圖1 CP1H型PLC與連接

1.1 TCP連接

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

1.2 Fins連接

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

1.3 PLC通信

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

2 Fins數(shù)據(jù)幀

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

2.1 Fins header

該部分共有10個字節(jié),按順序依次為ICF(Information Control Field),用于顯示框架信息,由4 個子字段組成,有效信息包括是否使用網(wǎng)關(guān)、該數(shù)據(jù)的具體類型(響應或命令)以及是否必須進行回應,該字節(jié)還有5個保留位,在一些情況下可以指定一些特殊信息;RSV(Reserved),系統(tǒng)保留字;GCT(Gateway count),網(wǎng)關(guān)的允許數(shù)量;DNA(Destination  network address)發(fā)送目標的網(wǎng)絡(luò)地址,用于指定目標的節(jié)點網(wǎng)絡(luò)號;DA1(Destination node number)目標節(jié)點地址,此處需要注意的是可以設(shè)置為FF,此時為廣播編號;DA2(Source unit number)目的單位地址,指定目標節(jié)點的單元編號;SNA(Source network address)發(fā)送方的網(wǎng)絡(luò)地址,用于指定發(fā)送方所在的節(jié)點網(wǎng)絡(luò)號,SA1(Source node number)發(fā)送方的節(jié)點地址;SA2(Source Unit address)發(fā)送方的目的單位地址;SID(Service ID)服務序列號,用于標識生成傳輸過程,響應中返回相同數(shù)字來匹配命令和響應。以上各單元均占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 信息、讀寫參數(shù)區(qū)信息、操作模式切換、狀態(tài)讀取、時間讀取、讀寫故障信息、讀寫文件和強制設(shè)置某些位等。

2.3 Fins data

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

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

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

3 PLC連接過程的程序設(shè)計

3.1 對PLC進行初步連通

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

3.2 對PLC進行握手

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

3.3 使用PLC

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

3.4 注意事項

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

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

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

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

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

4 結(jié)束語

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

參考文獻:

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

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

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

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

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



關(guān)鍵詞: 202308 PLC Python 通信

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉