Entwickler-Ecke

Dateizugriff - Welche Datenstruktur


Ruditschka - Mo 27.10.03 20:29
Titel: Welche Datenstruktur
Hallo zusammen!

Ich bin dabei ein Programm zu schreiben, das analoge Daten über ein I2C-Interface ausgeben soll. Da die Hardware-Erweiterung damit keine 10 EUR pro 8 Kanäle kostet, möchte ich das Programm gerne so gestalteten, dass es eine variable Anzahl an Kanälen unterstützt. Ebenso soll es quasi Programmsequenzen auf den Ports ausgeben. D.h. mehrer Schritte sollen in ein Programm zusammengefasst werden. Nun meine Frage:

Welche Datenstruktur kann man hierfür gut verwenden?
Dynamisches Array? Wie speichern?
Datenbank, pro Programm eine Tabelle? Ist die Datenbank damit nicht "unterfordert", sprich viel zu resourcenfressend?

Ach ja, die einzelnen Elemente sind festgelegt auf Variablen vom Typ Byte. (0..255 lässt sich nun mal einfach in analog verwandeln)

Besten Dank für eure Hilfe (hoffentlich :? )

Gruß
Christoph


Tino - Di 28.10.03 10:37

Wie sehen denn genau die Daten aus die du übertragen möchtest?

Gruß
Tino


Ruditschka - Di 28.10.03 15:21

Pro Kanal und Programmschritt wird ein Integerwert vom Typ Byte (0..255) genutzt. Das heißt, dass erst einmal als Nutzwerte nur die Bytes gespeichert werden müssen. In welchem Format ist mir erst mal relatib egal, ich muss nur hinterher die Möglichkeit haben, alle Kanalwerte eines Schrittes, also z.B. die Zeile einer Tabelle, erkennen zu können (also keine Fortlaufende Wertkolonne nach dem Motto, ein Byte hat immer acht Bit - ist mir ehrlich gesagt zu unhandlich (ja, vom Prinzip wird alles so gespeichert, aber es gibt auch für den Programmierer schönere Arten) :wink: )

Gruß
Christoph


Wolff68 - Di 28.10.03 22:12

Also ich würde für Deinen Fall ein Typ generieren. Diesen kannst relativ einfach in eine Datei schreiben und auch wieder auslesen.

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
type
  TChannel = record
    Port : Array[1..8] of Byte;
  end;

  private
    AChannel : Array of TChannel;
    FChannel : File of TChannel;


procedure TForm1.btLoadClick(Sender: TObject);
var
  i : byte;
  C : Integer;
begin
  { Leeren }
  SetLength(AChannel,1);

  { Laden }
  AssignFile(FChannel, 'D:\Channel.chn');
  try
    ReSet(FChannel);
    C := 0;
    While Not EOF(FChannel) do begin
      SetLength(AChannel, C+1);
      Read(FChannel, AChannel[C]);
      INC(C);
    end;
  finally
    CloseFile(FChannel);
  end;
end;

procedure TForm1.btSaveClick(Sender: TObject);
var
  i : byte;
  C : Integer;
begin
  AssignFile(FChannel, 'C:\Channel.chn');
  try
    ReWrite(FChannel);
    For C := 0 to Length(AChannel)-1 do begin
      Write(FChannel, AChannel[C]);
    end;
  finally
    CloseFile(FChannel);
  end;
end;


Damit kannst jetzt eine Programmsequenz abspeichern. (Beliebig lange 8-Byte Folge)
Für AChannel kannst jetzt auch noch ein 2-Dimensionales Array machen, und Dir mehrere 8-Byte Kanäle drin abspeichern.


Ruditschka - Mi 29.10.03 15:49

Hallo!

Zuerst einmal Danke für die Hilfe.
Wenn ich das richtig sehe, kann ich mit dem Beispielcode aber nur Kanalzahlen als Vielfaches von 8 speichern / bearbeiten. Kann man den Code auch so modifizieren, dass ich eine beliebige Anzahl speichern kann?
Und was passiert, wenn ich z.B. 16 Kanäle ansprechen will?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TChannel = record  {wieso muss das ein Record sein?}
    Port : array [1..8] of Byte;
  end;

private
  AChannel : Array of Array [1..2] of TChannel; {zwei Arrays á 8 Kanälen}
  FChannel : File of TChannel;


Kann ich mit FChannel jetzt immer noch Objekte von AChannel speichern (AChannel <> TChannel)?

Gruß
Christoph


Wolff68 - Mi 29.10.03 18:52

Ich glaube Dein Problem wird auch sein, daß Du nicht vorher weist wieviele Karten á 8 Kanäle vorhanden sind. Oder?

Das Problem bei dieser Methode ist, daß Du wohl eine beliebige Anzahl Sequenzen speichern kannst, diese aber immer genau die gleiche Anzahl bytes haben MUSS! (Ob nun 8, 16, 32, 33)
Hast Du eine Sequenz für 8 Kanäle gespeichert könntest Du sie nicht mit 16 Kanälen öffen, weil dann jeder 2. Schritt auf die 2. Karte käme.

Irgendwo sollte man also die Anzahl der Kanäle der Datei mitgeben. Am geeignetsten wäre hier meiner Meinung ein FileStream.
Ist bischen mehr Aufwand, aber dafür nicht so Starr.
In einem FileStream könnte man gleich am Anfang zB speichern wieviele Kanäle und Sequenzen beinhaltet sind, bevor die eigentlichen Nutzdaten kommen.

Ich könnte Dir auch dabei helfen, aber erst mal sollest Du Dir über die interne Struktur klar werden.
Hierzu ein paar Fragen:
- Du sagst je Hardware sind es 8 Kanäle bzw Ports. Oder willst Du das ebenfalls unterschiedlich?
- Willst Du den 3.Port der 2.Hardware eher als [2,3] oder als [11] ansprechen?
- Wie willst Du die Hardware nennen? Karte? Kanal? Oder ist das gleichbedeutend mit Port?


Ruditschka - Do 30.10.03 19:55

Moin!

Wolff68 hat folgendes geschrieben:
Ich glaube Dein Problem wird auch sein, daß Du nicht vorher weist wieviele Karten á 8 Kanäle vorhanden sind. Oder?

Ich weiß es schon (der Benutzer muss es in einer Art Optionen-Dialog eingeben.). Die Anzahl der Kanäle wird in der Registry gespeichert. Ich weiß eben nur nicht zur Entwurfszeit, wie viele Kanäle ich habe. Aus diesem Grund werden alle Fenster auch zur Laufzeit dynamisch erzeugt.

Wolff68 hat folgendes geschrieben:
Ich könnte Dir auch dabei helfen, aber erst mal sollest Du Dir über die interne Struktur klar werden.
Hierzu ein paar Fragen:
- Du sagst je Hardware sind es 8 Kanäle bzw Ports. Oder willst Du das ebenfalls unterschiedlich?
- Willst Du den 3.Port der 2.Hardware eher als [2,3] oder als [11] ansprechen?
- Wie willst Du die Hardware nennen? Karte? Kanal? Oder ist das gleichbedeutend mit Port?


Hierzu vielleicht ein paar Erklärungen zur Hardware:
An den Parallelport wird ein Interface LPT <--> I2C-Bus angeschlossen. An den I2C-Bus werden immer zwei Portexpander (8 Bit) angeschlossen. Der eine übernimmt eine Art Multiplexer-Funktion und der andere liefert den Digitalwert, der hinterher in ein analoges 0..10V-Signal umgesetzt wird.
Hierraus wird vielleicht klar, dass die Hardware immer in 8-Kanal-Schritten erweitert wird - aber nicht unbedingt in 8-Kanal-Schritten genutzt wird (der eine Benutzer will nur 10 Kanäle und der andere 14 Kanäle nutzen). Um nicht zu große und unübersichtliche Fenster mit Haufenweise unbenutzen Steuerlemente zu generieren, möchte ich gerne eine Lösung haben, die mit jeder Kanalzahl umgehen kann.

Der 3. Port der 2. Karte sollte Kanal 11 heißen. Damit lässt sich intern leichter hantieren (Kanalzahl = Tag des Steuerelements).

Kanal und Port sind bei mir in diesem Zusammenhang die gleichen Sachen (eben der einzelne Ausgangskanal / -port :wink: )

Beim Thema FileStream bin ich überhaupt nicht bewandert. Kennt jemand dazu ein gutes Tutorial?

Gruß
Christoph


focus - Fr 31.10.03 09:54

Um Platz zu sparen bzw den Datendurchsatz zu erhöhen würde ich vorschlagen ein packed record zu nehmen

Zu dem Tut:
http://www.tutorials.delphi-source.de/streams/

Gruss
Michael