今天这篇文章,我们要跟大家聊聊如何把现场的模拟量模块测量到的模拟值转换成实际需要的工程值。首先,搞清楚两个概念,什么是模拟值?什么是工程值?
所谓“模拟值”,是指模拟量信号经过模拟量输入(或输出)模块的模数转换(A/D转换)后,所得到的数值。模拟值以二进制补码的方式存放,其位数为16位(编号从0到15),属于有符号整数(有正负之分)。最高位(第15位)为符号位,正数的符号位为0,负数的符号位为1;
在前面的文章《模拟量信号能被CPU直接处理吗?》中,我们讲过模拟量模块的分辨率。比如:SM 1231 AI 4x13 bit,它表示该模块能把模拟量信号转换成一个“13bit”的二进制数值,其中包括“12bit”的分辨率和“1bit”的符号位。关于分辨率的问题,你如果不清楚,可以回看下原文。这里你有没有发现一个问题?既然模拟值总共有“16bit”,可是模块SM 1231 AI 4x13 bit模数转换后仅有“13bit”。那么这“13bit”的二进制数值,是怎样存放到“16bit”中的呢?是左对齐(低位补0)还是右对齐(高位补0)呢?
规定是这样的:经过A/D转换的模拟值,如果其位数(包括符号位)小于16位,则转换值被自动左移,让其最高位(符号位)处于模拟值的最高位(第15位)。数值左移后,其低位填“0”补位,这种处理方式称为“左对齐”。
比如模块SM 1231 AI 4x13 bit的转换值会被自动左移3位,其低位(第0~2位)会被补“0”,相当于原数值乘以8(2的3次方)。
“左对齐”能保证模拟量的量程与移位后的数值关系是固定的,便于后续转换处理。
由于“模拟值”属于16位有符号整数,其取值范围是:-32768~32767。其中,对于双极性量程(以正负10V为例)来说,-27648~27648属于正常范围(对应-10V~10V);32511为超出范围(11.759V);32767为上溢出值(11.851V);-32511为低于范围(-11.759V);-32768为下溢出值(-11.851V)。
对于单极性量程(以0~20mA为例),5530~27648为正常范围(对应4~20mA);小于5530为低范围(0~4mA);32511为超范围(23.52mA);32767为上溢出(23.70mA);
我们看到,每一个“模拟值”,都对应了一个现实中的物理量,这个物理量是可以在工程中通过仪器仪表检测到的(比如10V电压),我们把模拟值所对应的这个物理量,称为“工程值”。
模拟值与工程值之间有比例关系,比如:某压力传感器的量程范围为0~25bar,其输出信号为4~20mA。使用模拟量模块SM 1231 AI 4x13 bit,将0~20mA的电流信号转换成模拟值0~27648,请问当压力传感器输出压力为5bar时,模拟量模块测得的模拟值是多少?
解:假设模拟值为X,可通过下列公式计算:5/(X-5530)=25/(27648-5530),计算得X=9953.6(浮点数会被转换成无符号整数)。
当然,在Step7中,我们可以调用系统提供的函数SCALE_X完成转换,如下图:
把“SCALE_X”指令拖到程序中,添加相应的参数,如下图:
其中,“MIN”为工程值的最小值(比如:0 mbar),“MAX”为最大值(比如:25000mbar),“VALUE”为标准化后的浮点输入,其取值范围为0.0~1.0。“OUT”为工程值的输出;
为了得到标准化后的浮点输入值“VALUE”,我们还需要一个函数:NORM_X
在“NORM_X”中,输入模拟量模块测量到的模拟值,“MIN”为下限;“MAX”为上限;“VALUE”为外设地址;“OUT”值就是标准化后的浮点值。
好了,关于模拟量信号的转换就介绍到这里了,相关文章请参考:
扫描下面的二维码,关注“方正智芯”的原创文章,提供工业控制领域(PLC、单片机、通信)的技术和经验的分享,持续关注,持续进步。
发表评论