4.2 C99 Info 정보 인터페이스
개요
C99 Info 는 컨트롤러 버전, 로봇 모델, 컨트롤러 상태, 로봇 상태, 서보 상태, 소프트 모드, 조작 모드, LED, 비상 정지, 서보 전원 켜기/끄기, 제어권 keepalive를 담당합니다.
대응 헤더 파일:
include/c_arm_info.h
인터페이스 시그니처
Arm_Info_GetControllerVersion
c
int Arm_Info_GetControllerVersion(ArmHandle* h, char* outVersion, size_t bufSize);| 항목 | 설명 |
|---|---|
| 설명 | 컨트롤러 버전 문자열을 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outVersion : char* , 컨트롤러 버전 출력 버퍼입니다.bufSize : size_t , 출력 버퍼 크기이며 끝의 \0 공간을 포함합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_GetArmModelInfo
c
int Arm_Info_GetArmModelInfo(ArmHandle* h, char* outModel, size_t bufSize);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 모델 문자열을 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outModel : char* , 로봇 모델 출력 버퍼입니다.bufSize : size_t , 출력 버퍼 크기이며 끝의 \0 공간을 포함합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_AcquireAccess
c
void Arm_Info_AcquireAccess(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 제어권 획득 또는 유지를 시작합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | 반환값 없음 |
Arm_Info_ReleaseAccess
c
void Arm_Info_ReleaseAccess(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 제어권 keepalive를 해제합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | 반환값 없음 |
Arm_Info_SwitchLedLight
c
int Arm_Info_SwitchLedLight(ArmHandle* h, int mode);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 LED 표시등 상태를 전환합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.mode : int , LED 스위치 값입니다. 0 이 아니면 켜짐, 0 이면 꺼짐을 의미합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_Estop
c
int Arm_Info_Estop(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 비상 정지를 트리거합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_ServoReset
c
int Arm_Info_ServoReset(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 서보 상태를 리셋합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_GetOpMode
c
int Arm_Info_GetOpMode(ArmHandle* h, int* outMode);| 항목 | 설명 |
|---|---|
| 설명 | 현재 조작 모드를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outMode : int* , 모드 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_GetCtrlStatus
c
int Arm_Info_GetCtrlStatus(ArmHandle* h, int* outStatus);| 항목 | 설명 |
|---|---|
| 설명 | 컨트롤러 실행 상태를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outStatus : int* , 상태 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_GetRobotStatus
c
int Arm_Info_GetRobotStatus(ArmHandle* h, int* outStatus);| 항목 | 설명 |
|---|---|
| 설명 | 로봇 실행 상태를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outStatus : int* , 상태 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_GetServoStatus
c
int Arm_Info_GetServoStatus(ArmHandle* h, int* outStatus);| 항목 | 설명 |
|---|---|
| 설명 | 서보 상태를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outStatus : int* , 상태 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_ServoOn
c
int Arm_Info_ServoOn(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 서보 전원을 켭니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_ServoOff
c
int Arm_Info_ServoOff(ArmHandle* h);| 항목 | 설명 |
|---|---|
| 설명 | 서보 전원을 끕니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_GetSoftMode
c
int Arm_Info_GetSoftMode(ArmHandle* h, int* outMode);| 항목 | 설명 |
|---|---|
| 설명 | 현재 소프트 모드를 읽습니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.outMode : int* , 모드 출력 포인터입니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_SetSoftMode
c
int Arm_Info_SetSoftMode(ArmHandle* h, int mode);| 항목 | 설명 |
|---|---|
| 설명 | 현재 소프트 모드를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.mode : int , 대상 소프트 모드 값이며 Arm_Info_GetSoftMode() 반환값과 같은 값을 사용합니다. |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
Arm_Info_SetOpMode
c
int Arm_Info_SetOpMode(ArmHandle* h, int mode);| 항목 | 설명 |
|---|---|
| 설명 | 현재 조작 모드를 설정합니다. |
| 요청 파라미터 | h : ArmHandle* , C99 세션 핸들이며 일반적으로 Arm_Create() 에서 생성합니다. 비즈니스 인터페이스는 먼저 연결에 성공해야 합니다.mode : int , 대상 조작 모드입니다. 1=AUTO , 2=MANUAL_LIMIT , 3=MANUAL |
| 반환값 | STATUS_CODE 정수값입니다. 0 은 성공을 의미하며, 그 외 값은 상태 코드에 따라 처리합니다. |
함수 그룹
| 그룹 | 함수 | 설명 |
|---|---|---|
| 기본 정보 | Arm_Info_GetControllerVersion / Arm_Info_GetArmModelInfo | 버전 및 모델 문자열을 읽습니다. |
| 상태 조회 | Arm_Info_GetCtrlStatus / Arm_Info_GetRobotStatus / Arm_Info_GetServoStatus | 실행 상태를 읽습니다. |
| 모드 읽기/쓰기 | Arm_Info_GetSoftMode / Arm_Info_SetSoftMode / Arm_Info_GetOpMode / Arm_Info_SetOpMode | 모드를 읽거나 전환합니다. |
| 제어 동작 | Arm_Info_SwitchLedLight / Arm_Info_Estop / Arm_Info_ServoReset / Arm_Info_ServoOn / Arm_Info_ServoOff | 컨트롤러 또는 로봇 상태를 변경합니다. |
| 권한 keepalive | Arm_Info_AcquireAccess / Arm_Info_ReleaseAccess | 산업 현장에서 PC 제어권을 유지합니다. |
파라미터 및 반환
| 항목 | 규칙 |
|---|---|
| 문자열 출력 | outVersion / outModel 은 비어 있으면 안 되며, bufSize 는 0 보다 커야 합니다. |
| 버퍼 부족 | BUFFER_TOO_SMALL 을 반환합니다. |
| 상태 출력 | outStatus / outMode 는 비어 있으면 안 됩니다. |
| 모드 값 | 1=AUTO , 2=MANUAL_LIMIT , 3=MANUAL ; Arm_Info_SetOpMode() 에 0=UNKNOWN 을 전달하면 UNSUPPORTED_PARAMETER 를 반환합니다. |
| 동작형 인터페이스 | LED, 비상 정지, 서보, 모드 쓰기는 현장 상태를 변경합니다. |
AcquireAccess / ReleaseAccess | 반환값이 없으며 일반적으로 keepalive 작업의 시작과 종료로 사용합니다. |
사용 전제 및 제어권
| 시나리오 | 설명 |
|---|---|
| 조회 인터페이스가 연결되지 않음 | 오류 코드를 반환하고, 문자열 출력은 비어 있으며, 상태 또는 모드 출력은 호출자가 제어 가능한 값을 유지합니다. |
| 제어 인터페이스가 연결되지 않음 | 오류 코드를 반환합니다. |
Arm_Info_AcquireAccess() | 제어권 keepalive를 시작합니다. 반복 호출 시 기존 keepalive 작업을 먼저 해제하며 keepalive 주기는 2000ms 입니다. |
Arm_Info_ReleaseAccess() | 제어권 keepalive를 중지합니다. keepalive가 시작되지 않은 상태에서도 직접 호출할 수 있습니다. |
| 연결 해제 또는 핸들 폐기 | 현재 세션의 제어권 keepalive를 종료합니다. |
연결 후에는 컨트롤러 버전, 로봇 모델, 현재 모드를 먼저 읽은 뒤 모드 쓰기, 서보, LED 또는 비상 정지 같은 동작형 인터페이스를 실행하는 것이 좋습니다. Arm_Info_AcquireAccess() 는 산업용 로봇의 PC 모드 keepalive에 자주 사용되며, 협동 로봇에서는 일반적으로 호출할 필요가 없습니다.
최소 호출 예제
c
#include <stdio.h> // 버전과 상태 출력을 위해 printf를 포함합니다.
#include "c_arm_api.h" // C99 SDK 최상위 헤더를 포함합니다.
int main(void) // 예제 프로그램 진입점
{ // 예제 main 함수 시작
ArmHandle* h = Arm_Create(); // C99 세션 핸들을 생성합니다.
char version[128] = {0}; // 컨트롤러 버전 버퍼를 준비합니다.
int servoStatus = 0; // 서보 상태 출력 변수를 준비합니다.
if (h == NULL) { // 핸들 생성 실패 여부를 확인합니다.
return 1; // 생성 실패 시 종료합니다.
} // 핸들 검사 종료
if (Arm_Connect(h, "10.27.1.2", "10.27.1.102") != 0) { // 컨트롤러에 연결합니다.
Arm_Destroy(h); // 연결 실패 시 핸들을 해제합니다.
return 1; // 오류를 반환합니다.
} // 연결 검사 종료
int versionRet = Arm_Info_GetControllerVersion(h, version, sizeof(version)); // 컨트롤러 버전을 읽습니다.
int statusRet = Arm_Info_GetServoStatus(h, &servoStatus); // 서보 상태를 읽습니다.
printf("version=%s servo=%d\n", version, servoStatus); // 읽기 결과를 출력합니다.
Arm_Disconnect(h); // 연결을 해제합니다.
Arm_Destroy(h); // 핸들을 폐기합니다.
return versionRet == 0 && statusRet == 0 ? 0 : 1; // 조회 결과에 따라 반환합니다.
} // 예제 main 함수 종료시나리오 예제
버전, 모델 및 상태 읽기
c
char version[128] = {0}; // 버전 출력 버퍼를 준비합니다.
char model[128] = {0}; // 모델 출력 버퍼를 준비합니다.
int ctrlStatus = 0; // 컨트롤러 상태 출력 변수를 준비합니다.
int robotStatus = 0; // 로봇 상태 출력 변수를 준비합니다.
int servoStatus = 0; // 서보 상태 출력 변수를 준비합니다.
int versionRet = Arm_Info_GetControllerVersion(h, version, sizeof(version)); // 컨트롤러 버전을 읽습니다.
int modelRet = Arm_Info_GetArmModelInfo(h, model, sizeof(model)); // 로봇 모델을 읽습니다.
int ctrlRet = Arm_Info_GetCtrlStatus(h, &ctrlStatus); // 컨트롤러 상태를 읽습니다.
int robotRet = Arm_Info_GetRobotStatus(h, &robotStatus); // 로봇 상태를 읽습니다.
int servoRet = Arm_Info_GetServoStatus(h, &servoStatus); // 서보 상태를 읽습니다.
(void)versionRet; // 예제에서 버전 조회 상태 코드를 유지합니다.
(void)modelRet; // 예제에서 모델 조회 상태 코드를 유지합니다.
(void)ctrlRet; // 예제에서 컨트롤러 상태 코드를 유지합니다.
(void)robotRet; // 예제에서 로봇 상태 코드를 유지합니다.
(void)servoRet; // 예제에서 서보 상태 코드를 유지합니다.모드 읽기/쓰기
c
int softMode = 0; // 소프트 모드 출력 변수를 준비합니다.
int opMode = 0; // 조작 모드 출력 변수를 준비합니다.
int getSoftRet = Arm_Info_GetSoftMode(h, &softMode); // 소프트 모드를 읽습니다.
int getOpRet = Arm_Info_GetOpMode(h, &opMode); // 조작 모드를 읽습니다.
/* int setSoftRet = Arm_Info_SetSoftMode(h, softMode); */ // 소프트 모드 쓰기는 제어 상태를 변경하므로 확인 후 실행합니다.
/* int setOpRet = Arm_Info_SetOpMode(h, opMode); */ // 조작 모드 쓰기는 제어 상태를 변경하므로 확인 후 실행합니다.
(void)getSoftRet; // 예제에서 소프트 모드 조회 상태 코드를 유지합니다.
(void)getOpRet; // 예제에서 조작 모드 조회 상태 코드를 유지합니다.제어 동작
c
Arm_Info_AcquireAccess(h); // SDK 제어 권한을 획득하거나 유지합니다.
/* int ledRet = Arm_Info_SwitchLedLight(h, 1); */ // LED 전환은 현장 표시를 변경하므로 확인 후 실행합니다.
/* int resetRet = Arm_Info_ServoReset(h); */ // 서보 리셋은 장비 상태를 변경하므로 확인 후 실행합니다.
/* int servoOnRet = Arm_Info_ServoOn(h); */ // 서보 전원 켜기는 장비 상태를 변경하므로 확인 후 실행합니다.
/* int servoOffRet = Arm_Info_ServoOff(h); */ // 서보 전원 끄기는 장비 상태를 변경하므로 확인 후 실행합니다.
/* int estopRet = Arm_Info_Estop(h); */ // 비상 정지는 동작형 인터페이스이므로 확인 후 실행합니다.
Arm_Info_ReleaseAccess(h); // SDK 제어 권한을 해제합니다.예제 코드
cpp
#include <stdio.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_info] 创建句柄失败 / 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_info] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
Arm_Destroy(handle);
return 1;
}
printf("[c99_info] 机器人连接成功 / Robot connected successfully\n");
// [ZH] 读取控制器版本与机械臂型号。
// [EN] Read the controller version and robot model.
char version[128] = {0};
char model[128] = {0};
ret = Arm_Info_GetControllerVersion(handle, version, sizeof(version));
printf("[c99_info] GetControllerVersion 状态码 / GetControllerVersion status code: %d, 版本 / Version: %s\n", ret, version);
ret = Arm_Info_GetArmModelInfo(handle, model, sizeof(model));
printf("[c99_info] GetArmModelInfo 状态码 / GetArmModelInfo status code: %d, 型号 / Model: %s\n", ret, model);
// [ZH] 获取并归还 SDK 控制权限。
// [EN] Acquire and release the SDK control access.
Arm_Info_AcquireAccess(handle);
printf("[c99_info] 已获取控制权 / SDK access acquired\n");
Arm_Info_ReleaseAccess(handle);
printf("[c99_info] 已归还控制权 / SDK access released\n");
// [ZH] 顺序读取全部状态类接口。
// [EN] Read all status-oriented APIs in sequence.
int opMode = 0;
int ctrlStatus = 0;
int robotStatus = 0;
int servoStatus = 0;
int softMode = 0;
ret = Arm_Info_GetOpMode(handle, &opMode);
printf("[c99_info] GetOpMode 状态码 / GetOpMode status code: %d, 操作模式 / Operation mode: %d\n", ret, opMode);
ret = Arm_Info_GetCtrlStatus(handle, &ctrlStatus);
printf("[c99_info] GetCtrlStatus 状态码 / GetCtrlStatus status code: %d, 控制器状态 / Controller status: %d\n", ret, ctrlStatus);
ret = Arm_Info_GetRobotStatus(handle, &robotStatus);
printf("[c99_info] GetRobotStatus 状态码 / GetRobotStatus status code: %d, 机器人状态 / Robot status: %d\n", ret, robotStatus);
ret = Arm_Info_GetServoStatus(handle, &servoStatus);
printf("[c99_info] GetServoStatus 状态码 / GetServoStatus status code: %d, 伺服状态 / Servo status: %d\n", ret, servoStatus);
ret = Arm_Info_GetSoftMode(handle, &softMode);
printf("[c99_info] GetSoftMode 状态码 / GetSoftMode status code: %d, 软模式 / Soft mode: %d\n", ret, softMode);
// [ZH] 顺序执行全部写接口与动作接口。
// [EN] Execute all setter APIs and action APIs in sequence.
ret = Arm_Info_SetSoftMode(handle, softMode);
printf("[c99_info] SetSoftMode 状态码 / SetSoftMode status code: %d\n", ret);
ret = Arm_Info_SetOpMode(handle, opMode);
printf("[c99_info] SetOpMode 状态码 / SetOpMode status code: %d\n", ret);
ret = Arm_Info_SwitchLedLight(handle, 1);
printf("[c99_info] SwitchLedLight 状态码 / SwitchLedLight status code: %d\n", ret);
ret = Arm_Info_ServoOn(handle);
printf("[c99_info] ServoOn 状态码 / ServoOn status code: %d\n", ret);
ret = Arm_Info_ServoOff(handle);
printf("[c99_info] ServoOff 状态码 / ServoOff status code: %d\n", ret);
ret = Arm_Info_ServoReset(handle);
printf("[c99_info] ServoReset 状态码 / ServoReset status code: %d\n", ret);
ret = Arm_Info_Estop(handle);
printf("[c99_info] Estop 状态码 / Estop status code: %d\n", ret);
// [ZH] 断开连接并销毁句柄。
// [EN] Disconnect and destroy the handle.
Arm_Disconnect(handle);
Arm_Destroy(handle);
printf("[c99_info] 示例结束 / Example finished\n");
return 0;
}c
#include <stdio.h>
#include "c_arm_api.h"
int main(void)
{
// [ZH] 本示例使用 MinGW/GCC 直接调用 C99 接口,并通过 libAgilebotCppSdk.dll.a 链接 DLL。
// [EN] This example uses MinGW/GCC to call the C99 API directly and links the DLL through libAgilebotCppSdk.dll.a.
const char* controller_ip = "10.27.1.2";
const char* teach_panel_ip = "10.27.1.102";
int ret = 0;
ArmHandle* handle = Arm_Create();
if (handle == NULL) {
printf("[gcc_capi_info_read] 创建句柄失败 / Failed to create handle\n");
return 1;
}
// [ZH] 连接前先查询一次状态,便于确认 import library、DLL 与基础句柄函数都可用。
// [EN] Query once before connecting to validate the import library, DLL, and basic handle APIs.
printf("[gcc_capi_info_read] 连接前状态 / State before connect: %d\n", Arm_IsConnected(handle));
ret = Arm_Connect(handle, controller_ip, teach_panel_ip);
if (ret != 0) {
printf("[gcc_capi_info_read] 连接失败 / Connect failed, 状态码 / Status code: %d\n", ret);
Arm_Destroy(handle);
return 1;
}
printf("[gcc_capi_info_read] 连接后状态 / State after connect: %d\n", Arm_IsConnected(handle));
// [ZH] 只调用读接口,适合作为客户 MinGW 环境的低风险联调模板。
// [EN] Only read APIs are used, making this a low-risk integration template for customer MinGW environments.
char version[128] = {0};
ret = Arm_Info_GetControllerVersion(handle, version, sizeof(version));
printf("[gcc_capi_info_read] GetControllerVersion 状态码 / Status code: %d, 版本 / Version: %s\n", ret, version);
char model[128] = {0};
ret = Arm_Info_GetArmModelInfo(handle, model, sizeof(model));
printf("[gcc_capi_info_read] GetArmModelInfo 状态码 / Status code: %d, 型号 / Model: %s\n", ret, model);
int op_mode = 0;
ret = Arm_Info_GetOpMode(handle, &op_mode);
printf("[gcc_capi_info_read] GetOpMode 状态码 / Status code: %d, 操作模式 / Operation mode: %d\n", ret, op_mode);
int ctrl_status = 0;
ret = Arm_Info_GetCtrlStatus(handle, &ctrl_status);
printf("[gcc_capi_info_read] GetCtrlStatus 状态码 / Status code: %d, 控制器状态 / Controller status: %d\n", ret, ctrl_status);
int robot_status = 0;
ret = Arm_Info_GetRobotStatus(handle, &robot_status);
printf("[gcc_capi_info_read] GetRobotStatus 状态码 / Status code: %d, 机器人状态 / Robot status: %d\n", ret, robot_status);
int servo_status = 0;
ret = Arm_Info_GetServoStatus(handle, &servo_status);
printf("[gcc_capi_info_read] GetServoStatus 状态码 / Status code: %d, 伺服状态 / Servo status: %d\n", ret, servo_status);
int soft_mode = 0;
ret = Arm_Info_GetSoftMode(handle, &soft_mode);
printf("[gcc_capi_info_read] GetSoftMode 状态码 / Status code: %d, 软模式 / Soft mode: %d\n", ret, soft_mode);
// [ZH] 清理连接与句柄。
// [EN] Clean up connection and handle.
Arm_Disconnect(handle);
printf("[gcc_capi_info_read] 断开后状态 / State after disconnect: %d\n", Arm_IsConnected(handle));
Arm_Destroy(handle);
printf("[gcc_capi_info_read] 示例结束 / Example finished\n");
return 0;
}