<address id="bxe5x"></address>
      1. 加入收藏 在線留言 聯系我們
        關注微信
        手機掃一掃 立刻聯系商家
        全國服務熱線13185520415
        公司新聞
        西門子數據塊字節排序的測試
        發布時間: 2024-07-22 21:13 更新時間: 2024-11-22 08:00
        觀看西門子數據塊字節排序的測試視頻


        S7-1500數據塊的訪問方式分為標準和優化兩種,標準的數據塊中,變量間可能存在間隔,如圖1所示。


        優化的數據塊中大數據類型的變量位于塊的開始處,實現數據結構的合理優化,如圖2所示。


        這些圖是從膠片中剪輯的,說明優化的數據塊中變量間是沒有間隔的。


        這幾天在琢磨序列化指令,想著這個指令在什么地方使用,也做了一下測試,發現優化的數據塊中變量也是有間隔的,這也推翻留存大腦中原有的想法。


        在測試中,首先創建了一個PLC數據類型“Data_Type”,PLC類型中包含3個BOOL類型和3個DINT類型,結構如圖3所示。



        然后創建了一個數據塊,在數據塊中創建了一個變量,類型就是“Data_Type”,按照圖2的說明,3個DINT變量應該排列在Zui前面,然后是3個BOOL變量,優化數據塊每一個BOOL變量占用一個字節,那么數據類型為“Data_Type”的變量應該占用15個字節。


        數據塊實際的容量增加了多少呢?在創建數據塊后先編譯,除去預留的100字節后,一個空的數據塊長度是68個字節,如圖4所示。



        然后在數據塊中添加一個“Data_Type”類型變量后再編譯,數據塊長度變為84,增加了16個字節,說明變量間有一個字節的間隔。為了驗證優化數據塊中變量的排列次序,在新的數據塊中分別增加1個BOOL變量、1個BOOL變量+1個DINT變量、1個BOOL變量+1個DINT變量+1個BOOL變量,Zui后到間隔排列3個BOOL變量和3個DINT變量進行測試,測試的結果為:




        按照這樣的規律,如果數據塊中第一個變量是BOOL,則占用2個字節(偶數開始),如果后面排列的是DWORD變量,則占用8個字節;同樣第一個是DWORD變量,后面是BOOL變量也要占用8個字節。那么為什么1個BOOL變量+1個DINT變量+1個BOOL變量還是占用8個字節呢?因為有間隔就插進去了,這樣就可以解釋“Data_Type”類型變量為什么占用16個字節空間了,如圖5所示


        也有可能是BDFACE排列方式,如圖6所示。


        注:圖5和6排列方式都是猜測的


        那么大家可能會問測試字節排列干什么?接下來就是測試的原因了。將包含“Data_Type”類型變量的數據塊轉換為標準數據塊,空數據塊也是占用68個字節空間。編譯后再看看占用地址空間的大小,如圖7所示。



        數據類型相同的變量在標準數據塊中占用了18個字節空間。這樣問題就來了,兩個變量占用的字節長度都不相同,如果將存儲在優化數據塊變量中的數據MOVE到標準數據塊的變量中是不是會發生錯位的現象?


        做了一個測試,發現使用MOVE指令沒有問題,這也說明了兩個PLC之間使用通信方式傳遞兩個變量的數據也沒有問題(一個是優化一個是標準)。這里感覺在使用MOVE指令前,數據經過了變化,否則就沒法解釋了,其實這個轉換確實由系統完成了,是按照被調用塊的格式進行轉換,例如標準訪問的變量在優化塊中使用,先將數據復制到優化塊的本地數據區,然后再將該數據以正確格式(優化訪問)進行轉換。


        同一個CPU中或者相同類型的CPU之間的通信,數據的轉換方式是相同的,所以操作不會出現問題。但是不同操作系統間的通信,例如PLC與PC或者不同品牌PLC間的通信可能就會出現問題,這時需要將原數據進行序列化后再發送嗎?


        個人認為還是需要了解一下序列化和不使用序列化有什么不一樣,否則發送了一個“Data_Type”類型變量,接收方會不知道對應關系。


        標準數據塊中變量的排序是固定的,可以根據字節的偏移地址判斷起始地址,優化數據塊中的變量排序不固定(無論是圖5還是圖6都是不固定的),也不使用juedui地址,所以無法判斷。使用序列化指令將變量傳送到一個元素為BYTE的數組后可以判斷各個變量的排列順序,程序及測試結果如圖8所示。



        16個字節長度的“Data_Type”類型變量(優化訪問)序列化后變成了18個字節,與標準訪問的變量長度相等(標準訪問的變量序列化后與原排列順序相同),對應關系也是一樣。然后又在單一變量基礎上嵌套多個結構體變量進行測試,發現兩種訪問方式變量的長度還是相同的,使用序列化可以確定變量的排列順序。


        如果不進行序列化而直接發送優化訪問的“Data_Type”類型變量(TCP連接),是按照16個字節還是18個字節發送呢?使用抓包軟件對發送報文進行了解析,居然是18個字節,與經過序列化后是一樣(不知道這樣的排列順序是不是一個標準,如果通信雙方發送和接收的數據排列順序不一樣,還是需要調整的),如圖8所示。



        測試了多種組合,好像發送前都已經序列化了,所以說可以不使用序列化直接發送了。


        這就是一開始說的,不知道該指令在哪里應用。從自己的體會來說,認為主要有兩點需要序列化:


        1. PLC中的序列化指令與gaoji語言的序列化功能部分是近似的,其中一點就是把對象轉化為可傳輸的字節序列。使用方法相同,有助于習慣gaoji語言開發的工程師熟悉PLC的編程環境。


        2. 在S7-300/400 PLC中,通信的數據區是一個以字節為元素的數組,例如P#DB1.DBX0.0 BYTE 100,所以不需要序列化指令。在S7-1500 PLC 中變量使用的是符號地址,推薦的是對象化的編程方式,通常使用PLC數據類型或者結構體生成的變量作為對象的屬性,這些屬性數據大多數也是需要通信的數據,如果數據不連續或者不在相同的數據塊中,要么建立多個連接(還得看通信伙伴是否可行),要么對數據進行整合,使用序列化和反序列化可以解決這樣的問題,將數據轉存到一個數據緩存區,這樣又方便又保持原有的數據結構,這里序列化和反序列化的功能起到了轉存的功能(參考圖9),要不怎么放在“移動操作”指令子集中呢。


        聯系方式

        • 電  話:13510737515
        • 聯系人:董海波
        • 手  機:13185520415
        • 微  信:13185520415