求助:如何将8个字节的数据转换成real类型的数据 点击:2889 | 回复:5



昆仑摩勒

    
  • 精华:1帖
  • 求助:1帖
  • 帖子:32帖 | 446回
  • 年度积分:0
  • 历史总积分:1058
  • 注册:2004年11月22日
发表于:2010-07-16 18:17:19
楼主
我通过CP341将一个仪表的数据采集到PLC了,是Double类型的数据,8个字节。但是好像西门子只支持4个字节的浮点数。
我现在想采集到组态软件上显示。不知该如何转换。希望高手指教。
下面是算法,我想用stl来写,可是现场时间紧急。我对Stl不熟。
8个字节计数器1的算法:(浮点数转十进制数)
例如:40/B0/0B/02/33/8B/26/96 ,如果要转换成十进制数,可按下列算法:(注:此处c(X)代表40H,此处c(X+1)代表B0H,依次类推)
符号位: si = ((c(X) And 128) / 128)
阶 码: ex= (c(X + 1) And &HF0) / 2 ^ 4 + (c(X) And &HF) * 2 ^ 4 + (c(X) And &H70) * 2 ^ 4 - 1023
尾 数: ma = (c(X + 1) And &HF) / 2 ^ 4 + c(X + 2) / 2 ^ 12 + c(X + 3) / 2 ^ 20 + c(X + 4) / 2 ^ 28 + c(X + 5) / 2 ^ 36 + c(X + 6) / 2 ^ 44 + c(X+7) / 2 ^ 52 + 1
所以所需求的量 vo = (-1) ^ si * 2 ^ (ex-127) * ma = 4107.36
则浮点数40/B0/0B/02/33/8B/26/96 代表的值为4107.36。



槑孖罘槑

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2010-07-17 09:23:32
1楼
我没注意,难道西门子真的没有双精度浮点,不可能没有吧,这可是国际标准的格式

槑孖罘槑

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2010-07-17 09:34:26
2楼

双精度浮点数能精确表示1.79769313486231570E+308 到 -4.94065645841246544E-324 范围的负数和从 4.94065645841246544E-324 到 1.79769313486231570E+308 范围的正数。
单精度浮点数能够精确表示从 -3.4028235E+38 到 -1.401298E-45 的负数和从 1.401298E-45 到 3.4028235E+38 的正数。
使用双精度浮点数,需要占用大量内存,大大减慢程序的运行。对于PLC而言不怎么实用,所以S7只支持单精度德32位浮点数。
----------------

这是搜来的,的确没有双精度的,没必要这么多精度,工控一般0.1%就算精度很高的了。

槑孖罘槑

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2010-07-17 09:37:01
3楼

双精度转换成单精度很简单,查一下它的格式,扔掉不重要四个字节就可以了,但要重新拼拆,

不要把关键位扔掉。

槑孖罘槑

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2010-07-17 09:44:07
4楼
双精度格式
IEEE双精度浮点格式共64位,占2个连续32位字,包含三个构成字段:52位的小数f,11位的偏置指数e,1位的符号位s。将这2个连续的32位字整体作为一个64位的字,进行重新编号。其中0:51位包含52位的小数f;52:62位包含11位的偏置指数e;而最高位,第63位包含符号位s。如图2所示。
f[31:0]存放小数f的低32位,其中第0位存放整个小数f的最低有效位LSB,第31位存放小数f的低32位的最高有效位MSB。
在另外的32位的字里,第0 到19位,即f[51:32],存放小数f的最高的20位,其中第0位存放这20位最高有效数中的最低有效位LSB,第19位存放整个小数f的最高有效位MSB。第20到30位,即e[52:62],存放11位的偏置指数e,其中第20位存放偏置指数的最低有效位LSB,第30位存放最高有效位MSB。最高位,第31位存放符号位s。

昆仑摩勒

  • 精华:1帖
  • 求助:1帖
  • 帖子:32帖 | 446回
  • 年度积分:0
  • 历史总积分:1058
  • 注册:2004年11月22日
发表于:2010-07-18 20:43:49
5楼
谢谢各位!我已经把程序写出来了,扔掉了4个不太重要的字节。因为不需要这么高的精度!

热门招聘
相关主题

官方公众号

智造工程师