0.前言
西門子SIMATIC S7家族中的控制器按照應用場合、性能等分為S7-1200、S7-200、S7-300、S7-400等各種不同的系列。而每一系列中又細分不同的型號,例如,S7-400系列中有S7-412、S7-414、S7-416、S7-417等型號。不同系列、不同型號的控制器對應不同的控制性能(運算速度、內存容量等)。本文基于S7-400系列控制器,詳細介紹內存的類型、分配情況及實際使用過程中可能的內存優化方法。
1.內存類型
S7-400型控制器的內存按照功能的不同,可以分為:
√ 系統內存(System Memory)--- 控制器的自身功能(M、T、C等)
√ 工作內存(work Memory)--- 用于運行程序;
√ 裝載內存(Load Memory)--- 用于裝載程序;
其中,工作內存部分又可以細分為:
√ 代碼工作內存(Code Memory)--- 用于運行程序的代碼部分;
√ 數據工作內存(Data Memory)--- 用于運行程序的數據部分;
S7-400型控制器的內存按照集成方式的不同,可以分為:
√ 集成內存(Integrated)--- 直接集成在控制器內部隨控制器一起提供,無需額外訂購;
√ 擴展內存(Expanded)--- 通過擴展存儲卡的方式擴展提供,需要額外訂購;
一般情況下,控制器的工作內存不可擴展,而裝載內存則可以通過FEPROM或RAM的方式進行擴展。如果希望和集成的RAM裝載內存無縫擴展使用,則擴展的裝載內存必須選用RAM類型。下圖為CPU 412的性能參數示例。

圖 1 CPU 412的性能參數示例
控制器內存信息也可參考如下鏈接內容:
22610157
2.內存分配
控制器內存詳細分配情況如下表所示。#
內存類型
|
內容
|
注釋信息
|
裝載內存
|
系統數據/System Data
|
硬件組態數據
|
程序塊/Program Blocks
|
程序塊
|
(FBs,FCs,OBs,Symbols1),Comments1))
|
工作內存
|
數據塊/Data Blocks
|
數據塊 (DBs)
|
(數據部分)
|
系統數據/System Data
|
硬件組態信息,非裝載內存中的全部硬件組態數據
|
|
SFC動態創建的DB塊/DBs Created by SFC
|
通過SFC21/22等動態創建的數據塊
|
|
本地數據/Local Data
|
各優先級中斷所需的臨時數據存儲區
|
工作內存
|
邏輯功能塊/Logic Blocks
|
邏輯功能塊 (FBs,FCs)
|
(代碼部分)
|
通信數據緩沖/Communication Data Buffer2)
|
通信功能所需的臨時緩沖區(動態分配)
|
|
通信作業數據/Communication jobs Data ( 72字節/每作業)
|
通信功能塊占用的通信作業數據區
|
|
輸入輸出映像區/PII/PIQ (12字節/每映像區字節)
|
輸入/輸出過程映像區所占用的數據空間
|
|
診斷緩沖區/Diagnostic Buffer ( 32 字節/每記錄)
|
CPU診斷消息
|
系統內存
|
M區間、定時器T、計數器C
|
M存儲區間、定時器/計數器存儲區間
|
功能塊/中斷堆棧
|
堆棧區級通信/診斷/本地數據緩沖區
|
表格 1 控制器內存分配祥表
1).通過 PLC?Save to Memory Card (EPROM)菜單才會下載到裝載內存中
2).運行時動態分配
實際應用過程中,當前控制器的內存占有率及分配情況可以通過控制器在線信息? Memory頁面查詢到,如下圖所示。

圖 2 控制器內存在線分配情況
從該圖中可以看到內存被劃分為四個部分:Load Memory RAM(裝載內存RAM)、Load Memory EPROM(裝載內存EPROM)、Work Memory Code(工作內存Code)和Work Memory Data(工作內存Data)。每個部分的實際占用狀況可以通過下側的Free(空閑內存)、Assigned(已分配內存)、Total(總內存)、Largest Free Block(最大連續空閑內存空間)和Max. Pluggable(最大可安插內存量)看到。而每個部分詳細的內部分配情況可以通過選擇相應內存列后,點擊右側的Details Memory Area按鈕查詢到,如下圖所示。

圖 3 裝載內存詳細分配情況

圖 4 工作內存 Code部分詳細分配情況

圖 5 工作內存Data部分詳細分配情況
3.內存優化
根據上述介紹的內容可以查看到實際控制器內存的分配和使用情況,同時在項目組態階段,也可以參考表格1中的內容,按照如下方式計算、檢查各部分的內存需求情況,并對其進行相應優化。
3.1 用戶程序內存需求
在Simatic Manager中右鍵點擊Blocks文件夾? Object Properties可以打開如下對話框,切換到Blocks頁即可查詢當前用戶程序的內存需求情況。


圖 6 用戶程序內存需求情況
從上圖中可以看到,用戶程序所需裝載內存為5354 bytes,系統數據(硬件組態)所需裝載內存為7616 bytes,總和為12970 bytes,和CPU在線內存分配情況吻合(見上圖 3 裝載內存詳細分配情況中load objects所示)。用戶程序所需工作內存代碼部分為2682 bytes,所需工作內存數據部分為630 bytes,和CPU在線內存分配情況吻合(見上圖 4 工作內存 Code部分詳細分配情況中logic blocks部分所示和上圖 5 工作內存Data部分詳細分配情況中data blocks部分所示)。
3.2 工作內存數據部分? 本地數據內存需求
控制器中的本地數據區用于存儲各優先級中斷運行的程序所需的臨時數據,這部分存儲空間是在控制器啟動初始化時完成預留分配。各功能塊所需的臨時數據存儲區大小可以通過功能塊屬性? General Part2中的Local data查詢到,如下圖所示。

圖 7 功能塊所需本地數據大小
控制器中按照中斷的優先級的方式分配本地數據的大小,通過CPU的屬性對話框? Memory中設置,下圖所示本地數據離線設置為8192 bytes,與上圖 5 工作內存Data部分詳細分配情況中在線的Local data分配吻合。
離線程序中實際所需的本地數據可以參考如下連接文檔進行計算:
80027837
按照實際程序所需的本地數據進行下圖8所示的Local data的設置,可以優化內存的分配。

圖 8 CPU本地數據分配
3.3 工作內存代碼部分? 通信作業內存需求
通信作業用于實現控制器和外圍設備的通信功能,每個通信作業在內存中需要占用一定的存儲空間,這部分存儲空間是在控制器啟動初始化時完成預留分配。離線的通信作業數可以參考上圖 8 CPU本地數據分配中的Communication resources進行設置。此處為300個,參考表格1中的數據,每個通信作業需要分配72 bytes的空間,總共所需300*72 = 21600 bytes,與上圖 4 工作內存 Code部分詳細分配情況中在線的Communication jobs內存分配吻合。
PCS 7系統中可以通過Chart reference data的統計數據查詢到離線程序所需的通信作業數,Step 7系統下則只有下載程序后通過上圖4查詢到。查詢到實際程序所需的通信作業數后,預留一定余量后對圖8進行設置,可以優化內存的分配。
3.4 工作內存代碼部分? 輸入/輸出映像區內存需求
輸入/輸出映像區為控制器預留的、用于存儲I/O的映像數據的區間,控制器按照一定的機制進行I/O數據的動態更新,可以優化程序讀取I/O的速度和性能。PCS 7中要求必須基于映像區的方式進行I/O信號的讀取,冗余控制系統中也要求基于映像區的方式進行I/O信號的讀取。這部分存儲空間是在控制器啟動初始化時完成預留分配。
通過CPU的屬性對話框? Cycle/Clock Memory頁面進行設置,如下圖所示。

圖 9 CPU過程映像區分配
此處為1000 Process image input/1000 Process image output,參考表格1中的數據,每個映像區字節需要分配12 bytes的空間,總共所需1000*12 = 12000 bytes輸入/輸出,與上圖 4 工作內存 Code部分詳細分配情況中Process-image inputs、Process-image outputs內存分配吻合。
實際程序中所需的映像區范圍可以通過I/O卡件的地址范圍查詢到,查詢到實際程序所需的映像區范圍后,預留一定余量后對圖9進行設置,可以優化內存的分配。


圖 10 查詢I/O地址范圍
如上圖紅色標識所示,輸入地址為0~515,則輸入映像區范圍最小設置為516字節,輸出地址為0~515,則輸出映像區范圍最小設置為516字節。
注:地址范圍查詢時不用關心上圖10中Type列中帶*的輸入地址(卡件診斷地址)。此外圖9中的映像區范圍必須設置為偶數。
3.5 工作內存代碼部分? 診斷緩沖區內存需求
診斷緩沖區用于存儲CPU在線的診斷信息,以便用于診斷維護等。CPU在線信息中的Diagnose buffer即為此處所說的診斷緩沖區。這部分存儲空間是在控制器啟動初始化時完成預留分配。

圖 11 CPU在線診斷信息
通過CPU的屬性對話框? Diagnostics/Clock頁面進行設置,如下圖所示。

圖 12 CPU 診斷緩沖區設置
此處為120條,參考表格1中的數據,每條消息需要分配32 bytes的空間,總共所需120*32 = 3840 bytes,與上圖 4 工作內存 Code部分詳細分配情況中Diagnose buffer內存分配吻合。該消息存儲區間為Ring型存儲區間,如果消息條數充滿,例如,此處120條,則系統將用新的消息覆蓋最老的消息。根據實際項目情況進行設置,設置范圍:最大3200條,最小100條。越大存儲的消息越多、時間越長