Siemens 840D Alarm 16912: Cross-Channel Program Init and Start

David Krause13 min read
Motion ControlSiemensTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

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.

Important: Alarm 16912 is not a hardware fault. It is a state-machine guard inside the NCK. The two channels must agree on which channel is allowed to do what at any given moment, and the actions must be issued in the correct sequence (RESET state → INIT → START).

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 INIT followed by START in 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:

  1. Target channel is in Active state — a program is already running, and the NCK refuses to overwrite the current selection.
  2. 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.
  3. Channel name not configured — the user is calling INIT/START with a symbolic channel name and bit 1 of MD10280 $MN_PROG_FUNCTION_MASK is not set, so the NCK does not accept the name and raises 16912.
  4. 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).

Field check: If your machine uses a gantry loader, the loader is normally in its own BAG. Cross-channel INIT/START into a loader BAG is not possible from a part-program block; you must trigger the loader via PLC (DB22.DBX7.1 Cycle Start) or via ASUB/FC9 instead.

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:

  1. INIT — load (select) a program in the target channel. The target channel must be in RESET or INTERRUPTED.
  2. 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:

  1. Setting a 0 → 1 edge on DB22.DBX7.7 to put CH2 in Reset.
  2. Waiting for DB22.DBX6.4 (channel ready) to be FALSE.
  3. Using PI service _N_CHAN1 to select the program in CH2 (PI service index varies by SW release — see Programming Manual PI services).
  4. Setting a 0 → 1 edge on DB22.DBX7.1 to 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

  1. Confirm BAG layout. Read MD10010 $MN_ASSIGN_CHAN_TO_MODE_GROUP for 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.
  2. Set MD10280 bit 1 if symbolic channel names are used in NC code.
  3. Boot the NCK with the new MD values and check the alarm history.
  4. 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.
  5. 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 — check MD10708 $MN_SERUPRO_MASK and the alarm line.
  6. Issue START from CH1. Verify DB22.DBX6.4 (channel active) transitions to TRUE within one IPO cycle.
  7. 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.
  8. 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_VERSION and 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.1 after 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 unless MD10708 $MN_SERUPRO_MASK, bit 1 permits 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

  1. Channels 1 and 2 are in the same BAG (verified via HMI BAG display).
  2. MD10280 bit 1 is set (or INIT uses a numeric channel number).
  3. Target program exists in the file system at the path used in INIT (e.g. /_N_CST_DIR/_N_TOOLCHG_MPF).
  4. CH2 is in Reset state when INIT is issued.
  5. START is issued only after INIT, with CH2 still in Reset.
  6. WAITM marks are paired in both channels' programs.
  7. Alarm line is clear after the first successful run.
  8. 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.

Back to blog