www.mikrocontroller.net

Forum: PC-Programmierung Visual Basic 6 - Hilfe!


Autor: Joh! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leute!

Ich bin hier fast am verzweifeln. Seit über  einer Stunde sitz ich hier 
und komme auf keinen grünen Zweig.

Zum Programm:

Ich speichere in einer Array die Werte einer ausgelesenen INI-Datei. In 
der INI-Datei gibt es die Gruppe "Min_Value" und "Max_Value". Min_Value 
beschreibt den Minimalwert, den die Sensor(0).caption nicht 
UNTERschreiten soll, Max_Value beschreibt den Maximalwert, den die 
Sensor(0).Caption nicht ÜBERschreiten darf.
Mit einer For-Schleife überprüfe ich dies mit einer if-Anweisung (Wenn 
Sensor(0).Caption < Min_Value ODER Sensor(0).Caption > Max_Value) DANN 
soll er die jeweilige Array-Index in die Array "Fehler" speichern. Da 
die Messwerte alle konstant sind, kann ich von der Array-Index ableiten, 
welcher Messwert einen Fehler verursacht hat.
Beispiel: Programm meldet Fehler-3, so weiß ich, dass die Ursache hinter 
dem 3. Messwert der INI-Datei liegt.

Leider bringt er aber nicht das gezielte Ergebnis, sprich, ich weiß 
nicht warum das Programm falsch entscheidet, ob die Sensor.Caption einen 
Wert unter- oder überschritten hat.

Könnt ihr mir helfen?
(Sorry für die C-Formatierung)
Dim Sollminwert(16)
Dim SollMaxwert(16)
Sensor(0).Caption = "2"   'Simulierter Fehler

  Sollminwert(0) = GetINISetting("C:\settings.ini", "Min_Values", "KraftstofffüllstandDiesel", 0)
  Sollminwert(1) = GetINISetting("C:\settings.ini", "Min_Values", "KraftstofffüllstandPÖl", 0)
  Sollminwert(2) = GetINISetting("C:\settings.ini", "Min_Values", "Wasserstand Kühlkreislauf", 0)
  Sollminwert(3) = GetINISetting("C:\settings.ini", "Min_Values", "Öldruck", 0)
  Sollminwert(4) = GetINISetting("C:\settings.ini", "Min_Values", "Wasserpumpe-1", 0)
  Sollminwert(5) = GetINISetting("C:\settings.ini", "Min_Values", "Wasserpumpe-2", 0)
  Sollminwert(6) = GetINISetting("C:\settings.ini", "Min_Values", "Kraftstoff-MagnetventilDiesel", 0)
  Sollminwert(7) = GetINISetting("C:\settings.ini", "Min_Values", "Kraftstoff-MagnetventilPöl", 0)
  Sollminwert(8) = GetINISetting("C:\settings.ini", "Min_Values", "Hauptkraftstoff-Magnetventil", 0)
  Sollminwert(9) = GetINISetting("C:\settings.ini", "Min_Values", "SchützDrehstromgenerator", 0)
  Sollminwert(10) = GetINISetting("C:\settings.ini", "Min_Values", "DrehzahlDieselmotor", 0)
  Sollminwert(11) = GetINISetting("C:\settings.ini", "Min_Values", "TemperaturVorlauf", 0)
  Sollminwert(12) = GetINISetting("C:\settings.ini", "Min_Values", "TemperaturRücklauf", 0)
  Sollminwert(13) = GetINISetting("C:\settings.ini", "Min_Values", "Abgastemperatur", 0)
  Sollminwert(14) = GetINISetting("C:\settings.ini", "Min_Values", "Außentemperatur", 0)
  Sollminwert(15) = GetINISetting("C:\settings.ini", "Min_Values", "Raumtemperatur", 0)
  
  SollMaxwert(0) = GetINISetting("C:\settings.ini", "Max_Values", "KraftstofffüllstandDiesel", 0)
  SollMaxwert(1) = GetINISetting("C:\settings.ini", "Max_Values", "KraftstofffüllstandPÖl", 0)
  SollMaxwert(2) = GetINISetting("C:\settings.ini", "Max_Values", "Wasserstand Kühlkreislauf", 0)
  SollMaxwert(3) = GetINISetting("C:\settings.ini", "Max_Values", "Öldruck", 0)
  SollMaxwert(4) = GetINISetting("C:\settings.ini", "Max_Values", "Wasserpumpe-1", 0)
  SollMaxwert(5) = GetINISetting("C:\settings.ini", "Max_Values", "Wasserpumpe-2", 0)
  SollMaxwert(6) = GetINISetting("C:\settings.ini", "Max_Values", "Kraftstoff-MagnetventilDiesel", 0)
  SollMaxwert(7) = GetINISetting("C:\settings.ini", "Max_Values", "Kraftstoff-MagnetventilPöl", 0)
  SollMaxwert(8) = GetINISetting("C:\settings.ini", "Max_Values", "Hauptkraftstoff-Magnetventil", 0)
  SollMaxwert(9) = GetINISetting("C:\settings.ini", "Max_Values", "SchützDrehstromgenerator", 0)
  SollMaxwert(10) = GetINISetting("C:\settings.ini", "Max_Values", "DrehzahlDieselmotor", 0)
  SollMaxwert(11) = GetINISetting("C:\settings.ini", "Max_Values", "TemperaturVorlauf", 0)
  SollMaxwert(12) = GetINISetting("C:\settings.ini", "Max_Values", "TemperaturRücklauf", 0)
  SollMaxwert(13) = GetINISetting("C:\settings.ini", "Max_Values", "Abgastemperatur", 0)
  SollMaxwert(14) = GetINISetting("C:\settings.ini", "Max_Values", "Außentemperatur", 0)
  SollMaxwert(15) = GetINISetting("C:\settings.ini", "Max_Values", "Raumtemperatur", 0)
  
  Dim Fehler(20) As Variant
    'MsgBox (SollMaxwert(0))
  'Vergleichen, ob Min-/Max-Sollwerte mit Istwerten (Labels Messwerte) übereinstimmen
  Dim y As Byte
  
  Dim iZaehl As Variant
  y = 0
  iZaehl = 0
  For iZaehl = 0 To 16
  

    If (Sensor(iZaehl).Caption < Sollminwert(iZaehl)) Or (Sensor(iZaehl).Caption > SollMaxwert(iZaehl)) Then        'Wenn der Labelcaption kleiner Min- und größer Max-Wert ist, soll er eine msg box bringen
      y = y + 1
      Fehler(y) = iZaehl                                      'Soll die Fehler in eine Array (globale Var.) schreiben, die später im FehlerForm ausgewertet und in die Listbox geschrieben wird
      'MsgBox ("Fehler bei " & iZaehl)
      Debug.Print Fehler(y)
      
    End If
        
  Next iZaehl
    
  'For i = 0 To UBound(Fehler)
  '  MsgBox Fehler(i)
  'Next i

End Sub
 





Vielen Dank!

Autor: Thomas H. (pcexperte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne es getestet zu haben würde ich folgendes mal versuchen:

Dim Sollminwert(16) as double
Dim SollMaxwert(16) as double

und

If Cdbl(Sensor(iZaehl).Caption) < Sollminwert(iZaehl) Or 
Cdbl(Sensor(iZaehl).Caption) > SollMaxwert(iZaehl) Then


Gruß
Thomas

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joh! wrote:

> Leider bringt er aber nicht das gezielte Ergebnis, sprich, ich weiß
> nicht warum das Programm falsch entscheidet, ob die Sensor.Caption einen
> Wert unter- oder überschritten hat.

Tja, da würde ich mir doch mal alle Sensor.Caption Werte ausgeben 
lassen, zusammen mit den eingestellten Min und Max Werten für diesen 
Sensor.

Oft sucht man ein algorithmisches Problem und hinterher stellt sich 
heraus, dass die Eingangsdaten schon Schrott sind. Also heißt es erst 
mal sicherstellen, dass die Werte stimmen.


>      Debug.Print Fehler(y)

Das ist zum Debuggen zwar schon mal ein Anfang. Aber im Grunde ist es 
auch nicht besser als die Fehlermeldung mit der Microsoft Legionen von 
Programmiereren zur Verzweiflung getrieben hat:
  Eine DLL konnte nicht geladen werden
Schön, aber WELCHE und WARUM NICHT!
      Debug.Print Fehler(y)
      Debug.Print iZaehl, Sensor(iZaehl).Caption, Sollminwert(iZaehl), SollMaxwert(iZaehl)
(keine Ahnung, ob die Syntax so stimmt)

Autor: Markus H. (cairol)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast doch eine schöne Programmier-Umgebung mit Debug-Tools:
Setz doch einen Break-Point vor der ersten Zeile die du oben gepsostet 
hast und geh mit "F8" Schritt für Schritt durch - dann kannst du ja 
nachdem die Zuweisungen abgearbeitet wurden genau sehen, welche Werte 
die beiden Arrays "sollminwert" und "SollMaxwert" haben.
Am besten mal ne "Überwachung" für die beiden Arrays einschalten und 
dann die Feld-Werte durchsehen.

Du hast den obigen Code ja gekürzt oder für die Fehlersuche geändert.
Wo/wie weist du den Captions im vollständigen Code die Messwerte zu? 
Wenn du das da machst, wo du deinen "Simulierten Fehler" eingefügt hast, 
kann es nicht klappen. Aber wenn es schon bei dem "Simulierten Fehler" 
nicht klappt, ist wohl wirklich mit dem Abholen der Daten aus der INI 
was faul.

Mit dem Datentyp "Variant" zu arbeiten ist übrigens eine Unsitte. Den 
sollte man nur ganz geziehlt für bestimmte Operationen verwenden, denn 
eine Zuweisung zu "Variant" frisst alles - egal wie die Daten aussehen.
Wenn man einen spezifischen Typ hernimmt, und die Zuweisung ohne Fehler 
vom Compiler funktiniert, hat man schonmal eine grundlegende Sicherheit 
vor ankommendem Datenschrott.

Zusammen mit einer vernünftigen Deklaration der Variablen und Umwandlung 
der Strings in Doubles (wie Thomas das oben ja gezeigt hat), solltest du 
schnell rausfinden können, ob die Daten wirklich sauber aus der Datei 
gelesen werden.

PS:
Noch ein kleiner Hinweis zur Dimensionierung von Arrays:
Bei VB6 gibt man bei dem Befehl "Dim Sollminwert(XX)" für XX NICHT die 
Länge des Arrays an (also nicht die Anzahl der Feldelemente), sondern 
die Zahl bezeichnet den höchsten Index des Arrays. (das ist in C halt 
anders als in VB6)
D.h. mit "Dim Sollminwert(16)" hast du nicht 16, sondern 17 Feld-Plätze!
Der Index läuft dann von 0 bis 16.
Bei dir bleibt also der letzte Array-Platz ungenutzt.
Das hat nichts mit dem Fehler zu tun, aber es ist auf jeden Fall gut zu 
wissen.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus H. schrieb:
> Noch ein kleiner Hinweis zur Dimensionierung von Arrays:
> Bei VB6 gibt man bei dem Befehl "Dim Sollminwert(XX)" für XX NICHT die
> Länge des Arrays an (also nicht die Anzahl der Feldelemente), sondern
> die Zahl bezeichnet den höchsten Index des Arrays. (das ist in C halt
> anders als in VB6)
> D.h. mit "Dim Sollminwert(16)" hast du nicht 16, sondern 17 Feld-Plätze!
> Der Index läuft dann von 0 bis 16.
Wenn dir das nicht passt, gabs ganz früher mal 'Option Base 1', damit 
konnte man den Feldindex mit 1 beginnen.

Und dann sollte man bei Bedarf noch an 'Redim PRESERVE' denken.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.