Zugriff auf die TwinCAT-Konfiguration

In diesem Kapitel wird der Zugriff auf ein TwinCAT XAE Konfigurationsprojekt über Automation Interface beschrieben. Das Ziel dieses Erstellungsprozesses besteht darin, Zugriff auf ein TwinCAT XAE-Projekt (früher bekannt als eine TwinCAT System Manager-Konfiguration) zu erhalten. Das neue TwinCAT XAE-Projekt ist anspruchsvoller, als die aus TwinCAT2 bekannte TwinCAT System Manager-Konfiguration. Dies impliziert eine geringfügige Konzeptänderung im Umgang mit einem Projekt / einer Konfiguration. TwinCAT 3 unterstützt eine zusätzliche hierarchische Ebene, die mehrere Konfigurationen in einen Visual Studio Solution Container zusammenfasst. Dies kann z.B. dazu genutzt werden, die Konfigurationen von dezentralen Ressourcen in eine Solution zu organisieren oder für das Kombinieren von HMI-Projekten zusammen mit der Systemkonfiguration. Die Solution ist in der Lage, alle Typen von Visual Studio und/oder TwinCAT XAE-Projekten zusammenzufassen. Bei Verwendung des TwinCAT XAE- Automation Interface bedeutet dies ein zusätzliches Level an Möglichkeiten.

Grundlegende Informationen

TwinCAT 3 wurde vollständig in Visual Studio integriert, um den Benutzern einen standardisierten und möglichst flexiblen Editor für die Erstellung und Verwaltung von TwinCAT-Projekten an die Hand zu geben. Bei der Erstellung von und/oder dem Zugriff auf eine TwinCAT-Konfiguration können Visual Studio und das TwinCAT-Automation Interface im Verbund verwendet werden. Beispiel: Wenn Sie eine neue TwinCAT-Konfiguration über das Automation Interface erstellen möchten, müssen Sie zunächst Methoden der Visual Studio-API aufrufen, um einen Visual Studio Solution Container zu erstellen und anschließend ein TwinCAT-Projekt mit Hilfe der Methoden des TwinCAT-Automation Interface hinzufügen. Dieses Szenario wird in einigen Code-Ausschnitten weiter unten behandelt.

Zugriff auf die TwinCAT-Konfiguration 1:

Darüber hinaus bietet die Visual Studio-API (die sogenannte Visual Studio DTE) den Entwicklern viele weitere Funktionen, z.B. den Zugriff auf das Fehlerausgabefenster. Weitere Informationen zu Visual Studio DTE finden Sie auf der Microsoft MSDN Internetseite.

Bitte beachten:

TwinCAT-Projekte über Vorlagen erstellen

Denken Sie daran, dass Sie eine Referenz zu dem COM-Objekt TcatSysManagerLib und EnvDTE.DTE (Microsoft Developement) hinzufügen, um in der Lage zu sein, das TwinCAT Automation Interface und die Visual Studio API zu verwenden. Die ProgID, die in der GetTypeFromProdID() Methode verwendet wird, hängt von der Visual Studio Version ab, die verwendet werden soll. Schauen Sie sich diesen Artikel an, um weitere Informationen über die verschiedenen ProgIDs zu erhalten.

Code-Ausschnitt (C#):

Type t = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0");
EnvDTE.DTE dte = System.Activator.CreateInstance(t);

dte.SuppressUI = false;
dte.MainWindow.Visible = true;

if (Directory.Exists(@"C:\Temp\SolutionFolder"))
     Directory.Delete(@"C:\Temp\SolutionFolder", true);
Directory.CreateDirectory(@"C:\Temp\SolutionFolder");
Directory.CreateDirectory(@"C:\Temp\SolutionFolder\MySolution1");

dynamic solution = dte.Solution;
solution.Create(@"C:\Temp\SolutionFolder", "MySolution1");
solution.SaveAs(@"C:\Temp\SolutionFolder\MySolution1\MySolution1.sln");

string template = @"C:\TwinCAT\3.1\Components\Base\PrjTemplate\TwinCAT Project.tsproj"; //path to project template
dynamic project = solution.AddFromTemplate(template, @"C:\Temp\SolutionFolder\MySolution1", "MyProject");

ITcSysManager sysManager = project.Object;

sysManager.ActivateConfiguration();
sysManager.StartRestartTwinCAT();

project.Save();
solution.SaveAs(@"C:\Temp\SolutionFolder\MySolution1\MySolution1.sln");

Code-Ausschnitt (Powershell):

Sie können den folgenden Code-Ausschnitt kopieren, in eine Textdatei einfügen und Letztere als "someName.ps1" speichern. Anschließend können Sie diese direkt über Windows PowerShell ausführen.

$targetDir = "C:\tmp\TestSolution"
$targetName = "TestSolution.tsp"
$template = "C:\TwinCAT\3.1\Components\Base\PrjTemplate\TwinCAT Project.tsproj"

$dte = new-object -com VisualStudio.DTE.10.0
$dte.SuppressUI = $false
$dte.MainWindow.Visible = $true

if(test-path $targetDir -pathtype container)
{
     Remove-Item $targetDir -Recurse -Force
}

New-Item $targetDir –type directory

$sln = $dte.Solution
$project = $sln.AddFromTemplate($template,$targetDir,$targetName)
$systemManager = $project.Object

$targetNetId = $systemManager.GetTargetNetId()
write-host $targetNetId

$systemManager.ActivateConfiguration()
$systemManager.StartRestartTwinCAT()

$project.Save()
$solutionPath = $targetDir + "\" + $targetName
$sln.SaveAs($solutionPath)

Code-Ausschnitt (C++):

Im entsprechender Header-Datei (z.B. stdafx.h):

//the following #import imports EnvDTE based on its LIBID.
#import"libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("10.0") lcid("0") raw_interfaces_only named_guids
// Imports die "Beckhoff TCatSysManager 1.1 Type Library"
#import"libid:3C49D6C3-93DC-11D0-B162-00A0248C244B" version("1.1") lcid("0")

Aufgrund eines bekannten Problems in VisualStudio 2010 (SP1) wird der generierte Proxy-Code nicht in das C++ Projekt eingebunden. Verwenden Sie bitte die in #import Known Issue (bekanntes Problem importieren) beschriebene provisorische Lösung.

#include 

using namespace std
using namespace TCatSysManagerLib;
using namespace EnvDTE;

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL); // COM initialisieren
    cout << "Creating VisualSTudio.DTE.10.0 ...";

    // creating a new instance of Visual Studio
    CComPtr<_DTE> m_pDTE;
    HRESULT hr = m_pDTE.CoCreateInstance(L"VisualStudio.DTE.10.0", 0, CLSCTX_ALL);
    if (FAILED(hr)) { cout << " FAILED"; return 1; }
    cout << " created." << endl;

    // retrieves the EnvDTE.Solution-Objekt
    CComPtr<_Solution> pSolution;
    m_pDTE->get_Solution(&pSolution);
    CComBSTR strSolutionFolder(_T("C:\\SolutionFolder")); // Solution-main directory (has to exist)
    CComBSTR strSolutionName(_T("MySolution1"));
    CComBSTR strTemplatePath(_T("C:\\TwinCAT\\3.1\\Components\\Base\\PrjTemplate\\TwinCAT Project.tsproj"));

    CComBSTR strSolutionPath; // Solution-Pfad (doesn’t exist!)
    strSolutionPath=strSolutionFolder;
    strSolutionPath.Append(_T("\\"));
    strSolutionPath.Append(strSolutionName);
    strSolutionPath.Append(_T(".sln"));

    // create the solution
    hr = pSolution->Create(strSolutionFolder,strSolutionName);
    CComBSTR strProjectPath(strSolutionFolder); // project path
    strProjectPath.Append(_T("\\"));
    strProjectPath.Append(strSolutionName);
    CComBSTR strProjectName = "MyProject"; // project name // create projekt from a template
    CComPtr pProject;
    hr = pSolution->AddFromTemplate(strTemplatePath,strProjectPath,strProjectName,VARIANT_FALSE,&pProject);
    // Wenn z.B. Projekt bereits besteht >> error
    if (FAILED(hr)) { cout << " Project creation FAILED"; return 1; }
    cout << "Project created" << endl;

    // define project automation class (here the Coclass TcSysManager)
    CComPtr pDispatch;
    hr = pProject->get_Object(&pDispatch);

    // retrieve ITcSysManager interface
    CComPtr pSystemManager;
    hr = pDispatch.QueryInterface(&pSystemManager);
    
    // operate with SystemManager interface
    CComBSTR netId;
    netId = (pSystemManager->GetTargetNetId()).GetBSTR();
    cout << "TargetNetId: " << netId << endl;
    hr = pSystemManager->ActivateConfiguration();
    hr = pSystemManager->StartRestartTwinCAT();

    // save project and solution
    hr = pProject->Save(CComBSTR());
    hr = pSolution->SaveAs(strSolutionPath);
    cout << "Succeeded";
    return 0;
}

Bekanntes Problem importieren:

    CComPtr<_DTE> m_pDTE;
    CLSID clsid;
    CLSIDFromProgID(L"VisualStudio.DTE.10.0",&clsid);
    CComPtr punk;
    HRESULT hr = GetActiveObject(clsid,NULL,&punk); // retrieve actual instance of Visual Studio .NET
    m_pDTE = punk;

Bitte beachten:

ITcSysManager::NewConfiguration, ITcSysManager::OpenConfiguration und ITcSysManager::SaveConfiguration werden in diesem Fall Fehlermeldungen verursachen, weil die Projektverwaltung an das Visual Studio IDE (die vom DTE-Objekt realisierten Instanzen von Solution und Projekt) delegiert wurde.