Knowledge✍

FANUC-매크로 설명

이한~ 2022. 11. 18. 00:48
화낙(FANCU) 매크로

FANUC-매크로 설명

2016. 1. 14. 16:44

< 매크로 & G코드 > (화낙계열)

 

 

 Custom Macro A  G 코드로 되어 있다

 Custom Macro B  일반적인 매크로 (사용자 및 제작자)

 

 Pattern Data  일종의 대화형으로서 서브프로그램 형식으로 되어 있으며....

                         프로그램 번호는 고정 되어 있다

 Macro Executor  제작자가 작성해서 ROM 에 저장 한 것으로서 사용자가 볼수 없다 (F-ROM)

 Super CAP 

 

 

 

 

[1] 기본 개념

 

프로그램 이란 : NC 기계로 무언가 작업을 한다고 할 때 ..... 기계의 움직임을 제어하기 위해서

             NC 가 해석 가능한 명령어들을 적절히 배열 또는 편집해 놓은 명령어들의 집합체라 할수 있다

 

변수란 : I = 2 +7 ──→ 이 경우 I 값은 9 가 되지만..... I = 3 +5 하면 I 값은 8 이 된다.

이때, I 는 조건에 따라서 변하게 되는데 이러한 것을 변하는 수 라는 뜻으로서 변수 라 한다.

 

매크로에서 변수 지정은 숫자 앞에 샵 (#)을 붙이면 변수가 된다.

 

 #100 = 2 + 7 에서 #100 이 변수 이고 변수 뒤에는 점을 찍지 않는다.

 

 

[2] 변수의 종류

 

    (1) Local 변수 (지역변수) : 각각의 프로그램 내에서만 통용되는 변수로서 미리 지정되어 있으며.....

                        그 변수들은 다음과 같다

Local 변수(지역변수)
휘발성 기본: # ~ #33 -전원을 껐다 키면 그 값들이 지워 진다
-G65호출시 인수 대입 사용 가능

 

   (2) Common 변수 (공용변수) : 모든 프로그램 내에서 공통으로 쓰이는 변수로서

  이것들의 값을 바꾸면 다른 프로그램 에서도 자동적으로 바뀐 값으로 인식 된다

  이것역시 변수명은 미리 지정되어 있으며..... 그 변수들은 다음과 같다

Commom 변수(공용변수)
휘발성 기본: #100 ~ #149 전원을 껐다 키면 그 값들이 지워 진다
확장: #100 ~ #199
비휘발성 기본: #500 ~ #531 전원을 껐다가 켜도 그 값들이 남아 있다
확장: #500 ~ #999

   (3) System 변수 : NC 내부적으로 사용되는 변수로서 NC 컨트롤러 내부를 보면 아래 그림과 같이

 (비 휘발성) NC 파트와 PLC 파트로 나누어 지는데.....

 이때, NC 에서 PLC 로의 data 입출력에 있어서 사용되는 변수 이다

 이것역시 변수명은 미리 지정되어 있으며..... 그 변수들은 다음과 같다

 → #1000 ~ #1133 : 이것을 매크로에서 읽어 들이거나 쓰면서 사용 할 수 있다

 

 

 

 

Y 신호 : PLC 에서 기계로의 출력 Y 로 표시하며.... 솔래노이드, 램프, 모타 등에 쓰인다

 사용되는 변수는 없다

X 신호 : 기계에서 PLC 로의 입력 X 로 표시하며.... 센서, 푸쉬버튼 스위치 등에 쓰인다

 사용되는 변수는 없다

G 신호 : PLC 에서 NC 로의 출력은 G 로 표시하며.... (PLC 에서 매크로)

 #1000 ~ #1015 / #1032  한번에 16bit를 처리함

F 신호 : NC 에서 PLC 로의 입력은 F 로 표시하며.... (매크로 에서 PLC)

 #1100 ~ #1115 / #1132  한번에 16bit를 처리함 / #1133  한번에 32bit를 처리함

 

참고1) #0 : 이것은 항상 null 값 으로서 수학적 의미로는 공집합과 같으며... 값을 대입 할수 없다

 

참고2) 변수에 넣을수 있는 값의 범위는 -99999999 ~ +99999999 이내여야 한다

 위의 범위를 넘으면 P/S ALARM (NO.111) 알람이 뜬다.

참고3) 기타 시스템 변수

 

 

[3] NC 컨트롤러의 Type

 

 

 

 

 

 A-Type  C-type  G17, G18, G19 에 관계없이 Z축에 대해서만 길이보정 한다

 B-Type  G17, G18, G19 에 따라서 길이보정할 축이 달라진다

 A-Type, B-Type, C-type 에 따라서 파라메타 즉, 변수가 달라진다

   ⇒ 대부분은 C-type 이고..... 이때, 형상은 GEOM 이라 하고 마모는 WEAR 라 한다

       → 공구 옵셋량이 저장되는 변수는 #2000 ~ 이다

 

 #2000 번대 시스템 변수 

 

 

[4] 프로그램 호출

 

      ⇒ 보통은 어떠한 작업을 할때 하나의 프로그램 내에서 처리하게 되는데.....

         더러는 하나의 프로그램을 실행하고 있는 상태에서 또다른 프로그램을 실행할 필요가 있다

         이런 경우 주된 프로그램과 보조적인 프로그램이 있기 마련인데.....

         여기서 주된 프로그램을 Main-Program 이라 하고 보조적인 프로그램을 Sub-Program 이라 한다

 Main-Program 에서 Sub-Program 을 실행 시킬때 이것을 프로그램 호출 이라 한다.

 

(1) M98 : 단순호출 로서 반복횟수를 지정 할수 있다.

 

메인 프로그램 샘플 서브 프로그램 샘플
O1234
G90 G54 G0 X0. Y0. Z10.
S15000 M3(Speed:1500RPM, 정회전)
M98 P0002 L1 ──→ O0002.nc 파일을 1번 호출
G55 G0 X0. Y0. Z10.
M98 P0002 L3 ──→ O0002.nc 파일을 3번 호출
G54 G0 X0. Y0.
M5(주축정지)
M30(Program off/ Reset)
O0002 ────→ 파일명(O0002.nc) 및 서브프로그램의 시작은
G0 X2.5 Y0 메인에서 호출한 이름과 같아야 한다
Z2.
G1 Z-1. F500
G3 G17 X-2.5 Y0 R2.5
X2.5 Y0 R2.5
G0 Z10.
M99 ───→ 서브프로그램의 끝을 알린다

 

 

 

(2) G65 : M98 의 기능을 100% 포함 하고 ..... 인수를 이용한 호출까지 할 수 있다

메인 프로그램 샘플 서브 프로그램 샘플
O1234
G90 G54 G0 X0. Y0. Z10.
S15000 M3
G65 P0002L1A2.5  O0002.nc 파일을 1번 호출 하는데....
G55 G0 X0. Y0. Z10. 인수 A 를 통해서 2.5 를 같이 넘김
G65 P0002L3A15.  O0002.nc 파일을 3번 호출 하는데....
G54 G0 X0. Y0. 인수 A 를 통해서 15. 를 같이 넘김
M5
M30
O0002
G0 X#1 Y0 ──→ G0 X2.5(X15.) Y0
Z2.
G1 Z-1. F500
G3 G17 X-#1 Y0 R#1 ─→ G3 G17 X-2.5(X-15.) Y0 R2.5(R15.)
X#1 Y0 R#1 ──────────→ X2.5(X15.) Y0 R2.5(R15.)
G0 Z10.
M99 ───→ 서브프로그램의 끝을 알린다

 

 

 

 인수 란 : Main 에서 Sub 를 호출 할 때... 상호 두 프로그램 간에 어떠한 값들을 주고 받을 경우에 사용되는

       일종의 변수로서 다음과 같이 두 종류가 있으며, 아래의 두 가지 인수 중에 어느 쪽이든 사용자가 선택해서 쓸수 있지만

       두 가지 인수를 한 프로그램 내에서 혼용으로 쓰지는 않는다.

 

 

 

 

 

 

Ex) Sub 에서 인수를 받을때 메인에서 호출한 문자를 확인하여..... 그 문자에 맞는 변수로 받아야 한다.


#10=-100.
#15=50.
메인 : G65 P1234 A#10
서브 : G91 G01 X#1 F500.




G91 G01 X-100. F500.
메인 : G65 P1234 A10.
서브 : G91 G01 X#1 F500.




G91 G01 X10. F500.
메인 : G65 P1234 L3 A#10 B#15
서브 : G91 G01 X#1 Y#2 F500.




G91 G01 X-100. Y50. F500.
메인 : G65 P1234 A10. B15.
서브 : G91 G01 X#1 Y#2 F500.




G91 G01 X10. Y15. F500.
메인 : G65 P1234 A#10 C#15
서브 : G91 G01 X#1 Y#3 F500.




G91 G01 X-100. Y50. F500.
메인 : G65 P1234 L3 A10. C15.
서브 : G91 G01 X#1 Y#3 F500.




G91 G01 X10. Y15. F500.

 

 

 

 

(3) G66 : G65 의 기능을 100% 포함 하고 ..... Modal 지령 으로서 G67 로 취소해야 된다

메인 프로그램 샘플 서브 프로그램 샘플
O1234
#10=-100.
#15=50.
G90 G54
G0 X0. Y0. Z10.
S15000 M3
G4 P5000
G61.1
G66 P0002 A#15  O0002.nc 파일을 1번 호출 (A=50. / B=null)
G55
G0 X25. Y30. Z10.  O0002.nc 파일을 1번 호출 (A=null / B=null)
G0 X100. Y30. L3  O0002.nc 파일을 1번 호출 (A=null / B=null)
G1 X200. L3 B#10  O0002.nc 파일을 3번 호출 (A=null / B=-100.)
G67
G0 X0. Y0.
M5
G64
M02
O0002
G0 X#1 Y0.
Z2.
G1 Z-1. F500
X-#1 Y0. F1000
X#2 Y0.
G0 Z10.
M99



















 

 

 

 

 

 Local 변수 (지역변수 : #1~#33) 의 경우......

M98 메인에서 변수와 그 값을 가지고 서브로 간다
따라서, 서브에서는 메인의 값들을 가지고 실행 한 뒤
메인으로 복귀 시에는 서브의 변수들과 그 값들을 모두 가지고 복귀하게 된다.
그러므로 메인으로 오면 기존 메인의 변수들이 추가 되거나 그 값들이 바뀌게 된다.
G65 메인에서 변수와 그 값을 안가지고 서브로 간다
따라서, G65 P9851 T#20 하면.... 서브에서는 딸랑 #20 이란 변수만 받아서 실행 한 뒤
메인으로 복귀 시에는 서브의 변수들은 인수로 사용한 변수는 물론 다른 변수들도 모두 버리고 복귀하게 된다.
그러므로 메인으로 오면 기존 메인의 변수들과 그 값들은 호출전과 동일하게 보존되어 있다.

 

 

 

 

 Common 변수 (공용변수 : #100~#149 / #500~#531) 의 경우......

       공용변수 이기 때문에 어떤 방법으로 호출을 해도 상관없이 어디에서나 변수와 그 값들을 제어 할 수 있다

       결국, 호출 방법에는 별 의미가 없다.

 

 

 

 

 

 

 

 

5] IF  ( 조건문 )

    지령 형식: IF [조건식] GOTO 문번호

IF [조건식] THEN 조건식

 

 

 

 

ex) 카운팅 및 조건문

  #100=10 : #100  변수, 10  초기값 / 주의) 변수에는 점을 찍지 않는다.
  N5 : 문번호... 5
  G91 G00 Y#100 : G91 G00 Y10. 한거와 같다.
  Y-#100 : Y-10. 한거와 같다.
  #100=#100+1 : 변수 “#100”  1 을 더해서 다시 변수 “#100” 에 넣는다.
  IF [#100 EQ 50] GOTO N10 : 만약 변수 “#100” 이 수치 50 이면 문번호 10번으로 가라
  GOTO N5 : 문번호 5번으로 가라
  N10 : 문번호... 10
  M30 : 프로그램의 끝을 말한다.

 

 

 

 

 

 

 

[6] WHILE ~ DO  (반복 루프문)

 

    WHILE문은  조건식이 "참" 일 경우 루프를 실행한다.

 

    조건식이 "거짓"일 경우에는  루프문을 빠져나와 "END"문의 바로 아래 블록 부터 실행된다.

 

   

 

1) 기본 형식

 

 

 

 

 

2) 중복 선언

 

 

 

4) 무한 반복 선언

 

 

 

 

[7] 각종 연산 기호들

 

 

 

                         

 

 

 

ex)

IF [[#2*#2] EQ 1] GOTO27 ───────────→ #2 곱하기 #2  1 이면 문번호 27번으로 가라

IF [#120 EQ -2.] THEN #10 = 100. ───────→ #120  -2 이면 #10 변수에 100을 넣어라

IF [#120 AND 3 EQ 5] GOTO1 ─────────→ #120 의 값과 3 2진수로 바꾸고 그것들을 자릿수를 맞춰서

      각각의 비트를 자릿수 별로 AND 연산한 값이 5 이면....

      즉, 2진수 101 이면 문번호 1번으로 가라

 

 

 

 

[AND, OR, XOR사용 예]

 

*AND 

IF [#120 AND 3 EQ 1] GOTO1

 #120 = 9 라 하면

#120  2진수로 바꾸면 : 1001 이것를 자릿수에 맞게 다시 쓰면  1001
3  2진수로 바꾸면 : 11 이것를 자릿수에 맞게 다시 쓰면  0011
위의 두수를 AND 연산 결과 :   0001 (십진수로 바꾸면 : 1)

 

 

 

 

 

*OR 

IF [#120 OR 3 EQ 11] GOTO1

 #120 = 9 라 하면

#120  2진수로 바꾸면 : 1001 이것를 자릿수에 맞게 다시 쓰면  1001
3  2진수로 바꾸면 : 11 이것를 자릿수에 맞게 다시 쓰면  0011
위의 두수를 AND 연산 결과 :   1011 (십진수로 바꾸면 : 11)

 

 

 

 

*XOR

 

IF [#120 XOR 3 EQ 10] GOTO1

 #120 = 9 라 하면

#120  2진수로 바꾸면 : 1001 이것를 자릿수에 맞게 다시 쓰면  1001
3  2진수로 바꾸면 : 11 이것를 자릿수에 맞게 다시 쓰면  0011
위의 두수를 AND 연산 결과 :   1010 (십진수로 바꾸면 : 10)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

공구 보정양 저장 변수 (#2000 번대 및 #10000 번대 시스템 변수)

 

 A-type

( #2000 또는 #10000 번대 시스템 변수 )

 

아주 옛날방식 으로서.... 예전에는 무조건 보정 옵션으로

H 밖에 없었다.

, 길이보정이든 경보정이든 무조건 H 로만 지령 했었다.

 

#2000번은 Null 값 이다.

 

#3000번 이상으로 사용할 경우 #10000번 대를 이용한다.

 

 

 

 

 

 B-type

( #2000 또는 #10000 번대 시스템 변수 )

 

 

조금 옛날방식 으로서.... 여전히 보정 옵션으로

H 밖에 없었다.

 

#2000번은 Null 값 이다.

 

#3000번 이상으로 사용할 경우

#10000번 대를 이용한다.

 

 

 

 

 

 C-type

( #2000 또는 #10000 번대 시스템 변수 )

 

 

 요즘 방식 으로서.... 길이보정은 H 로 하고 경보정은 D 로 한다. (#2000번은 Null 값 이다.)

 #3000번 이상으로 사용할 경우.... , 200개 이상의 데이터를 사용할 경우엔 #10000번 대를 이용한다.

 형상 은 GEOM / 마모 는 WEAR 라고 한다.

 미스비시의 경우는 H  D 에서 파라메타가 .... 형상 과 마모가 각각 서로 바뀐다.

 

 

 

 

 

 

 

 

 

 

 

 

 #3000 번대 시스템 변수

 

( 제어 변수 )
변수 번호 기능
#3000





매크로 알람  0~200의 값을 대입 할수 있고, 26문자 이내의 메시지를 기술 할수 있다
ex) #3000=1(TOOL NOT FOUND)
 화면에는 다음과 같이 나온다  3001 TOOL NOT FOUND
위에서 #3000=7(TOOL NOT FOUND) 했다면 화면에는  3008 TOOL NOT FOUND
#3001

1msec 단위로 항상 카운트 하며 전원 투입시 또는 2147483648msec 가 되면 0 으로 리셋 된다
(2147483648밀리초 = 21474836.48 = 357913 56.48 = 5965시간 13 56.48
= 248 13시간 13 56.48)
#3002



Cycle Start Ramp 가 점등되고 있는 기간을 시간 단위로 카운트 하며 전원과 상관없이 값을 기억하고 있다
리셋은 9544.371467 시간 에서 0 으로 된다. (Hour)
(9544.371467시간 = 9544시간 22 17.2812 = 397 16시간 22 17.2812)
#3003









Single Block 과 보조기능 에 관련된 변수로서 전원 투입시 그 값은 0 이다
 Single Block 보조기능 완료 (M, S, T)
0 유효 대기
1 무효 대기 보조기능의 경우 대기안함 으로 하면 M, S, T 기능이 종료되지 않아도
2 유효 대기 안함 다음 블록으로 넘어가며.... 종료가 되어도 완료 신호도 송출하지 않는다
3 무효 대기 안함

















Feel Hold 와 이송속도 Override 에 관련된 변수로서 전원 투입시 그 값은 0 이다
 Feel Hold 이송속도 Override Exact Stop
0 유효 유효 유효
1 무효 유효 유효
2 유효 무효 유효
3 무효 무효 유효
4 유효 유효 무효
5 무효 유효 무효
6 유효 무효 무효
7 무효 무효 무효



Feel Hold = 무효 & #3003 = 0 또는 2
 Single Block 상태로 정지
Feel Hold = 무효 & #3003 = 1 또는 3
 Feed Hold 가 유효로 바뀌고 난 뒤 최초의 Block 에서 정지


이송속도 Override = 무효
 Override 스위치와 상관없이 100% 로 고정됨


Exact Stop = 무효
 절삭 과 절삭 블록 이외에서도 Inposition Check를 하지
않는다
#3005

















Setting Data 관련 변수로서 2진수를 10진수로 변환한 값을 사용 한다. , 셋팅 값이 0000001000100111 이라면....
#3005=551 라고 입력 한다
FCV : FS10/11 Format 변환을 사용하지 않는다 /