From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Data Plugin mit Header und variabler Zahl von Binärblöcken

Hallo Leute,
ich möchte ein Dataplugin für DIAdem 9.1 und höher entwickelt, dessen Dateiformat ein wenig an DIAdem DAT erinnert, d.h. aus einer Headerdatei (ASCII) und einer variablen Anzahl von Binärblöcken besteht. Zusätzliches Problem: der Header steht in einem Startverzeichnis und die Binärdateien als immer gleichnamige Gruppen von Dateien in jeweils eigenen Unterverzeichnissen. Die Kanäle eines Unterverzeichnisses sollen mit den Daten der anderen Unterverzeichnisse verkettet werden. Die Leider habe ich kein Beispiel gefunden, das so eine Kombination von ASCII Headern und Binärdaten behandelt.

Das Format sieht in etwa so aus:

Header:
<kanaele>
<kanal>
name=binaer1.x               'Dateiname der Binärdatei
faktor=0.1                         'Faktor zur Umrechnung der Binärdaten
offset=2                            'Offset zur Umrechnung der Binärdaten
bytes=2                            'Anzahl der Bytes der Werte im Binärdatensatz (Zeitstempel immer 8Bytes)
</kanal>

<kanal>
name=binaer2.x
faktor=0.4
offset=-10
bytes=4
</kanal>
...
</kanaele>

die Binärdateien enthalten in einer Folge abwechselnd Werte und deren (absoluten) Zeitstempel und sehen etwa so aus (jedes Zeichen steht für ein Byte. w steht für Werte, z für Zeitstempel):

binaer1.x:
wwzzzzzzzzwwzzzzzzzzwwzzzzzzzzwwzzzzzzzzwwzzzzzzzzwwzzzzzzzz

binaer2.x
wwwwzzzzzzzzwwwwzzzzzzzzwwwwzzzzzzzzwwwwzzzzzzzzwwwwzzzzzzzz

Verzeichnisstruktur/ Dateien darin

<Wurzel>                /Header.asc
      |
      - <Daten1>       /binaer1.x, binaer2.x
      |
      - <Daten2 >      /binaer1.x, binaer2.x

zur Verkettung:
An "binaer1.x" aus <Daten1>  wird  "binaer1.x" aus <Daten2> angehängt. Daran wird "binaer1.x" aus <Daten3>  angehängt werden usw.

Mein Ansatz ist der, dem Plugin den Namen der Headerdatei mitzugeben.
Anschließend wird der Inhalt der Headerdatei in eine Objektstruktur übergeben und eine Liste der Unterverzeichnisse erstellt.
Jetzt werden über alle Kanäle der Objektstruktur die Verzeichnisse durchsucht, und gefundene Binärdateien (mit gleichem Namen) aneinandergehängt.

meine Fragen:
- wie erzeugt man die Fileobjekte für Header und Binärdateien und führt sie zu einer Kanalstruktur zusammen (in der Beispielen wird alles aus einer einzigen Datei abgeleitet, hier wird ja aus dem Header der Dateilname für den Kanal erst abgeleitet)?
- wie verkettet man Kanalfragmente aus mehreren Binärdateien zu einem resultierendem Kanal?


Danke für alle Tips und Beispiele

Gruß

Udo
0 Kudos
Message 1 of 3
(3,605 Views)
Hallo Udo,

ich versuche die Fragen eins nach dem anderen anzusprechen:

1.) Wie erzeugt man ein File Objekt?
Den Header erstmal als Argument zu ReadStore zu erwarten ist wahrscheinlich ein guter Ansatz.  Wenn Du ein File Objekt auf einen anderen File aufsetzen willst, ist die richtige Funktion dafür OpenFile.  Wenn Du den Pfad zu Deinem Binärdaten von dem Pfad des Headers ableiten willst, kannst Du File.Info.Path benutzen um den Pfad Deines Headers zu bekommen.  Aus diesem neuen File Objekt kannst Du, wie gewohnt, Binärblöcke holen und DirectAccessChannels erzeugen.

2.) Wie hänge ich die Werte von mehreren Blöcken zusammen in einem Kanal?
Mit DIAdem 9.1 musst Du dies von Hand machen.  Ab DIAdem 10.2 besteht die Möglichkeit die ProcessedChannels zu benutzen.  Das Benutzen der ProcessedChannels sieht wie folgt aus:

    Dim ProcessedChannel : Set ProcessedChannel = ChannelGroup.Channels.AddProcessedChannel(DirectAccessChannel1)
    ProcessedChannel.Channels.Add(DirectAccessChannel2)


Damit werden die Werte des zweiten DirectAccessChannels hinter den Werten des erstens gehangen.  Dies heißt auch "Aggregation", Die Möglichkeit zu Addition besteht auch.

Selbst wenn Du aber DIAdem 10.2 benutzt, sehe ich hier ein potenzielles Problem: Es ist nicht möglich die unterschiedliche Komponenten des Kanals unterschiedliche Faktor und Offset vorzugeben.  In Deinem Beispiel wäre dies aber nötig.

Das Anhängen Werte in einem Kanal von Hand wird mit dem Einzelwert Kanal gemacht, und kann je nachdem wie viel Daten Du einlesen willst, viel Zeit kosten:

    Dim Channel : Set Channel = ChannelGroup.Channels.Add(...)
    Channel.Values(n1..nm) = DirectAccessChanel1.Values(1..m) '(pseudocode)

3.) Das einlesen von Zeitstempeln...
Wenn das Zeitstempel nur aus einem double Anzahl Sekunden oder so besteht wirst Du das Zeitstempel als eR64 Kanal einlesen können, aber das explizites Anlegen von Zeitkanäle (eTime) in Binärblöcke ist nicht möglich.

Wenn das irgendeine Frage offen lässt frag noch mal bitte:

Mit freundlichen Grüßen,
Myrle
******************
For tips and tricks on creating VBScript DataPlugins go to http://dataplugins.blogspot.com.
0 Kudos
Message 2 of 3
(3,590 Views)
Danke für den Tip, Myrle!
Ich werde es ausprobieren.

Gruß

Udo
0 Kudos
Message 3 of 3
(3,586 Views)