1.6 数的表示和运算
在数字控制系统中,信号的传送与寄存都是以二进制数0、1进行的。一个16位存储器所存储的仅是一个16位的二进制0和1的组合。它本身并不代表任何东西,如果把它看成一个二进制的数的组合,它就可以代表一个用二进制表示的正整数和0,这种表示叫做纯二进制数表示。但是在模拟量控制中要处理的数不仅是正整数和0,还有负数、小数等。因此,用什么方法来表示数的正、负,用什么方法来表示整数和小数,这是提高运算精度和运算速度的一个重要问题。目前在数字控制系统中,数的表示有两种方法,即定点数和浮点数。采用定点数运算的称为定点运算(又称为整数运算)。采用浮点数运算的称为浮点运算(又称为小数运算)。这两种运算是目前在PLC中广泛采用的基本运算方法。
1.6.1 定点数和浮点数
1. 定点数
所谓定点数,是指人为地将小数点的位置定在某一位。一般有两种情况:一种是小数点位置定在最高位的左边,则表示的数为纯小数;另一种是把小数点位置定在最低位的右边,则表示的数为整数。大部分数字控制设备都采用整数的定点数表示。
那么正数、负数又是如何表示的呢?这里要先介绍一下原码和补码的概念。
原码就是指用纯二进制编码表示的二进制数,而补码就是对原码进行按位求反,再加1后的二进制数。
【例1】求K25的原码和补码(以16位二进制计算)。
K25的原码是B0000000000011001(H0009);
对原码求反得B1111111111100110(HFFE6);
加1为K25的补码是B1111111111100111(HFFE7)。
关于十进制与二进制数之间的转换见7.1.4节。
定点数是这样规定正、负数的:取最高位为符号位,0表示正数,1表示负数,后面各位为表示的值。如为正数,则以其原码表示;如为负数,则用原码的补码表示。图1-33所示为16位二进制定点数的图示。
图1-33 16位定点数图示
下面通过一个例子来说明上面介绍的定点数的表示。
【例2】写出K78和K-40的定点数表示。
K78为正数,用原码表示:B0000000000101110(H002E)
K-40是负数,先写出K40的原码,再求反加1,K-40的定点数表示是:
B1111111111011000(HFFD8)
用定点数表示的整数,其符号位是固定在最高位,后面才是真正的数值。其数值的大小范围与位数有关。常用的是16位和32位,它们的范围为
16位:(-32768~32767)
32位:(-2147483648~2147483647)
有两个定点数的表示是规定的,不照定义求出(以16位为例)
K0:B0000000000000000(H0000)
K-32768:B1000000000000000(H8000)
2. 浮点数
定点数虽然解决了整数的运算,但不能解决小数运算的问题,而且定点数在运算时总是把相除后的余数舍去,这样经多次运算后就会产生很大的运算误差。定点数运算范围也不够大。16位运算仅在-32678~+32676之间。这些原因都使定点数运算的应用受到了限制,而浮点数的表示不但解决了小数的运算,也提高了数的运算精度及数的运算范围。
浮点数和工程上的科学记数法类似。科学记数法是任何一个绝对值大于10(或小于1)的数都可以写成 a×10n的形式,(其中1<a<10)。例如,325 = 3.25×102,0.0825 = 8.25×10 -2等。如果写出原数,就会发现,其小数点的位置与指数n有关。例如
3.14159×102 = 314.159
3.14159×104 = 31415.9
就好像小数点的位置随着 n 在浮动。把这种方法应用到数字控制设备中就出现了浮点数表示方法。
所谓浮点数,就是尾数固定,小数点的位置随指数的变化而浮动的数的表示方法。不同的数字控制设备其浮点数的表示方法也不同。这里仅介绍FX2N PLC的浮点数表示方法。
FX2N PLC中浮点数有两种,分别介绍如下。
1)十进制浮点数
如图1-34所示,用两个连续编号的数据存储器Dn和Dn+1来处理十进制浮点数,其中Dn存浮点数的尾数,Dn+1存浮点数的指数。
图1-34 十进制浮点数图示
则十进制浮点数 = Dn × 10Dn+1。
【例3】十进制浮点数存储器存储数值如下:(D0)=K356,(D1)=K4,试写出十进制浮点数。
十进制浮点数=356 × 104。
FX2N PLC对十进制浮点数有一些规定:
(1)Dn、Dn+1的最高位均为符号位。0为正,1为负。
(2)Dn、Dn+1的取值范围为
尾数Dn = ±(1000~9999)或0
指数Dn+1 = -41~35。
此外,在尾数Dn中,不存在100,如为100的场合变成1000 ×10-1。
(3)十进制浮点数的处理范围为最小绝对值1175×10-41,最大绝对值3402×1035。
【例4】D2、D3为十进制浮点数存储单元。(D2) = H0033,(D3) = HFFFD,试问十进制浮点数为多少?
(D2) = H0033 = K51,(D3) = HFFFD = K-3,
十进制浮点数=5.1 × 10-3=0.0051
在FX2N PLC中,十进制浮点数不能直接用来进行运算,它和二进制浮点数之间可以互相转换。十进制浮点数主要是用来进行数据监示。
2)二进制浮点数
二进制浮点数也是采用一对数据存储器Dn和Dn+1。其规定如图1-35所示。
图1-35 二进制浮点数图示
各部分说明如下。
符号位S:b31位。b31=0,正数;b31=1,负数。
指数N:b23~b30位共8位。(b23~b30)=0或1,
N = b23×20+b24×21+…+b29×26+b30×27。
尾数a:b0~b22位共23位。(b0~b22)=0或1,
a = b22×2-1+b21×2-2+…+b2×2-21+b1×2-22+b0×2-23。
二进制浮点数=
二进制浮点数远比十进制浮点数复杂得多。其最大的缺点是难以判断它的数值。在PLC内部,其浮点运算全部都是采用二进制浮点数进行。
采用浮点数运算不但可以进行小数运算,还可以大大提高运算精度和速度。这正是控制所要求的。
1.6.2 定点运算(整数运算)
定点运算也叫二进制运算,FX系列PLC都具有定点运算的功能。FX系列PLC的定点运算指令有6个,可16位运用,也可32位运用,指令格式功能见表1-2(16位)和表1-3(32位)。表中源址和目标地址均是以存储器D为例说明,实际上,它们都可以用组合位元件和其他字元件。关于指令的进一步说明,可参看编程手册。指令的应用比较容易理解,这里不再做详细解读。
表1-2 二进制四则运算指令(16位)
表1-3 二进制四则运算指令(32位)
指令分为连续执行型和脉冲执行型,如果是连续执行型,那么在驱动条件成立时,每一个扫描周期,指令都会执行一次。如图1-36所示,在X0接通期间,每个扫描周期,存储器D0的内容都会加上10再存入D0。如果只希望一次性执行,采用脉冲执行型即可,在图1-37中,两种处理方法均可。
图1-36 连续执行型说明图示
图1-37 脉冲执行型说明图示
1.6.3 浮点运算(小数运算)
1. 浮点数功能指令
和定点运算不同,FX系列PLC中FX1S,FX1N不具备浮点运算功能。FX2N的浮点数功能指令见表1-4。
表1-4 FX2N的浮点数功能指令
本节仅介绍其中有关浮点数四则运算的相关指令,其余指令可参看编程手册。
2. 浮点数输入
FX2N PLC不具备直接输入浮点数(下称小数)的功能。在浮点数功能指令中,参与运算的数必须是小数才能完成运算功能。因此,在应用浮点数功能指令前,存在一个把整数和小数如何输入到浮点数运算所指定的软元件中的问题。这里仅有一个例外,即常数K/H所表示的整数在运算过程中会自动转换成小数而参与运算,如图1-38所示。
图1-38 常数K/H自动转换小数说明图示
指令FLT为把整数转换成小数的功能指令,指令格式如图1-39所示。
图1-39 整数→小数转换指令
解读:当X0接通时,把(D10)里所寄存的整数转换成小数寄存在(D13,D12)中,指令中源址和目的址中所用软元件仅为D存储器。
【例5】试把整数K100转换成小数寄存在(D11,D10)中。
转换程序如图1-40所示。可以看出,(D11,D10)存的是小数100.000。FX2N PLC的小数运算仅显示三位小数。
图1-40 例5图示
【例6】试把小数3.14输入(D11,D10)。
本例说明小数的输入方法。先将小数乘以N倍变成整数,然后将该整数转换成小数,再用浮点除法指令除以N倍即为输入小数,如图1-41所示。
图1-41 小数输入程序例
3. 浮点数四则运算
浮点数的四则运算与定点数类似,有加、减、乘、除等,参与运算的数必须是小数表示。由于FX2N PLC中浮点数为32位运算,所以其指令运用时必须加D,如DEADD、DESUB、DEMUL、DED1V等。同样也有连续执行型和脉冲执行型的区分,应用时必须注意。
浮点数主要应用在模拟量中需要保留小数的四则运算中。
【例7】某物理量其输出Y与输入X之间的关系可用如下公式表示,试编制运算程序。
设X存(D2),输出Y存(D51,D50)。运算程序如图1-42所示。
图1-42 浮点数的四则运算程序
1.6.4 二-十进制浮点数转换
浮点数功能指令中有2条关于二进制浮点数和十进制浮点数转换指令,指令格式如图1-43所示。
图1-43 二-十进制浮点数转换
二进制→十进制转换指令DEBCD主要用于取出十进制数供给外部设备进行监控和显示用。而十进制→二进制转换指令则提供了另外一种小数的输入方法。程序如图1-44所示。同样是将小数3.14输入到(D11,D10)。
图1-44 小数的另一种输入程序
程序第四行是为了方便观察(D11,D10)中的确是3.14而设计的,应用中无须添加。