地址寄存器指令说明见表。 表 地址寄存器指令说明 1.+AR1加累加器1至地址寄存器1(+AR1、+AR1<P#Byte. Bit>) 使用该指令是将地址寄存器AR1的内容加上作为地址偏移量的累加器1中低字的内容,或加上指令中的16位常数,结果在AR1( AR2)中。首先将整数(16位)扩展为符号正确的24位,然后将其加到AR1的低有效的24位(AR1中的相对地址的部分)。在AR1( AR2)中,区域ID的部分(第24~ 26位)保持不变。要加到AR1、AR2的内容中的整数(16位)由ACCU 1的低字中的值指定。允许值的范围为-32768~+32767。参数P#Byte. Bit(被加到AR1或AR2上的地址)的数据类型为指针常数。要加到AR1、AR2的内容中的偏移量由参数P#Byte,Bit地址指定。指令的执行与状态位无关,而且对状态位没有影响。 +AR1:加地址寄存器1中内容的整数(16位)通过累加器1低字中的数值定义,允许范围为-32768~+32767。 +AR1<P#Byte. Bit>:要加上的偏移量通过<P#Byte. Bit>地址定义。 编程示例1: L +300 说明:将数值装入累加器1低字中 +AR1 将累加器1低字中的内容(整数,16位)加到地址寄存器1 编程示例2: + AR1 P#300.0 说明:将偏移量300.0加到地址寄存器1 2.+AR2加累加器1至地址寄存器2*(+AR2、+LAR2<P#Byte. Bit>) 使用该指令,可以将语句中或累加器1低字中定义的偏移量加至地址寄存器2。首先将整数(16位)扩展为带有其正确符号的2位数,然后加到地址寄存器2的低有效24位(地址寄存器2中部分相关地址)。地址寄存器2中ID区部分(位24、25和26)保持不变。指令的执行与状态位无关,而且对状态位没有影响。 +AR2:加地址寄存器2中内容的整数(16位)通过累加器1低字中的数值定义,允许范围为-32768~+32767。 +AR2<P#Byte. Bit>:要加上的偏移量通过<P#Byte. Bit>地址定义。 编程示例1: L+300 说明:将数值装入累加器1低字中 +AR2 将累加器1低字中的内容(整数,16位)加到地址寄存器2 编程示例2: +AR2 P#300.0 说明:将偏移量300.0加到地址寄存器2。 |
西门子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的性能参数示例
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).通过 PLCSave 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文件夹 bbbbbb Properties可以打开如下对话框,切换到Blocks页即可查询当前用户程序的内存需求情况。
图 6 用户程序内存需求情况
从上图中可以看到,用户程序所需装载内存为5354 bytes,系统数据(硬件组态)所需装载内存为7616 bytes,总和为12970 bytes,和CPU在线内存分配情况吻合(见上图 3 装载内存详细分配情况中load bbbbbbs所示)。用户程序所需工作内存代码部分为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 bbbbb/1000 Process image output,参考表格1中的数据,每个映像区字节需要分配12 bytes的空间,总共所需1000*12 = 12000 bytes输入/输出,与上图 4 工作内存 Code部分详细分配情况中Process-image bbbbbs、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条。越大存储的消息越多、时间越长。
- 西门子模块总代理商-武汉市 2023-10-26
- 西门子模块总代理商-湖北市 2023-10-26
- 西门子模块总代理商-驻马店市 2023-10-26
- 西门子模块总代理商-周口市 2023-10-26
- 西门子模块总代理商-信阳市 2023-10-26
- 西门子模块总代理商-商丘市 2023-10-26
- 西门子模块总代理商-南阳市 2023-10-26
- 西门子模块总代理商-三门峡市 2023-10-26
- 西门子模块总代理商-漯河市 2023-10-26
- 西门子模块总代理商-许昌市 2023-10-26