BACnet

BACnet integration in Niagara is usually straightforward – until it is not. Software Pile handles both ends: standard BACnet/IP and MS/TP integration through Niagara’s native driver, and the awkward cases where devices expose non-conformant objects, proprietary properties, or firmware quirks that break discovery.

Standard BACnet Work

Device discovery and point mapping, alarm and history configuration, COV subscriptions tuned so the network is not flooded, priority-array behavior that matches how the building is actually operated, and BACnet export of Niagara points so third-party front ends can consume them.

When the Native Driver Is Not Enough

Some equipment speaks BACnet in name only. For proprietary properties, vendor-specific services, or segmentation problems, we extend integration at the Baja level: custom proxy points, tuned polling, and translation layers that make nonstandard devices behave like citizens of the station. Where a device needs a full custom driver, that is core work for us.

Scoping a BACnet Project

Useful things to have ready: device counts and models, network topology (IP vs MS/TP segments), your Niagara version, and whether the target is a Supervisor or JACE. A PICS statement for problem devices helps; a protocol capture helps more. Send what you have and we will tell you what the integration actually involves.

What Is BACnet?

BACnet is the open communications standard for building automation, and the default protocol for new building systems. It is a full data model rather than a simple register map: BACnet devices expose objects with properties, and the standard covers alarming, scheduling, trending and device discovery as well as reading and writing values.

That richness is why BACnet integration is generally less work than Modbus for equivalent equipment. The meaning travels with the data instead of living in a separate mapping spreadsheet.

What Is the Difference Between BACnet/IP and BACnet MS/TP?

They are the same protocol over different physical layers, and the distinction has real operational consequences:

  • BACnet/IP runs over standard Ethernet and IP networking. Fast, and it uses infrastructure the building already has — which also means it is subject to IT network policy, VLANs and firewalls.
  • BACnet MS/TP runs over RS-485 serial twisted pair. Much slower and limited in devices per segment, but inexpensive to run to field equipment and still extremely common on terminal units.

Most real estates are both: MS/TP out to the field devices, IP for the backbone, with routers between. Performance complaints in BACnet systems very often trace to MS/TP segments being polled as though they were IP.

What Are BACnet Objects and Properties?

A BACnet device presents objects — analog inputs, analog outputs, binary values, schedules, trend logs, and others. Each object has properties: its present value, units, description, status flags, alarm limits and more. Reading a temperature means reading the present-value property of an analog-input object.

Status flags are the part most often ignored and most worth using. They tell you whether a value is in fault, out of service or overridden. An integration that reads present value without checking status will faithfully report the last good reading from a failed sensor.

Why Do BACnet Integrations Go Wrong?

  • Over-polling MS/TP. The most common cause of a “slow BMS”. Poll rates must match the segment, not the ambition.
  • Duplicate device instance numbers. Must be unique across the network; duplicates cause intermittent faults that are miserable to diagnose.
  • Partial vendor implementations. Equipment that claims BACnet compliance but omits or misimplements parts of it. Test against the device, not the datasheet.
  • Ignoring priority arrays. BACnet has a defined command-priority mechanism. Writing at the wrong priority, or never releasing a command, leaves equipment stuck in override — often for months.
  • Discovery on a live network without agreement. Broadcast-heavy discovery can disturb a production control network.

BACnet Security

BACnet was designed for isolated control networks, and much of the installed base has little or no authentication. When those networks become reachable from the business network — which is usually how integration projects end — that assumption no longer holds.

Treat network position as the primary control: segment the control network, restrict what crosses the boundary, control and review remote access, and monitor. This is a large part of what an integration project should address rather than leave to someone else.

Related services: BAS and BACnet integration services · custom driver development.

What BACnet/IP Needs From the Network

BACnet/IP is UDP, not TCP, and by default it uses port 47808, written 0xBAC0 in most vendor documentation. Discovery depends on broadcast: the station sends Who-Is as a local broadcast and every device that hears it answers with I-Am. That works on a flat subnet and stops working the moment an IP router sits between the station and the devices, because routers do not forward broadcasts. None of this is visible from the station, which simply reports that discovery found nothing.

The standard answer is a BBMD, a BACnet Broadcast Management Device. One BBMD sits on each subnet that holds devices, and each BBMD carries a Broadcast Distribution Table naming its peers, so a broadcast is unicast to those peers and re-broadcast locally by each of them. Two BBMDs on the same subnet is a configuration error rather than redundancy, and it produces duplicated traffic and duplicate I-Am answers. A station on a subnet with no devices of its own can instead register as a foreign device with one BBMD, which then forwards broadcast traffic to it for the life of the registration; that registration carries a time to live and is renewed by the station, not by the BBMD.

NAT is the case that surprises people. BACnet/IP carries the originating address inside the message payload, in the Forwarded-NPDU a BBMD sends and in the registration a foreign device makes, and a NAT device rewrites the IP header without touching the payload. The result is a station whose requests get through and whose answers never arrive, because devices are replying to a private address they were handed inside the message. Some BBMD implementations expose a public address setting for exactly this reason; where they do not, the workable path is a routed or VPN connection rather than a translated one.

  • Firewall rules have to pass UDP 47808 in both directions. A rule that permits outbound traffic only lets the station send Who-Is and never see the answers.
  • The Broadcast Distribution Table has to match on every BBMD in the internetwork. A subnet listed in one table and omitted from the others is reachable in one direction only.
  • The BBMD's own address has to be static, since every foreign device registration and every peer table entry points at it by address rather than by device instance.
  • Separate BACnet internetworks sharing one physical LAN are kept apart by UDP port, usually 47809 and up. Devices on different ports do not see each other even though they sit on the same wire.
  • Site to site VPNs and wireless bridges that carry unicast correctly often drop broadcast traffic, so supervision across such a link normally means foreign device registration rather than plain discovery.

MS/TP Trunks: Token Rotation and the Physical Layer

MS/TP is a token bus on RS-485. Only the device holding the token may start a transaction, and the token passes between masters in MAC address order, so the number that governs responsiveness is token rotation time rather than baud rate. Every device on a segment has to run the same baud rate, the usual choices being 9600, 19200, 38400 and 76800, with 76800 the practical ceiling for most field controllers. Adding devices lengthens rotation for every point on the trunk, which is why a segment that behaved at commissioning degrades as terminal units are added years later.

Two device properties do most of the damage when they are left at defaults. Max_Master tells a device how far up the address range to look for a successor, so a device left at 127 on a trunk whose highest MAC address is 12 spends part of every rotation polling for masters that do not exist; setting Max_Master on every master to the highest address actually in use is one of the few changes that speeds up a trunk without touching a single poll rate. Max_Info_Frames sets how many messages a device may send before it must pass the token on, and raising it on the device that does the polling lets that device get more done per rotation, while raising it everywhere simply moves the bottleneck.

  • 120 ohm termination at both physical ends of the segment and nowhere else. Extra terminators load the line; missing ones cause reflections that appear as CRC errors at higher baud rates and vanish when the trunk is slowed down.
  • Bias applied at one point on the segment, usually by a jumper on a router or controller. Without bias an idle line floats, and the resulting framing errors read as intermittent device dropouts.
  • Shield grounded at one end only. Grounded at both ends it becomes a current path, and the error rate then follows the building's electrical load rather than anything happening on the trunk.
  • Daisy chain topology. Star wiring and T taps often pass commissioning at 9600 and then fail when the trunk is raised to 38400.
  • Correct A and B polarity at every device. A reversed pair usually silences only that device, which makes a wiring fault look like a failed controller.
  • MAC addresses unique on the segment, masters in 0 to 127 and slaves in 128 to 254. Duplicates produce token passing failures that appear to move around as devices are power cycled.

How a BACnet Network Appears Inside the Station

The driver adds a BacnetNetwork under the station's Drivers node, and that network holds a Local Device object with its own object identifier and network number, so the station is a participant on the wire rather than an observer of it. Below the network sit device objects, created by discovery or added by hand, and below each device sit proxy points. A proxy point is a Niagara point carrying a BACnet proxy extension that names the object identifier and the property it reads, which is why moving or renaming a point in the station changes nothing on the device, and why renaming an object on the device does not break the point.

Poll rates are not per point values in the way people expect. The BACnet poll service divides work into fast, normal and slow buckets, each with its own rate, and every proxy point is assigned to one of them. Tuning a station therefore means moving points between buckets and setting three numbers, not editing each point, and the working discipline is that only points driving logic or alarms belong in the fast bucket. Points that are written rather than read consume no poll bandwidth at all.

ReadPropertyMultiple collapses many property reads into a single request and response, and on any device with more than a handful of points it is the difference between a usable trunk and a slow one. It is bounded by the APDU size the device accepts, commonly 480 octets on MS/TP against 1476 on BACnet/IP, so only a finite number of properties fit in one response. Devices that advertise ReadPropertyMultiple and then fail on large requests are a recognizable class: the device works while a few points are mapped and begins returning errors as the point count grows. The diagnostic is to shrink the request or disable ReadPropertyMultiple for that one device and see whether the errors stop.

Timeouts, Aborts and What a Capture Tells You

When points go stale, three different causes look identical from inside the station: the device is not answering, it is answering more slowly than the configured APDU timeout allows, or the answer is being lost on the way back. The default APDU timeout is 6000 ms with three retries, so a single unresponsive device can hold a network's attention for roughly twenty four seconds on one request. That is the mechanism behind the familiar complaint that one dead controller made a whole trunk slow.

A capture separates the three. If the request never appears on the wire, the problem is above it: wrong device instance, wrong network number, or a routing path that was never in place. If the request appears and nothing comes back, the device is not answering and the next question is physical. If the response comes back late, the fix is a longer timeout or less load, not more retries, since retries multiply the traffic that caused the delay in the first place. If Reject or Abort PDUs come back, the device is answering in order to say it cannot handle what was asked, and the reason code is specific: buffer overflow or segmentation not supported points at message size rather than at the network.

Segmentation is declared rather than negotiated blindly. A device's Segmentation_Supported property reports one of segmented-both, segmented-transmit, segmented-receive or no-segmentation, and a device reporting no-segmentation can only return what fits in a single APDU. The visible symptom is that reading the device's Object_List fails outright on a controller with several hundred objects while every individual point reads normally. The way around it is to read Object_List by array index, index zero returning the element count and each following index one object identifier, which turns one oversized response into many small ones.

Verifying What a Device Actually Supports

A conformant device carries the answer in its own Device object. Reading Protocol_Services_Supported and Protocol_Object_Types_Supported, which are bit strings of the services the device implements and the object types it can present, together with Segmentation_Supported, Max_APDU_Length_Accepted and Protocol_Revision, is a handful of requests that list what the firmware will actually answer.

Some equipment carries a communication card that wraps an internal proprietary or Modbus bus, presenting a fixed set of BACnet objects that the card refreshes on its own schedule. The card answers every read immediately out of its own cache, so the network looks fast while the values are as old as the internal scan interval, which is often several seconds and is not exposed as a BACnet property anywhere. Polling such a device faster than its internal scan changes nothing except traffic. The way to find the real interval is to force a change at the equipment and time how long it takes to appear at the station.

A PICS states which BIBBs the vendor claims, and a BTL listing states that a particular firmware version passed testing against a particular protocol revision. Both describe the version that was tested, and field equipment frequently ships with different firmware, so the Device object's Firmware_Revision, Application_Software_Version and Protocol_Revision are worth reading and comparing against the version the document covers before treating that document as a description of the device in front of you.

Frequently Asked Questions

Is BACnet a protocol, a product, or a wiring standard?

It is a standard, published as ASHRAE 135 and adopted as ISO 16484-5, defining an object model, a set of services for acting on those objects, and several data links those messages can travel over. No vendor owns it, and no device is simply a BACnet device; a device is conformant to some protocol revision and implements some subset of the services. The standard fixes how a value describes itself, not which values a given chiller or rooftop unit chooses to publish, so two conformant devices from different vendors can expose very different object lists for the same kind of machine.

What has to exist on the network before a station can talk to BACnet devices?

A path to every device, and an owner for the network side of that path. BACnet/IP devices need an IP path from the station, while MS/TP devices reach the station either through a BACnet router that puts the trunk onto the IP network or through an RS-485 port on a JACE wired directly to the trunk. The IP side requirements above are network decisions rather than controls decisions, so someone on the customer's side has to be able to approve broadcast forwarding, firewall rules and where the control network sits. Where that person is not identified early, the network work waits no matter how ready the controls side is.

How are device instance numbers assigned?

By hand, either with DIP switches on the controller or in the vendor's configuration tool; BACnet has no automatic assignment. The number is a 22 bit value in the range 0 to 4194302, and it has to be unique across the entire internetwork rather than just the segment the device sits on, which is why sites that grow past a single building normally reserve a block per building, floor or panel before commissioning starts. Renumbering later is not free, because anything bound to the old number, including a third party front end, has to rediscover the device or be corrected by hand.

Can a Niagara station present its own points to another BACnet system?

Yes. The station's Local Device is a BACnet device in its own right, and station points can be exported so they appear as BACnet objects belonging to that device, which a third party head end then discovers and reads like any controller's objects. The mapping between station points and exported object identifiers is explicit, and the object identifier assigned to a point is what the other system binds to. Changing the station's device instance, or re-exporting a point under a different object identifier, breaks the other system's references while nothing looks wrong inside the station.

Is COV always better than polling?

No. COV earns its place where the device supports it and the alternative is polling many points quickly on a constrained trunk; it is not worth the added moving parts for values that change slowly or that nothing acts on quickly. It requires SubscribeCOV in the device's Protocol_Services_Supported, a COV increment set so that a noisy analog input does not report continuously, and, for confirmed COV, a subscription lifetime the station renews before it expires. A device that loses power and returns does not remember its subscriptions, so recovery behavior matters as much as the initial configuration.

What makes a protocol capture useful?

Being taken while the problem is happening, from a position that actually sees the traffic in question. For BACnet/IP that means a mirror or span port on the switch the station or the device connects to, because a capture taken elsewhere on a switched network sees little more than broadcasts. For MS/TP it means a tap on the trunk itself, running long enough to cover several token rotations rather than a few seconds. Wireshark decodes BACnet natively so no special tooling is needed, and since a capture contains IP addressing and device detail, it is worth agreeing what is in it before it is shared.

When is a BACnet gateway the wrong answer for one piece of equipment?

When the equipment holds nothing but a register map internally. A gateway card fronting a proprietary or Modbus bus adds a hop, a cache and another firmware version to keep track of, and it cannot expose meaning the underlying device never carried. If that equipment already speaks Modbus on a port that reaches the station, reading it directly is often the simpler route, and the naming and engineering-units work is the same either way.