西門子PLC通信技術(shù)知識
西門子PLC支持串口通信,,在S7-200和S7-200Smart中,都直接集成了串口,,但是從S7-1200到S7-1500,,慢慢都取消掉了,如果需要,,可以通過擴展模塊的方式來增加,,出現(xiàn)這種現(xiàn)象的原因,其實也是工業(yè)發(fā)展的必然結(jié)果,。串口通信的優(yōu)勢在于簡單,、成本低,但是劣勢也非常明顯,,就是傳輸效率低,。西門子早期的串口通信主要是Profibus DP通信,但是上位機是無法直接與西門子PLC走Profibus DP通信的,,因此,,西門子PLC常用的串口通信方案如下所示:
PPI通信:PPI通信只針對S7-200和S7-200 Smart系列PLC,其他型號不支持,。 ModbusRTU主站:西門子PLC對Modbus協(xié)議支持還是比較不錯的,這里是指PLC做Slave(即從站),,上位機做Master(即主站),。 ModbusRTU從站:這里是指PLC做Master(即主站),上位機做Slave(即從站),。
以太網(wǎng)通信
西門子PLC通信還是以太網(wǎng)通信為主,,我們常說的西門子通信協(xié)議分別是S7協(xié)議和Profinet協(xié)議,但是Profinet是一種總線協(xié)議,,目前,,C#是無法直接與西門子PLC走Profinet通信的。因此,,西門子PLC常用的以太網(wǎng)通信方案如下所示:
S7通信:基本上從S7-200到S7-1500均可以實現(xiàn),,這里有很多可以選擇的開源或商業(yè)庫,也可以自己封裝通信庫,。 ModbusTCP Server:這里是指PLC做Server(即服務(wù)器),,上位機做Client(即客戶端)。 ModbusTCP Client:這里是指PLC做Client(即客戶端),,上位機做Server(即服務(wù)器),。 OpenProtocol Server:這里是指開放式TCP通信,,PLC做TCPServer(即服務(wù)器),上位機做TCPClient(即客戶端),。 OpenProtocol Client:這里是指PLC做TCPClient(即客戶端),,上位機做TCPServer(即服務(wù)器)。
OPC通信
OPC通信是工業(yè)控制中常用的一種通信方式,,主要在于OPC軟件的選擇以及OPCDA,、OPCUA的選擇,因此,,西門子PLC常用的OPC通信方案如下所示:
PC Access系列:西門子針對S7-200開發(fā)PC-Access軟件,,針對S7-200 Smart又提供了PC-Access Smart軟件,可以直接通過這些軟件實現(xiàn)OPCDA通信,。 Simatic Net 系列OPCDA:Simatic Net是西門子主推的OPC軟件,,支持西門子全系列,這里主要是OPCDA通信方式,。 Simatic Net 系列OPCUA:新版的Simatic Net也開始支持OPCUA,,這里主要是OPCUA通信方式。 KepServer 系列OPCDA:KepServer同樣作為一款商業(yè)OPC軟件,,在國內(nèi)使用率非常高,,同樣也支持西門子全系列,這里主要是OPCDA通信方式,。 Simatic Net 系列OPCUA:新版的KepServer也開始支持OPCUA,,這里主要是OPCUA通信方式。
S7通信協(xié)議
在以上眾多的通信方式和通信協(xié)議中,,就目前而言,,使用S7通信是最便,也是應(yīng)該廣泛的,,那么S7協(xié)議相對于其他協(xié)議來說,,有哪些優(yōu)勢呢?
使用S7通信協(xié)議最大的優(yōu)勢在于不需要編寫PLC程序,,而且S7協(xié)議在底層做了很強的封裝,,在上位機通信應(yīng)用中相比其他通信協(xié)議來說,也有很大的優(yōu)勢,。
雖然不需要編寫PLC程序,,但仍然需要做一些簡單的配置:
開啟Put/Get
PLC側(cè)需要設(shè)置勾選允許來自遠程對象的Put/Get通信訪問 對于西門子1200/1500系列,必須要勾選允許Put/Get訪問,,對于200Smart/300/400,,則不需要。
DB塊去除優(yōu)化訪問
對于基于博圖開發(fā)S7-1200/1500的項目,如果要與DB塊數(shù)據(jù)通信,,需要要去除DB的優(yōu)化的塊訪問,,對于200Smart/300/400,則不需要,。如果希望通過標簽通信,,可以采用OPCUA。
務(wù)必保證通信地址是有效地址
因為PLC大多數(shù)是基于存儲區(qū)的,,每個地址肯定是隸屬于某個存儲區(qū),,大家都知道西門子PLC自帶的存儲區(qū)有I區(qū)、Q區(qū),、M區(qū),、T區(qū)、C區(qū),,但是對于常用的DB存儲區(qū)是沒有的,,需要自己去創(chuàng)建,也就意味著,,如果你要讀取DB地址,,必須要提前創(chuàng)建好DB存儲區(qū),除此以外,,DB存儲區(qū)創(chuàng)建之后,,默認是沒有字節(jié)的,需要自己一個個添加變量,,才能形成有效存儲區(qū),,因此一個DB存儲區(qū)的范圍是有限并且可見的(可以通過偏移量看出來)。
S7協(xié)議之布爾操作
對于布爾操作,,很多協(xié)議都有,,但是這里的布爾操作是指寄存器布爾,比如DB100.DBX0.0,,很多時候,,我們都是通過先讀取DB100.DBB0的值,,再通過位運算結(jié)果,,寫入到DB100.DBB0中,實現(xiàn)DB100.DBX0.0的操作,,但是這種方式有弊端,,
第一:每次操作一個布爾值都需要與PLC進行兩次數(shù)據(jù)交互。
第二:安全性和穩(wěn)定性無法保障,,你不知道在你讀取和寫入之間,,這個字節(jié)的值是否已經(jīng)發(fā)生了改變。
這樣的問題也存在于Modbus協(xié)議的寄存器位操作,如40001.05,,三菱,、歐姆龍的寄存器位操作,如D100.06,、W12.04,,給上位機開發(fā)者帶來很多苦惱。
但是S7協(xié)議支持直接位操作,,有專門的報文指令實現(xiàn)這樣的功能,。
S7協(xié)議之PDU讀取
大部分人都知道S7協(xié)議一次性讀取有限制,但是具體是多少,?怎么計算出來的,?
S7協(xié)議的一次性讀取長度是根據(jù)PDU計算出來的,這個PDU的值是來自于PLC本身,,不同型號的CPU,,它的PDU是不一樣的,可以參考下面兩張圖:


西門子PLC的PDU大小是和CPU息息相關(guān)的,,一般會有240,、480、960三個檔次,,知道PDU之后,,那么一次性讀取的字節(jié)長度,就是在PDU的基礎(chǔ)上減去18,,這個18是指包頭包尾會有18個字節(jié),,這樣我們就知道了一般的PLC,一次性能讀取222個字節(jié)(240-18=222),,但是對于S7-1516這樣的PLC,,我們一次性是可以讀取942個字節(jié)的***,這個一次性能讀取的字節(jié)越長,,越能提高上位機的通信效率,。
剛剛的方式是通過KepServer測試的,實際開發(fā)過程中,,該怎么獲取CPU的PDU呢,,實際上在建立連接的第二次握手時,返回的報文中就包含PDU的值,。

第二次握手返回的報文長度是27個字節(jié),,最后兩個字節(jié)就是PDU的值,上圖展示的是S7-1200PLC返回的報文,,0和240的組合即為240,。
對于S7-1500,我這里也做了一下測試,結(jié)果如下,,返回結(jié)果為3和***

雖然PDU是由硬件做了限制,,但是我們可以通過軟件的方式,實現(xiàn)大量數(shù)據(jù)的讀取,,只需要在底層做一些封裝即可,。做了一下測試,針對S7-1200和S7-1500同時讀取M區(qū)的8000個字節(jié)的耗時比較,,S7-1200耗時800多ms,,S7-1500耗時僅需200ms,由此可見,,硬件對通信的重要性,。


S7協(xié)議之多組讀取
對于很多其他的通信協(xié)議,當我們遇到數(shù)據(jù)變量比較零散,,同時讀取多個存儲區(qū)或者一個存儲區(qū)多個不同部分的時候,,我們只能針對每個存儲區(qū)或者每塊區(qū)域做一個數(shù)據(jù)請求,但是西門子S7協(xié)議可以解決這樣的問題,。
西門子S7協(xié)議有一個非常強大的一個地方,,可以同時讀取很多個不同的存儲區(qū),最大支持19種,,總共讀取長度仍然受PDU的限制,。
這里我們?nèi)匀灰詫嶒灉y試為例,體驗多組讀取帶來的美妙體驗,。
假設(shè)我們的通信組配置如下:
通信組01:讀取I區(qū)從0開始的1個字節(jié)
通信組02:讀取Q區(qū)從0開始的1個字節(jié)
通信組03:讀取M區(qū)從0開始的200個字節(jié)
通信組04:讀取M區(qū)從500開始的50個字節(jié)
通信組05:讀取M區(qū)從1000開始的60個字節(jié)
通信組06:讀取DB100從0開始的20個字節(jié)
通信組07:讀取DB100從20開始的20個字節(jié)
通信組08:讀取DB100從40開始的20個字節(jié)
通信組09:讀取DB100從60開始的20個字節(jié)
我們采用常用S7-1200PLC,,通過配置軟件實現(xiàn)配置以上9個通信組,開始通信測試,,首先我們選擇的是單組讀取的方式,,就是針對每個組,依次進行讀取,,結(jié)果如下,,耗時大約200ms,這個時間應(yīng)該相對來說還是比較正常的,。

接著,,將讀取方式改成了多組讀取,再進行測試發(fā)現(xiàn)結(jié)果如下:

通過結(jié)果發(fā)現(xiàn),,多組讀取對于存儲區(qū)較為零散的項目來說,,有著非常重要的作用,,可以大大提高通信效率,。
總結(jié)
通過上面一系列的分享,相信大家對西門子PLC通信有了更加深入的了解,希望大家可以多多實踐,。
每種通信方式都有自己的優(yōu)缺點,,對各種通信方式和協(xié)議了解之后,你才能夠在不同的場合選擇適合的通信方式,,給出最的解決方案,。