PLC中的浮点数格式与转换

发布时间: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程序,请联系作者。

PLC中的浮点数格式与转换.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219