Note
Why a BACnet write relinquishes on its own
A commanded point that keeps dropping back to the device’s relinquish default looks like a timeout or an overloaded gateway. Usually it is neither. It is a pair of writes the driver sends on purpose every time the commanding level changes.
- BACnet
- Integration
- Station engineering
Where the level comes from
A writable point works out its own active level before the driver sees anything.
The writable support walks in1 through in16 in order, takes
the first input with valid status, and stops. If none of the sixteen is valid it uses
the fallback value instead and records the active level as 17.
Seventeen is a Niagara level. It is not a BACnet priority — BACnet has sixteen. That mismatch is where the surprise lives.
Two of the sixteen are also special on the way past: an active level of 1 or 8 sets the overridden status bit on the output, which is why a point commanded at Emergency or Operator shows as overridden and one commanded at 16 does not.
What the driver actually puts on the wire
The BACnet proxy hands the write to a command object carrying two numbers: the level it is writing now, and the level it wrote last time. The command then does, in this order:
- if the current level is 1 to 16, one WriteProperty at that priority;
- otherwise, if there is a value, one WriteProperty with no priority argument at all;
- otherwise, one WriteProperty of Null, also with no priority;
- and then, separately, if the previous level is non-zero and different from the current one, a second WriteProperty of Null to clear it — at the previous priority, or with no priority if the previous level was 17.
Read that last bullet again, because it is the whole answer. The clear is not conditional on anything except the level having changed.
An omitted priority is not “no priority” at the device. The standard says a WriteProperty to a commandable present-value with the priority argument absent is treated as priority 16. So the fallback value does land — at 16.
The pair that looks like a relinquish
Put those together for a point that has been commanding at 16 and whose inputs all go null. The level moves from 16 to 17, and the driver sends:
- the fallback value, with no priority argument — the device takes it at 16;
- a Null at priority 16, because the previous level no longer matches the current one.
Net effect at the device: relinquished. It falls to its own relinquish default, and the fallback value you carefully configured survived for the length of one round trip. Nothing timed out. Nothing was overloaded. The point simply stopped having a valid input at the level it had been using.
Choosing a different in slot does not change the shape of this. Commanding at
in8 moves the value to priority 8, but the moment in8 goes
null and fallback takes over you get the same pair, with the Null at 8 this time. If
something upstream — a schedule, a program object, a link that nulls between cycles —
is emptying that input, that is the thing to find.
The case where the level does not matter at all
The driver only treats a point as prioritized if an internal flag says the object has a priority array. For Analog Output, Binary Output and Multi-state Output on present-value that flag is always true. For Analog Value, Binary Value, Multi-state Value and the newer value types it is discovered once, by reading the priority array off the device, and then cached on the proxy in its device facets.
If that read failed — gateway busy, device down when the points were discovered,
discovery run against a device that was not ready — the flag stays false. From then on
the write level is forced to zero, so every write goes out with no priority argument
no matter which in slot you use, and the driver stops tracking a previous
level to clear. On a point that is behaving as if priority is being ignored, that
cached facet is the first thing to check, because nothing about the point's appearance
in the station gives it away.
The switch that makes the pair a single clean write
There is a deliberate escape hatch. A boolean slot named ignoreFallback
added to the proxy extension, or the system property
niagara.bacnet.point.ignoreFallback set on the station, changes what a
fall to fallback does: the driver stops writing the fallback value at all and instead
issues a single Null at the level it last wrote, and only if that level was a real
BACnet priority. One clean relinquish, no priority-16 write immediately undone.
That is the right behaviour for most integrations, and it is off by default. The
alternative — if the intent is that the plant should hold a value rather than release —
is to stop the point falling to fallback in the first place by keeping a valid input at
a low priority, usually in16, so the level never reaches 17.
Every successful write costs a read. The write path calls a poll-now on that point as soon as the device acknowledges. On a gateway already struggling with traffic, a burst of writes is also a burst of reads.
How to tell which one you have
- The device drops to its relinquish default at the moment a schedule or
program ends. That is the write-then-clear pair. Look at what is nulling the
input, and consider
ignoreFallbackor a permanent low-priority input. - Priority makes no difference at all, at any level. That is the cached priority-array flag. Rediscover the point against a device that is answering.
- It happens at random, unrelated to any level change. Only then is it worth treating as a comms problem — and be careful reading the values while you test, because a stale reading can look like a live one for as long as the tuning policy allows.
The companion note on writable point priority covers the sixteen levels and the fallback from the station's side, and what a discovery actually finds covers the read half. Where a gateway has to be made to behave rather than tuned around, protocol integration is that work, and station engineering is the station around it.
Related
Where this comes up in the work
Protocols & data
Field protocol integration and the data behind it: BACnet, Modbus, M-Bus and MQTT, into a building system, a database or a dashboard.
Station engineering
JACE controller and Niagara station setup end to end: platform commissioning, TLS, users, roles, BACnet and Modbus, tagging, histories, alarms, backups.
More notes
Other things worth writing down
Why a writable point ignores the value you set
Sixteen priority inputs, two of them reserved for right-click actions, a fallback underneath, and a BACnet scheme wired to none of it.
- Station engineering
- BACnet
- Commissioning
What a BACnet discovery sweep actually tells you
Who-Is stops at the subnet, I-Am carries no device name, and an object list from a device that cannot segment has to be read one index at a time.
- BACnet
- Discovery
- Commissioning
Why a station polls too slowly
Slow, Normal and Fast are three numbers you choose, and one default tuning policy applied to every point is the usual reason a station feels sluggish.
- Station engineering
- Performance
- BACnet
Next step
Tell us the version, the hardware, and what it has to do.
You will get a written scope and a fixed price against it. If the honest answer is that you do not need us, you will get that instead.