TIA Die (neuen?) Zeiger

Mephisto

Level-1
Beiträge
242
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich habe eine Frage zu Zeigern:
Ich möchte in einer SCL-Funktion auf den Static-Bereich eines SCL-Funktionsbausteins zugreifen. Dazu möchte ich den Instanz-DB des FBs symbolisch an den FC übergeben. Also nur den DB-Namen, keinen Eintrag daraus.

Geht das überhaupt? Wenn ja, wie?:confused:

Hab mich in die Materie mit Variant, Any, Pointer, Peek & Poke etwas eingelesen.
Variant verwende ich. Pointer und Any kann ich (glaube ich) nicht verwenden, da ich ja nicht absolut adressiere. Der Sinn von Peek & Poke erschließt sich mir bis dato noch nicht.
 
Moin,
Also du kannst deinen FB als In/Out deinem FC übergeben und dann in deinem FC damit arbeiten. Außen an deinem FC übergibst du dann einfach den IDB deines FBs.
Uebergabe-Instanz.jpg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mittlerweile (ab V14) gibt es die Möglichkeit eine Parameterinstanz zu übergeben. An einem INOUT eines FC oder FB kann nun eine Instanz übergeben und manipuliert werden.
Das Ganze funktioniert symbolisch und meiner Meinung nach auch eine saubere Lösung.
Einfach mal Parameterinstanz in der Hilfe eingeben.
 
Ich möchte in einer SCL-Funktion auf den Static-Bereich eines SCL-Funktionsbausteins zugreifen. Dazu möchte ich den Instanz-DB des FBs symbolisch an den FC übergeben. Also nur den DB-Namen, keinen Eintrag daraus.
Gaaanz schlechter Programmierstil! (sowas darf nur Siemens ;)) Vergiß das lieber.

Meine Glaskugel meint, daß Du vermutlich eine S7-1500 programmierst? Da geht Dein Vorhaben nur übelst unsauber über absolute Adresszugriffe - was bei "optimierten" FB-Instanzen schon mal gar nicht geht. Im FC symbolisch auf äußere Strukturen zugreifen geht nur, wenn dem FC die Struktur erklärt wird - also wenn eine Struktur oder UDT an den FC übergeben wird. Man kann aber keine FB-Struktur an FC übergeben - deshalb geht auch kein symbolischer Zugriff auf die FB-Struktur im FC.

Bessere Lösung: deklariere in Deinem FB in Output oder Static eine Struktur für genau den gewünschten Datenaustausch mit dem FC und übergib dem FC diese Struktur über einen InOut.

Nachtrag: TIA V14 kenne ich nicht. Wenn die Übergabe der FB-Instanz da geht, dann ist es doch möglich - die Lösung finde ich aber trotzdem nicht OK. Dann sind Lese- und Schreibzugriffe auf die komplette Instanz von außen nur von der Disziplin (und Faulheit) des Programmierers abhängig, und der kann man bei dem durchschnittlichen Können der Programmierer nicht trauen. Oder gibt es in V14 auch Attribute für die Instanzvariablen, die die Zugriffsmöglichkeiten von außen regeln?

Harald
 
Zuletzt bearbeitet:
Hallo!

Der Zugriff auf den Static-Bereich des FBs über einen Struct ist der Weg, den ich momentan eingeschlagen habe. Dadurch, dass den Baustein aber auch unerfahrene Kollegen beschalten sollen, wäre es einfacher, nur den iDB angeben zu müssen.
Das Beispiel von Howard sieht für mich schon sehr nach symbolischer Adressierung aus. (Hatte aber noch keine Zeit dass zu testen.)
Außerdem schau ich ja nur auf einen Speicherbereich. Sollte doch egal sein, ob ich z.B.: 4Byte ause einem 20Byte iDB oder 4Byte aus einem 40.000Byte iDB lese, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Obwohl das von mir beschriebene funktioniert

Gaaanz schlechter Programmierstil! (sowas darf nur Siemens ;)) Vergiß das lieber.
hat Harald damit natürlich Recht.
Und da das:
Oder gibt es in V14 auch Attribute für die Instanzvariablen, die die Zugriffsmöglichkeiten von außen regeln?
leider noch nicht möglich ist, würde ich auch zu Haralds Vorschlag:

Bessere Lösung: deklariere in Deinem FB in Output oder Static eine Struktur für genau den gewünschten Datenaustausch mit dem FC und übergib dem FC diese Struktur über einen InOut.
tendieren.
Nur weil etwas geht muss man das nicht zwingend einsetzen. Deine Kollegen werden eine saubere Datenübergabe sicher besser nachvollziehen können.
 
Ich möchte an dieser Stelle GANZ DEUTLICH die Anmerkungen von Harald und Howard unterstützen !!!
Klar kann man nach Belieben in der Instanz eines FB von Aussen herummachen. Das geht wie verrückt. Aus meiner Sicht ist das DIE Form eines Know-How-Schutzes - wenn man das richtig "gut" macht dann ist das Programm dadurch schon fast geschützt weil irgendwann niemand mehr da durch blickt, weil man z.B. nicht mehr weiß wer wann welche Variable manipuliert hat.
Richtig ist : das was ein FB aus seinen Instanzdaten der Aussenwelt mitzuteilen hat oder von der Aussenwelt erfahren will wird über die Baustein-Schnittstelle übergeben. Sollen oder müssen hier richtig viele Informationen übergeben werden (ggf. Strukturen) das ist das ein Anzeichen dafür, dass möglicherweise in der Konzeption des Programms schon etwas falsch läuft ...

Gruß
Larry
 
OK, ihr habt mich überzeugt. Ich bleibe bei meiner Lösung und verweise lediglich auf ein STRUCT im iDB.
Hat es hier Vor- oder Nachteile, wenn der STRUCT im Static oder im InOut liegt?
Der Übersichtlichkeit halber sollte er ja im InOut liegen, aber dann kommt wieder jemand auf die glorreiche Idee, da was anzuschließen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
InOut wäre einleuchtend, geht aber leider nicht, weil die Struktur dann nicht im IDB liegt sondern nur ein Pointer auf einen äußeren Speicherplatz, der beim FB-Aufruf angeschlossen werden muß.

Die Struktur kann nur in Input, Output oder Static liegen.

Wenn schon Zugriffe auf die Static-Instanzdaten, dann bitte in deutlich dokumentierte Bereiche:
Code:
VAR [COLOR="#008000"]//Static[/COLOR]
  Exchange_1 : Struct [COLOR="#008000"]//Übergabebereich FCxxx (anstatt Struct besser einen UDT nehmen)[/COLOR]
    Par : Struct        [COLOR="#008000"]//Parameter zu FC[/COLOR]
      Var_1 : Real;
    END_STRUCT;
    Ret : Struct        [COLOR="#008000"]//Rückgaben von FC[/COLOR]
      Var_1 : Real;
    END_STRUCT;
    IO : Struct         [COLOR="#008000"]//InOut mit FC[/COLOR]
      Var_1 : Real;
    END_STRUCT;
  END_STRUCT;

  HMI : Struct        [COLOR="#008000"]//HMI-Variablen: HMI greift direkt darauf zu![/COLOR]
    In : Struct
      Var_1 : Bool;
    END_STRUCT;
    Out : Struct
      Var_1 : Word;
    END_STRUCT;
    IO : Struct
      Var_1 : Int;
    END_STRUCT;
  END_STRUCT;

  Private : Struct    [COLOR="#008000"]//ab hier die privaten Instanzdaten - bitte keine Zugriffe von außen![/COLOR]
    Var_1 : Int;
    ...
  END_STRUCT;
END_VAR
An einen FC-InOut könnte man dann die Struktur "myInstance123".Exchange_1 übergeben.
Die Exchange-Struktur besser als UDT deklarieren, dann ist sie im FB und im FC einfacher exakt gleich deklariert.


Da war doch noch was ... kann man in TIA nicht bei FB einzelne Input/Output verbergen/ausblenden?

Harald
 
OK, ihr habt mich überzeugt. Ich bleibe bei meiner Lösung und verweise lediglich auf ein STRUCT im iDB.
Hat es hier Vor- oder Nachteile, wenn der STRUCT im Static oder im InOut liegt?
Der Übersichtlichkeit halber sollte er ja im InOut liegen, aber dann kommt wieder jemand auf die glorreiche Idee, da was anzuschließen...

Wieso nicht eine Parameterinstanz ? Der beschriebene Anwendungsfall passt genau.
Das die Instanz an einem INOUT übergeben macht die Sache übersichtlich, logisch und Querverweißfähig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da bekommt man aber höchstens den Querverweis, daß der gesamte IDB verwendet ist, aber keinen Hinweis, auf welche Variablen darin und ob R/W. Oder?
Da ist ein Querverweis zur Verwendung der Instanz-Teilstruktur viel aussagekräftiger.

Harald

Nein es werden die verwendeten Variablen der verwendeten Instanz angezeigt. Es gibt also saubere Querverweise.
Ob gelesen oder geschrieben wird steht in der Spalte Zugriff.
 
Zurück
Oben