一、需求 在项目中遇到Smart S7-200PLC读取某厂家的涡街流量计的数据,通过ModbudsRTU协议得知,接收的流量计数据为: 32单精度浮点数SINGLE格式为IEEE754,折合4字节,排列顺序为3-4-1-2 因此PLC无法直接对数据字节的对调处理,求得流量计浮点数数据,而需要对接收的4字节数据进行解析处理,才能求得32位单精度浮点数。二、IEEE754浮点数的表示方法上述计算公式也可写为:,其中S为最高位第31位,E...
在使用
Modbus
RTU
协议时常常会遇到要传输32位浮点型
数据
的情况。本文讨论如何解决传输
浮点数
的问题。
点对点的
Modbus
协议时
RTU
通信的常用选择。协议本身控制
Modbus
网络上每个设备的交互,设备如何建立已知地址,每个设备如何识别其消息以及如何从
数据
中
提取基本信息。从本质上讲,该协议是整个
Modbus
网络的基础。
然而,这种便利并非没有一些复杂...
modbus
协议通信时
浮点数
如何发送和
接收
处理的解决办法
在本次做项目的时候,发现需要威纶通屏幕与stm32芯片采用
modbus
通信,很多时候需要处理float小数。最开始一直在纠结大小端的问题,坑了一天,理出了下面的解决办法。
注意:主机发送给从机的小数是以32位的形式发送的,所以会占用2个保持寄存器。并且本次项目的威纶通屏幕作为主机时,是以小端形式发送
数据
,与stm32f103芯片一致,此处大小端问题我不在详细说明(主要是自己太菜了,太懒了,画图来说明很耽误时间)
一、如何将保持寄存器
中
存放的
VB6自行编写的源代码,实现
Modbus
RTU
协议四个
字节
整形
转换
成
浮点数
据,也可以
浮点数
据
转换
为4
字节
整形,bas形式,用户可以直接在自己
程序
中
调用。
Public Function
MODBUS
LongtoFloat32(input1 As String) As Double ‘输入
格式
16进制:33 46 5E 3F字符串
格式
'如果是10进制数 可以调用 hex(dex1) & " " & hex(dex2) & " " & hex(dex3) & " " & hex(dex4)
Public Function
MODBUS
FloattoLong32(inputS As Single) As String '
IEEE
754
标准 浮点
格式
转换
我看网上介绍需要把整数部分和小数部分分开转成二进制,太复杂了,其实有非常简单的方法,看
程序
就知道了。相互学习。
这里S 代表符号位,1是负,0是正
E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。
M 24位的尾数保存在23位
中
,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效位数,提高了精度。
零是一个特定值,幂是0 尾数也是0。...
- 起始符号:由一个连续的3.5个字符时间长度的高电平信号组成,表示
数据帧
的开始。
- 地址:标识了
Modbus
网络
中
被访问的设备地址。
- 功能码:指示了
Modbus
命令的类型,例如读取
数据
或写入
数据
。
-
数据
:包含了
Modbus
命令需要传输的
数据
,包括读取或写入的寄存器地址、
数据
长度等。
- CRC校验:由两个
字节
组成,用于检验
数据
在传输过程
中
是否被损坏或篡改。
需要注意的是,
Modbus
RTU
协议的
数据帧
长度可以是不定长的,但是在同一个
Modbus
网络
中
,所有设备必须保持一致的
数据帧
长度。
static变量在处理stm32单片机程序报错“Error: L6200E: Symbol cntdata multiply defined (by timer.o and main.o”问题的应用
static变量在处理stm32单片机程序报错“Error: L6200E: Symbol cntdata multiply defined (by timer.o and main.o”问题的应用
溺水的小鱼: