ModBus从站与ABB的FreeLance系统RTOM模块通讯方案
传统的modbus从站当传递数据的使用可以使用float类型的定义,但是在FreeLance的RTOM模块并不遵循常用的数据表达方式。该模拟量也占用两个模拟量的地址。
一个用来表示尾数、一个用来表示指数。这样它的表示范围与传统的数据表达方式所能表示的模拟量的精度以及范围都有比较大的区别。
该通讯模式下,数据的传输的范围如下:
+0.0001 to +3.2767 E38
-0.0001 to -3.2768 E38
该通讯模式下,指数的范围最小为0.所以能表示的最小的数据为0.0001,任意消失于该数据的正数都认为为0.这中表示方式在实际的工程应用中基本能满足需求。
在从站上的输入以及输出数据需要进行转换蔡可以。
基本的转换思路如下
从模拟数据转换成为尾数和指数的表示方式,需要做如下的转换。
WORD nTemp=0;
float fValue1=fabs(fValue);
if(fValue1>=1)
{
nEXP=(WORD)log10(fValue1);
fValue1=fValue1/powf(10,nEXP-3);
//if(fValue1>=0xF000)//XXXX
if(fValue1>=0x8000)//XXXX
{
fValue1=fValue1/10;
nEXP++;
}
nMNT=(WORD)(float)(fValue1+0.5);
if(fValue<0) nMNT=XXXX-nMNT;
}else
{
if(fValue>0)
{
nMNT=(WORD)((fValue*10000));
}else
{
nMNT=(WORD)((fValue*10000));
}
nEXP=0;
}
从指数和尾数转化为浮点数按照如下的计算方式
fv=(float)powf(10,nEXP-3);
float fValue;
if(temp>=0xXXXX)//负数
{
fValue=(float)((XXXXX-temp)*fv);
fValue=fValue*(-1);
}else
{
fValue=(float)(temp*fv);
}
return fValue;