Modbus-RTU协议 基础版
Modbus-RTU 协议是一种主从请求应答通讯协议,广泛应用于工业自动化系统中。协议帧包括了功能码、数据域、和 CRC 校验,以确保通信的可靠性。
1. Frame 结构
一个完整的 Modbus 帧包括以下几个部分:
| Header/Device ID | Function Code | Data | CRC16 |
|---|---|---|---|
| 1 Byte | 1 Byte | N Bytes | 2 Bytes |
- Header/Device ID: 设备标识符,用于区分不同的设备。
- Function Code: 功能码,指示请求的操作类型。
- Data: 数据域,包含具体操作的数据。
- CRC16: CRC 校验,用于校验数据的完整性。
2. 功能码
功能码用于指示主设备希望从设备执行的操作类型:
| 功能码 | 描述 |
|---|---|
| 03H | 读保持寄存器 |
| 06H | 写单个保持寄存器 |
| 10H | 写多个保持寄存器 |
| 04H | 读输入寄存器 |
3. 寄存器
寄存器是设备内存中的一块,用于存储数据。以下是不同类型寄存器的详细描述:
| 地址 | 类型 | 描述 | 长度 | 属性 |
|---|---|---|---|---|
| 1000 | 保持寄存器 | 485 ID | 2 bytes | W/R |
| 1001 | 保持寄存器 | 波特率 | 2 bytes | W/R |
| 1002 | 保持寄存器 | 力量 | 2 bytes | W/R |
| 1009 | 保持寄存器 | 存储数据/重启 | 2 bytes | W |
| 1010 | 保持寄存器 | 位置设置值 | 12 bytes (6 uint16) | W/R |
| 1016 | 保持寄存器 | 速度设置值 | 12 bytes (6 uint16) | W/R |
| 1022 | 保持寄存器 | LED设置 | 2 bytes | W/R |
| 1023 | 保持寄存器 | 电流设置值 | 12 bytes (6 uint16) | W/R |
| 1030 | 保持寄存器 | Turbo模式 | 2 bytes | W/R |
| 1031 | 保持寄存器 | Turbo模式时间参数 | 4 bytes | R |
| 1033 | 保持寄存器 | 位置自动校准 | 2 bytes | W/R |
| 1034 | 保持寄存器 | 位置校准 | 2 bytes | W |
| 1098 | 保持寄存器 | 动作序列ACTION_CMD_ID | 2 bytes (1 uint16) | W |
| 1099 | 保持寄存器 | 动作步骤数量ACTION_STEP_NUMBER | 2 bytes (1 uint16) | W/R |
| 1100 | 保持寄存器 | 动作步骤参数ACTION_STEP_PARAMS | 40 bytes (20 uint16) | W/R |
| 2000 | 输入寄存器 | 实际位置值 | 12 bytes (6 uint16) | R |
| 2006 | 输入寄存器 | 实际速度值 | 12 bytes (6 uint16) | R |
| 2012 | 输入寄存器 | 实际电流值 | 12 bytes (6 uint16) | R |
| 2018 | 输入寄存器 | 电机状态 | 12 bytes (6 uint16) | R |
| 2024 | 输入寄存器 | 工作电压 | 2 bytes | R |
| 2025 | 输入寄存器 | 按键状态 | 2 bytes | R |
| 3000 | 输入寄存器 | FW Version | 20 bytes (10 uint16) | R |
| 3010 | 输入寄存器 | SN | 20 bytes (10 uint16) | R |
4. 寄存器描述
以下是对一些关键寄存器的详细描述及其设置参数的解释。
4.1 设备 ID保持寄存器1000
485 设备 ID,可设置范围为 1 - 254,0 表示广播地址。设置 ID 后,需要通过设置 存储数据/重启寄存器(1009) 来重启设备使其生效。
4.2 设备波特率保持寄存器1001
485 设备波特率,可以设置以下参数:
| 设置参数 | 代表的波特率 |
|---|---|
| 0 | 115200 |
| 1 | 57600 |
| 2 | 19200 |
4.3 力量保持寄存器1002
此寄存器用于设置设备的力量等级:
| 设置参数 | 力量等级 |
|---|---|
| 1 | Small |
| 2 | Normal |
| 3 | Full |
4.4 存储数据/重启保持寄存器1009
设置此寄存器会将 设备 ID 和 设备波特率 参数写入到 Flash 并重启设备使设置生效。
4.5 控制位置保持寄存器1010
每个机械手有 6 个电机,其中大拇指有 2 个电机。下表是寄存器对应的手指电机。寄存器值范围 0 - 100,其中 0 表示张开,100 表示闭合。
| 寄存器地址 | 手指 | 寄存器值 |
|---|---|---|
| 1010 | 大拇指 Flex | 0 - 100 |
| 1011 | 大拇指 Aux | 0 - 100 |
| 1012 | 食指 | 0 - 100 |
| 1013 | 中指 | 0 - 100 |
| 1014 | 无名指 | 0 - 100 |
| 1015 | 小指 | 0 - 100 |
4.6 控制速度保持寄存器1016
此寄存器用于设置各个手指的速度,手指会按照设置的速度值运动,直到堵转。值范围在 -100 到 100 之间。正数表示内收,负数表示外展。
| 寄存器地址 | 手指 | 寄存器值 |
|---|---|---|
| 1016 | 大拇指 Flex | -100 - 100 |
| 1017 | 大拇指 Aux | -100 - 100 |
| 1018 | 食指 | -100 - 100 |
| 1019 | 中指 | -100 - 100 |
| 1020 | 无名指 | -100 - 100 |
| 1021 | 小指 | -100 - 100 |
4.6.2 电流 控制保持寄存器1023
此寄存器用于设置各个手指的电流,参数范围-100~-20, 20~100, 正数表示内收,负数表示外展。
| 寄存器地址 | 手指 | 寄存器值 |
|---|---|---|
| 1023 | 大拇指 Flex | -100 - 20, 20 - 100 |
| 1024 | 大拇指 Aux | -100 - 20, 20 - 100 |
| 1025 | 食指 | -100 - 20, 20 - 100 |
| 1026 | 中指 | -100 - 20, 20 - 100 |
| 1027 | 无名指 | -100 - 20, 20 - 100 |
| 1028 | 小指 | -100 - 20, 20 - 100 |
4.7 LED 控制保持寄存器1022
此寄存器用于控制 LED 的工作模式和颜色。以下是可设置的 LED 模式和颜色参数:
LED 模式
| 寄存器值 | 模式描述 |
|---|---|
| 1 | LED_MODE_SHUTDOWN |
| 2 | 常亮 |
| 3 | 1Hz闪烁 |
| 4 | 闪一次 |
| 5 | 0.5Hz闪烁 |
| 6 | 2Hz闪烁 |
LED 颜色
| 寄存器值 | 颜色描述 |
|---|---|
| 1 | 红 |
| 2 | 绿 |
| 3 | 黄 |
| 4 | 蓝 |
| 5 | 紫 |
| 6 | 青 |
| 7 | 白 |
4.8 Turbo模式保持寄存器1030
此寄存器用于控制 Turbo 模式。掉电后,Turbo 模式会恢复到默认关闭状态。
| 寄存器值 | 描述 |
|---|---|
| 0 | 关闭 |
| 1 | 开启 |
4.9 Turbo模式时间参数保持寄存器1031
Turbo 模式基于堵转功能实现。在堵转后电机停止一段时间(堵转时间),然后继续运动,周期性执行停止和继续运动。
| 寄存器地址 | 描述 |
|---|---|
| 1031 | 堵转时间,不运动,单位 ms,默认 500ms |
| 1032 | 继续运动时间,单位 ms,默认 500ms |
4.10 位置自动校准保持寄存器1033
此寄存器用于开启或关闭灵巧手在上电后自动执行位置校准。位置校准指上电后灵巧手查找手指起始位置的过程,在此期间所有的手指都会被打开。该寄存器的有效值为 1 和 0, 其中 1是开启位置自动校准, 为默认状态;0是关闭位置自动校准。
当位置自动校准关闭时,用户需要进行手动位置校准。手动位置校准有两种方式, 通过 位置校准 (1032) 保持寄存器,或者在上电后长按 7 秒手背灯。
| 寄存器值 | 描述 |
|---|---|
| 1 | 开启位置自动校准(默认状态) |
| 0 | 关闭位置自动校准 |
关闭自动校准时,需要手动进行位置校准,可以通过位置校准寄存器(1034)或上电后长按 7 秒手背灯进行。
设置生效需调用存储数据/重启(1009)寄存器。
注意:
- 位置校准过程中,如灵巧手有抓握物体,可能存在跌落风险。
- 灵巧手上电后,必须执行一次位置校准。
4.11 位置校准保持寄存器1034
此寄存器用于手动触发位置校准,仅在 位置自动校准(1033)关闭时有效。
| 寄存器值 | 描述 |
|---|---|
| 1 | 开始位置校准 |
4.12 动作序列保持寄存器1098
此寄存器用于设置和读取动作序列的命令和索引。
uint8_t cmd = 1;
uint8_t id = 2;
uint16_tregister_value = ((uint16_t)cmd << 8) + id;命令
| CMD | 描述 |
|---|---|
| 1 | SET_START |
| 2 | SET_FINISH |
| 3 | READ_START |
| 4 | READ_FINISH |
| 5 | SAVE |
| 6 | RUN |
动作序列 ID
| Action ID | 描述 | |
|---|---|---|
| 1 | 内置动作序列 1 | R |
| 2 | 内置动作序列 2 | R |
| 3 | 内置动作序列 3 | R |
| 4 | 内置动作序列 4 | R |
| 5 | 内置动作序列 5 | R |
| 6 | 内置动作序列 6 | R |
| 10 | 用户定义动作序列 1 | W/R |
| 11 | 用户定义动作序列 2 | W/R |
| 12 | 用户定义动作序列 3 | W/R |
| 13 | 用户定义动作序列 4 | W/R |
| 14 | 用户定义动作序列 5 | W/R |
| 15 | 用户定义动作序列 6 | W/R |
4.13 动作步骤数量保持寄存器/1099
可读可写,此寄存器用于表示一个动作序列中包含的步骤数量,最多可包含 32 个步骤。
4.14 动作步骤参数保持寄存器/1100
此寄存器用于存储和读取动作步骤的顺序、时间及位置速度力量参数。
| 寄存器地址 | 寄存器名称 | 描述 |
|---|---|---|
| 1100 | index | 动作顺序,范围 0-31 |
| 1101 | duration_ms | 步骤持续时间,单位 ms |
| 1102 | positions[0] | 第一个位置值 |
| 1103 | positions[1] | 第二个位置值 |
| 1104 | positions[2] | 第三个位置值 |
| 1105 | positions[3] | 第四个位置值 |
| 1106 | positions[4] | 第五个位置值 |
| 1107 | positions[5] | 第六个位置值 |
| 1108 | speeds[0] | 第一个速度值 |
| 1109 | speeds[1] | 第二个速度值 |
| 1110 | speeds[2] | 第三个速度值 |
| 1111 | speeds[3] | 第四个速度值 |
| 1112 | speeds[4] | 第五个速度值 |
| 1113 | speeds[5] | 第六个速度值 |
| 1114 | force[0] | 第一个力量值 |
| 1115 | force[1] | 第二个力量值 |
| 1116 | force[2] | 第三个力量值 |
| 1117 | force[3] | 第四个力量值 |
| 1118 | force[4] | 第五个力量值 |
| 1119 | force[5] | 第六个力量值 |
4.14.1 写入动作序列
通过此寄存器可以写入完整的动作序列。

4.14.2 读取动作序列
通过此寄存器可以读取已存储的动作序列。

4.15 实际位置值输入寄存器2000
此寄存器用于读取各个手指的实际位置值,范围从 0 到 100,其中 0 表示张开,100 表示闭合。
| 寄存器地址 | 手指 | 寄存器值 |
|---|---|---|
| 2000 | 大拇指 Flex | 0 - 100 |
| 2001 | 大拇指 Aux | 0 - 100 |
| 2002 | 食指 | 0 - 100 |
| 2003 | 中指 | 0 - 100 |
| 2004 | 无名指 | 0 - 100 |
| 2005 | 小指 | 0 - 100 |
4.16 实际速度值输入寄存器2006
此寄存器用于读取各个手指的实际速度值,范围从 0 到 100,表示速度大小,但不包含电机运动方向。
| 寄存器地址 | 手指 | 寄存器值 |
|---|---|---|
| 2006 | 大拇指 Flex | 0 - 100 |
| 2007 | 大拇指 Aux | 0 - 100 |
| 2008 | 食指 Flex | 0 - 100 |
| 2009 | 中指 Flex | 0 - 100 |
| 2010 | 无名指 Flex | 0 - 100 |
| 2011 | 小指 Flex | 0 - 100 |
4.17 实际电流值输入寄存器2012
此寄存器用于读取各个手指的实际电流值,范围从 0 到 100,表示电流大小,但不包含电机运动方向。手固件有堵转保护,手指停止一段时间后电流降为0。
| 寄存器地址 | 手指 | 寄存器值 |
|---|---|---|
| 2012 | 大拇指 Flex | 0 - 100 |
| 2013 | 大拇指 Aux | 0 - 100 |
| 2014 | 食指 Flex | 0 - 100 |
| 2015 | 中指 Flex | 0 - 100 |
| 2016 | 无名指 Flex | 0 - 100 |
| 2017 | 小指 Flex | 0 - 100 |
4.18 电机状态输入寄存器2018
此寄存器用于读取各个手指的电机状态,范围从 0 到 2,表示不同的状态。
| 寄存器地址 | 手指 | 寄存器值 |
|---|---|---|
| 2018 | 大拇指 Flex | 0 - 2 |
| 2019 | 大拇指 Aux | 0 - 2 |
| 2020 | 食指 Flex | 0 - 2 |
| 2021 | 中指 Flex | 0 - 2 |
| 2022 | 无名指 Flex | 0 - 2 |
| 2023 | 小指 Flex | 0 - 2 |
关节状态
| 序号 | 关节状态 | 说明 |
|---|---|---|
| 0 | MOTOR_IDLE | 关节空闲 |
| 1 | MOTOR_RUNNING | 关节运行中 |
| 2 | MOTOR_STALL | 关节堵转 |
4.19 电压输入寄存器2024
此寄存器用于读取电压值,单位为 mV,数据类型为 uint16。
4.20 按键状态输入寄存器2025
此寄存器用于读取按键状态。0 表示未按下,1 表示按下。
4.21 FW Version输入寄存器3000
此寄存器用于读取固件版本信息,占用 10 个寄存器,最大长度为 20 的字符串。字符串采用大端转换到多个 uint16_t 寄存器。
| 大端 uint16_t | Char |
|---|---|
| 0x302E, 0x302E, 0x342E, 0x5300 | 30 2E 30 2E 34 2E 53 00 |
4.22 SN输入寄存器3010
此寄存器用于读取 SN (序列号),占用 10 个寄存器,最大长度为 20 的字符串。字符串采用大端转换到多个 uint16_t 寄存器。
| 大端 uint16_t | Char |
|---|---|
| 0x534E, 0x3132, 0x3334, 0x3738, 0x3930, 0x3132, 0x3334, 0x3500 | 53 4E 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 00 |