在使用指令进行编程时,会涉及指令所使用的操作数,以及指令以何种方式存储和读取数据。因此本节主要介绍S7-200的数据格式和寻址方式。
S7-200 CPU收集现场状态等信息,把这些信息按照用户程序进行运算、处理,然后输出控制、显示等信号。所有这些信息在S7-200 PLC中,都表示为不同格式的数据。在S7-200中,各种指令对数据格式都有一定的要求,指令与数据之间的格式要一致才能正常工作。例如,为一个整数数据使用浮点数运算指令,显然会得到不正确的结果。数据有不同的长度,也就决定了数值的大小范围。模拟量信号在进行模数(A/D)和数模(D/A)转换时,一定会存在误差;代表模拟量信号的数据,只能以一定的精度表示模拟量信号。S7200 CPU支持的数据格式、数据长度和取值范围见表1-11。
表1-11 S7-200 CPU支持的数据格式、数据长度和取值范围
S7-200 CPU将信息存储于不同的存储器区中,存储区的类型主要有输入映像寄存器、输出映像寄存器、变量存储区、位存储区、定时器存储区、计数器存储区、高速计数器、累加器、特殊存储器、局部存储器、模拟量输入、模拟量输出和顺序控制继电器存储区。
1.输入映像寄存器(I)
输入映像寄存器的标识符为I,在每次扫描周期的开始,CPU对物理输入点进行采样,并将采样值写入输入映像寄存器中。可以按位、字节、字或双字来存取输入过程映像寄存器中的数据。输入映像寄存器是可编程控制器接收外部输入开关量信号的窗口。可编程控制器通过光耦合器,将外部信号的状态读入并存储在输入映像寄存器中。外部输入电路接通时,对应的映像寄存器为ON(1状态)。
2.输出映像寄存器(Q)
输出映像寄存器的标识符为Q,在每次扫描周期的结尾,CPU将输出映像寄存器中的数值复制到物理输出点上,再由后者驱动外部负载。可以按位、字节、字或双字来存取输出过程映像寄存器。
3.变量存储区(V)
变量存储区存储程序执行过程中控制逻辑操作的中间结果,也可以用它来保存与工序或任务相关的其他数据。可以按位、字节、字或双字来存取变量存储区中的数据。
4.位存储区(M)
位存储区用来保存控制继电器的中间操作状态和其他控制信息,并且可以按位、字节、字或双字来存取位存储区。
5.定时器存储区(T)
在S7-200 CPU中,定时器可用于时间累计,其分辨率(时基增量)分为1ms、10ms和100ms三种。定时器有两个变量:定时器当前值和定时器位。定时器当前值是16位有符号整数,可存储由定时器计数的时间量。定时器位是在比较当前值和预设值后,可设置或清除该位。预设值是定时器指令的一部分。可以用定时器地址(T + 定时器号,如T1)来存取当前值和定时器位。是否访问定时器位或当前值取决于所使用的指令,带位操作数的指令可访问定时器位,而带字操作数的指令则访问当前值。
6.计数器存储区(C)
S7-200 CPU提供三种类型的计数器,可计算计数器输入上的低-高跳变事件:一种类型仅计算向上事件,一种类型仅计算向下事件,还有一种类型计算向上和向下两种事件。计数器有两个变量:当前值和计数器位。当前值是16位有符号整数,可存储累加计数值。计数器位是在比较当前值和预设值后,可设置或清除该位。预设值是计数器指令的一部分。可以用计数器地址(C+计数器号,如C1)来访问这两种形式的计数器数据。是否访问计数器位或当前值取决于所使用的指令,带位操作数的指令访问计数器位,而带字操作数的指令则访问当前值。
7.高速计数器(HC)
高速计数器对高速事件计数,它独立于CPU的扫描周期。高速计数器有一个32位的有符号整数计数值(或当前值)。若要存取高速计数器中的值,则应给出高速计数器的地址,即存储器类型(HC)加上计数器号(如HC0)。高速计数器的当前值是只读数据,仅可以作为双字(32位)来寻址。
8.累加器(AC)
累加器是可以像存储器一样使用的读/写设备。例如,可以用它来向子程序传递参数,也可以从子程序返回参数,以及用来存储计算的中间结果。S7-200 CPU提供32位累加器(AC0、AC1、AC2和AC3),并且可以按字节、字或双字的形式来访问累加器中的数值,被访问的数据长度取决于存取累加器时所使用的指令。当以字节或者字的形式存取累加器时,使用的是数值的低8位或低16位;当以双字的形式存取累加器时,使用全部32位。
9.特殊存储器(SM)
特殊存储器为CPU与用户程序之间传递信息提供了一种手段,可使用这些位来选择和控制S7-200 CPU的某些特殊功能。例如,SM0.0在执行用户程序时总是为1状态,SM0.1仅在执行用户程序的第一个扫描周期时为1状态。特殊存储器可以按位、字节、字或双字来存取。
10.局部存储器(L)
局部存储器和变量存储器很相似,只有一处区别。变量存储器是全局有效的,而局部存储器只在局部有效。全局是指同一个存储器可以被任何程序存取(包括主程序、子程序和中断程序)。局部是指存储器区和特定的程序相关联。S7-200 CPU给主程序分配64个局部存储器,给每一级子程序嵌套分配64字节局部存储器,同样给中断程序分配64字节局部存储器。其中60字节可以用做临时存储器或者给子程序传递参数。子程序不能访问分配给主程序、中断程序或者其他子程序的局部存储器。同样的,中断程序也不能访问分配给主程序或子程序的局部存储器。
S7-200 CPU根据需要分配局部存储器。也就是说,当主程序执行时,分配给子程序或中断程序的局部存储器是不存在的。当发生中断或者调用一个子程序,需要分配局部存储器时,才会给中断或子程序分配局部存储器。新的局部存储器地址可能会覆盖另一个子程序或中断程序的局部存储器地址。局部存储器在分配时CPU不进行初始化,初值可能是任意的。当在子程序调用中传递参数时,在被调用子程序的局部存储器中,由CPU替换其被传递的参数的值。
11.模拟量输入(AI)
S7-200 CPU将现实世界连续变化的模拟量值(如温度或电压等)转换成1个字长(16位)的数字值,用区域标识符(AI)、数据长度(W)及字节的起始地址来表示模拟量的输入地址。因为模拟输入量为1个字长,且从偶数字节(如0、2、4)开始存放,所以必须用偶数字节地址(如AIW0、AIW2、AIW4)来存取这些值。模拟量输入值为只读数据。
12.模拟量输出(AQ)
S7-200 CPU把1个字长(16位)的数字值按比例转换为电流或电压,用区域标识符(AQ)、数据长度(W)及字节的起始地址来表示模拟量的输出地址。因为模拟量输出为一个字长,且从偶数字节(如0、2、4)开始,所以必须用偶数字节地址(如AQW0、AQW2、AQW4)来改变这些值。模拟量输出值是只写数据。
13.顺序控制继电器存储区(S)
顺序控制继电器用于组织机器操作或者顺序控制,它提供控制程序的逻辑分段,可以按位、字节、字或双字来存取。
S7-200 CPU将信息存储于不同的存储器单元,每个单元都有唯一的地址。通过明确指出要访问的存储器地址,允许用户程序直接访问这些信息。S7-200 CPU使用数据地址访问所有的数据,称为寻址。根据存储器单元中信息存取形式的不同,对编程元件的寻址分为直接寻址和间接寻址。
1.直接寻址
S7-200 CPU将信息存储在存储器中,存储单元按字节进行编址,无论所寻址是何种数据类型,通常应指出它所在存储区域内的字节地址,这种直接指出元件名称的寻址方式称为直接寻址。在直接寻址方式中,直接使用存储器或寄存器的元件名称和地址编号,根据这个地址可以立即找到数据。根据数据类型,直接寻址又分为位寻址、字节寻址、字寻址和双字寻址四种。
若要访问存储区的某一位,则必须指定地址,包括存储器标识符、字节地址和位号。如I3.4,其中存储器标识符“I”表示输入,字节地址为3,位地址为4,如图1-6所示。这种存取方式称为“字节。位”寻址方式。
使用这种字节寻址方式,可以按照字节、字或双字来访问许多存储区(V、I、Q、M、S、L及SM)中的数据。若要访问CPU中的一个字节、字或双字数据,必须以类似位寻址的方式给出地址,包括存储器标识符、数据大小及该字节、字或双字的起始字节地址,如图1-7所示。
图1-6 字节。位寻址
图1-7 对同一地址进行字节、字和双字存取操作的比较
从图1-7中还可以看到,在选用了同一字节地址作为起始地址,分别以字节、字及双字寻址时,其所表示的地址空间是不同的。当涉及多字节组合寻址时,S7-200遵循“低地址、高字节,高地址、低字节”的规律。如VW100中,VB100存放于高字节中,VB101存放于低字节中。
在S7-200中,并不是所有的存储区都支持这四种寻址方式,存储区所支持的寻址方式见表1-12。
表1-12 不同存储区支持的寻址方式
2.间接寻址
间接寻址是指数据存放在存储器或寄存器中,在指令中只出现所需数据所在单元的内存地址。这种间接寻址方式与计算机的间接寻址方式相同,通过指针来访问存储区数据。指针以双字的形式存储其他存储区的地址。只能用V存储器、L存储器或者累加器寄存器(AC1、AC2、AC3)作为指针。要建立一个指针,必须以双字的形式,将需要间接寻址的存储器地址移动到指针中。指针也可以作为参数传递到子程序中。S7-200允许指针访问下列存储区:I、Q、V、M、S、AI、AQ、SM、T(仅当前值)和C(仅当前值)。无法用间接寻址的方式访问单独的位,也不能访问HC或者L存储区。要使用间接寻址,应该用“&”符号加上要访问的存储区地址来建立一个指针。指令的输入操作数应该以“&”符号开头来表明是将存储区的地址而不是其内容,移动到指令的输出操作数(指针)中。当指令中的操作数是指针时,应该在操作数前面加上“*”。如图1-8所示,输入“*AC1”指定AC1是一个指针,“MOVW”指令决定了指针指向的是一个字长的数据。在本例中,存储在VB200和VB201中的数值被移动到累加器AC0中。
图1-8 创建和使用指针
处理连续数据时,通过修改指针可以很容易地存取相邻数据。简单的数学运算,如加法指令或者减法指令,可用于改变指针的数值。由于指针是一个32位的数据,因此要用双字指令来改变指针的数值,如图1-9所示。
图1-9 改变指针
S7-200 CPU提供的本地I/O具有固定的I/O地址,扩展模块上的I/O地址按照离CPU的距离递增排列。离CPU越近,地址号越小。因此在编程时不必配置I/O地址。
对于同种类型的输入/输出模块而言,模块的I/O地址取决于I/O类型和模块在I/O链中的位置。输出模块不会影响输入模块上的I/O点地址,反之亦然。类似的,模拟量模块也不会影响数字量模块的I/O地址,反之亦然。在模块之间,数字量信号的地址总是以8位(1字节)为单位递增的。如果CPU上的物理输入点没有完全占据1字节,其中剩余未用的位也不能分配给后续模块的同类信号。模拟量信号总是要占据两个通道的地址。即便有些模块(如EM235)只有一个实际输出通道,它也要占用两个通道的地址。在编程计算机和CPU实际联机时,使用STEP 7-Micro/WIN的菜单命令“PLC”→“信息(I)”,可以查看CPU和扩展模块的实际I/O地址分配。图1-10所示是一个特定硬件配置中的I/O地址,地址间隙(用灰色斜体文字表示)无法在程序中使用。
图1-10 CPU224XP的本地和扩展I/O地址举例