Battery
A vehicle's energy store: how much it holds, how fast it empties, and how fast it fills.
Two drain rates, because a real vehicle has two. Traction energy scales with distance and stops when the vehicle stops. Hotel load -- controller, radio, lights, heating -- scales with time and does not: a parked AGV still draws current. A model with one rate can represent either of those, and gets the other wrong.
The consequence is a hazard worth stating before the parameters: with chargePerTime above zero, a lightly loaded fleet strands itself. Charge falls while vehicles wait for work, so the configuration a modeller would assume is benign -- plenty of vehicles, not much to do -- is the one that eventually loses every vehicle. Under distance-only depletion an idle fleet is safe. It is not safe here, and that is the point of modelling the second rate at all.
A per-state rate table -- one rate while moving loaded, another while blocked, another while idle -- is the natural next refinement and is deliberately not offered. Two numbers can be measured. Five invite calibration effort against data nobody has.
Charge is derived rather than stepped. Nothing here schedules an event. The level is a closed-form function of the vehicle's odometers, computed whenever it is asked for, which is why adding a battery to a model does not change how many events its run takes.
The units are the modeller's own throughout: charge may be amp-hours, kilowatt-hours, or a percentage, as long as the four numbers agree with each other and with the network's length units and the model's time units.
Parameters
how much charge the battery holds when full. Must be > 0.
charge drawn per unit of distance travelled -- traction. Must be >= 0.
charge drawn per unit of elapsed time, whatever the vehicle is doing -- hotel load. Zero by default, which recovers a model with no idle draw exactly, so adding this class to a subsystem cannot silently change an existing model.
charge added per unit of time while charging. Must exceed chargePerTime: a charger that cannot outpace the hotel load never fills the battery, and a model configured that way would wait forever rather than fail.
what the battery holds at the start of every replication. Full by default.