RAPID 코드로 ABB 로봇의 그립 제어 구현하기 / 산업용 로봇의 디지털 입력/출력 제어: RAPID 코드 분석 / RAPID 언어로 무한 루프와 조건문을 활용한 로봇 제어 시스템 / RAPID 프로그래밍으로 로봇의 포지션과 오프셋 제어하기

2024. 7. 22. 18:55충남 인력개발원

I/O 할당표

MODULE MainModule
    ! 로봇의 포지션 정의
    CONST robtarget p10:=[[-9.62,-459.24,16.56],[0.00128106,-0.0686242,-0.997621,0.00648762],[-2,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    ! p10 포지션 정의: 로봇이 이동할 좌표와 방향 정보 포함
    CONST robtarget p20:=[[451.19,-437.62,454.15],[0.00131833,-0.0685305,-0.997627,0.00646952],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    ! p20 포지션 정의: 로봇이 이동할 좌표와 방향 정보 포함
    CONST robtarget p30:=[[609.77,-441.42,351.66],[0.00131783,-0.0685027,-0.997629,0.00645476],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    ! p30 포지션 정의: 로봇이 이동할 좌표와 방향 정보 포함

    PROC main()
        ! 로봇 가속도 설정
        AccSet 1, 1;
        ! 가속도를 설정하는 명령어로, 첫 번째 매개변수는 속도 계수, 두 번째 매개변수는 가속도 계수를 의미합니다.
        WHILE TRUE DO
            ! 무한 루프 시작
            ! 특정 디지털 입력 신호가 1일 때, 작업 수행
            IF di02_ma_none=1 THEN
                ! 디지털 입력 신호 di02_ma_none가 1인지 확인
                put_ma;
                ! 물체 이동 함수 호출
                PulseDO\\PLength:=0.2, do02_plcstart;
                ! 디지털 출력 신호 do02_plcstart를 0.2초 동안 펄스 신호로 출력
            ENDIF
            
            ! 2초 동안 대기
            WaitTime 2;
        ENDWHILE
    ENDPROC

    ! 그립을 닫는 함수
    PROC gripon()
        PulseDO\\PLength:=0.2, do00;
        ! 디지털 출력 신호 do00을 0.2초 동안 펄스 신호로 출력
        WaitDI di00_griponsen, 1;
        ! 디지털 입력 신호 di00_griponsen가 1이 될 때까지 대기
    ENDPROC

    ! 그립을 여는 함수
    PROC gripoff()
        PulseDO\\PLength:=0.2, do01;
        ! 디지털 출력 신호 do01을 0.2초 동안 펄스 신호로 출력
        WaitDI di01_gripoffsen, 1;
        ! 디지털 입력 신호 di01_gripoffsen가 1이 될 때까지 대기
    ENDPROC

    ! 물체를 잡고 놓는 함수
    PROC put_ma()
        VAR num x_pos:=0;
        VAR num y_pos:=0;
        ! x_pos와 y_pos 변수를 0으로 초기화
        
        FOR CT1 FROM 1 TO 2 DO
            ! CT1 변수로 1부터 2까지 반복
            FOR CT FROM 1 TO 3 DO
                ! CT 변수로 1부터 3까지 반복
                MoveJ Offs(p10,x_pos,y_pos,50), v200, z20, tool_khj;
                ! 조인트 이동 명령어로, p10 위치에서 x_pos, y_pos, 50 오프셋으로 이동
                MoveL Offs(p10,x_pos,y_pos,0), v20, fine, tool_khj;
                ! 선형 이동 명령어로, p10 위치에서 x_pos, y_pos, 0 오프셋으로 이동
                gripon;
                ! 그립을 닫는 함수 호출
                MoveL Offs(p10,x_pos,y_pos,50), v100, z20, tool_khj;
                ! 선형 이동 명령어로, p10 위치에서 x_pos, y_pos, 50 오프셋으로 이동
                MoveJ p20, v200, z40, tool_khj;
                ! 조인트 이동 명령어로, p20 위치로 이동
                MoveJ Offs(p30,0,0,50), v200, z20, tool_khj;
                ! 조인트 이동 명령어로, p30 위치에서 0,0,50 오프셋으로 이동
                MoveL p30, v20, fine, tool_khj;
                ! 선형 이동 명령어로, p30 위치로 이동
                gripoff;
                ! 그립을 여는 함수 호출
                MoveL Offs(p30,0,0,50), v200, z20, tool_khj;
                ! 선형 이동 명령어로, p30 위치에서 0,0,50 오프셋으로 이동
                MoveJ p20, v200, z40, tool_khj;
                ! 조인트 이동 명령어로, p20 위치로 이동
                x_pos := x_pos+110;
                ! x_pos 값을 110만큼 증가
            ENDFOR
            x_pos:=0;
            ! x_pos 값을 0으로 초기화
            y_poS:=y_pos-110;
            ! y_pos 값을 110만큼 감소
        ENDFOR
    ENDPROC
ENDMODULE

I/O System 의 Signal 부분에 new signal로 새롭게 생성하여 받아와야하는 Signal 데이터들을 정의해 줍니다.
사용한 plc 래더 코드입니다
한공간에 여러대의 ABB 로봇을 모아놓고 작업하는 환경이다 보니 여러개의 어드레스가 있어 정확하게 맞는 어드레스로 넣어줬어야 했습니다.

 

파리미터세팅에서도 동일하게 맞춰주는게 중요합니다.

주요 함수와 명령어 해석

  1. CONST robtarget: 로봇이 이동할 위치를 정의합니다. 좌표와 방향(쿼터니언), 기타 로봇 상태 정보가 포함됩니다.
  2. PROC main(): 메인 프로시저로, 로봇의 주 동작을 정의합니다.
  3. AccSet 1, 1: 로봇의 속도와 가속도를 설정합니다. 첫 번째 매개변수는 속도 계수, 두 번째 매개변수는 가속도 계수입니다.
  4. WHILE TRUE DO: 무한 루프를 시작합니다.
  5. IF di02_ma_none=1 THEN: 디지털 입력 신호 di02_ma_none가 1인지 확인합니다. 로봇의 특정 상태나 외부 센서 상태를 확인하는 데 사용됩니다.
  6. put_ma: put_ma 프로시저를 호출하여 물체 이동 작업을 수행합니다.
  7. PulseDO\\PLength:=0.2, do02_plcstart: 디지털 출력 신호 do02_plcstart를 0.2초 동안 펄스 신호로 출력합니다. 외부 장치나 PLC와의 인터페이스에 사용됩니다.
  8. WaitTime 2: 2초 동안 대기합니다.
  9. PROC gripon(): 그립을 닫는 동작을 수행하는 프로시저입니다.
  10. PulseDO\\PLength:=0.2, do00: 디지털 출력 신호 do00을 0.2초 동안 펄스 신호로 출력합니다.
  11. WaitDI di00_griponsen, 1: 디지털 입력 신호 di00_griponsen가 1이 될 때까지 대기합니다.
  12. PROC gripoff(): 그립을 여는 동작을 수행하는 프로시저입니다.
  13. PulseDO\\PLength:=0.2, do01: 디지털 출력 신호 do01을 0.2초 동안 펄스 신호로 출력합니다.
  14. WaitDI di01_gripoffsen, 1: 디지털 입력 신호 di01_gripoffsen가 1이 될 때까지 대기합니다.
  15. PROC put_ma(): 물체를 이동하는 작업을 수행하는 프로시저입니다.
  16. MoveJ: 조인트 이동 명령어로, 로봇의 조인트를 특정 위치로 이동시킵니다.
  17. MoveL: 선형 이동 명령어로, 로봇의 엔드 이펙터를 직선 경로를 따라 이동시킵니다.
  18. Offs(p10,x_pos,y_pos,50): p10 위치에서 x_pos, y_pos, 50 만큼 오프셋된 위치로 이동합니다.
  19. gripon 및 gripoff: 그립을 여닫는 동작을 수행하는 프로시저 호출입니다.

이와 같은 코드 구조와 주석을 통해 각 명령줄이 어떤 동작을 수행하는지, 그리고 그 사용된 함수가 어떤 기능을 하는지를 이해할 수 있습니다.


코드 구동 영상입니다.

과제

로봇이 6개 바닥 플레이트에서 공작물 6개를 매거진에 투입한다. 로봇은 6개 투입 후 PLC로 시작 신호를 전송한다. PLC는 센서를 이용하여 각 공작물을 분류하고, 금속 -> 적색 흰비금속 -> 황색 검비금속 -> 녹색 경광등을 점등한다. 컨베이어 위에는 1개의 공작물만 있어야 한다. (로봇이 컨베이어 끝단에 위치한 공작물을 들어 올린 이후 재 공급이 이뤄진다.) 로봇은 들어올린 공작물에 대한 정보를 PLC로부터 전달 받아 3개의 박스에 구분하여 저장한다.

rapid코드 복사
MODULE MainModule
    CONST robtarget p10:=[[-9.62,-459.24,16.56],[0.00128106,-0.0686242,-0.997621,0.00648762],[-2,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget p20:=[[451.19,-437.62,454.15],[0.00131833,-0.0685305,-0.997627,0.00646952],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget p30:=[[616.21,-453.61,365.34],[0.0012864,-0.0685252,-0.997628,0.00646458],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    VAR robtarget pPlate1:=[[-100,-500,100],[1,0,0,0],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pPlate2:=[[-100,-400,100],[1,0,0,0],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pPlate3:=[[-100,-300,100],[1,0,0,0],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pPlate4:=[[-100,-200,100],[1,0,0,0],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pPlate5:=[[-100,-100,100],[1,0,0,0],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pPlate6:=[[-100,0,100],[1,0,0,0],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    VAR robtarget pMagazine := [[600, -500, 200], [1,0,0,0], [-1,-1,-1,0], [9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pConveyorEnd := [[700, -500, 100], [1,0,0,0], [-1,-1,-1,0], [9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    VAR robtarget pMetalBox := [[800, -500, 200], [1,0,0,0], [-1,-1,-1,0], [9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pRedPlasticBox := [[900, -500, 200], [1,0,0,0], [-1,-1,-1,0], [9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    VAR robtarget pWhitePlasticBox := [[1000, -500, 200], [1,0,0,0], [-1,-1,-1,0], [9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    ! Digital Outputs
    PERS signaldo doPLCStart := 10;
    PERS signaldo doGripClose := 11;
    PERS signaldo doGripOpen := 12;
    PERS signaldo doSupplyNextPart := 13;

    ! Digital Inputs
    PERS signaldi diGripClosed := 20;
    PERS signaldi diGripOpened := 21;
    PERS signaldi diConveyorOccupied := 22;
    PERS signaldi di02_ma_none := 23;

    ! Analog Inputs
    PERS signald aiPartType := 30; ! Part type received from PLC

    PROC main()
        WHILE TRUE DO
            IF di02_ma_none = 1 THEN
                pick_and_place;
                PulseDO\\PLength:=0.2, doPLCStart;
            ENDIF
            WaitTime 2;
        ENDWHILE
    ENDPROC

    PROC gripon()
        PulseDO\\PLength:=0.2, doGripClose;
        WaitDI diGripClosed, 1;
    ENDPROC

    PROC gripoff()
        PulseDO\\PLength:=0.2, doGripOpen;
        WaitDI diGripOpened, 1;
    ENDPROC

    PROC pick_and_place()
        VAR num i;
        FOR i FROM 1 TO 6 DO
            pick_from_plate(i);
            place_into_magazine();
        ENDFOR
        PulseDO\\PLength:=0.2, doPLCStart; ! Send start signal to PLC after 6 parts are placed
    ENDPROC

    PROC pick_from_plate(num plateNumber)
        VAR robtarget pCurrentPlate;

        ! Determine the current plate position
        SELECT plateNumber
            CASE 1:
                pCurrentPlate := pPlate1;
            CASE 2:
                pCurrentPlate := pPlate2;
            CASE 3:
                pCurrentPlate := pPlate3;
            CASE 4:
                pCurrentPlate := pPlate4;
            CASE 5:
                pCurrentPlate := pPlate5;
            CASE 6:
                pCurrentPlate := pPlate6;
        ENDSELECT

        ! Move to plate position
        MoveJ pCurrentPlate, v200, z20, tool_gripper;
        gripon;
    ENDPROC

    PROC place_into_magazine()
        ! Move to magazine position
        MoveJ pMagazine, v200, z20, tool_gripper;
        gripoff;
    ENDPROC

    PROC handle_conveyor()
        WHILE TRUE DO
            IF DI(diConveyorOccupied) THEN
                sort_part();
                ! Wait until part is picked up
                WaitUntil NOT DI(diConveyorOccupied);
                ! Signal to supply next part
                PulseDO\\PLength:=0.2, doSupplyNextPart;
            ENDIF
            WaitTime 0.5; ! Polling interval
        ENDWHILE
    ENDPROC

    PROC sort_part()
        VAR num partType;

        ! Get part type from PLC
        partType := AI(aiPartType);

        ! Move to conveyor end to pick up the part
        MoveJ pConveyorEnd, v200, z20, tool_gripper;
        gripon;

        ! Sort part into the appropriate box
        SELECT partType
            CASE 1:
                MoveJ pMetalBox, v200, z20, tool_gripper;
            CASE 2:
                MoveJ pRedPlasticBox, v200, z20, tool_gripper;
            CASE 3:
                MoveJ pWhitePlasticBox, v200, z20, tool_gripper;
        ENDSELECT

        gripoff;
    ENDPROC
ENDMODULE

설명

  1. 로봇 위치 설정 (티칭 포인트): pPlate1부터 pPlate6까지 각 바닥 플레이트와 매거진, 컨베이어 끝단, 그리고 박스 위치를 설정했습니다.
  2. 주요 프로시저:
    • main: 주 루틴으로, di02_ma_none 신호가 1이 되면 pick_and_place 프로시저를 호출하고, 완료 후 PLC에 시작 신호를 전송합니다.
    • gripon 및 gripoff: 그리퍼를 열고 닫는 동작을 수행합니다.
    • pick_and_place: 6개의 바닥 플레이트에서 공작물을 집어 매거진에 투입합니다. 완료 후 PLC에 시작 신호를 전송합니다.
    • pick_from_plate: 지정된 바닥 플레이트에서 공작물을 집는 동작을 수행합니다.
    • place_into_magazine: 매거진에 공작물을 투입합니다.
    • handle_conveyor: 컨베이어에서 공작물을 처리합니다. (다음 단계로 넘어가면 이 부분이 호출됩니다)
    • sort_part: 컨베이어 끝단에서 공작물을 집어 종류에 따라 박스에 분류합니다.

로봇스튜디오 메뉴 분석

Network

  • 1200-510485 (1200-510485)
    • 현재 로봇 컨트롤러의 이름과 ID를 나타냅니다. 여기서 로봇의 설정과 상태를 관리할 수 있습니다.

HOME

  • 1200-510485.cfg: 로봇 시스템의 설정 파일입니다.
  • 1200-510485.log: 로봇 시스템의 로그 파일입니다.
  • BC_REPORT.log: 로봇 시스템의 보고서 로그 파일입니다.
  • GSDML: GSDML 파일은 필드버스 장치에 대한 설명 파일입니다.
  • kdj, linked_m.sys, NewProgram240308, RefCalibFiles, sis_log_appl171013, user.sys: 시스템 파일과 사용자 파일들이 저장되어 있습니다.

Configuration (설정)

  • Communication: 로봇의 통신 설정을 관리합니다.
  • Controller: 로봇 컨트롤러의 설정을 관리합니다.
  • I/O System: 로봇의 입출력 시스템을 관리합니다. 각종 센서와 액추에이터의 연결 및 설정을 관리할 수 있습니다.
  • Man-Machine Communication: 로봇과 인간 간의 통신 인터페이스를 관리합니다.
  • Motion: 로봇의 움직임 관련 설정을 관리합니다.

Event Log

  • 시스템 이벤트 로그를 관리하고, 발생한 이벤트들을 확인할 수 있습니다.

I/O System

  • 로봇의 입출력 시스템 상태를 실시간으로 확인할 수 있습니다.

RAPID

  • T_ROB1
    • Program Modules: RAPID 프로그래밍 모듈이 저장되는 곳입니다. 여기서 각 프로그램 모듈을 확인하고 편집할 수 있습니다.
      • gripoff: 그리퍼를 닫는 동작을 수행하는 프로시저가 포함된 모듈입니다.
      • gripon: 그리퍼를 여는 동작을 수행하는 프로시저가 포함된 모듈입니다.
      • main: 로봇의 주요 작업 흐름을 제어하는 메인 프로그램 모듈입니다.
      • put_ma: 공작물을 이동시키는 프로시저가 포함된 모듈입니다.
    • System Modules: 시스템 모듈로, 기본적인 시스템 설정과 관련된 모듈이 포함되어 있습니다.
      • BASE: 기본 시스템 설정 모듈입니다.
      • user: 사용자 설정 모듈입니다.

요약

  • Network: 로봇 컨트롤러와 시스템 파일을 관리합니다.
  • HOME: 설정 파일, 로그 파일, 시스템 파일 등을 관리합니다.
  • Configuration: 로봇의 통신, 컨트롤러, I/O 시스템, 인간-기계 통신, 움직임 설정을 관리합니다.
  • Event Log: 시스템 이벤트 로그를 확인하고 관리합니다.
  • I/O System: 로봇의 입출력 시스템을 실시간으로 모니터링합니다.
  • RAPID: 로봇의 프로그램 모듈과 시스템 모듈을 관리하고 편집합니다.

I/O 시스템 설정 항목

  1. Access Level
    • I/O 신호에 대한 접근 권한을 설정합니다. 예를 들어, 특정 사용자나 그룹만이 신호를 읽거나 쓸 수 있도록 제한할 수 있습니다.
  2. Cross Connection
    • I/O 신호 간의 교차 연결을 설정합니다. 이는 한 신호가 활성화될 때 다른 신호도 자동으로 활성화되도록 설정할 수 있습니다.
  3. Device Trust Level
    • 각 장치의 신뢰 수준을 설정합니다. 이는 특정 장치가 로봇 시스템과 통신할 수 있는 권한을 나타냅니다.
  4. DeviceNet Command
    • DeviceNet 네트워크에 연결된 장치에 대한 명령을 설정하고 관리합니다.
  5. DeviceNet Device
    • DeviceNet 네트워크에 연결된 장치들을 설정하고 관리합니다.
  6. DeviceNet Internal Device
    • DeviceNet 네트워크 내의 내부 장치들을 설정하고 관리합니다.
  7. EtherNet/IP Command
    • EtherNet/IP 네트워크에 연결된 장치에 대한 명령을 설정하고 관리합니다.
  8. EtherNet/IP Device
    • EtherNet/IP 네트워크에 연결된 장치들을 설정하고 관리합니다.
  9. Industrial Network
    • 다양한 산업 네트워크 설정을 관리합니다. 이는 로봇이 여러 네트워크와 통신할 수 있도록 하는 설정입니다.
  10. Route
    • I/O 신호의 경로를 설정합니다. 이는 신호가 시스템 내에서 어떻게 전달되는지를 정의합니다.
  11. Signal
    • 로봇과 외부 장치 간의 디지털 및 아날로그 신호를 설정합니다. 이는 로봇이 센서 및 액추에이터와 통신할 수 있도록 합니다.
  12. Signal Safe Level
    • 각 신호의 안전 수준을 설정합니다. 이는 특정 조건에서 신호가 어떻게 동작해야 하는지를 정의합니다.
  13. System Input
    • 시스템 입력 신호를 설정합니다. 이는 로봇이 외부 장치로부터 입력을 받을 때 사용됩니다.
  14. System Output
    • 시스템 출력 신호를 설정합니다. 이는 로봇이 외부 장치로 출력을 보낼 때 사용됩니다.