Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 32

Thema: Instanzen/Multiinstanzen?

  1. #11
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Sh4gr4th
    Es ist ganz einfach. Es geht um lokale statische Variablen. Bezogen auf eine Hochsprache ist das eine Konstruktion, die es dort schlicht weg nicht gibt!
    Beispiel: INNERHALB einer C-Funktion werden lokale Variablen angelegt und verwendet. Diese Variablen sind NUR innerhalb der Funktion sichtbar, deswegen sie auch nur LOAKELEN Einfluß. Nach Verlassen der Funktion, haben diese Variablen ihre Bedeutung verloren und somit auch nicht mehr adressierbar! Werden für das Speichern Variablen benötigt, die auch nach dem Verlassen Bestand haben sollen, dann MÜSSEN diese Variablen GLOBAL angelegt sein, weil sie damit für die Funktion, die diese verwendet, einen STATISCHEN Charakter aufweisen müssen.

    Aber bei der S7 kann ich nur entfernte Ähnlichkeiten zu einer Hochsprache herstellen. Und leider ist die Semantik bei Siemens oft nicht sehr präzise Daher kommen leider die Verwirrungen bei der Frage, wann muss ich einen FB programmieren und wann kann ich einen FC-Typ anwenden. Eine Variable, die nach VAR bei der Schnittstellendefinition eines FBs definiert wird, stellt IMMER eine GLOBALE Variable dar, obwohl es sich angeblich um eine LOKALE Definition handelt. Denn die Variablen dieses Typs werden in einem Instanz-DB gespeichert, der die gleichen Eigenschaften wie ein GLOBALER DB hat, das Kind hat nur einen anderen Namen bekommen. Und globale DBs sind in der S7 IMMER statisch. Der Unterschied zwischen statisch und dynamisch liegt darin, dass statische Variablen in einem Speichermodell (fast) immer die gleiche Adresse einnehmen, während dynamische Variablen auf dem Stack abgebildet werden und nach Verlassen der Funktion nicht mehr sichtbar sind.

    Man kann in der Schnittstellendefinition eines FCs auch das Schlüsselwort VAR verwenden, was zu der Annahme verleitet, man könne statische Variabel anlegen. Die Annahme ist schlicht weg falsch! Bei der Übersetzung des FCs werden die Variablen, die hinter VAR definiert wurden, implizit zu dynamischen Variablen gewandelt, die normalerweise hinter dem Schlüsselwort VAR_TEMP definiert werden!

    Verschiedene Instanzen des gleichen FCs können explizit auf unterschiedliche den jeweiligen Instanzen zugeordnete globale Variablen zugreifen, wenn dies beim Aufruf des FCs durch Parameterübergabe bekannt gemacht wird, dazu gibt es verschiedene Möglichkeiten, eine davon hatte ich schon einmal weiter oben beschrieben.

    Ich nehme mal an, dass die die Daten deines Projektes wirklichen globalen Charakter haben, dann sollten diese auch in einem GLOBALEN Datenbaustein abgelegt werden. Die Tatsache, dass ein Instanz-DB natürlich auch einen globalen Charakter hat, sollte dich nicht dazu verleiten, die dort gespeicherten Daten im wirklichen globalen Sinne zu verwenden und zu manipulieren. Das ist was für Trickser und man sollte auch an die Menschen denken, die vielleicht einmal ein solches Programm warten müssen. Ich habe für mich die Regel aufgestellt, die Daten eines Instanz-DBs nur lokal innerhalb des FBs anzuwenden, dem diese zugeordnet sind. Und das deshalb weil es mit großem Ärger verbunden sein kann, wenn man die Schnittstelle des FBs ändert und dabei vergisst ggf. das Programm in dem FB entsprechend anzupassen.

    Gruss Barnee

  2. #12
    Registriert seit
    30.09.2005
    Beiträge
    33
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    @Barnee
    Ja, vielen Dank nochmal für die umfangreiche Erklärung. Zottel hatte mir vor einigen Tagen schonmal statische Variablen & Co. erklärt, aber nicht ganz so ausführlich. Deine Erklärung hat mich bestätigt, dass ich das zumindest schon verstanden hatte. Jetzt sehe ich klar und wie weiter oben schon beschrieben wird für mein Projekt das Erstellen eines globalen DB ausreichend sein.
    Bin irgendwie auf die Instanzen und FBs gekommen, weil ich das genau anders verstanden hatte, nämlich dass sich mehrere FB´s einen DB teilen und nicht eine FB auf unterschiedliche Instanzen (Multiinstanzen) zugreifen kann. Jetzt ist mir das aber eingeleuchtet, (gerade auch durch deine Erklärung) wo der Sinn und Zweck hinter diesen Multiinstanzen stehen.
    Schönes Wochenende!

  3. #13
    Registriert seit
    28.10.2005
    Ort
    Ottweiler, Saar
    Beiträge
    940
    Danke
    259
    Erhielt 124 Danke für 109 Beiträge

    Standard

    @Barnee
    In C-Funktionen gibt es natürlich statische Variablen:
    zb:
    Code:
    int nextvalue(void)
    {
      static int value;
      return value++;
    }
    Zitieren Zitieren static in C  

  4. #14
    Anonymous Gast

    Standard

    @argv_user

    Erwischt! Du hast recht, das hatte ich schon vergessen, da ich kein Freund von in einer Funktion deklarierten statischen Variablen bin. Mein Prinzip: so wenig wie möglich globale Variablen und Funktionen nur so viel wie nötig spezialisieren. Aber dieser Typ der statischen Variablen ist mit dem "ähnlichen" Typ auf der S7 nicht vergleichbar, da in C eine solche Funktion meist auf einen Anwendungsfall spezialisiert wird, was bei einem S7-FB "normalerweise" nicht der Fall sein sollte.
    1:0 für dich.

    Gruß Barnee

  5. #15
    Registriert seit
    14.10.2005
    Beiträge
    137
    Danke
    3
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Hall o,

    das ist eigentlich ein typischer Fall für Multiinstanzen. Du erstellst einen FB2, und deklarirest eine Variable vom Typ "FB1", und alle Variablen die du halt im FB2, aber nicht im FB1 brauchst.. Der FB2 wird z.B. vom OB 1 aufgerufen und in dem InstantzDB von FB2 stehen alle Variablen die du deklariert hast, plus den Variablen von FB1.

    Torsten

  6. #16
    Anonymous Gast

    Standard

    @Torsten05

    Ein echter Fall für Multiinstanzen? Wirklich? Ich würde an deiner Stelle noch mal nachlesen:
    http://www.automation.siemens.com/do.../S7_gs.pdf?p=1

  7. #17
    Registriert seit
    14.10.2005
    Beiträge
    137
    Danke
    3
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Hallo,

    also ich weiss ja nicht was er mitlerweile macht, aber ich habe es so verstanden das er fbs mit unterschiedlichen Instanzen aufrufen möchte, aber in einem Baustein arbeitet, indem er zwar die Variablen der Instanzen braucht, aber nicht umgekehrt. Wofür das nun auch sein soll ist mir erstmal egal. Er würde jedenfalls im FB2 die Instanz vom FB1 stehen haben, plus der zusätzlichen Variablen die er gerne hätte. Natürlich würde das auch mit nem globalem gehen, aber genau für diesen Fall ist doch wohl die Multiinstanz geschafffen oder wofür nutzt man die sonst?

    Torsten

  8. #18
    Anonymous Gast

    Standard

    @Torsten05
    Zum ersten wäre doch mal die Frage zu beantworten: Was steht in einem Instanz-DB? Auf einen einfachen Nenner gebracht: Ein Instanz-DB spiegelt die Schnittstelle zu einem FB wieder.
    Ein FB beinhaltet normalerweise einen Algorithmus, der mehrfach angewendet werden soll. Wird ein und der gleiche FB n mal angewendet, dann wären "normalerweise" n mal verschiedene Instanz-DBs erforderlich.
    Annahme: eine FB mit dem Objektnamen FB1 soll 5 mal angewendet werden, dann wären z.B. die Instanz-DBs DB1...DB5 zu projektieren, wobei die Objektnamen (DB1...DB5) willkürlich gewählt werden können. Kommt jetzt noch z.B. ein zweiter FB namens FB2 dazu, der ebenfalls 5 mal angewendet werden soll, dann wären weitere 5 Instanz-DBs fällig, die der Schnittstellenbeschreibung des FB2 entsprechen. Damit würde sich dieser Mechanismus zu einem Resourcenfresser entwickeln.

    Der Ausweg aus dem Dilemma verspricht das Zauberwort Multiinstanzen. Man kreiert einen übergeordneten FB (z.B. FB10), dem natürlich auch ein Instanz-DB an die Seite gestellt werden muss. Jetzt kann man innerhalb des übergeordneten FB10 die bereits oben erwähnten FBs (hier FB1 bzw. FB2) beliebig oft anwenden, ohne für diese entsprechende Instanz-DBs zu projektieren, dies gilt aber nur dann, wenn die jeweilige Instanz des FB1 bzw. des FB2 in der Schnittstelle des übergeordneten FB10 angegeben wird. Wird wie in der obigen Annahme der FB1 5 mal angewendet, so sind 5 Einträge in der Schnittstelle des übergeordneten FB10 erforderlich. In den Distanz-DB des übergeordneten FB10 werden die Schnittstellenbeschreibungen aller eingeschlossenen FBs übernommen, sofern auf diese eingeschlossenen FBs in der Schnittstellenbeschreibung des übergeordneten FB10 die Verweise eingetragen wurden. In einem Multiinstanz-DB wird genau n mal die Schnittstellenbeschreibung eines FBs eingetragen, wenn n Instanzen dieses FBs eingeschlossen sind.

    Er würde jedenfalls im FB2 die Instanz vom FB1 stehen haben, plus der zusätzlichen Variablen die er gerne hätte. Natürlich würde das auch mit nem globalem gehen, aber genau für diesen Fall ist doch wohl die Multiinstanz geschafffen oder wofür nutzt man die sonst?
    Die Instanz-DBs werden von der IDE angelegt, in Step7 V5.3 (ich nehme an, früher auch schon nicht, hab's nie probiert) sind diese nicht editierbar und entziehen sich somit dem Manipulationswunsch eines Programmierers. Wird die Schnittstelle eines FBs geändert, so muss(müssen) der(die) Instanz-DB(s) NEU angelegt werden. Damit ist eine "missbräuchliche" Verwendung ausgeschlossen.

  9. #19
    Registriert seit
    14.10.2005
    Beiträge
    137
    Danke
    3
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Hallo,

    ich kann da immer noch keinen Widerspruch zu meinen Aussagen sehen. Die Multiinstanz macht das, was er IMO! machen möchte. Ob er nun den FB1 1 oder 12 mal aufruft ist egal. Es ist auch egal ob Siemens das ganze nur für n Aufrufe von FB 1 vorgesehen hat. Step7 meckert zum Glück nicht wenn man die Möglichkeiten nicht für die Zwecke nutzt für die es gedacht war. Er erreicht jedenfalls das was er IMO möchte. Aber vielleicht habe ich den ersten Beitrag nur nicht richtig verstanden. Keinen Ahnung...

    Torsten

  10. #20
    Anonymous Gast

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Torsten05

    Die Struktur eines Instanz-DB wird von der IDE angelegt und entzieht sich somit zusätzlichen Gestaltungswünschen des Programmierers. Man kann nur indirekt die Struktur eines Instanz-DB beeinflußen, nämlich bei der Schnittstellenbeschreibung eines FBs.

    Nehmen wir mal an, es würden zwei unterschiedliche Algorithmen existieren, der erste wäre im FB1 und der zweite im FB2 verpackt. Jetzt würde der FB10 gestaltet, in dem zuerst der FB1 und danach der FB2 aufgerufen werden soll. In der Schnittstelle des FB10 werden die Instanzen des FB1 und FB2 bekanntgegeben. Die IDE legt dann die Struktur des Instanz-DBs fest, der für den FB10 eingerichtet werden muß, dabei werden die Schnittstellenbeschreibungen für den FB1 und FB2 auf unabhängige Datenpunkte gelegt.

    Nehmen wir weiter an, es wäre in dem obigen Beispiel beabsichtigt, über statische Variablen Ergebnisse auszutauschen. So würde z.B. hinter VAR im FB1 z.B. die Variable "XYZ_von_FB1" eingerichtet, in der ein Ergebnis gespeichert werden soll, das vom Algorithmus des FB1 geliefert wird. So kann man vom FB2 aus auf diese Variable zugreifen. FB2 ist in diesem Falle spezialisiert, was bedeutet, dass von FB2 keine weitere unabhängige Instanz mehr angewendet werden kann.

    Eine andere Variante wäre, den Austausch von Daten bei der Schnittstellenbeschreibung der Bausteine FB1 und FB2 durch entsprechende Ausgänge bzw. Eingänge zu berücksichtigen, sowie in der Schnittstellenbeschreibung des FB10 die erforderlichen statischen Variablen anzulegen, z.B. "XYZ_von_FB10". FB1 sollte dann ein Ergebnis liefern, das von FB1 über einen entsprechenden Ausgang in der Variablen "XYZ_von_FB10" abgelegt wird. FB2 liest über einen entsprechenden Eingang den Inhalt von "XYZ_von_FB10" und wendet die Date weiter an. Nehmen wir mal weiter, an FB1 und FB2 würden wegen dieser hier beschriebenen Möglichkeit des Datenaustauschs selbst KEINE statischen Variablen mehr benötigen (temporäre Zwischenergebnisse bedingen nicht die Notwendigkeit von statischen Variaben), so ergibt sich sofort die Möglichkeit die Algorithmen von FB1 und FB2 in FCs zu verpacken, womit zumindest für diese Ebene sofort die Notwendigkeit von Instanz-DBs entfällt!!!!!!! Da der FB10 nur die äußere Schale darstellt, um jeweils eine Instanz von nunmehr FC1 und FC2 anzuwenden, hat die Variable "XYZ_von_FB10" nur noch eine temporäre Bedeutung, was sie ohne hin bisher auch nur hatte! Aber hallo, dann kann ja der ganze Mechanismus des FB10 auch mit einem FC10 realisiert werden, aus "XYZ_von_FB10" wird "XYZ_von_FC10" und ist eine temporäre Variable, die auf dem Stack abgelegt wird und SCHWUPPS: jetzt haben sich allen Notwendigkeiten von Instanz-DBs in Luft aufgelöst.

    Gruß Barnee

Ähnliche Themen

  1. Allgemeines zu Multiinstanzen
    Von MikeJ im Forum Simatic
    Antworten: 25
    Letzter Beitrag: 06.01.2011, 18:04
  2. Instanzen
    Von Deep Blue im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 09.10.2008, 11:00
  3. Multiinstanzen in GRAPH?
    Von derbenny im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 23.09.2007, 19:05
  4. Multiinstanzen
    Von uwme2002 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 30.06.2006, 06:52
  5. Multiinstanzen
    Von Anonymous im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 08.01.2005, 11:21

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •