Beispiel Machine mit Microsoft Expression Blend (VB)
Microsoft Expression Blend ist ein Programm zum Erstellen von Programmoberflächen für C# und Visual Basic. In diesem Beispiel wird eine, mit dem Programm erstellte Oberfläche mit dem Beispiel Machine verbunden und anschließend in den Vista Media Center eingebunden. Dabei wird die Programmiersprache Visual Basic verwendet.
Zielplattform
- Windows Vista
Implementierung
- Visual Basic
Erforderliche Software
- Microsoft .NET Framework Version 3.0
- Microsoft Expression Blend, mehr dazu hier
- Microsoft Visual Studio 2005
- Microsoft Windows Vista Media Center
- Microsoft Windows SDK für .Net Framework 3.0
- Microsoft Visual Studio 2005 extensions für .Net Framework 3.0 (November 2006 CTP)
- TwinCAT 2.10
- Notepad oder einen anderen Texteditor
Die ersten Schritte ...
Schritt für Schritt lernen Sie die Entwicklung eines Programms mit Microsoft Visual Studio und Microsoft Expression Blend und das Einbinden der TwinCAT ADS .NET Komponente anhand eines Beispiels kennen und binden dieses dann in den Vista Media Center ein.
1. Neues Projekt erstellen:
Starten Sie Microsoft Visual Studio und erstellen Sie ein neue XAML Browser Applikation. Dazu gehen Sie über das Menü unter 'File -> New -> Project...' . Das Dialogfeld 'New Project' öffnet sich. Zuerst wählen Sie den Projekt Typ aus: 'Project types -> Visual Basic -> Net Framework 3.0'. Rechts erscheinen dann die Templates des Projekt Typs. Dort wählen Sie 'XAML Browser Application'. Sie geben Ihrem Projekt jetzt noch einen Namen, in diesem Fall ist 'Machine' und legen die Location fest.

2. Bedienungsoberfläche erstellen
Wechseln Sie jetzt zu Microsoft Expression Blend, wo Sie Ihr eben erstelltes Projekt öffnen, um dort die Bedienoberfläche zu erstellen.

Im oberen linken Bereich sehen Sie die beiden Ausgänge, die auch auf den Busklemmen ausgegeben werden. Unten links ist die Variable abgebildet, welche die Werkstücke zählt. Rechts können Sie mit dem Feld 'Speed' die Taktgeschwindigkeit des Motors verändern. Die Anzeige 'Steps' entspricht der Anzahl der Takte, die auf den Ausgang 1 ausgegeben werden.
Wollen Sie, dass die Bedienoberfläche ständig ihre Größe anpassen, so kopieren Sie den obersten Grid und fügen dann anstelle des Grids eine Viewbox ein. In diese Viewbox fügen Sie nun den Grid ein. Jetzt müssen Sie nur noch die Größe der Seite, der Viewbox und des Grids auf 'Auto' setzen. Hierbei kann es zu einer Verschiebung von Elementen kommen. Diese müssen Sie dann erneut positionieren. Achten Sie dabei darauf, dass Sie die Größe der Seite, der Viewbox und des Grids nicht wieder festsetzen.
3. Referenz hinzufügen
Nach dem Erstellen der Oberfläche muss zuerst eine Referenz namens 'TwinCAT.Ads.dll' hinzugefügt werden. Dies kann sowohl in Visual Studio, als auch in Expression Blend erfolgen. In beiden Fällen geht man über das Menü unter 'Project --> Add Reference'.

4. Sicherheitsfreigabe
Gehen Sie im Menü unter 'Project -> <Name ihres Projektes> Properties....' .

Es öffnet sich nun ein Tab, in dem Sie die Projekteigenschaften festlegen können. Gehen Sie dort auf 'Security' und wählen Sie 'this is a full trust application' aus.

5. Quelltext bearbeiten
Nun kann mit dem Erstellen des Quelltextes in C# begonnen werden.
In die oberste Zeile des Quelltextes werden die benötigten Namespaces 'System.IO' und 'TwinCAT.Ads' eingefügt.
Imports System.IO
Imports TwinCAT.Ads
Danach folgen die Deklarationen.
Private hEngine As Integer
Private hDeviceUp As Integer
Private hDeviceDown As Integer
Private hSteps As Integer
Private hCount As Integer
Private hSwitchNotify As Integer
Private hSwitchWrite As Integer
Private tcClient As TwinCAT.Ads.TcAdsClient
Private dataStream As TwinCAT.Ads.AdsStream
Private binReader As System.IO.BinaryReader
Die erste Methode, ist die 'Load' Methode. In ihr werden Instanzen verschiedener Klassen erzeugt und eine Verbindung zum Port 801 hergestellt.
Private Sub Page1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
Try' Eine neue Instanz der Klasse AdsStream erzeugen
' Create a new instance of the AdsStream class
dataStream = New AdsStream(7)
' Eine neue Instanz der Klasse BinaryReader erzeugen
' Create a new instance of the BinaryReader class
binReader = New BinaryReader(dataStream)
' Eine neue Instanz der Klasse TcAdsClient erzeugen
' Create a new instance of the TcAdsClient class
tcClient = New TwinCAT.Ads.TcAdsClient()
' Verbinden mit lokaler SPS - Laufzeit 1 - Port 801
' Connecting to local PLC - Runtime 1 - Port 801
tcClient.Connect(801)
Catch
MessageBox.Show("Error while loading")
End Try
...
Dann werden in der Methode 'Load' die Variablen noch verbunden und mit einer Methode (die noch geschrieben werden muss) verknüpft, die bei einer Änderung einer Variable aufgerufen wird.
Try' Initialisieren der Überwachung der SPS-Variablen
' Initializing the monitoring of the PLC variables
hEngine = tcClient.AddDeviceNotification(".engine", dataStream, 0, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)
hDeviceUp = tcClient.AddDeviceNotification(".deviceUp", dataStream, 1, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)
hDeviceDown = tcClient.AddDeviceNotification(".deviceDown", dataStream, 2, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)
hSteps = tcClient.AddDeviceNotification(".steps", dataStream, 0, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)
hCount = tcClient.AddDeviceNotification(".count", dataStream, 4, 2, AdsTransMode.OnChange, 10, 0, DBNull.Value)
hSwitchNotify = tcClient.AddDeviceNotification(".switch", dataStream, 6, 1, AdsTransMode.OnChange, 10, 0, DBNull.Value)
' Holen des Handles von "switch" - wird für das Schreiben des Wertes benötigt
' Getting the handle for "switch" - needed for writing the value
hSwitchWrite = tcClient.CreateVariableHandle(".switch")
' Erstellen eines Events für Änderungen an den SPS-Variablen-Werten
' Creating an event for changes of the PLC variable valuesAddHandler tcClient.AdsNotification, AddressOf tcClient_OnNotification
Catch
MessageBox.Show("Error when connecting")
End Try
End Sub
6. Definition
SPS Variablen verbinden:
Zum Verbinden der Variablen wurde die Methode AddDeviceNotification verwendet.
public int AddDeviceNotification(string variableName, AdsStream dataStream, int offset, int length, AdsTransMode transMode, int cycleTime, int maxDelay, object userData);
- variableName: Name der SPS Variablen.
- dataStream: Der Datenstrom, der die Daten empfängt.
- offset: Abstand im Datenstrom.
- length: Länge im Datenstrom.
- transMode: Das Ereignis, wenn sich die Variable ändert.
- cycletime: Die Zeit (in ms) nach der der SPS-Server überprüft, ob sich die Variable geändert hat.
- maxDelay: Die Zeit (in ms) nach der das Ereignis spätestens beendet ist.
- userData: Das Objekt, das zum Ablegen bestimmter Daten verwendet werden kann.
Zum Verbinden der Variablen 'hSwitchWrite' wurde die Methode CreateVariableHandle verwendet.
int TcAdsClient.CreateVariableHandle(string variableName);
- variableName: Name der SPS-Variablen.
7. Methode schreiben:
Oben wurde bereits auf eine Methode verwiesen, die noch gar nicht existiert. Daher wird diese Methode, die 'tcClient_OnNotification' genannt wurde, als nächstes geschrieben. Diese Methode wird aufgerufen, wenn sich eine der SPS-Variable geändert hat.
'------------------------------------------------' wird bei Änderung einer SPS-Variablen aufgerufen' is activated when a PLC variable changes'------------------------------------------------Private Sub tcClient_OnNotification(ByVal sender As Object, ByVal e As AdsNotificationEventArgs)
Try' Setzen der Position von e.DataStream auf die des aktuellen benötigten Wertes
' Setting the position of e.DataStream to the position of the current needed value
e.DataStream.Position = e.Offset
' Ermittlung welche Variable sich geändert hat
' Detecting which variable has changedIf (e.NotificationHandle = hDeviceUp) Then'Die Farben der Grafiken entsprechened der Variablen anpassen
'Adapt colors of graphics according to the variablesIf (binReader.ReadBoolean() = True) Then
DeviceUp_LED.Foreground = New SolidColorBrush(Colors.Red)
Else
DeviceUp_LED.Foreground = New SolidColorBrush(Colors.White)
End If
ElseIf (e.NotificationHandle = hDeviceDown) Then
If (binReader.ReadBoolean() = True) Then
DeviceDown_LED.Foreground = New SolidColorBrush(Colors.Red)
Else
DeviceDown_LED.Foreground = New SolidColorBrush(Colors.White)
End If
ElseIf (e.NotificationHandle = hSteps) Then' Einstellen der ProgressBar auf den aktuellen Schritt
' Setting the ProgressBar to the current step
prgSteps.Value = (binReader.ReadByte() * 4)
ElseIf (e.NotificationHandle = hCount) Then' Anzeigen des "count"-Werts
' Displaying the "count" value
lblCount.Content = binReader.ReadUInt16().ToString()
ElseIf (e.NotificationHandle = hSwitchNotify) Then' Markieren des korrekten RadioButtons
' Checking the correct RadioButtonIf (binReader.ReadBoolean() = True) Then
optSpeedFast.IsChecked = TrueElse
optSpeedSlow.IsChecked = True
End If
End If
Catch
MessageBox.Show("Error")
End Try
End Sub
Es fehlen noch zwei Methoden, mit denen die Geschwindigkeit der Maschine eingestellt werden kann. In Ihnen wird ein virtueller Schalter umgelegt, hier wird ein Wert in die SPS-Variablen switch geschrieben.
'------------------------------------------------------' wird aufgerufen, wenn das Feld 'schnell' markiert wird' is activated when the 'fast' field is marked'------------------------------------------------------Private Sub optSpeedFast_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles optSpeedFast.Click
Try
tcClient.WriteAny(hSwitchWrite, True)
Catch
MessageBox.Show("Error")
End Try
End Sub'------------------------------------------------------' wird aufgerufen, wenn das Feld 'langsam' markiert wird' is activated when the 'slow' field is marked'------------------------------------------------------Private Sub optSpeedSlow_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles optSpeedSlow.Click
Try
tcClient.WriteAny(hSwitchWrite, False)
Catch
MessageBox.Show("Error")
End Try
End Sub
8. Notifications und Handles löschen:
In dem Close-Ereignis des Fensters werden die Verbindungen wieder mit der Methode DeleteDeviceNotification() freigegeben.
//------------------------------------------------------// wird beim Beenden des Programms aufgerufen// is activated when ending the program//------------------------------------------------------Private Sub Page1_Unloaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Unloaded
Try' Löschen der Notifications und Handles
' Deleting of the notifications and handles
tcClient.DeleteDeviceNotification(hEngine)
tcClient.DeleteDeviceNotification(hDeviceUp)
tcClient.DeleteDeviceNotification(hDeviceDown)
tcClient.DeleteDeviceNotification(hSteps)
tcClient.DeleteDeviceNotification(hCount)
tcClient.DeleteDeviceNotification(hSwitchNotify)
tcClient.DeleteVariableHandle(hSwitchWrite)
Catch
MessageBox.Show("Error")
End Try
tcClient.Dispose()
End Sub
Das SPS Maschinenprogramm Machine_Final.pro muss auf dem Laufzeitsystem 1 laufen und das Programm kann im Internet Explorer 7 getestet werden.
9. Einbinden in den Vista Media Center
Habe Sie ihr Projekt hinreichend getestet und keinen Fehler festgestellt, dann können Sie es nun in den Media Center einbinden.
Rufen Sie wieder in Visual Studio die Projekteigenschaften auf, jedoch gehen Sie dann auf 'Publish'. Dort klicken Sie dann auf 'Publish Now'. Es wird nun die xbap-Datei erstellt die Sie später im Media Center aufrufen. Diesen Schritt müssen Sie immer machen, wenn Sie ihr Programm verändert haben und die Änderung auch in den Media Center übernommen werden soll.

Gehen Sie jetzt in einen Texteditor, z.B. Notepad geben Sie folgendes ein:
<application
URL = "C:\Users\<User>\Documents\Visual Studio 2005\Projects\Machine\Machine\Publish\Machine.xbap">
</application>
Speichern Sie es unter: 'C:\Users\<User>\AppData\Roaming\Media Center Programs\Machine.mcl'. Wenn Sie nun Ihren Media Center starten finden Sie ihr Programm unter 'Online Media -> program library -> programs by name -> Machine'.
Dies ist die einfachste Form der Einbindung in den Windows Vista Media Center. Weitere Informationen zur Einbindung in den Media Center finden Sie hier.