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 SetLength(AChannel,1);
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 Port : array [1..8] of Byte; end;
private AChannel : Array of Array [1..2] of TChannel; 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!