Kommando programmieren mit VisualBasic.NET
Diesem Abschnitt enthält ein exemplarisches Vorgehen zur Programmierung eines Kommandos mit VisualBasic.NET.
Den vollständigen Quellcode des Projekt können Sie hier herunterladen.
Das Kommando "Auf ein Signal reagieren" der Schnittstelle CANBusChannel ermöglicht das Senden einer Botschaft in Reaktion auf ein empfangenes Signal mit einem bestimmten Signalwert. In diesem Beispiel soll demonstrieren, wie mit Hilfe eines VisualBasic.NET Kommandos zwei Botschaften als Reaktion auf ein Signal gesendet werden können.
Zur Entwicklung des VisualBasic-Kommandos verwenden wir Microsoft Visual Studio. Die hier beschriebene Vorgehensweise bezieht sich auf die Version 2008 der Entwicklungsumgebung.
Neues Visual Studio Projekt erstellen
Wir beginnen mit einem neuen Visual Studio Projekt. Dazu wählen wir in der Entwicklungsumgebung den Menüpunkt Datei - Neu - Projekt.
Im Auswahldialog muss rechts oben das .NET Framework 2.0 eingestellt werden. Als Projekttyp wählen wir Vislual Basic / Windows und Klassenbibliothek als Vorlage. Nach Eingabe eines geegneten Projektnamens und -verzeichnisses wird der Dialog mit OK bestätigt.
Referenzen hinzufügen
Wir erhalten ein fast leeres Projekt mit einer holen Klasse Class1.vb. Um auf die Gerätetreiber zuzugreifen, müssen wir die entsprechenden Treiberbibliotheken referenzieren. Dazu wählen wir den Menüpunkt Projekt - Referenz hinzufügen.
In dem Dialog wechseln wir auf der Registerkarte "Durchsuchen" in das Programmverzeichnis von PASwin (i.d.R. C:\Programme\Kostal\Pas). Dort finden wir die Dateien CompasCore.dll und CompasBaseLibrary.dll. Sie enthalten sämtliche Basisklassen von PASwin und sind zur Entwicklung von Kommandos und Treibern unbedingt erforderlich. Je nachdem welche Gerät wir ansprechen wollen, werden noch zusätzliche Biblitheken benötigt. In unserem Fall brauchen wir die Datei BusInterface.dll zur CAN- und LIN-Kommunikation.
Klassendefinition
Die bereits im Projekt enthaltenen Klasse Class1 sollte sinngemäß umbenannt werden. Wir ersetzen die Zeile
Public Class Class1
durch
Public Class MyCanCommand
Die Programmierung eines Kommandos besteht im wesentlichen aus der Implementation der generischen Schnittstelle Compas.ICommand(Of ) und der darin enthaltenen Methoden Program und Execute. Dabei ist wird als Argument der generischen Schnittstelle entsprechende Gerätebasisklasse angegeben. In unserem Fall benutzen wir die Geräteschnittstelle CanBusChannel und schreiben direkt unterhalb der Klassendefinition die Anweisung
Implements Compas.ICommand(Of Compas.Drivers.BusSystems.CanBusChannel)
Nach Eingabe der Zeile generiert die Entwicklungsumgebung automatisch die beiden notwendigen Methodenrümpfe für Program und Execute. Unsere Klasse sie jetzt so aus:
Public Class MyCanCommand
Implements Compas.ICommand(Of Compas.Drivers.BusSystems.CanBusChannel)
Public Function Execute(ByVal socket As Compas.Drivers.BusSystems.CanBusChannel, _
ByVal parameter As Compas.ICommandParameter, _
ByVal dataChannels As System.Collections.Generic.IDictionary(Of String, Object)) As Object _
Implements Compas.ICommand(Of Compas.Drivers.BusSystems.CanBusChannel).Execute
End Function
Public Function Program(ByRef parameter As Compas.ICommandParameter, _
ByVal dataChannels As System.Collections.Generic.IDictionary(Of String, Object)) As Boolean _
Implements Compas.ICommand(Of Compas.Drivers.BusSystems.CanBusChannel).Program
End Function
End
Class
Methode Program
Die Methode Program ist wird nur dann benötigt, wenn unser Kommando beim Einsatz in einem Prüfschritt zusätzliche Parameter benötigt. Das ist in diesem Beispiel nicht der Fall, Sodass wir die Methode mit einem simplen
Return True
ausfüllen.
Methode Execute
Sobald unser Kommando im Prüfablauf an der Reihe ist, ruft die Laufzeitumgebung von PAswin die Methode Execute auf. Dabei wird die in der Verdratungsliste zugeordnete Geräteschnittstelle als socket übergeben. In unserem Fall erhalten wir somit Zugriff auf den konfigurierten CAN-Bus. Sollten in der Methode Program zusätzliche Parameter definiert worden sein, werden diese hier als parameter übergeben. In diesem Beispiel wird davon kein Gebrauch gemacht. Mit dem dritten Aufrufparameter dataChannels erhalten wir eine Auflistung aller verwendeten Datenkanäle. So läßt sich zum Beispiel mit dem Ausdruck
dataChannels("Voltage")
auf den aktuelle Wert des Kanals namens "Voltage" zugreifen.
CAN-Message
Das bisher beschriebene Verfahren gilt für alle Geräteklassen gleichermaßen. Die nachfolgenden Angaben beziehen sich jetzt speziell auf das vorliegende Beispiel, bei dem zwei CAN-Botschaften in Reaktion auf ein bestimmtes Signal gesendet werden sollen. Dazu müssen wir zunächst festlegen, auf welche Botschaft das Kommando reagieren soll. Dabei gehen wir davon aus, dass unserer Schnittstelle eine entsprechende CANiX-Datei zugeordnet ist. Somit können wir die entsprechende Botschaft durch ihren Namen identifizieren. Dies geschieht durch den Befehl:
Dim HBF_A2 As Message = socket.NewMessage("HBF_A2")
Um auf eine Botschaft reagieren zu können, stellt der CAN-Treiber die Methode HandleMessage bereit. Durch das Kommando
socket.HandleMessage(HBF_A2, AddressOf HBF_A2_Received)
wird die Methode HBF_A2_Received immer dann aufgerufen, wenn die Bothschaft HBF_A2 empfangen wurde.
In der Methode HBF_A2_Received erfolgt dann die eigentliche Aktion.
Public
Sub HBF_A2_Received(ByVal canBusChannel As CanBusChannel, ByVal message As Message)
' Signale auslesen
Dim SHZ_HR_NS As Int32 = CType(message.Signals("SHZ_HR_NS").Value, Int32)
' In Abhängigkeit von Signalwert
If SHZ_HR_NS = 1 Then
' Zwei Botschaften definieren
Dim KLA_A1 As Message = canBusChannel.NewMessage("KLA_A1")
Dim KLA_A2 As Message = canBusChannel.NewMessage("KLA_A2")
'Signalwerte setzen
KLA_A1.Signals("LUEFTEN").Value = 1
KLA_A2.Signals("SHD_KLA").Value = 1
KLA_A2.Signals("FVL_KLA").Value = 1
' Botschaften senden
canBusChannel.TransmitMessage(KLA_A1)
canBusChannel.TransmitMessage(KLA_A2)
End If
End Sub
Aufgrund der klaren Objektstruktur versteht sich die Methode fast von selbst. Als Übergabeparameter bekommen wir einen Verweis auf die Bus-Schnittstelle und die empfangene Botschaft. Zunächst "wird beispielshaft geprüft, ob das Signal SHZ_HR_NS der empfangegen Botschaft den Wert 1 hat. In diesem Fall werden zwei Antwortbotschaften KLA_A1 und KLA_A2 erzeugt. Exemplarisch werden drei Signalwerte gesetzt, bevor die Boschaften gesendet werden.
Das ist schon alles. Den vollständigen Quellcode des Projekt können Sie hier herunterladen.
Kompilieren und Verwenden
Jetzt muss das Kommando nur noch kompiliert und in das PASwin-Projekt eingesetzt werden. Zum Kompilieren wählen sie in der Visual Studio Entwicklungsumgebung den Menüpunkt Erstelle - Erstelle Projekt.
Sollte beim Kompilieren eine Fehlermeldung erscheinen, haben Sie sich entweder vertippt oder evtl. eine Referenz vergessen. Kontrollieren Sie die einzelnen Schritte noch einmal genau.
Bei erfolgreicher Kompilation wird eine Datei CustomCanCommand.DLL im Unterordner Debug erstellt, die jetzt in einem PASwin-Projekt eingesetzt werden kann. Üblicherweise sollte das Kommando in der ersten Initialisierungsphase der Prüfung ausgeführt werden, um die gewünschte Reaktion einzurichten.
Nachdem im Prüfschritt für ein neues Kommando eine Schnittstelle der Klasse CanBusChannel ausgewählt wurde, gelangt ma mit der Symbolschaltfläche
in einen Dialog zur Einbindung des externen Kommandos.
Im Feld Bibliothek muss der Pfad zur kompilierten Anwendungsbibliothek eingegeben werden. Zu Durchsuchen kann die Schaltfläche rechts verwendet werden. Sodann bietet uns die Pickliste Klasse alle Klassen im Projekt an, die die Kommando-Schnittstelle implementieren. In userem Beispiel wälhen wir die zuvor programmierte Klasse PsaCan aus. Optional können auch die zugehörige Projektdatei angeben, bevor wir den Dialog mit Weiter bestätigen. Jetzt wird unsere Routine Program aufgerufen. Doch da unser Kommando keine weiteren Parameter benötigt, ist die Programmierung damit abgeschlossen.
Das Prüfpogramm kann jetzt ausgeführt werden. An der gewählten Stelle wird der VB-Prüfschritt ausgeführt.
Debugging
Das VB-Kommando läßt sich sogar während der Ausführung der Prüfung debuggen. Da wählt man in der Visual Studio Entwicklungsumgebung den Menüpunkt Projekt - Eigenschaften und wechselt auf die Registerkarte Debug. Dort stellt man als Startaktion den Aufruf des externen Programms Compas.EXE aus dem Programmverzeichnis von PASwin (i.d.R. C:\Programme\Kostal\Pas) aus. Jetzt kann man an einer beliebigen Stelle im VB-Code mit der Taste F9 einen Haltepunkt (Breakpoint) setzen. Wählt man anschließen den Menüpunkt Debug - Starten wird PASwin gestartet. Sobald die Zeile mit dem Breakpoint im Prüfprogramm erreicht wird, hält die Ausführung an und man kann den Code diagnostizieren.