RAPID 코드로 ABB 로봇의 그립 제어 구현하기 / 산업용 로봇의 디지털 입력/출력 제어: RAPID 코드 분석 / RAPID 언어로 무한 루프와 조건문을 활용한 로봇 제어 시스템 / RAPID 프로그래밍으로 로봇의 포지션과 오프셋 제어하기
2024. 7. 22. 18:55ㆍ충남 인력개발원
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
주요 함수와 명령어 해석
- CONST robtarget: 로봇이 이동할 위치를 정의합니다. 좌표와 방향(쿼터니언), 기타 로봇 상태 정보가 포함됩니다.
- PROC main(): 메인 프로시저로, 로봇의 주 동작을 정의합니다.
- AccSet 1, 1: 로봇의 속도와 가속도를 설정합니다. 첫 번째 매개변수는 속도 계수, 두 번째 매개변수는 가속도 계수입니다.
- WHILE TRUE DO: 무한 루프를 시작합니다.
- IF di02_ma_none=1 THEN: 디지털 입력 신호 di02_ma_none가 1인지 확인합니다. 로봇의 특정 상태나 외부 센서 상태를 확인하는 데 사용됩니다.
- put_ma: put_ma 프로시저를 호출하여 물체 이동 작업을 수행합니다.
- PulseDO\\PLength:=0.2, do02_plcstart: 디지털 출력 신호 do02_plcstart를 0.2초 동안 펄스 신호로 출력합니다. 외부 장치나 PLC와의 인터페이스에 사용됩니다.
- WaitTime 2: 2초 동안 대기합니다.
- PROC gripon(): 그립을 닫는 동작을 수행하는 프로시저입니다.
- PulseDO\\PLength:=0.2, do00: 디지털 출력 신호 do00을 0.2초 동안 펄스 신호로 출력합니다.
- WaitDI di00_griponsen, 1: 디지털 입력 신호 di00_griponsen가 1이 될 때까지 대기합니다.
- PROC gripoff(): 그립을 여는 동작을 수행하는 프로시저입니다.
- PulseDO\\PLength:=0.2, do01: 디지털 출력 신호 do01을 0.2초 동안 펄스 신호로 출력합니다.
- WaitDI di01_gripoffsen, 1: 디지털 입력 신호 di01_gripoffsen가 1이 될 때까지 대기합니다.
- PROC put_ma(): 물체를 이동하는 작업을 수행하는 프로시저입니다.
- MoveJ: 조인트 이동 명령어로, 로봇의 조인트를 특정 위치로 이동시킵니다.
- MoveL: 선형 이동 명령어로, 로봇의 엔드 이펙터를 직선 경로를 따라 이동시킵니다.
- Offs(p10,x_pos,y_pos,50): p10 위치에서 x_pos, y_pos, 50 만큼 오프셋된 위치로 이동합니다.
- 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
설명
- 로봇 위치 설정 (티칭 포인트): pPlate1부터 pPlate6까지 각 바닥 플레이트와 매거진, 컨베이어 끝단, 그리고 박스 위치를 설정했습니다.
- 주요 프로시저:
- 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: 사용자 설정 모듈입니다.
- Program Modules: RAPID 프로그래밍 모듈이 저장되는 곳입니다. 여기서 각 프로그램 모듈을 확인하고 편집할 수 있습니다.
요약
- Network: 로봇 컨트롤러와 시스템 파일을 관리합니다.
- HOME: 설정 파일, 로그 파일, 시스템 파일 등을 관리합니다.
- Configuration: 로봇의 통신, 컨트롤러, I/O 시스템, 인간-기계 통신, 움직임 설정을 관리합니다.
- Event Log: 시스템 이벤트 로그를 확인하고 관리합니다.
- I/O System: 로봇의 입출력 시스템을 실시간으로 모니터링합니다.
- RAPID: 로봇의 프로그램 모듈과 시스템 모듈을 관리하고 편집합니다.
I/O 시스템 설정 항목
- Access Level
- 각 I/O 신호에 대한 접근 권한을 설정합니다. 예를 들어, 특정 사용자나 그룹만이 신호를 읽거나 쓸 수 있도록 제한할 수 있습니다.
- Cross Connection
- I/O 신호 간의 교차 연결을 설정합니다. 이는 한 신호가 활성화될 때 다른 신호도 자동으로 활성화되도록 설정할 수 있습니다.
- Device Trust Level
- 각 장치의 신뢰 수준을 설정합니다. 이는 특정 장치가 로봇 시스템과 통신할 수 있는 권한을 나타냅니다.
- DeviceNet Command
- DeviceNet 네트워크에 연결된 장치에 대한 명령을 설정하고 관리합니다.
- DeviceNet Device
- DeviceNet 네트워크에 연결된 장치들을 설정하고 관리합니다.
- DeviceNet Internal Device
- DeviceNet 네트워크 내의 내부 장치들을 설정하고 관리합니다.
- EtherNet/IP Command
- EtherNet/IP 네트워크에 연결된 장치에 대한 명령을 설정하고 관리합니다.
- EtherNet/IP Device
- EtherNet/IP 네트워크에 연결된 장치들을 설정하고 관리합니다.
- Industrial Network
- 다양한 산업 네트워크 설정을 관리합니다. 이는 로봇이 여러 네트워크와 통신할 수 있도록 하는 설정입니다.
- Route
- I/O 신호의 경로를 설정합니다. 이는 신호가 시스템 내에서 어떻게 전달되는지를 정의합니다.
- Signal
- 로봇과 외부 장치 간의 디지털 및 아날로그 신호를 설정합니다. 이는 로봇이 센서 및 액추에이터와 통신할 수 있도록 합니다.
- Signal Safe Level
- 각 신호의 안전 수준을 설정합니다. 이는 특정 조건에서 신호가 어떻게 동작해야 하는지를 정의합니다.
- System Input
- 시스템 입력 신호를 설정합니다. 이는 로봇이 외부 장치로부터 입력을 받을 때 사용됩니다.
- System Output
- 시스템 출력 신호를 설정합니다. 이는 로봇이 외부 장치로 출력을 보낼 때 사용됩니다.