1.二进制数
所有的数据在PLC中都以二进制形式储存,在编程软件中可以使用不同的数制。
(1)用1位二进制数表示数字量
二进制数的1位(bit)只能取0和1这两个不同的值,可以用一个二进制位来表示开关量(或称为数字量)的两种不同的状态,例如触点的断开和接通、线圈的通电和断电等。如果该位为1,梯形图中对应的位编程元件(例如M和Q)的线圈“通电”,其常开触点接通,常闭触点断开,以后称该编程元件为1状态,或称该编程元件为ON(接通)。如果该位为0,对应的编程元件的线圈和触点的状态与上述的相反,称该编程元件为0状态,或称该编程元件为OFF(断开)。
(2)多位二进制数
可以用多位二进制数来表示大于1的数字,二进制数遵循逢2进1的运算规则,每一位都有一个固定的权值,从右往左的第 n 位(最低位为第0位)的权值为2 n ,第3位至第0位的权值分别为8、4、2、1,所以二进制数又称为8421码。
S7-200 SMART用2#来表示二进制常数。16位二进制数2#0000 0100 1000 0110对应的十进制数为2 10 +2 7 +2 2 +2 1 =1158。
(3)有符号数的表示方法
PLC用二进制补码来表示有符号数,其最高位为符号位,最高位为0时为正数,为1时为负数。正数的补码是它本身,最大的16位二进制正数为2#0111 1111 1111 1111,对应的十进制数为32767。
将正数的补码逐位取反(0变为1,1变为0)后加1,得到绝对值与它相同的负数的补码。例如将1158对应的补码2#0000 0100 1000 0110逐位取反后,得到2#1111 1011 0111 1001,加1后得到-1158的补码1111 1011 0111 1010。
将负数的补码的各位取反后加1,得到它的绝对值对应的正数。例如将-1158的补码2#1111 1011 0111 1010逐位取反后得到2#0000 0100 1000 0101,加1后得到1158的补码2#0000 0100 1000 0110。表3-1给出了不同进制的数的表示方法。常数的取值范围见表3-2。
2.十六进制数
多位二进制数的读、写很不方便,为了解决这个问题,可以用十六进制数来表示多位二进制数。十六进制数使用16个数字符号,即0~9和A~F,A~F分别对应于十进制数10~15。可以用数字后面加“H”来表示十六进制常数,例如AE75H。S7-200 SMART用数字前面的“16#”来表示十六进制常数。4位二进制数对应于1位十六进制数,例如二进制常数2#1010 1110 0111 0101可以转换为16#AE75。
表3-1 不同进制的数的表示方法
表3-2 常数的取值范围
十六进制数采用逢16进1的运算规则,从右往左第 n 位的权值为16 n (最低位的 n 为0),例如16#2F对应的十进制数为2×16 1 +15×16 0 =47。
3.BCD码
BCD(Binary Coded Decimal)码是各位按二进制编码的十进制数。每位十进制数用4位二进制数来表示,0~9对应的二进制数为0000~1001,各位BCD码之间的运算规则为逢十进1。以BCD码1001 0110 0111 0101为例,对应的十进制数为9675,最高的4位二进制数1001表示9000。4位BCD码用16位二进制数(即一个字)来表示,允许的最大数字为9999,最小的数字为0。
人们熟悉十进制数,因此PLC的输入和输出的数据一般采用BCD码格式。拨码开关(见图3-5)内部可转动的圆盘圆周面上有0~9这10个数字,用它面板上的按钮来增、减各位要输入的数字。它用内部的硬件将显示的十进制数转换为4位二进制数。PLC用输入点读取的多位拨码开关的输出值就是BCD码,需要用数据转换指令BIN将它转换为16位二进制整数。编程软件用十六进制格式(16#)表示BCD码。例如从图3-5中的拨码开关读取的12位二进制数为2#1000 0010 1001,对应的BCD码用16#829来表示。
用PLC的4个输出点给译码驱动芯片4547提供输入信号(见图3-6),可以用共阴极LED七段显示器显示一位十进制数。需要用数据转换指令BCD将PLC中的16位二进制整数转换为BCD码,然后分别送给各个译码驱动芯片。
视频“容易混淆的BCD码和十六进制数”可通过扫描二维码3-1播放。
二维码3-1
图3-5 拨码开关
图3-6 LED七段显示器电路
数据类型定义了数据的长度(位数)和表示方式。S7-200 SMART的指令对操作数的数据类型有严格的要求。
1.位
位(bit)数据的数据类型为BOOL(布尔)型,BOOL变量的值为2#1和2#0。BOOL变量的地址由字节地址和位地址组成,例如I3.2中的区域标示符“I”表示输入(Input),字节地址为3,位地址为2(见图3-7)。这种访问方式称为“字节.位”寻址方式。
2.字节
一个字节(Byte)由8个位数据组成,例如输入字节IB3(B是Byte的缩写)由I3.0~I3.7这8位组成(见图3-7)。其中的第0位I3.0为最低位,第7位I3.7为最高位。
3.字和双字
相邻的两个字节组成一个字(Word),相邻的两个字组成一个双字(Double Word)。字和双字都是无符号数,它们用十六进制数来表示。
VW100是由VB100和VB101组成的一个字(见图3-8),VW100中的V为变量存储器的区域标示符,W表示字。双字VD100由VB100~VB103(或VW100和VW102)组成,VD100中的D表示双字。字的取值范围为16#0000~16#FFFF,双字的取值范围为16#0000 0000~16#FFFF FFFF。
图3-7 位数据与字节
图3-8 字节、字和双字
需要注意下列问题:
1)以组成字VW100和双字VD100的编号中最小的字节VB100的编号100作为VW100和VD100的编号。
2)组成VW100和VD100的编号最小的字节VB100为VW100和VD100的最高位字节,编号最大的字节为字和双字的最低位字节。
3)数据类型字节、字和双字都是无符号数,它们的数值用十六进制数表示。从图3-9可以看出字节、字和双字之间的关系。
图3-9 状态图表
4.16位整数和32位双整数
16位整数(Integer, INT)和32位双整数(Double Integer, DINT)都是有符号数。整数的取值范围为-32768~32767,双整数的取值范围为-2147483648~2147483647。
5.32位浮点数
浮点数(REAL)又称为实数,可以表示为1. m ×2 E ,尾数中的 m 和指数 E 均为二进制数, E 可能是正数,也可能是负数。ANSI/IEEE 754—1985标准格式的32位实数的格式为1. m ×2 e ,式中的指数 e = E +127(1≤ e ≤254)为8位正整数。
ANSI/IEEE标准浮点数的格式如图3-10所示,共占用一个双字(32位)。最高位(第31位)为浮点数的符号位,最高位为0时为正数,为1时为负数;8位指数 e 占第23~30位;因为规定尾数的整数部分总是为1,只保留了尾数的小数部分 m (第0~22位)。第22位的权值为2 -1 ,第0位的权值为2 -23 。浮点数的范围为±1.175 495 ×10 -38 ~±3.402 823 ×10 38 。
图3-10 浮点数的结构
浮点数的优点是用很小的存储空间(4B)可以表示非常大和非常小的数。PLC的输入、输出变量(例如模拟量输入值和模拟量输出值)大多是整数,用浮点数来处理这些数据需要进行整数和浮点数之间的相互转换,浮点数的运算速度比整数的运算速度慢一些。
在编程软件中,一般并不使用二进制格式或十六进制格式表示的浮点数,而是用十进制小数来输入或显示浮点数,例如在编程软件中,50是16位整数,而50.0为浮点数(见图3-9)。
6.ASCII码字符
ASCII码(美国信息交换标准代码)由美国国家标准局(ANSI)制定,它已被国际标准化组织(ISO)定为国际标准(ISO 646标准)。标准ASCII码也叫作基础ASCII码,用7位二进制数来表示所有的英文大写、小写字母,数字0~9、标点符号,以及在美式英语中使用的特殊控制字符。数字0~9的ASCII码为十六进制数30H~39H,英文大写字母A~Z的ASCII码为41H~5AH,英语小写字母a~z的ASCII码为61H~7AH。
7.字符串
数据类型为STRING的字符串由若干个ASCII码字符组成,第一个字节定义字符串的长度(0~254,见图3-11),后面的每个字符占一个字节。变量字符串最多255个字节(长度字节加上254个字符字节)。
图3-11 字符串的格式
1.过程映像输入寄存器(I)
在每个扫描周期开始时,CPU对物理输入点进行采样,用过程映像输入寄存器来保存采样值。
过程映像输入寄存器是PLC接收外部输入的数字量信号的窗口。外部输入电路接通时,对应的过程映像输入寄存器为ON(1状态),反之为OFF(0状态)。输入端可以外接常开触点或常闭触点,也可以接多个触点组成的串并联电路。在梯形图中,可以多次使用输入位的常开触点和常闭触点。
I、Q、V、M、S、SM和L存储器区均可以按位、字节、字和双字来访问,例如I3.5、IB2、IW4和ID6。
2.过程映像输出寄存器(Q)
在扫描周期的末尾,CPU将过程映像输出寄存器的数据传送给输出模块,再由后者驱动外部负载。如果梯形图中Q0.0的线圈“通电”,继电器型输出模块中对应的硬件继电器的常开触点闭合,使接在Q0.0对应的端子的外部负载通电,反之则该外部负载断电。输出模块中的每一个硬件继电器仅有一对常开触点,但是在梯形图中,每一个输出位的常开触点和常闭触点都可以被多次使用。
3.变量存储器(V)
变量(Variable)存储器用来在程序执行过程中存放中间结果,或者用来保存与过程或任务有关的其他数据。
4.位存储器(M)
位存储器(M0.0~M31.7)又称为标志存储器,它类似于继电器控制系统的中间继电器,用来存储中间状态或其他控制信息。S7-200 SMART的M存储器只有32B,如果不够用,可以用V存储器来代替M存储器。
5.定时器(T)
定时器相当于继电器系统中的时间继电器。S7-200 SMART有三种时间基准(1ms、10ms和100ms)的定时器。定时器的当前值为16位有符号整数,用于存储定时器累计的时间基准增量值(1~32767)。预设值是定时器指令的一部分。
定时器位用来描述定时器的延时动作的触点状态,定时器位为ON时,梯形图中对应的定时器的常开触点闭合、常闭触点断开;定时器位为OFF时,梯形图中触点的状态相反。
用定时器地址(例如T5)来访问定时器的当前值和定时器位,带位操作数的指令用来访问定时器位,带字操作数的指令用来访问当前值。
6.计数器(C)
计数器用来累计其计数输入脉冲电平由低到高(即上升沿)的次数,S7-200 SMART有加计数器、减计数器和加减计数器。计数器的当前值为16位有符号整数,用来存放累计的脉冲数。用计数器地址(例如C20)来访问计数器的当前值和计数器位。带位操作数的指令访问计数器位,带字操作数的指令访问当前值。
7.高速计数器(HC)
高速计数器用来累计比CPU的扫描速率更快的事件,计数过程与扫描周期无关。其当前值和预设值为32位有符号整数,当前值为只读数据。高速计数器的地址由区域标示符HC和高速计数器号组成,例如HC2。
8.累加器寄存器(AC)
累加器寄存器简称为累加器,它是一种特殊的存储单元,可以用来向子程序传递参数和从子程序返回参数,或用来临时保存中间的运算结果。CPU提供了4个32位累加器(AC0~AC3),可以按字节、字和双字来访问累加器中的数据。按字节、字只能访问累加器的低8位或低16位,按双字访问全部的32位,访问的数据长度由所用的指令决定。例如在指令“MOVW AC2,VW100”中,按字(W)访问AC2。
9.特殊存储器(SM)
特殊存储器用于CPU与用户程序之间交换信息,例如SM0.0一直为ON,SM0.1仅在执行用户程序的第一个扫描周期为ON。SM0.4和SM0.5分别提供周期为1min和1s的时钟脉冲。SM1.0、SM1.1和SM1.2分别是零标志、溢出标志和负数标志。
10.局部存储器(L)
S7-200 SMART将主程序、子程序和中断程序统称为程序组织单元(POU),各POU都有自己的64B的局部(Local)存储器。使用梯形图和功能块图时,将保留局部存储器的最后4B。
局部存储器简称为L存储器,仅在它被创建的POU中有效,各POU不能访问其他POU的局部存储器。局部存储器作为暂时存储器,或用来作子程序的输入、输出参数。变量存储器(V)是全局存储器,可以被所有的POU访问。
S7-200 SMART给主程序和它调用的8个子程序嵌套级别、中断程序和它调用的4个子程序嵌套级别各分配64B局部存储器。
11.模拟量输入(AI)
S7-200 SMART的AI模块将现实世界连续变化的模拟量(例如温度、电流、电压等)按比例转换为一个字长(16位)的数字量,用区域标识符AI、表示数据长度的W(字)和起始字节的地址来表示模拟量输入的地址,例如AIW16。因为模拟量输入的长度为一个字,应从偶数字节地址开始存放,模拟量输入值为只读数据。
12.模拟量输出(AQ)
S7-200 SMART的AO模块将长度为一个字的数字转换为现实世界的模拟量,用区域标识符AQ、表示数据长度的W(字)和起始字节的地址来表示存储模拟量输出的地址,例如AQW32。因为模拟量输出的长度为一个字,应从偶数字节地址开始存放,模拟量输出值是只写数据,用户不能读取模拟量输出值。
13.顺序控制继电器(S)
32B的顺序控制继电器(SCR)位用于组织设备的顺序操作,与顺序控制继电器指令配合使用,详细的使用方法见5.4节。
14.CPU存储器的范围与特性
标准型CPU存储器的范围如表3-3所示。紧凑型CPU没有模拟量输入AIW和模拟量输出AQW。
表3-3 S7-200 SMART存储器的范围
在S7-200 SMART中,通过地址访问数据,地址是访问数据的依据,访问数据的过程称为“寻址”。几乎所有的指令和功能都与各种形式的寻址有关。
1.直接寻址
直接寻址指定了存储器的区域、长度和位置,例如VW90是V存储区中16位的字,其地址为90。
2.间接寻址的指针
间接寻址在指令中给出的不是操作数的值或操作数的地址,而是给出一个被称为指针的双字存储单元的地址,指针里存放的是真正的操作数的地址。
间接寻址用来在程序运行期间,通过改变指针中地址的值,动态地修改指令中的地址。间接寻址常用于循环程序和查表程序。用循环程序来累加一片连续的存储区中的数值时,每次循环累加一个数值。应在累加后修改指针中存储单元的地址值,使指针指向下一个存储单元,为下一次循环的累加运算做好准备。没有间接寻址,就不能编写循环程序。
地址指针就像收音机调台的指针,改变指针的位置,指针指向不同的电台。改变指针中的地址值,地址指针“指向”不同的地址。
旅客入住酒店时,在前台办完入住手续,酒店就会给旅客一张房卡,房卡里面有房间号,旅客根据房间号使用酒店的房间。修改房卡中的房间号,旅客用同一张房卡就可以入住不同的房间。这里房卡就是指针,房间相当于存储单元,房间号就是存储单元的地址。
S7-200 SMART CPU允许使用指针,对存储区域I、Q、V、M、S、AI、AQ、SM、T(仅当前值)和C(仅当前值)进行间接寻址。间接寻址不能访问单个位(bit)地址、HC、L存储区和累加器。
使用间接寻址之前,应创建一个指针。指针为双字存储单元,用来存放要访问的存储器的地址,只能用V、L或累加器作指针。建立指针时,用双字传送指令MOVD将需要间接寻址的存储器地址送到指针中,例如“MOVD &VB200,AC1”(见图3-12)。&VB200是VB200(即VW200的首字节)的地址,而不是VB200中的值。
图3-12 指针与间接寻址
3.用指针访问数据
用指针访问数据时,操作数前加“*”号,表示该操作数为一个指针。图3-12的“MOVW *AC1,AC0”是字操作指令,AC1是一个指针,*AC1是AC1所指的地址中的数据。图3-12存放在VB200和VB201组成的VW200中的数据字被传送到累加器AC0的低16位。
4.修改指针
用指针访问相邻的下一个数据时,因为指针是32位的数据,应使用双字指令来修改指针值,例如双字加法指令ADDD或双字递增指令INCD。修改时记住需要调整的存储器地址的字节数,访问字节时,指针值加1,访问字时,指针值加2,访问双字时,指针值加4。
【例3-1】 某发电机在计划发电时每个小时有一个有功功率给定值,从0点开始,这些给定值依次存放在VW100~VW146组成的表格中,一共24个字。从实时时钟读取的小时值(0~23)保存在VD20中,用VD10作指针,用间接寻址读取当时的功率给定值,送给VW30。下面是例程“计划发电”中的语句表程序。
一个字由两个字节组成,地址相邻的两个字的地址增量为2,所以用了两条双字加法指令。在程序运行时,启动程序状态监控。设置VD20的值为8(当前时间为上午8:00),执行两次加法指令后,指针VD10中是VW116的地址。*VD10的值是读取的上午8:00的有功功率给定值。附录图A-2是本例程的语句表程序状态监控,*VD10的监控值后面的括号中给出了操作数的地址VW116。
视频“间接寻址”可通过扫描二维码3-2播放。
二维码3-2
例4-7给出了在循环程序中使用间接寻址的例子。