BACnet Priority Array BACnet

Type a value into any of the 16 command slots and watch Present_Value resolve — the lowest-numbered non-NULL slot wins, or Relinquish_Default if they are all empty.
Every commandable BACnet object holds a 16-slot Priority_Array. A write does not overwrite the value; it lands in one slot, at a priority. The object's actual Present_Value is then the value in the lowest-numbered slot that is not NULL. Type a value to command a slot; clear it — or press × — to write NULL and release it. The winning slot is highlighted, and the panel shows what would take over if you released it.

The array is seeded with an example — a hand override at slot 8 sitting on top of a sequence at slot 16. Edit it to your own values.

Try this:
1 life-safety
2 auto life-safety
3
4
5 critical equip.
6 min on/off
7
8 manual operator
9
10
11
12
13
14
15
16 sequence
used when every slot is NULL

Blank = NULL = relinquished. A value can be anything the point commands — a percent, a temperature, or active / inactive on a binary object.

Type a value to resolve it.

Slot 1 is the highest priority, slot 16 the lowest. Five slots carry a standard-defined meaning (marked with the accent rule); the rest are available for application-specific use.

PriorityStandard useNotes
1 Manual Life-Safety The highest priority — reserved for manual life-safety commands. Nothing outranks it.
2 Automatic Life-Safety Automatic life-safety functions — smoke control, fire response.
3 Available Available for application-specific use.
4 Available Available for application-specific use.
5 Critical Equipment Control Protects equipment — e.g. a compressor, or a defrost cycle that must run to completion.
6 Minimum On/Off Reserved for minimum on/off-time enforcement — the anti-short-cycle timer.
7 Available Available for application-specific use.
8 Manual Operator The operator's hand — a manual override from the workstation or BMS.
9 Available Available for application-specific use.
10 Available Available for application-specific use.
11 Available Available for application-specific use.
12 Available Available for application-specific use.
13 Available Available for application-specific use.
14 Available Available for application-specific use.
15 Available Available for application-specific use.
16 Available The lowest priority — commonly the slot a controller's own automatic program writes from.

The standard fixes only a few of these — life-safety at the top slots (1–2), critical-equipment control at 5, minimum on/off-time at 6, and the manual operator's hand at 8 — and leaves the rest to local policy. Slot 16 is simply the lowest priority, but it is where a controller's own automatic program most often writes. Your controller exposes its own priority map — that map, not this table, is what governs the point in front of you. Assignments cross-checked against ASHRAE 135 command-prioritization references.

Reading the array is a scan from the top: start at slot 1 and take the value in the first slot that is not NULL. That value is Present_Value; every lower-priority slot underneath it is held back, still holding its value but not commanding. Nothing is added, averaged, or compared — the single highest-priority active slot wins outright.

If all sixteen slots are NULL, the object has no command at all, and Present_Value takes the value of Relinquish_Default — the resting state. Note that Relinquish_Default is a real, separate property you can write; it is not "slot 17," and it only matters when the whole array is empty.

The move that trips people up: to give a point back, you write NULL to your slot, not a zero. Writing zero commands the value zero at your priority — the point holds at 0. Writing NULL relinquishes the slot; it goes empty, and the next-highest non-NULL slot takes over. In this tool the × on each row does exactly that.

So the classic "this point is broken" call is almost never a broken sequence. The program is writing 65 % at slot 16 exactly as designed, but a hand override someone set months ago still sits at slot 8 — and slot 8 outranks slot 16, so Present_Value resolves to the stale override. The value on the graphic is the resolved value, not what the sequence is writing. Read the entire array, find the higher-priority slot that is still populated, and release it. A write-access-denied when you try to write Present_Value directly is often the same story — the value is owned by the array, so command a priority instead.

What is the BACnet priority array?

A 16-slot property (Priority_Array) on every commandable object — Analog Output, Binary Output, and Analog / Binary / Multi-state Value when configured commandable. A WriteProperty to Present_Value does not overwrite the value; it writes into one slot, at a chosen priority. Slot 1 is the highest priority and slot 16 the lowest.

How does BACnet decide Present_Value from the priority array?

Present_Value is the value in the lowest-numbered slot that is not NULL — the highest-priority active command. Every lower-priority slot below it is held back. If every one of the 16 slots is NULL, the object falls back to its Relinquish_Default property.

What does writing NULL to a BACnet priority do?

It releases (relinquishes) that slot — the slot becomes empty and stops commanding. It does not write a zero; it removes your command so the next-highest non-NULL slot takes over. Forgetting to write NULL when you are done is the most common way an override gets stuck.

What is Relinquish_Default in BACnet?

The value a commandable object takes when its entire priority array is NULL — the resting state with nothing commanding. It is a separate, writable property, not slot 17. On many points it is the safe/off value the object should hold when no logic and no operator is asking for anything.

What priority does a BACnet operator override use?

By convention, priority 8 — "Manual Operator" — is the operator's hand from a workstation or BMS, and priority 16 is where a controller's own automatic program most often writes. So a hand override at 8 beats the sequence at 16; write NULL back to 8 and the sequence at 16 resumes. The exact map is a local matter — check your controller.

Why is my BACnet point stuck and not following the program?

Almost always a forgotten override sitting at a higher priority than the sequence. The program writes at, say, slot 16, but slot 8 still holds a hand value someone set months ago — so Present_Value resolves to the old override and the point looks "broken" even though the sequence is writing correctly. Read the whole priority array; release the stale slot with a NULL write.
← All tools