之前我曾写过一篇文章介绍西门子S7-200 SMART的模拟量指令库《S7-200 SMART怎样添加和使用模拟量指令库?》。今天这篇文章,结合我近期测试国产模拟量输出模块的实际经验,跟大家分享下该指令库使用过程中要注意的几个问题。本文主要包括如下几个主题:
西门子plc STEP7中 模拟量指令S_RTR和S_RTI的区别
怎样将实数转换为无符号整数?
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)中,要求将实际速度转换成相应的电流信号进行输出,可以使用下面的代码:
有些模拟量输出模块(比如我测试的这个国产模块),它的输出信号也是4~20mA,但是其对应的整数范围是0~65535。这种情况下,如果我们还是用这个公式,将"OSH"改成65535,就会出问题,如下图:
"S_RTI"指令中"OSH"和"OSL"都是"16位有符号整数",其取值范围为-32768~+32767。65535超出了其取值范围,因此会产生溢出错误,我们进入其内部代码可以看的更清楚,如下图所示:
这种情况下,我们应该使用"S_RTR"指令,它的量程范围均为实数,如下图所示:
不过"S_RTR"指令转换的输出值为实数,而我们需要写入的模拟量输出地址为无符号整数类型,比如QW130,怎么把实数转换成无符号整数呢?
2、怎样将实数转换为无符号整数
首先,我们可以使用Round指令将实数转换成近似的双整数。接下来就是问题的关键:怎样把双整数转换成无符号整数?
如果我们直接使用系统提供的指令"DI_I"会出现错误,因为这个双整数超出了有符号整数的范围。我找了半天,没有发现能直接进行转换的指令。于是自己写了一个函数(子程序)来实现这个功能。
打开STEP 7 Micro-WIN/SMART,在程序块中添加子程序,名称为Conv_DI2W,在其变量表中声明变量如下图所示:
在主程序中调用子程序Conv_DI2W,为其参数赋值即可,如下图所示:
好了,关于S7-200 SMART模拟量输出指令使用时注意问题就先介绍到这里。如果你想学习S7-200 SMART PLC ,可以看看这本书《西门子S7-200 SMART PLC应用技术》