理论教育 算术运算指令,整数算术运算指令

算术运算指令,整数算术运算指令

时间:2023-06-27 理论教育 版权反馈
【摘要】:图4-74 算术运算程序示例图4-75 程序运行结果递增/递减运算指令递增/递减运算指令,在输入端上加1或减1,并将结果置入OUT。表4-31 递增字运算指令格式1)递增字节/递减字节运算。

算术运算指令,整数算术运算指令

1.整数算术运算指令

S7-200 SMART的整数算术运算分为加法运算、减法运算、乘法运算和除法运算,其中每种运算方式又有整数型和双精度整数型两种。

(1)加整数(ADD_I)

当允许输入端EN为高电平时,输入端IN1和IN2中的整数相加,结果送入OUT中。IN1和IN2中的数可以是常数。加整数的表达式是:IN1+IN2=OUT。加整数(ADD_I)指令和参数见表4-27。

表4-27 加整数(ADD_I)指令和参数

978-7-111-43442-9-Chapter04-101.jpg

【例4-33】梯形图和指令表如图4-70所示。MW0中的整数为11,MW2中的整数为21,则当I0.0闭合时,整数相加,结果MW4中的数是多少?

【解】当I0.0闭合时,激活加整数指令,IN1中的整数存储在MW0中,这个数为11,IN2中的整数存储在MW2中,这个数为21,整数相加的结果存储在OUT端的MW4中的数是32。由于没有超出计算范围,所以Q0.0输出为“1”。假设IN1中的整数为9999,IN2中的整数为30000,则超过整数相加的范围。由于超出计算范围,所以Q0.0输出为“0”。

关键点】整数相加未超出范围时,当I0.0闭合时,Q0.0输出为高电平,否则Q0.0输出为低电平。

978-7-111-43442-9-Chapter04-102.jpg

图4-70 加整数(ADD_I)指令应用举例

加双精度整数(ADD_DI)指令与加整数(ADD_I)类似,只不过其数据类型为双精度整数,在此不再赘述。

(2)减双精度整数(SUB_DI)

当允许输入端EN为高电平时,输入端IN1和IN2中的双精度整数相减,结果送入OUT中。IN1和IN2中的数可以是常数。减双精度整数的表达式是:IN1-IN2=OUT。

减双精度整数(SUB_DI)指令和参数见表4-28。

表4-28 减双精度整数(SUB_DI)指令和参数

978-7-111-43442-9-Chapter04-103.jpg

【例4-34】梯形图和指令表如图4-71所示,IN1中的双精度整数存储在MD0中,数值为22,IN2中的双精度整数存储在MD4中,数值为11,当I0.0闭合时,双精度整数相减的结果存储在OUT端的MD4中,其结果是多少?

【解】当I0.0闭合时,激活减双精度整数指令,IN1中的双精度整数存储在MD0中,假设这个数为22,IN2中的双精度整数存储在MD4中,假设这个数为11,双精度整数相减的结果存储在OUT端的MD4中的数是11。由于没有超出计算范围,所以Q0.0输出为“1”。

978-7-111-43442-9-Chapter04-104.jpg

图4-71 减双精度整数(SUB_DI)指令应用举例

减整数(SUB_I)指令与减双精度整数(SUB_DI)类似,只不过其数据类型为整数,在此不再赘述。

(3)乘整数(MUL_I)

当允许输入端EN为高电平时,输入端IN1和IN2中的整数相乘,结果送入OUT中。IN1和IN2中的数可以是常数。乘整数的表达式是:IN1×IN2=OUT。乘整数MUL_I)指令和参数见表4-29。

表4-29 乘整数(MUL_I)指令和参数

978-7-111-43442-9-Chapter04-105.jpg

【例4-35】梯形图和指令表如图4-72所示。IN1中的整数存储在MW0中,数值为11,IN2中的整数存储在MW2中,数值为11,当I0.0闭合时,整数相乘的结果存储在OUT端的MW4中,其结果是多少?

【解】当I0.0闭合时,激活乘整数指令,OUT=IN1×IN2,整数相乘的结果存储在OUT端的MW4中,结果是121。由于没有超出计算范围,所以Q0.0输出为“1”。

978-7-111-43442-9-Chapter04-106.jpg

图4-72 乘整数(MUL_I)指令应用举例

两个整数相乘得双精度整数的乘积指令(MUL),其两个乘数都是整数,乘积为双精度整数,注意MUL和MUL_I的区别。

双精度乘整数(MUL_DI)指令与乘整数(MUL_I)类似,只不过双精度乘整数数据类型为双精度整数,在此不再赘述。

(4)除双精度整数(DIV_DI)

当允许输入端EN为高电平时,输入端IN1中的除双精度整数以IN2中的双精度整数,结果为双精度整数,送入OUT中,不保留余数。IN1和IN2中的数可以是常数。除双精度整数(DIV_DI)指令和参数见表4-30。

表4-30 除双精度整数(DIV_DI)指令和参数

978-7-111-43442-9-Chapter04-107.jpg

【例4-36】梯形图和指令表如图4-73所示。IN1中的双精度整数存储在MD0中,数值为11,IN2中的双精度整数存储在MD4中,数值为2,当I0.0闭合时,双精度整数相除的结果存储在OUT端的MD8中,其结果是多少?

【解】当I0.0闭合时,激活除双精度整数指令,IN1中的双精度整数存储在MD0中,数值为11,IN2中的双精度整数存储在MD4中,数值为2,双精度整数相除的结果存储在OUT端的MD8中的数是5,不产生余数。由于没有超出计算范围,所以Q0.0输出为“1”。

978-7-111-43442-9-Chapter04-108.jpg

图4-73 除双精度整数(DIV_DI)指令应用举例

【关键点】除双精度整数法不产生余数。

整数除(DIV_I)指令与除双精度整数(DIV_DI)类似,只不过其数据类型为整数,在此不再赘述。整数相除得商和余数指令(DIV),其除数和被除数都是整数,输出OUT为双精度整数,其中高位是一个16位余数,其低位是一个16位商,注意DIV和DIV_I的区别。

【例4-37】算术运算程序示例如图4-74所示,其中开始时AC1中内容为4000,AC0中内容为6000,VD100中内容为200,VW200中内容为41,问执行运算后,AC0、VD100和VD202中的数值是多少?

【解】程序运行结果图如图4-75所示,累加器AC0和AC1中可以装入字节、字、双字和实数等数据类型的数据,可见其使用比较灵活。DIV指令的除数和被除数都是整数,而结果为双精度整数,对于本例被除数为4000,除数为41,双精度整数结果存储在VD202中,其中余数23存储在高位VW202中,商97存储在低位VW204中。

978-7-111-43442-9-Chapter04-109.jpg

图4-74 算术运算程序示例

978-7-111-43442-9-Chapter04-110.jpg

图4-75 程序运行结果

(5)递增/递减运算指令

递增/递减运算指令,在输入端(IN)上加1或减1,并将结果置入OUT。递增/递减指令的操作数类型为字节、字和双字。递增字的指令格式见表4-31。

表4-31 递增字运算指令格式

978-7-111-43442-9-Chapter04-111.jpg

1)递增字节/递减字节运算(INC_B/DEC_B)。使能端输入有效时,将一个字节的无符号数IN增1/减1,并将结果送至OUT指定的存储器单元输出。

2)双递增字/双字递减运算(INC_DW/DEC_DW)。使能端输入有效时,将双字长的符号数IN增1/减1,并将结果送至OUT指定的存储器单元输出。

【例4-38】递增/递减运算程序如图4-76所示。初始时AC0中的内容为125 VD100中的内容为128000,试分析运算结果。

978-7-111-43442-9-Chapter04-112.jpg

图4-76 程序和运行结果

【例4-39】有一个电炉,加热功率有1000W、2000W和3000W三个档次,电炉有1000W和2000W两种电加热丝。要求用一个按钮选择三个加热档,当按一次按钮时,1000W电阻丝加热,即第一档;当按两次按钮时,2000W电阻丝加热,即第二档;当按三次按钮时,1000W和2000W电阻丝同时加热,即第三档;当按四次按钮时停止加热,请编写程序。

【解】梯形图如图4-77所示。

978-7-111-43442-9-Chapter04-113.jpg

图4-77 梯形图

2.浮点数运算函数指令

浮点数函数有浮点算术运算函数、三角函数函数、对数函数、幂运函数和PID等。浮点算术函数又分为加法运算、减法运算、乘法运算和除法运算函数。浮点数运算函数见表4-32。

加实数(ADD_R)。当允许输入端EN为高电平时,输入端IN1和IN2中的实数相加,结果送入OUT中。IN1和IN2中的数可以是常数。加实数的表达式是:IN1+IN2=OUT。加实数(ADD_R)指令和参数见表4-33。

表4-32 浮点数运算函数

978-7-111-43442-9-Chapter04-114.jpg

表4-33 加实数(ADD_R)指令和参数

978-7-111-43442-9-Chapter04-115.jpg

用一个例子来说明加实数(ADD_R)指令,梯形图和指令表如图4-78所示。当I0.0闭合时,激活加实数指令,IN1中的实数存储在MD0中,假设这个数为10.1,IN2中的实数存储在MD4中,假设这个数为21.1,实数相加的结果存储在OUT端的MD8中的数是31.2。

978-7-111-43442-9-Chapter04-116.jpg

图4-78 加实数(ADD_R)指令应用举例

减实数(SUB_R)、乘实数(MUL_R)和除实数(DIV_R)指令的使用方法与前面的指令用法类似,在此不再赘述。

MUL_DI/DIV_DI和MUL_R/DIV_R的输入都是32位,输出的结果也是32位,但前者的输入和输出是双精度整数,属于双精度整数运算,而后者输入和输出的是实数,属于浮点运算,简单地说,后者的输入和输入数据中有小数点,而前者没有,后者的运算速度要慢得多。

值得注意的是,乘/除运算对特殊标志位SM1.0(零标志位)、SM1.1(溢出标志位)、SM1.2(负数标志位)、SM1.3(被0除标志位)会产生影响。若SM1.1在乘法运算中被置1,表明结果溢出,则其他标志位状态均置0,无输出。若SM1.3在除法运算中被置1,说明除数为0,则其他标志位状态保持不变,原操作数也不变。

【关键点】浮点数的算术指令的输入端可以是常数,必须是带有小数点的常数,如5.0,不能为5,否则会出错。

3.转换指令

转换指令是将一种数据格式转换成另外一种格式进行存储。例如,要让一个整型数据和双整型数据进行算术运算,一般要将整型数据转换成双整型数据。STEP7-Micro/Win的转换指令见表4-34。

表4-34 转换指令

978-7-111-43442-9-Chapter04-117.jpg

1)整数转换成双精度整数(ITD)

整数转换成双精度整数指令是将IN端指定的内容以整数的格式读入,然后将其转换为双精度整数码格式输出到OUT端。整数转换成BCD指令和参数见表4-35。

表4-35 整数转换成双精度整数指令和参数

978-7-111-43442-9-Chapter04-118.jpg

【例4-40】梯形图和指令表如图4-79所示。IN中的整数存储在MW0中(用十六进制表示为16#0016),当I0.0闭合时,转换完成后OUT端的MD2中的双精度整数是多少?(www.daowen.com)

【解】当I0.0闭合时,激活整数转换成双精度整数指令,IN中的整数存储在MW0中(用十六进制表示为16#0016),转换完成后OUT端的MD2中的双精度整数是16#00000016。但要注意,MW2=16#0000,而MW4=16#0016。

978-7-111-43442-9-Chapter04-119.jpg

图4-79 整数转换成双精度整数指令应用举例

(2)双精度整数转换成实数(DTR)

双精度整数转换成实数指令是将IN端指定的内容以双精度整数的格式读入,然后将其转换为实数码格式输出到OUT端。实数格式在后续算术计算中是很常用的,如3.14就是实数形式。双精度整数转换成实数指令和参数见表4-36。

表4-36 双精度整数转换成实数指令和参数

978-7-111-43442-9-Chapter04-120.jpg

【例4-41】梯形图和指令表如图4-80所示。IN中的双精度整数存储在MD0中,用十进制表示为16),转换完成后OUT端的MD4中的实数是多少?

【解】当I0.0闭合时,激活双精度整数转换成实数指令,IN中的双精度整数存储在MD0中(用十进制表示为16),转换完成后OUT端的MD4中的实数是16.0。一个实数要用4个字节存储。

978-7-111-43442-9-Chapter04-121.jpg

图4-80 双精度整数转换成实数指令应用举例

【关键点】应用I_DI转换指令后,数值的大小并未改变,但转换是必需的,因为只有相同的数据类型,才可以进行数学运算,例如要将一个整数和双精度整数相加,则比较保险的做法是先将整数转化成双精度整数,再做双精度加整数法。

DI_I是双精度整数转换成整数的指令,并将结果存入OUT指定的变量中。若双精度整数太大,则会溢出。

DI_R是双精度整数转换成实数的指令,并将结果存入OUT指定的变量中。

(3)BCD码转换为整数(BCD_I)

BCD_I指令是将二进制编码的十进制WORD数据类型值从“IN”地址输入,转换为整数WORD数据类型值,并将结果载入分配给“OUT”的地址处。IN的有效范围为0~9999的BCD码。BCD码转换为整数指令和参数见表4-37。

表4-37 BCD码转换为整数指令和参数

978-7-111-43442-9-Chapter04-122.jpg

(4)取整指令(ROUND)

ROUND指令是将实数进行四舍五入取整后转换成双精度整数的格式。实数四舍五入为双精度整数指令和参数见表4-38。

表4-38 实数四舍五入为双精度整数指令和参数

978-7-111-43442-9-Chapter04-123.jpg

【例4-42】梯形图和指令表如图4-81所示。IN中的实数存储在MD0中,假设这个实数为3.14,进行四舍五入运算后OUT端的MD4中的双精度整数是多少?假设这个实数为3.88,进行四舍五入运算后OUT端的MD4中的双精度整数是多少?

【解】当I0.0闭合时,激活实数四舍五入指令,IN中的实数存储在MD0中,假设这个实数为3.14,进行四舍五入运算后OUT端的MD4中的双精度整数是3,假设这个实数为3.88,进行四舍五入运算后OUT端的MD4中的双精度整数是4。

978-7-111-43442-9-Chapter04-124.jpg

图4-81 取整指令应用举例

【关键点】ROUND是取整(四舍五入)指令,而TRUNC是截取指令,将输入的32位实数转换成整数,只有整数部分保留,舍去小数部分,结果为双精度整数,并将结果存入OUT指定的变量中。例如输入是32.2,执行ROUND或者TRUNC指令,结果转换成32。而输入是32.5,执行TRUNC指令,结果转换成32;执行ROUND指令,结果转换成33。请注意区分。

【例4-43】将英寸转换成厘米,已知单位为英寸的长度保存在VW0中,数据类型为整数,英寸和厘米的转换单位为2.54,保存在VD12中,数据类型为实数,要将最终单位厘米的结果保存在VD20中,且结果为整数。编写程序实现这一功能。

【解】要将单位为英寸的长度转化成单位为厘米的长度,必须要用到实数乘法,因此乘数必须为实数,而已知的英寸长度是整数,所以先要将整数转换成双精度整数,再将双精度整数转换成实数,最后将乘积取整就得到结果。梯形图和指令表如图4-82所示。

978-7-111-43442-9-Chapter04-125.jpg

图4-82 梯形图和指令表

4.数学功能指令

数学功能指令包含正弦(SIN)、余弦(COS)、正切(TAN)、自然对数(LN)、自然指数(EXP)和平方根(SQRT)等。这些指令的使用比较简单,仅以正弦(SIN)和自然对数(LN)为例说明数学功能指令的使用,见表4-39。

表4-39 求正弦值(SIN)指令和参数

978-7-111-43442-9-Chapter04-126.jpg

用一个例子来说明求正弦值(SIN)指令,梯形图和指令表如图4-83所示。当I0.0闭合时,激活求正弦值指令,IN中的实数存储在VD0中,假设这个数为0.5,实数求正弦的结果存储在OUT端的VD8中的数是0.479。

978-7-111-43442-9-Chapter04-127.jpg

图4-83 正弦运算指令应用举例

【关键点】三角函数的输入值是弧度,而不是角度。

求余弦(COS)和求正切(TAN)的使用方法与前面的指令用法类似,在此不再赘述。

5.编码和解码指令

编码指令(ENCO)将输入字IN的最低有效位的位号写入输出字节OUT的最低有效“半字节”(4位)中。解码指令(DECO)根据输入字的输出字IN的低4位所表示的位号,置输出字OUT的相应位为1。也有人称解码指令为译码指令。编码和解码的格式见表4-40。

表4-40 编码和解码指令格式

978-7-111-43442-9-Chapter04-128.jpg

用一个例子说明以上指令的应用,如图4-84所示是编码和解码指令程序示例。

978-7-111-43442-9-Chapter04-129.jpg

图4-84 编码和解码指令程序示例

a)程序 b)运行结果

6.时钟指令

(1)读取实时时钟指令

读取实时时钟指令(TODR)从硬件时钟中读当前时间和日期,并把它装载到一个8字节,起始地址为T的时间缓冲区中。设置实时时钟指令(TODW)将当前时间和日期写入硬件时钟,当前时钟存储在以地址T开始的8字节时间缓冲区中。必须按照BCD码的格式编码所有的日期和时间值(例如:用16#97表示1997年)。梯形图如图4-85所示。如果PLC系统的时间是2009年4月8日8时6分5秒,星期六,则运行的结果如图4-86所示。年份存入VB0存储单元,月份存入VB1单元,日存入VB2单元,小时存入VB3单元,分钟存入VB4单元,秒钟存入VB5单元,VB6单元为0,星期存入VB7单元,可见共占用8个存储单元。读实时钟(TODR)指令和参数见表4-41。

表4-41 读实时钟(TODR)指令和参数

978-7-111-43442-9-Chapter04-130.jpg

978-7-111-43442-9-Chapter04-131.jpg

图4-85 读取实时时钟指令应用举例

978-7-111-43442-9-Chapter04-132.jpg

图4-86 读取实时时钟指令的结果(BCD码)

【关键点】读实时钟(TODR)指令读取出来的日期是用BCD码表示的,这点要特别注意。

(2)设置实时时钟指令

设置实时时钟(TODW)指令将当前时间和日期写入用T指定的在8个字节的时间缓冲区开始的硬件时钟。设置实时时钟的参数见表4-42。

表4-42 设置实时钟(TODW)指令和参数

978-7-111-43442-9-Chapter04-133.jpg

用一个例子说明设置实时时钟指令,假设要把2012年9月18日8时6分28秒设置成PLC的当前时间,先要做这样的设置:VB0=16#12,VB1=16#09,VB2=16#18,VB3=16#18,VB4=16#08,VB5=16#06,VB6=16#00,VB7=16#28,然后运行如图4-87所示的程序。

978-7-111-43442-9-Chapter04-134.jpg

图4-87 设置实时时钟指令实例

还有一个简单的方法设置时钟,不需要编写程序。只要进行简单设置即可,设置方法如下:

单击菜单栏中的“PLC”→“设置时钟”,如图4-88所示,弹出“时钟操作”界面,如图4-89所示,单击“读取PC”按钮,读取计算机的当前时间。

978-7-111-43442-9-Chapter04-135.jpg

图4-88 打开“时钟操作”界面

如图4-90所示,单击“设置”按钮可以将当前计算机的时间设置到PLC中,当然读者也可以设置其他时间。

978-7-111-43442-9-Chapter04-136.jpg

图4-89 时钟操作界面

978-7-111-43442-9-Chapter04-137.jpg

图4-90 设置实时时钟

【例4-44】记录一台设备损坏时的时间,请用PLC实现此功能

【解】梯形图如图4-91所示。

978-7-111-43442-9-Chapter04-138.jpg

图4-91 梯形图

a)主程序 b)中断程序

【例4-45】某实验室的一个房间,要求每天16:30~18:00开启一个加热器,请用PLC实现此功能。

【解】先用PLC读取实时时间,因为读取的时间是BCD码格式,所以之后要将BCD码转化成整数,如果实时时间在16:30~18:00,那么则开启加热器,梯形图如图4-92所示。

978-7-111-43442-9-Chapter04-139.jpg

图4-92 梯形图

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

我要反馈