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),要不怎么放在“移動操作”指令子集中呢。
- 西門子PLC更換CPU后為什么會出問題 2024-11-22
- 西門子屏蔽雙絞線的作用 2024-11-22
- 西門子PLC和變頻器之間通信線纜等電位線的連接注意事項 2024-11-22
- 西門子設備燒壞,什么原因?怎么排查? 2024-11-22
- 西門子CPU緩沖區被IO地址訪問錯誤占滿怎么辦 2024-11-22
- 西門子設備上電前如何檢查? 2024-11-22
- 大變頻器能帶小電機嗎 ? 2024-11-22
- 供電電源對西門子變頻器的影響 2024-11-22
- 西門子PLC什么時候需要設置網關地址 2024-11-22
- 串口通信標準RS232 RS485 RS422的區別 2024-11-22
- 西門子PLC S7-300移植到 S7-1500硬件的移植 2024-11-22
- 西門子S7-300移植到S7-1500_2_先別進行一致性檢查 2024-11-22
- 西門子PLC S7-300移植到S7-1500移植前先解密程序塊 2024-11-22
- 在組態PROFINET網絡的時候,設備名是不是必須要設置的? 2024-11-22
- 西門子S7-1214C DC/DC/DC的PLC壞點故障的修復過程 2024-11-22
聯系方式
- 電 話:13510737515
- 聯系人:董海波
- 手 機:13185520415
- 微 信:13185520415