当前位置: 首页 > news >正文

python将二进制转换为32位浮点数float/两个16位整数(高位字/低位字)Uint16转换为32位浮点数float

背景:工业数采,采集Siemens西门子S7-1200数据,其中一个32位浮点数无法直接读取,分为了两个16位字去读

DB27.DBD116--->DB27.DBW116 DBD27.DBW118

目标:通过python边缘计算,将两个字Uint16合为32位浮点数float

Los geht's!

目录

了解S7-1200寻址

了解S7-1200浮点数使用标准

编写python算法


了解S7-1200寻址

从以下回答可以总结:

字节,字和双字的起始地址,最高有效字节和最低有效字节,例题求解-SIMATIC S7-200-找答案-西门子中国 (siemens.com.cn)

WORD类型的结构问题-SIMATIC S7-300(F)/S7-400(F/H/FH)-找答案-西门子中国 (siemens.com.cn)

需要读取的DBD116分成了DBW116和DBW118,DBW118存储低字节,DBW116存储高字节

读取的数据如下:

DBW116 = 17981(十进制)= 01000110 00111101(二进制)

DBW118 = 52892(十进制)= 11001110 10011100(二进制)

十进制转二进制/二进制转十进制

十进制与二进制在线转换工具,在线计算,在线计算器,计算器在线计算 (osgeo.cn)

需要合并为DBD116 =12147.6523 (十进制,浮点数)

=01000110 00111101 11001110 10011100(二进制)

十进制/十六进制转浮点数

浮点数-Float-Double转二进制 - ToolTT在线工具箱

了解S7-1200浮点数使用标准

使用IEEE 754标准

参考:

SIMATIC S7-1500 自动化系统, ET 200MP 自动化系统 (siemens.com)https://cache.industry.siemens.com/dl/files/384/86140384/att_1093122/v1/s71500_et200mp_manual_collection_zh-CH.pdf

 分为三部分:

S-符号位  E-阶数 M-尾数

公式为:(-1)^{S}*2^{E-127}*1.M

这里的M不能简单理解为十进制,而是二进制

以我上面提到的需要化为浮点数的二进制为例

0100 01100011 11011100 11101001 1100
DBW116DBW118
SEM

S = 0 正数                                                       (-1)的0次方 = 1

E = 10001100 = 140 阶数                               3的(140-127=13)次方

M = 01111011100111010011100 = 4050588   1.M=1.01111011100111010011100

         = 1*2^{0}+0*2^{-1}+1*2^{-2}+1*2^{-3}+1*2^{-4}+1*2^{-5}+0*2^{-6}+1*2^{-7}+1*2^{-8}+1*2^{-9}+0*2^{-10}+0*2^{-11}+1*2^{-12}+1*2^{-13}+1*2^{-14}+0*2^{-15}+1*2^{-16}+0*2^{-17}+0*2^{-18}+1*2^{-19}+1*2^{-20}+1*2^{-21}+0*2^{-22}+0*2^{-23}

         =1.4828677177429199

import math

a = 0.0

a = 1+pow(2,-2)+pow(2,-3)+pow(2,-4)+pow(2,-5)+pow(2,-7)+pow(2,-8)+pow(2,-9)+pow(2,-12)+pow(2,-13)+pow(2,-14)+pow(2,-16)+pow(2,-19)+pow(2,-20)+pow(2,-21)

print(a)

三者相乘 = 12147.65234375

import math

a = 0.0

a = (1+pow(2,-2)+pow(2,-3)+pow(2,-4)+pow(2,-5)+pow(2,-7)+pow(2,-8)+pow(2,-9)+pow(2,-12)+pow(2,-13)+pow(2,-14)+pow(2,-16)+pow(2,-19)+pow(2,-20)+pow(2,-21))*(2**13)*((-1)**(0))

print(a)

参考计算方法,这个写的很好,很详细,看上面不理解可以看这个:

用二进制如何表示浮点型数值_思维态度行动的博客-CSDN博客_二进制转浮点数

编写python算法

首先明确中间变量的类型

注意num的变量类型一定为无符号32位Int,被坑了一把,若仅在电脑VS运行则无需在意

先在电脑上面用VS调试

VS添加python可以参考:

VS Code配置Python环境 - 暄踽 - 博客园VSCode配置Python环境,步骤详细,适合新手小白。https://www.cnblogs.com/kint216/p/16004937.html使用Jupyter Notebooks

import math

#调试时,Low和High作为模拟数采输入值
#Low为DBW118 High为DBW116
#若作为正式的边缘计算算法,Low和High为数采得到的数据,应删掉下面两行

Low = 52892
High = 17981

num = 0
MM = 0.0
MM1 = 0.0
count = 1

S = int(High >> 15)  #获取符号位

E = int((High >> 7) & 255) #获取阶数

M = int(Low |((High & 127) << 16) ) #获取尾数取高位低七位和低位

num = (M<<9) & 0xffffffff #将尾数的有效位都移到最左边,num为无符号32位整型!!

while num>0:
    if (num & 0x80000000) == 0x80000000:  #获取尾数M的最高位(最左边)
        MM1 = float(0.5**count)           #count为1时,2的(-1)次幂 = (0.5)的1次幂
    else:
        MM1 = 0.0
    MM = MM+ MM1                          #循环累加结果
    count = count + 1                     #幂数加一
    num = (num & 0x7FFFFFFF) << 1         #迭代,将尾数M的次高位(左边第二位)变为最高位,便于下次运算
    if count > 23 :                       #尾数M的位数为23,当大于23即24时,退出循环
        break

Result = pow(-1,S)*pow(2,E-127)*(1.0 + MM) #得到最后的结果

print(Result)  #调试时才需要添加这一句,显示结果

 得到结果,是正确的

相关文章:

  • puzzle(102.1)不规则数独、变种数独
  • [模电课程设计]基于TCP7107的数字式温度计设计
  • 无聊话语罢了
  • 前缀树的设计与实现
  • 互联网中常见的随机数+分布式中常见的防止重复处理的方式
  • docker-compose
  • css实现input搜索框展开动画
  • 8.城市交通
  • 软件流程和管理(六):Project Scheduling
  • 2022-09-01 mysql/stonedb-多线程并行遍历元组遇到的问题分析
  • MATLAB | 面积图、饼状图、水平柱状图的斜线填充(阴影填充)
  • IDEA开发环境初始化配置
  • 企业单位公众号如何上传附件(如Word,Excel,PPT等)
  • Java中二维数组练习题
  • 一步到位,在Ubuntu中开启MySQL Windows Navicat能远程访问
  • JavaScript设计模式系列一:工厂模式
  • Java多态
  • js中forEach回调同异步问题
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • SpringBoot几种定时任务的实现方式
  • 机器学习 vs. 深度学习
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 如何选择开源的机器学习框架?
  • 设计模式走一遍---观察者模式
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 无服务器化是企业 IT 架构的未来吗?
  • 物联网链路协议
  • 学习HTTP相关知识笔记
  • 学习笔记TF060:图像语音结合,看图说话
  •  一套莫尔斯电报听写、翻译系统
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #define、const、typedef的差别
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)Nginx简介和安装教程
  • (a /b)*c的值
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (顺序)容器的好伴侣 --- 容器适配器
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)c++ std::pair 与 std::make
  • (转)负载均衡,回话保持,cookie
  • ***监测系统的构建(chkrootkit )
  • .chm格式文件如何阅读
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net操作Excel出错解决
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @javax.ws.rs Webservice注解
  • @RequestBody与@ModelAttribute
  • @拔赤:Web前端开发十日谈