PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sensorwert fortlaufend aktualisieren



zimtstern
16.01.2008, 16:07
Hallo!
Ich habe ein Problem mit der programmierung eines Sensors in Form eines Potentiometers. Dieser ist auf der Achse eines Motors angebracht. Mit Hilfe des Velleman K8055 Board kann ich den Wiederstand messen. Der Motor wird über den digitalen Ausgang angesteuert (Leistungstransistor) (ein/aus). Ein Relais, das ebenfalls an einem digitalen Ausgang angeschlossen ist, dient zur änderung der Richtung. Ich programmiere mit dem Programm Visual Basic 2005 Express Edition. Bei betätigung eines Buttons soll der Motor solange drehe, bis der Widerstand einen gewissen Wert hat und dann anhalten. Bei einer weiteren Betätigung soll das Programm merken, dass er in die andere richtung zurück drehen muss, bis der Widerstand wieder den Anfangswert hat. Da ich noch Neuling bin auf VB, klappt es natürlich nicht. Meine Programmcode dazu sieht so aus:

Private Sub Button2_Click(Byval...
a = ReadAnalogChannel(1)
If a > 130 Then
SetDigitalChannel(3) "Relais wird angezogen"
Sleep(1000)
SetDigitalChannel(4) "Motor beginnt zu drehen"
While a > 50
Dim a = ReadAnalogChannel(1) "Meiner Meinung nach wird der Wert a jetzt solange aktualisiert (neu deffiniert), bis er durch die Drehung des Motors unter 50 ist"
End While
ClearAllDigital() "Motor & Relais ausschalten"
End If

If a < 50 Then
Sleep(1000)
SetDigitalChannel(4) "Motor beginnt zu drehen (andere Richtung)"
While a < 130
Dim a = ReadAnalogChannel(1) "gleiche Idee wie vorher"
EndWhile
ClearAllDigital()
EndIf

End Sub

Das Problem liegt sicher in dieser While-Idee. Aber wie macht man das?

Grüsse
zimtstern

the_Ghost666
16.01.2008, 18:18
Wo ist denn genau dein Problem, also wie zeigt es sich?
Ich würde das DIM a aus der Whileschleife rausnehmen und davor einmal deklarieren. In der While Schleife dann nurnoch a=ReadAnalogChannel(1).
Ausserdem musst du einen Typen angeben, also z.B. Dim a as Integer.
Zuletzt kann es noch sein, dass sich durch diese Endlosschleife die Oberfläche aufhängt, weil das Hauptprogramm diese Schleife nie verlassen kann. Füge noch in der Schleife ein DoEvents() ein. Damit sollte dann ein Blockieren verhindert werden.

zimtstern
16.01.2008, 21:19
Besten Dank für die schnelle Antwort.

Das Problem äussert sich folgendermassen: Der Motor stellt bei erreichtem Widerstandswert nicht ab. Der Befehl ClearAllDigital() wird also nicht erreicht. Das Programm schafft es nicht aus der Schlaufe heraus. Das mit dem Aufhängen könnte gut sein. Was ist DoEvents() für eine Funktion? Die muss ich noch deklarieren.

the_Ghost666
17.01.2008, 12:24
Moin,
ok, du arbeitest ja mit der VB Express Version, die hat einen debugger. Du kannst in die While-Schleife einen Breakpoint setzen (eine der F Taste, ich glaube F9 oder so oder per Menüleiste). An dieser Stelle wird er immer anhalten und du kannst dann den Wert der Variablen betrachten, indem du die Variable markierst und mit Rechtsklick überwachen lässt.
Mh diese DoEvents hab ich noch vor 2 Monaten benutzt.. kommt noch aus VB6, aber ging auch in .Net, wird wahrscheinlich in einem anderen Namespace sein, den du erst importieren musst ("Imports System.Threading" als erste Zeile, noch vor class Form, ohne ") aber ich weiß gerade nicht aus welchem.. musst du mal googeln. Aber im Debugger sollte es auch ohne gehen.
Dann kannst du auf jeden Fall sehen, wie er die Variable ändert. Denk dran, dass der Motor weiterläuft, wenn du im Debugger bist, dh er könnte zum Endanschlag drehen, das könnte warm werden.
Bist du dir denn sicher, dass das Poti die Stellung mit dem Wert 130 erreicht? Oder dass du die Drehrichtung vertauscht hast, sodass das Poti runtergeregelt wird, aber der Rechner auf nen hohen Wert wartet? Vertausch mal die Reihenfolge und schau ob bei der entgegengesetzten Richtung das gleiche Problem auftritt, also wenn du die Reihenfolge der While-Schleifen änderst

the_Ghost666
17.01.2008, 12:40
Ich habs noch gefunden, schreib in die Erste Zeile, vor Class Form
"Imports My.Application"
Damit hast du den Namespace importiert und kannst nun einfach DoEvents schreiben. Wenn du das nicht tust, musst du jedes einzelne DoEvents so aufrufen:
"My.Application.DoEvents"