Dienstag, 26. März 2013

Roulette Kesselgucken Direktmessung Schnittstelle in Visual Basic 2012 und Excel von Selzer-McKenzie SelMcKenzie


Roulette Kesselgucken Direktmessung Schnittstelle in Visual Basic 2012 und Excel von Selzer-McKenzie SelMcKenzie


 

 

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.