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.

Beispiel Maschine mit Microsoft Visual Basic .NET 1:

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.

Beispiel Maschine mit Microsoft Visual Basic .NET 2:

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

Zum Verbinden der Variable 'hSwitchWrite' wurde die Methode 'CreateVariableHandle' verwendet.

Public Function CreateVariableHandle(ByVal variableName As String) As Integer

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.

Download Visual Basic Beispiel:

Visual Basic Beispiel