After assigning the Ignition BACnet local device a free UDP bind port while leaving the simulator on its existing port, the device reached Initialized and stayed there. For this driver, Initialized is the normal final state; BACnet uses connectionless UDP, so the device does not advance to a connection-oriented Running state.
Check 1: Initialization log signature
Before anything else, read the gateway log entry generated when the local BACnet device starts. The decisive failure is not the alternating status by itself. It is the socket-bind exception associated with the local address and port.
- Locate the initialization entry for the local device. Confirm the entry names the configured device and reports its bind address, bind port, network number, and device number.
- Look immediately below that entry for
java.net.BindException: Address already in use: Cannot bind. - If the bind exception is present, treat the local UDP endpoint as occupied and continue to the endpoint-ownership check.
- If the exception is absent, do not change ports solely because the state says
Uninitialized. Read the first exception in the same startup attempt and troubleshoot that subsystem instead.
The failing configuration reported:
Error initializing LocalDevice "BACNet_Test".
bindAddress=192.168.1.104
bindPort=47808
networkNumber=1
deviceNumber=1000
java.net.BindException: Address already in use: Cannot bind
This message shows that initialization stopped while the BACnet/IP network layer attempted to acquire the local UDP socket. Object discovery, remote-device communication, and application-level BACnet exchanges occur later. Do not move on to remote object settings until the local bind succeeds.
Check 2: Local endpoint ownership
A UDP listener is identified locally by its bind address and bind port, subject to the operating system's socket-sharing rules. Two applications on the same computer cannot normally claim the same address-and-port combination unless both explicitly use compatible sharing behavior. The simulator and Ignition were running on the same machine, and both attempted to use port 47808.
- Read the Ignition local-device bind address and bind port. In the failing setup they were
192.168.1.104and47808. - Read the simulator's local listening port. If it is also
47808on the same host endpoint, the configurations conflict. - Check whether another BACnet service or a second instance is already using the configured endpoint. The process holding the endpoint, not the process merely sending traffic to it, is the relevant finding.
- If one process already owns the endpoint, continue to the local-versus-remote port comparison. If the endpoint is free, check for duplicate local-device instances, a stale application process, or a bind address that is not assigned to an active interface.
A process can send datagrams to a destination port without owning that port locally. Keep the local bind setting separate from the remote simulator destination setting when comparing the two configurations.
Check 3: Local and remote port roles
The change that resolved this installation was asymmetric: change the Ignition local bind port, but leave the simulator on its existing port. Changing both values together preserved or moved the conflict rather than establishing distinct endpoints.
| Setting | Failing value | Resolving value | Confirmation before continuing |
|---|---|---|---|
| Ignition local bind address | 192.168.1.104 |
192.168.1.104 |
The address belongs to the intended active interface. |
| Ignition local bind port | 47808 |
47809 |
No other local process owns this address-and-port pair. |
| Simulator port | 47808 |
47808 |
The simulator remains available on its configured endpoint. |
| Local device number | 1000 |
1000 |
No port correction requires changing the device number. |
| Local network number | 1 |
1 |
No port correction requires changing the network number. |
47809 is the alternate value that worked here, not a universal assignment for every system. On another host, first verify that the proposed port is unused and that the local and remote BACnet/IP configurations route traffic to the intended endpoints. If site firewall rules restrict UDP traffic, update the applicable rule for the selected local port.
Check 4: Symptom-to-cause branches
| Observed reading | Meaning | Next check |
|---|---|---|
Initializing alternates with Uninitialized, with Address already in use
|
The driver retries, but each attempt fails before the local UDP transport starts. | Find the competing owner and assign a free local bind port. |
The simulator and local device both bind 47808 on the same machine |
The applications contend for the same local endpoint. | Move only the Ignition local bind port, then restart the gateway. |
| The bind succeeds but no remote device appears | The socket conflict is cleared; the remaining fault is beyond local initialization. | Check destination addressing, interface selection, subnet and broadcast path, firewall handling, and remote device identity. |
Status remains Initialized
|
The local BACnet device has completed startup. This is the driver's final steady state for its UDP-based operation. | Verify BACnet discovery or reads instead of waiting for Running. |
| A different startup exception appears | The failure branch has changed and the bind-conflict procedure no longer identifies the active fault. | Use the first current exception and its configuration fields as the next decision point. |
Simulator compatibility is not the first branch when the log already reports a local bind failure. That exception occurs before meaningful BACnet traffic can be exchanged. Clear the host-level socket problem first; evaluate protocol interoperability only after the local device initializes.
Check 5: Corrective commissioning sequence
- Stop configuration changes long enough to capture the current gateway log. Record the local device name, bind address, bind port, network number, device number, and exact exception. Confirm that
Address already in useis the active failure. - Compare every BACnet application's local listener on the machine. Confirm that the simulator and Ignition are both attempting to own
47808before changing a value. - Set the Ignition local-device bind port to an unused port. For the documented configuration, set it from
47808to47809. - Leave the simulator port at
47808. Confirm that the simulator still listens on that port and that its remaining address and device settings have not been unintentionally changed. - Save the Ignition local-device configuration. Reopen or reread the saved configuration and confirm that the bind port is
47809; do not rely only on an edited field that has not been committed. - Restart the Ignition gateway so the BACnet module releases any previous resources and initializes from the saved settings. Do not move on until a new startup attempt appears in the log.
- Read the new initialization result. The previous bind exception must be absent, and the device state must settle at
Initialized. - Perform a BACnet operation against the simulator, such as the configured discovery or value-read workflow. Confirm that returned device or object data belongs to the intended simulator rather than another BACnet node.
Check 6: UDP state interpretation
TCP-oriented drivers often expose a state that represents an established session. BACnet/IP uses UDP, which does not establish a persistent transport connection before application traffic flows. The local device initializes its socket and BACnet transport, then waits for or sends datagrams as required.
For this Ignition BACnet driver, Initialized therefore means that local startup completed. It is not a transitional state waiting for Running. Remote silence, a stopped simulator, or a network-path problem may prevent useful data exchange without converting UDP into a connection-state model. Separate these two tests:
-
Local readiness: the local socket binds, the initialization exception disappears, and the state remains
Initialized. - Remote communication: discovery, object enumeration, or configured reads return the expected simulator data.
A stable Initialized state proves that the original bind failure is resolved. It does not by itself prove that broadcast routing, destination-port configuration, firewall policy, or remote BACnet object settings are correct.
Check 7: Resolution verification
- Restart the gateway one more time after the configuration is saved. Confirm that the local device initializes without
java.net.BindException. - Observe the state across more than one driver status refresh. Confirm that it no longer alternates between
InitializingandUninitialized. - Confirm that
Initializedremains the steady state; do not wait forRunning. - Check the gateway log for a new error tied to
BACNet_Test. If a new exception exists, follow that exception rather than reopening the cleared port-conflict branch. - Run the intended BACnet discovery or data-read test and compare the returned identity and values with the simulator configuration.
Frequently Asked Questions
What happens if Ignition and a BACnet simulator both use port 47808?
If both applications bind the same local address and UDP port on one machine, one can fail with java.net.BindException: Address already in use: Cannot bind. Assign one application a free local bind port.
What happens if I change the port on both the local device and simulator?
You may preserve the collision or create a destination mismatch. In the resolving configuration, the Ignition local bind port changed to 47809 while the simulator remained on 47808.
What happens if the BACnet device stays Initialized?
Initialized is the final normal state for this UDP-based driver, not a waiting stage before Running. Verify discovery or reads to test remote communication.
What happens if the bind error disappears but discovery still fails?
The local socket problem is fixed. Check the selected interface, destination addressing, subnet or broadcast path, UDP firewall handling, remote port, and BACnet device identity.
What confirms the BACnet port-conflict fix?
Restart the gateway, confirm that Address already in use does not return, verify a stable Initialized state, and complete the final discovery or data-read test against the intended simulator.