Step 7 Variablen

Neurorancer

Level-2
Beiträge
572
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

es geht allgemein um Variablen welche in einem Projekt verwendet werden.

Habe ich es richtig verstanden, dass zu einem Funktionsbaustein (FB) ein Datenbaustein (DB) gehört.

In diesem Datenbaustein werden Statische Variablen abgelegt, welche im FB verwendet werden.

Die Werte der statischen Variablen gehen nach mehreren Programmzyklen nicht verloren, es sein denn sie werden durch das Programm verändert.

Wenn man FB1 - DB1 und FB2 -DB2 hat, kann FB1 auf DB2 zugreifen und Werte ändern.

Dann gibt es noch die globalen Variablen (PLC-Variablen). Diese sind auch aus jeder FB/FC erreichbar und änderbar.

Richtig?


Warum ich das ganze frage: Ich habe vor ein paar Funktionen zu schreiben.
Eine Funktion (read_inputs) soll die Eingänge der SPS einlesen und globale Input-Merker setzen.
Die Input-Merker sollen allen Funktionen zur Verfügung stehen.
Da die Funktion read_inputs zyklisch erfolgt, sind globale Input-Merker immer auf dem neusten stand.

dementsprechend gibt es dann auch eine set_outputs Funktions. Diese beschreibt die Ausgänge der SPS nach den Output-Merkern
welche im Programm in der Funktion verarbeitung gesetzt werden.

Die Statischen Variablen sollten also die Variablen sein, welche nur die Funktion selber intern benötigt.

Richtig?

Bei den Variablen welche zwischen den Funktionen ausgetauscht werden sollen kann man auch globale variablen benutzen richtig?
 
Guten Tag,

es geht allgemein um Variablen welche in einem Projekt verwendet werden.

Habe ich es richtig verstanden, dass zu einem Funktionsbaustein (FB) ein Datenbaustein (DB) gehört.

JA

In diesem Datenbaustein werden Statische Variablen abgelegt, welche im FB verwendet werden.

Nicht nur diese, sondern auch In's, Out's, InOut's, etc.

Die Werte der statischen Variablen gehen nach mehreren Programmzyklen nicht verloren, es sein denn sie werden durch das Programm verändert.

Korrekt!

Wenn man FB1 - DB1 und FB2 -DB2 hat, kann FB1 auf DB2 zugreifen und Werte ändern.

Theoretisch möglich, sollte man aber tunlichst UNBEDINGT vermeiden.

Dann gibt es noch die globalen Variablen (PLC-Variablen). Diese sind auch aus jeder FB/FC erreichbar und änderbar.

Richtig?
Wenn Du Global-DB's oder Merker meinst, ja.

Warum ich das ganze frage: Ich habe vor ein paar Funktionen zu schreiben.
Eine Funktion (read_inputs) soll die Eingänge der SPS einlesen und globale Input-Merker setzen.
Die Input-Merker sollen allen Funktionen zur Verfügung stehen.
Da die Funktion read_inputs zyklisch erfolgt, sind globale Input-Merker immer auf dem neusten stand.

dementsprechend gibt es dann auch eine set_outputs Funktions. Diese beschreibt die Ausgänge der SPS nach den Output-Merkern
welche im Programm in der Funktion verarbeitung gesetzt werden.

Soll das eine universelle Schnittstelle der Peripherie zu einem (immer gleichen) Programm werden? Wenn ja, würde ich das vermeiden. (Es gibt aber auch Leute, die das gut finden, ich zähle da nicht dazu!)

Die Statischen Variablen sollten also die Variablen sein, welche nur die Funktion selber intern benötigt.

Richtig?

Die Instanzvariablen, also auch die statischen sollte nur der Funktionsbaustein selbst beschreiben.

Bei den Variablen welche zwischen den Funktionen ausgetauscht werden sollen kann man auch globale variablen benutzen richtig?

Ja

Siehe oben
 
Habe ich es richtig verstanden, dass zu einem Funktionsbaustein (FB) ein Datenbaustein (DB) gehört.
In diesem Datenbaustein werden Statische Variablen abgelegt, welche im FB verwendet werden.
Die Werte der statischen Variablen gehen nach mehreren Programmzyklen nicht verloren, es sein denn sie werden durch das Programm verändert.
Wenn man FB1 - DB1 und FB2 -DB2 hat, kann FB1 auf DB2 zugreifen und Werte ändern.
Dann gibt es noch die globalen Variablen (PLC-Variablen). Diese sind auch aus jeder FB/FC erreichbar und änderbar.

Richtig?

Eigentlich Richtig, es sei ein Baustein wird speziel ,mit UC oder CC aufgerufen.
Der Instanz Db ist das "Gedächniss des FBs", in diesem werden die statischen Variablen gespeichert
Man vermeidet es aber Eigentlich außerhalb eines FBs bzw. innerhalb einens anderen FBs auf andere Instanz-Db schreibend zuzugreifen.


Warum ich das ganze frage: Ich habe vor ein paar Funktionen zu schreiben.
Eine Funktion (read_inputs) soll die Eingänge der SPS einlesen und globale Input-Merker setzen.
Die Input-Merker sollen allen Funktionen zur Verfügung stehen.
Da die Funktion read_inputs zyklisch erfolgt, sind globale Input-Merker immer auf dem neusten stand.

dementsprechend gibt es dann auch eine set_outputs Funktions. Diese beschreibt die Ausgänge der SPS nach den Output-Merkern
welche im Programm in der Funktion Verarbeitung gesetzt werden.

Die Statischen Variablen sollten also die Variablen sein, welche nur die Funktion selber intern benötigt.

Richtig?

Das liegt an Dir ob dies so richtig ist oder nicht (IMHO).
Beim Programmieren Richtig und Falsch zu beurteilen liegt halt immer auch im Auge und der Erfahrung des Betrachters.
Da ist es einfacher zu sagen geht oder geht nicht ^^

Das mit den Ein- / Ausgängen über z.B. einen DB oder Merker zugehen um in verschieden Programmen selbst immer auf dieselbe Variable zu verarbeiten findest öfters unter dem Begriff Mapping!
Man könnte auch auf Symbolische Programmierung umstellen, dann macht man die Zuweisung der Symbolik zu den E/As halt über die Symboltabelle und passt dort Adressen zu den Symbolen an.
Aber es gibt ja auch 1001 und einen Weg nach Rom. :)..

Problematisch könnten solche Dinge dann sein bei indirekten Zugriffen auf E/A Adressen in Funktionen.

Bei den Variablen welche zwischen den Funktionen ausgetauscht werden sollen kann man auch globale variablen benutzen richtig?

Ja, Richtig (wenn man zB Merker, Ausgänge und die DBs usw. als globale Variable betrachtet).
Lokale Variablen sind ja eigentlich nur innerhalb der jeweiligen Bausteine Grenze gültig.
 
Eigentlich Richtig, es sei ein Baustein wird speziel ,mit UC oder CC aufgerufen.
Der Instanz Db ist das "Gedächniss des FBs", in diesem werden die statischen Variablen gespeichert
Man vermeidet es aber Eigentlich außerhalb eines FBs bzw. innerhalb einens anderen FBs auf andere Instanz-Db schreibend zuzugreifen.

Aber ich könnte doch Problemlos im FB1 lesend auf den Instanz DB eines anderes FBs zugreifen, oder spricht etwas dagegen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber ich könnte doch Problemlos im FB1 lesend auf den Instanz DB eines anderes FBs zugreifen, oder spricht etwas dagegen?

Glaubensfrage!
Ich persönlich halte das für schlechten Programmierstil. Ändert jemand den anderen FB verschieben sich u.U. Variablen, dann macht dein FB1 Probleme.
Manchmal geht es nicht anders, Ausnahmen bestätigen wie immer die Regel.
Ganz böse ist schreiben in fremde IDB, das kann noch mehr Seiteneffekte hervorrufen.
Siemens z.B. macht ähnliches im Diagnose-FB für Profibus/Profinet. Aber da kann ich das verstehen, die nutzen den IDB-Inhalt gleich für die VISU (und nur dafür!) und das spart viel Umkopiererei von Daten in der SPS.
 
Aber ich könnte doch Problemlos im FB1 lesend auf den Instanz DB eines anderes FBs zugreifen, oder spricht etwas dagegen?

Wie Ralle schon schrieb, manchmal geht es nicht anders.

Gerade wenn es sich bei mehreren FBs um sagen wir einmal Funktionsgruppe dreht.
Also mehrere FBs, welche zwangläufig zur Funktion zusammen genutzt werden.
Da kommt solch etwas öfters vor.
Aber da stellt sich dann die Frage, warum schreibt man dann nicht alles in einen FB?
Da ist zB bei der neueren Generation der Bosch Steuerungen mit OOP schön, da kann man auch nur Teilfunktionen ansprechen (ist aber anderes Thema).

Sobald jemand halt etwas an Variablen zwischen drin einfügt, stimmt halt dann der Zugriff in den anderen Bausteinen nicht mehr und man würde dann auf falsche Adressen zugreifen.
(Bei uns in der Firma siehst es dann, das dort immer steht "neue Variablen nur hinten anfügen .:rolleyes:.")
Man spart sich halt dadurch die Versorgung von Eingangsparametern an dem jeweiligen FB.

Wie es schon geschrieben wurde, es ist eigentlich kein schöner Programmierstill aber funktionell möglich ;)
 
Zurück
Oben