<label id="434s6"></label>
        1. <span id="434s6"><input id="434s6"></input></span>
          1. <s id="434s6"></s><s id="434s6"><sub id="434s6"></sub></s><strike id="434s6"><input id="434s6"></input></strike>
              歡迎來到《圣博凱斯》變頻供水設備官網
              精銳于專業 / 卓然于品質 -- 20年專注于供水行業,締造至臻品質 -- 服務熱線:0731-85783205 18932453205

              PLC和電腦連接_plc與pc機的通訊連接

              由于項目需要連接PLC和PC,所以傳送幾種狀態和控制信息。 為了實現最快的響應速度,采用了I/O直接連接。 但是,這需要添加I/O卡,與PLC的I/O功能有些重復。 那么,網絡通信可能嗎? 本文進行一些實驗。

              西門子S7-1200

              概述

              使用的PLC是目前主流的西門子S7-1200。 支持PROFINET、PROFIBUS等網絡標準/協議,也可以間接連接到Modbus設備。 任何標準都有很多服務/協議。 詳情請參照Communication with SIMATIC 但是,這些標準中有些用于西門子的設備相互連接,不一定適用于PC。

              下圖為TIA門戶v 14的通信相關命令,也可作為線索。

              PLC通信指令

              與PC的通信可以使用OPC服務器,但它是基于OLE/COM的,只能在Windows上使用。 一些軟件(如LabView )支持與西門子PLC的通信。 是跨平臺開源方案,一個是Snap7。 先試試這個吧。 另外,請嘗試最原始的TCP協議。

              Snap7

              Snap7是針對西門子S7協議的。 PLC不需要S7的服務器這一配置,但只需要利用Snap7 lib,就可以將PC作為S7客戶端讀取/寫入服務器端的數據塊。

              數據塊映射

              塊分為輸入區域(DI、AI )、輸出區域) DQ、AQ )、程序塊) DB )等。 在下圖中,DB3是測試程序的數據塊。

              數據塊和監視值

              可以使用Snap7包附帶的(編譯的)測試程序查看/更改值。

              Snap7測試程序

              訪問設置

              讀寫前需要進行配置和權限設置。 禁用塊優化,并授予完全權限。 有關詳細信息,請參閱Snap7文檔。

              另外,有些設置未在文檔中列出,即允許從遠程對象進行PUT/GET通信訪問。 否則就會出現“函數不可用”,

              錯誤,如“基于函數的處理器”。

              Snap7通信的訪問設定

              Python版的Snap7

              使用腳本語言有時會很方便。 Python-snap7是Snap7 lib的python軟件包。 因為只是接口層的封裝,所以對速度的影響很小。

              安裝時,需要安裝Snap7庫,然后使用pip安裝python-snap7。 有些平臺沒有現成的Snap7庫,需要自己編譯。 總之是草莓派,我自己編譯的。 實測Python2和Python3都工作。

              核心代碼如下: I/O只有2字節,所以直接讀取/寫入2字節。

              導入快照7

              從快照7 .快照7類型導入S7區域數據庫,S7區域PA,S7區域應用

              第7類客戶端:類

              def _ init _ (自,ip,槽=1,軌跡=0) :

              self.client=snap7. client.client (

              self.client.connect(IP,機架,插槽)。

              延遲(自) :

              區域=S7區域應用

              db=0

              開始=0

              amount=2

              ba=self.client.read _ area (區域、數據庫、開始、停止) )。

              d=巴西

              d=8

              d|=壩0

              返回d

              efwritedq (自,數據) :

              區域=S7區域帕

              db=0

              開始=0

              amount=2

              ba=字節數組(amount )

              BA0=數據0x FF

              BA [1]=數據8

              sel

              f.client.write_area(area, db, start, ba)

              速度測試

              循環讀/寫DQ,看看總耗時。示意代碼如下:

              def testWriteLoop(self, count): d = 0 self.log.info("Write DQ from: %04x", d) t1 = time.time() while d < count: self.plc.writeDQ(d) d += 1 t2 = time.time() self.log.info("Write DQ till: %04x. Average: %.2fms", (d - 1), (t2 - t1) * 1000 / d)

              可以看到單次讀/寫的平均時間略高于9ms.

              讀寫測試結果

              下圖是最低位的波形。10個周期對應于20次寫,耗時約182ms。高低電平不對稱的問題后面再說。

              遞增寫DQ時DQ0.0的波形

              反向通信

              如果PC做Snap7的服務器,則PLC需要使用GET/PUT指令讀/寫PC端的數據。既然都是S7協議,我們假設它的速度和正向是相當的,暫且跳過,先試試另一類型的通信。

              原始的TCP通信

              S7-1200支持開放式用戶通信,即基于TCP,但不屬于任何標準應用層協議的,完全由用戶自己定義的協議。

              實驗設計

              PC端作為服務器:實際測試使用樹莓派充當PC的角色。PLC端發送數據:由一個DI來觸發數據發送。樹莓派開啟數據發送:通過控制一個GPIO來開關繼電器,進而改變PLC端的DI(信號1);樹莓派在收到數據后,改變另一個GPIO的狀態(信號2)作為標志;比較信號2和信號1的時間差。

              實驗器材及連線

              PC端

              PC端作為服務器,監聽某一端口。在Linux上,可以用命令行工具netcat進行調試。

              開兩個窗口:

              netcat -l 2000: 監聽端口2000netcat localhost 2000: 與本機2000端口連接

              一個窗口輸入字符,另一個窗口就會顯示出來。

              然后,用Python socket寫一個類似的服務器端程序,核心代碼如下:

              import socket self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.bind(('', self.args.port)) self.sock.listen(1) self.conn, addr = self.sock.accept() data = self.conn.recv(32) self.log.info("Received: %02X %02X", data[0], data[1])

              可以用 netcat 測試這個服務器程序。

              PC端的TCP server

              PLC端

              PLC端使用TSEND_C發送數據。

              由trigger觸發數據發送,trigger對應于數字輸入,比如DI0.1.trigger同時觸發一個計數器。TSEND發送這個計數器的值,這樣PC每次收到的數據是遞增的。CONT設為TRUE,保持連接,這樣速度最快。

              PLC端程序

              在網絡連接設置中指定PC端的IP地址和端口號,端口號要和服務器監聽的端口號一致。由PLC主動發起連接。

              PLC端網絡連接設置

              初步的結果

              下圖中,黃色為PLC端的輸入(信號1),綠色為樹莓派上收到數據后的輸出(信號2)。

              都以上升沿作為標志。兩者的時間差不到9ms。

              通信耗時的波形圖

              可以更快嗎?

              通信負載

              由通信引起的循環負荷:默認是20%,取值可以從15%到50%。改變這個值,發現對通信時間并沒有影響。

              輸入濾波器

              這個值默認是6.4ms,它是用來過濾按鍵抖動的。但對于電路觸發(非人工/機械按鍵)的情況,這個抖動可以設得很小。

              PLC輸入濾波器

              將它調小至0.1ms,整個耗時降低了約6ms. 通信耗時不到3ms了。

              通信耗時(0.1ms輸入濾波)

              循環時間

              PLC的運行方式是不斷循環去讀取輸入,執行程序塊,更新輸出的模式。循環周期過長,是否會影響網絡通信呢?

              通過在線診斷,可以看到循環時間最長為4ms,通常都在1~2ms。

              PLC循環時間

              這說明循環時間并不是瓶頸。而且反過來,循環時間比通信時間還短(即使輸入濾波器為6.4ms,通信時間9ms時,循環時間依然是1~2ms),這說明通信和循環似乎是分頭執行的。

              其它

              本來還想試一下中斷執行方式的,但把通信程序塊放到中斷響應里執行并沒有成功??紤]到對于PLC的百兆網口,3ms已經夠快了,就沒再折騰了。

              還試驗了一下,在PLC上單純地增加一個計數器或反復翻轉輸出電平,每次操作耗時大約也是3ms。

              順便說一句,在PLC的數字輸出上,卻看不到電平的翻轉(看到的總是高電平)。前面有一張“遞增寫DQ時DQ0.0的波形”圖,18ms的周期,基本上已看不到電平下降到0了。感覺PLC的輸出頻率并不高,甚至可能有高頻濾波。

              結語

              從PLC的眾多網絡通信方式中,本文試驗了簡單易行并且跨平臺的兩種方式,用來和PC通信。

              使用基于S7協議的Snap7庫,在讀寫PLC時大約耗時9ms.使用開放式的TCP協議,PLC向PC發送數據最快不到3ms.

              考慮到S7-1200只是百兆網絡,這個速度應該是不錯的,可以滿足大部分需要。

              猜你喜歡

              18932453205
              国产ww久久久久久久久久|中字人妻内射喷潮第二页|日本不卡视频高清播放|麻豆久久精品免费看国产|丁香色欲久久久久久综合网

                    <label id="434s6"></label>
                    1. <span id="434s6"><input id="434s6"></input></span>
                      1. <s id="434s6"></s><s id="434s6"><sub id="434s6"></sub></s><strike id="434s6"><input id="434s6"></input></strike>