ARINC 429 Bus Loading (avionics/data-bus/arinc429-bus-loading)
Use when the task is budgeting an ARINC 429 transmit schedule for a
civil avionics data bus: how many words per second the label rate
table asks the transmitter to send, what that costs in bus occupancy,
and whether the schedule fits the link with headroom. Every
transmitted ARINC 429 word occupies 36 bit-times on the bus, 32 data
bits plus the 4-bit gap between words, so a schedule of label rates
sums into a total word rate and the word rate prices the bus directly
at 36 bits per word. The module is pure Python stdlib and
deterministic; you supply the label rate schedule (a list of rates in
labels per second, or a dict mapping a label to its rate) and it
returns the load, utilization, capacity verdict and design headroom.
It pairs with avionics/data-bus/arinc429-protocol, which covers the
32-bit word layout and parameter coding itself (this leaf never builds
or interprets a word), and with avionics/data-bus/arinc664-afdx and
mil-std-1553 for the other civil and military bus loading models.
Domain quick reference
- Every ARINC 429 word occupies BITS_PER_WORD = 36.0 bit-times (32
data bits plus a 4-bit gap), whatever the label content, so the word
rate alone determines bus occupancy.
- Total word rate: total_word_rate(label_rates) = sum of the per-label
rates. A schedule of 3 labels at 50 Hz, 4 at 20 Hz and 2 at 10 Hz
totals 350 + 420 + 2*10 = 250 words/s.
- Bus load: bus_load_bps(words_per_s) = words_per_s * 36. The 250
words/s schedule loads 250 * 36 = 9000 bps.
- Percent utilization: percent_utilization(load, link_rate) = load /
link_rate * 100. Against the 100 kbps link (RATE_100_KBPS =
100000.0) the 9000 bps load is 9.0 percent.
- Word capacity: word_capacity(link_rate) = link_rate / 36. The 100
kbps link carries 100000 / 36 = 2777.8 words/s; the 12.5 kbps link
(RATE_12_5_KBPS = 12500.0) carries 347.2 words/s.
- Verdict rule: OVER when the utilization exceeds 100 percent, FITS
otherwise. A 3000 words/s schedule at 100 kbps loads 108000 bps,
108.0 percent, so it needs a second bus or a rate reduction.
- Headroom: headroom = max(0, DESIGN_GUIDELINE_PCT - utilization)
with DESIGN_GUIDELINE_PCT = 80.0, the common design guideline that
keeps about 20 percent of the bus free for growth.
- The identity: a schedule at exactly the word capacity sits at 100
percent utilization; at exactly the 80 percent design load the
headroom is zero; doubling every label rate doubles the utilization.
- ARINC 429 (Mark 33 DITS) frames the bus context; the relations above
are standard engineering methodology, summary-only.
Workflow
- Collect the transmit schedule: every label on the bus and its
transmission rate in labels per second (a list of rates, or a dict
{label: rate}).
- Sum the schedule with total_word_rate to get the total words per
second the transmitter must emit.
- Price the bus with bus_load_bps (words per second times 36 bits per
word) to get the load in bits per second.
- Normalize to the link with percent_utilization, using the default
RATE_100_KBPS or the explicit RATE_12_5_KBPS low-speed link.
- Get the capacity with word_capacity and the verdict dict with
capacity_verdict(total_words_per_s): capacity_wps, utilization_pct,
verdict (OVER when utilization exceeds 100 percent, else FITS) and
headroom_pct against the 80 percent guideline.
- For the full budget in one call, run bus_loading_summary(label_rates)
and read total_words_per_s, load_bps, utilization_pct, capacity_wps,
verdict and headroom_pct.
- If the verdict is OVER, cut label rates, merge low-rate labels, or
split the schedule across a second bus, then re-run the summary.
- Confirm the deterministic checks with the contract test
scripts/test_arinc429_bus_loading.py.
Worked example
Reference schedule on the 100 kbps link: 3 labels at 50 Hz, 4 labels
at 20 Hz, 2 labels at 10 Hz.
- total_word_rate: 350 + 420 + 2*10 = 250.0 words/s.
- bus_load_bps: 250.0 * 36.0 = 9000.0 bps.
- percent_utilization: 9000.0 / 100000.0 * 100 = 9.0 percent.
- word_capacity: 100000.0 / 36.0 = 2777.78 words/s.
- capacity_verdict(250.0): utilization 9.0 percent, verdict FITS,
headroom 80 - 9 = 71.0 percent. The schedule uses well under the
guideline.
- Adding one 100 Hz label: 350.0 words/s, 12600.0 bps, 12.6 percent,
still FITS.
- Over-capacity check: 30 labels at 100 Hz total 3000.0 words/s,
108000.0 bps, 108.0 percent utilization, verdict OVER, headroom 0.0:
the schedule needs a second bus or a rate reduction.
- Low-speed link at 12.5 kbps: capacity 12500.0 / 36.0 = 347.2
words/s; a 300 words/s schedule is 86.4 percent (FITS, but above the
guideline so headroom is 0.0), and 350 words/s is 100.8 percent,
OVER.
Verification
- Confirm total_word_rate of the reference schedule is 250.0 words/s
and of a single 1 Hz label is 1.0 word/s.
- Confirm bus_load_bps(250.0) is 9000.0 bps and bus_load_bps(100.0) is
3600.0 bps.
- Confirm percent_utilization at the word capacity is 100.0 percent
within 1e-6, and 108.0 percent for 3000 words/s.
- Confirm capacity_verdict(300.0, RATE_12_5_KBPS) gives 86.4 percent
FITS and capacity_verdict(350.0, RATE_12_5_KBPS) gives 100.8 percent
OVER.
- Confirm the headroom is 71.0 at the 9 percent reference load, 0.0 at
the 80 percent design load and 0.0 over capacity.
- Confirm bus_loading_summary returns exactly the documented keys.
- Confirm ValueError on an empty schedule, a negative rate, a
non-positive link rate and non-positive bits per word.
- Run the contract test offline: python3
scripts/test_arinc429_bus_loading.py (34 tests, deterministic).
Related leaves
- avionics/data-bus/arinc429-protocol: the companion leaf for the
32-bit word layout and parameter coding of the words this leaf
schedules; it states the 36 bit-time occupancy fact but does not sum
a per-label schedule or compute utilization.
- avionics/data-bus/arinc664-afdx: the switched network companion
leaf whose 100 Mbps link utilization budget is the symmetry anchor
for this utilization calculation.
- avionics/data-bus/mil-std-1553: the military multiplex bus
scheduling companion with its 1 Mbps dual-redundant bus and message
timing model.
Pitfalls
- Pricing a schedule at 32 bits per word: every transmitted word
occupies BITS_PER_WORD = 36.0 bit-times (32 data bits plus the 4-bit
gap) and bus_load_bps multiplies by 36; pricing at 32 understates the
load by about 12.5 percent and can hide an OVER verdict.
- Treating the 80 percent guideline as the verdict threshold: the
verdict flips to OVER only when utilization exceeds 100 percent, so a
schedule at 86.4 percent on the 12.5 kbps link is FITS with headroom
0.0 - zero headroom is not the same as OVER.
- Forgetting the low-speed link: at RATE_12_5_KBPS the capacity is
12500.0 / 36.0 = 347.2 words/s, so a 350 words/s schedule is already
100.8 percent and OVER even though it fits the 100 kbps link - carry
the link rate into the capacity check.
- Summing bit rates instead of word rates: total_word_rate adds the
per-label rates in words per second and only bus_load_bps prices them
at 36 bits each, so never multiply the label rates by 36 twice.
- Routing word-format questions here: this leaf never builds or
interprets a 32-bit word - the label/word layout and parameter coding
live in avionics/data-bus/arinc429-protocol; feed this leaf the label
rate schedule only.
- Feeding an empty schedule or a negative rate: the summary and
capacity functions raise ValueError on an empty schedule, negative
rates, non-positive link rates, and non-positive bits per word -
validate the schedule before calling.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_arinc429_bus_loading.py
The test covers the reference schedule totals and bounds, the 36
bits-per-word load pricing, percent utilization at and beyond the
word-per-second capacity, the 12.5 kbps link capacity and verdicts,
the headroom boundaries at the 80 percent guideline, the
bus_loading_summary convenience dict keys and values, the doubling
and determinism identities, the module constants, and ValueError
rejection of an empty schedule, negative rates, non-positive link
rates and non-positive bits per word.
Compliance
- Standards referenced, not reproduced: ARINC 429 (Mark 33 DITS) is
the ARINC standard for civil avionics point-to-point buses; the bus
loading relations above are standard engineering methodology,
summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: arinc429-bus-loading3description: Use when you must budget the ARINC 429 bus loading: sum the per-label transmission rates in labels per second into the total word rate, price each transmitted word at 36 bit-times (32 data bits plus the 4-bit gap) for the bus load in bits per second, compute the percent utilization of the 100 kbps or 12.5 kbps link, flag schedules that exceed the word-per-second capacity (about 2778 words per second at 100 kbps), and report the headroom against the common 80 percent design guideline. Produces the total word rate, bus load, percent utilization, capacity verdict, and design headroom that gate the ARINC 429 label rate table. Trigger: arinc 429 bus loading, label rate budget, percent bus utilization, word rate capacity, transmit schedule headroom, 100 kbps link.4license: Apache-2.05---67# ARINC 429 Bus Loading (avionics/data-bus/arinc429-bus-loading)89Use when the task is budgeting an ARINC 429 transmit schedule for a10civil avionics data bus: how many words per second the label rate11table asks the transmitter to send, what that costs in bus occupancy,12and whether the schedule fits the link with headroom. Every13transmitted ARINC 429 word occupies 36 bit-times on the bus, 32 data14bits plus the 4-bit gap between words, so a schedule of label rates15sums into a total word rate and the word rate prices the bus directly16at 36 bits per word. The module is pure Python stdlib and17deterministic; you supply the label rate schedule (a list of rates in18labels per second, or a dict mapping a label to its rate) and it19returns the load, utilization, capacity verdict and design headroom.20It pairs with avionics/data-bus/arinc429-protocol, which covers the2132-bit word layout and parameter coding itself (this leaf never builds22or interprets a word), and with avionics/data-bus/arinc664-afdx and23mil-std-1553 for the other civil and military bus loading models.2425## Domain quick reference2627- Every ARINC 429 word occupies BITS_PER_WORD = 36.0 bit-times (3228 data bits plus a 4-bit gap), whatever the label content, so the word29 rate alone determines bus occupancy.30- Total word rate: total_word_rate(label_rates) = sum of the per-label31 rates. A schedule of 3 labels at 50 Hz, 4 at 20 Hz and 2 at 10 Hz32 totals 3*50 + 4*20 + 2*10 = 250 words/s.33- Bus load: bus_load_bps(words_per_s) = words_per_s * 36. The 25034 words/s schedule loads 250 * 36 = 9000 bps.35- Percent utilization: percent_utilization(load, link_rate) = load /36 link_rate * 100. Against the 100 kbps link (RATE_100_KBPS =37 100000.0) the 9000 bps load is 9.0 percent.38- Word capacity: word_capacity(link_rate) = link_rate / 36. The 10039 kbps link carries 100000 / 36 = 2777.8 words/s; the 12.5 kbps link40 (RATE_12_5_KBPS = 12500.0) carries 347.2 words/s.41- Verdict rule: OVER when the utilization exceeds 100 percent, FITS42 otherwise. A 3000 words/s schedule at 100 kbps loads 108000 bps,43 108.0 percent, so it needs a second bus or a rate reduction.44- Headroom: headroom = max(0, DESIGN_GUIDELINE_PCT - utilization)45 with DESIGN_GUIDELINE_PCT = 80.0, the common design guideline that46 keeps about 20 percent of the bus free for growth.47- The identity: a schedule at exactly the word capacity sits at 10048 percent utilization; at exactly the 80 percent design load the49 headroom is zero; doubling every label rate doubles the utilization.50- ARINC 429 (Mark 33 DITS) frames the bus context; the relations above51 are standard engineering methodology, summary-only.5253## Workflow54551. Collect the transmit schedule: every label on the bus and its56 transmission rate in labels per second (a list of rates, or a dict57 {label: rate}).582. Sum the schedule with total_word_rate to get the total words per59 second the transmitter must emit.603. Price the bus with bus_load_bps (words per second times 36 bits per61 word) to get the load in bits per second.624. Normalize to the link with percent_utilization, using the default63 RATE_100_KBPS or the explicit RATE_12_5_KBPS low-speed link.645. Get the capacity with word_capacity and the verdict dict with65 capacity_verdict(total_words_per_s): capacity_wps, utilization_pct,66 verdict (OVER when utilization exceeds 100 percent, else FITS) and67 headroom_pct against the 80 percent guideline.686. For the full budget in one call, run bus_loading_summary(label_rates)69 and read total_words_per_s, load_bps, utilization_pct, capacity_wps,70 verdict and headroom_pct.717. If the verdict is OVER, cut label rates, merge low-rate labels, or72 split the schedule across a second bus, then re-run the summary.738. Confirm the deterministic checks with the contract test74 scripts/test_arinc429_bus_loading.py.7576## Worked example7778Reference schedule on the 100 kbps link: 3 labels at 50 Hz, 4 labels79at 20 Hz, 2 labels at 10 Hz.8081- total_word_rate: 3*50 + 4*20 + 2*10 = 250.0 words/s.82- bus_load_bps: 250.0 * 36.0 = 9000.0 bps.83- percent_utilization: 9000.0 / 100000.0 * 100 = 9.0 percent.84- word_capacity: 100000.0 / 36.0 = 2777.78 words/s.85- capacity_verdict(250.0): utilization 9.0 percent, verdict FITS,86 headroom 80 - 9 = 71.0 percent. The schedule uses well under the87 guideline.88- Adding one 100 Hz label: 350.0 words/s, 12600.0 bps, 12.6 percent,89 still FITS.90- Over-capacity check: 30 labels at 100 Hz total 3000.0 words/s,91 108000.0 bps, 108.0 percent utilization, verdict OVER, headroom 0.0:92 the schedule needs a second bus or a rate reduction.93- Low-speed link at 12.5 kbps: capacity 12500.0 / 36.0 = 347.294 words/s; a 300 words/s schedule is 86.4 percent (FITS, but above the95 guideline so headroom is 0.0), and 350 words/s is 100.8 percent,96 OVER.9798## Verification99100- Confirm total_word_rate of the reference schedule is 250.0 words/s101 and of a single 1 Hz label is 1.0 word/s.102- Confirm bus_load_bps(250.0) is 9000.0 bps and bus_load_bps(100.0) is103 3600.0 bps.104- Confirm percent_utilization at the word capacity is 100.0 percent105 within 1e-6, and 108.0 percent for 3000 words/s.106- Confirm capacity_verdict(300.0, RATE_12_5_KBPS) gives 86.4 percent107 FITS and capacity_verdict(350.0, RATE_12_5_KBPS) gives 100.8 percent108 OVER.109- Confirm the headroom is 71.0 at the 9 percent reference load, 0.0 at110 the 80 percent design load and 0.0 over capacity.111- Confirm bus_loading_summary returns exactly the documented keys.112- Confirm ValueError on an empty schedule, a negative rate, a113 non-positive link rate and non-positive bits per word.114- Run the contract test offline: python3115 scripts/test_arinc429_bus_loading.py (34 tests, deterministic).116117## Related leaves118119- avionics/data-bus/arinc429-protocol: the companion leaf for the120 32-bit word layout and parameter coding of the words this leaf121 schedules; it states the 36 bit-time occupancy fact but does not sum122 a per-label schedule or compute utilization.123- avionics/data-bus/arinc664-afdx: the switched network companion124 leaf whose 100 Mbps link utilization budget is the symmetry anchor125 for this utilization calculation.126- avionics/data-bus/mil-std-1553: the military multiplex bus127 scheduling companion with its 1 Mbps dual-redundant bus and message128 timing model.129130## Pitfalls131132- Pricing a schedule at 32 bits per word: every transmitted word133 occupies BITS_PER_WORD = 36.0 bit-times (32 data bits plus the 4-bit134 gap) and bus_load_bps multiplies by 36; pricing at 32 understates the135 load by about 12.5 percent and can hide an OVER verdict.136- Treating the 80 percent guideline as the verdict threshold: the137 verdict flips to OVER only when utilization exceeds 100 percent, so a138 schedule at 86.4 percent on the 12.5 kbps link is FITS with headroom139 0.0 - zero headroom is not the same as OVER.140- Forgetting the low-speed link: at RATE_12_5_KBPS the capacity is141 12500.0 / 36.0 = 347.2 words/s, so a 350 words/s schedule is already142 100.8 percent and OVER even though it fits the 100 kbps link - carry143 the link rate into the capacity check.144- Summing bit rates instead of word rates: total_word_rate adds the145 per-label rates in words per second and only bus_load_bps prices them146 at 36 bits each, so never multiply the label rates by 36 twice.147- Routing word-format questions here: this leaf never builds or148 interprets a 32-bit word - the label/word layout and parameter coding149 live in avionics/data-bus/arinc429-protocol; feed this leaf the label150 rate schedule only.151- Feeding an empty schedule or a negative rate: the summary and152 capacity functions raise ValueError on an empty schedule, negative153 rates, non-positive link rates, and non-positive bits per word -154 validate the schedule before calling.155156## Behavior contract (gate 3)157158Run the deterministic contract test (stdlib unittest, offline):159160 python3 scripts/test_arinc429_bus_loading.py161162The test covers the reference schedule totals and bounds, the 36163bits-per-word load pricing, percent utilization at and beyond the164word-per-second capacity, the 12.5 kbps link capacity and verdicts,165the headroom boundaries at the 80 percent guideline, the166bus_loading_summary convenience dict keys and values, the doubling167and determinism identities, the module constants, and ValueError168rejection of an empty schedule, negative rates, non-positive link169rates and non-positive bits per word.170171## Compliance172173- Standards referenced, not reproduced: ARINC 429 (Mark 33 DITS) is174 the ARINC standard for civil avionics point-to-point buses; the bus175 loading relations above are standard engineering methodology,176 summary-only per standards-map.yaml.177- compliance: STANDARDS-REF, gated: false.