4.8 C99 Registers 레지스터 인터페이스
개요
C99 Registers 는 R, PR, SR, MR, MH, MI 레지스터 읽기/쓰기를 제공합니다. C99 함수는 평면형 엔트리이며, 문자열과 구조체 버퍼는 호출자가 제공합니다.
대응 헤더 파일:
include/c_arm_registers.h
인터페이스 시그니처
Arm_Registers_ReadR
c
int Arm_Registers_ReadR(ArmHandle* h, int index, double* outValue);| 항목 | 설명 |
|---|---|
| 설명 | R 레지스터를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , R 레지스터 번호입니다.outValue : double* , R 값 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_WriteR
c
int Arm_Registers_WriteR(ArmHandle* h, int index, double value);| 항목 | 설명 |
|---|---|
| 설명 | R 레지스터에 씁니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , R 레지스터 번호입니다.value : double , R 레지스터에 쓸 값입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_DeleteR
c
int Arm_Registers_DeleteR(ArmHandle* h, int index);| 항목 | 설명 |
|---|---|
| 설명 | R 레지스터를 삭제합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , R 레지스터 번호입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_ReadPR
c
int Arm_Registers_ReadPR(ArmHandle* h, int index, ArmPoseRegister* outReg);| 항목 | 설명 |
|---|---|
| 설명 | PR 포인트 레지스터를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , PR 레지스터 번호입니다.outReg : ArmPoseRegister* , 호출자가 할당하는 PR 출력 구조체입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_WritePR
c
int Arm_Registers_WritePR(ArmHandle* h, const ArmPoseRegister* reg);| 항목 | 설명 |
|---|---|
| 설명 | PR 포인트 레지스터에 씁니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.reg : const ArmPoseRegister* , 포인터 파라미터이며 호출 전 유효한 수명을 보장해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_DeletePR
c
int Arm_Registers_DeletePR(ArmHandle* h, int index);| 항목 | 설명 |
|---|---|
| 설명 | PR 포인트 레지스터를 삭제합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , PR 레지스터 번호입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_ReadSR
c
int Arm_Registers_ReadSR(ArmHandle* h, int index, char* outBuf, size_t bufSize);| 항목 | 설명 |
|---|---|
| 설명 | SR 문자열 레지스터를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , SR 레지스터 번호입니다.outBuf : char* , 호출자가 할당하는 출력 문자열 버퍼입니다.bufSize : size_t , 출력 버퍼 크기이며 끝의 \0 공간을 포함합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
| 비고 | 문자열 출력은 호출자가 제공한 버퍼를 사용하며, 버퍼가 부족하면 상태 코드에 따라 반환합니다. |
Arm_Registers_WriteSR
c
int Arm_Registers_WriteSR(ArmHandle* h, int index, const char* value);| 항목 | 설명 |
|---|---|
| 설명 | SR 문자열 레지스터에 씁니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , SR 레지스터 번호입니다.value : const char* , SR 문자열에 쓸 값입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_DeleteSR
c
int Arm_Registers_DeleteSR(ArmHandle* h, int index);| 항목 | 설명 |
|---|---|
| 설명 | SR 문자열 레지스터를 삭제합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , SR 레지스터 번호입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_ReadMR
c
int Arm_Registers_ReadMR(ArmHandle* h, int index, int* outValue);| 항목 | 설명 |
|---|---|
| 설명 | MR 레지스터를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , MR 레지스터 번호입니다.outValue : int* , MR 값 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_WriteMR
c
int Arm_Registers_WriteMR(ArmHandle* h, int index, int value);| 항목 | 설명 |
|---|---|
| 설명 | MR 레지스터에 씁니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , MR 레지스터 번호입니다.value : int , MR 레지스터에 쓸 값입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_DeleteMR
c
int Arm_Registers_DeleteMR(ArmHandle* h, int index);| 항목 | 설명 |
|---|---|
| 설명 | MR 레지스터를 삭제합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , MR 레지스터 번호입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_ReadMH
c
int Arm_Registers_ReadMH(ArmHandle* h, int index, int* outValue);| 항목 | 설명 |
|---|---|
| 설명 | MH 레지스터를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , MH 레지스터 번호입니다.outValue : int* , MH 값 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_WriteMH
c
int Arm_Registers_WriteMH(ArmHandle* h, int index, int value);| 항목 | 설명 |
|---|---|
| 설명 | MH 레지스터에 씁니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , MH 레지스터 번호입니다.value : int , MH 레지스터에 쓸 값입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_ReadMI
c
int Arm_Registers_ReadMI(ArmHandle* h, int index, int* outValue);| 항목 | 설명 |
|---|---|
| 설명 | MI 레지스터를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , MI 레지스터 번호입니다.outValue : int* , MI 값 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Registers_WriteMI
c
int Arm_Registers_WriteMI(ArmHandle* h, int index, int value);| 항목 | 설명 |
|---|---|
| 설명 | MI 레지스터에 씁니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.index : int , MI 레지스터 번호입니다.value : int , MI 레지스터에 쓸 값입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
레지스터 타입
| 타입 | 읽기 | 쓰기 | 삭제 | 데이터 |
|---|---|---|---|---|
| R | Arm_Registers_ReadR | Arm_Registers_WriteR | Arm_Registers_DeleteR | double |
| PR | Arm_Registers_ReadPR | Arm_Registers_WritePR | Arm_Registers_DeletePR | ArmPoseRegister |
| SR | Arm_Registers_ReadSR | Arm_Registers_WriteSR | Arm_Registers_DeleteSR | 문자열 |
| MR | Arm_Registers_ReadMR | Arm_Registers_WriteMR | Arm_Registers_DeleteMR | int |
| MH | Arm_Registers_ReadMH | Arm_Registers_WriteMH | 삭제 인터페이스 없음 | int |
| MI | Arm_Registers_ReadMI | Arm_Registers_WriteMI | 삭제 인터페이스 없음 | int |
파라미터 및 규칙
| 항목 | 규칙 |
|---|---|
index | 컨트롤러 측 레지스터 번호 |
Arm_Registers_ReadSR() | char* + bufSize 로 문자열을 출력하며, 버퍼는 끝의 \0 을 포함해야 합니다. |
Arm_Registers_ReadPR() | ArmPoseRegister 를 출력하며, 호출자가 유효한 구조체 포인터를 전달합니다. |
Arm_Registers_WritePR() | ArmPoseRegister.id 를 사용해 쓸 PR 번호를 지정합니다. |
MH / MI | 읽기/쓰기 인터페이스를 제공하지만 삭제 인터페이스는 제공하지 않습니다. |
| 쓰기 및 삭제 | 컨트롤러 레지스터 상태를 변경하므로 실행 전 현장 작업을 확인해야 합니다. |
ArmPoseRegister 필드
| 필드 | 타입 | 설명 |
|---|---|---|
id | int | PR 레지스터 번호 |
cart | double[6] | 직교 좌표 자세 데이터 |
joint | double[9] | 관절 자세 데이터 |
poseType | int | 자세 타입이며 값은 ArmPoseType 을 참고합니다. |
turnCycle | int[9] | 관절 회전 수 정보 |
wristFlip | int | 손목 플립 플래그 |
armUpDown | int | 팔 상하 자세 플래그 |
armBackFront | int | 팔 전후 자세 플래그 |
armLeftRight | int | 팔 좌우 자세 플래그 |
name | char[64] | 포인트 이름 |
comment | char[128] | 포인트 비고 |
최소 호출 예제
c
#include <stdio.h> // R 레지스터 출력을 위해 printf를 포함합니다.
#include "c_arm_api.h" // C99 SDK 최상위 헤더를 포함합니다.
int main(void) // 예제 프로그램 진입점
{ // 예제 main 함수 시작
ArmHandle* h = Arm_Create(); // C99 세션 핸들을 생성합니다.
double rValue = 0.0; // R 레지스터 출력 변수를 준비합니다.
if (h == NULL) { // 핸들 생성 실패 여부를 확인합니다.
return 1; // 생성 실패 시 종료합니다.
} // 핸들 검사 종료
if (Arm_Connect(h, "10.27.1.2", "10.27.1.102") != 0) { // 컨트롤러에 연결합니다.
Arm_Destroy(h); // 연결 실패 시 핸들을 해제합니다.
return 1; // 오류를 반환합니다.
} // 연결 검사 종료
int ret = Arm_Registers_ReadR(h, 1, &rValue); // R1을 읽습니다.
printf("r1=%f\n", rValue); // R1 값을 출력합니다.
Arm_Disconnect(h); // 연결을 해제합니다.
Arm_Destroy(h); // 핸들을 폐기합니다.
return ret == 0 ? 0 : 1; // 읽기 결과에 따라 반환합니다.
} // 예제 main 함수 종료시나리오 예제
c
double rValue = 0.0; // R 출력을 준비합니다.
ArmPoseRegister pr = {0}; // PR 출력을 준비합니다.
char sr[128] = {0}; // SR 출력 버퍼를 준비합니다.
int mr = 0; // MR 출력을 준비합니다.
int mh = 0; // MH 출력을 준비합니다.
int mi = 0; // MI 출력을 준비합니다.
int readRRet = Arm_Registers_ReadR(h, 1, &rValue); // R1을 읽습니다.
int readPRRet = Arm_Registers_ReadPR(h, 1, &pr); // PR1을 읽습니다.
int readSRRet = Arm_Registers_ReadSR(h, 1, sr, sizeof(sr)); // SR1을 읽습니다.
int readMRRet = Arm_Registers_ReadMR(h, 1, &mr); // MR1을 읽습니다.
int readMHRet = Arm_Registers_ReadMH(h, 1, &mh); // MH1을 읽습니다.
int readMIRet = Arm_Registers_ReadMI(h, 1, &mi); // MI1을 읽습니다.
/* int writeRRet = Arm_Registers_WriteR(h, 1, rValue); */ // R 쓰기는 레지스터를 변경하므로 확인 후 실행합니다.
/* int writePRRet = Arm_Registers_WritePR(h, &pr); */ // PR 쓰기는 레지스터를 변경하므로 확인 후 실행합니다.
/* int writeSRRet = Arm_Registers_WriteSR(h, 1, "demo"); */ // SR 쓰기는 레지스터를 변경하므로 확인 후 실행합니다.
/* int writeMRRet = Arm_Registers_WriteMR(h, 1, mr); */ // MR 쓰기는 레지스터를 변경하므로 확인 후 실행합니다.
/* int writeMHRet = Arm_Registers_WriteMH(h, 1, mh); */ // MH 쓰기는 레지스터를 변경하므로 확인 후 실행합니다.
/* int writeMIRet = Arm_Registers_WriteMI(h, 1, mi); */ // MI 쓰기는 레지스터를 변경하므로 확인 후 실행합니다.
/* int deleteRRet = Arm_Registers_DeleteR(h, 1); */ // R 삭제는 레지스터를 변경하므로 확인 후 실행합니다.
/* int deletePRRet = Arm_Registers_DeletePR(h, 1); */ // PR 삭제는 레지스터를 변경하므로 확인 후 실행합니다.
/* int deleteSRRet = Arm_Registers_DeleteSR(h, 1); */ // SR 삭제는 레지스터를 변경하므로 확인 후 실행합니다.
/* int deleteMRRet = Arm_Registers_DeleteMR(h, 1); */ // MR 삭제는 레지스터를 변경하므로 확인 후 실행합니다.
(void)readRRet; // 예제에서 상태 코드를 유지합니다.
(void)readPRRet; // 예제에서 상태 코드를 유지합니다.
(void)readSRRet; // 예제에서 상태 코드를 유지합니다.
(void)readMRRet; // 예제에서 상태 코드를 유지합니다.
(void)readMHRet; // 예제에서 상태 코드를 유지합니다.
(void)readMIRet; // 예제에서 상태 코드를 유지합니다.예제 코드
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;
}