| | Anzeige von Analogwerten : Analog
Aufgabe
Analoge Anzeigen von Werten der A-Ausgänge (EX bzw. Ey) der fischertechnik
Interfaces.
Das mit den Werten ist ja einfach : ft.Analogs(ftiAEX) bzw. ftiGetAnalog(0)
bei umFishEx. Aber wie kommt man zu einem Analoginstrument. Alternative 1 : Bild
besorgen, Zeiger drüber zaubern. Geht, meist sogar mit variabler Größe, aber
wie siehts aus mit unterschiedlicher Skalenteilung und Beschriftung ? Das wär
dann Alternative 2 : selber zeichnen. Und das wird hier gezeigt. Die Quellen
sind in AnaInstr.ZIP zu finden. Zusätzlich sind
noch FishFa50.ZIP oder umFish.ZIP
erforderlich.
Die ZeichenRoutine : ShowDisplay
Private Sub ShowDisplay(ByVal aWert As Single)
' --- Zeichnen eines Analoginstrumentes und
' Eintrag des aktuellen Meßwertes
Const kStrich = 5, lStrich = 8, anzStriche = 21 Const sWinkel = 1.05, iRadius = 75
Const zRadius = 40, zStrich = 48,
Const zBereich = 1000, zTeilung = 250
Dim dWinkel!, aWinkel!, sWert&, dText$
Dim a!, b!, c!, x!, y!, x1!, y1!, x2!, y2!, w!
Dim i&
picAnalog.Cls
picAnalog.Scale (-50, 100)-(50, 20)
' ---------- Minor Ticks ----------------------
aWinkel = sWinkel
dWinkel = sWinkel / (anzStriche - 1)
For i = 1 To anzStriche
x1 = Cos(aWinkel) * iRadius
y1 = Sin(aWinkel) * iRadius
x2 = x1 + Cos(aWinkel) * kStrich
y2 = y1 + Sin(aWinkel) * kStrich
picAnalog.Line (x1, y1)-(x2, y2)
aWinkel = aWinkel + dWinkel
Next i
' ------------ Major Ticks -----------------
aWinkel = sWinkel
sWert = zBereich
dWinkel = sWinkel / ((anzStriche - 1) / 5)
For i = 1 To (anzStriche - 1) / 5 + 1
x1 = Cos(aWinkel) * iRadius
y1 = Sin(aWinkel) * iRadius
x2 = x1 + Cos(aWinkel) * lStrich
y2 = y1 + Sin(aWinkel) * lStrich
picAnalog.Line (x1, y1)-(x2, y2)
picAnalog.CurrentX = x2 - 5
picAnalog.CurrentY = y2 + 10
picAnalog.Print sWert
aWinkel = aWinkel + dWinkel
sWert = sWert - zTeilung
Next i
' -------------- Analog Wert ------------------
aWinkel = sWinkel + ((zBereich - aWert) / zBereich) * sWinkel
x1 = Cos(aWinkel) * zRadius
y1 = Sin(aWinkel) * zRadius
x2 = x1 + Cos(aWinkel) * zStrich
y2 = y1 + Sin(aWinkel) * zStrich
' -------------- Digital Wert ------------------
picAnalog.Line (x1, y1)-(x2, y2), QBColor(12)
lblText.Caption = "AnalogWert : " & aWert
lblText.Left = 0 - lblText.Width / 2
lblText.Top = 32
End Sub
Auf anhieb und auch wenn man näher hinsieht, kein fischertechnik, aber viel
Schule, überall Sin/Cos. So schlimm ist es nun auch wieder nicht. Der Reihe
nach :
- Im ersten Teil werden Konstanten definiert, die im eigentlichen
Zeichenteil verwendet werden. Grund : die Konstanten können leichter
geändert werden (statt 5mal 123 suchen) außerdem können sie bei einer
späteren Erweiterung als Variablen herausgereicht werden.
kStrich/lStrich : Länge des kurzen/lange Skalenstrichs
anzStrich : Anzahl Skalenstriche
sWinkel : Skalenwinkel in Radiant (die Skala ist ein Kreissegment)
iRadius : innerer Radius der Skala
zRadius : innerer Radius des Zeigers
zStrich : Länge des Zeigers
zBereich : Anzeigebereich (größter Wert, Beginn bei 0)
zTeilung : Teilung der "Major Ticks" (der langen Striche)
dWinkel : Delta Winkel (Schritt von Skalenstrich zu -strich)
aWinkel : Anfangswinkel ( !! alle Winkel in Radiant : Pi = 180°)
sWert : Skalenwert
dText : Digitaler Anzeigewert als String.
- picAnalog.Cls
Das Instrument besteht aus einem (leeren) Picture Control (& lblText)
auf dem das Instrument gezeichnet wird, und zwar bei jedem neuen Wert neu.
- picAnalog.Scale
Festlegen des Zeichenmaßstabes. Es wird von einer Zeichenfläche 100x100
ausgegangen, deren untere 20 Einheiten abgeschnitten wurden. Die x-Werte
liegen im Bereich -50 ... +50, die y-Werte im Bereich +20 ... +100. Die
Werte der o.a. Konstanten beziehen sich auf diese Maßeinheiten. Die Größe
des Picture Controls ist dabei nicht von Bedeutung, man kann sich also sein
Instrument zurecht stutzen.
- Minor Ticks
Zuerst werden die kleinen Striche gezeichnet und zwar von rechts nach links
(weil die sin/cos-Werte dann leichter zu handhaben sind) einer nach dem
anderen. Und von innen nach außen, zuerst wird die Koordinate innen (x1/y1)
bestimmt und dann die äußere durch Addieren des Längenanteils.
Cos(aWinkel)*iRadius berechnet dabei den x-Wert der inneren Strichkoordinate
(bezogen wird sich dabei auf einen auf picAnalog gar nicht mehr
darstellbaren Punkt 0,0.
-
Major Ticks
Ist eigentlich das gleiche, nur länger, Jeder fünfte Skalenstrich wird
über"gemalt". Außerdem wird er beschriftet. Dazu werden die
Koordinaten für den nachfolgenden Print-Befehl mit CurrentX/CurrentY
gesetzt.
- Analog Wert
Zeichnen der Zeigerposition mit dem aktuellen Wert. Dazu wird erstmal der
Analogwert (aWert) in einen Winkel (Radiant) umgerechnet (prozentualer
Anteil von zBereich). Anschließend der Zeigerstrich (wie Skalenstrich, nur
rot).
- Digital Wert
Damit die Phantasie in Grenzen bleibt wird zusätzlich noch der aWert als
numerischer Wert im Label Control lblText angezeigt. Dabei wird lblText
"auf Mitte" geschoben.
Das wars mit ShowDisplay. Das Besorgen der anzuzeigenden Analogwerte macht
man mit links und in einer Endlosschleife (Abbruch : ESC-Taste) :
Die AnzeigeSchleife cmdAction
Private Sub cmdAction_Click()
' --------- Anzeige Meßwert von EX ------------
' Abbruch : ESC-Taste oder E1 = True
ft.AnalogScan = True
ft.OpenInterface "COM1"
cmdEnde.Enabled = False
cmdAction.Enabled = False
Do
ShowDisplay ft.Analogs(ftiAEY)
Loop Until ft.Finish(1)
ft.CloseInterface
ShowDisplay 0
cmdAction.Enabled = True
cmdEnde.Enabled = True
cmdEnde.SetFocus
End Sub
Dies ist die FishFa50.OCX Version, im ZIP-File ist auch eine umFishEx-Version
enthalten (Ersetzen ft. durch fti, ft.AnalogScan weglassen). Das Meiste ist zur
Verriegelung des Programms während des Betriebs der Abfrageschleife
erforderlich.
Mögliche Erweiterungen
Eher dringend :
picAnalog als Parameter von ShowDisplay (ByVal picanalog As PictureBox) um
beide A-Eingänge anzeigen zu können. Man muß dann auf der Form zwei
PictureBoxen plazieren.
Eher mühsam :
Anzeige der gemessenen Werte (Bereich 0 - 1024) in beliebigen Wertebereichen
z.B. 0 - 100° C. Dazu muß dann noch kräftig umgerechnet werden.
Eher was für Spezialisten :
Umwandlung in ein OCX-Control (siehe AnaOCX, Visual
Basic Lösung mit Umrechnen .... )
|