Openness DLL in der app.config umschalten

blimaa

Well-known member
Beiträge
917
Punkte Reaktionen
89
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Ich möchte meine Openness Applikation für verschiedene TIA Versionen gestalten. Nun möchte ich mal für V15.1 und V16 dies realisieren. Dies geht soweit, wenn ich jeweils im Visual Studio die Verweise auf die Siemens DLL ändere und dann in der App.Config jeweils der den richtigen Pfad entkommentiere und der andere einkommentiere.

Code:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
    </startup>



    <!--TIA Portal Konfiguration-->
    <!--V15.1:-->
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>
            
                <codeBase version="15.1.0.0" href="FILE://C:\MeinPfad\TIA V151 Openness DLL\Siemens.Engineering.dll"/>

            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering.Hmi" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>
            
                <codeBase version="15.1.0.0" href="FILE://C:\MeinPfad\TIA V151 Openness DLL\Siemens.Engineering.Hmi.dll"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>


    <!--V16:-->
    <!--<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>

                <codeBase version="16.0.0.0" href="FILE://C:\MeinPfad\TIA V16 Openness DLL\Siemens.Engineering.dll"/>

            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Siemens.Engineering.Hmi" culture="neutral"
                                  publicKeyToken="d29ec89bac048f84"/>

                <codeBase version="16.0.0.0" href="FILE://C:\MeinPfad\TIA V16 Openness DLL\Siemens.Engineering.Hmi.dll"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
-->


    <!--V17:-->
    <!--Zukunft-->


    
</configuration>

Nun möchte ich im nächsten Schritt nur noch in der App.config entsprechend ent/einkommentieren (so als zwischenschrtitt). Wie kann ich dies machen, damit ich die Verweise nicht immer ändern muss?
Dll auf false bei "lokale Kopie" und aus dem debug Ordner gelöscht habe ich bereits gemacht, nützt aber nichts... https://support.industry.siemens.com/cs/document/109766015/warum-wird-die-openness-applikation-nicht-mit-der-ausgew%C3%A4hlten-tia-portal-version-gestartet-?dti=0&lc=de-CH


Wer hat damit Erfahrung?

Gruss blimaa
 
OP
B

blimaa

Well-known member
Beiträge
917
Punkte Reaktionen
89
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Super Besten Dank. Werde ich machen.
Das Openness Beispiel habe ich bei mir nicht zum Laufen bekommen...
Da blicke ich nicht ganz durch.

Gruss blimaa
 
OP
B

blimaa

Well-known member
Beiträge
917
Punkte Reaktionen
89
Hi
Die erstellt das Grundkonstrukt eines neues Projekts.
SPS, IO-Link Master, Servocontrollern etc. gemäs eingelesenen Daten im Projekt einfügen, projektieren und ans Profinetnetzwerke anbinden.
Entsprechende Bauseine aus der Firmenbibliothek ins Projekt kopieren, gewisse Ansteuerungs Bausteine gemäss eingelesenen Daten generieren.

Muss sagen, deine Sammlung erschlägt mich fast ein bisschen.. :)
Was ich bis jetzt herausgefunden habe (oder besser gesagt erahne):
-unter "DotNetSiemensPLCToolBoxLibrary.TIAV16"
Code:
 AppDomain domain = AppDomain.CreateDomain("another domain");
            CrossAppDomainDelegate action = () =>  
            {  
                var app = new Application();
                var ask = new SelectPortalInstance();
                var p = AppDomain.CurrentDomain.GetData("processes") as string[];
                ask.lstInstances.ItemsSource = p;
                app.Run(ask);
                AppDomain.CurrentDomain.SetData("idx", ask.lstInstances.SelectedIndex);
            };  
            domain.SetData("processes", sLst);
            domain.DoCallBack(action);
            var idx = (int)domain.GetData("idx");

Hier übergibts du irgend wie welche Version von der DLL genutzt werden soll.....
Blicke ich jetzt aber noch nicht durch
 

Jochen Kühner

Well-known member
Beiträge
4.251
Punkte Reaktionen
506
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe eine Wrapper DLL für jede TIA Version, aber in einer gemeinsamen DLL gemeinsame Interfaces.

Dann lade ich die entsprechende DLL hier:
https://github.com/dotnetprojects/D...nnectionLibrary/Projectfiles/Projects.cs#L352

Vlt. reicht es dir aber einfach hier einzuspringen:
https://docs.microsoft.com/de-de/dotnet/api/system.appdomain.assemblyresolve?view=net-5.0

Aber weiß nicht ob die Interfaces sich zwischen den TIA Versionen nicht ändern und du dir wie ich eine Abstraktion schaffen mußt.

Software Im/Export geht mit meiner Abstraktion schon (Siehe https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary/tree/master/TiaImporter und https://github.com/dotnetprojects/DotNetSiemensPLCToolBoxLibrary/tree/master/TiaGitHandler). Hardware hab ich nix gemacht.
 
OP
B

blimaa

Well-known member
Beiträge
917
Punkte Reaktionen
89
Hi
Die Applikation an sich läuft prima. Ich wollte halt nun noch als topping die TIA Versionen Umschaltung machen.
Besten Dank, ich werde es nochmals genau anschauen.

Gruss blimaa
 
OP
B

blimaa

Well-known member
Beiträge
917
Punkte Reaktionen
89
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, ich habe nur (99%) SCL Bausteine, aber diese kommen direkt 1:1 aus der Bibliothek.
Ich generiere vorerst mal nur Datenbausteine.

Edit:
Für die DB's generiere ich eine Quelle und importiere diese dann ins Projekt.
 
Zuletzt bearbeitet:
OP
B

blimaa

Well-known member
Beiträge
917
Punkte Reaktionen
89
In der Openness Doku ist sogar ein Beispiel:
Code:
  static class MyProgram 
    { 
        public static void Main(string[] args) 
        { 
            AppDomain.CurrentDomain.AssemblyResolve += MyResolver; 
            RunTiaPortal(); 
        } 
        private static void RunTiaPortal() 
        { 
            // To start TIA Portal with user interface: 
            // using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface))
            // 
            // To start TIA Portal without user interface: 
            // using (TiaPortal tiaPortal = new 
TiaPortal(TiaPortalMode.WithoutUserInterface)) 
            using (TiaPortal tiaPortal = new TiaPortal(TiaPortalMode.WithUserInterface)) 
            { 
                //begin of code for further implementation 
                //... 
                //end of code 
            } 
        } 
        private static Assembly MyResolver(object sender, ResolveEventArgs args) 
        { 
            int index = args.Name.IndexOf(',');
            if (index == -1)
            {
                return null;
            }
            string name = args.Name.Substring(0, index) + ".dll";
            // Edit the following path according to your installed version of TIA Portal
            string path = Path.Combine(@"C:\Program Files\Siemens\Automation\Portal Vxx
\PublicAPI\Vxx\", name);
            string fullPath = Path.GetFullPath(path);
            if (File.Exists(fullPath))
            {
                return Assembly.LoadFrom(fullPath);
            }
            return null;
        }
    }

Dies habe ich mal ausprobiert...
Für die referenzierte DLL (V16) gehts, für V15.1 nicht...
(AppConfig ist alles zu TIA auskommentiert)
 

wbach

Well-known member
Beiträge
83
Punkte Reaktionen
0
Hi @blimaa und @Jochen Kühner ,
ich habe für mein Tool da so eine ähnliche Lösung. Allerdings funktioniert es nur, wenn man das erste mal die passende Version der DLL das erste mal lädt. Will man allerdings mitten drin das TIA Portal Projekt schließen und mit einer anderen Version weiter arbeiten, funktioniert es nicht mehr. Man muss die DLL also erstmal von der AppDomain trennen/unload um die dann wieder neuzuladen.

Hat es schon einer von Euch gemacht oder ist wer von Euch schon auf dieses Problem gestoßen?

LG
 
Oben