Beispiel Machine mit Microsoft Expression Blend (C#)

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 das Ganze anschließend in den Vista Media Center eingebunden. Dabei wurde die Programmiersprache C# verwendet.

Zielplattform

Implementierung

Erforderliche Software

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 C# -> 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 das Machine und legen die Location fest.

Beispiel Machine mit Microsoft Expression Blend (C#) 1:

2. Bedienungsoberfläche erstellen

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

Beispiel Machine mit Microsoft Expression Blend (C#) 2:

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 anpasst, 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 aus Versehen 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'.

Beispiel Machine mit Microsoft Expression Blend (C#) 3:

4. Sicherheitsfreigabe

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

Beispiel Machine mit Microsoft Expression Blend (C#) 4:

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.

Beispiel Machine mit Microsoft Expression Blend (C#) 5:

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.

using  System.IO;
using  TwinCAT.Ads;

Danach folgen die Deklarationen.

privateTcAdsClient tcClient;
privateAdsStream dataStream;
privateBinaryReader binReader;
private int hEngine;
private int hDeviceUp;
private int hDeviceDown;
private int hSteps;
private int hCount;
private int hSwitchNotify;
private int hSwitchWrite;

Die erste Methode, ist die 'Load' Methode. In ihr werden Instanzen verschiedener Klassen erzeugt und eine Verbindung zum Port 801 hergestellt.

//-----------------------------------------------------// Wird als erstes beim Starten des Programms aufgerufen// Is activated first when the program is started//-----------------------------------------------------private void Load(object sender, EventArgs e)
{
    try
    {
     // Eine neue Instanz der Klasse AdsStream erzeugen// Create an 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 an new instance of the TcAdsClient class
     tcClient = new TcAdsClient();
     
     // Verbinden mit lokaler SPS - Laufzeit 1 - Port 801// Connecting to local PLC - Runtime 1 - Port 801
     tcClient.Connect(801);
    }
    catch
    {
     MessageBox.Show("Fehler beim Laden");
    }
     
    //...

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// Initalizing the monitoring of the PLC variables
    hEngine = tcClient.AddDeviceNotification(".engine", dataStream, 0, 1, AdsTransMode.OnChange, 10, 0, null);
    hDeviceUp = tcClient.AddDeviceNotification(".deviceUp", dataStream, 1, 1, AdsTransMode.OnChange, 10, 0, null);
    hDeviceDown = tcClient.AddDeviceNotification(".deviceDown", dataStream, 2, 1, AdsTransMode.OnChange, 10, 0, null);
    hSteps = tcClient.AddDeviceNotification(".steps", dataStream, 3, 1, AdsTransMode.OnChange, 10, 0, null);
    hCount = tcClient.AddDeviceNotification(".count", dataStream, 4, 2, AdsTransMode.OnChange, 10, 0, null);
    hSwitchNotify = tcClient.AddDeviceNotification(".switch", dataStream, 6, 1,  AdsTransMode.OnChange, 10, 0, null);

    // 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 value
    tcClient.AdsNotification += newAdsNotificationEventHandler(tcClient_OnNotification);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
}

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);

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

int TcAdsClient.CreateVariableHandle(string variableName);



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 void tcClient_OnNotification(object sender, AdsNotificationEventArgs e)
{
    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)
    {
        // Die Farben der Grafiken entsprechened der Variablen anpassen// Adapt colors of graphice according to the variablesif (binReader.ReadBoolean() == true)
        {
        DeviceUp_LED.Foreground = newSolidColorBrush(Colors.Red);
        }
        else
        {
        DeviceUp_LED.Foreground = newSolidColorBrush(Colors.White);
        }
    }
    else if(e.NotificationHandle == hDeviceDown)
    {
        if (binReader.ReadBoolean() == true)
        {
        DeviceDown_LED.Foreground = newSolidColorBrush(Colors.Red);
        }
        else
        {
        DeviceDown_LED.Foreground = newSolidColorBrush(Colors.White);
        }
    }
    else if(e.NotificationHandle == hSteps)
    {
        // Einstellen der ProgressBar auf den aktuellen Schritt// Setting the ProgressBar to the current step
        prgSteps.Value = binReader.ReadByte();
    }
    else if(e.NotificationHandle == hCount)
    {
        // Anzeigen des 'Zähler'-Wertes// Displaying the 'count' value
        lblCount.Text = binReader.ReadUInt16().ToString();
    }
    else if(e.NotificationHandle == hSwitchNotify)
    {
        // Markieren des korrekten RadioButtons// Checking the correct RadioButtonif (binReader.ReadBoolean() == true)
        {
        optSpeedFast.IsChecked = true;
        }
        else
        {
        optSpeedSlow.IsChecked = true;
        }
    }
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
}

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-Variable switch geschrieben.

//------------------------------------------------------// wird aufgerufen, wenn das Feld 'schnell' markiert wird// is activated when the 'fast' field is marked//------------------------------------------------------private void optSpeedFast_Click(object sender, EventArgs e)
{
    try
    {
    tcClient.WriteAny(hSwitchWrite, true);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
}

//------------------------------------------------------// wird aufgerufen, wenn das Feld 'langsam' markiert wird// is activated when the 'slow' field is marked//------------------------------------------------------private void optSpeedSlow_Click(object sender, EventArgs e)
{
    try
    {
    tcClient.WriteAny(hSwitchWrite, false);
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }
}


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 void Close(object sender, EventArgs e)
{
    try
    {
    // Löschen der Notifications und Handles// Deleting of the notification and handles
    tcClient.DeleteDeviceNotification(hEngine);
    tcClient.DeleteDeviceNotification(hDeviceUp);
    tcClient.DeleteDeviceNotification(hDeviceDown);
    tcClient.DeleteDeviceNotification(hSteps);
    tcClient.DeleteDeviceNotification(hCount);
    tcClient.DeleteDeviceNotification(hSwitchNotify);

    tcClient.DeleteVariableHandle(hSwitchWrite);
    }
    catch (Exception ex)
    {
     MessageBox.Show(ex.Message);
    }    
    tcClient.Dispose();
}


Zu guter Letzt muss noch dafür gesorgt werden, dass die Methoden auch beim richtigen Ereignis aufgerufen werden. Dazu in Expression Blend gehen, Page auswählen, bei Properties auf Events wechseln und bei 'Loaded' 'Load' reinschreiben und bei 'Unloaded' 'Close'.
Das Gleiche muss auch noch mit den beiden RadioButtons gemacht werden, nur das hierbei das Event 'Click' ausgewählt wird, sowie die Methode 'optSpeedFast_Click' bzw. 'optSpeedSlow_Click'.
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.

Beispiel Machine mit Microsoft Expression Blend (C#) 6:

Gehen Sie jetzt in einen Texteditor, z. B. Notepad und 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.

10. Download Expression Blend Beispiel:

Expression Beispiel