Roulette Kesselgucken Direktmessung Schnittstelle in Visual
Basic 2012 und Excel von Selzer-McKenzie SelMcKenzie
Video: http://youtu.be/YMmZnGFs-5o
Author D.Selzer-McKenzie
Geht es um den Zugriff auf externe Geräte, wie Messgeräte , Scanner,
Digitalkameras, Webcams etc., bietet sich dem Programmierer mit der Microsoft
WIA-Library (Windows Image Acquisition Automation Layer) eine recht komfortable
Variante an, deren Vorteil unter anderem darin besteht, ohne viel Code
auszukommen.
Doch worum geht es eigentlich? Bei WIA handelt es sich um
eine komplexe Windows-COM-API,die
■ das
Auslesen von Messungen statischer Bilder von Scannern, digitalen Kameras,
WebCams,
■ das
Nachbearbeiten (Größe, Farbe,
Drehen ...),
das Kommentieren (Exif-Informationen)
■ und das
Konvertieren in diverse Dateiformate (PNG, JPG, GIF, BMP, TIFF)
ermöglicht.
HINWEIS: WIA steht dem Programmierer als COM-Komponente in
der Datei wiaaut.dll zur Verfügung.
Installation/Vorbereitung
Die Unterstützung beschränkt sich auf die Windows-Version XP
ab SP1 und alle später erschienenen Windows Versionen (Vista, 7, 8, Server
...).
Windows Vista/Windows 7/Windows 8
Die komplette und aktuelle WIA-Libary ist bereits auf Ihrem
System installiert, Sie können sofort loslegen, indem Sie die Microsoft Windows
Image Acquisition Library v2.0 in Ihr VB-Projekt einbinden.
Erstellen Sie dazu ein neues Projekt und fügen Sie die o.g.
Library über Projekt|Verweis
hinzufügen .
Windows XP
Hier ist noch etwas Nacharbeit angesagt, da sich auf Ihrem
System derzeit nur die Version 1.x befindet. Laden Sie zunächst die aktuelle
Version der WIA von der Microsoft-Webseite:
LINK:
http://www.microsoft.com/downloads/details.aspx?FamilyID=a332a77a-01b8-4de6-91c2-b7ea32537e29
Entpacken Sie die ZIP-Datei und kopieren Sie enthaltene Datei
wiaaut.dll in das \\Windows\System32-Verzeichnis.
Die neue Library registrieren Sie über Start/Ausführen:
Auf Grund der umfangreichen Möglichkeiten dieser Library
möchten wir Ihnen anhand einer Beispielanwendung einige wesentliche Features,
die für das Einlesen und Weiterverarbeiten
von Bildern unabdingbar sind, vorstellen:
■ Erkennen
der angeschlossenen Geräte/Gerätetypen
■ Auswerten
von Ereignissen (Anschließen/Trennen)
■ Anzeige
der Geräteeigenschaften
■ Einlesen
von Bildern
■ Verwendung
des Scan-Assistenten
■ Einsatz
des Druckassistenten
Auf dem Video sehen Sie die Messung von Gehirnströmen, live,
also ein durchaus kompliziertes Unterfangen, was aber ganz einfach und mit
wenig Code zu lösen ist. Natürlich können an die Schnittstelle auch alle
anderen möglichen Messgeräte angeschlossen werden.
Auf die serielle Schnittstelle zugreifen
Zahlreiche Mess- und Elektrogeräte1 sind auch heute noch mit
der klassischen seriellen Schnittstelle ausgestattet. In Verbindung mit dem zu
Visual Studio und Excel-VBA mitgelieferten SerialPort-Steuerelement können Sie
beliebige Programme schreiben, mit denen sich diese Geräte steuern lassen.
Um eine sinnvolle praktische Anwendung des
SerialPort-Controls mit geringstem Aufwand zu demonstrieren, verwenden wir hier
als Peripheriegerät ein Digitalvoltmeter (z.B. DT9602R) mit serieller
Schnittstelle2. Es dürfte aber auch jedes andere DVM mit serieller
Schnittstelle geeignet sein. Die Abbildung zeigt das DVM beim Messen einer
Batteriespannung, oben sieht man das Kabel, welches zum seriellen COM-Port des
PC führt
Der Quellcode:
Imports System.IO.Ports
Public Class Form1
Beim Laden des Formulars wird der Port geöffnet:
Private Sub Form1_Load(sender As Object, e As EventArgs)
Handles MyBase.Load
SerialPort1.Open()
End Sub
Messdaten sind eingetroffen:
Private Sub SerialPort1_DataReceived(sender As Object, e As
SerialDataReceivedEventArgs) _
Handles SerialPort1.DataReceived
Try
Dim count As Integer = SerialPort1.BytesToRead ' Anzahl
Bytes im Empfangspuffer
Um den Inhalt des Empfangspuffers komplett als Zeichenkette
auszulesen, könnte man die Read-Existing-Methode verwenden. Für die Übertragung
von Zahlenwerten (Messdaten etc.) ist es aber zweckdienlicher, wenn wir von der
Text- auf die Byte-Ebene hinabsteigen. Die im Folgenden vorgestellte Variante
benutzt die Read-Methode der SerialPort-Komponente, um eine bestimmte Anzahl
von Bytes aus dem Empfangspuffer in ein Byte-Array zur weiteren Verarbeitung
einzulesen:
Dim ba() As Byte
ReDim ba(count – 1)
SerialPort1.Read(ba, 0, count)
Es folgt das Aufsplitten des übergebenen Byte-Arrays in zwei
Strings (Messwert und Messbereich).
In unserem Beispiel entsteht ein String aus acht
ASCII-Zeichen. Dabei bilden die ersten fünf Zeichen den Messwert:
Dim data1 As String =
System.Text.Encoding.Default.GetString(ba, 0, 5)
Danach folgt ein Leerzeichen. Die letzten beiden Zeichen
verweisen auf den Messbereich:
Dim data2 As String =
System.Text.Encoding.Default.GetString(ba, 6, 2)
Zwecks Anzeige muss auf den UI-Thread umgeschaltet werden:
Label1.Invoke(displayDataPtr, data1, data2)
Warum so umständlich? Die Komponenten der
Benutzerschnittstelle (UI = User Interface) können nur von dem Thread aus
verändert werden, von dem sie erzeugt wurden. Der Empfang der seriellen Daten
läuft aber in einem anderen Thread ab. Als Lösung des Problems bietet sich ein Methodenzeiger
(Delegate) an, der über die Invoke-Methode der entsprechenden Komponente
(hier ein Label mit der Bezeichnung Label1) aufgerufen
wird1:
Private Delegate Sub displayDataDlg(dat1 As String, dat2 As
String)
Private displayDataPtr As displayDataDlg = AddressOf
displayData
Die Anzeigeroutine, auf welche das Delegate-Objekt
displayDataPtr verweist:
Private Sub displayData(d1 As String, d2 As String)
Messwert in Gleitkommazahl parsen:
Dim f As Single = Single.Parse(d1)
Messbereichsabhängige Umrechnung und Anzeige:
Select Case d2
Case "11" : Label1.Text = f / 1000 & "
V"
Case "21" : Label1.Text = f / 100 & "
V"
Case "41" : Label1.Text = f / 10 & "
mV"
Case Else : Label1.Text = String.Empty
End Select
End Sub
Beim Beenden des Programms sollte auch der Port wieder
geschlossen werden:
Private Sub Button1_Click(sender As Object, e As EventArgs)
Handles Button1.Click
SerialPort1.Close()
Me.Close()
End Sub
End Class
Verbinden Sie Ihr DVM über das im Zubehör enthaltene Kabel
mit der seriellen COM1-Schnittstelle des PC (andernfalls PortName-Eigenschaft
im Quellcode anpassen). Stellen Sie den Messbereichsschalter des DVM auf
Gleichspannung (VOLT DC) ein und aktivieren Sie die Übertragung per RS232
(siehe Bedienungsanleitung des DVM).
In Abhängigkeit von der Wandlungsrate des DVM (die des
DT9602R ist hier mit ca. 1/sek nicht sonderlich berauschend) sollte das
Programm nun kontinuierlich die aktuellen Messwerte anzeigen.
Gefahren für Mensch und Computer beim Experimentieren sind
so gut wie ausgeschlossen, da die RS232-Schnittstelle bei Messgeräten meist
über Optokoppler herausgeführt wird.
■ Falls
keine Unterlagen zum DVM verfügbar
sind: Um die Codierung der Messwerte und Messbereiche experimentell
herauszufinden, kann das in unserem Buch [Visual Basic 2012 Grundlagen und
Profiwissen] beschriebene Terminalprogramm benutzt werden (nicht vergessen:
Häkchen bei DTR setzen!). Durch einige Versuche mit
unterschiedlichen Spannungen lässt sich meist leicht feststellen, wie die
einzelnen ASCII-Zeichen zu interpretieren sind.
■ Für eine komplette Steuerung
(Modelleisenbahn1) eignet sich z.B. das preisgünstige PC-Messmodul M 232, es verfügt über 6 Analogeingänge
(10-Bit-Auflösung) sowie 8 digitale Ein-/Ausgänge. Davon kann ein Eingang als
Zählereingang für ein 16-Bit-Register benutzt werden.
■ Neuere PCs
verfügen zugunsten
zahlreicher USB-Ports meist nur noch über einen einzigen seriellen COM-Port.
Hier lassen sich mit Hilfe handelsüblicher USB zu SUB-D9-Adapter weitere serielle
Ports realisieren.
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.