manage_access_control (수동 모드)

이 절에서는 수동(교시) 작업에서 manage_access_control을 사용하는 방법을 설명합니다. 이 함수는 제어권(Control Authority)을 요청하거나 다른 클라이언트의 제어권 요청에 응답합니다. 이를 통해 한 번에 하나의 클라이언트(PC, HMI 또는 외부 장치)만 로봇에 명령을 보낼 수 있습니다.
수동 모드에서는 주로 조그나 모션 명령을 실행하기 전에 권한을 얻을 때 사용합니다.

일반적인 사용법

  • 수동 모션이나 설정 작업을 하기 전에 제어권을 요청합니다.

  • 교시를 마친 뒤에는 제어권 요청에 MANAGE_ACCESS_CONTROL_RESPONSE_YES로 응답해 다른 클라이언트(예: 티치펜던트)가 제어권을 가져갈 수 있게 합니다.

  • 여러 클라이언트가 같은 로봇 컨트롤러에 연결되어 있으면 제어권을 확인합니다.

참고

  • 한 번에 하나의 컨트롤러 세션만 제어권을 가질 수 있습니다.

  • 수동(교시) 모드에서 대부분의 모션 명령이나 설정 명령을 실행하려면 먼저 제어권이 있어야 합니다.

  • 제어권은 요청이 있을 때만 넘어갑니다. 다른 클라이언트(예: 티치펜던트)가 제어권을 요청하면, 제어권을 가진 클라이언트는 TOnMonitoringAccessControlCB로 MONITORING_ACCESS_CONTROL_REQUEST를 받습니다. 다른 클라이언트가 MANAGE_ACCESS_CONTROL_REQUEST를 보내면, 제어권을 가진 클라이언트가 manage_access_control(MANAGE_ACCESS_CONTROL_RESPONSE_YES)로 응답해야만 제어권이 넘어갑니다. 이때 요청한 클라이언트는 GRANT를, 제어권을 가졌던 클라이언트는 LOSS를 받습니다. 제어권을 가진 클라이언트가 MANAGE_ACCESS_CONTROL_RESPONSE_NO로 응답하거나 응답하지 않으면 요청한 클라이언트는 제어권을 얻지 못하며, 첫 요청이 대기 중인 동안에는 이후 요청이 전달되지 않습니다. 요청 없이 제어권을 내려놓는 함수는 없습니다. manage_access_control은 요청을 보내는 즉시 반환하며, 결과는 나중에 TOnMonitoringAccessControlCB로 전달됩니다. 애플리케이션이 티치펜던트에 제어권을 넘겨야 한다면 REQUEST에 RESPONSE_YES로 응답하세요. MANAGE_ACCESS_CONTROL_FORCE_REQUEST를 보낸 클라이언트는 응답 없이 제어권을 가져갑니다. 프로세스 버튼 모드가 아니면, 제어권이 넘어갈 때 컨트롤러가 로봇을 정지(SS1)하고 서보를 끕니다. 원격 제어 모드(Remote Control Mode), 초기화 중, 복구 모드나 백드라이브 모드, 설정(configure) 모드에서는 컨트롤러가 제어권 이전을 거부합니다.

  • 컨트롤러는 제어권이 없는 클라이언트의 요청을 get_system_version, get_safety_configuration, setup_monitoring_version을 제외하고 모두 무시합니다. 제어권이 없는 클라이언트도 모니터링 데이터, 상태 콜백, 알람 콜백은 받습니다. 위치와 상태 정보는 모니터링 getter 함수(get_current_posj, get_robot_state, …)로 확인하세요.

예제: 로봇 제어권 요청하기

#include <atomic>
#include <chrono>
#include <thread>

// 제어권 콜백 함수에서 설정
std::atomic<bool> g_bHasControl{false};

void OnAccessControl(const MONITORING_ACCESS_CONTROL eAccess)
{
    if (eAccess == MONITORING_ACCESS_CONTROL_GRANT)
        g_bHasControl = true;
    else if (eAccess == MONITORING_ACCESS_CONTROL_LOSS)
        g_bHasControl = false;
}

// 사전 조건:
// - drfl.set_on_monitoring_access_control(OnAccessControl) 등록 완료
// - 연결 완료(open_connection)
// - 수동(교시) 모드 활성

// 1) 로봇을 수동으로 조작하기 위해 제어권 요청
if (drfl.manage_access_control(MANAGE_ACCESS_CONTROL_REQUEST))
    printf("[Access Control] Request sent; waiting for GRANT.\n");
else {
    printf("[Access Control] Request was not sent.\n");
    return -1;
}

// 이동하기 전에 MONITORING_ACCESS_CONTROL_GRANT를 최대 10 s 동안 대기
for (int i = 0; i < 1000 && !g_bHasControl; ++i)
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
if (!g_bHasControl) {
    printf("[Access Control] Control was not granted.\n");
    return -1;
}

// 2) 간단한 수동 이동 또는 교시 작업 실행
float qTarget[6] = {0, -30, 90, 0, 90, 0};
drfl.movej(qTarget, 50, 50);

// 모션이 완료될 때까지 대기
while (drfl.check_motion() != 0)
    std::this_thread::sleep_for(std::chrono::milliseconds(100));

// 3) 제어권은 이 클라이언트가 다른 클라이언트의 요청에
//    MANAGE_ACCESS_CONTROL_RESPONSE_YES로 응답하거나,
//    다른 클라이언트가 MANAGE_ACCESS_CONTROL_FORCE_REQUEST를 보낼 때까지 유지됩니다
//    (TOnMonitoringAccessControlCB 참고).

팁

  • 수동 모드나 자동 모드에서 모션을 실행하기 전에 반드시 manage_access_control(MANAGE_ACCESS_CONTROL_REQUEST)를 호출해야 합니다.

  • 여러 클라이언트가 연결되어 있으면 하나의 클라이언트만 독점 제어권을 가질 수 있습니다.

  • 제어권은 갱신할 필요가 없습니다. 제어권을 가진 클라이언트는 요청에 MANAGE_ACCESS_CONTROL_RESPONSE_YES로 응답하거나 다른 클라이언트가 MANAGE_ACCESS_CONTROL_FORCE_REQUEST로 가져갈 때까지 제어권을 유지합니다.

  • 제어권 변경(GRANT, LOSS, REQUEST, DENY)은 TOnMonitoringAccessControlCB로 전달됩니다.