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
- Microsoft Visual Studio 2013 oder höher
- Microsoft .NET Framework 4.6.1 oder höher
- Kenntnisse in der Programmiersprache C#
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.

Ö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.
- System.ComponentModel.Composition: Der TwinCAT BA Project Builder nutzt MEF (Managed Extensibility Framework) als Basistechnologie für die Erweiterbarkeit durch AddIns. Alle notwendigen Klassen für die Nutzung von MEF sind in dieser DLL enthalten.
- TwinCAT.BA.ProjectBuilder.AddIn.Contract: Über diese Referenz werden Interfaces zur Verfügung gestellt, die das AddIn implementieren muss, damit dieses vom TwinCAT BA Project Builder instanziiert werden kann. Enthalten ist diese in der Datei TwinCAT -> BA Project Builder -> TwinCAT.BA.ProjectBuilder.AddIn.Contract.dll. Setzen Sie für diese Referenz die Option Copy Local auf False.
- TwinCAT.BA.ProjectBuilder.AddIn.IL: Diese Referenz bietet Klassen für den Zugriff auf das interne Objektmodell des TwinCAT BA Project Builder. Enthalten ist diese in der Datei TwinCAT -> BA Project Builder -> TwinCAT.BA.ProjectBuilder.AddIn.IL.dll. Setzen Sie für diese Referenz die Option Copy Local auf False.
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.
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 ...
... als auch über die Toolbar.
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.