培训模块之 TM250– 内存管理和数据存贮.pdf
《培训模块之 TM250– 内存管理和数据存贮.pdf》由会员分享,可在线阅读,更多相关《培训模块之 TM250– 内存管理和数据存贮.pdf(67页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、内存管理和数据存贮TM250内存管理和数据存贮 TM0前提培训模块:TM Automation Runtime TM Structured Text(ST)软件:Automation Runtime.0 或更高版本硬件:无 简介内存管理和数据存贮TM0目录简介.目的内存管理.内存类型.变量类型.排列.字符串.初始化,复制和比较.动态变量/指针.内存分配数据存储0.概述0.数据模块.文件0.数据保持小结内存管理和数据存贮 TM0简介1、简介内存在创建专业应用软件时是一个决定性的因素,因此十分重要。当处理不同形式的内存,比如变量,数组,结构,指针和自由分配的内存空间,了解内存的基础知识非常有用,可
2、以清晰全面地了解整个应用。图.硬盘的部分在这个培训模块中,会介绍内存管理的基本元素,比如,变量,数组,结构,动态变量和内存分配,也会介绍数据的处理(创建数据对象和文件)。你还可以将这个培训模块作为工作时的一个辅助工具。通过介绍入口等级和绪论,你将对每个独立的核心区域有个清晰地了解。例子和练习可以说明这些区域的实际用法,但并不基于某种特定的编程语言。内存管理和数据存贮TM01.1目的了解变量,数组,结构和内存分配之间的关系。了解动态变量和动态内存分配的功能。熟悉数据处理的方式(在自动化目标中创建数据模块和文件)图.综述 简介内存管理和数据存贮 TM02、内存管理应用中的内存管理(无论是由操作系统
3、还是由用户管理)是一个十分广泛的课题。操作系统主要负责时间和内存的资源管理。在开放的系统中,用户也可以自己来管理内存。用户可以在系统运行时请求分配内存,再释放内存,或以变量、结构和数组的形式使用内存。但这时总的内存管理非常重要。现在,组织和计划内存管理已经成为比分配内存更为重要的课题。2.1内存类型在这一部分将会详细介绍如何使用RAM内存,因为只有这种内存为所有变量和动态内存定位所使用。不同类型的RAM内存对于数据的读取时间和数据的保存会有不同的特征。内存SRAM和DRAM:SRAM是一个静态RAM。当给内存的介质供电时,数据可以保存下来。曾经设置的数据位会保持不变,直到下次重新设置。当系统断
4、电时,数据由缓存电池来保存。DRAM是一个动态RAM。不象SRAM,它是一个高速存储器类型。要存储数据,DRAM必须不停的刷新。当DRAM掉电时数据不被保存。SRAM就是用来实现这个功能。2.1.1读取速度内存的读取时间将会随着不同特征的内存特而改变。由于SG系统中的SRAM位于PCI总线上,因此,读取内存的时间必须考虑通过PCI总线传输数据的时间。当系统运行时,由于DRAM具有更快的读取时间,因此所有的数据都保存在DRAM中。这时,SRAM作为一个存储介质用来存储remanant数据和数据模块。Remanant数据是指那些在系统掉电和系统重启时必须保存的数据。内存管理内存管理和数据存贮TM0
5、2.1.2启动系统没有上电时,SYSROM和USERROM是存储在CF卡上。内存区域的REMMEM(remanant数据)和USEROM都位于SRAM中。当系统启动时,SYSROM和USEROM内存中的BR对象全部会复制到DRAM中。REMMEN内存也以类似的方式复制到DRAM中。由于长时间掉电不能保存内存时,系统不会复制USERAM。图.启动 内存管理内存管理和数据存贮 TM02.1.3 掉电当系统掉电时,DRAM中的remanant数据会在很短的时间帧内复制回SRAM中。图.掉电当检测到掉电时,系统将需要掉电保持的数据复制回SRAM中。然而,并不是所有系统都提供NWI逻辑(power fa
6、ilure logic)。相关的用户手册会指出用户所选的系统是否具有NWI逻辑。内存管理内存管理和数据存贮TM02.2变量类型现在,编程使用的是有名字的象征性元素,而不使用固定的内存地址,这些元素称为变量。简单的数据类型决定了变量(值的范围)所占内存的大小,以及如何解释所包含的值(有无符号,小数点,ASCII文本或日期时间)。数组包含多个具有相同数据类型的变量,通过固定的名子和索引来寻址。结构是用户自己创建的变量,具有用户指定的数据类型。2.2.1二进制和十六进制系统了解一些关于内存中变量结构的基本知识对学习这部分非常有用。Bit(位)是最小的信息单位,只有0和状态。Bit的数据类型是BOOL
7、。其它的数据类型有很多位,并以位一分割。比Bit大些的信息单位是byte。一个byte由个bit组成。Byte中的bit从右到左编号,最低位为bit 0,最高位为bit。Bit 实际上是第三位,这是因为从0开始记数,它的值是。图.一个字节 内存管理内存管理和数据存贮 TM0一个byte被分为两部分,叫做半字节。后位叫做低位,前位叫做高位。因此在高位存放高点的值。图.高位和低位字节中的每个位都有两个状态0或。一个字节表示的值从0到,共有个状态。位的值按如下:0 Bit number Bit number-0000000 Bit 0 Bit value 00000000 Bit Bit value
8、 0000000 Bit Bit value 0000000 Bit Bit value 0000000 Bit Bit value 0000000 Bit Bit value 0000000 Bit Bit value 0000000 Bit Bit value 内存管理例子:0000000 一+0000000 一-=0000000 二(不是0)按以下应用:0+0=00+=+=0+下一位进内存管理和数据存贮TM00在二进制系统中,反码用在最高位是符号位的情况下,余下的位表示值。0 Bit 是符号位X0000000 Bit 0 to 是值X 最大的正值为十进制 反码是通过二进制补码得到的。十进
9、制正数在二进制的模式下,将每一位取反后再加上,就形成了反码。图.二进制补码 内存管理例:000000 十进制数-00 所有位取反+0000000 加-=0 十进制数-内存管理和数据存贮 TM0数据表示的正确性依赖于数据类型。一个有无符号的数据类型和一个有符号的数据类型被赋一个相同的负值时,它们具有相同的二进制模式,但显示的值却不同。内存管理例子:USINT varUnsigned;SINT varSigned;varSigned :=-;Bit pattern 0 00varUnsigned:=varSigned ;Assignment of the valuevarUnsigned变量的十进
10、制值为,对应的二进制模式是0 00。在二进制模式不变,数据类型变为无符号的类型时,显示的值是不同的。图.在Watch窗口中监控内存管理和数据存贮TM0与十进制系统不同,进制的每一位可以有个值(0到F)。:0000 decimal 0 hex 0000 decimal hex 000 decimal hex 00 decimal hex 00 decimal hex 00 decimal hex 00 decimal hex 0 decimal hex 000 decimal hex 00 decimal hex 00 decimal 0 hex A0 decimal hex B00 decim
11、al hex C0 decimal hex D0 decimal hex E decimal hex F按以下步骤将二进制数转换成十六进制数:二进制的每位可以简单的转换成十六进制数,一位接一位写。内存管理例子:0000 值为 (+=)000 高字节 =Hex 0 低字节 =Hex B0000 Both nibbles=Hex B=dec.例子:Binary Hex Data type00000000$00 Byte USINT00000000 00000000$0000 Byte UINT00000000 00000000 00000000 00000000$00000000 Byte UDI
12、NT备注:十六进制数主要用于显示错误记录本的条目和显示地址。比较而言,二进制模式可以更有效的搜索有符号数和无符号数的错误。WATCH窗口可以选择用二进制,十进制或十六进制显示变量。内存管理和数据存贮 TM02.2.2 编译信息编译器在编译时使用多种方式来检查用户的程序代码。在信息窗体中,错误以红色文本显示,警告以绿色文本显示。双击信息窗体的相应条目可以显示引起错误或警告的程序行。图.编译信息例如:当比较不同数据类型的变量时会产生警告。内存管理备注:不要忽视警告!在特定的情况下,警告可能引起运行时的应用错误。应该同样重视警告和错误。内存管理和数据存贮TM0内存管理2.2.3简单数据类型在编程时,
13、有许多基本数据类型。所有符合IEC-的基本数据类型在列表中按其应用范围来显示和分类。BinaryUnsignedSignedFloating pointTime,date,stringBOOL USINTSINTREALTIMEUINTINTvDATE_AND_TIMEUDINTDINTSTRINGData typeMemory requirementsbytesValue rangebytesBOOL TRUE(),FALSE(0)(e.g.数字量输入和输出)SINT-.+INT-.+(e.g.模拟量输入和输出)DINT-.+USINT0.UINT0.UDINT0.REAL-.E.+.ETI
14、MET#-d_0h_m_s_ms.T#d_0h_m_s_msDATE_AND_TIMEDT#0-0-0-00:00:00.DT#0-0-0-0:STRINGVariable,but at least bytes字符串显示内存管理和数据存贮 TM0内存管理2.2.4数组数组是具有相同数据类型的多个变量的集合,通过名称和索引来寻址。.数组元素寻址的最小索引号为0,最大的索引号是数组元素的总个数减。这就意味着变量的索引号按次序从0到数组元素总个数减。图.0 数组访问有效索引号以外的数组元素,编译器监控不到,造成的结果是不经过允许就能改写这部分内存区域,或者数据从非正确的地址读取。访问数组元素如下所示
15、:必须在软件中仔细检查要索引的变量,并判断是否允许访问每个索引。例子:UINT Pressure0;USINT index;index :=Pressure0 :=;Access to the first array elementPressureindex:=;Access via index variablePressure :=;Access to the tenth array element ;is the highest ;allowed array index备注:用sizeof函数计算数组元素的个数来限制数组的索引号,在后面会有相应的例子。内存管理和数据存贮TM0内存管理备注:
16、还可以用检测函数来检测IEC语言的索引是否有超限,参考Automation Studio在线帮助。路径为:B&R Software World:AutomationStudio:Programming Languages:IEC Languages:Check Functions内存管理和数据存贮 TM0内存管理2.2.5 结构结构或用户数据类型是一组基本数据类型和/或用户数据类型,由一个共同的名字来寻址。每个独立的元素也有自己的名称。图.结构结构主要是将相互关联的数据和值分组。例如烤面包的配方,具有相同的成分,不同数量的配方成分。访问结构的元素:例子:recipe_typ Bread;Bre
17、ad.flour :=0;Access to the flour elementBread.water :=;Access to the water elementBread.salt :=;Access to the salt elementBread.yeast :=;Access to the yeast element内存管理和数据存贮TM0内存管理2.2.6结构数组与基本数据类型的数组一样,结构数组的子元素也是通过索引号来寻址,规则与数组一样。图.结构数组结构数组的子元素通过以下方式来访问:这里同样要检测索引号是否在允许的范围内。索引号的范围是从0到。例子:recipe_typ Br
18、eads;index :=Breads0.flour :=0;Access to array element 0Breadsindex.water:=;Access via index variableBreadsindex.salt :=Breads.yeast :=;Maximum array index is 备注:用sizeof函数计算数组元素的个数来限制数组的索引号,在后面会有相应的例子。内存管理和数据存贮 TM0内存管理2.2.7sizeof函数当开发软件时,编写代码的重点是有效和容易操作。然而这只对运行时确定的数据有效。变量,数组,结构,结构数组的大小可以用sizeof函数来确定
19、。这个函数返回的是指定元素的字节大小。sizeof函数用在以下应用中:确定变量的大小 确定循环初始化数组时的结束值 计算偏移量确认变量的大小:例子:UINT SizeInByte;DINT SetPosition;SizeInByte:=sizeof(SetPosition)函数的返回值是变量在内存中所占的字节数。内存管理和数据存贮TM00用loop初始化数组的元素:内存管理例子:方法:使用数字常量UINT Pressure0;UINT lcnt;Loop lcnt:=0 to do Pressurelcnt:=0;Initializing all elementsEnd_Loop例子:方法:
20、用sizeof计算循环的结束值UINT Pressure0;UINT lcnt;UINT szAll;UINT szSingle;UINT elem;szAll :=sizeof(Pressure);Size of the array in bytesszSingle:=sizeof(Pressure0);Size of an element elem :=szAll/szSingle;Number of elements=All bytes/bytes in an element;End value of the loop is(elements )!Loop lcnt:=0 to(elem
21、 )do Pressurelcnt:=0;Initialization of all elementsEnd_Loop例子:方法:综合表达方式UINT Pressure0;UINT lcnt;Loop lcnt:=0 to(sizeof(Pressure)/sizeof(Pressure0)do Pressurelcnt:=0 ;Initialization of all elementsEnd_Loop内存管理和数据存贮 TM0内存管理确定结构的大小:例子:UINT SizeInByte;recipe_typ Bread;SizeInByte:=sizeof(Bread)这个数据类型的总的字
22、节数应为。但事实上使用sizeof函数所得的结果是。怎么会这样呢?这主要是由于处理器的排列方式造成的,下一部分将详细阐述这一原因。备注:在程序中使用固定的数字的确能缩短程序代码,然而:例如:如果数组的大小改变了,那么程序的代码也要改变。用复杂些的方法编写代码就不会出现这种问题,那时代码会变的更高效和更灵活。当数组大小改变时,程序代码并不需要改变,这样就不用一直监视数组大小是否改变了。内存管理和数据存贮TM0内存管理2.3排列内存中结构的大小与结构用的字节数不必要一致。排列可以确保个或个字节的变量只是放在一些地址上,这个地址可以被该值除尽,当然这取决于所用的处理器。在以下情况中,根据数据类型的结
23、构,实际使用了个字节。图.结构但事实上,用sizeof函数可以看到它占用了个字节。图.结构大小排列的后面是什么呢?这主要取决于处理器的结构,不同的处理器有不同的地址排列规则,编译器必须遵从。原则上,变量不可能以奇地址在内存中开始存储。在字节数组中,排列以偶地址开始,但每个字节可以交替放在奇偶位置的地址上。具有个字节的变量和元素,在内存中只能放在可以被整除的地址中。(例如:偶地址)在SG芯片中,具有个字节的变量只能放在可以被整除的地址中。内存管理和数据存贮 TM0内存管理在不同的平台(SG或SG)上,内存的排列会有一些小小的区别。以上对排列的阐述是基于SG芯片的,对于SG芯片来说,除了字节的值放
24、在可以被整除的地址上,其它的规则与SG的一样。例子:在结构中已使用的字节数是。编译器在第一个字节后插入了一个填充字节,元素water于是就又从偶地址开始存放。元素salt后面插入了个填充字节,因此最后一个UDINT类型的元素,就可以存放在被整除的地址上了。总之,当考虑到内存中的排列时,共占用了个字节。当改变元素water 和 salt的次序时可以使用填充字节。在这个例子中,编译器并不需要插和任何填充字节,因为每个元素的起始地址都是其符合排列规则的。备注:当构建用户数据类型时,建议用例子中的填充字节或备用字节来填充。在SG芯片上构建的数据类型排列同样可以用在SG芯片上,而不会有任何问题。这就意味
25、着在个系统中同样可以运行软件。内存管理和数据存贮TM0内存管理2.3.1确定地址每个内存区域都有它的地址,和旅馆的房号没什么区别。内存区域通过地址唯一地识别。编译器(不是用户)给变量,常量,数组,结构,结构数组分配地址和偏移量。这就意味着经常使用的地址是由系统创建的,用户也可以使用。地址按如下方式确定:例子:UDINT adrCounter;USINT Counter;adrCounter:=adr(Counter)函数的返回值是内存中变量的地址。地址变量都是UDINT类型!备注:当编译时,会创建变量列表,并给其中每个变量分配指定的偏移量。当控制器启动时,操作系统为变量在RAM中预留一个特定的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 培训模块之 TM250 内存管理和数据存贮 培训 模块 TM250 内存 管理 数据 存贮
限制150内