PLC中的浮点数格式与转换
发布时间:2024-11-17
发布时间:2024-11-17
张正明 从事工业自动化系统的研发与工程服务
PLC系统中的浮点表达方式与转换
1.概述
在PLC系统中(不同PLC或产品之间通信)使用浮点数时,常遇到两种数据格式不兼容的情况,一是16位的半浮点与32位的全浮点之间不的兼容,二是32位全浮点在字节排列顺序上的不兼容。第二种情况较好处理,只要写程序重新排列字节顺序便可。第一种情况较复杂,牵涉到两种格式的转换,如果相关PLC编程软件没有提供实现数据结构转换的功能块,那么就只能由使用者自已编写。以下对这种情况进行说明。
2.32位浮点数说明
对于大小为32-bit的浮点数(32-bit为单精度,64-bit浮点数为双精度,80-bit为扩展精度浮点数),
1、其第31bit为符号位,为0则表示正数,反之为复数,其读数值用s表示;
2、第30~23bit为幂数,其读数值用e表示;
3、第22~0bit共23bit作为系数,视为二进制纯小数,假定该小数的十进制值为x;
则按照规定,该浮点数的值用十进制表示为:
=(-1)^s*(1+x)*2^(e-127)
对于49E48E68来说,
1、其第31bit为0,即s=0
2、第30~23bit依次为10010011,读成十进制就是147,即e=147。
3、第22~0bit依次为11001001000111001101000,也就是二进制的纯小数0.11001001000111001101000,其十进制形式为0.78559589385986328125,即x=0.78559589385986328125。
这样,该浮点数的十进制表示
=(-1)^s*(1+x)*2^(e-127)
=(-1)^0*(1+0.78559589385986328125)*2^(147-127)
=1872333
3.16位浮点数说明
1、15bit符号位
2、14bit--11bit指数位(e)
3、10bit--0bit尾数位
指数是一个整数,范围为0-----15(0000,1111)
尾数是一个二进制小数,范围=0.0-<1.0(0….0,1….1)
Man#10为MSB,值为2-1……
Man#0为LSB,值为2-11
当1<指数<14时,值=2^(e-7)×1.Man
张正明 从事工业自动化系统的研发与工程服务
当指数=0且尾数=0时,值=0
当指数=15且尾数=0时,值=“无穷”
当指数=15且尾数≠0时,值=“NaN”(不是一个数)
16位浮点表达式实例
101010110100000(55A0)=13.625
100000100000000=(4100)2.25
110100111010000=(69D0)78.5
011110010000000=(3C80)1.5625
4.转换实例
以西门子200系列PLC为列,该PLC只支持标准的32位浮点数,在与其它智能设备通信的过程中,智能设备可能会使用16位的半浮点数,用户可以通过自定义功能块(子程序)来实现16位浮点数向32位浮点数的转换。下面是标准的格式转换C代码,便于说明问题。
PLC中的转换程序参考了以下的C代码(有部分简化)。具体参见PLC代码说明。
/************************************************************************************Function:HalfToFloat;
*
*Description:;IEEE754半浮点数(hfloat)转为浮点数(float)
*
*Input:两字节半浮点数;
*
*Output:4字节浮点数;
*
*Return:float;
*
*Note:none;
************************************************************************************/floatHalfToFloat(unsignedinthfloat)
{
unsignedlongtdata;
floatret;
void*p;
//zero
if(hfloat==0)
{
return0;
}
if(hfloat==0x8000)
{
p=&ret;
*(unsignedchar*)p
=0x80;
张正明 从事工业自动化系统的研发与工程服务
*((unsignedchar*)p+1)=0x00;
*((unsignedchar*)p+2)=0x00;
*((unsignedchar*)p+3)=0x00;
returnret;
}
//infinity
if(hfloat==0x7c00)
{
p=&ret;
*(unsignedchar*)p=0x7f;
*((unsignedchar*)p+1)=0x80;
*((unsignedchar*)p+2)=0x00;
*((unsignedchar*)p+3)=0x00;
returnret;
}
if(hfloat==0xfc00)
{
p=&ret;
*(unsignedchar*)p=0xff;
*((unsignedchar*)p+1)=0x80;
*((unsignedchar*)p+2)=0x00;
*((unsignedchar*)p+3)=0x00;
returnret;
}
//normal
tdata=(((hfloat&0x8000)<<16)|(((hfloat&0x7c00)+0x1c000)<<13)|((hfloat&0x3ff)<<13));p=&ret;
*(unsignedchar*)p=tdata>>24;
*((unsignedchar*)p+1)=tdata>>16;
*((unsignedchar*)p+2)=tdata>>8;
*((unsignedchar*)p+3)=tdata;
returnret;
}
张正明 从事工业自动化系统的研发与工程服务
PLC程序图例
如需PLC程序,请联系作者。
上一篇:五年级下册数学教案(表格式)
下一篇:安徽省中小企业融资问题研究