Statische Variablen

Sh4gr4th

Level-1
Beiträge
33
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
bin (immer noch...) neu in der SPS-Welt und versuche gerade einen FB zu schreiben, in dem ich Daten auch global abspeichern kann. Aber irgendwie vergisst er mir immer den vorherigen Wert beim wiederholten Aufrufen des FB. Daher wüsste ich gerne, wo ich was deklariere, damit die Daten halt nicht vergessen werden (Hatte hier gelesen, dass der FB im Gegensatz zum FC ein Gedächtnis hat).

Und wenn ich schon dabei bin, hätte ich gerne eine Erläuterung zu den statischen Variablen, denn irgendwie ist das für mich ein Gegensatz, denn wenn eine Variable statisch ist, wäre es dann nicht eine Konstante?!

Programmiere in AWL, auf einer 300er, Siemens Step 7, Ver. 5.0 SP2, (5.3 liegt hier rum, aber der Rechner ist zu schwach für XP...)
 
Sh4gr4th schrieb:
Hallo,
bin (immer noch...) neu in der SPS-Welt und versuche gerade einen FB zu schreiben, in dem ich Daten auch global abspeichern kann. Aber irgendwie vergisst er mir immer den vorherigen Wert beim wiederholten Aufrufen des FB. Daher wüsste ich gerne, wo ich was deklariere, damit die Daten halt nicht vergessen werden (Hatte hier gelesen, dass der FB im Gegensatz zum FC ein Gedächtnis hat).
Ja, und zwar im Instanz-DB. Vorraussetzung: Zwei Aufrufe (Instanzen) müssen einen verschiedenen Instanz-DB haben. Ausnahme: Multi-Instanzen. Dort werden verschiedene Adressbereiche im Instanz-DB eines übergeordneten FB benutzt.
Und wenn ich schon dabei bin, hätte ich gerne eine Erläuterung zu den statischen Variablen, denn irgendwie ist das für mich ein Gegensatz, denn wenn eine Variable statisch ist, wäre es dann nicht eine Konstante?!
Nein. Statisch meint (auch in anderen Programmiersprachen), daß eine Variable überall im gesamten Programm verfügbar (sichtbar, gültig) ist. Gegensatz: Lokale Variablen (sind nur innerhalb eines Aufrufs eines Unterprogramms (S7: FB,FC) gültig, d.h. nach Ende der Funktion wird der Speicher anderweitig genutzt.) und dynamische Variablen (gibt es so in der S7-Welt nicht, einer Variable wird Speicher aus einem Pool zugewiesen und sie ist von da an verfügbar, bis der Speicher freigegeben wird).
[/quote]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hm, dachte in anderen Programmiersprachen wird zwischen lokalen (innerhalb einer Funktion) und globalen Variablen unterschieden. Aber gut, weiß jetzt was gemeint ist. Danke schonmal dafür.
Ja, und zwar im Instanz-DB. Vorraussetzung: Zwei Aufrufe (Instanzen) müssen einen verschiedenen Instanz-DB haben. Ausnahme: Multi-Instanzen. Dort werden verschiedene Adressbereiche im Instanz-DB eines übergeordneten FB benutzt.
Hm, also ich habe in meiner AWL-Quelle wie aus dem Beispiel in der AWL-Hilfe erst den FB und dann noch einen DB erstellt.
Wenn ich jetzt also beispielsweise meine Variable (die überall sichtbar sein soll) Zaehler habe, dann deklariere ich die, ja wo? :?:
Dachte das kommt in die Variablendeklaration. Ist die Syntax dafür in der AWL Quelle so richtig?
VAR
Zaehler:=Int;
END_VAR
Oder mache ich einen Fehler beim Laden der Variablen? Muss ich da irgendwie speziell darauf zugreifen?
Stehe da gerade total auf den Schlauch. Erklärung mit Codeschnipseln wäre toll. Vielen Dank schonmal für die Hilfe.
 
Sh4gr4th schrieb:
Hm, dachte in anderen Programmiersprachen wird zwischen lokalen (innerhalb einer Funktion) und globalen Variablen unterschieden.
Ja, wenn das Kriterium die "Sichtbarkeit" (scope) ist. Statisch und dynamisch bezieht sich auf die Art des Speichers. Die Adressen statischer Variablen liegen beim Programmstart fest, die dynamischer nicht. Da lokale Variablen (in Step7 genaoso wie in C oder Pascal) zur Laufzeit auf dem Stack angelegt werden, sind sie nicht statisch.
Hm, also ich habe in meiner AWL-Quelle wie aus dem Beispiel in der AWL-Hilfe erst den FB und dann noch einen DB erstellt.
Wenn ich jetzt also beispielsweise meine Variable (die überall sichtbar sein soll) Zaehler habe, dann deklariere ich die, ja wo? :?:
Dachte das kommt in die Variablendeklaration. Ist die Syntax dafür in der AWL Quelle so richtig?
VAR
Zaehler:=Int;
END_VAR
Oder mache ich einen Fehler beim Laden der Variablen? Muss ich da irgendwie speziell darauf zugreifen?
Stehe da gerade total auf den Schlauch. Erklärung mit Codeschnipseln wäre toll. Vielen Dank schonmal für die Hilfe.
Ich habe leider nicht sooft mit AWL-Quellen gearbeitet, daß ich dir den Code so herunterbeten könnte. Wenn ich es wissen wollte, würde ich mir folgenden Testcode schreiben:
1. eine globale Variable z.B. in einem MW oder MD anlegen oder DBW oder DBD eines "normalen" DB.
2. Einen FB erzeugen und auf die globale.
3. passende Instanz-DBs DB1,DB2 erzeugen
4. Im OB1den FB einmal mit DB1 und einmal mit DB2 aufrufen
Das ganze in eine AWL-Quelle wandeln lassen.
 
Wenn du S7 Zähler benutzen willst mußt du dir die als Variable des Typ Counter reinnehmen. Wenn es sich nur eine Integer Variable handelt in der ein Zählwert drinn steht. Ansonsten ist der Aufruf richtig und die Werte gehen nicht verloren solange du sie nicht irgendwo überschreibst. Ein weiterer Fehler könnte sein das der ZEitstempel des Instanz DB´s nicht mehr stimmt. Bei jeder Änderung der Variablendeklaration des FB´s mußt du die Instanz neu generieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank erstmal für die Hilfeversuche.
Ich glaube, dass ich das was ich realisieren möchte, mit einem einfachen Merker viel leichter zu bewerkstelligen ist und mich vor allem nicht vor so große Probleme stellt.
Der FB soll nämlich einfach nur, abhängig davon ob er schonmal aufgerufen wurde, etwas anderes erledigen (Empfangen) und solange aus dem OB aufgerufen werden, bis sich ein Wert aktualisiert hat. Dazu gibt er einen Busy-Wert zurück, der anzeigt, dass noch keine neuen Daten vorliegen. Wenn er neue Daten empfangen hat setzt er diesen Merker wieder zurück, so dass er beim nächsten Aufruf, wieder sendet.
Das mit den Instanzen und Generieren derselbigen und Zeitstempeln und Countern ist wohl overkill, auch da es nicht nur bei mir am Verständnis einiger Sachen liegt, sondern auch die dazugehörige Syntax im Verborgenen bleibt.
 
OK! Der ganze Thread hier war mehr oder wenig unnütz. Hat jetzt doch geklappt, es hat sogar schon vorher geklappt, aber wenn man zu blöde ist die richtigen Variablen zu beobachten ist es klar, dass man nix sehen kann.....
Oh man.... :evil:
 
Zurück
Oben