Skip to content

3.8 RegisterBank 寄存器类

概述

RegisterBank 负责 R / PR / SR / MR / MH / MI 寄存器读写。在 Arm 完成连接后,通过 arm.registerBank 获取 Registers 实例,无需单独初始化。

3.8.1 R 寄存器(数值型)

3.8.1.1 读取 R 寄存器

cpp
ReadR(int32_t index) -> std::pair<Float64, STATUS_CODE>
说明
描述读取指定索引的 R 寄存器值
请求参数index : int32_t 寄存器索引
返回值Float64: 寄存器值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.1.2 写入 R 寄存器

cpp
WriteR(int32_t index, Float64 value) -> STATUS_CODE
说明
描述写入指定索引的 R 寄存器值
请求参数index : int32_t 寄存器索引
value : Float64 写入值
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.1.3 删除 R 寄存器

cpp
DeleteR(int32_t index) -> STATUS_CODE
说明
描述删除指定索引的 R 寄存器
请求参数index : int32_t 寄存器索引
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.2 PR 寄存器(点位型)

3.8.2.1 读取 PR 寄存器

cpp
ReadPR(int32_t index) -> std::pair<PoseRegister, STATUS_CODE>
说明
描述读取指定索引的 PR 寄存器值
请求参数index : int32_t 寄存器索引
返回值PoseRegister: 点位寄存器值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.2.2 写入 PR 寄存器

cpp
WritePR(const PoseRegister& reg) -> STATUS_CODE
说明
描述写入 PR 寄存器值
请求参数reg : PoseRegister 点位寄存器对象,包含索引和点位数据
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.2.3 删除 PR 寄存器

cpp
DeletePR(int32_t index) -> STATUS_CODE
说明
描述删除指定索引的 PR 寄存器
请求参数index : int32_t 寄存器索引
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.3 SR 寄存器(字符串型)

3.8.3.1 读取 SR 寄存器

cpp
ReadSR(int32_t index) -> std::pair<std::string, STATUS_CODE>
说明
描述读取指定索引的 SR 寄存器值
请求参数index : int32_t 寄存器索引
返回值std::string: 寄存器值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.3.2 写入 SR 寄存器

cpp
WriteSR(int32_t index, const std::string& value) -> STATUS_CODE
说明
描述写入指定索引的 SR 寄存器值
请求参数index : int32_t 寄存器索引
value : std::string 写入值
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.3.3 删除 SR 寄存器

cpp
DeleteSR(int32_t index) -> STATUS_CODE
说明
描述删除指定索引的 SR 寄存器
请求参数index : int32_t 寄存器索引
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.4 MR 寄存器(整型)

3.8.4.1 读取 MR 寄存器

cpp
ReadMR(int32_t index) -> std::pair<int32_t, STATUS_CODE>
说明
描述读取指定索引的 MR 寄存器值
请求参数index : int32_t 寄存器索引
返回值int32_t: 寄存器值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.4.2 写入 MR 寄存器

cpp
WriteMR(int32_t index, int32_t value) -> STATUS_CODE
说明
描述写入指定索引的 MR 寄存器值
请求参数index : int32_t 寄存器索引
value : int32_t 写入值
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.4.3 删除 MR 寄存器

cpp
DeleteMR(int32_t index) -> STATUS_CODE
说明
描述删除指定索引的 MR 寄存器
请求参数index : int32_t 寄存器索引
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.5 MH / MI 寄存器(整型)

3.8.5.1 读取 MH 寄存器

cpp
ReadMH(int32_t index) -> std::pair<int32_t, STATUS_CODE>
说明
描述读取指定索引的 MH 寄存器值
请求参数index : int32_t 寄存器索引
返回值int32_t: 寄存器值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.5.2 写入 MH 寄存器

cpp
WriteMH(int32_t index, int32_t value) -> STATUS_CODE
说明
描述写入指定索引的 MH 寄存器值
请求参数index : int32_t 寄存器索引
value : int32_t 写入值
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.5.3 读取 MI 寄存器

cpp
ReadMI(int32_t index) -> std::pair<int32_t, STATUS_CODE>
说明
描述读取指定索引的 MI 寄存器值
请求参数index : int32_t 寄存器索引
返回值int32_t: 寄存器值
STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

3.8.5.4 写入 MI 寄存器

cpp
WriteMI(int32_t index, int32_t value) -> STATUS_CODE
说明
描述写入指定索引的 MI 寄存器值
请求参数index : int32_t 寄存器索引
value : int32_t 写入值
返回值STATUS_CODE: 函数执行结果
兼容的机器人软件版本协作 (Copper): v7.5.0.0+
工业 (Bronze): v7.5.0.0+

寄存器类型对照表

寄存器类型数据类型说明
RFloat64数值型寄存器,存储浮点数
PRPoseRegister点位型寄存器,存储机器人位姿
SRstd::string字符串型寄存器,存储文本
MRint32_t整型寄存器,存储整数
MHint32_t整型寄存器,存储整数
MIint32_t整型寄存器,存储整数

最小调用示例

cpp
#include <iostream>  // 引入标准输出流,用于打印寄存器读取结果
#include "arm_api.h"  // 引入 Arm 主入口,连接后通过 arm.registerBank 访问寄存器接口
#include "status_code.h"  // 引入 STATUS_CODE,用于检查 SDK 调用结果
int main()  // 示例程序入口
{  // 进入示例主函数
    Arm arm;  // 创建机器人会话对象
    STATUS_CODE connectRet = arm.Connect("192.168.110.2", "");  // 连接控制器,示教器地址留空表示使用默认规则
    if (connectRet != STATUS_CODE::OK) {  // 判断连接是否失败
        return 1;  // 连接失败时直接退出
    }  // 结束连接结果判断
    auto [rValue, rRet] = arm.registerBank.ReadR(0);  // 读取 R[0] 数值寄存器
    if (rRet == STATUS_CODE::OK) {  // 只有读取成功时才打印 R 寄存器值
        std::cout << "R[0]=" << rValue << "\n";  // 打印 R[0] 的值
    }  // 结束 R 寄存器读取判断
    auto [srValue, srRet] = arm.registerBank.ReadSR(0);  // 读取 SR[0] 字符串寄存器
    if (srRet == STATUS_CODE::OK) {  // 只有读取成功时才打印 SR 寄存器值
        std::cout << "SR[0]=" << srValue << "\n";  // 打印 SR[0] 的值
    }  // 结束 SR 寄存器读取判断
    auto [mrValue, mrRet] = arm.registerBank.ReadMR(0);  // 读取 MR[0] 运动寄存器
    if (mrRet == STATUS_CODE::OK) {  // 只有读取成功时才打印 MR 寄存器值
        std::cout << "MR[0]=" << mrValue << "\n";  // 打印 MR[0] 的值
    }  // 结束 MR 寄存器读取判断
    // PoseRegister pr;  // 写 PR 有实际副作用,确认后再创建 PR 寄存器对象
    // pr.id = 1;  // 设置要写入的 PR 编号
    // pr.poseRegisterData.pt = PoseType::JOINT;  // 指定 PR 点位使用关节位姿
    // pr.poseRegisterData.joint = {0, 0, 0, 0, 0, 0, 0, 0, 0};  // 设置 PR 的关节数组值
    // STATUS_CODE prRet = arm.registerBank.WritePR(pr);  // 确认后再取消注释写入 PR
    return 0;  // 示例正常结束
}  // 结束示例主函数

场景化示例

下面几组片段按 “读寄存器、写寄存器、删除寄存器、Modbus 寄存器” 交叉覆盖本页 API。片段默认承接最小调用示例里已经连接成功的 arm 对象;写入和删除会改变控制器数据,确认后再执行。

读取常用寄存器

cpp
auto [rValue, rRet] = arm.registerBank.ReadR(0);  // 读取 R 数值寄存器
auto [prValue, prRet] = arm.registerBank.ReadPR(0);  // 读取 PR 位姿寄存器
auto [srValue, srRet] = arm.registerBank.ReadSR(0);  // 读取 SR 字符串寄存器
auto [mrValue, mrRet] = arm.registerBank.ReadMR(0);  // 读取 MR 运动寄存器
if (rRet == STATUS_CODE::OK || prRet == STATUS_CODE::OK || srRet == STATUS_CODE::OK || mrRet == STATUS_CODE::OK) {  // 判断是否至少一个读取成功
    std::cout << "R=" << rValue << " SR=" << srValue << " MR=" << mrValue << "\n";  // 打印寄存器读取摘要
}  // 结束读取结果判断

写入常用寄存器

cpp
PoseRegister prToWrite;  // 准备 WritePR 使用的位姿寄存器对象
prToWrite.id = 1;  // 设置示例 PR 编号
// STATUS_CODE writeRRet = arm.registerBank.WriteR(0, Float64{1.0});  // 写 R 寄存器会改变控制器数据,确认后再执行
// STATUS_CODE writePRRet = arm.registerBank.WritePR(prToWrite);  // 写 PR 寄存器会改变控制器数据,确认后再执行
// STATUS_CODE writeSRRet = arm.registerBank.WriteSR(0, "demo");  // 写 SR 寄存器会改变控制器数据,确认后再执行
// STATUS_CODE writeMRRet = arm.registerBank.WriteMR(0, 10);  // 写 MR 寄存器会改变控制器数据,确认后再执行

删除寄存器

cpp
// STATUS_CODE deleteRRet = arm.registerBank.DeleteR(0);  // 删除 R 寄存器会改变控制器数据,确认后再执行
// STATUS_CODE deletePRRet = arm.registerBank.DeletePR(1);  // 删除 PR 寄存器会改变控制器数据,确认后再执行
// STATUS_CODE deleteSRRet = arm.registerBank.DeleteSR(0);  // 删除 SR 寄存器会改变控制器数据,确认后再执行
// STATUS_CODE deleteMRRet = arm.registerBank.DeleteMR(0);  // 删除 MR 寄存器会改变控制器数据,确认后再执行

Modbus 映射寄存器

cpp
auto [mhValue, mhRet] = arm.registerBank.ReadMH(0);  // 读取 MH Modbus 保持寄存器
auto [miValue, miRet] = arm.registerBank.ReadMI(0);  // 读取 MI Modbus 输入寄存器
if (mhRet == STATUS_CODE::OK || miRet == STATUS_CODE::OK) {  // 判断 Modbus 映射寄存器读取是否成功
    std::cout << "MH=" << mhValue << " MI=" << miValue << "\n";  // 打印 Modbus 映射寄存器读取摘要
}  // 结束 Modbus 映射寄存器读取判断
// STATUS_CODE writeMHRet = arm.registerBank.WriteMH(0, 10);  // 写 MH 寄存器会改变控制器数据,确认后再执行
// STATUS_CODE writeMIRet = arm.registerBank.WriteMI(0, 10);  // 写 MI 寄存器会改变控制器数据,确认后再执行

示例代码

cpp17/registers_basic/src/main.cpp
cpp
#include "query_registers/run.h"
#include "write_registers/run.h"

int main(void)
{
    // [ZH] 默认只调用一个门面方法;如需体验其他接口,请把下一行替换成下面任意一行。
    // [EN] The main function calls only one facade by default. Replace the next line with any line below to try other APIs.
    return RunRegistersBasicQueryRegisters();
    // return RunRegistersBasicWriteRegisters();
}
c99/registers_basic/src/main.cpp
cpp
#include <stdio.h>
#include <string.h>

extern "C" {
#include "c_arm_api.h"
}

int main(void)
{
    // [ZH] 本示例直接在源码中写死连接地址,不解析命令行参数。
    // [EN] This example hard-codes the connection addresses in the source code and does not parse command-line arguments.
    // [ZH] 创建并连接 SDK 句柄。
    // [EN] Create the SDK handle and connect to the robot.
    ArmHandle* handle = Arm_Create();
    if (handle == NULL) {
        printf("[c99_registers] 创建句柄失败 / Failed to create the handle\n");
        return 1;
    }
    int ret = Arm_Connect(handle, "10.27.1.2", "10.27.1.102");
    if (ret != 0) {
        printf("[c99_registers] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
        Arm_Destroy(handle);
        return 1;
    }
    printf("[c99_registers] 机器人连接成功 / Robot connected successfully\n");

    // [ZH] 顺序读取全部寄存器类型。
    // [EN] Read all register types in sequence.
    double rValue = 0.0;
    ArmPoseRegister prValue;
    char srValue[256] = {0};
    int mrValue = 0;
    int mhValue = 0;
    int miValue = 0;
    memset(&prValue, 0, sizeof(prValue));
    ret = Arm_Registers_ReadR(handle, 0, &rValue);
    printf("[c99_registers] ReadR 状态码 / ReadR status code: %d, R[0]=%.6f\n", ret, rValue);
    ret = Arm_Registers_ReadPR(handle, 0, &prValue);
    printf("[c99_registers] ReadPR 状态码 / ReadPR status code: %d, PR[0].id=%d, name=%s\n", ret, prValue.id, prValue.name);
    ret = Arm_Registers_ReadSR(handle, 0, srValue, sizeof(srValue));
    printf("[c99_registers] ReadSR 状态码 / ReadSR status code: %d, SR[0]=%s\n", ret, srValue);
    ret = Arm_Registers_ReadMR(handle, 0, &mrValue);
    printf("[c99_registers] ReadMR 状态码 / ReadMR status code: %d, MR[0]=%d\n", ret, mrValue);
    ret = Arm_Registers_ReadMH(handle, 0, &mhValue);
    printf("[c99_registers] ReadMH 状态码 / ReadMH status code: %d, MH[0]=%d\n", ret, mhValue);
    ret = Arm_Registers_ReadMI(handle, 0, &miValue);
    printf("[c99_registers] ReadMI 状态码 / ReadMI status code: %d, MI[0]=%d\n", ret, miValue);

    // [ZH] 顺序执行全部写接口与删除接口。
    // [EN] Execute all write APIs and delete APIs in sequence.
    ret = Arm_Registers_WriteR(handle, 0, rValue);
    printf("[c99_registers] WriteR 状态码 / WriteR status code: %d\n", ret);
    ret = Arm_Registers_DeleteR(handle, 0);
    printf("[c99_registers] DeleteR 状态码 / DeleteR status code: %d\n", ret);
    ret = Arm_Registers_WritePR(handle, &prValue);
    printf("[c99_registers] WritePR 状态码 / WritePR status code: %d\n", ret);
    ret = Arm_Registers_DeletePR(handle, prValue.id);
    printf("[c99_registers] DeletePR 状态码 / DeletePR status code: %d\n", ret);
    ret = Arm_Registers_WriteSR(handle, 0, srValue);
    printf("[c99_registers] WriteSR 状态码 / WriteSR status code: %d\n", ret);
    ret = Arm_Registers_DeleteSR(handle, 0);
    printf("[c99_registers] DeleteSR 状态码 / DeleteSR status code: %d\n", ret);
    ret = Arm_Registers_WriteMR(handle, 0, mrValue);
    printf("[c99_registers] WriteMR 状态码 / WriteMR status code: %d\n", ret);
    ret = Arm_Registers_DeleteMR(handle, 0);
    printf("[c99_registers] DeleteMR 状态码 / DeleteMR status code: %d\n", ret);
    ret = Arm_Registers_WriteMH(handle, 0, mhValue);
    printf("[c99_registers] WriteMH 状态码 / WriteMH status code: %d\n", ret);
    ret = Arm_Registers_WriteMI(handle, 0, miValue);
    printf("[c99_registers] WriteMI 状态码 / WriteMI status code: %d\n", ret);

    // [ZH] 断开连接并销毁句柄。
    // [EN] Disconnect and destroy the handle.
    Arm_Disconnect(handle);
    Arm_Destroy(handle);
    printf("[c99_registers] 示例结束 / Example finished\n");
    return 0;
}