# 通过RealMan机械臂ModBus控制Ohand灵巧手
## 1. ModBus 通信协议概要
ModBus-RTU 协议使用的是主从请求应答通讯方式,协议帧包括了功能码、数据域、和 CRC16 校验。
ModBus-RTU 主控单元通过读写 ROH 灵巧手内部寄存器来实现对灵巧手的状态获取和控制。
*读寄存器*是指上位系统读取 ROH 灵巧手内部寄存器数值(可成组读取,成组的是指若干名称相同地址相邻寄存器),上位系统向 ROH 灵巧手发送读请求帧(包含寄存器组首地址、寄存器组的长度等内容),ROH 灵巧手收到请求帧并校验成功后,灵巧手将包含寄存器数据内容的应答帧返回给上位系统。
*写寄存器*是指上位系统向 ROH 灵巧手内部寄存器写入相应的数据(可成组写入),上位系统向 ROH 灵巧手发送写请求帧(包含寄存器组首地址、欲写入的数据内容)发送给灵巧手,ROH 灵巧手收到请求帧并校验成功后,返回应答帧给上位系统。
ROH ModBus 协议支持 读取保持寄存器(功能码 0x03)、预置单寄存器(功能码 0x06)、预置多寄存器(功能码 0x10)操作。
## 2. RS232、RS485 通讯参数
RS232、RS485 通讯参数都是 115200bps、8 数据位、1 停止位、无奇偶校验。
## 3. ROH ModBus 数据帧格式
### 3.1. 读取保持寄存器(功能码 0x03)
主站请求帧格式:
| 从站地址 | 功能码 | 起始寄存器(高位) | 起始寄存器(低位) | 寄存器数量(高位) | 寄存器数量(低位) | CRC16 |
| -------- | ------ | ------------------ | ------------------ | ------------------ | ------------------ | ----- |
| 0x11 | 0x03 | 0x6B | 0x00 | 0x00 | 0x02 | XXXX |
含义:读 17 号(0x11)号从站保持寄存器,起始地址=0x006B;寄存器个数=0x0002,结束地址=0x006B+2-1=0x006C,即读 17 号从站保持寄存器 0x006B-0x006C,共两个寄存器。
从站应答帧格式:
| 从站地址 | 功能码 | 字节计数 | 寄存器(高位) | 寄存器(低位) | 寄存器(高位) | 寄存器(低位) | CRC16 |
| -------- | ------ | -------- | -------------- | -------------- | -------------- | -------------- | ----- |
| 0x11 | 0x03 | 0x04 | 0x00 | 0x01 | 0x00 | 0x02 | XXXX |
含义:返回 17(0x11)号从站保持寄存器 0x006B-0x006C,共两个寄存器,0x006B 寄存器数值是 0x0001,0x0062 寄存器数值是 0x0002。
从站执行请求帧发生错误时,应答帧格式:
| 从站地址 | 功能码 | 错误码 | CRC16 |
| -------- | ------ | ------ | ----- |
| 0x11 | 0x83 | XX | XXXX |
其中,功能码为请求帧功能码和 0x80 位或后的值。
### 3.2. 预置单寄存器(功能码 0x06)
主站请求帧格式:
| 从站地址 | 功能码 | 起始寄存器(高位) | 起始寄存器(低位) | 数据内容(高位) | 数据内容量(低位) | CRC16 |
| -------- | ------ | ------------------ | ------------------ | ---------------- | ------------------ | ----- |
| 0x11 | 0x06 | 0x00 | 0x6B | 0x10 | 0x00 | XXXX |
含义:设置 17 号(0x11)号从站保持寄存器,寄存器地址 0x006B,数据内容是 0x1000。
从站应答帧格式:
| 从站地址 | 功能码 | 起始寄存器(高位) | 起始寄存器(低位) | 数据内容(高位) | 数据内容量(低位) | CRC16 |
| -------- | ------ | ------------------ | ------------------ | ---------------- | ------------------ | ----- |
| 0x11 | 0x06 | 0x00 | 0x6B | 0x10 | 0x00 | XXXX |
含义:为请求帧的原样复制。
从站执行请求帧发生错误时,应答帧格式:
| 从站地址 | 功能码 | 错误码 | CRC16 |
| -------- | ------ | ------ | ----- |
| 0x11 | 0x86 | XX | XXXX |
其中,功能码为请求帧功能码和 0x80 位或后的值。
### 3.3 预置多寄存器(功能码 0x10)
主站请求帧格式:
| 从站地址 | 功能码 | 起始寄存器(高位) | 起始寄存器(低位) | 寄存器数量(高位) | 寄存器数量(低位) | 字节计数 | 数据(高位) | 数据(低位) | 数据(高位) | 数据(低位) | CRC16 |
| -------- | ------ | ------------------ | ------------------ | ------------------ | ------------------ | -------- | ------------ | ------------ | ------------ | ------------ | ----- |
| 0x11 | 0x10 | 0x00 | 0x01 | 0x00 | 0x02 | 0x04 | 0x00 | 0x0A | 0x01 | 0x02 | XXXX |
含义:设置 17 号(0x11)号从站保持寄存器,寄存器起始地址 0x0001,寄存器个数为 0x0002,数据内容字节计数是 0x04,数据内容分别是 0x000A、0x0102。
从站应答帧格式:
| 从站地址 | 功能码 | 起始寄存器(高位) | 起始寄存器(低位) | 寄存器数量(高位) | 寄存器数量(低位) | CRC16 |
| -------- | ------ | ------------------ | ------------------ | ------------------ | ------------------ | ----- |
| 0x11 | 0x10 | 0x00 | 0x01 | 0x00 | 0x02 | XXXX |
含义:从站地址、功能码 、起始寄存器、寄存器数量和请求帧保持一致。
从站执行请求帧发生错误时,应答帧格式:
| 从站地址 | 功能码 | 错误码 | CRC16 |
| -------- | ------ | ------ | ----- |
| 0x11 | 0x90 | XX | XXXX |
其中,功能码为请求帧功能码和 0x80 位或后的值。
## 3.4. ROH 灵巧手错误代码
| 错误名 | 代码 | 说明 |
| -------------------------- | ---: | ------------------------------ |
| EC01_ILLEGAL_FUNCTION | 1 | 无效的功能码 |
| EC02_ILLEGAL_DATA_ADDRESS | 2 | 无效的数据地址 |
| EC03_ILLEGAL_DATA_VALUE | 3 | 无效的数据(协议层,非应用层) |
| EC04_SERVER_DEVICE_FAILURE | 4 | 设备故障 |
在错误码为 EC04_SERVER_DEVICE_FAILURE 的情况下,寄存器 ROH_SUB_EXCEPTION 保存了具体的错误代码:
| 子错误名 | 代码 | 说明 |
| ---------------- | ---: | ---------------------------- |
| ERR_STATUS_INIT | 1 | 正在初始化,不接受此读写操作 |
| ERR_STATUS_CALI | 2 | 等待校正,不接受此读写操作 |
| ERR_INVALID_DATA | 3 | 无效的寄存器值 |
| ERR_STATUS_STUCK | 4 | 电机堵转 |
| ERR_OP_FAILED | 5 | 操作失败 |
| ERR_SAVE_FAILED | 6 | 保存失败 |
## 4.OHand ModBus 寄存器说明
### 4.1. 寄存器表
| 寄存器名称 | 寄存器地址 | 读/写权限 | 设置项的出厂默认值 | 说明 |
| ------------------------- | ---------: | --------- | ------------------ | ------------------------------------------------------------------------------------ |
| ROH_FW_VERSION | 1000 | R | | 固件版本号(uint16),高字节为主版本号,低字节为次版本号 |
| ROH_FW_REVISION | 1001 | R | | 固件修订版本号(uint16) |
| ROH_HW_VERSION | 1002 | R | | 硬件版本号(uint16),高字节为硬件类型,低字节为硬件版本 |
| ROH_BOOT_VERSION | 1003 | R | | boot loader 版本号(uint6),高字节为主版本号,低字节为次版本号 |
| ROH_SUB_EXCEPTION | 1004 | R | | 错误子代码 |
| ROH_NODE_ID | 1005 | R/W | 2 | ROH 灵巧手 ID,仅低 8 位有效,写入成功后 ROH 会保存并重启 |
| ROH_BATTERY_VOLTAGE | 1006 | R | | ROH 电压值,单位 mV,暂时不可用 |
| ROH_SELF_TEST_SWITCH | 1007 | R/W | 1 | 开机自检开关,设成 1 时允许自检,设成 0 时不自检,设置时保存到非易失存储器 |
| ROH_BEEP_SWITCH | 1008 | R/W | 1 | 蜂鸣器开关,设成 1 时允许发声,设成 0 时蜂鸣器静音,设置时保存到非易失存储器 |
| ROH_BEEP_PERIOD | 1009 | W | | 蜂鸣器发声,单位毫秒 |
| ROH_BUTTON_PRESS_CNT | 1010 | R/W | | 按键按下次数,对 ROH 而言是作为校正时确认用 |
| ROH_RECALIBRATE | 1011 | W | | 重新校正,写入特定值(非公开)会让 ROH 灵巧手进入校正状态 |
| ROH_RESERVED0 | 1012 | R/W | | 保留 |
| ROH_RESERVED1 | 1013 | R/W | | 保留 |
| ROH_RESERVED2 | 1014 | R/W | | 保留 |
| ROH_RESERVED3 | 1015 | R/W | | 保留 |
| ROH_RESERVED4 | 1016 | R/W | | 保留 |
| ROH_RESERVED5 | 1017 | R/W | | 保留 |
| ROH_RESERVED6 | 1018 | R/W | | 保留 |
| ROH_RESERVED7 | 1019 | R/W &nb