首页 理论教育 变量编程及存储区优化技巧

变量编程及存储区优化技巧

时间:2023-06-19 理论教育 版权反馈
【摘要】:其中有关“数据块”等“块”的概念已在4.1.1节详细说明。图4-2 状态字的结构首次检测位首次检测是指CPU对逻辑串第一条指令的检测,检测结果保存在RLO位中。位逻辑指令不访问存储区时,STA保持为1。

变量编程及存储区优化技巧

用户程序中的所有数据可分成3个类型,即

1)STEP 7提供的基本数据类型。

2)用户通过组合基本数据类型创建的复杂数据类型。

3)定义用来给FB或FC传送参数的参数类型。

1.变量类型

(1)基本数据类型

每种基本数据类型具有固定的长度。表4-2列出了基本数据类型。

表4-2 基本数据类型

978-7-111-44821-1-Chapter04-3.jpg

(2)复杂数据类型

定义的是大于32位的数字数据群或包含其他数据类型的数据群。STEP 7定义的复杂数据类型有:DATE_AND_TIME(日期和时间),STRING(字符串),ARRAY(数组),STRUCT(结构),UDT(用户自定义数据类型),FB和SFB(功能块和系统功能块)。表4-3中描述了这些复杂数据类型。其中有关“数据块”等“块”的概念已在4.1.1节详细说明。

表4-3 复杂数据类型

978-7-111-44821-1-Chapter04-4.jpg

(3)参数类型

除了基本和复杂数据类型外,STEP 7还允许为块之间传送的形式参数定义参数类型。STEP 7可以定义下列参数类型。

1)TIMER或COUNTER:2B长,指定当执行块时将使用的特定定时器或特定计数器。如果赋值给TIMER或COUNTER参数类型的形式参数,相应的实际参数必须是定时器或计数器,如T1、C10。

2)块:2B长,指定用作输入或输出的特定块。参数的声明确定使用的块类型(BLOCK_FB、BLOCK_FC、BLOCK_DB、BLOCK_SDB等)。赋给BLOCK参数类型的形式参数,指定块地址作为实际参数,例如,“FC101”。

3)POINTER:6B长,参考变量的地址。指针包含地址而不是值。当赋值给POINTER参数类型的形式参数,指定地址作为实际参数。在STEP 7中,可以用指针格式或简单地以地址指定指针。例如,M50.0,若寻址以M50.0开始的数据的指针,则定义为P#M50.0。

4)ANY:10B长。当实际参数的数据类型未知或当可以使用任何数据类型时,可以使用这种定义方式。如P#M50.0BYTE10即定义了数据类型的ANY格式。

参数类型也可以在用户自定义数据类型(UDT)中使用。

2.存储区与变量的关系

CPU的存储器可以划分为装载存储器、工作存储器以及系统存储器。

装载存储器用于存储用户程序,可以是RAM或EPROM。未标记为启动时所需要的块将只存储在装载存储器中。

工作存储器(集成的RAM)包含了与运行程序相关的部分S7程序。该程序仅在工作存储器和系统存储器中执行。

系统存储器(RAM)包含了每个CPU为用户程序提供的存储器单元,例如过程映像输入和输出表、位存储器、定时器和计数器。系统存储器也包含块堆栈和中断堆栈。CPU的系统存储器还提供了临时存储器(局部数据堆栈),存放调用块时用到的临时数据。这些数据只在块激活时才保持有效。

注意:变量是如何存储在临时局部数据中的?

L堆栈永远以地址“0”开始。在L堆栈中,会为每个数据块保留相同个数的字节,作为存放每个块所拥有的静态或局部数据。

当某个块终止时,那么它的空间随之也被重新释放出来。指针总是指向当前打开块的第一个字节。

除了上述的区域外,CPU还有两个32位的累加器(ACCU1和ACCU2),两个地址寄存器AR1和AR2,两个数据块地址寄存器DB和DI,一个状态字寄存器。

状态字用来表示CPU执行程序时的一些重要状态,其结构如图4-2所示。

978-7-111-44821-1-Chapter04-5.jpg

图4-2 状态字的结构

(1)首次检测位978-7-111-44821-1-Chapter04-6.jpg

首次检测是指CPU对逻辑串第一条指令的检测,检测结果保存在RLO位中。FC位在逻辑串开始时为0,在执行过程中变为1。执行逻辑串结束的指令,如输出指令或与逻辑运算有关的转移指令,又将978-7-111-44821-1-Chapter04-7.jpgC清0。

(2)逻辑操作结果RLO

此位存储位逻辑运算及比较运算的结果。在逻辑串中,信号流的状态可以由RLO表示,有信号流时,RLO=1;没有信号流,RLO=0。

(3)状态位STA

此位只在程序测试中由CPU使用。当位逻辑指令访问存储区时,STA与被操作位的值是相同的。位逻辑指令不访问存储区时,STA保持为1。

(4)或位OR

在先进行逻辑与运算,后进行逻辑或运算的逻辑串中,OR用来暂时保存逻辑与的结果。其他指令执行时,OR位清0。(www.xing528.com)

(5)存储上溢OS

OV被置1时,OS也置1,OV被清0后OS还可以继续保持为1。OS的状态表示先前的指令执行是否出过错。块调用、块结束指令以及JOS指令能使OS清0。

(6)溢出位OV

当一个算术运算或浮点数比较运算执行时出错,其运算结果不正常时,OV被置1。

(7)条件码CC0、CC1

算术和逻辑运算中,条件码用来表示累加器1中的运算内容与0的大小关系。在比较指令和移位指令中,条件码表示比较结果或移出位状态,见表4-4和表4-5。

表4-4 算术运算中的条件码

978-7-111-44821-1-Chapter04-8.jpg

表4-5 逻辑运算、比较运算及移位指令的条件码

978-7-111-44821-1-Chapter04-9.jpg

(8)二进制结果位BR

在既有位操作又有字操作的程序中,BR可表示字操作结果是否正确。用户在编写FB和FC时,必须对BR位进行处理,功能块正确运行后,应使BR=1,否则BR=0。实现这种管理,可以用—(SAVE)指令,将RLO保存到状态字的BR位。功能块执行正确,使RLO=1并存入BR,否则RLO=0并存入BR。

3.装载存储器和工作存储器

前面已有讲述,此处不再重复。

4.系统存储器

系统存储器被划分成多个地址区,见表4-6。使用指令,可以在相应的地址区域中直接对数据寻址。

表4-6 系统存储器结构

978-7-111-44821-1-Chapter04-10.jpg

表中符号I、Q分别表示输入和输出。I、IB、IW、ID分别表示输入位、输入字节、输入字和输入双字,其余类同。外设输入区和外设输出区的大小与CPU型号及具体系统配置有关,最大空间是64KB。

注意:可以从S7CPU中读出哪些标识数据?

通过SFC51“RDSYSST”可读出下列标识数据:

可以读出订货号和CPU版本号。为此,使用SFC51和SSLID0111并使用下列索引

1=模块标识

6=基本硬件标识

7=基本固件标识

过程映像输入/输出表是外设输入/输出区的前128个字节。CPU既可间接使用过程映像表,也可直接通过底板/P总线来访问集中和分布式数字输入/输出模块的输入和输出。当使用STEP 7对模块进行组态时,需要将程序中使用的地址分配给模块。

对于集中I/O模块,在组态表中进行机架的分布以及模块到插槽的分配。

对于具有分布式I/O(PROFIBUS DP或PROFINET IO)的工作站,在“主站系统”组态表中按PROFIBUS地址排列DP从站,并将模块分配给插槽。

注意:为S7 CPU上的I/O模块(集中式或者分布式的)分配地址时应当注意哪些问题?

请注意,创建的数据区域(如一个双字)不能组态在过程映像的边界上,因为在该数据块中,只有边界下面的区域能够被读入过程映像,因此不可能从过程映像访问数据。因此,这些组态规则不支持这种情况:例如,在一个256B输入的过程映像的254号地址上组态一个输入双字。如果一定需要如此选址,则必须相应地调整过程映像的大小(在CPU的Properties中)。

通过对模块进行组态,就不必再使用开关来设定每个模块上的地址。组态完成后,编程设备把数据发送给CPU,从而使该CPU能够识别为其分配的模块。

与直接访问输入/输出模块相比,访问过程映像的主要优点在于在一个程序周期持续期间,CPU具有过程信号的一致性的映像。如果在程序执行期间,输入模块的信号状态发生了变化,过程映像中的信号状态仍被保持,直到下一个周期过程映像进行了更新。在用户程序中周期性地扫描输入信号的过程,确保了总有一致的输入信息。访问过程映像还比直接访问信号模块速度更快。

本地数据区也叫局部数据堆栈或L堆栈。当对组织块编程时,可以声明临时变量(TEMP)只在块执行期间可用,然后它将被覆盖。在首次访问局部数据堆栈之前,必须对局部数据初始化。除此之外,每个组织块还需要20B的局部数据来存储它们的启动信息。

CPU只能为当前执行的块的临时变量(局部数据)提供有限的存储空间。该存储器局部数据堆栈的大小取决于CPU。局部数据堆栈被各优先级均分(默认)。也就是说每个优先级都有它自己的局部数据区,从而保证了较高的优先级和它们的OB自身的局部数据有可用的空间。

5.定义符号

在程序中,访问I/O信号、位存储器、计数器、定时器、数据块和功能块等,可以使用绝对地址,也可以使用地址符号。

绝对地址包含地址标识符和存储器位置,例如,Q4.0、I1.1、M2.0、FB21等。可以给绝对地址分配一个符号名,采用具有某种意义的符号名来代替绝对地址,比如把MOTOR_ON分配给Q4.0,而这将使程序更容易阅读。

使用符号时要注意共享符号(全局符号)和局部符号的区别。共享符号在整个用户程序中有效,并且是唯一的,它在符号表中定义。局部符号在块的变量声明表中定义,并且只在定义的块中有效。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈