Forum: PC-Programmierung Visual Basic 6 - Hilfe!


von Joh! (Gast)


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)
1
Dim Sollminwert(16)
2
Dim SollMaxwert(16)
3
Sensor(0).Caption = "2"   'Simulierter Fehler
4
5
  Sollminwert(0) = GetINISetting("C:\settings.ini", "Min_Values", "KraftstofffüllstandDiesel", 0)
6
  Sollminwert(1) = GetINISetting("C:\settings.ini", "Min_Values", "KraftstofffüllstandPÖl", 0)
7
  Sollminwert(2) = GetINISetting("C:\settings.ini", "Min_Values", "Wasserstand Kühlkreislauf", 0)
8
  Sollminwert(3) = GetINISetting("C:\settings.ini", "Min_Values", "Öldruck", 0)
9
  Sollminwert(4) = GetINISetting("C:\settings.ini", "Min_Values", "Wasserpumpe-1", 0)
10
  Sollminwert(5) = GetINISetting("C:\settings.ini", "Min_Values", "Wasserpumpe-2", 0)
11
  Sollminwert(6) = GetINISetting("C:\settings.ini", "Min_Values", "Kraftstoff-MagnetventilDiesel", 0)
12
  Sollminwert(7) = GetINISetting("C:\settings.ini", "Min_Values", "Kraftstoff-MagnetventilPöl", 0)
13
  Sollminwert(8) = GetINISetting("C:\settings.ini", "Min_Values", "Hauptkraftstoff-Magnetventil", 0)
14
  Sollminwert(9) = GetINISetting("C:\settings.ini", "Min_Values", "SchützDrehstromgenerator", 0)
15
  Sollminwert(10) = GetINISetting("C:\settings.ini", "Min_Values", "DrehzahlDieselmotor", 0)
16
  Sollminwert(11) = GetINISetting("C:\settings.ini", "Min_Values", "TemperaturVorlauf", 0)
17
  Sollminwert(12) = GetINISetting("C:\settings.ini", "Min_Values", "TemperaturRücklauf", 0)
18
  Sollminwert(13) = GetINISetting("C:\settings.ini", "Min_Values", "Abgastemperatur", 0)
19
  Sollminwert(14) = GetINISetting("C:\settings.ini", "Min_Values", "Außentemperatur", 0)
20
  Sollminwert(15) = GetINISetting("C:\settings.ini", "Min_Values", "Raumtemperatur", 0)
21
  
22
  SollMaxwert(0) = GetINISetting("C:\settings.ini", "Max_Values", "KraftstofffüllstandDiesel", 0)
23
  SollMaxwert(1) = GetINISetting("C:\settings.ini", "Max_Values", "KraftstofffüllstandPÖl", 0)
24
  SollMaxwert(2) = GetINISetting("C:\settings.ini", "Max_Values", "Wasserstand Kühlkreislauf", 0)
25
  SollMaxwert(3) = GetINISetting("C:\settings.ini", "Max_Values", "Öldruck", 0)
26
  SollMaxwert(4) = GetINISetting("C:\settings.ini", "Max_Values", "Wasserpumpe-1", 0)
27
  SollMaxwert(5) = GetINISetting("C:\settings.ini", "Max_Values", "Wasserpumpe-2", 0)
28
  SollMaxwert(6) = GetINISetting("C:\settings.ini", "Max_Values", "Kraftstoff-MagnetventilDiesel", 0)
29
  SollMaxwert(7) = GetINISetting("C:\settings.ini", "Max_Values", "Kraftstoff-MagnetventilPöl", 0)
30
  SollMaxwert(8) = GetINISetting("C:\settings.ini", "Max_Values", "Hauptkraftstoff-Magnetventil", 0)
31
  SollMaxwert(9) = GetINISetting("C:\settings.ini", "Max_Values", "SchützDrehstromgenerator", 0)
32
  SollMaxwert(10) = GetINISetting("C:\settings.ini", "Max_Values", "DrehzahlDieselmotor", 0)
33
  SollMaxwert(11) = GetINISetting("C:\settings.ini", "Max_Values", "TemperaturVorlauf", 0)
34
  SollMaxwert(12) = GetINISetting("C:\settings.ini", "Max_Values", "TemperaturRücklauf", 0)
35
  SollMaxwert(13) = GetINISetting("C:\settings.ini", "Max_Values", "Abgastemperatur", 0)
36
  SollMaxwert(14) = GetINISetting("C:\settings.ini", "Max_Values", "Außentemperatur", 0)
37
  SollMaxwert(15) = GetINISetting("C:\settings.ini", "Max_Values", "Raumtemperatur", 0)
38
  
39
  Dim Fehler(20) As Variant
40
    'MsgBox (SollMaxwert(0))
41
  'Vergleichen, ob Min-/Max-Sollwerte mit Istwerten (Labels Messwerte) übereinstimmen
42
  Dim y As Byte
43
  
44
  Dim iZaehl As Variant
45
  y = 0
46
  iZaehl = 0
47
  For iZaehl = 0 To 16
48
  
49
50
    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
51
      y = y + 1
52
      Fehler(y) = iZaehl                                      'Soll die Fehler in eine Array (globale Var.) schreiben, die später im FehlerForm ausgewertet und in die Listbox geschrieben wird
53
      'MsgBox ("Fehler bei " & iZaehl)
54
      Debug.Print Fehler(y)
55
      
56
    End If
57
        
58
  Next iZaehl
59
    
60
  'For i = 0 To UBound(Fehler)
61
  '  MsgBox Fehler(i)
62
  'Next i
63
64
End Sub





Vielen Dank!

von Thomas H. (pcexperte) Benutzerseite


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

von Karl H. (kbuchegg)


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!
1
      Debug.Print Fehler(y)
2
      Debug.Print iZaehl, Sensor(iZaehl).Caption, Sollminwert(iZaehl), SollMaxwert(iZaehl)
(keine Ahnung, ob die Syntax so stimmt)

von Markus H. (cairol)


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.

von Sven P. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.