This page is a BACnet reference I made for myself, hopefully you find it useful as well. It’s mostly useful when you’re doing lower level protocol troubleshooting.
Index
BACnet Clients
- Free and open-source!
- Supports MS/TP and BACnet/IP. You can add multiple of both and work with them at the same time! Different baudrates, UDP ports, etc. are supported
- Does not handle buggy busses very well. Gets very slow and unresponsive.
- Probably the most straightforward
- Does not have a lot of features; while you can see that there is a schedule object or a trend log object, you can’t really interact with them usefully
- Supports BBMD foreign device registration
- Great for MS/TP – doesn’t assume the network is perfect and includes some diagnostics for faulty wiring/configuration
- Not developed, team unresponsive to requests despite high ticket price
- UCS-2 encoding unsupported
- Doesn’t support BBMD at all
- Using an N4Workbench as a BACnet client is overkill, but it’s very flexible and extremely powerful
- You need Niagara N4 certification (~$2,000)
- You need to buy a N4 workbench license (~$1,000?)
- Very good support for BACnet/IP and MSTP
- Very good for an Android app.
- You need to be on the same network obviously, but it does support BBMD foreign device registration
- Limited functionality that we’ve come to expect from mobile platforms
Instance Numbers, Network Numbers, Port Numbers
BACnet UDP Port
While I don’t think it’s a good idea for people the default BACnet port, it is done. Sometimes a site will have different BACnet devices segmented by different BACnet ports to prevent third-party vendors from disrupting other segments via poor configuration. The default port is 47808 or 0xBAC0 in hexadecimal. BACnet communicates exclusively over UDP.
Device Instance Number
Unlike MAC addresses on an MS/TP network, the instance number absolutely must be unique on the entire system. They range from 0 to 4,194,302. Treat it like an IP address. I wrote a separate article on this: BACnet Instance Number.
Network Number
BACnet network numbers are frequently misunderstood. You should have one unique network number for every different network in your system. The easy to understand part is that each MS/TP channel is a different network. The less easy to understand part is that 192.168.0.0 / 255.255.255.0 is a different network than 192.168.1.0 / 255.255.255.0. Different network IP segments are different networks and should have different network numbers.
Devices don’t know their network number, only BACnet routers do. They can range between 1 and 65535. Typically the front end is on network 1.
Object ID numbers and Parameter Numbers
If you’re using Wireshark or a low-level BACnet client, you’ll need a reference like this to associate parameter and object type names with their numerical values.
If you’re troubleshooting a BACnet problem with low-level tools like Wireshark or a command-line BACnet tool, you might have to know what the object IDs and parameter numbers are. I can never remember anything other than presentValue (85!), so here’s a reference.
Object IDs
Object | Number |
Analog Input | 0 |
Analog Output | 1 |
Analog Value | 2 |
Binary Input | 3 |
Binary Output | 4 |
Binary Value | 5 |
Calendar | 6 |
Command | 7 |
Device | 8 |
Event Enrollment | 9 |
File | 10 |
Group | 11 |
Loop | 12 |
Multistate Input | 13 |
Multistate Output | 14 |
Notification Class | 15 |
Program | 16 |
Schedule | 17 |
Property IDs
PropertyName | Number |
ackedTransitions | 0 |
ackRequired | 1 |
action | 2 |
actionText | 3 |
activeText | 4 |
activeVtSessions | 5 |
alarmValue | 6 |
alarmValues | 7 |
all | 8 |
allWritesSuccessful | 9 |
apduSegmentTimeout | 10 |
apduTimeout | 11 |
applicationSoftwareVersion | 12 |
archive | 13 |
bias | 14 |
changeOfStateCount | 15 |
changeOfStateTime | 16 |
notificationClass | 17 |
none | 18 |
controlledVariableReference | 19 |
controlledVariableUnits | 20 |
controlledVariableValue | 21 |
covIncrement | 22 |
datelist | 23 |
daylightSavingsStatus | 24 |
deadband | 25 |
derivativeConstant | 26 |
derivativeConstantUnits | 27 |
description | 28 |
descriptionOfHalt | 29 |
deviceAddressBinding | 30 |
deviceType | 31 |
effectivePeriod | 32 |
elapsedActiveTime | 33 |
errorLimit | 34 |
eventEnable | 35 |
eventState | 36 |
eventType | 37 |
exceptionSchedule | 38 |
faultValues | 39 |
feedbackValue | 40 |
fileAccessMethod | 41 |
fileSize | 42 |
fileType | 43 |
firmwareRevision | 44 |
highLimit | 45 |
inactiveText | 46 |
inProcess | 47 |
instanceOf | 48 |
integralConstant | 49 |
integralConstantUnits | 50 |
issueConfirmedNotifications | 51 |
limitEnable | 52 |
listOfGroupMembers | 53 |
listOfObjectPropertyReferences | 54 |
listOfSessionKeys | 55 |
localDate | 56 |
localTime | 57 |
location | 58 |
lowLimit | 59 |
manipulatedVariableReference | 60 |
maximumOutput | 61 |
maxApduLengthAccepted | 62 |
maxInfoFrames | 63 |
maxMaster | 64 |
maxPresValue | 65 |
minimumOffTime | 66 |
minimumOnTime | 67 |
minimumOutput | 68 |
minPresValue | 69 |
modelName | 70 |
modificationDate | 71 |
notifyType | 72 |
numberOfAPDURetries | 73 |
numberOfStates | 74 |
objectIdentifier | 75 |
objectList | 76 |
objectName | 77 |
objectPropertyReference | 78 |
objectType | 79 |
optional | 80 |
outOfService | 81 |
outputUnits | 82 |
eventParameters | 83 |
polarity | 84 |
presentValue | 85 |
priority | 86 |
priorityArray | 87 |
priorityForWriting | 88 |
processIdentifier | 89 |
programChange | 90 |
programLocation | 91 |
programState | 92 |
proportionalConstant | 93 |
proportionalConstantUnits | 94 |
protocolConformanceClass | 95 |
protocolObjectTypesSupported | 96 |
protocolServicesSupported | 97 |
protocolVersion | 98 |
readOnly | 99 |
reasonForHalt | 100 |
recipient | 101 |
recipientList | 102 |
reliability | 103 |
relinquishDefault | 104 |
required | 105 |
resolution | 106 |
segmentationSupported | 107 |
setpoint | 108 |
setpointReference | 109 |
stateText | 110 |
statusFlags | 111 |
systemStatus | 112 |
timeDelay | 113 |
timeOfActiveTimeReset | 114 |
timeOfStateCountReset | 115 |
timeSynchronizationRecipients | 116 |
units | 117 |
updateInterval | 118 |
utcOffset | 119 |
vendorIdentifier | 120 |
vendorName | 121 |
vtClassesSupported | 122 |
weeklySchedule | 123 |