What's new
What's new

G-code, machine specific? (HAAS)

p-B

Plastic
Joined
Jun 13, 2021
When I am writing g-code, is it machine specific? I downloaded an open source software (CAMOTICS) to simulate my g-code and it runs flawlessly. However, when I try to run it on a Hass desktop mill it doesn't recognize some of the commands, or insists that there is overtravel when I am only engraving a small part that is inside of 5x5 inches. Am I missing some opening lines of code? Any help would be appreciated.
 
Post the code and show where the problems happen.

Also have you set your g54 position properly?

Really need more info and specifics.
 
Post the code and show where the problems happen.

Also have you set your g54 position properly?

Really need more info and specifics.

I don't think I have my G54 position properly set, I made a separate thread asking what I was doing wrong on that end. This is the code:


Generated with: DXF2GCODE, Version: Py3.6.7 PyQt5.11.3, Date: $Date: Fri Oct 25 20:45:56 2019 +0200 $)
(Created from file: C:/Users/MM/Desktop/drawing.dxf)
(Output format description: G-CODE for LinuxCNC)
(Time: Tue Jun 8 18:32:15 2021)
G20 (Units in inches)
G90 (Absolute programming)
G64 (Default cutting) G17 (XY plane) G40 (Cancel radius comp.) G49 (Cancel length comp.)
G0 Z 0.591

(*** LAYER: Layer 1 ***)
T1 M6
S1000

(* SHAPE Nr: 1 *)
G0 X 1.157 Y 0.792
M3 M8
G0 Z 0.118
F5
G1 Z -0.059
F15
G1 X 1.305 Y 0.495
G1 X 1.454 Y 0.197
G1 X 1.609 Y 0.197
G1 X 1.765 Y 0.197
G1 X 2.070 Y 0.822
G1 X 2.390 Y 1.447
G1 X 2.406 Y 0.740
G1 X 2.407 Y 0.016
F5
G1 Z -0.118
F15
G1 X 2.406 Y 0.740
G1 X 2.390 Y 1.447
G1 X 2.070 Y 0.822
G1 X 1.765 Y 0.197
G1 X 1.609 Y 0.197
G1 X 1.454 Y 0.197
G1 X 1.305 Y 0.495
G1 X 1.157 Y 0.792
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 5 *)
G0 X 0.785 Y 0.522
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.785 Y 0.261
G1 X 0.785 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.785 Y 0.261
G1 X 0.785 Y 0.522
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 2 *)
G0 X 0.555 Y 0.837
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.698 Y 0.921
G1 X 0.840 Y 1.005
F5
G1 Z -0.118
F15
G1 X 0.698 Y 0.921
G1 X 0.555 Y 0.837
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 0 *)
G0 X 0.785 Y 1.626
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.785 Y 1.333
G1 X 0.785 Y 1.040
G1 X 0.668 Y 0.977
G1 X 0.551 Y 0.913
G1 X 0.432 Y 0.980
G1 X 0.314 Y 1.047
G1 X 0.314 Y 1.680
G1 X 0.314 Y 2.314
G1 X 0.662 Y 2.314
G1 X 1.010 Y 2.314
G1 X 1.303 Y 1.689
G1 X 1.612 Y 1.069
G1 X 1.923 Y 1.700
G1 X 2.217 Y 2.325
G1 X 2.565 Y 2.325
G1 X 2.913 Y 2.325
G1 X 2.913 Y 1.162
G1 X 2.913 Y 0.000
F5
G1 Z -0.118
F15
G1 X 2.913 Y 1.162
G1 X 2.913 Y 2.325
G1 X 2.565 Y 2.325
G1 X 2.217 Y 2.325
G1 X 1.923 Y 1.700
G1 X 1.612 Y 1.069
G1 X 1.303 Y 1.689
G1 X 1.010 Y 2.314
G1 X 0.662 Y 2.314
G1 X 0.314 Y 2.314
G1 X 0.314 Y 1.680
G1 X 0.314 Y 1.047
G1 X 0.432 Y 0.980
G1 X 0.551 Y 0.913
G1 X 0.668 Y 0.977
G1 X 0.785 Y 1.040
G1 X 0.785 Y 1.333
G1 X 0.785 Y 1.626
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 3 *)
G0 X 0.317 Y 0.490
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.325 Y 0.258
G1 X 0.325 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.325 Y 0.258
G1 X 0.317 Y 0.490
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 10 *)
G0 X 0.851 Y 1.040
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.851 Y 1.333
G1 X 0.851 Y 1.479
F5
G1 Z -0.118
F15
G1 X 0.851 Y 1.333
G1 X 0.851 Y 1.040
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 4 *)
G0 X 0.489 Y 0.011
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.500 Y 0.252
G1 X 0.516 Y 0.456
G1 X 0.531 Y 0.487
G1 X 0.555 Y 0.494
G1 X 0.579 Y 0.487
G1 X 0.593 Y 0.456
G1 X 0.605 Y 0.247
G1 X 0.611 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.605 Y 0.247
G1 X 0.593 Y 0.456
G1 X 0.579 Y 0.487
G1 X 0.555 Y 0.494
G1 X 0.531 Y 0.487
G1 X 0.516 Y 0.456
G1 X 0.500 Y 0.252
G1 X 0.489 Y 0.011
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(*** LAYER: 0 ***)

(* SHAPE Nr: 11 *)
G0 X 0.785 Y 1.626
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.851 Y 1.479
G2 X 0.785 Y 0.522 I -0.323 J -0.459
F5
G1 Z -0.118
F15
G3 X 0.851 Y 1.479 I -0.257 J 0.498
G1 X 0.785 Y 1.626
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 8 *)
G0 X 0.325 Y 0.011
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.489 Y 0.011
G1 X 0.325 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.489 Y 0.011
G1 X 0.325 Y 0.011
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 12 *)
G0 X 1.085 Y 0.954
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 1.157 Y 0.792
F5
G1 Z -0.118
F15
G1 X 1.085 Y 0.954
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 9 *)
G0 X 0.611 Y 0.011
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.785 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.611 Y 0.011
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 6 *)
G0 X 2.913 Y 0.000
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G1 X 2.407 Y 0.000
G1 X 2.407 Y 0.016
F5
G1 Z -0.118
F15
G1 X 2.407 Y 0.000
G1 X 2.913 Y 0.000
F5
G1 Z 0.118
G0 Z 0.591
M9 M5

(* SHAPE Nr: 7 *)
G0 X 0.317 Y 0.490
M3 M8
G0 Z 0.118
G1 Z -0.059
F15
G2 X 0.236 Y 1.497 I 0.284 J 0.530
G1 X 0.266 Y 1.517
G1 X 0.266 Y 1.027
G1 X 0.555 Y 0.837
G1 X 0.840 Y 1.005
G1 X 0.851 Y 1.011
G1 X 0.851 Y 1.040
F5
G1 Z -0.118
F15
G1 X 0.851 Y 1.011
G1 X 0.840 Y 1.005
G1 X 0.555 Y 0.837
G1 X 0.266 Y 1.027
G1 X 0.266 Y 1.517
G1 X 0.236 Y 1.497

F5
G1 Z 0.118
G0 Z 0.591
M9 M5
G0 X 0.000 Y 0.000
M2 (Program end)
 
The first problem I encounter is under the line T1 M6 - the desktop mill doesn't recognize that command.
 
The first problem I encounter is under the line T1 M6 - the desktop mill doesn't recognize that command.

The 1st problem I encounter was that code flat out sucks, its embarrassing to even look at. its not you persay its what ever dipshit software your using or who ever set it up. there are just no standards anymore.

people ESPECIALLY new people running CNCS need to start learning G code and have some standards.

I dont know what a Hass desktop mill needs to run as far as tool change goes.

heres an idea of a decent proper code for a mill and how it should be structured.
THIS IS OFF A HASS
M6 T1
G00 G90 G54 X POSITION Y POSITION
S3000 M03
G43 Z0.2 H1 M08

G01 WITH FEEDRATE ON 1ST G01 LINE AT A MIN.
THEN YOUR CUTTING CODE

G00 Z0.2
G91 G28 Z0.0 M09
G91 G28 YO.0
M01 USE M00 FOR NO TOOL CHANGER

THEN REPEAT FOR NEXT TOOL
IF YOU USE A G18 OR G19 THEN CANCEL IT AT THE END OF USE IN THAT SPECIFIC TOOL.
 
The 1st problem I encounter was that code flat out sucks, its embarrassing to even look at. its not you persay its what ever dipshit software your using or who ever set it up. there are just no standards anymore.

people ESPECIALLY new people running CNCS need to start learning G code and have some standards.

I dont know what a Hass desktop mill needs to run as far as tool change goes.

heres an idea of a decent proper code for a mill and how it should be structured.
THIS IS OFF A HASS
M6 T1
G00 G90 G54 X POSITION Y POSITION
S3000 M03
G43 Z0.2 H1 M08

G01 WITH FEEDRATE ON 1ST G01 LINE AT A MIN.
THEN YOUR CUTTING CODE

G00 Z0.2
G91 G28 Z0.0 M09
G91 G28 YO.0
M01 USE M00 FOR NO TOOL CHANGER

THEN REPEAT FOR NEXT TOOL
IF YOU USE A G18 OR G19 THEN CANCEL IT AT THE END OF USE IN THAT SPECIFIC TOOL.

There are no tool changes with the desktop mill. If you want to change the tool it has to be done manually.

people ESPECIALLY new people running CNCS need to start learning G code and have some standards.

Yes, this is me learning it, I can write basic programs but I am learning still.

its not you persay its what ever dipshit software your using or who ever set it up.

Yeah, what can I say it's open source. If I were to write the g-code by hand it would take me weeks of trial and error.

I'm going to rewrite the code and see how that works.
 
Yes, this is me learning it, I can write basic programs but I am learning still.

Understand that nothing wrong with it, just take all the junk out of it and use the parts that you need.
this is a good time to learn.
BTW I have done what your doing alot many years ago (early 90's) using autocad to write my programs, I would just take the numbers(using lisp?) of the profile and insert them in for the feeds.you can do the same with this prograam your using and a txt editor, just copy an paste in the feed section. youll get the hang of it really quick.
 
Understand that nothing wrong with it, just take all the junk out of it and use the parts that you need.
this is a good time to learn.
BTW I have done what your doing alot many years ago (early 90's) using autocad to write my programs, I would just take the numbers(using lisp?) of the profile and insert them in for the feeds.you can do the same with this prograam your using and a txt editor, just copy an paste in the feed section. youll get the hang of it really quick.

Thanks! Do you know how to save the notepad file as an .ngc? For some reason I can only save the programs as .txt and I am worried that the CNC machine won't recognize the file.
 
Thanks! Do you know how to save the notepad file as an .ngc? For some reason I can only save the programs as .txt and I am worried that the CNC machine won't recognize the file.
just rename the file to xxxx.ngc
I never have an extention on any of my filenames. most machines dont need a file extension. I know hass fanuc yasnac fadals dont.
 
When I am writing g-code, is it machine specific?

Short answer = yes.
Long answer = it depends on the machines in question.

Some Okuma G codes are different than the standard Fanuc style G codes. Haas I'm sure has some variance also from standard Fanuc.
 
First of all, the line the machines stops on isn't always the problem line. The problem line is usually after the one it stops on.
Second, you don't have a G43 call for the tool, such as G43H1 for tool 1. I had a machine years ago that whenever I did a tool change (manual, like yours) the tool length offset would be automatically loaded from the table in the control. All the Haas machines I've ever used had to have the G43H(tool number) on a line shortly after the tool call, and it's done with a Z move, such as G43 H1 Z1. would send the tool to 1" above the called work offset, such as G54. ALso, does your manual say you need an M6 there, for the manual tool change? i
T1 M6?
G54
G43 H1 Z1.
S1000 M3 (turns the spindle on clockwise, 1K rpm)
M8 (turns on coolant)
(part creation movement here)


etc etc etc
Good luck
 
Like Mike said, the line it stops on may or may not be the offending code.

In your case ( again like Mike said ) it hangs on the T1 M6, but the problem is that you are not activating the length of the tool by the G43 H1.
Also, Haas does not allow multiple M codes in the same block, so it will soil it's pans on the M3 M8 line.

But, since this machine does not have a toolchanger, you may need to make toolchanges like this:
T1 M06;
M00 ( full stop to allow you to manuall insert the correct tool);
G00 G43 H1 D1 ( activate tool length 1 and tool dia 1, no actual motion);
DO YOUR THING FROM HERE ....
 
First of all, the line the machines stops on isn't always the problem line. The problem line is usually after the one it stops on.
Second, you don't have a G43 call for the tool, such as G43H1 for tool 1. I had a machine years ago that whenever I did a tool change (manual, like yours) the tool length offset would be automatically loaded from the table in the control. All the Haas machines I've ever used had to have the G43H(tool number) on a line shortly after the tool call, and it's done with a Z move, such as G43 H1 Z1. would send the tool to 1" above the called work offset, such as G54. ALso, does your manual say you need an M6 there, for the manual tool change? i
T1 M6?
G54
G43 H1 Z1.
S1000 M3 (turns the spindle on clockwise, 1K rpm)
M8 (turns on coolant)
(part creation movement here)


etc etc etc
Good luck

Thank you. There is no coolant, so would removing those commands be okay?
 
In addition to what others have said, the first thing I notice is that there isn't a G54 in the program. If your last program (CNC or MDI) was in G54, it SHOULD stay there. But it's never good to assume.

Also, I don't see any decimal points in the feed rates. It's very common for machines to move the decimal point 4 spaces to the left, if you don't include one. 1 becomes .0001, 15 becomes .0015, 220 becomes .0220, etc. Typically, we'll add our own point, just to make sure it's where we want it. 1. 15. 220. ect. I believe that's a parameter you can change on a Haas, so it might not be a problem for you. But if, when you get it running, it runs REALLY slowly, that's your problem. This also applies to position numbers, though your code already has that covered.

DXF2GCODE probably has a setting for number of decimal places. You clearly have it set on 3. You'll want to change it to 4, if you can. There's no reason to artificially limit your precision.
 
Thank you. I'm still re-writing the program and trying to use everyone's input. A lot of knowledge on this board, I wish I knew about it years ago.
 
The 1st problem I encounter was that code flat out sucks, its embarrassing to even look at. its not you persay its what ever dipshit software your using or who ever set it up. there are just no standards anymore.

people ESPECIALLY new people running CNCS need to start learning G code and have some standards.

I dont know what a Hass desktop mill needs to run as far as tool change goes.

heres an idea of a decent proper code for a mill and how it should be structured.
THIS IS OFF A HASS
M6 T1
G00 G90 G54 X POSITION Y POSITION
S3000 M03
G43 Z0.2 H1 M08

G01 WITH FEEDRATE ON 1ST G01 LINE AT A MIN.
THEN YOUR CUTTING CODE

G00 Z0.2
G91 G28 Z0.0 M09
G91 G28 YO.0
M01 USE M00 FOR NO TOOL CHANGER

THEN REPEAT FOR NEXT TOOL
IF YOU USE A G18 OR G19 THEN CANCEL IT AT THE END OF USE IN THAT SPECIFIC TOOL.

M6 T1
G00 G90 G54 X0 Y0
S3000 M03
G43 Z2. H1 M00

G01.15

(* 1 *)
G0 X 1.157 Y 0.792
M3
G0 Z 0.118
F5
G1 Z -0.059
F15
G1 X 1.305 Y 0.495
G1 X 1.454 Y 0.197
G1 X 1.609 Y 0.197
G1 X 1.765 Y 0.197
G1 X 2.070 Y 0.822
G1 X 2.390 Y 1.447
G1 X 2.406 Y 0.740
G1 X 2.407 Y 0.016
F5
G1 Z -0.118
F15
G1 X 2.406 Y 0.740
G1 X 2.390 Y 1.447
G1 X 2.070 Y 0.822
G1 X 1.765 Y 0.197
G1 X 1.609 Y 0.197
G1 X 1.454 Y 0.197
G1 X 1.305 Y 0.495
G1 X 1.157 Y 0.792
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 5 *)
G0 X 0.785 Y 0.522
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.785 Y 0.261
G1 X 0.785 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.785 Y 0.261
G1 X 0.785 Y 0.522
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 2 *)
G0 X 0.555 Y 0.837
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.698 Y 0.921
G1 X 0.840 Y 1.005
F5
G1 Z -0.118
F15
G1 X 0.698 Y 0.921
G1 X 0.555 Y 0.837
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 0 *)
G0 X 0.785 Y 1.626
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.785 Y 1.333
G1 X 0.785 Y 1.040
G1 X 0.668 Y 0.977
G1 X 0.551 Y 0.913
G1 X 0.432 Y 0.980
G1 X 0.314 Y 1.047
G1 X 0.314 Y 1.680
G1 X 0.314 Y 2.314
G1 X 0.662 Y 2.314
G1 X 1.010 Y 2.314
G1 X 1.303 Y 1.689
G1 X 1.612 Y 1.069
G1 X 1.923 Y 1.700
G1 X 2.217 Y 2.325
G1 X 2.565 Y 2.325
G1 X 2.913 Y 2.325
G1 X 2.913 Y 1.162
G1 X 2.913 Y 0.000
F5
G1 Z -0.118
F15
G1 X 2.913 Y 1.162
G1 X 2.913 Y 2.325
G1 X 2.565 Y 2.325
G1 X 2.217 Y 2.325
G1 X 1.923 Y 1.700
G1 X 1.612 Y 1.069
G1 X 1.303 Y 1.689
G1 X 1.010 Y 2.314
G1 X 0.662 Y 2.314
G1 X 0.314 Y 2.314
G1 X 0.314 Y 1.680
G1 X 0.314 Y 1.047
G1 X 0.432 Y 0.980
G1 X 0.551 Y 0.913
G1 X 0.668 Y 0.977
G1 X 0.785 Y 1.040
G1 X 0.785 Y 1.333
G1 X 0.785 Y 1.626
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 3 *)
G0 X 0.317 Y 0.490
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.325 Y 0.258
G1 X 0.325 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.325 Y 0.258
G1 X 0.317 Y 0.490
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 10 *)
G0 X 0.851 Y 1.040
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.851 Y 1.333
G1 X 0.851 Y 1.479
F5
G1 Z -0.118
F15
G1 X 0.851 Y 1.333
G1 X 0.851 Y 1.040
F5
G1 Z 0.118
G0 Z 0.591
M5

(*4 *)
G0 X 0.489 Y 0.011
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.500 Y 0.252
G1 X 0.516 Y 0.456
G1 X 0.531 Y 0.487
G1 X 0.555 Y 0.494
G1 X 0.579 Y 0.487
G1 X 0.593 Y 0.456
G1 X 0.605 Y 0.247
G1 X 0.611 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.605 Y 0.247
G1 X 0.593 Y 0.456
G1 X 0.579 Y 0.487
G1 X 0.555 Y 0.494
G1 X 0.531 Y 0.487
G1 X 0.516 Y 0.456
G1 X 0.500 Y 0.252
G1 X 0.489 Y 0.011
F5
G1 Z 0.118
G0 Z 0.591
M5

(*** 0 ***)

(* 11 *)
G0 X 0.785 Y 1.626
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.851 Y 1.479
G2 X 0.785 Y 0.522 I -0.323 J -0.459
F5
G1 Z -0.118
F15
G3 X 0.851 Y 1.479 I -0.257 J 0.498
G1 X 0.785 Y 1.626
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 8 *)
G0 X 0.325 Y 0.011
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.489 Y 0.011
G1 X 0.325 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.489 Y 0.011
G1 X 0.325 Y 0.011
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 12 *)
G0 X 1.085 Y 0.954
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 1.157 Y 0.792
F5
G1 Z -0.118
F15
G1 X 1.085 Y 0.954
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 9 *)
G0 X 0.611 Y 0.011
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 0.785 Y 0.011
F5
G1 Z -0.118
F15
G1 X 0.611 Y 0.011
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 6 *)
G0 X 2.913 Y 0.000
M3
G0 Z 0.118
G1 Z -0.059
F15
G1 X 2.407 Y 0.000
G1 X 2.407 Y 0.016
F5
G1 Z -0.118
F15
G1 X 2.407 Y 0.000
G1 X 2.913 Y 0.000
F5
G1 Z 0.118
G0 Z 0.591
M5

(* 7 *)
G0 X 0.317 Y 0.490
M3
G0 Z 0.118
G1 Z -0.059
F15
G2 X 0.236 Y 1.497 I 0.284 J 0.530
G1 X 0.266 Y 1.517
G1 X 0.266 Y 1.027
G1 X 0.555 Y 0.837
G1 X 0.840 Y 1.005
G1 X 0.851 Y 1.011
G1 X 0.851 Y 1.040
F5
G1 Z -0.118
F15
G1 X 0.851 Y 1.011
G1 X 0.840 Y 1.005
G1 X 0.555 Y 0.837
G1 X 0.266 Y 1.027
G1 X 0.266 Y 1.517
G1 X 0.236 Y 1.497

F5
G1 Z 0.118
G0 Z 0.591
M5
G0 X 0.000 Y 0.000
M2 (Program end)
 








 
Back
Top