Beispiel Maschine mit Microsoft Visual Basic .NET
Microsoft Visual Studio 2005 ist eine Entwicklungsumgebung zur Erstellung von Visual Basic-Projekten. Anhand Anhand des Maschine Beispiels werden Sie das Einbinden der TwinCAT ADS .NET Komponente mit der Programmiersprache Visual Basic kennenlernen.
Erforderliche Software:
- Microsoft .NET Framework Version 2.0, mehr dazu unter http://msdn2.microsoft.com
- Microsoft Visual Studio 2005
- TwinCAT 2.10
Um das Visual Basic-Programm starten zu können, muss TwinCAT und das SPS-Programm aktiv sein. Ist auf Ihrem Rechner kein Microsoft Visual Studio 2005 installiert, müssen Sie das Microsoft .NET Framework Version 2.0 installieren. Dadurch werden die benötigten DLL's auf Ihrem System eingerichtet.
Die ersten Schritte...
Die Entwicklung eines Visual Basic-Programms und das Einbinden der TwinCAT ADS .NET Komponente wird in den folgenden Schritten beschrieben.
1. Neues Projekt erstellen:
Starten des Visual Studio 2005 und Erstellen eines neues Projekts über Menü -> File -> New -> Project. Im Dialogfeld 'New Project' kann eine neues Projekt auf Basis verschiedener Vorlagen erstellt werden. Wählen Sie unter 'Project Types' die Programmiersprache ' Visual Basic' und unter den Vorlagen 'Windows Application'. Geben Sie Ihrem Projekt ein neuen Namen, in diesem Fall bitte den Namen 'Machine' eingeben. Wählen Sie dann unter 'Location' den Verzeichnispfad in dem Sie ihr Arbeitsprojekt erstellen wollen.

2. Bedienungsoberfläche erstellen
Hierzu wird zuerst eine Oberfläche in dem Design Modus der Form 'frmMachine' mit Hilfe der Toolbox erstellt. Die Einstellungen der verschiedenen Controls (wie z.B. 10 Labels, 2 Radiobuttons, 1 Progressbar, 1 PictureBox , GroupBox...) können Sie im Properties Window des Visual Studio einsehen und einstellen.

Im oberen linken Bereich sehen Sie die beiden Ausgänge, die auch auf die 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.
3. Referenz hinzufügen
Hier muss zuerst eine Referenz namens TwinCAT.Ads.dll hinzugefügt werden. Die TwinCAT ADS .NET Komponente wird über das Menü -> Project -> Add Reference eingebunden.
4. Quelltext bearbeiten
Nach dem Erstellen der Oberfläche und das Einbinden der TwinCAT ADS Komponente kann zum Visual Basic Quelltext gewechselt werden. In die oberste Zeilen des Quelltextes werden die benötigten Namespaces 'System.IO' und 'TwinCAT.Ads' eingefügt.
Imports System.IO
Imports TwinCAT.Ads
Danach folgen die Deklarationen innerhalb der Klasse frmMachine.
Private tcClient As TwinCAT.Ads.TcAdsClient
Private dataStream As TwinCAT.Ads.AdsStream
Private binReader As System.IO.BinaryReader
Private hEngine As IntegerPrivate hDeviceUp As IntegerPrivate hDeviceDown As IntegerPrivate hSteps As IntegerPrivate hCount As IntegerPrivate hSwitchNotify As IntegerPrivate hSwitchWrite As Integer
Die Methode 'frmMachine_Load' wird beim Aufruf der 'Windows Application' gestartet. Diese Methode wird durch Verknüpfung des Event 'Load' der Form mit der Methode im Properties Fenster verbunden. In ihr werden Instanzen verschiedener Klassen erzeugt und eine Verbindung mit Laufzeitsystem 1 der Komponente TwinCAT.Ads über den Port 801 hergestellt.
'-----------------------------------------------------
'Wird als erstes beim Starten des Programms aufgerufen
'Is activated first when the program is started
'-----------------------------------------------------
Private Sub frmMachine_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
' Eine neue Instanz der Klasse AdsStream erzeugen
dataStream = New AdsStream(7)
' Eine neue Instanz der Klasse BinaryReader erzeugen
binReader = New BinaryReader(dataStream)
' Eine neue Instanz der Klasse TcAdsClient erzeugen
tcClient = New TwinCAT.Ads.TcAdsClient()
' Verbinden mit lokaler SPS - Laufzeit 1 - Port 801
tcClient.Connect(801)
Catch ex As Exception
MessageBox.Show("Fehler beim Laden")
End Try
'...
SPS Variablen verbinden:
In dem frmMachine_Load-Ereignis der Form wird mit der Methode TcAdsClient.AddDeviceNotification()eine Verbindung zu jeder Variablen in der SPS erzeugt. Das Handle dieser Verbindung wird in einem Array gespeichert. Der Parameter TransMode spezifiziert die Art des Datenaustausches. In diesem Fall wird mit AdsTransMode.OnChange festgelegt, dass die SPS-Variable nur übermittelt wird falls sich der Wert in der SPS geändert hat (siehe AdsTransMode ). Der Parameter cycleTime bestimmt, wie oft die PLC prüfen soll, ob sich die entsprechende Variable geändert hat. Dann werden die Variablen mit der Methode 'tcClient_OnNotification' (siehe "Methode 'tcClient_OnNotifiaction' schreiben") verbunden, die bei einer Änderung einer Variablen 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, 3, 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 values
AddHandler tcClient.AdsNotification, AddressOf tcClient_OnNotification
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Zum Verbinden der Variablen wurde die Methode 'AddDeviceNotification()' verwendet.
Public Function AddDeviceNotification(ByVal variableName as String, ByVal dataStream as TwinCAT.Ads.AdsStream,
ByVal offset As Integer, ByVal length As Integer, ByVal transMode As TwinCAT.Ads.AdsTransMode,
ByVal cycleTime As Integer, ByVal maxDelay As Integer, ByVal userData As Object)
As Integer
- variableName: Name der SPS Variablen.
- dataStream: Der Datenstrom, der die Daten empfängt.
- offset: Abstand der Daten im Stream.
- length: Länge der Daten im Stream.
- 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 Variable 'hSwitchWrite' wurde die Methode 'CreateVariableHandle' verwendet.
Public Function CreateVariableHandle(ByVal variableName As String) As Integer
- variableName: Name der SPS Variablen.
Methode 'tcClient_OnNotification' schreiben:
Diese Methode wird aufgerufen, wenn sich eine der SPS-Variablen geändert hat.
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 changed
If e.NotificationHandle = hDeviceUp Then
'Die Farben der Grafiken entsprechened der Variablen anpassen
'Adapt colors of graphics according to the variables
If binReader.ReadBoolean() = True Then
DeviceUp_LED.ForeColor = Color.Red
Else
DeviceUp_LED.ForeColor = Color.White
End If
ElseIf e.NotificationHandle = hDeviceDown Then
If binReader.ReadBoolean() = True Then
DeviceDown_LED.ForeColor = Color.Red
Else
DeviceDown_LED.ForeColor = Color.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()
ElseIf e.NotificationHandle = hCount Then
' Anzeigen des "count"-Werts
' Displaying the "count" value
lblCount.Text = binReader.ReadUInt16().ToString()
ElseIf e.NotificationHandle = hSwitchNotify Then
' Markieren des korrekten RadioButtons
' Checking the correct RadioButton
If binReader.ReadBoolean() = True Then
optSpeedFast.Checked = True
Else
optSpeedSlow.Checked = True
End If
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Es fehlen noch zwei Methoden, mit denen die Maschine schneller oder langsamer fährt. In Ihnen wird ein virtueller Schalter umgelegt, hier wird ein Wert in die SPS-Variable switch geschrieben.
' Schreiben des Wertes von "switch"
' Writing the value of "switch"
'------------------------------------------------------
'wird aufgerufen, wenn das Feld 'fast' markiert wird
'is activated when the 'fast' field is marked
'------------------------------------------------------
Private Sub optSpeedFast_Click(ByVal sender As Object, ByVal e As EventArgs) Handles optSpeedFast.Click
Try
' Schreiben des Wertes von "switch"
' Writing the value of "switch"
tcClient.WriteAny(hSwitchWrite, True)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
'------------------------------------------------------
'wird aufgerufen, wenn das Feld 'slow' markiert wird
'is activated when the 'slow' field is marked
'------------------------------------------------------
Private Sub optSpeedSlow_Click(ByVal sender As Object, ByVal e As EventArgs) Handles optSpeedSlow.Click
Try
tcClient.WriteAny(hSwitchWrite, False)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Damit die Methoden 'optSpeedFast_Click' und 'optSpeedSlow_Click' beim richtigen Ereignis aufgerufen werden, muss der Radiobutton 'optSpeedFast' in der Design Ansicht markiert werden, im Properties Window bei Events auf 'Click' geklickt und dann die Methode 'optSpeedFast_Click' gewählt werden. Gleiches gilt für den RadioButton 'optSpeedSlow' mit der Methode 'optSpeedSlow_Click'.
Notifications und Handles löschen:
In dem frmMachine_FormClosing-Ereignis der Form werden die Verbindungen wieder mit der Methode DeleteDeviceNotification() freigegeben.
'------------------------------------------
'wird beim Beenden des Programms aufgerufen
'is activated when ending the program
'------------------------------------------
Private Sub frmMachine_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
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 ex As Exception
MessageBox.Show(ex.Message)
End Try
tcClient.Dispose()
End Sub
Das SPS Programm Machine_Final.pro auf dem Laufzeitsystem 1 starten und danach kann das erstellte VisualBasic-Programm Machine.exe gestarten werden.