DIAdem-Version: 11.1 DIAdem-Sprachversion: DE DIAdem Erfahrung seit: -
Beiträge: 3
Registriert seit: Nov 2010
Channel ansprechen
Hallo allerseits,
ich habe schon recht viel in VBS in DIAdem programmiert, aber ein Problem taucht immer wieder auf, der Zugriff auf Channel bzw. Channelinhalte in verschiedenen Channelgroups.
Viele Befehle wie z. B. Chnname(x) etc. erlauben nicht die Angabe einer Channelgroup sondern nur eine Kanalnummer. Auch ChD(i,4) etc. erlaubt keine Channelgroup auswahl. Baluäugig bin ich davon ausgegabgen, dass sich diese Befehle immer auf Kanäle in der aktuell aktivierten Gruppe beziehen (mittels Call GroupDefaultSet(GroupIndexGet(nameGruppe))
oder Call Data.Root.ChannelGroups(GroupIndexGet(nameGruppe)).Activate()
ausgewählt).
Leider scheint dem nicht so, statt dessen ist immer die erste Gruppe betroffen. Ist dies historisch bedingt (früher gab es wohl keine Channelgroups) oder mache ich einfach irgendetwas falsch.
Zudem schwanke ich bei den Zugriffsmodellen zwichen den objektorientieren Ansatz über "Data.Root......" und den klassischen Befehlen wie Chnname etc. Ist dies eine Glaubensfrage oder gibt es harte Argumente für ein einheitliches Vorgehen?
DIAdem-Version: alle DIAdem-Sprachversion: DE/EN DIAdem Erfahrung seit: 1995
Beiträge: 310
Registriert seit: Oct 2008
RE: Channel ansprechen
Hallo Christian,
DIAdem arbeitet per Default im namensorientierten Modus. In den allgemeinen Einstellungen zu DIAdem kannst du die verwendete Syntax für die namensorientierten Kanalbezüge einstellen. Und in den allgemeinen Einstellungen zu REPORT kannst du festlegen, ob namensorientierten Kanalbezüge verwendet werden sollen. Diese Einstellungen werden in der Desktop Datei gespeichert.
Ich habe gerade folgendes getestet: msgbox chnname("[1]/[2]") - das funktioniert (also mit Kanalgruppenbezug).
Aber du hast recht, dieser Befehl stammt noch aus "längst" vergangenen Zeiten, in denen es kein TDM gab. Aus Gründen der Kompatibilität werden diese Befehle weiterhin unterstützt. Besser ist es natürlich die neue Syntax zu verwenden, die Data-API.
DIAdem-Version: 11.1 DIAdem-Sprachversion: DE DIAdem Erfahrung seit: -
Beiträge: 3
Registriert seit: Nov 2010
RE: Channel ansprechen
Vielen Dank Carpe_Diadem für die schnelle Antwort.
msgbox chnname("[1]/[2]") mag funktionieren (ich habe nicht alle Bezugsmethoden durchprobiert) aber das wesentlich wichtigere ChD(i,x) konnte ich so nicht zum laufen bringen. Das Problem ist das das Verhalten von DIAdem nicht eindeutig erscheint. Ab und zu beziehen sich diese Befehle tatsächlich auf die aktuelle Channelgroup, ab und zu wird immer nur die erste angesprochen. Dies scheint eher zufällig (evtl. arbeitet DIAdem intern mit dem objektorientierten Ansatz und "mapped" die alten Befehle um, je nachdem wann die interne Referenzen aktualisiert werden kommen so falsche Bezüge zustande). Wenn dem so wäre, ist es SEHR unbefriedgend das im Handbuch nicht an prominenter Stelle von der Verwendung des alten Syntax gewarnt werden. (Hat mich sicherlich schon einige Arbeitstage gekostet) Ein derart zufälliges Verhalten ist dummerweise kaum zu Debuggen.
Problem bei dem Data Api ist der häufig sehr lange Aufruf, dies zerstört die Übersichtlichkeit, bzw. zerfasert die Programmierung durch häufige set Aufrufe. Aber dies ist sicherlich geschmackssache. Mir wird aber gar nichts anderes übrig bleiben als komplett umzusteigen.
Unbedingt nötig ist aber eine Neuordnung im DIAdem Handbuch. Es sollte strikt eine (in sich geschlossene) Programmierphilosophie benutzt werden und alte Befehle die nur der Kompatibilität dienen auch so gekennzeichnet sein.
An sich aber ein gut gelungenes Programm mit dem es Spass macht zu arbeiten!
26.11.2010, 14:22 (Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2010 14:24 von Carpe_DIAdem.)
DIAdem-Version: alle DIAdem-Sprachversion: DE/EN DIAdem Erfahrung seit: 1995
Beiträge: 310
Registriert seit: Oct 2008
RE: Channel ansprechen
Hallo Christian,
das freut mich zu hören (das mit dem gelungenem Programm und dem Spaß).
Die Umstellung auf die Data-API ist eine Entscheidung, die nicht leichtfertig getroffen wurde. Sie war aber notwendig um eine höhere Flexibilität, bessere Lesbarkeit und Wartbarkeit von Scripten zu erhalten - aber vor allem um die Verarbeitungsgeschwindigkeit erheblich zu steigern.
So gibt es keinen schnelleren Zugriff auf einen Kanaleinzelwert als den über das Kanalobjekt.
set oChn = Data.Root.ChannelGroups(1).Channels(2)
msgbox oChn(2) ' zweiten Wert aus zweitem Kanal der ersten Kanalgruppe anzeigen
Übrigens bei mir funktioniert auch: msgbox chd(2,"[1]/[2]")