Ich denke, Du hast Dich etwas verrannt.
Da Du im gesamten Projekt nur eine einzige SourceInfo-Eventclass brauchtst, kannst Du die doch fest an stLocalizedSourceInfo verdrahten. Nur die sSourceInfoName musst Du individualisieren, und die kannst Du, wenn Du objektorientiert vorgehst, einmal als Parameter an Deinem Objekt "Pumpe" festlegen.
Also:
C-ähnlich:
fbPumpe(
in_Source := 'ORT_DER_PUMPE'
...
);
Und dann innerhalb des Objektes an jedem einzelnen Event:
C-ähnlich:
fbEvent.Cyclic(
xRaise:= FALSE,
xAck:= FALSE,
stEventEntry:= Global.TC_EVENTS.AlarmEventClass.PUMP,
stLocalizedSourceInfo:= Global.TC_EVENTS.SourceInfoEventClass,
sSourceInfoName:= in_Source);
Deine SourceInfoEventClass kannst Du Projektweit einsetzen.
Allerdings muss ich einschränken, dass ich nicht genau weiß, wie Du stLocalizedSourceInfo und sSourceInfoName in Deiner Cyclic-Methode verwendest. Ich habe dazu nur Vermutungen.
PS. Ich entwerfe auch Architekturen, die jede Menge Zeit einsparen können.
Die SourceInfo möchte die EventClass-GUID/UUID, die EventID und den Key. So habe ich es zumindest verstanden.
Wenn es sich allerdings um die EventCLASS GUID/UUID und die ID handelt, hast du recht. Dann könnte man das global definieren und einmal verwenden und nur noch die Keys übergeben.
Das fesselt mich aber zu sehr an einem festen Konstrukt, sodass es genau diese EventClass (z.B. LocalizedSourceInfo) geben muss.
Meine Erfahrung:
Erzwinge ich diesen festen Aufbau, dann wird er falsch benutzt oder die Kollegen nutzen ihn überhaupt nicht und entwickeln etwas Eigenes.
Die Gründe dafür können vielfältig sein. (Baustelle, Zeitmangel, Workaround ...)
Das Problem ist nicht das Verschachteln von LocalizedEventClass + Event, sondern der hardcodierte Key.
Der Compiler kann nicht prüfen, ob es diesen Key überhaupt gibt, er schluckt ihn einfach.
Und im Zweifel funktioniert die Übersetzung nicht – fertig. Das ist das Problem.
PS:
Wenn ich mit .AddEventReferenceEx() eine Referenz zu einem anderen Event hinzufüge, löst er es sprachlich korrekt auf.
Ich benötige nicht einmal einen Translation Key! Falls es das Event, das ich referenzieren möchte, nicht mehr gibt, sagt mir der Compiler das.
Vielleicht hat ja jemand in der LocalizedSourceInfo herum gebastelt oder der Übersetzer hat etwas versaubeutelt. Auf jeden Fall sehe ich beim Kompilieren, dass es nicht funktionieren kann.
Die SourceInfo verhält sich halt ganz anders. Der Key muss nicht existieren, das ist ihm egal.
Für mich sehe ich gerade folgende zwei Möglichkeiten:
Entweder ich einige mich darauf, dass der Ort der Meldung dem eigentlichen Eventtext hinzugefügt wird. Das funktioniert immer und der Compiler schimpft, wenn nicht.
Alternativ mache ich es technisch richtig und trage den Ort in SourceInfo ein. Allerdings muss ich mich darum kümmern, dass der Key existiert. Das muss ich gegebenenfalls prüfen. Mir fehlt gerade die Kreativität, um zu überlegen, wie ich das gescheit automatisieren kann.
Ich möchte mich nicht auf eine stumpfe Regel wie „Halt dich ans Konzept und dann geht es” verlassen. Es soll schon reproduzierbar bleiben.