Skip to content

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 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다.

레지스터 타입

타입읽기쓰기삭제데이터
RArm_Registers_ReadRArm_Registers_WriteRArm_Registers_DeleteRdouble
PRArm_Registers_ReadPRArm_Registers_WritePRArm_Registers_DeletePRArmPoseRegister
SRArm_Registers_ReadSRArm_Registers_WriteSRArm_Registers_DeleteSR문자열
MRArm_Registers_ReadMRArm_Registers_WriteMRArm_Registers_DeleteMRint
MHArm_Registers_ReadMHArm_Registers_WriteMH삭제 인터페이스 없음int
MIArm_Registers_ReadMIArm_Registers_WriteMI삭제 인터페이스 없음int

파라미터 및 규칙

항목규칙
index컨트롤러 측 레지스터 번호
Arm_Registers_ReadSR()char* + bufSize 로 문자열을 출력하며, 버퍼는 끝의 \0 을 포함해야 합니다.
Arm_Registers_ReadPR()ArmPoseRegister 를 출력하며, 호출자가 유효한 구조체 포인터를 전달합니다.
Arm_Registers_WritePR()ArmPoseRegister.id 를 사용해 쓸 PR 번호를 지정합니다.
MH / MI읽기/쓰기 인터페이스를 제공하지만 삭제 인터페이스는 제공하지 않습니다.
쓰기 및 삭제컨트롤러 레지스터 상태를 변경하므로 실행 전 현장 작업을 확인해야 합니다.

ArmPoseRegister 필드

필드타입설명
idintPR 레지스터 번호
cartdouble[6]직교 좌표 자세 데이터
jointdouble[9]관절 자세 데이터
poseTypeint자세 타입이며 값은 ArmPoseType 을 참고합니다.
turnCycleint[9]관절 회전 수 정보
wristFlipint손목 플립 플래그
armUpDownint팔 상하 자세 플래그
armBackFrontint팔 전후 자세 플래그
armLeftRightint팔 좌우 자세 플래그
namechar[64]포인트 이름
commentchar[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;  // 예제에서 상태 코드를 유지합니다.

예제 코드

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;
}