固件#05--IEEE754浮点数转byte

本文介绍了IEEE754标准下,如何将单精度浮点数176.0625转换为字节表示。详细解析了二进制转换过程,包括指数偏移量和尾数的处理,最后展示了转换结果。

固件#05–IEEE754浮点数转byte

IEEE754规定:

  • 单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移量127;
  • 双精度浮点数字长64位,尾数长度52,指数长度11,指数偏移量1023;

约定小数点左边隐含有一位,通常这位数是1,所以上述单精度尾数长度实际为24(默认省略小数点左边的1则为23),双精度尾数长度实际为53(默认省略小数点左边的1则问53);

下面讲述使用IEEE754标准表示浮点数:

176.0625表示为单精度浮点数:

解:

1)先将176.0625转换为二进制数

小数点前:

176 / 2 = 88 余数为 0
88 / 2=44 余数为 0
44 / 2 =22 余数为 0
22 / 2= 11 余数为 0
11 / 2 =5 余数为 1
5 / 2=2 余数为 1
2/ 2 =1 余数为 0
1/ 2=0 余数为 1 商为0,结束。

小数点前整数转换为二进制:10110000

小数点后:小数部分乘以2,取整数部分,直至乘积小数部分为0

0.0625 * 2 = 0.125 整数为0
0.125 * 2 = 0.25 整数为0
0.25* 2 = 0.50 整数为0
0.5* 2 = 1.0 整数为1,小数部分为0,结束

小数点后的小数位转换为二进制:0001

### SLMP 协议结构概述 SLMP(Seamless Message Protocol)是三菱电机开发的一种专用于工业设备间通信的协议,广泛应用于 Q 系列 PLC、FX5U 以及机器人控制器如 RV-8CRL 中。该协议支持多种物理层接口,包括以太网和串口通信,并可通过 TCP/IP 或 UDP/IP 进行封装传输[^1]。 SLMP 协议的基本数据帧结构如下: | 字段名 | 长度(字节) | 描述 | |----------------|--------------|----------------------------------------------------------------------| | 子标题(Subheader) | 6 | 包含目标地址、源地址、网络层级信息等 | | 消息长度 | 2 | 表示整个消息体的长度(不包括子标题) | | 命令代码 | 2 | 表示操作类型,例如读取、写入或控制命令 | | 子命令 | 2 | 细分操作类型,例如读取多个寄存器或写入单个寄存器 | | 数据部分 | 可变 | 根据命令不同而变化,包含寄存器地址、数据值或其他参数 | --- ### SLMP 协议常用命令与功能码 在 RV-8CRL 控制器中,SLMP 协议支持多种命令,常见的包括: - **读取请求(Command Code: 0x0401)** 用于从控制器中读取指定地址范围的数据寄存器或位寄存器。 - **写入请求(Command Code: 0x1401)** 用于向控制器中的特定地址写入数据,适用于控制输出信号或设置参数。 - **批量读取(Command Code: 0x0403)** 支持一次读取多个不同地址的数据,提高通信效率。 - **远程控制指令(Command Code: 0x1A01)** 用于启动、停止或复位机器人程序,也可切换运行模式(如手动/自动)[^1]。 每条命令需配合相应的子命令使用,例如在读取多个寄存器时,子命令应为 `0x0000`;而在写入单个寄存器时,子命令则为 `0x0001`。 --- ### 通信流程与数据格式 通信流程通常包括以下几个步骤: 1. 客户端发送 SLMP 请求报文至控制器 IP 地址和端口(默认为 6000)。 2. 控制器解析请求并执行相应操作。 3. 控制器返回响应报文,包含执行结果或错误代码。 以下是一个使用 Python 实现 SLMP 协议连接 RV-8CRL 控制器并读取寄存器的示例: ```python import socket # 定义控制器 IP 和端口 ip = "192.168.0.1" port = 6000 # 构造 SLMP 读取请求(读取 D100 开始的两个寄存器) request = bytearray([ 0x50, 0x00, # 子标题:固定值 0xFF, 0x03, # 目标模块逻辑地址(PLC CPU) 0x00, 0x00, # 源模块逻辑地址(PC) 0x00, 0x10, # 消息长度(16 字节) 0x04, 0x01, # 命令代码:读取 0x00, 0x00, # 子命令:读取多个寄存器 0x01, 0x00, # 设备类型:D 寄存器 0x64, 0x00, # 起始地址:D100 0x02, 0x00 # 读取数量:2 个寄存器 ]) # 发送请求并接收响应 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((ip, port)) s.sendall(request) response = s.recv(1024) # 解析响应数据 data_length = int.from_bytes(response[6:8], byteorder='little') data_start = 10 data = response[data_start:data_start + data_length] print("接收到的数据:", data) ``` 此代码构造了一个 SLMP 读取请求,访问 D100 和 D101 寄存器,并通过 TCP 连接到控制器进行通信[^1]。 --- ### 特殊功能与控制指令 RV-8CRL 控制器还支持一些特殊功能指令,例如: - **机器人状态查询** 使用 SLMP 命令 `0x0401` 和子命令 `0x0000`,可读取机器人的当前状态(如运行、停止、报警等)。 - **程序启动与停止** 通过命令 `0x1A01` 和子命令 `0x0001` 启动程序,子命令 `0x0002` 停止程序。 - **坐标位置获取** 读取特定寄存器(如 `D100~D105`)可获取机器人 X/Y/Z/Rx/Ry/Rz 的当前位置坐标[^1]。 --- ### 注意事项与常见问题 - 在配置 SLMP 通信前,确保控制器已启用以太网通信功能,并正确设置 IP 地址和端口号。 - 数据寄存器的地址映射可能因固件版本不同而有所差异,建议参考《三菱 RV-8CRL 编程手册》确认具体地址分配。 - 若涉及浮点数或双字数据,需注意字节顺序(大端/小端)及 IEEE 754 格式解析。 - 多线程环境下应合理管理连接池和请求队列,避免通信冲突或超时。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值