(* =====================================================================
   91_config_sim.st - CONFIGURATION, simulation build

   Replaces 90_config_field.st in `--mode sim`.  Identical to it except
   for the third program instance.

   Scan task: 100 ms cyclic, section 4.  The interval must stay at
   100 ms: FB_PUMP, FB_LEVEL_CTRL and FB_HEADROOM all integrate against
   a hardcoded SCAN_S := 0.1, as does PROGRAM SIMULATION.

   Declaration order sets execution order within the task:

     SIMULATION  first  - models the plant, using the run commands and
                          speed CONTROL published on the previous scan
     IO_MUX      second - simulated image in, previous scan's outputs out
     CONTROL     third  - reads only the process image

   Section 8.2 says SIMULATION runs AFTER CONTROL.  It runs first here,
   deliberately.  With it last, the first scan after every start has no
   simulated image yet, so IO_MUX falls back to the (all zero) field
   inputs - and an all-zero field means ThermalOK FALSE and LSLL dry,
   which makes FB_PUMP latch a trip on all three units and the station
   enter dry-run lockout.  Those latch until a reset command, so every
   demo would have to begin by clearing trips that never happened.

   The cost of running it first is that SIMULATION reacts to run
   commands one scan late - 100 ms at 1x.  That is the same lag IO_MUX
   already has on published outputs, and it is invisible next to a
   3 s pump start delay.

   Simulation time scaling (%MW23) applies only inside SIMULATION.
   CONTROL's timers stay in real seconds; see README.md.
   ===================================================================== *)

CONFIGURATION Config0

  RESOURCE Res0 ON PLC
    TASK plc_task(INTERVAL := T#100ms, PRIORITY := 0);

    PROGRAM inst_sim WITH plc_task : SIMULATION;
    PROGRAM inst_mux WITH plc_task : IO_MUX;
    PROGRAM inst_ctl WITH plc_task : CONTROL;
  END_RESOURCE

END_CONFIGURATION
