Erste Schritte - WPF

Die nachfolgenden Ausführungen zeigen alle notwendigen Schritte auf, um eine Grundlage für die eigentliche AddIn Entwicklung zu schaffen. Das vollständige Microsoft Visual Studio Projekt erhalten Sie hier: AddInSampleFirstSteps-WPF.

Voraussetzungen

Projekt erstellen

Starten Sie das Microsoft Visual Studio und legen Sie ein neues WPF Projekt an. Wählen Sie zusätzlich .NET Framework 4.6.1 aus.

Erste Schritte - WPF 1:

Öffnen Sie jetzt die Eigenschaften des Projekts und ändern Sie im Bereich Application die Einstellung Output type auf Class Library. Prüfen Sie, ob Target framework auf .NET Framework 4.6.1 gesetzt wurde.

Wechseln Sie zum Bereich Build und tragen Sie unter Output path den Pfad zum AddIn Ordner des TwinCAT BA Project Builders ein (standardmäßig TwinCAT -> BA Project Builder -> AddIns). Wählen Sie unter Platform target den Wert x86 aus.

Da es sich bei diesem Projekt um eine Klassenbibliothek handelt, müssen Sie zum Starten und Debuggen ein externes Programm definieren mit dem das AddIn gestartet werden soll. Im Bereich Debug tragen Sie bei Start external program den Pfad zum TwinCAT BA Project Builder ein (standardmäßig TwinCAT -> BA Project Builder -> TwinCAT.BA.ProjectBuilder.UI.exe).

Entfernen Sie die standardmäßig erstellte Datei App.xml aus dem Projekt.

Referenzen hinzufügen

Der nächste Schritt umfasst das Hinzufügen von drei Referenzen.

Icon hinzufügen

Fügen Sie, wenn gewünscht, dem Projekt ein Icon (16 x 16 Pixel) hinzu und setzen Sie die Eigenschaft Build Action auf Resource.
Erste Schritte - WPF 3:

Bereitstellung

Damit das AddIn im TwinCAT BA Project Builder angezeigt und geladen werden kann, müssen zwei Klassen hinzugefügt werden. Zum einen eine Klasse die von ContractAttribute abgeleitet wird und einige Properties überschreibt. Diese dienen zur Anzeige des AddIns im TwinCAT BA Project Builder. Des Weiteren muss eine Klasse angelegt werden, die das Interface IContractWpf enthält. Durch die Methode GetWindow wird über den TwinCAT BA Project Builder das AddIn geladen.

Legen sie eine neue Klasse mit den Namen AddInEntryMetadata an und leiten diese von ContractAttribute ab. Fügen Sie die Eigenschaften Description, ShortDescription, Name, Version und Icon hinzu. Diese Informationen werden im TwinCAT BA Project Builder bei der Auswahl des AddIns angezeigt.

using TwinCAT.BA.ProjectBuilder.AddIn.Contract;

namespace AddInSampleFirstSteps
{
    public class AddInEntryMetadata : ContractAttribute
    {
    // Gets the description of the AddIn.
    public override string Description 
    {
        get
        {
        return "AddIn Sample FirstSteps of the TwinCAT BA Project Builder for WPF";
        }
    }
    
    // Gets the short description of the AddIn.
    public override string ShortDescription
    {
        get
        {
        return "AddIn Sample FirstSteps for WPF";
        }
    }       

    // Gets the name of the AddIn.
    public override string Name 
    {
        get
        {
        return "Sample FirstSteps WPF";
        }
    }

    // Gets the version of the AddIn.
    public override string Version 
    {
        get
        {
        return "1.0.0";
        }
    }

    // Gets the contract metadata icon path.
    // "pack://application:,,,/<- Assembly name ->/;component/<- Subfolder or image/icon file name"
    public override string Icon
    {
        get
        {
        return "pack://application:,,,/AddInSampleFirstSteps-WPF;component/AddIn.png";
        }
    }    
    }
}

Legen Sie nun die Klasse AddInEntryPoint an und implementieren Sie das Interface IContractWpf. Ausserdem muss die Klasse mit den Attributen Export und AddInEntryMetadata dekoriert werden.

Das Interface enthält die Methode GetWindow(). Diese wird vom BA Project Builder aufgerufen, wenn das AddIn angezeigt werden soll. Des Weiteren müssen zwei Events implementiert werden, die für den Zugriff auf das Window Output vom BA Project Builder notwendig sind.

using System;
using System.ComponentModel.Composition;
using System.Windows;
using TwinCAT.BA.ProjectBuilder.AddIn.Contract;

namespace AddInSampleFirstSteps
{
    [Export(typeof(IContractWpf))] // Marks this class as an entry point for the TwinCAT BA Project Builder    
    [AddInEntryMetadata] // Adds necessary information about the AddIn to this class
    public class AddInEntryPoint : IContractWpf
    {
    private AddInEntryMetadata addInEntryMetadata = null;
    public event EventHandler<ContractLogEventArgs> LogEvent;
    public event EventHandler<ContractClearLogEventArgs> ClearLogEvent;       
    
    public Window GetWindow()
    {
        this.addInEntryMetadata = new AddInEntryMetadata();
        // Passing the main class of the AddIn
        return new MainWindow(this);
    }

    public void RaiseLogEvent(LogLevel level, string message)
    {
        OnLog(new ContractLogEventArgs(this.addInEntryMetadata, level, message));
    }

    // The event-invoking method that derived classes can override. 
    private void OnLog(ContractLogEventArgs e)
    {
        // Make a temporary copy of the event to avoid possibility of 
        // a race condition if the last subscriber unsubscribes 
        // immediately after the null check and before the event is raised.
        EventHandler<ContractLogEventArgs> handler = this.LogEvent;
        if (handler != null)
        {
        handler(this, e);
        }
    }

    public void RaiseClearLogEvent()
    {
        OnClearLog(new ContractClearLogEventArgs(this.addInEntryMetadata));
    }

    // The event-invoking method that derived classes can override. 
    private void OnClearLog(ContractClearLogEventArgs e)
    {
        // Make a temporary copy of the event to avoid possibility of 
        // a race condition if the last subscriber unsubscribes 
        // immediately after the null check and before the event is raised.
        EventHandler<ContractClearLogEventArgs> handler = this.ClearLogEvent;
        if (handler != null)
        {
        handler(this, e);
        }
    }
    }
}

Programmierung

Die Hauptfunktionalitäten werden in der Klasse MainWindow implementiert.

using System.Windows;
using TwinCAT.BA.ProjectBuilder.AddIn.IL;
using TwinCAT.BA.ProjectBuilder.AddIn.IL.Hardware;

namespace AddInSampleFirstSteps
{
    public partial class MainWindow : Window
    {
    AddInEntryPoint addInEntryPoint = null;
    BAProjectBuilder projectBuilder = null;

    public MainWindow(AddInEntryPoint addInEntryPoint)
    {
        InitializeComponent();
        // Code here
        this.addInEntryPoint = addInEntryPoint;
        this.projectBuilder = new BAProjectBuilder();        
    }
    }
}

Debuggen

Der TwinCAT BA Project Builder wird automatisch mit dem Projekt gestartet. Sie können das AddIn sowohl über das Menü Tools vom TwinCAT BA Project Builder ausführen ...
Erste Schritte - WPF 4:

... als auch über die Toolbar.
Erste Schritte - WPF 5:

In beiden Fällen wird durch den TwinCAT BA Project Builder eine Instanz vom AddIn angelegt und die Methode GetWindow aufgerufen.

Von der Klasse AddInEntryMetadata wird schon beim Starten des BA Project Builders eine Instanz angelegt und über die Properties alle Informationen ausgelesen, die für die Darstellung im TwinCAT BA Project Builder notwendig sind.