TIA TIA V13 Querverweise von statischen FB-Variablen

Fluffi

Level-2
Beiträge
532
Reaktionspunkte
88
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss gerade ein altes TIA V13 Projekt bearbeiten und habe Probleme mit der Anzeige der Querverweise von Variablen, wenn diese statische Variablen von FBs sind.
Wenn ich im FB die Querverweise der entsprechenden Variablen mir anzeigen lasse, dann werden nur die Zugriffe innerhalb des FBs angezeigt. Wenn ich die Querverweisliste an der entsprechende Verwendungsstelle der Variablen im restlichen Programm mir anzeige oder über den Instanz-DB gehe, dann erscheinen nur Querverweise außerhalb des FBs, aber nicht im FB wo die Variable z.B. beschrieben wird.
Das Projekt ist kompiliert und es betrifft alle Instanz Variablen auf die gleiche Art. In anderen TIA Versionen ist dies nicht so. Dort werden alle Zugriffe korrekt dargestellt. Das gleiche Projekt hochgerüstet zeigt mir die korrekte Querverweisliste an.
Mir geht es darum einfach schnell zu der Stelle im Programm zu springen an der zB eine statische Variable eines Instanz-DBs im FB beschrieben wird. Ohne korrekte Querverweisliste muss ich leider händisch alle NW absuchen.
War die Querverweisgenerierung in V13 noch nicht so ganz praktikabel oder mache ich hier irgendwas falsch? Kann man das evtl. einstellen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mir geht es darum einfach schnell zu der Stelle im Programm zu springen an der zB eine statische Variable eines Instanz-DBs im FB beschrieben wird. Ohne korrekte Querverweisliste muss ich leider händisch alle NW absuchen.

Das ist auch mit ein Grund warum man tunlichst auf Globale Zugriffe auf Instanzvariablen verzichten sollte.

War die Querverweisgenerierung in V13 noch nicht so ganz praktikabel oder mache ich hier irgendwas falsch? Kann man das evtl. einstellen?

Geht das denn in V17 oder V18?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok, alles klar, dann werde ich wohl damit leben müssen. Ein Upgrade zumindest auf V14 kann ich leider nicht machen. Will mir nicht noch irgendwelche unbekannten Bugs und Probleme mit ins Boot holen.

Aber warum sollte man auf Instanzvariablen keine globalen Zugriff machen sollen. Dafür sind sind sie u.a. da.
 

Anhänge

  • 1686560065461.png
    1686560065461.png
    65,5 KB · Aufrufe: 15
das bezieht sich aber auf den Schreibzugriff. Da ist die Problematik schon klar. Aber warum sollte man nur für den Lesezugriff zusätzlich zum Instanz-DB die entsprechenden Variablen nochmals in einem separaten DB ablegen? Siemens macht es in seinen eigenen Programm Beispielen meist auch nicht so.

Wenn ich zB einen Instanz-DB eines Antriebes habe, dann stehen dort die entsprechenden Daten des Antriebs drin wie zB Ist-Position etc. Natürlich greife ich da lesend drauf zu und kopiere das doch nicht nochmal in lokale DBs. Das führt das Prinzip eines FBs ad absurdum.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
das bezieht sich aber auf den Schreibzugriff. Da ist die Problematik schon klar. Aber warum sollte man nur für den Lesezugriff zusätzlich zum Instanz-DB die entsprechenden Variablen nochmals in einem separaten DB ablegen? Siemens macht es in seinen eigenen Programm Beispielen meist auch nicht so.

Wenn ich zB einen Instanz-DB eines Antriebes habe, dann stehen dort die entsprechenden Daten des Antriebs drin wie zB Ist-Position etc. Natürlich greife ich da lesend drauf zu und kopiere das doch nicht nochmal in lokale DBs. Das führt das Prinzip eines FBs ad absurdum.
Führt es nicht. Der Styleguide gibt ja auch an dass man FBs per Multiinstanz aufruft im Aufruf FB und diese sind dann nun mal im statischen Bereich, das ist quasi der Arbeitsbereich für die Funktion, alles was ich weiterhin verwenden möchte lege ich mir definiert nach außen zum weiterverarbeiten. Sonst hab ich alle InstanzDBs rumfliegen und mein Programm mir nur unnötig im Baum vergrößert und muss mir noch komplizierter meine Daten suchen.
 
Natürlich greife ich da lesend drauf zu und kopiere das doch nicht nochmal in lokale DBs. Das führt das Prinzip eines FBs ad absurdum.
Weißt Du und der FB denn, wann genau auf die lokalen Daten der Instanz von außen zugegriffen wird, z.B. von der azyklischen HMI-Kommunikation? Vor, während oder nach der Ausführung der Instanz? Der Zugreifer könnte inkonsistente Daten lesen.
Durch das explizite Kopieren in einen globalen Speicher erhältst Du quasi ein konsistentes "Prozess"-Abbild der Daten. Der Kopie der Daten macht es außerdem weniger aus, wenn da versehentlich Schreibzugriffe stattfinden. Ungewollte oder unsachgemäße Schreibzugriffe auf die lokalen Daten können das SPS-Programm beeinflussen zu Fehlfunktionen bis hin zum STOP der CPU. Sie können auch die generelle Fähigkeit von Programmänderungen im RUN zunichte machten, wenn Programmänderungen nicht im selben Zykluskontrolpunkt eingekettet werden. Solche (egal wie unwahrscheinlichen) Risiken muß man nicht ohne Not eingehen, und schon gar nicht aus Bequemlichkeit.

Harald
 
Ich erinnere mich hier immer wieder an die Sucosoft, die ich vor 20 Jahren als besonders normkonform empfand:
Dort war ein Zugriff auf FB-Instanzvariablen von außen gar nicht möglich. Und jede globale Variable, die innerhalb eines FB benutzt wurde, wurde innerhalb des FB noch einmal explizit als var global deklariert.

Bis heute halte ich dieses Kreuz-und-quer-schreibn-dürfen für einen Siemens-Fehler. Zugegeben, ein manchmal recht praktischer.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Interessante Diskussion :)
Warum will man von aussen auf Instanz-Daten zugreifen?
Weil in der Instanz Daten vorhanden sind, die ich im restlichen Programm brauchen kann.
Reich ich sie über die Bausteinschnittstelle weiter, dann hab ich doppelte Arbeit und oft auch doppelte Daten.
Also wäre es ja schon ganz praktisch das Alles zusammen zu fassen.

So und jetzt werfe ich mal das böse Wort Objektorientierung in den Raum.
Gäbe es bei den FBs zusätzlich die Möglichkeit Instanzdaten als Public / Private / ReadOnly zu deklarieren, dann wäre ein Instanzzugriff schon gar nicht mehr so böse. ;)
Die Querverweise auf Instanzdaten funktionieren ja schon (zumindest meistens). Mit den Aufrufpfaden bei Status ist es ähnlich.

Würde am jetzt noch zusätzlich Klassen / Objekte einführen, dann könnte man auch sauber strukturieren.

Wenn man sich heute anschaut was manche über die Bausteinschnittstellen schieben, dann wär es wahrscheinlich übersichtlicher.
Muss man sich durch 7 parametrisierte Bausteinaufrufe durchbeissen bis man endlich zum Motorschütz kommt, dann wird es mit OOP sicher auch nicht schlimmer. ;)
 
Interessante Diskussion :)
Warum will man von aussen auf Instanz-Daten zugreifen?
Weil in der Instanz Daten vorhanden sind, die ich im restlichen Programm brauchen kann.
Reich ich sie über die Bausteinschnittstelle weiter, dann hab ich doppelte Arbeit und oft auch doppelte Daten.
Also wäre es ja schon ganz praktisch das Alles zusammen zu fassen.

So und jetzt werfe ich mal das böse Wort Objektorientierung in den Raum.
Gäbe es bei den FBs zusätzlich die Möglichkeit Instanzdaten als Public / Private / ReadOnly zu deklarieren, dann wäre ein Instanzzugriff schon gar nicht mehr so böse. ;)
Die Querverweise auf Instanzdaten funktionieren ja schon (zumindest meistens). Mit den Aufrufpfaden bei Status ist es ähnlich.

Würde am jetzt noch zusätzlich Klassen / Objekte einführen, dann könnte man auch sauber strukturieren.

Wenn man sich heute anschaut was manche über die Bausteinschnittstellen schieben, dann wär es wahrscheinlich übersichtlicher.
Muss man sich durch 7 parametrisierte Bausteinaufrufe durchbeissen bis man endlich zum Motorschütz kommt, dann wird es mit OOP sicher auch nicht schlimmer. ;)
Wo muss man sich denn durchbeissen? Entweder man verwendet harte E/As oder selbst wenn noch mal umgelegt auf eine Funktion, dann gibts eben einen DB_Outputs und da findest du direkt über den Qverweis dein Schütz, ansonsten findest du über die Struktur auch den Aufruf.. das Layering sorgt für mehr Lesbarkeit, mehr als wenn irgendwo InstanzDBs rumfliegen und du trotzdem genauso den Weg gehen würdest bis zum Aufruf
 
Weißt Du und der FB denn, wann genau auf die lokalen Daten der Instanz von außen zugegriffen wird, z.B. von der azyklischen HMI-Kommunikation? Vor, während oder nach der Ausführung der Instanz? Der Zugreifer könnte inkonsistente Daten lesen.
Durch das explizite Kopieren in einen globalen Speicher erhältst Du quasi ein konsistentes "Prozess"-Abbild der Daten. Der Kopie der Daten macht es außerdem weniger aus, wenn da versehentlich Schreibzugriffe stattfinden. Ungewollte oder unsachgemäße Schreibzugriffe auf die lokalen Daten können das SPS-Programm beeinflussen zu Fehlfunktionen bis hin zum STOP der CPU. Sie können auch die generelle Fähigkeit von Programmänderungen im RUN zunichte machten, wenn Programmänderungen nicht im selben Zykluskontrolpunkt eingekettet werden. Solche (egal wie unwahrscheinlichen) Risiken muß man nicht ohne Not eingehen, und schon gar nicht aus Bequemlichkeit.

Harald
Es geht nur um Lesezugriffe. Die Problematik bei Schreibezugriffen ist klar und hier nicht das Thema. Es gibt schlicht und ergreifend keinen Unterschied, ob man im SPS Programm einen Wert aus dem Instanz-DB oder aus einer Kopie davon ausliest.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht nur um Lesezugriffe. Die Problematik bei Schreibezugriffen ist klar und hier nicht das Thema. Es gibt schlicht und ergreifend keinen Unterschied, ob man im SPS Programm einen Wert aus dem Instanz-DB oder aus einer Kopie davon ausliest.
Es macht durchaus einen Unterschied. Der kommuniziert werden muss, insbesondere wenn verschiedene Personen zusammenarbeiten.
Wenn ich einen FB baue, lege ich kein Augenmerk darauf ob Instanz Daten für externe Zugriffe (sei es nun lesend oder schreibend) konsistent sind.
Beispiel. Ich setze und rücksetze oder berechne eine Variable mehrmals in diesem Baustein in einem Zyklus. Und kopiere am Schluss auf eine Ausgangsvariable. Dann hat die Ausgangsvariable den Wert den ich dafür bedacht habe. Der zwischenspeicher ändert sich aber möglicherweise während des Aufrufs diverse Male, es ist also absoluter Zufall wo ein externer Zugriff insbesondere durch ein HMI stattfindet und welches Resultat dann angezeigt wird.
 
Es gibt schlicht und ergreifend keinen Unterschied, ob man im SPS Programm einen Wert aus dem Instanz-DB oder aus einer Kopie davon ausliest.
Das ist nicht richtig. Wenn die Bearbeitung der Instanz und das Auslesen in verschiedenen Task liegen und eine Task die andere Task unterbrechen kann, dann macht das sehr wohl einen Unterschied. Z.B. wenn man eine Regelung in einem Weckalarm (OB3x) ausführt und das normale Programm im OB1 liest direkt aus dem Instanz-DB des Regelprogramms, oder umgekehrt der Unterbrecher liest direkt Lokaldaten des unterbrochenen Programms.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist nicht richtig. Wenn die Bearbeitung der Instanz und das Auslesen in verschiedenen Task liegen und eine Task die andere Task unterbrechen kann, dann macht das sehr wohl einen Unterschied. Z.B. wenn man eine Regelung in einem Weckalarm (OB3x) ausführt und das normale Programm im OB1 liest direkt aus dem Instanz-DB des Regelprogramms, oder umgekehrt der Unterbrecher liest direkt Lokaldaten des unterbrochenen Programms.

Harald
kannst du das präzisieren und genau beschreiben wo hier nun der konkrete Unterschied zum Auslesen aus einer Kopie der Daten aus einem lokalen DB ist.
 
kannst du das präzisieren und genau beschreiben wo hier nun der konkrete Unterschied zum Auslesen aus einer Kopie der Daten aus einem lokalen DB ist.
siehe den Beitrag genau davor von vollmi:
Beispiel. Ich setze und rücksetze oder berechne eine Variable mehrmals in diesem Baustein in einem Zyklus. Und kopiere am Schluss auf eine Ausgangsvariable. Dann hat die Ausgangsvariable den Wert den ich dafür bedacht habe. Der zwischenspeicher ändert sich aber möglicherweise während des Aufrufs diverse Male, es ist also absoluter Zufall wo ein externer Zugriff insbesondere durch ein HMI stattfindet und welches Resultat dann angezeigt wird.
 
siehe den Beitrag genau davor von vollmi:
Der bezieht sich auf mehrfach geänderte interne Berechnungswerte während der FB-Asuführung. Es ist offensichtlich, dass hier ein azyklischer Zugriff nicht zielführend ist.
Wenn am Ende eines FBs in den entspr. Instanz-DB-Bereich Werte für den lesenden Austausch mit anderen Programmteilen geschrieben werden, worin besteht nun der Unterschied dazu, wenn nach der Ausführung des FBs, die gleichen Werte nochmal an einen lokalen DB übergeben werden? Ich konnte in dem Thread bisher keine technische Erklärung finden.
 
Zurück
Oben