AnaInstrument

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

Anzeige von Analogwerten : Analog

AnalogInstrument 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 :

  1. 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.
  2. picAnalog.Cls
    Das Instrument besteht aus einem (leeren) Picture Control (& lblText) auf dem das Instrument gezeichnet wird, und zwar bei jedem neuen Wert neu.
  3. 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.
  4. 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.
  5. 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.
  6. 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).
  7. 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 .... )