1. Problem Overview
On a Siemens SINUMERIK 840D Powerline (and the 840D sl successor), a part program running in Channel 1 frequently needs to launch a coordinated auxiliary program in Channel 2. Typical scenarios include:
- Tool-search or tool-change subroutines that must run on a different axis group while the main program continues.
- Loading/unloading cycles on a second channel assigned to a loader or gantry.
- Synchronised sub-programs that must begin only when the spindle in another channel reaches a defined position.
The most common failure is alarm 16912 raised the first time the source channel attempts to select a program in the target channel:
16912 Channel %1 program control: action %2 only possible in reset state.
The alarm stops the cross-channel select action. Operators see the channel go to Reset or Interrupted, and the called program is never loaded. The condition is almost always fixable in software (NC code and machine data) without changing the PLC program.
2. Alarm 16912 — Decoding and Behaviour
Alarm 16912 belongs to the Program control alarm group. The two parameters expand as:
| Parameter | Meaning |
|---|---|
| %1 | Channel number (target channel) on which the illegal action was attempted |
| %2 | Index of the action: 1 = INIT (program selection), 2 = START, 3 = select via HMI, 4 = select via PI service, etc. |
Typical Clear conditions:
- NCK POWER ON reset of the alarm counter (only after a full boot).
- Successful transition of the target channel into Reset state followed by re-issuing the action.
- Successful
INITfollowed bySTARTin the correct order — in this case the alarm self-clears once the program begins to run.
Alarm 16912 has Display and Reaction behaviour identical to most cross-channel select errors: the alarm is shown in the alarm line, channel-ready and feed-hold are cleared, and the running program in the source channel is interrupted at the block boundary that issued the offending command.
3. Root Cause — Why INIT Triggers 16912
The 840D NCK enforces a strict state machine on every channel. The state diagram (in simplified form) is:
Reset --> Active --> Interrupted --> Reset
^ |
|________________|
Each command is only accepted from a specific state:
| NC Command | Accepted From | Effect |
|---|---|---|
| INIT(chan,"_N_<prog>_MPF") | Target channel in Reset (preferred) or Interrupted | Selects (loads) the named program into the target channel; does not start it |
| START(chan) | Target channel in Reset with a program already selected | Starts the previously selected program |
| START(chan, n) (n block number) | Same as above | Starts and skips forward to search point |
| WAITM / WAITE / WAITMC | Any state in the BAG | Synchronises channels within the same mode group |
The root cause of the 16912 in the typical case is therefore one of the following:
- Target channel is in Active state — a program is already running, and the NCK refuses to overwrite the current selection.
- Source and target channels belong to different Mode Groups (BAGs) — INIT/START are intra-BAG primitives and silently fail or alarm when the target is in a different BAG.
-
Channel name not configured — the user is calling INIT/START with a symbolic channel name and bit 1 of
MD10280 $MN_PROG_FUNCTION_MASKis not set, so the NCK does not accept the name and raises 16912. - MD10708 $MN_SERUPRO_MASK is set to block program selection in the current run mode (rare, but seen on commissioning builds).
4. Channel and Mode Group (BAG) Architecture
Every axis, spindle, and channel on the 840D belongs to a Mode Group (German: Betriebsartengruppe, BAG). Two channels can only be controlled from each other if they share the same BAG.
| MD | Name | Effect on cross-channel calls |
|---|---|---|
| MD10010 $MN_ASSIGN_CHAN_TO_MODE_GROUP | Channel-to-BAG assignment | Determines which channels can INIT/START each other |
| MD10280 $MN_PROG_FUNCTION_MASK, bit 1 | Channel name programming | If TRUE, channel may be referenced symbolically (e.g. CHAN_2) in INIT/START |
| MD19200 $ON_LAST_KEY | (older) operator interface fallback | No effect on INIT/START |
Verify BAG membership by reading the channel state display (MENU SELECT > DIAGNOSIS > CHANNEL STATUS) or via the PLC interface DB21..DB28.DBB5 (active BAG, active channel). If channels 1 and 2 are in different BAGs, INIT from 1 to 2 always fails with 16912 (or, depending on the SW build, silently does nothing).
5. Two-Step Execution Model: INIT Then START
The Siemens programming manual (Function Manual, Basic Functions, section "Channel-synchronous program coordination") documents the two-step model. The correct sequence is:
- INIT — load (select) a program in the target channel. The target channel must be in RESET or INTERRUPTED.
- START — execute the previously loaded program. The target channel must still be in RESET, and the program must have been selected by a prior INIT, by HMI, or by a PI service.
Issuing START before INIT, or issuing INIT while the target channel is in Active, triggers 16912. The NCK does not auto-recover; the program must be re-initiated after the alarm is cleared.
6. Required Machine Data — MD10280 $MN_PROG_FUNCTION_MASK
When the program references the target channel by name (e.g. INIT("CHAN_2", "_N_TOOLCHG_MPF")), bit 1 of MD10280 must be set:
MD10280 $MN_PROG_FUNCTION_MASK, Bit 1 = 1 ; symbolic channel names allowed
If the user calls INIT with the channel number (e.g. INIT(2, "_N_TOOLCHG_MPF")) this bit is not required, and the call works on every SW release of the 840D Powerline and 840D sl. Recommended best practice is to use the numeric form in production NC code to avoid a startup-time MD check:
; In Channel 1
INIT(2, "_N_TOOLCHG_MPF") ; select tool-change program in CH2
START(2) ; start it
...
7. PLC Interface for Cross-Channel Cycle Start
Sometimes the cross-channel trigger originates in the PLC, not in NC code. The PLC interface for cycle start is on the per-channel DB:
| PLC Address | Signal | Direction |
|---|---|---|
| DB21..DB28.DBX7.1 | Cycle start (NC start) | PLC → NCK |
| DB21..DB28.DBX7.3 | NC stop | PLC → NCK |
| DB21..DB28.DBX7.7 | Reset | PLC → NCK |
| DB21..DB28.DBB5 | Current BAG / channel state | NCK → PLC |
| DB21..DB28.DBB6 | Last active program name (ASCII) | NCK → PLC |
The PLC can therefore implement its own cross-channel cycle start by:
- Setting a 0 → 1 edge on
DB22.DBX7.7to put CH2 in Reset. - Waiting for
DB22.DBX6.4(channel ready) to be FALSE. - Using PI service
_N_CHAN1to select the program in CH2 (PI service index varies by SW release — see Programming Manual PI services). - Setting a 0 → 1 edge on
DB22.DBX7.1to start the selected program.
This PLC-driven path is often used by the machine builder for hand-loading cycles where no HMI selection is available.
8. ASUB Alternative — FC9
When the target program must run interrupting the current program in the same channel — for instance, to service a tool-change request from PLC — use an Asynchronous Subprogram triggered by the PLC. The standard Siemens FB is FC9 (ASUB) in the PLC basic program.
; PLC side — call FC9 to start an ASUB
CALL FC9
ACT := M100.0 ; trigger edge
PRGNO := 1 ; 1 = _N_ASUP1_MPF
PROGPATH:= '/_N_CST_DIR/' ; directory containing ASUB
LUDATA := ; user data (LUD) - empty for simple case
RETVAL := MW200 ; return value (16-bit error code)
CP := ; optional continuation
ASUP := DB1234 ; ASUB data block (FB4 internal)
FC9 handles the channel state machine internally: it puts the channel into the right mode, loads the ASUB, executes it, and restores the interrupted program. It does not raise 16912 because the same channel is targeted, so no cross-channel state conflict is created. Use FC9 when the helper program must run in the same channel as the caller; use INIT/START when the helper program must run in a different channel of the same BAG.
9. NC Code Examples
9.1 Numeric channel reference (recommended)
;***********************************************************
; CH1 main program — _N_MAIN_MPF
; Trigger tool-change in CH2 and synchronise
;***********************************************************
N10 G01 X100 F500
N20 T="TOOL15" D1
N30 M206 ; custom M-code: set PLC flag, request tool change in CH2
N40 ; At this point CH1 waits for CH2 to complete tool change
N50 INIT(2, "_N_TOOLCHG_MPF") ; select tool-change program in CH2
N60 START(2) ; start it
N70 WAITM(50, 1, 2) ; synchronise — both channels must reach mark 50
N80 G01 X120 F500
...
9.2 Symbolic channel reference (requires MD10280 bit 1)
DEF CHAN _CHAN_2 = 2 ; optional alias
N10 INIT("CHAN_2", "_N_TOOLCHG_MPF")
N20 START("CHAN_2")
...
9.3 Cross-channel reset of target before select
; If CH2 may be in Active state, force a reset first via PLC
; (NC cannot directly put another channel in Reset from part program)
N10 M210 ; custom M-code signals PLC to assert DB22.DBX7.7
N20 M211 ; custom M-code signals PLC to assert DB22.DBX7.1 once ready
; PLC must debounce and verify channel state before starting
N30 WAITM(99, 1, 2)
10. Commissioning and Verification Procedure
-
Confirm BAG layout. Read
MD10010 $MN_ASSIGN_CHAN_TO_MODE_GROUPfor both channels. If they are in different BAGs, INIT/START will not work; either change the MD (with OEM approval) or use the PLC-driven cycle start path. - Set MD10280 bit 1 if symbolic channel names are used in NC code.
- Boot the NCK with the new MD values and check the alarm history.
- Test from HMI first. Manually select and start the target program in CH2. This isolates the cross-channel NC logic from the PLC logic. If HMI selection also raises 16912, the issue is the NC state, not your INIT syntax.
-
Issue INIT only from CH1 with CH2 in Reset, and verify the program name appears in
DB22.DBB6..(last loaded program). If it does not, the INIT failed silently — checkMD10708 $MN_SERUPRO_MASKand the alarm line. -
Issue START from CH1. Verify
DB22.DBX6.4(channel active) transitions to TRUE within one IPO cycle. - Add a WAITM to synchronise both channels at a known point. Confirm in the HMI synchronisation display that both channels reach the same wait mark.
-
Record a trace of
DB22.DBX7.1,DB22.DBX6.4, and the alarm line during the next test cycle. Save the trace for OEM review.
11. Troubleshooting Matrix
| Symptom | Probable Cause | Fix |
|---|---|---|
| 16912 on first INIT, target CH2 in Reset | MD10280 bit 1 = 0 and INIT uses channel name | Use numeric form INIT(2, ...) or set MD10280 bit 1 = 1 |
| 16912 on INIT, target CH2 running another program | Target channel in Active state | Stop/reset CH2 from PLC first, then INIT |
| 16912 on INIT, target CH2 in different BAG | MD10010 mismatch | Reassign channel to common BAG or use PLC cycle start |
| 16912 on START (not on INIT) | START issued before INIT, or after an INIT that selected a non-existent program | Re-issue INIT first, then START, with correct program path |
| No 16912, but CH2 does not start | Program selected but not yet active; WAITM blocking; PLC not asserting cycle start | Check WAITM marks; check DB22.DBX7.1 edge in PLC |
| 16912 intermittent on production runs | Race condition between PLC reset and NC INIT | Insert 1 IPO cycle delay in PLC; check PLC OB1 cycle time |
| 16912 after power-on, both channels idle | Channel name string in INIT differs from configured name (case, prefix, length) | Compare against the name defined in MD20000 $MC_CHAN_NAME
|
12. Related Machine Data Quick Reference
| MD | Name | Default / Typical | Purpose |
|---|---|---|---|
| MD10010 | $MN_ASSIGN_CHAN_TO_MODE_GROUP | [1,1,2,2,3,3...] | Channel-to-BAG assignment |
| MD10280 | $MN_PROG_FUNCTION_MASK, bit 1 | 0H | Allow symbolic channel names in NC |
| MD10708 | $MN_SERUPRO_MASK | 0H | Block program selection in search/run modes |
| MD20000 | $MC_CHAN_NAME | CHAN_1, CHAN_2 ... | Symbolic channel name used in INIT/START |
| MD20150 | $MC_GCODE_RESET_VALUES | G0/G1 ... | Default G codes at reset — not directly related, but affects INIT behaviour when the new program inherits reset-state G codes |
13. Engineering Notes and Caveats
-
NCK versions differ. Bit 1 of MD10280 was introduced in SW 5.x of the 840D Powerline. On SW 4.x, only numeric channel references are accepted; symbolic references are rejected, often with 16912. Always check the SW version with
MD18030 $MN_HW_VERSIONand the SW build number on the HMI about screen. -
Synchronous actions. If the cross-channel select is triggered from a synchronous action (
WHEN ... DO INIT(...)), the synchronous action runs in a special state and INIT may behave differently. Test synchronous-action triggers with the same care as the part-program path. -
Tool change over INIT. For a tool change that must occur across two channels, the canonical Siemens-recommended path is the PLC. Use the PLC to set the tool-change request, then have the PLC drive
DB22.DBX7.1after loading the tool-change program via PI service. INIT-from-NC works, but is harder to interlock with the PLC's tool-life monitor and magazine logic. -
Block search. In block-search mode, INIT/START is replaced by a search target. If the search target contains
INIT, the NCK raises 16912 unlessMD10708 $MN_SERUPRO_MASK, bit 1permits asynchronous program selection during search. - Safety path. Cross-channel INIT/START is a coordination tool, not a safety tool. Safety-relevant interlocks (guard doors, E-stop, axis-safe stop) belong in the PLC and F-SMs, never in NC code that calls another channel's program.
14. Verification Checklist
- Channels 1 and 2 are in the same BAG (verified via HMI BAG display).
- MD10280 bit 1 is set (or INIT uses a numeric channel number).
- Target program exists in the file system at the path used in INIT (e.g.
/_N_CST_DIR/_N_TOOLCHG_MPF). - CH2 is in Reset state when INIT is issued.
- START is issued only after INIT, with CH2 still in Reset.
- WAITM marks are paired in both channels' programs.
- Alarm line is clear after the first successful run.
- Repeat the cycle at least 10 times under load to catch intermittent races.
15. Summary
Alarm 16912 on a Siemens 840D Powerline, raised when INIT or START targets a second channel, is almost always a state-machine or configuration mismatch — not a programming bug. The two channels must share a Mode Group, the target channel must be in Reset when INIT runs, and the START command must come after the INIT. If the user prefers to drive the second channel from the PLC, use the per-channel cycle-start signal DB22.DBX7.1 after a PI service has selected the program. For helper programs that must run in the same channel as the caller, prefer the ASUB path through FC9. With these rules, 16912 stops being an obstacle and becomes a quick state-validation alarm you can clear in one cycle.
FAQ
What does Siemens 840D alarm 16912 mean exactly?
Alarm 16912 ("Channel %1 program control: action %2 only possible in reset state") indicates the NCK rejected a program-control action (typically INIT or START) because the target channel is not in Reset state. Parameter %1 is the target channel number, %2 is the action index (1 = INIT, 2 = START, etc.). The alarm clears when the target channel returns to Reset and the action is re-issued.
Do I need MD10280 $MN_PROG_FUNCTION_MASK for INIT to work?
Only if you reference the target channel by symbolic name (for example INIT("CHAN_2", ...)). If you use the numeric form INIT(2, ...), MD10280 bit 1 is not required and works on every 840D Powerline SW version. Recommended for production NC code.
Can I INIT a program into a channel that belongs to a different BAG?
No. INIT and START only operate between channels in the same Mode Group (BAG). For channels in different BAGs you must trigger the target program from the PLC by using the cycle-start signal on the target channel's DB (for example DB22.DBX7.1), or by using a PI service to load the program and then a PLC-driven cycle start.
What is the difference between INIT and START in NC code?
INIT selects (loads) a named program into the target channel but does not start it. START launches the program already selected in the target channel. The standard pattern is INIT(2, "_N_PROG_MPF") followed by START(2). Issuing START without a prior INIT, or issuing INIT on a channel that is in Active state, raises 16912.
Should I use INIT/START or FC9 ASUB for a tool-change helper?
Use INIT/START when the helper program must run in a different channel of the same BAG (for example a second-channel gantry or loader). Use FC9 ASUB when the helper program must run in the same channel as the caller, interrupting the current program and restoring it afterwards. For safety interlocked tool changes, the PLC-driven path with DB22.DBX7.1 is the OEM-recommended option.