- Posts: 92
- Thank you received: 0
Gcode subroutings issues
13 years 5 months ago #34718
by Nick
Gcode subroutings issues was created by Nick
Hi while developping LinuxCNC features we saw some strange behavior of subroutines...
1. Oxxx RETURN works strange:
This code gives "Unxepected character after O-word"
If we remove "O123 RETURN" or WHILE code is accepted.
2. This is more complicated example.
It's a subroutine which shuold generate rectangle pocket with multipass spiral milling of rectangle.
So we have two subs
first <multipass> sub - it makes passess for mulptipass machining
second spiral rectangle.
So here's the deal: in multipass sub there's O#<sub> CALL - a call to the sub defined in #<sub> parameter. And it does not work. It says that #<sub> parameter is undentified, dispite the first string of the sub #<sub> = #1.
We have tried several variations:
O#<sub> CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19]
- does not work!
O#1 CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19]
- works fine!
#<sub> = #1
O#<sub> CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19]
- does not work!?!?!
How can it be?
the whole subroutine:
This subroutine should give something like this:
1. Oxxx RETURN works strange:
Code:
O123 sub
O<200> IF [5 LE 0.01]
O123 RETURN
O<200> ENDIF
O124 WHILE [1]
O124 BREAK
O124 ENDWHILE
O123 endsub(End definitions)
M02
If we remove "O123 RETURN" or WHILE code is accepted.
2. This is more complicated example.
It's a subroutine which shuold generate rectangle pocket with multipass spiral milling of rectangle.
So we have two subs
first <multipass> sub - it makes passess for mulptipass machining
second spiral rectangle.
So here's the deal: in multipass sub there's O#<sub> CALL - a call to the sub defined in #<sub> parameter. And it does not work. It says that #<sub> parameter is undentified, dispite the first string of the sub #<sub> = #1.
We have tried several variations:
O#<sub> CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19]
- does not work!
O#1 CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19]
- works fine!
#<sub> = #1
O#<sub> CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19]
- does not work!?!?!
How can it be?
the whole subroutine:
Code:
#<_tool_feed> = 100
(Rectangle sub definition)
O<multipass> SUB
#<sub> = #1
#<depth> = #2
#<step> = #3
#<surface> = #4
#<rappid> = #5
#<x0> = #6
#<y0> = #7
G0 Z#<rappid>
G0 X#<x0> Y#<y0>
#<z> = #<surface>
O<multipass-while> WHILE [#<z> GT #<depth>]
#<z> = [#<z>-#<step>]
O<multipass-if> IF [#<z> LT #<depth>]
#<z>=#<depth>
O<multipass-if> ENDIF
F#<_tool_feed>
G1 Z#<z>
(call pass sub with the restof parameters)
(DEBUG, #<sub>)
#<sub> = #1
O#<sub> CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19]
O<multipass-while> ENDWHILE
G0 Z#<rappid>
O<multipass> ENDSUB
(Rectangle sub definition)
#<_spiral-rectangle> = 1000
O#<_spiral-rectangle> sub
#<cx> = #1
#<cy> = #2
#<w> = #3
#<h> = #4
#<spiral-step> = #5
#<a> = #6
O<spiral-rectangle-if-0001> IF [#<spiral-step> GT 0.01]
#<x1> = [#<cx>-#<w>/2]
#<x2> = [#<cx>+#<w>/2]
#<y1> = [#<cy>-#<h>/2]
#<y2> = [#<cy>+#<h>/2]
G1 X#<x1> Y#<y1>
; CW
O<spiral-rectangle-while> WHILE [1]
G1 X#<x1> Y#<y2>
#<x1> = [#<x1> + #<spiral-step>]
O<spiral-rectangle-if-0002> IF [#<x1> GT #<x2>]
G1 X[[#<x1>+#<x2>]/2]
G1 Y[#<y1>]
O<spiral-rectangle-while> BREAK
O<spiral-rectangle-if-0002> ENDIF
G1 X#<x2> Y#<y2>
#<y2> = [#<y2> - #<spiral-step>]
O<spiral-rectangle-if-0003> IF [#<y1> GT #<y2>]
G0 Y[[#<y1>+#<y2>]/2]
G0 X[#<x1>]
O<spiral-rectangle-while> BREAK
O<spiral-rectangle-if-0003> ENDIF
G1 X#<x2> Y#<y1>
#<x2> = [#<x2> - #<spiral-step>]
O<spiral-rectangle-if-0004> IF [#<x1> GT #<x2>]
G1 X[[#<x1>+#<x2>]/2]
G1 Y[#<y1>]
O<spiral-rectangle-while> BREAK
O<spiral-rectangle-if-0004> ENDIF
G1 X#<x1> Y#<y1>
#<y1> = [#<y1> + #<spiral-step>]
O<spiral-rectangle-if-0005> IF [#<y1> GT #<y2>]
G0 Y[[#<y1>+#<y2>]/2]
G0 X[#<x2>]
O<spiral-rectangle-while> BREAK
O<spiral-rectangle-if-0005> ENDIF
O<spiral-rectangle-while> ENDWHILE
O<spiral-rectangle-if-0001> ENDIF
O#<_spiral-rectangle> endsub(End definitions)
(Call spiral rectangle sub cX cY w h spiral-step depth depth-step surface rappid)
; sub depth step surf rappid #x0 #y0 #cx #cy w h [spir-step]
O<multipass> CALL [#<_spiral-rectangle>] [-5.1] [1] [0] [10] [5] [2] [1] [1] [10] [20] [.1]
M02
This subroutine should give something like this:
Please Log in to join the conversation.
13 years 5 months ago #34735
by andypugh
This is quite a strange format. Why O<200> and not O200 ?
Replied by andypugh on topic Gcode subroutings issues
Nick wrote: [code]O123 sub
O<200> IF [5 LE 0.01]
O123 RETURN
O<200> ENDIF
This is quite a strange format. Why O<200> and not O200 ?
Please Log in to join the conversation.
13 years 5 months ago #34839
by Nick
Replied by Nick on topic Gcode subroutings issues
I simplified another subroutine to find the bug. There were some named parameters there.
Never the less without <> I get the same error.
Any thoughts about the first issue?
the most surprising thing is this:
O#1 CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19] - works fine!
#<sub> = #1
O#<sub> CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19] - does not work!?!?!
Never the less without <> I get the same error.
Any thoughts about the first issue?
the most surprising thing is this:
O#1 CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19] - works fine!
#<sub> = #1
O#<sub> CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19] - does not work!?!?!
Please Log in to join the conversation.
13 years 5 months ago #34843
by andypugh
Replied by andypugh on topic Gcode subroutings issues
[quote="Nick" post=34839O#1 CALL [#8] [#9] [#10] [#11] [#12] [#13] [#14] [#15] [#16] [#17] [#18] [#19] - works fine![/quote]
You are trying to call numbered subs by number?
So, #1 = 100 ; O#1 CALL will call O100 and #1 = 200 ; O#1 CALL will call the O200 sub?
You are trying to call numbered subs by number?
So, #1 = 100 ; O#1 CALL will call O100 and #1 = 200 ; O#1 CALL will call the O200 sub?
Please Log in to join the conversation.
13 years 5 months ago #34894
by Nick
Replied by Nick on topic Gcode subroutings issues
Yes exactly. It's an additional function which realizes multipass machining. The #1 parameter is the subroutine for each pass. Then it's called in while loop.
In this example we use O1000 as subroutine:
#<_spiral-rectangle> = 1000
O#<_spiral-rectangle> sub
...
O<multipass> CALL [#<_spiral-rectangle>] [-5.1] [1] [0] [10] [5] [2] [1] [1] [10] [20] [.1]
In this example we use O1000 as subroutine:
#<_spiral-rectangle> = 1000
O#<_spiral-rectangle> sub
...
O<multipass> CALL [#<_spiral-rectangle>] [-5.1] [1] [0] [10] [5] [2] [1] [1] [10] [20] [.1]
Please Log in to join the conversation.
13 years 5 months ago #34904
by ArcEye
Replied by ArcEye on topic Gcode subroutings issues
Hi
I think you are getting caught by indirection
This works because it is calling the value held rather than the object itself, similar to *(ptr) in C
You can make arrays in gcode and reference in a similar fashion by using [#[#<_array_index> + 5]] where _array_index is a fixed value, say 100 and that will get you the value held at #105
regards
I think you are getting caught by indirection
Code:
o100 sub
(MSG, inside 100 sub)
o100 endsub
#<_tester> = 100
G17 G21 G8 G40 G49
G80
G90 G94
F600 S800
M3
M8
G00 X0 Y0 Z20
o[#<_tester>] call
M1
g28
M5
M9
M2
This works because it is calling the value held rather than the object itself, similar to *(ptr) in C
You can make arrays in gcode and reference in a similar fashion by using [#[#<_array_index> + 5]] where _array_index is a fixed value, say 100 and that will get you the value held at #105
regards
Please Log in to join the conversation.
13 years 5 months ago #34910
by Nick
Replied by Nick on topic Gcode subroutings issues
hmmm... how can indirection cause "named parameter #<sub> not defined" in:
#<sub> = #1
O#<sub> CALL
while :
O#1 CALL works as it supposed to
#<sub> = #1
O#<sub> CALL
while :
O#1 CALL works as it supposed to
Please Log in to join the conversation.
13 years 5 months ago #34911
by Nick
Replied by Nick on topic Gcode subroutings issues
I've trimmed almost everything. And here's what I got:
It looks like that we cannot use named variables inside SUB to call another SUBs. Probably there's an bug inside parser which checks all O-code names/numbers...
This give an #<sub> unidentified error.Code:O<multipass> SUB #<sub> = #1 O#<sub> CALL O<multipass> ENDSUB
This variant works fineCode:#<sub> = #1 O<multipass> SUB #<sub> = #1 O#<sub> CALL O<multipass> ENDSUB
And the most interesting: after opening second variant with #<sub> defined outside of O SUB, the first variant began to work fine until LinuxCNC restart.Code:O<multipass> SUB #<sub> = #1 O#<sub> CALL O<multipass> ENDSUB
It looks like that we cannot use named variables inside SUB to call another SUBs. Probably there's an bug inside parser which checks all O-code names/numbers...
Please Log in to join the conversation.
13 years 5 months ago #34912
by ArcEye
Replied by ArcEye on topic Gcode subroutings issues
The other thing at play here is scope
You are defining local parameters (no leading underscore)
gets Named parameter <tester> not defined
whereas
works
You are defining local parameters (no leading underscore)
Code:
#<tester> = 100
o100 sub
(MSG, inside 100 sub)
o100 endsub
o200 sub
o[#<tester>] call
o200 endsub
...
o200 call
gets Named parameter <tester> not defined
whereas
Code:
#<_tester> = 100
o100 sub
(MSG, inside 100 sub)
o100 endsub
o200 sub
o[#<_tester>] call
o200 endsub
...
o200 call
works
Please Log in to join the conversation.
13 years 5 months ago #34926
by Nick
Replied by Nick on topic Gcode subroutings issues
Yes, but I do want a local parameter. More over, the first one with local #<tester> will work too, because you've defined #<tester> at the top of the code outside the Subroutine. (see my second variant)
And notice that we are defining #<sub> = #1 just before calling O#<sub> CALL, even if we define sub to constant #<sub> = 1000 (instead of #1), O#<sub> CALL will cause exception...
And notice that we are defining #<sub> = #1 just before calling O#<sub> CALL, even if we define sub to constant #<sub> = 1000 (instead of #1), O#<sub> CALL will cause exception...
Please Log in to join the conversation.
Time to create page: 0.140 seconds
