TIA Gerät per Openness TIA in bestehendes Projekt einfügen

Nethiros

Level-2
Beiträge
57
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich habe folgendes Problem:
Ich würde sehr gerne ein Programm erstellen, welches mir die Umrüstung eines bestehenden Projektes erleichtert. Leider bin ich bisher noch kein Experte auf dem Gebiet der Openness Automatisierung. Bisher kann ich mit meinem Programm ein bestehendes offenes Projekt öffnen und im Programmcode darauf zugreifen. Nun soll der der erste Schritt sein, ein Hardwareelement automatisch hinzufügen zu lassen. Dieses Hardwareelement liegt als XML Datei vor. Ich habe bereits viel im Skript von Siemens selbst gescrollt, bin aber nicht sehr viel weiter gekommen.

Wie sollte meine grobe Vorgehensweise hierfür sein? Ich bin auf diesen Eintrag der Unterlage von Siemens gestoßen. Ist dieser Link, der richtige Ansatz? Vielen Dank an alle die mir einen Tipp geben können. Ich brauche ein bisschen länger um mit Openness warm zu werden, also verzeiht die Frage, sollte sie doof sein.

Liebe Grüße
Nethiros
 
Hi,
schau mal in die Openness-Demoanwendung hier. Da ist das Einfügen neuer Hardwareelemente mal umgesetzt und der vollständige Quellcode (die ganze Visual Studio Solution) ist dabei.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
schau mal in die Openness-Demoanwendung hier. Da ist das Einfügen neuer Hardwareelemente mal umgesetzt und der vollständige Quellcode (die ganze Visual Studio Solution) ist dabei.
Erst einmal vielen Dank für die Antwort. Ich bin das Programm jetzt einige Zeit durchgegangen, kann aber leider nicht den Teil im Programm finden, bei dem Hardware eingefügt wird. Weißt du wo die Funktion im Programm liegt?
 
Erst einmal vielen Dank für die Antwort. Ich bin das Programm jetzt einige Zeit durchgegangen, kann aber leider nicht den Teil im Programm finden, bei dem Hardware eingefügt wird. Weißt du wo die Funktion im Programm liegt?
Wenn du in der Visual Studio Solution des Basic Project Generators mal anschaust, welche Funktion hinter dem "Add new device" button liegt, dann landet man nach dem ganzen Glue-Code für die Oberfläche, Wrappern und Service-Klassen irgendwann in der Datei "ApiWrapper.cs". Dort werden die eigentlichen Openness-Funktionen aufgerufen und dort gibt es eine Funktion namens "DoAddNewDevice" und die ruft die eigentliche Openness-Funktion "CurrentProject.Devices.CreateWithItem(...) auf.

C#:
/// <summary>
/// Add a new device based on device template
/// </summary>
/// <param name="typeIdentifier"></param>
/// <param name="name"></param>
/// <param name="deviceName"></param>
/// <param name="caller"></param>
public void DoAddNewDevice(string typeIdentifier, string name, string deviceName, [CallerMemberName] string caller = "")
{
    var methodBase = MethodBase.GetCurrentMethod();
    if (methodBase.ReflectedType != null) _traceWriter.Write(methodBase.ReflectedType.Name + "." + methodBase.Name + " called from " + caller);

    Device = CurrentProject.Devices.CreateWithItem(typeIdentifier, name, deviceName);
    IsModified = CurrentProject.IsModified;
}

Dieselbe Funktion findest du auch im Openness-Handbuch unter "Funktionen auf Geräte" --> "Erstellen eines Geräts"
 
Wenn du in der Visual Studio Solution des Basic Project Generators mal anschaust, welche Funktion hinter dem "Add new device" button liegt, dann landet man nach dem ganzen Glue-Code für die Oberfläche, Wrappern und Service-Klassen irgendwann in der Datei "ApiWrapper.cs". Dort werden die eigentlichen Openness-Funktionen aufgerufen und dort gibt es eine Funktion namens "DoAddNewDevice" und die ruft die eigentliche Openness-Funktion "CurrentProject.Devices.CreateWithItem(...) auf.

C#:
/// <summary>
/// Add a new device based on device template
/// </summary>
/// <param name="typeIdentifier"></param>
/// <param name="name"></param>
/// <param name="deviceName"></param>
/// <param name="caller"></param>
public void DoAddNewDevice(string typeIdentifier, string name, string deviceName, [CallerMemberName] string caller = "")
{
    var methodBase = MethodBase.GetCurrentMethod();
    if (methodBase.ReflectedType != null) _traceWriter.Write(methodBase.ReflectedType.Name + "." + methodBase.Name + " called from " + caller);

    Device = CurrentProject.Devices.CreateWithItem(typeIdentifier, name, deviceName);
    IsModified = CurrentProject.IsModified;
}

Dieselbe Funktion findest du auch im Openness-Handbuch unter "Funktionen auf Geräte" --> "Erstellen eines Geräts"

Vielen Dank. Habe es jetzt tatsächlich hinbekommen eine Funktion zu schreiben, welche automatisch Hardware einfügen kann.
Weißt du, ob es da auch eine Funktion gibt, mit der man das eingefügte Gerät anschließend in der Software auch mit der CPU verbunden werden kann?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe jetzt noch ein bisschen länger im Internet gesucht und bin zu dem Entschluss gekommen, dass eine Verbindung manuell gezogen werden muss. Zumindest habe ich leider keinen Weg gefunden. Nun muss ich neue Netzwerke erstellen, in denen ein Baustein hinzugefügt werden soll. Weiß jemand, wie man das am Besten anstellt? Bisher habe ich einen Ansatz mit Blocks.Import gefunden, dieser funktioniert jedoch noch nicht ganz.
 
Ich habe jetzt noch ein bisschen länger im Internet gesucht und bin zu dem Entschluss gekommen, dass eine Verbindung manuell gezogen werden muss. Zumindest habe ich leider keinen Weg gefunden. Nun muss ich neue Netzwerke erstellen, in denen ein Baustein hinzugefügt werden soll. Weiß jemand, wie man das am Besten anstellt? Bisher habe ich einen Ansatz mit Blocks.Import gefunden, dieser funktioniert jedoch noch nicht ganz.
Vielleicht versteh ich es auch falsch, aber über Openness eine Verbindung zwischen Geräten ziehen, das funktioniert schon. Topologie sogar auch.
C#:
// Create two plc-stations
Device devOne = prjct.Devices.CreateWithItem("OrderNumber:6ES7 515-2AN03-0AB0/V3.0", "PLC_1", "StationOne");
Device devTwo = prjct.Devices.CreateWithItem("OrderNumber:6ES7 515-2AN03-0AB0/V3.0", "PLC_2", "StationTwo");
// Get network interface
DeviceItem netInterfaceOne = devOne.DeviceItems[1].DeviceItems[3];
DeviceItem netInterfaceTwo = devTwo.DeviceItems[1].DeviceItems[3];
// Get service for network interface
NetworkInterface infOne = netInterfaceOne.GetService<NetworkInterface>();
NetworkInterface infTwo = netInterfaceTwo.GetService<NetworkInterface>();
// Create subnet and connect devices
Node OneX1 = infOne.Nodes[0];
Node TwoX1 = infTwo.Nodes[0];
Subnet mySubnet = OneX1.CreateAndConnectToSubnet("MySubnet");
TwoX1.ConnectToSubnet(mySubnet);
// Connect ports to oneanother = Create topology
NetworkPort portOne = netInterfaceOne.DeviceItems[0].GetService<NetworkPort>();
NetworkPort portTwo = netInterfaceTwo.DeviceItems[1].GetService<NetworkPort>();
portOne.ConnectToPort(portTwo);

Soweit ich weiß, hat man mit Openness keinen direkten Zugriff auf die Netzwerke/Code in einem Baustein. Man muss sie sich als Quelle oder XML exportieren, dort bearbeiten und danach wieder importieren
 
Vielleicht versteh ich es auch falsch, aber über Openness eine Verbindung zwischen Geräten ziehen, das funktioniert schon. Topologie sogar auch.
C#:
// Create two plc-stations
Device devOne = prjct.Devices.CreateWithItem("OrderNumber:6ES7 515-2AN03-0AB0/V3.0", "PLC_1", "StationOne");
Device devTwo = prjct.Devices.CreateWithItem("OrderNumber:6ES7 515-2AN03-0AB0/V3.0", "PLC_2", "StationTwo");
// Get network interface
DeviceItem netInterfaceOne = devOne.DeviceItems[1].DeviceItems[3];
DeviceItem netInterfaceTwo = devTwo.DeviceItems[1].DeviceItems[3];
// Get service for network interface
NetworkInterface infOne = netInterfaceOne.GetService<NetworkInterface>();
NetworkInterface infTwo = netInterfaceTwo.GetService<NetworkInterface>();
// Create subnet and connect devices
Node OneX1 = infOne.Nodes[0];
Node TwoX1 = infTwo.Nodes[0];
Subnet mySubnet = OneX1.CreateAndConnectToSubnet("MySubnet");
TwoX1.ConnectToSubnet(mySubnet);
// Connect ports to oneanother = Create topology
NetworkPort portOne = netInterfaceOne.DeviceItems[0].GetService<NetworkPort>();
NetworkPort portTwo = netInterfaceTwo.DeviceItems[1].GetService<NetworkPort>();
portOne.ConnectToPort(portTwo);

Soweit ich weiß, hat man mit Openness keinen direkten Zugriff auf die Netzwerke/Code in einem Baustein. Man muss sie sich als Quelle oder XML exportieren, dort bearbeiten und danach wieder importieren


Hallo Lucas,

zunächst mal sorry für meine späte Antwort. Ich hatte mir letzte Woche zum Teil Urlaub genommen und konnte daher nicht sofort reagieren.

Vielen Dank für deinen hilfreichen Beitrag. Ich habe deinen Ansatz verwendet, um die Geräte in meinem TIA Portal-Projekt miteinander zu verbinden. Es hat nach einigen kleinen Abänderungen am Code gut funktioniert, bis zu dem Punkt, an dem ich versucht habe, die Ports miteinander zu verbinden. Ich bekomme den Fehler "No interconnection can be created between these ports", wenn ich portOne.ConnectToPort(portTwo); ausführe.

Hast du eine Idee, warum dieser Fehler auftreten könnte oder wie ich ihn beheben kann? Gibt es spezifische Anforderungen oder Konfigurationen, die ich beachten muss, bevor ich die Ports miteinander verbinde? Und wie kann ich das IO-Device des neuen Geräts einstellen. In der Dokumentation von Siemens steht leider nur, wie man den IO-Controllen auslesen kann, aber nicht wie man ihn einstellt.

Zusätzlich zu diesem Problem versuche ich auch herauszufinden, wie ich Netzwerke erstelle und Bausteine zu meinem Projekt hinzufüge. Du hast erwähnt, dass man mit Openness keinen direkten Zugriff auf die Netzwerke/Code in einem Baustein hat. Das macht Sinn. Ich habe versucht, die Blocks.Import-Methode zu verwenden, aber bisher ohne Erfolg. Hast du Erfahrung mit dieser Methode oder kannst du mir Tipps geben, wie ich sie effektiv nutzen kann?

Nochmals vielen Dank für deine Hilfe.

Viele Grüße
Nethiros
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Lucas,

zunächst mal sorry für meine späte Antwort. Ich hatte mir letzte Woche zum Teil Urlaub genommen und konnte daher nicht sofort reagieren.

Vielen Dank für deinen hilfreichen Beitrag. Ich habe deinen Ansatz verwendet, um die Geräte in meinem TIA Portal-Projekt miteinander zu verbinden. Es hat nach einigen kleinen Abänderungen am Code gut funktioniert, bis zu dem Punkt, an dem ich versucht habe, die Ports miteinander zu verbinden. Ich bekomme den Fehler "No interconnection can be created between these ports", wenn ich portOne.ConnectToPort(portTwo); ausführe.

Hast du eine Idee, warum dieser Fehler auftreten könnte oder wie ich ihn beheben kann? Gibt es spezifische Anforderungen oder Konfigurationen, die ich beachten muss, bevor ich die Ports miteinander verbinde? Und wie kann ich das IO-Device des neuen Geräts einstellen. In der Dokumentation von Siemens steht leider nur, wie man den IO-Controllen auslesen kann, aber nicht wie man ihn einstellt.

Zusätzlich zu diesem Problem versuche ich auch herauszufinden, wie ich Netzwerke erstelle und Bausteine zu meinem Projekt hinzufüge. Du hast erwähnt, dass man mit Openness keinen direkten Zugriff auf die Netzwerke/Code in einem Baustein hat. Das macht Sinn. Ich habe versucht, die Blocks.Import-Methode zu verwenden, aber bisher ohne Erfolg. Hast du Erfahrung mit dieser Methode oder kannst du mir Tipps geben, wie ich sie effektiv nutzen kann?

Nochmals vielen Dank für deine Hilfe.

Viele Grüße
Nethiros
Finde ich tatsächlich ein bisschen komisch, da der Code bei mir 1:1 durchgelaufen ist...
Welche TIA-Version nutzt du? Nicht, dass das eventuell erst in irgendeiner Version nachgekommen ist, die du gar nicht nutzt.
Eventuell hast du auch andere CPU-Typen gewählt, deren Schnittstellen anders im Objektmodell abgebildet sind. Ich zieh sie mir ja einfach nur mit DeviceItems[$NUMMER] aus der Composition raus, was man sicher auch eleganter lösen könnte.
Siehst du die entsprechenden Funktionen im Openness Explorer? Dort kannst du sie ja am lebenden Objekt aufrufen und ausprobieren.

Zur Methode Blocks.Import(). Erstell dir am besten manuell einen einfachen Baustein mit ein paar einfachen Verknüpfungen (UND, ODER, SR, Zuweisung, sowas in der Art) und exportier ihn dir mit Blocks.Export(). Dann hast du ein Gefühl, wie die XML aufgebaut ist und kannst entsprechend deine Bausteine importieren.
Das hat alles auch sein eigenes Kapitel in der Openness-Doku bekommen:
 
Finde ich tatsächlich ein bisschen komisch, da der Code bei mir 1:1 durchgelaufen ist...
Welche TIA-Version nutzt du? Nicht, dass das eventuell erst in irgendeiner Version nachgekommen ist, die du gar nicht nutzt.
Eventuell hast du auch andere CPU-Typen gewählt, deren Schnittstellen anders im Objektmodell abgebildet sind. Ich zieh sie mir ja einfach nur mit DeviceItems[$NUMMER] aus der Composition raus, was man sicher auch eleganter lösen könnte.
Siehst du die entsprechenden Funktionen im Openness Explorer? Dort kannst du sie ja am lebenden Objekt aufrufen und ausprobieren.

Zur Methode Blocks.Import(). Erstell dir am besten manuell einen einfachen Baustein mit ein paar einfachen Verknüpfungen (UND, ODER, SR, Zuweisung, sowas in der Art) und exportier ihn dir mit Blocks.Export(). Dann hast du ein Gefühl, wie die XML aufgebaut ist und kannst entsprechend deine Bausteine importieren.
Das hat alles auch sein eigenes Kapitel in der Openness-Doku bekommen:

Wieder einmal vielen Dank. Ich habe zwar vermutlich herausgefunden, warum ich portOne.ConnectToPort(portTwo); nicht nutzen konnte, aber dieser Teil des Programms kann auch erst einmal von mir weggelassen werden, weil die Hardware auch ohne Portverschaltung funktioniert.

Das Problem mit dem IO-Controller konnte ich übrigens auch lösen. Hier ein Ausschnitt der Lösung:


C#:
            // Subnet
            mySubnet = projectTia.Subnets.First();
            Console.WriteLine("Connecting to Subnet " + mySubnet.Name);
            infOne.Nodes[0].ConnectToSubnet(mySubnet);
            // IO-System
            IOSystem = mySubnet.IoSystems.First();
            Console.WriteLine("Connecting to IO-System " + IOSystem.Name);
            infOne.IoConnectors[0].ConnectToIoSystem(IOSystem);

Bezüglich des Imports von XML Dateien. Ich habe bereits in Tia Portal Bausteine erstellt, die in andere Projekte eingefügt werden müssten. Muss ich diese Datein jetzt erst einmal mittels Openness exportieren, oder gibt es da eine eine elegantere Lösung, um an die XML Datei zu kommen, die für Import in andere Projekte benötigt wird?
 
Bezüglich des Imports von XML Dateien. Ich habe bereits in Tia Portal Bausteine erstellt, die in andere Projekte eingefügt werden müssten. Muss ich diese Datein jetzt erst einmal mittels Openness exportieren, oder gibt es da eine eine elegantere Lösung, um an die XML Datei zu kommen, die für Import in andere Projekte benötigt wird?
Ich wüsste nicht, dass man sie anders exportieren könnte als über Openness.
Oder halt im Openness Explorer die Methode antriggern, dann muss man den Code nicht selber schreiben, wenn es nur um die Ausführung der Funktionalität geht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wüsste nicht, dass man sie anders exportieren könnte als über Openness.
Oder halt im Openness Explorer die Methode antriggern, dann muss man den Code nicht selber schreiben, wenn es nur um die Ausführung der Funktionalität geht.
Also Exportieren habe ich zum laufen bekommen und so konnte ich von unterschiedlichen Bausteinen einen XML-Datei generieren.
Dafür habe ich folgenden Befehl genutzt:

C#:
block.Export(new FileInfo(filePath), ExportOptions.WithDefaults);

Das Importieren funktioniert bisher nur in einen Ordner. Ist es jedoch auch möglich einen Funktionsbaustein in ein bereits bestehendes Netzwerk eines FCs zu importieren? Also beispielsweise FB_Test importieren in Netzwerk 3 von FC_Funktion.
 
Das Importieren funktioniert bisher nur in einen Ordner. Ist es jedoch auch möglich einen Funktionsbaustein in ein bereits bestehendes Netzwerk eines FCs zu importieren? Also beispielsweise FB_Test importieren in Netzwerk 3 von FC_Funktion.

Ich wüsste nicht wie, außer man manipuliert sich die XML selbst, bevor man sie wieder importiert.
 
Sollte jeweils über die Group Composition gehen, in dem der Ordner angelegt werden soll. Z.B PlcSystemBlockGroupComposition im Bereich der PLC blocks.

Nachtrag: Der Openness Explorer ist bei so etwas der beste Freund.
 
Zuletzt bearbeitet:
Ich habe jetzt noch ein bisschen länger im Internet gesucht und bin zu dem Entschluss gekommen, dass eine Verbindung manuell gezogen werden muss. Zumindest habe ich leider keinen Weg gefunden. Nun muss ich neue Netzwerke erstellen, in denen ein Baustein hinzugefügt werden soll. Weiß jemand, wie man das am Besten anstellt? Bisher habe ich einen Ansatz mit Blocks.Import gefunden, dieser funktioniert jedoch noch nicht ganz.
Für die Generierung von Software und die Aufrufe von Instanzdatenbausteinen eignet sich der Modular Application Creator (MAC) von Siemens. Mit dem MAC Module Builder ist es möglich innerhalb eigener Equipmentmodule Bausteine hinzuzufügen ohne ein aufwendiges editieren von XML-Bausteinen. Es gibt auch ein GettingStarted auf der Seite inkl. SourceCode.
 
Zurück
Oben