北岛夜话
原创工业智能控制领域(PLC、单片机/嵌入式、机器人、通信、机器视觉)的技术及经验分享。
文章432 浏览3800072

正确使用S7-200 SMART模拟量输出指令库

之前我曾写过一篇文章介绍西门子S7-200 SMART的模拟量指令库《S7-200 SMART怎样添加和使用模拟量指令库?》。今天这篇文章,结合我近期测试国产模拟量输出模块的实际经验,跟大家分享下该指令库使用过程中要注意的几个问题。本文主要包括如下几个主题:

  1. 模拟量指令S_RTR和S_RTI的区别

  2. 怎样将实数转换为无符号整数?

cover.png

1、模拟量指令S_RTR和S_RTI的区别

指令S_RTR和S_RTI通常都是用来处理模拟量输出。名称中的"S"是"Scale"的缩写,表示"量程";"R"是"Real"的缩写,表示"实数";"T"是"To"的缩写,表示转换;"I"是"Integer"的缩写,表示"整数"。因此,从名称可以看出,S_RTR指令是把实数转换成实数,S_RTI指令是把实数转换成整数,通常情况下我使用的是S_RTI指令。

比如西门子 ET200 SP的模拟量输出模块AQ 2xI ST,它能输出4~20mA的电压信号,其对应的输出整数的范围为0~27648。对于这样的模块信号转换,我们只需要输入工程值和转换值即可。举个例子,某工程值速度信号的范围为0.0~100.0 cm/min,其实际速度存放在VD100(actualSpeed)中,要求将实际速度转换成相应的电流信号进行输出,可以使用下面的代码:

模拟量举例.PNG

有些模拟量输出模块(比如我测试的这个国产模块),它的输出信号也是4~20mA,但是其对应的整数范围是0~65535。这种情况下,如果我们还是用这个公式,将"OSH"改成65535,就会出问题,如下图:

模拟量举例2.png

"S_RTI"指令中"OSH"和"OSL"都是"16位有符号整数",其取值范围为-32768~+32767。65535超出了其取值范围,因此会产生溢出错误,我们进入其内部代码可以看的更清楚,如下图所示:

整数溢出.png

这种情况下,我们应该使用"S_RTR"指令,它的量程范围均为实数,如下图所示:

模拟量举例3.PNG

不过"S_RTR"指令转换的输出值为实数,而我们需要写入的模拟量输出地址为无符号整数类型,比如QW130,怎么把实数转换成无符号整数呢?

2、怎样将实数转换为无符号整数

首先,我们可以使用Round指令将实数转换成近似的双整数。接下来就是问题的关键:怎样把双整数转换成无符号整数?

如果我们直接使用系统提供的指令"DI_I"会出现错误,因为这个双整数超出了有符号整数的范围。我找了半天,没有发现能直接进行转换的指令。于是自己写了一个函数(子程序)来实现这个功能。

打开STEP 7 Micro-WIN/SMART,在程序块中添加子程序,名称为Conv_DI2W,在其变量表中声明变量如下图所示:

Conv_DI2W_变量声明.png

在代码区编写代码如下:

Conv_DI2W_代码.PNG

在主程序中调用子程序Conv_DI2W,为其参数赋值即可,如下图所示:

模拟量输出控制.PNG

好了,关于S7-200 SMART模拟量输出指令使用时注意问题就先介绍到这里。如果你想学习S7-200 SMART  PLC ,可以看看我的书《西门子S7-200 SMART PLC应用技术》:


取消

感谢您的支持,欢迎常来看看!

扫码支持
一点动力,多少随意

打开支付宝扫一扫,即可进行扫码打赏哦

发表评论

牛年到,祝福到!

祝愿大家在新的一年里,身体健康,工作顺利,财运滚滚,牛年大吉!

×