按规划持续工作

This commit is contained in:
2026-06-09 06:13:28 +08:00
parent 902c6ecaea
commit 2658ee3b72
255 changed files with 12487 additions and 150 deletions

View File

@@ -0,0 +1,14 @@
This tests for a specific interpreter regression where in very
specific circumstances involving remapped functions,
`_setup.sequence_number` is reset, which triggers the "duplicate
O-word label" sanity check.
This test triggers the regression by calling a remap twice. In the first
call, before the problem O-word, it calls a second-level remap that
returns with a reset `_setup.sequence_number`, so the following O-word
is recorded with an incorrect position.
In the second call, the second-level remap is not invoked, so the
following O-word appears at the correct `_setup.sequence_number`; the
differing positions then triggers the "duplicate O-word label" sanity
check and the program exits with an error.

View File

@@ -0,0 +1,18 @@
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... MESSAGE(" executing m207: run remapped m208 before o<problem>")
N..... MESSAGE(" rm207 executing problem if")
N..... MESSAGE(" rm207 within problem if")
N..... MESSAGE(" rm207 done executing problem if")
N..... MESSAGE(" executing m207: do NOT run remapped m208 before o<problem>")
N..... MESSAGE(" rm207 running remapped m208")
N..... MESSAGE(" rm208 starting and done")
N..... MESSAGE(" rm207 executing problem if")
N..... MESSAGE(" rm207 within problem if")
N..... MESSAGE(" rm207 done executing problem if")
N..... FINISH()
N..... ON_RESET()

View File

@@ -0,0 +1,11 @@
o<rm207> sub
o<setup> if [#<_killme> GT 0]
(debug, rm207 running remapped m208)
m208
o<setup> endif
(debug, rm207 executing problem if)
o<problem> if [6]
(debug, rm207 within problem if)
o<problem> endif
(debug, rm207 done executing problem if)
o<rm207> endsub

View File

@@ -0,0 +1,3 @@
o<rm208> sub
(debug, rm208 starting and done)
o<rm208> endsub

View File

@@ -0,0 +1,12 @@
[EMC]
DEBUG=65535
LOG_LEVEL=5000
[RS274NGC]
DEBUG=65535
LOG_LEVEL=5000
SUBROUTINE_PATH = .
REMAP=M207 modalgroup=10 ngc=rm207
REMAP=M208 modalgroup=10 ngc=rm208

View File

@@ -0,0 +1,8 @@
%
(debug, executing m207: run remapped m208 before o<problem>)
#<_killme> = 0
m207
(debug, executing m207: do NOT run remapped m208 before o<problem>)
#<_killme> = 1
m207
%

View File

@@ -0,0 +1,4 @@
#!/bin/bash
export INI_FILE_NAME=test.ini
rs274 -i "$INI_FILE_NAME" -g test.ngc | awk '{$1=""; print}'
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1 @@
Exercise parameter passing to user-defined code

View File

@@ -0,0 +1,17 @@
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... MESSAGE(" M400 call_level= 1.000000 remap_level=1.000000")
N..... MESSAGE(" P word set: 47.110000")
N..... MESSAGE(" Q word set: 8.150000")
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PROGRAM_END()
N..... ON_RESET()

View File

@@ -0,0 +1,18 @@
o<rm400> sub
(debug, M400 call_level= #<_call_level> remap_level=#<_remap_level>)
o100 if [EXISTS[#<P>]]
(debug, P word set: #<P>)
o100 else
(debug, P word missing)
o100 endif
o120 if [EXISTS[#<Q>]]
(debug, Q word set: #<Q>)
o120 else
(debug, Q word missing)
o120 endif
o<rm400> endsub
m2
%

View File

@@ -0,0 +1,9 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
# M405 requires P- Q- and does NOT permit any other words in this block
REMAP=M400 modalgroup=5 argspec=PQ ngc=rm400

View File

@@ -0,0 +1,2 @@
M400 P47.11 Q8.15
M2

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -i test.ini -g test.ngc | awk '{$1=""; print}'
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1,3 @@
Exercise failed parameter passing to user-defined code
The required Q parameter is missing

View File

@@ -0,0 +1,17 @@
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
user-defined M400: missing: Q
O <rm400> call
7 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
8 N..... SET_XY_ROTATION(0.0000)
9 N..... SET_FEED_MODE(0, 0)
10 N..... SET_FEED_RATE(0.0000)
11 N..... STOP_SPINDLE_TURNING(0)
12 N..... SET_SPINDLE_MODE(0 0.0000)
13 N..... PROGRAM_END()
14 N..... ON_RESET()

View File

@@ -0,0 +1,18 @@
o<rm400> sub
(debug, M400 call_level= #<_call_level> remap_level=#<_remap_level>)
o100 if [EXISTS[#<P>]]
(debug, P word set: #<P>)
o100 else
(debug, P word missing)
o100 endif
o120 if [EXISTS[#<Q>]]
(debug, Q word set: #<Q>)
o120 else
(debug, Q word missing)
o120 endif
o<rm400> endsub
m2
%

View File

@@ -0,0 +1,9 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
# M405 requires P- Q- and does NOT permit any other words in this block
REMAP=M400 modalgroup=5 argspec=PQ ngc=rm400

View File

@@ -0,0 +1,2 @@
M400 P47.11
M2

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -i test.ini -n 0 -g test.ngc 2>&1
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1,3 @@
Exercise failed parameter passing to user-defined code
The required Q parameter is missing

View File

@@ -0,0 +1,17 @@
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
user-defined M400: missing: P,Q
O <rm400> call
7 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
8 N..... SET_XY_ROTATION(0.0000)
9 N..... SET_FEED_MODE(0, 0)
10 N..... SET_FEED_RATE(0.0000)
11 N..... STOP_SPINDLE_TURNING(0)
12 N..... SET_SPINDLE_MODE(0 0.0000)
13 N..... PROGRAM_END()
14 N..... ON_RESET()

View File

@@ -0,0 +1,18 @@
o<rm400> sub
(debug, M400 call_level= #<_call_level> remap_level=#<_remap_level>)
o100 if [EXISTS[#<P>]]
(debug, P word set: #<P>)
o100 else
(debug, P word missing)
o100 endif
o120 if [EXISTS[#<Q>]]
(debug, Q word set: #<Q>)
o120 else
(debug, Q word missing)
o120 endif
o<rm400> endsub
m2
%

View File

@@ -0,0 +1,9 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
# M405 requires P- Q- and does NOT permit any other words in this block
REMAP=M400 modalgroup=5 argspec=PQ ngc=rm400

View File

@@ -0,0 +1,2 @@
M400 R122.25
M2

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -i test.ini -n 0 -g test.ngc 2>&1
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1 @@
Exercise failed remap NGC procedure - must properly return to top level

View File

@@ -0,0 +1,20 @@
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
7 N..... MESSAGE(" before M400: call_level= 0.000000 remap_level=0.000000")
8 N..... MESSAGE(" in rm400: call_level= 1.000000 remap_level=1.000000")
Attempt to divide by zero
#100 = [1/0]
9 N..... MESSAGE(" after failed M400: call_level= 0.000000 remap_level=0.000000")
10 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
11 N..... SET_XY_ROTATION(0.0000)
12 N..... SET_FEED_MODE(0, 0)
13 N..... SET_FEED_RATE(0.0000)
14 N..... STOP_SPINDLE_TURNING(0)
15 N..... SET_SPINDLE_MODE(0 0.0000)
16 N..... PROGRAM_END()
17 N..... ON_RESET()

View File

@@ -0,0 +1,6 @@
o<rm400> sub
(debug, in rm400: call_level= #<_call_level> remap_level=#<_remap_level>)
#100 = [1/0]
o<rm400> endsub
m2
%

View File

@@ -0,0 +1,9 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
REMAP=M400 modalgroup=5 ngc=rm400

View File

@@ -0,0 +1,4 @@
(debug, before M400: call_level= #<_call_level> remap_level=#<_remap_level>)
M400
(debug, after failed M400: call_level= #<_call_level> remap_level=#<_remap_level>)
M2

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -i test.ini -n 0 -g test.ngc 2>&1
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1,2 @@
M30 and M02 reset the interpreter's `remap_level`. This test checks
for interaction of remapped commands with those M codes.

View File

@@ -0,0 +1,17 @@
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... MESSAGE("m400 call_level=1.000000 remap_level=1.000000 line=2.000000")
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()

View File

@@ -0,0 +1,5 @@
o<rm400> sub
(debug,m400 call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
o<rm400> endsub
m2
%

View File

@@ -0,0 +1,8 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
REMAP=M400 modalgroup=10 ngc=rm400

View File

@@ -0,0 +1 @@
M400 M30

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -i test.ini -g test.ngc 2>&1 | sed 's/^ *[0-9]* //'
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1,8 @@
Exercise nested remaps - three levels deep
each invocation bumps both call and remap level
at end of invocation both most be 0
also verify correct propagation and restore of sequence numbers

View File

@@ -0,0 +1,18 @@
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... MESSAGE("main call_level=0.000000 remap_level=0.000000 line=2.000000")
N..... MESSAGE("m400 handler pre call_level=1.000000 remap_level=1.000000 line=2.000000")
N..... MESSAGE("m401 handler pre call_level=2.000000 remap_level=2.000000 line=2.000000")
N..... MESSAGE("m402 handler pre call_level=3.000000 remap_level=3.000000 line=2.000000")
N..... MESSAGE("m403 handler pre call_level=4.000000 remap_level=4.000000 line=2.000000")
N..... MESSAGE("m402 handler post call_level=3.000000 remap_level=3.000000 line=4.000000")
N..... MESSAGE("m401 handler post call_level=2.000000 remap_level=2.000000 line=4.000000")
N..... MESSAGE("m400 handler post call_level=1.000000 remap_level=1.000000 line=4.000000")
N..... MESSAGE("main call_level=0.000000 remap_level=0.000000 line=4.000000")
N..... FINISH()
N..... ON_RESET()

View File

@@ -0,0 +1,7 @@
o<rm400> sub
(debug,m400 handler pre call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
m401
(debug,m400 handler post call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
o<rm400> endsub
m2
%

View File

@@ -0,0 +1,7 @@
o<rm401> sub
(debug,m401 handler pre call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
m402
(debug,m401 handler post call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
o<rm401> endsub
m2
%

View File

@@ -0,0 +1,7 @@
o<rm402> sub
(debug,m402 handler pre call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
m403
(debug,m402 handler post call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
o<rm402> endsub
m2
%

View File

@@ -0,0 +1,6 @@
o<rm403> sub
(debug,m403 handler pre call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
o<rm403> endsub
(debug,m403 handler post call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
m2
%

View File

@@ -0,0 +1,11 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
REMAP=M400 modalgroup=10 ngc=rm400
REMAP=M401 modalgroup=10 ngc=rm401
REMAP=M402 modalgroup=10 ngc=rm402
REMAP=M403 modalgroup=10 ngc=rm403

View File

@@ -0,0 +1,5 @@
%
(debug,main call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
m400
(debug,main call_level=#<_call_level> remap_level=#<_remap_level> line=#<_line>)
%

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -i test.ini -g test.ngc 2>&1 | sed 's/^ *[0-9]* //'
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1,6 @@
o<rm400> sub
(debug, call_level=#<_call_level> remap_level=#<_remap_level>)
m401
o<rm400> endsub
m2
%

View File

@@ -0,0 +1,3 @@
Exercise passing positional parameters to an NGC remap procedure
Verify ordering and argument count

View File

@@ -0,0 +1,18 @@
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... MESSAGE(" in rg881: n_args=3.000000 [1.000000] [2.000000] [3.000000] [0.000000] [0.000000]")
N..... MESSAGE(" in rg881: n_args=4.000000 [1.000000] [2.000000] [3.000000] [4.000000] [0.000000]")
N..... MESSAGE(" in rg881: n_args=4.000000 [1.000000] [2.000000] [3.000000] [5.000000] [0.000000]")
N..... MESSAGE(" in rg881: n_args=5.000000 [1.000000] [2.000000] [3.000000] [4.000000] [5.000000]")
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PROGRAM_END()
N..... ON_RESET()

View File

@@ -0,0 +1,5 @@
o<rg881> sub
(debug, in rg881: n_args=#<n_args> [#1] [#2] [#3] [#4] [#5])
o<rg881> endsub
m2
%

View File

@@ -0,0 +1,9 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
OWORD_NARGS = 1
REMAP=G88.1 modalgroup=1 argspec=@XYZpq ngc=rg881

View File

@@ -0,0 +1,7 @@
G88.1 X1 Y2 Z3
; NB: with positional argument calling it is impossible to tell which
; one of several optional parameters was passed!
G88.1 X1 Y2 Z3 P4
G88.1 X1 Y2 Z3 Q5
G88.1 X1 Y2 Z3 P4 Q5
M2

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -i test.ini -n 0 -g test.ngc| awk '{$1=""; print}'
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1,16 @@
This test verifies that M62-M68 can be remapped through both python
and NGC, and that calling the original M-codes is supported in the
remap subroutine.
It also serves as an example of how to do this, since esp. the M66
python function is not trivial and must be a generator yielding
`INTERP_EXECUTE_FINISH`.
The recursive call to the original functions needs supporting code for
mode 5 M-codes in `interp_convert.cc` `convert_m()`, and for M62-M68
in `rs274ngc_pre.cc`, `find_remappings()`.
The peculiar M66 needs special handling in the interpreter for
`input_flag`, and to ensure that its result (in param `#5399`) is
available within the remap, `Interp::pycall()` runs `read_inputs()`
before returning control back to the python generator.

View File

@@ -0,0 +1,123 @@
********** Testing python remaps
----Testing M62/M63 digital output w/motion----
cmd: "M62 P1"
M62 remapping pre: motion dout0=0; hal d_out=0
M62 remapping post: motion dout0=1; hal d_out=1
cmd: "M63 P1"
M63 remapping pre: motion dout0=1; hal d_out=1
M63 remapping post: motion dout0=0; hal d_out=0
cmd: "M62 P1"
M62 remapping pre: motion dout0=0; hal d_out=0
M62 remapping post: motion dout0=1; hal d_out=1
cmd: "M63 P1"
M63 remapping pre: motion dout0=1; hal d_out=1
M63 remapping post: motion dout0=0; hal d_out=0
----Testing M64/M65 digital output, immediate----
cmd: "M64 P1"
M64 remapping pre: motion dout0=0; hal d_out=0
M64 remapping post: motion dout0=1; hal d_out=1
cmd: "M65 P1"
M65 remapping pre: motion dout0=1; hal d_out=1
M65 remapping post: motion dout0=0; hal d_out=0
cmd: "M64 P1"
M64 remapping pre: motion dout0=0; hal d_out=0
M64 remapping post: motion dout0=1; hal d_out=1
cmd: "M65 P1"
M65 remapping pre: motion dout0=1; hal d_out=1
M65 remapping post: motion dout0=0; hal d_out=0
----Testing M66 digital input----
cmd: "M66 P1"; input: 1.0000
M66 remapping pre: 5399=0.000000; 100=0.000000; ain0=0.00; din0=0
M66 remapping post: 5399=1.000000; 100=1.000000; ain0=0.00; din0=1
cmd: "M66 P1"; input: 0.0000
M66 remapping pre: 5399=1.000000; 100=1.000000; ain0=0.00; din0=1
M66 remapping post: 5399=0.000000; 100=0.000000; ain0=0.00; din0=0
----Testing M66 analog input----
cmd: "M66 E1 L0"; input: 42.1300
M66 remapping pre: 5399=0.000000; 100=0.000000; ain0=0.00; din0=0
M66 remapping post: 5399=42.130000; 100=42.130000; ain0=42.13; din0=0
cmd: "M66 E1 L0"; input: -13.4200
M66 remapping pre: 5399=42.130000; 100=42.130000; ain0=42.13; din0=0
M66 remapping post: 5399=-13.420000; 100=-13.420000; ain0=-13.42; din0=0
----Testing M67 analog output w/motion----
cmd: "M67 E1 Q42.13"
M67 remapping pre: motion aout0=0.00; hal a_out=0.00
M67 remapping post: motion aout0=42.13; hal a_out=42.13
cmd: "M67 E1 Q-13.42"
M67 remapping pre: motion aout0=42.13; hal a_out=42.13
M67 remapping post: motion aout0=-13.42; hal a_out=-13.42
cmd: "M67 E1 Q0.00"
M67 remapping pre: motion aout0=-13.42; hal a_out=-13.42
M67 remapping post: motion aout0=0.00; hal a_out=0.00
----Testing M68 analog output, immediate----
cmd: "M68 E1 Q42.13"
M68 remapping pre: motion aout0=0.00; hal a_out=0.00
M68 remapping post: motion aout0=42.13; hal a_out=42.13
cmd: "M68 E1 Q-13.42"
M68 remapping pre: motion aout0=42.13; hal a_out=42.13
M68 remapping post: motion aout0=-13.42; hal a_out=-13.42
cmd: "M68 E1 Q0.00"
M68 remapping pre: motion aout0=-13.42; hal a_out=-13.42
M68 remapping post: motion aout0=0.00; hal a_out=0.00
********** Testing ngc remaps
----Testing M62/M63 digital output w/motion----
cmd: "M62 P1"
M62 remapping pre: motion dout0=0; hal d_out=0
M62 remapping post: motion dout0=1; hal d_out=1
cmd: "M63 P1"
M63 remapping pre: motion dout0=1; hal d_out=1
M63 remapping post: motion dout0=0; hal d_out=0
cmd: "M62 P1"
M62 remapping pre: motion dout0=0; hal d_out=0
M62 remapping post: motion dout0=1; hal d_out=1
cmd: "M63 P1"
M63 remapping pre: motion dout0=1; hal d_out=1
M63 remapping post: motion dout0=0; hal d_out=0
----Testing M64/M65 digital output, immediate----
cmd: "M64 P1"
M64 remapping pre: motion dout0=0; hal d_out=0
M64 remapping post: motion dout0=1; hal d_out=1
cmd: "M65 P1"
M65 remapping pre: motion dout0=1; hal d_out=1
M65 remapping post: motion dout0=0; hal d_out=0
cmd: "M64 P1"
M64 remapping pre: motion dout0=0; hal d_out=0
M64 remapping post: motion dout0=1; hal d_out=1
cmd: "M65 P1"
M65 remapping pre: motion dout0=1; hal d_out=1
M65 remapping post: motion dout0=0; hal d_out=0
----Testing M66 digital input----
cmd: "M66 P1"; input: 1.0000
M66 remapping pre: 5399=0.000000; 100=0.000000; ain0=0.00; din0=0
M66 remapping post: 5399=1.000000; 100=1.000000; ain0=0.00; din0=1
cmd: "M66 P1"; input: 0.0000
M66 remapping pre: 5399=1.000000; 100=1.000000; ain0=0.00; din0=1
M66 remapping post: 5399=0.000000; 100=0.000000; ain0=0.00; din0=0
----Testing M66 analog input----
cmd: "M66 E1 L0"; input: 42.1300
M66 remapping pre: 5399=0.000000; 100=0.000000; ain0=0.00; din0=0
M66 remapping post: 5399=42.130000; 100=42.130000; ain0=42.13; din0=0
cmd: "M66 E1 L0"; input: -13.4200
M66 remapping pre: 5399=42.130000; 100=42.130000; ain0=42.13; din0=0
M66 remapping post: 5399=-13.420000; 100=-13.420000; ain0=-13.42; din0=0
----Testing M67 analog output w/motion----
cmd: "M67 E1 Q42.13"
M67 remapping pre: motion aout0=0.00; hal a_out=0.00
M67 remapping post: motion aout0=42.13; hal a_out=42.13
cmd: "M67 E1 Q-13.42"
M67 remapping pre: motion aout0=42.13; hal a_out=42.13
M67 remapping post: motion aout0=-13.42; hal a_out=-13.42
cmd: "M67 E1 Q0.00"
M67 remapping pre: motion aout0=-13.42; hal a_out=-13.42
M67 remapping post: motion aout0=0.00; hal a_out=0.00
----Testing M68 analog output, immediate----
cmd: "M68 E1 Q42.13"
M68 remapping pre: motion aout0=0.00; hal a_out=0.00
M68 remapping post: motion aout0=42.13; hal a_out=42.13
cmd: "M68 E1 Q-13.42"
M68 remapping pre: motion aout0=42.13; hal a_out=42.13
M68 remapping post: motion aout0=-13.42; hal a_out=-13.42
cmd: "M68 E1 Q0.00"
M68 remapping pre: motion aout0=-13.42; hal a_out=-13.42
M68 remapping post: motion aout0=0.00; hal a_out=0.00

View File

@@ -0,0 +1,13 @@
o<io_input_M66> sub
(debug,X io_input_M66 remapping pre: 5399=#5399)
o<analog_or_digital> if [EXISTS[#<e>]]
; analog input
M66 E0 L0
o<analog_or_digital> else
; digital input
M66 P0 L0
o<analog_or_digital> endif
; Result should be available here after M66; save it for test to check
#100 = #5399
(debug,X io_input_M66 remapping post: 5399=#5399)
o<io_input_M66> endsub

View File

@@ -0,0 +1,5 @@
o<io_output_M62> sub
(debug,X io_output_M62 remapping pre: 5399=#5399)
M62 P0
(debug,X io_output_M62 remapping post: 5399=#5399)
o<io_output_M62> endsub

View File

@@ -0,0 +1,3 @@
o<io_output_M63> sub
M63 P0
o<io_output_M63> endsub

View File

@@ -0,0 +1,3 @@
o<io_output_M64> sub
M64 P0
o<io_output_M64> endsub

View File

@@ -0,0 +1,3 @@
o<io_output_M65> sub
M65 P0
o<io_output_M65> endsub

View File

@@ -0,0 +1,3 @@
o<io_output_M67> sub
M67 E0 Q#<Q>
o<io_output_M67> endsub

View File

@@ -0,0 +1,3 @@
o<io_output_M68> sub
M68 E0 Q#<Q>
o<io_output_M68> endsub

View File

@@ -0,0 +1,129 @@
# This config file was created 2017-05-10 09:59:22.679734 by the update_ini script
# The original config files may be found in the /home/jepler/src/linuxcnc/master/tests/remap/remap-io/test-ngc.old directory
[EMC]
# The version string for this INI file.
VERSION = 1.1
DEBUG = 0x0
[DISPLAY]
DISPLAY = ./test-ui.py
[FILTER]
#No Content
[RS274NGC]
PARAMETER_FILE = sim.var
SUBROUTINE_PATH = .
REMAP= M62 modalgroup=5 argspec=P ngc=io_output_m62
REMAP= M63 modalgroup=5 argspec=P ngc=io_output_m63
REMAP= M64 modalgroup=5 argspec=P ngc=io_output_m64
REMAP= M65 modalgroup=5 argspec=P ngc=io_output_m65
REMAP= M66 modalgroup=5 argspec=pelq ngc=io_input_m66
REMAP= M67 modalgroup=5 argspec=EQ ngc=io_output_m67
REMAP= M68 modalgroup=5 argspec=EQ ngc=io_output_m68
[EMCMOT]
EMCMOT = motmod
COMM_TIMEOUT = 4.0
BASE_PERIOD = 0
SERVO_PERIOD = 1000000
[TASK]
TASK = milltask
CYCLE_TIME = 0.001
[HAL]
HALUI = halui
HALFILE = core_sim.hal
[HALUI]
#No Content
[TRAJ]
NO_FORCE_HOMING=1
AXES = 3
COORDINATES = X Y Z
HOME = 0 0 0
LINEAR_UNITS = inch
ANGULAR_UNITS = degree
DEFAULT_LINEAR_VELOCITY = 1.2
MAX_LINEAR_VELOCITY = 4
[EMCIO]
TOOL_TABLE = simpockets.tbl
TOOL_CHANGE_QUILL_UP = 1
RANDOM_TOOLCHANGER = 0
[KINS]
KINEMATICS = trivkins
#This is a best-guess at the number of joints, it should be checked
JOINTS = 3
[AXIS_X]
MIN_LIMIT = -40.0
MAX_LIMIT = 40.0
MAX_VELOCITY = 4
MAX_ACCELERATION = 1000.0
[JOINT_0]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 4
MAX_ACCELERATION = 1000.0
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 1.000
MIN_LIMIT = -40.0
MAX_LIMIT = 40.0
FERROR = 0.050
MIN_FERROR = 0.010
[AXIS_Y]
MIN_LIMIT = -40.0
MAX_LIMIT = 40.0
MAX_VELOCITY = 4
MAX_ACCELERATION = 1000.0
[JOINT_1]
TYPE = LINEAR
HOME = 0.000
MAX_VELOCITY = 4
MAX_ACCELERATION = 1000.0
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 1.000
MIN_LIMIT = -40.0
MAX_LIMIT = 40.0
FERROR = 0.050
MIN_FERROR = 0.010
[AXIS_Z]
MIN_LIMIT = -40.0
MAX_LIMIT = 40.0
MAX_VELOCITY = 4
MAX_ACCELERATION = 1000.0
[JOINT_2]
TYPE = LINEAR
HOME = 0.0
MAX_VELOCITY = 4
MAX_ACCELERATION = 1000.0
BACKLASH = 0.000
INPUT_SCALE = 4000
OUTPUT_SCALE = 1.000
MIN_LIMIT = -40.0
MAX_LIMIT = 40.0
FERROR = 0.050
MIN_FERROR = 0.010
[PYTHON]
TOPLEVEL= toplevel.py
PATH_PREPEND= .

View File

@@ -0,0 +1,13 @@
#!/bin/bash -e
export PYTHONUNBUFFERED=1
do_test() {
INI="$1"
linuxcnc -r "$INI" | grep -i m6
}
echo "********** Testing python remaps"
do_test test-py.ini
echo
echo "********** Testing ngc remaps"
do_test test-ngc.ini

View File

@@ -0,0 +1,4 @@
Exercise remap sequencing of one G and 4 M-codes per line (MAX_EMS limit)
regardless of ordering of codes on the line the execution order
must reflect an ascending sequence

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,48 @@
#!/usr/bin/env python3
# This is a component of LinuxCNC
# Copyright 2011 Michael Haberler <git@mah.priv.at>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#http://stackoverflow.com/questions/361/generate-list-of-all-possible-permutations-of-a-string
def nextPermutation(perm):
k0 = None
for i in range(len(perm)-1):
if perm[i]<perm[i+1]:
k0=i
if k0 == None:
return None
l0 = k0+1
for i in range(k0+1, len(perm)):
if perm[k0] < perm[i]:
l0 = i
perm[k0], perm[l0] = perm[l0], perm[k0]
perm[k0+1:] = reversed(perm[k0+1:])
return perm
perm=["g88.1x1", "m405","m406","m407","m408"]
while perm:
print(perm)
perm = nextPermutation(perm)
perm=["g88.1x1", "m407","m408","m409","m410"]
while perm:
print(perm)
perm = nextPermutation(perm)

View File

@@ -0,0 +1,11 @@
o<rg881> sub
o100 if [[#<_seq>] GT 10]
(debug,G88.1 sequencing error - seq=#<_seq>)
o100 else
(debug, seq=#<_seq> - reset to 1)
o100 endif
#<_seq> = 1
o<rg881> endsub
m2
%

View File

@@ -0,0 +1,10 @@
o<rm405> sub
o100 if [[#<_seq>] GT 5]
(debug,M405 sequencing error - seq=#<_seq>)
o100 else
(debug, seq=#<_seq>)
o100 endif
#<_seq> = 5
o<rm405> endsub
m2
%

View File

@@ -0,0 +1,10 @@
o<rm406> sub
o100 if [[#<_seq>] GT 6]
(debug,M406 sequencing error - seq=#<_seq>)
o100 else
(debug, seq=#<_seq>)
o100 endif
#<_seq> = 6
o<rm406> endsub
m2
%

View File

@@ -0,0 +1,10 @@
o<rm407> sub
o100 if [[#<_seq>] GT 7]
(debug,M407 sequencing error - seq=#<_seq>)
o100 else
(debug, seq=#<_seq>)
o100 endif
#<_seq> = 7
o<rm407> endsub
m2
%

View File

@@ -0,0 +1,10 @@
o<rm408> sub
o100 if [[#<_seq>] GT 8]
(debug,M408 sequencing error - seq=#<_seq>)
o100 else
(debug, seq=#<_seq>)
o100 endif
#<_seq> = 8
o<rm408> endsub
m2
%

View File

@@ -0,0 +1,10 @@
o<rm409> sub
o100 if [[#<_seq>] GT 9]
(debug,M409 sequencing error - seq=#<_seq>)
o100 else
(debug, seq=#<_seq>)
o100 endif
#<_seq> = 9
o<rm409> endsub
m2
%

View File

@@ -0,0 +1,10 @@
o<rm410> sub
o100 if [[#<_seq>] GT 10]
(debug,M410 sequencing error - seq=#<_seq>)
o100 else
(debug, seq=#<_seq>)
o100 endif
#<_seq> = 10
o<rm410> endsub
m2
%

View File

@@ -0,0 +1,16 @@
[EMC]
DEBUG=0
LOG_LEVEL=0
[RS274NGC]
SUBROUTINE_PATH = .
REMAP=G88.1 ngc=rg881
# one M-code from each modal group
REMAP=M405 modalgroup=5 ngc=rm405
REMAP=M406 modalgroup=6 ngc=rm406
REMAP=M407 modalgroup=7 ngc=rm407
REMAP=M408 modalgroup=8 ngc=rm408
REMAP=M409 modalgroup=9 ngc=rm409
REMAP=M410 ngc=rm410

View File

@@ -0,0 +1,245 @@
; one G, 4 M-codes per line
#<_seq> = 1
g88.1x1 m405 m406 m407 m408
g88.1x1 m405 m406 m408 m407
g88.1x1 m405 m407 m406 m408
g88.1x1 m405 m407 m408 m406
g88.1x1 m405 m408 m406 m407
g88.1x1 m405 m408 m407 m406
g88.1x1 m406 m405 m407 m408
g88.1x1 m406 m405 m408 m407
g88.1x1 m406 m407 m405 m408
g88.1x1 m406 m407 m408 m405
g88.1x1 m406 m408 m405 m407
g88.1x1 m406 m408 m407 m405
g88.1x1 m407 m405 m406 m408
g88.1x1 m407 m405 m408 m406
g88.1x1 m407 m406 m405 m408
g88.1x1 m407 m406 m408 m405
g88.1x1 m407 m408 m405 m406
g88.1x1 m407 m408 m406 m405
g88.1x1 m408 m405 m406 m407
g88.1x1 m408 m405 m407 m406
g88.1x1 m408 m406 m405 m407
g88.1x1 m408 m406 m407 m405
g88.1x1 m408 m407 m405 m406
g88.1x1 m408 m407 m406 m405
m405 g88.1x1 m406 m407 m408
m405 g88.1x1 m406 m408 m407
m405 g88.1x1 m407 m406 m408
m405 g88.1x1 m407 m408 m406
m405 g88.1x1 m408 m406 m407
m405 g88.1x1 m408 m407 m406
m405 m406 g88.1x1 m407 m408
m405 m406 g88.1x1 m408 m407
m405 m406 m407 g88.1x1 m408
m405 m406 m407 m408 g88.1x1
m405 m406 m408 g88.1x1 m407
m405 m406 m408 m407 g88.1x1
m405 m407 g88.1x1 m406 m408
m405 m407 g88.1x1 m408 m406
m405 m407 m406 g88.1x1 m408
m405 m407 m406 m408 g88.1x1
m405 m407 m408 g88.1x1 m406
m405 m407 m408 m406 g88.1x1
m405 m408 g88.1x1 m406 m407
m405 m408 g88.1x1 m407 m406
m405 m408 m406 g88.1x1 m407
m405 m408 m406 m407 g88.1x1
m405 m408 m407 g88.1x1 m406
m405 m408 m407 m406 g88.1x1
m406 g88.1x1 m405 m407 m408
m406 g88.1x1 m405 m408 m407
m406 g88.1x1 m407 m405 m408
m406 g88.1x1 m407 m408 m405
m406 g88.1x1 m408 m405 m407
m406 g88.1x1 m408 m407 m405
m406 m405 g88.1x1 m407 m408
m406 m405 g88.1x1 m408 m407
m406 m405 m407 g88.1x1 m408
m406 m405 m407 m408 g88.1x1
m406 m405 m408 g88.1x1 m407
m406 m405 m408 m407 g88.1x1
m406 m407 g88.1x1 m405 m408
m406 m407 g88.1x1 m408 m405
m406 m407 m405 g88.1x1 m408
m406 m407 m405 m408 g88.1x1
m406 m407 m408 g88.1x1 m405
m406 m407 m408 m405 g88.1x1
m406 m408 g88.1x1 m405 m407
m406 m408 g88.1x1 m407 m405
m406 m408 m405 g88.1x1 m407
m406 m408 m405 m407 g88.1x1
m406 m408 m407 g88.1x1 m405
m406 m408 m407 m405 g88.1x1
m407 g88.1x1 m405 m406 m408
m407 g88.1x1 m405 m408 m406
m407 g88.1x1 m406 m405 m408
m407 g88.1x1 m406 m408 m405
m407 g88.1x1 m408 m405 m406
m407 g88.1x1 m408 m406 m405
m407 m405 g88.1x1 m406 m408
m407 m405 g88.1x1 m408 m406
m407 m405 m406 g88.1x1 m408
m407 m405 m406 m408 g88.1x1
m407 m405 m408 g88.1x1 m406
m407 m405 m408 m406 g88.1x1
m407 m406 g88.1x1 m405 m408
m407 m406 g88.1x1 m408 m405
m407 m406 m405 g88.1x1 m408
m407 m406 m405 m408 g88.1x1
m407 m406 m408 g88.1x1 m405
m407 m406 m408 m405 g88.1x1
m407 m408 g88.1x1 m405 m406
m407 m408 g88.1x1 m406 m405
m407 m408 m405 g88.1x1 m406
m407 m408 m405 m406 g88.1x1
m407 m408 m406 g88.1x1 m405
m407 m408 m406 m405 g88.1x1
m408 g88.1x1 m405 m406 m407
m408 g88.1x1 m405 m407 m406
m408 g88.1x1 m406 m405 m407
m408 g88.1x1 m406 m407 m405
m408 g88.1x1 m407 m405 m406
m408 g88.1x1 m407 m406 m405
m408 m405 g88.1x1 m406 m407
m408 m405 g88.1x1 m407 m406
m408 m405 m406 g88.1x1 m407
m408 m405 m406 m407 g88.1x1
m408 m405 m407 g88.1x1 m406
m408 m405 m407 m406 g88.1x1
m408 m406 g88.1x1 m405 m407
m408 m406 g88.1x1 m407 m405
m408 m406 m405 g88.1x1 m407
m408 m406 m405 m407 g88.1x1
m408 m406 m407 g88.1x1 m405
m408 m406 m407 m405 g88.1x1
m408 m407 g88.1x1 m405 m406
m408 m407 g88.1x1 m406 m405
m408 m407 m405 g88.1x1 m406
m408 m407 m405 m406 g88.1x1
m408 m407 m406 g88.1x1 m405
m408 m407 m406 m405 g88.1x1
g88.1x1 m407 m408 m409 m410
g88.1x1 m407 m408 m410 m409
g88.1x1 m407 m409 m408 m410
g88.1x1 m407 m409 m410 m408
g88.1x1 m407 m410 m408 m409
g88.1x1 m407 m410 m409 m408
g88.1x1 m408 m407 m409 m410
g88.1x1 m408 m407 m410 m409
g88.1x1 m408 m409 m407 m410
g88.1x1 m408 m409 m410 m407
g88.1x1 m408 m410 m407 m409
g88.1x1 m408 m410 m409 m407
g88.1x1 m409 m407 m408 m410
g88.1x1 m409 m407 m410 m408
g88.1x1 m409 m408 m407 m410
g88.1x1 m409 m408 m410 m407
g88.1x1 m409 m410 m407 m408
g88.1x1 m409 m410 m408 m407
g88.1x1 m410 m407 m408 m409
g88.1x1 m410 m407 m409 m408
g88.1x1 m410 m408 m407 m409
g88.1x1 m410 m408 m409 m407
g88.1x1 m410 m409 m407 m408
g88.1x1 m410 m409 m408 m407
m407 g88.1x1 m408 m409 m410
m407 g88.1x1 m408 m410 m409
m407 g88.1x1 m409 m408 m410
m407 g88.1x1 m409 m410 m408
m407 g88.1x1 m410 m408 m409
m407 g88.1x1 m410 m409 m408
m407 m408 g88.1x1 m409 m410
m407 m408 g88.1x1 m410 m409
m407 m408 m409 g88.1x1 m410
m407 m408 m409 m410 g88.1x1
m407 m408 m410 g88.1x1 m409
m407 m408 m410 m409 g88.1x1
m407 m409 g88.1x1 m408 m410
m407 m409 g88.1x1 m410 m408
m407 m409 m408 g88.1x1 m410
m407 m409 m408 m410 g88.1x1
m407 m409 m410 g88.1x1 m408
m407 m409 m410 m408 g88.1x1
m407 m410 g88.1x1 m408 m409
m407 m410 g88.1x1 m409 m408
m407 m410 m408 g88.1x1 m409
m407 m410 m408 m409 g88.1x1
m407 m410 m409 g88.1x1 m408
m407 m410 m409 m408 g88.1x1
m408 g88.1x1 m407 m409 m410
m408 g88.1x1 m407 m410 m409
m408 g88.1x1 m409 m407 m410
m408 g88.1x1 m409 m410 m407
m408 g88.1x1 m410 m407 m409
m408 g88.1x1 m410 m409 m407
m408 m407 g88.1x1 m409 m410
m408 m407 g88.1x1 m410 m409
m408 m407 m409 g88.1x1 m410
m408 m407 m409 m410 g88.1x1
m408 m407 m410 g88.1x1 m409
m408 m407 m410 m409 g88.1x1
m408 m409 g88.1x1 m407 m410
m408 m409 g88.1x1 m410 m407
m408 m409 m407 g88.1x1 m410
m408 m409 m407 m410 g88.1x1
m408 m409 m410 g88.1x1 m407
m408 m409 m410 m407 g88.1x1
m408 m410 g88.1x1 m407 m409
m408 m410 g88.1x1 m409 m407
m408 m410 m407 g88.1x1 m409
m408 m410 m407 m409 g88.1x1
m408 m410 m409 g88.1x1 m407
m408 m410 m409 m407 g88.1x1
m409 g88.1x1 m407 m408 m410
m409 g88.1x1 m407 m410 m408
m409 g88.1x1 m408 m407 m410
m409 g88.1x1 m408 m410 m407
m409 g88.1x1 m410 m407 m408
m409 g88.1x1 m410 m408 m407
m409 m407 g88.1x1 m408 m410
m409 m407 g88.1x1 m410 m408
m409 m407 m408 g88.1x1 m410
m409 m407 m408 m410 g88.1x1
m409 m407 m410 g88.1x1 m408
m409 m407 m410 m408 g88.1x1
m409 m408 g88.1x1 m407 m410
m409 m408 g88.1x1 m410 m407
m409 m408 m407 g88.1x1 m410
m409 m408 m407 m410 g88.1x1
m409 m408 m410 g88.1x1 m407
m409 m408 m410 m407 g88.1x1
m409 m410 g88.1x1 m407 m408
m409 m410 g88.1x1 m408 m407
m409 m410 m407 g88.1x1 m408
m409 m410 m407 m408 g88.1x1
m409 m410 m408 g88.1x1 m407
m409 m410 m408 m407 g88.1x1
m410 g88.1x1 m407 m408 m409
m410 g88.1x1 m407 m409 m408
m410 g88.1x1 m408 m407 m409
m410 g88.1x1 m408 m409 m407
m410 g88.1x1 m409 m407 m408
m410 g88.1x1 m409 m408 m407
m410 m407 g88.1x1 m408 m409
m410 m407 g88.1x1 m409 m408
m410 m407 m408 g88.1x1 m409
m410 m407 m408 m409 g88.1x1
m410 m407 m409 g88.1x1 m408
m410 m407 m409 m408 g88.1x1
m410 m408 g88.1x1 m407 m409
m410 m408 g88.1x1 m409 m407
m410 m408 m407 g88.1x1 m409
m410 m408 m407 m409 g88.1x1
m410 m408 m409 g88.1x1 m407
m410 m408 m409 m407 g88.1x1
m410 m409 g88.1x1 m407 m408
m410 m409 g88.1x1 m408 m407
m410 m409 m407 g88.1x1 m408
m410 m409 m407 m408 g88.1x1
m410 m409 m408 g88.1x1 m407
m410 m409 m408 m407 g88.1x1
m2
%

View File

@@ -0,0 +1,4 @@
#!/bin/bash
export INI_FILE_NAME=test.ini
rs274 -i "$INI_FILE_NAME" -g test.ngc | awk '{$1=""; print}'
exit "${PIPESTATUS[0]}"