S7通訊協議之你不知道的事兒

在電氣學習的路上,西門子PLC應該是我的啟蒙PLC,從早期的S7-300/400 PLC搭建Profibus-DP網路開始接觸,到後來的S7-200Smart PLC,再到現在的S7-1200/1500 PLC博途軟體,基本上西門子的每款PLC都接觸並使用過。

在上位機開發的路上,西門子PLC也一直是我鍾愛的一個品牌,仍然記得剛開始做的第一個上位機就是基於S7-300 PLC的S7協議。最近又將S7協議鞏固了一遍,發現了一些自己之前都不知道的事,這才發現,西門子S7協議是非常強大的一個協議。

1. S7協議之布爾操作

對於布爾操作,很多協議都有,但是這裡的布爾操作是指暫存器布爾,比如DB100.DBX0.0,很多時候,我們都是通過先讀取DB100.DBB0的值,再通過位運算結果,寫入到DB100.DBB0中,實現DB100.DBX0.0的操作,但是這種方式有弊端,第一:每次操作一個布爾值都需要與PLC進行兩次數據交互,第二:安全性和穩定性無法保障,你不知道在你讀取和寫入之間,這個位元組的值是否已經發生了改變。

這樣的問題也存在於Modbus協議的暫存器位操作,如40001.05,三菱、歐姆龍的暫存器位操作,如D100.06、W12.04,給上位機開發者帶來很多苦惱。

但是S7協議支援直接位操作,有專門的報文指令實現這樣的功能。

2. S7協議之PDU讀取

大部分人都知道S7協議一次性讀取有限制,但是具體是多少?怎麼計算出來的?

S7協議的一次性讀取長度是根據PDU計算出來的,這個PDU的值是來自於PLC本身,不同型號的CPU,它的PDU是不一樣的,大家可以通過KepServer結合PLC來測試,如果手頭沒有PLC,可以關注本公眾號的一篇文章《手把手教你搭建西門子PLC模擬環境》。

圖表 1 S7-1200的PDU

圖表 2 S7-1500的PDU

經過研究發現,西門子PLC的PDU大小是和CPU息息相關的,一般會有240、480、960三個檔次,知道PDU之後,那麼一次性讀取的位元組長度,就是在PDU的基礎上減去18,這個18是指包頭包尾會有18個位元組,這樣我們就知道了一般的PLC,一次性能讀取222個位元組(240-18=222),但是對於S7-1516這樣的PLC,我們一次性是可以讀取942個位元組的(960-18=942),這個一次性能讀取的位元組越長,越能提高上位機的通訊效率。

但是剛剛的方式是通過KepServer測試的,實際開發過程中,該怎麼獲取CPU的PDU呢,實際上在建立連接的第二次握手時,返回的報文中就包含PDU的值。

圖表 3 S7-1200 PDU報文

第二次握手返回的報文長度是27個位元組,最後兩個位元組就是PDU的值,上圖展示的是S7-1200 PLC返回的報文,0和240的組合即為240。

對於S7-1500,我這裡也做了一下測試,結果如下,返回結果為3和192,3和192的組合恰好是960(960=3*256+192)。

圖表 4 S7-1500 PDU報文

雖然PDU是由硬體做了限制,但是我們可以通過軟體的方式,實現大量數據的讀取,只需要在底層做一些封裝即可。做了一下測試,針對S7-1200和S7-1500同時讀取M區的8000個位元組的耗時比較,S7-1200耗時800多ms,S7-1500耗時僅需200ms,由此可見,硬體對通訊的重要性。

圖表 5 S7-1200通訊耗時測試

圖表 6 S7-1500通訊耗時測試

1. S7協議之多組讀取

西門子S7協議其中的一個重要體現就在於可以同時讀取很多個不同的存儲區,最大支援19種,總共讀取長度仍然受PDU的限制。

對於很多其他的通訊協議,當我們遇到數據變數比較零散,同時讀取多個存儲區或者一個存儲區多個不同部分的時候,我們只能針對每個存儲區或者每塊區域做一個數據請求,但是西門子S7協議可以解決這樣的問題。

這裡我們仍然以實驗測試為例,體驗多組讀取帶來的美妙體驗。

假設我們的通訊組配置如下:

通訊組01:讀取I區從0開始的1個位元組

通訊組02:讀取Q區從0開始的1個位元組

通訊組03:讀取M區從0開始的200個位元組

通訊組04:讀取M區從500開始的50個位元組

通訊組05:讀取M區從1000開始的60個位元組

通訊組06:讀取DB100從0開始的20個位元組 

通訊組07:讀取DB100從20開始的20個位元組 

通訊組08:讀取DB100從40開始的20個位元組 

通訊組09:讀取DB100從60開始的20個位元組 

 

我們採用常用S7-1200PLC,基於CMS配置軟體實現配置之後,開始通訊測試,首先我們選擇的是單組讀取的方式,就是針對每個組,依次進行讀取,結果如下,耗時大約200ms,這個時間應該相對來說還是比較正常的。

圖表 7 S7-1200PLC單組讀取

緊接著,我將讀取方式改成了多組讀取,再進行測試發現結果如下:

圖表 8 S7-1200PLC多組讀取

通過結果發現,多組讀取對於存儲區較為零散的項目來說,有著非常重要的作用,可以大大提高通訊效率。

歡迎關注微信公眾號:thinger_swj

抖音號請掃碼關註:

Tags: