Der logische Gerätetyp ist eindeutig, d.h. zwei (beispiel) servocontroller haben auch verschiedene Codes, sie haben ja verschieden Aufgaben.
Aus diesem Code leite ich bei Buskonflikten die Zugriffs-Wiederhol-Zeit ab, damit die Gleichzeitigkeit (nach Möglichkeit) vermieden wird.
Um beim Beispiel zu bleiben: einer der Servocontroller startet, hört den Bus ab. Wurde das komplette System gerade gestartet, hört er eigentlich garnix, weil ja alle erstmal lauschen. Er nimmt sich also die erstbeste adresse und schickt nach seiner individuellen Code-Zeit sein Heartbeat mit der Adresse los. Die Geräte mit kürzerer Zeit haben da aber schon gesendet, er muss also ggf. wieder revidieren und eine andere Adresse nehmen. (Für Geräte danach gilt das Gleiche).

In der Praxis ist das weniger kompliziert, als es vielleicht klingt:
1 Ein Gerät wählt sich irgendeine Adresse aus und wartet eine gewisse Zeit.
1a Kommt kein GCA mit dieser Adresse, schickt er einfach sein Heartbeat los.
1b Wenn schon, nimmt er die nächste und --> 1

Im Betrieb:
Wann immer: Wird ein (fremdes) GCA-Heartbeat empfangen mit der gleichen Adresse wie man selbst, geht man wieder in den "Lausch-Modus".

Und die Geräte, die diese Info brauchen, müssen ev. immer wieder ihrern Adresseintrag korrigieren, da sie sich immer wieder ändern kann.

Du hast recht, bei sehr vielen Geräten kann es etwas dauern, bis sich alle halbwegs einig sind. Aber dafür kann man eben einfach anstecken.

aaaaaaber: Wenn man Geräte am Bus hat, die da nicht mitspielen, (und das hat man meistens) wird die Sache komplizierter.

Ich verwende die Heartbeats auch, um An- oder Abwesenheit von Geräten festzustellen, um eine Konfigurationstabelle zu erstellen ( das macht aber der PC, der hat mehr Platz.)

Remark: In der Realität ist das Ganze mehr eine Fingerübung. Soooo variabel sind die Netz nun meist garnicht.