Skip to main content

BACnet/IP Master

BACnet/IP Master reads device properties through a UDP channel and supports discovery, paged object browsing, ReadProperty, ReadPropertyMultiple (RPM), priority writes, and COV. For shared device and variable operations, see Collection Configuration. This plugin uses IPv4 BACnet/IP. MS/TP, BACnet/SC, BBMD, and Foreign Device registration are outside its scope.

Create a channel and device​

Open Development Configuration → Collection Configuration. Create a UDP channel with a local binding and the remote BACnet/IP endpoint, normally on port 47808. Add a BACnet/IP Master device, save it, and enable it. The channel owns the local binding.

ParameterDescription
Target device instance0–4194303. Must match the remote I-Am and each variable's deviceInstance. A device uses its channel's fixed remote endpoint.
Broadcast endpointWho-Is destination; default 255.255.255.255:47808. Choose the correct subnet and interface.
Enable device discoveryAllows Who-Is from the debug panel. An optional instance range limits discovery.
Request timeout100–120000 ms; default 3000.
Maximum RPM properties1–32; default 16. Collection splits properties into batches and reads individually when the peer explicitly rejects RPM or segmentation.
Maximum datagram bytes64–1476; default 1476. Includes BVLL, NPDU, and APDU. A single request that exceeds the limit fails. The minimum must accommodate the standard 50-byte response APDU and outer headers.
Write priority1–16; default 16. Lower numbers have higher priority.
Write application typeDefault Real; must match the actual property type.
Enable COV subscriptionsCreates object subscriptions while retaining polling for unconfirmed or expired relationships.
COV lifetime30–3600 seconds; default 300. Renewed before expiry.
Maximum COV subscriptions1–64; default 32.
Confirmed COV notificationsMatch the device's capability. Valid confirmed notifications receive an acknowledgement.

Configure variable addresses​

{"deviceInstance":12,"objectType":2,"objectInstance":4,"propertyIdentifier":85}

This example reads Present_Value of Analog Value 4 on device 12. Obtain the actual identifiers from the online device. All fields are numeric. Optional arrayIndex uses 0 for array length and indices starting at 1 for elements. deviceInstance must match the device settings. Common property identifiers include 77 for Object_Name, 117 for Units, and 111 for Status_Flags; check that the object supports them.

  1. Add or edit a variable in Real-time Variables and open Field editor beside its address.
  2. Enter the device instance, object type, object instance, and property identifier. Enable the array index only when needed; enter 0 explicitly to read the length.
  3. Confirm and fill back the address, review the generated JSON, then save the variable.
  4. Reopen the editor to verify the saved fields. Cancel discards changes in the field editor.

BACnet/IP variable address editor

Check real-time values​

Enable the variables and open Real-time Variables. Check the configured address, runtime source address, value, online state, and error for every point. Collection time advances on successful reads; change time can remain unchanged while the value stays the same. Change a source value or perform an authorized write, then verify the value and change time.

BACnet/IP polling and COV values

An invalid object, property, or array index reports an error for that variable without preventing other valid points from updating. After correcting it, confirm that the point returns online and its error clears.

Protocol debugging​

Select the device and open Protocol Debug. Core Status shows device capability and datagram budgets; Special Methods and the protocol tabs follow it. Use the workspace Refresh action to update status. Discovery results, COV relationships, errors, and notifications have separate pagination, with 20 rows per page by default. Auto-refresh preserves the current page. Object browsing reads at most 64 objects per page. Display pagination does not change RPM batches or APDU capability.

  1. In discovery, enter both instance limits or leave both empty. Check the returned instance, endpoint, vendor, maximum APDU, and segmentation capability. Discovery does not change the channel's remote endpoint.
  2. Browse objects by page. The plugin first reads Object_List length, then the requested array indices.
  3. Read a full property address. For batch reads, enter one address per line, up to 32, and inspect each result.
  4. Before writing, read the current value, type, and priority. Enter the JSON value, application type, and priority, confirm, then read back.
  5. Relinquish priority writes Null into the selected slot. Present_Value may still be controlled by another priority.
  6. Create a COV relationship and check confirmation, retry/cancellation state, lease, and recent notifications. Change the source value to verify updates, then cancel the test relationship.

Batches, segmentation, and small devices​

Collection groups properties into RPM batches of 1–32. Every request must also fit the complete datagram budget. The advertised response APDU size uses a standard size that fits the remaining space after BVLL and NPDU; a 64-byte datagram budget advertises a 50-byte APDU. Explicit RPM rejection, segmented ComplexACK, or a local size limit triggers individual ReadProperty requests in the original order. Each point retains its own result. Malformed, missing, duplicate, or mismatched acknowledgements fail directly.

All chunks and individual fallback reads in one batch operation share the configured request timeout. The deadline does not restart for each point. Reaching it fails the whole operation with a timeout; cancellation stops the remaining reads. Adding points does not multiply the wait when the remote device is offline.

Object_List is read by length and array indices rather than as a whole array. For devices that accept only individual reads, set maximum RPM properties to 1. Collection, property details, special methods, and debugging then use ReadProperty individually.

BACnet/IP objects and property details

Include valid addresses and one invalid address in a batch. Inspect each succeeded and error, including valid points after the failed one. The overall panel reports failure when any point fails. This example uses one property per batch and a 64-byte complete datagram budget:

BACnet/IP individual reads and per-property results

Each manual COV relationship retains its own process ID, lifetime, and confirmation mode. Failed cancellation stops renewal and is retried. Device shutdown cancels relationships and closes the channel within a bounded deadline. Only notifications matching the device, object, property, and array index update a variable.

BACnet/IP COV relationships and notifications

Writes support Null, Boolean, Unsigned, Signed, Real, Double, OctetString, CharacterString, Enumerated, and ObjectIdentifier. BitString, Date, and Time are currently read types. CharacterString uses UTF-8, including Chinese characters.

Special methods​

Open Protocol Debug → Special Methods. Switching protocol tabs preserves the current device's drafts and results.

MethodParameters and purpose
DiscoverDevicesAsyncOptional lowLimit and highLimit; sends Who-Is and returns bounded results.
BrowseObjectsAsyncstartIndex starts at 1; pageSize is 1–64.
ReadPropertyAsync / ReadPropertiesMultipleAsyncA single addressJson, or addressesJson containing an array of JSON address strings.
WritePropertyAsync / RelinquishPropertyAsyncProperty address, application type / JSON value, and priority; waits for the peer's response.
SubscribeCovObjectAsyncobjectJson, such as {"objectType":2,"objectInstance":4}, plus process identifier, lifetime, and confirmation mode.
CancelCovObjectAsync / CancelAllCovAsyncCancels one object relationship or all relationships for the device.

Enter parameters as a JSON array in method order, or use the field editor. Trailing optional parameters can be omitted. Discovering only instance 12 uses [12,12]. Browsing 16 objects from index 65 uses [65,16]; a final page may contain fewer rows while preserving the total count.

BACnet/IP final object page through special methods

A successful special-method invocation can still contain per-property errors. Inspect every Error. A ReadProperty address is a string parameter and requires JSON escaping:

["{\"deviceInstance\":12,\"objectType\":2,\"objectInstance\":4,\"propertyIdentifier\":85}"]

Troubleshooting​

SymptomCheck and action
No discovery resultsCheck broadcast subnet, interface, UDP binding, firewall, and instance range. Directed reads use a different path from broadcast discovery.
Wrong source or timeoutCheck the remote endpoint, device instance, and port.
One RPM property failsInspect its error and verify object, property, array index, and service support.
RPM rejected or segmented ComplexACKInspect the individual read results. Malformed or incomplete acknowledgements fail without retrying as individual reads.
Write accepted but value unchangedRead Priority_Array, Present_Value, and Out_Of_Service; check higher priorities.
No COV notificationsCheck support, lifetime, confirmation mode, increment threshold, and relationship state. Verify polling first.