許多人都知道S7協(xié)議一次性讀取有限制,但是具體是多少?怎么計(jì)算出來的?
S7協(xié)議的一次性讀取長度是根據(jù)PDU計(jì)算出來的,這個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é)的(960-18=942),這個一次性能讀取的字節(jié)越長,越能提高上位機(jī)的通信效率。
剛剛的方式是通過KepServer測試的,實(shí)際開發(fā)過程中,該怎么獲取CPU的PDU呢,實(shí)際上在建立連接的第二次握手時,返回的報文中就包含PDU的值。
第二次握手返回的報文長度是27個字節(jié),***后兩個字節(jié)就是PDU的值,上圖展示的是S7-1200PLC返回的報文,0和240的組合即為240。
對于S7-1500,我這里也做了一下測試,結(jié)果如下,返回結(jié)果為3和192,3和192的組合恰好是960(960=3*256+192)。
雖然PDU是由硬件做了限制,但是我們可以通過軟件的方式,實(shí)現(xiàn)大量數(shù)據(jù)的讀取,只需要在底層做一些封裝即可。做了一下測試,針對S7-1200和S7-1500同時讀取M區(qū)的8000個字節(jié)的耗時比較,S7-1200耗時800多ms,S7-1500耗時僅需200ms,由此可見,硬件對通信的重要性。