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+ |
레지스터 타입 대조표
| 레지스터 타입 | 데이터 타입 | 설명 |
|---|---|---|
| R | Float64 | 숫자형 레지스터. 부동소수점 수를 저장 |
| PR | PoseRegister | 포즈형 레지스터. 로봇 포즈를 저장 |
| SR | std::string | 문자열형 레지스터. 텍스트를 저장 |
| MR | int32_t | 정수형 레지스터. 정수를 저장 |
| MH | int32_t | 정수형 레지스터. 정수를 저장 |
| MI | int32_t | 정수형 레지스터. 정수를 저장 |
최소 호출 예제
cpp
#include <iostream> // 레지스터 읽기 결과를 출력하기 위한 표준 출력 스트림을 포함합니다.
#include "arm_api.h" // Arm 주 진입점을 포함하며, 연결 후 arm.registerBank로 레지스터 인터페이스에 접근합니다.
#include "status_code.h" // SDK 호출 결과 확인용 STATUS_CODE를 포함합니다.
int main() // 예제 프로그램 진입점입니다.
{ // 예제 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; // 예제를 정상 종료합니다.
} // 예제 main 함수를 종료합니다.시나리오 예제
아래 조각들은 "레지스터 읽기, 레지스터 쓰기, 레지스터 삭제, 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 holding 레지스터를 읽습니다.
auto [miValue, miRet] = arm.registerBank.ReadMI(0); // MI Modbus input 레지스터를 읽습니다.
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 레지스터 쓰기는 컨트롤러 데이터를 변경하므로 확인한 뒤 실행하십시오.예제 코드
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();
}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;
}