Skip to content

Modbus-RTU协议 基础版

Modbus-RTU 协议是一种主从请求应答通讯协议,广泛应用于工业自动化系统中。协议帧包括了功能码、数据域、和 CRC 校验,以确保通信的可靠性。

1. Frame 结构

一个完整的 Modbus 帧包括以下几个部分:

Header/Device IDFunction CodeDataCRC16
1 Byte1 ByteN Bytes2 Bytes
  • Header/Device ID: 设备标识符,用于区分不同的设备。
  • Function Code: 功能码,指示请求的操作类型。
  • Data: 数据域,包含具体操作的数据。
  • CRC16: CRC 校验,用于校验数据的完整性。

2. 功能码

功能码用于指示主设备希望从设备执行的操作类型:

功能码描述
03H读保持寄存器
06H写单个保持寄存器
10H写多个保持寄存器
04H读输入寄存器

3. 寄存器

寄存器是设备内存中的一块,用于存储数据。以下是不同类型寄存器的详细描述:

地址类型描述长度属性
1000保持寄存器485 ID2 bytesW/R
1001保持寄存器波特率2 bytesW/R
1002保持寄存器力量2 bytesW/R
1009保持寄存器存储数据/重启2 bytesW
1010保持寄存器位置设置值12 bytes (6 uint16)W/R
1016保持寄存器速度设置值12 bytes (6 uint16)W/R
1022保持寄存器LED设置2 bytesW/R
1023保持寄存器电流设置值12 bytes (6 uint16)W/R
1030保持寄存器Turbo模式2 bytesW/R
1031保持寄存器Turbo模式时间参数4 bytesR
1033保持寄存器位置自动校准2 bytesW/R
1034保持寄存器位置校准2 bytesW
1098保持寄存器动作序列ACTION_CMD_ID2 bytes (1 uint16)W
1099保持寄存器动作步骤数量ACTION_STEP_NUMBER2 bytes (1 uint16)W/R
1100保持寄存器动作步骤参数ACTION_STEP_PARAMS40 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 bytesR
2025输入寄存器按键状态2 bytesR
3000输入寄存器FW Version20 bytes (10 uint16)R
3010输入寄存器SN20 bytes (10 uint16)R

4. 寄存器描述

以下是对一些关键寄存器的详细描述及其设置参数的解释。

4.1 设备 ID保持寄存器1000

485 设备 ID,可设置范围为 1 - 254,0 表示广播地址。设置 ID 后,需要通过设置 存储数据/重启寄存器(1009) 来重启设备使其生效。

4.2 设备波特率保持寄存器1001

485 设备波特率,可以设置以下参数:

设置参数代表的波特率
0115200
157600
219200

4.3 力量保持寄存器1002

此寄存器用于设置设备的力量等级:

设置参数力量等级
1Small
2Normal
3Full

4.4 存储数据/重启保持寄存器1009

设置此寄存器会将 设备 ID设备波特率 参数写入到 Flash 并重启设备使设置生效。

4.5 控制位置保持寄存器1010

每个机械手有 6 个电机,其中大拇指有 2 个电机。下表是寄存器对应的手指电机。寄存器值范围 0 - 100,其中 0 表示张开,100 表示闭合。

寄存器地址手指寄存器值
1010大拇指 Flex0 - 100
1011大拇指 Aux0 - 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 模式

寄存器值模式描述
1LED_MODE_SHUTDOWN
2常亮
31Hz闪烁
4闪一次
50.5Hz闪烁
62Hz闪烁

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)寄存器。

注意:

  1. 位置校准过程中,如灵巧手有抓握物体,可能存在跌落风险。
  2. 灵巧手上电后,必须执行一次位置校准。

4.11 位置校准保持寄存器1034

此寄存器用于手动触发位置校准,仅在 位置自动校准(1033)关闭时有效。

寄存器值描述
1开始位置校准

4.12 动作序列保持寄存器1098

此寄存器用于设置和读取动作序列的命令和索引。

c
uint8_t cmd = 1;
uint8_t id = 2;
uint16_tregister_value = ((uint16_t)cmd << 8) + id;

命令

CMD描述
1SET_START
2SET_FINISH
3READ_START
4READ_FINISH
5SAVE
6RUN

动作序列 ID

Action ID描述
1内置动作序列 1R
2内置动作序列 2R
3内置动作序列 3R
4内置动作序列 4R
5内置动作序列 5R
6内置动作序列 6R
10用户定义动作序列 1W/R
11用户定义动作序列 2W/R
12用户定义动作序列 3W/R
13用户定义动作序列 4W/R
14用户定义动作序列 5W/R
15用户定义动作序列 6W/R

4.13 动作步骤数量保持寄存器/1099

可读可写,此寄存器用于表示一个动作序列中包含的步骤数量,最多可包含 32 个步骤。

4.14 动作步骤参数保持寄存器/1100

此寄存器用于存储和读取动作步骤的顺序、时间及位置速度力量参数。

寄存器地址寄存器名称描述
1100index动作顺序,范围 0-31
1101duration_ms步骤持续时间,单位 ms
1102positions[0]第一个位置值
1103positions[1]第二个位置值
1104positions[2]第三个位置值
1105positions[3]第四个位置值
1106positions[4]第五个位置值
1107positions[5]第六个位置值
1108speeds[0]第一个速度值
1109speeds[1]第二个速度值
1110speeds[2]第三个速度值
1111speeds[3]第四个速度值
1112speeds[4]第五个速度值
1113speeds[5]第六个速度值
1114force[0]第一个力量值
1115force[1]第二个力量值
1116force[2]第三个力量值
1117force[3]第四个力量值
1118force[4]第五个力量值
1119force[5]第六个力量值

4.14.1 写入动作序列

通过此寄存器可以写入完整的动作序列。

img

4.14.2 读取动作序列

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

img

4.15 实际位置值输入寄存器2000

此寄存器用于读取各个手指的实际位置值,范围从 0 到 100,其中 0 表示张开,100 表示闭合。

寄存器地址手指寄存器值
2000大拇指 Flex0 - 100
2001大拇指 Aux0 - 100
2002食指0 - 100
2003中指0 - 100
2004无名指0 - 100
2005小指0 - 100

4.16 实际速度值输入寄存器2006

此寄存器用于读取各个手指的实际速度值,范围从 0 到 100,表示速度大小,但不包含电机运动方向。

寄存器地址手指寄存器值
2006大拇指 Flex0 - 100
2007大拇指 Aux0 - 100
2008食指 Flex0 - 100
2009中指 Flex0 - 100
2010无名指 Flex0 - 100
2011小指 Flex0 - 100

4.17 实际电流值输入寄存器2012

此寄存器用于读取各个手指的实际电流值,范围从 0 到 100,表示电流大小,但不包含电机运动方向。手固件有堵转保护,手指停止一段时间后电流降为0。

寄存器地址手指寄存器值
2012大拇指 Flex0 - 100
2013大拇指 Aux0 - 100
2014食指 Flex0 - 100
2015中指 Flex0 - 100
2016无名指 Flex0 - 100
2017小指 Flex0 - 100

4.18 电机状态输入寄存器2018

此寄存器用于读取各个手指的电机状态,范围从 0 到 2,表示不同的状态。

寄存器地址手指寄存器值
2018大拇指 Flex0 - 2
2019大拇指 Aux0 - 2
2020食指 Flex0 - 2
2021中指 Flex0 - 2
2022无名指 Flex0 - 2
2023小指 Flex0 - 2

关节状态

序号关节状态说明
0MOTOR_IDLE关节空闲
1MOTOR_RUNNING关节运行中
2MOTOR_STALL关节堵转

4.19 电压输入寄存器2024

此寄存器用于读取电压值,单位为 mV,数据类型为 uint16。

4.20 按键状态输入寄存器2025

此寄存器用于读取按键状态。0 表示未按下,1 表示按下。

4.21 FW Version输入寄存器3000

此寄存器用于读取固件版本信息,占用 10 个寄存器,最大长度为 20 的字符串。字符串采用大端转换到多个 uint16_t 寄存器。

大端 uint16_tChar
0x302E, 0x302E, 0x342E, 0x530030 2E 30 2E 34 2E 53 00

4.22 SN输入寄存器3010

此寄存器用于读取 SN (序列号),占用 10 个寄存器,最大长度为 20 的字符串。字符串采用大端转换到多个 uint16_t 寄存器。

大端 uint16_tChar
0x534E, 0x3132, 0x3334, 0x3738, 0x3930, 0x3132, 0x3334, 0x350053 4E 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 00