It's a fault or error in the data logging to register 20mg of fuel with 0 rpm otherwise fuel would be injecting with the engine stopped if true. This could be offsetting the true fuel flows a huge amount, if 20 is really 0 on a max fuel flow of around 95. This might explain why the performance is so anemic- it's making 20+% less hp than the displayed fuel flow would indicate. I haven't seen an ECU which injects this much fuel continuously at 0 rpm.
Not even sure what this mg figure is. For each injector or all 6? Per second? Per minute? I can't correlate any of these numbers so they make sense with the approximate hp being produced at full power which is roughly 1400mg/min.
Well, yes and no.
It really depends on how software is written. Some simple examples are IAT (inlet air temperature), oil pressure, ECT (engine coolant temperature), MAP (manifold absolute pressure)... and so on. Once the ECU starts up, performs sanity checks, and fires up OS, these analog values will be read (via analog to digital converter), transfer functions performed, then appropriate values written to random access memory location specified. This happens regardless if engine is stopped (usually referred to as stalled), cranking, or running. I can't say this is universally true for all ECUs, but I can't think of anything I've worked with that doesn't act like this.
Now, MAP can be both time and crank angle dependent or synchronized (started time based then switches to crank angle burst mode).
As far as reading odd values with engine stopped. A good example is MAF (mass air flow) sensor, it is never truly "Zero" even when within specifications. Mess up transfer function (lookup table), or 2 point calibration with offset, and you can register sufficient mass flow with stopped engine to exceed normal idle state. How do I know, been there done that... Before anybody asks, no I didn't crank with such a large error.
So most OEM ECUs have sanity checks to identify such conditions and revert to a limp mode or simply don't start. But aftermarket ones are far more forgiving. Being forgiving they do need to display and log values, regardless of engine state, windowed (hole in case), stopped, cranking, running.
Now with above being said... Most ECUs will solve about a similar amount of critical code when the engine is running or stopped. They may have alternate cranking lookup tables (most OEMs do). A good SI example is IAT and/or ECT timing retard, you pulled over due to overheating engine, popped the hood, saw nothing, waited a bit, then proceeded to attempt a re-start. That timing is already being pulled via appropriate tables, even before cranking is detected (it is a partial calculation or not complete total timing).
You can have offset of what ever when engine is stalled/stopped. Most modern ECUs are crank angle synchronized with respect to injection and timing (if SI). If memory serves correctly, Motec software state engine, is 3 states - stopped, seeking (motioned detected) and finally synchronized to reluctor wheel and cam (forgot exact verbiage, but can see it while cranking). Once synced, injection pulse width is scheduled with appropriate function/task/or coprocessor. What I described is overly simplistic, far more interlocks and safeties in real life.
The Motec is extremely flexible, you can create custom lookup tables, hardly any hard coded limits, so unfortunately creating garbage is easy too.
20mg error is a 0.020 gram error. Depending on ECU (PCM is GM speak) air is reported in grams, and fuel on per cylinder in milligrams... Add to that, total mass flow is per minute, timing on per event (or per intake stroke)... It changes year to year, model to model.
As mentioned, I have not worked with diesel Motec, have with previous generation SI unit.
Sorry for long winded post, but baked in values or errors can happen, as well as forced offsets (intentional or not).