"globale" Konstanten bei S7-Projekten

herdi

Level-1
Beiträge
50
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,

ich hätte gerne von euch gewusst ob es bei Step7 möglich ist "globale" Konstanten zu definieren.

Ich hätte auf diese Weise gerne ein paar Fehlermöglichkeiten im Zusammenhang ausgeschlossen.

Beispiel:
ich hätte gerne die Konstante ARRAY_MAX angelegt um dann mithilfe dieser die Größe eines Array zu definieren

xyz:array[0..ARRAY_MAX]OF INT;

und um sie an diversen Stellen im Projekt zum Beispiel hier

for i:=0 to ARRAY_MAX do
a:=a+xyz;
end_for;


Würde doch zum Beispiel Überläufe vermeiden helfen...

Also geht das irgendwie? Über die Symboltabelle vielleicht?

Danke und viele Grüße

Herdi

PS: Bei Codesys kann man alles was zwischen VAR_CONSTANT und END_VAR in den globalen Variablen deklariert ist für solche Sachen verwenden.
 
Nein-geht so leider nicht!
Kannst evt einen CONST-DB anlegen, ist aber nur ne Krücke und nicht wirklich vor veränderungen geschützt.
Oder du machst alles über eine SCL-Quelle.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein-geht so leider nicht!
Kannst evt einen CONST-DB anlegen, ist aber nur ne Krücke und nicht wirklich vor veränderungen geschützt.
Oder du machst alles über eine SCL-Quelle.

Kannst du mir eventl. kurz auf die Sprünge helfen wie das mit dem CONST-DB geht? Kann man die Werte dann schon zur Kompilierzeit verwenden um Arraygrößen festzulegen?
 
Kiestumpe meint,

dass du einfach einen DB anlegen sollst, der die Werte deiner "Kontanten" enthält. Natürlich darfst du diese Werte zur Laufzeit nicht schreibend, wohl aber lesend bearbeiten.

Dennoch sind die "Konstanten" dann nur auf einer CPU / einem Programm, also nicht im gesamten Projekt.
Die Array grösse "dynamisch" nach einer Konstante zu definieren kann Siemens leider nicht!!!
 
Hallo miteinander,

ich hätte gerne von euch gewusst ob es bei Step7 möglich ist "globale" Konstanten zu definieren.

Ich hätte auf diese Weise gerne ein paar Fehlermöglichkeiten im Zusammenhang ausgeschlossen.

Beispiel:
ich hätte gerne die Konstante ARRAY_MAX angelegt um dann mithilfe dieser die Größe eines Array zu definieren

xyz:array[0..ARRAY_MAX]OF INT;

und um sie an diversen Stellen im Projekt zum Beispiel hier

for i:=0 to ARRAY_MAX do
a:=a+xyz;
end_for;


Würde doch zum Beispiel Überläufe vermeiden helfen...

Also geht das irgendwie? Über die Symboltabelle vielleicht?

Danke und viele Grüße

Herdi

PS: Bei Codesys kann man alles was zwischen VAR_CONSTANT und END_VAR in den globalen Variablen deklariert ist für solche Sachen verwenden.

Deine Probleme hätte ich gern mal!
nee,nee,nee....:roll:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deine Probleme hätte ich gern mal!
nee,nee,nee....:roll:

Also ich hab das Problem auch.
Jeder der schon mal mit einer richtigen Hochsprache programmiert hat, würde das genau so machen wie herdi das beschreibt, Siemens ist da leider noch in der Steinzeit der Programmiereung... OHGN auch? :)
 
Was heißt "in der Steinzeit"?
Ich muß zugeben, in Hochsprachen programmiere ich nicht. Aber warum soll denn so eine einfache "dumme" SPS auch unbedingt alle Vorzüge von Hochsprachen erfüllen können (müssen)?
Eine globale Konstante würde ich mir in einem DB einfach selber definieren:
Code:
L   meine_Konstante               //eine beliebige Konstante
T  "konstanten".konstante_1   // in Datenbaustein schreiben
Also wozu braucht man das alles?:confused:
.
 
Dieses Thema scheint sich zu einem Glaubenskampf zu entwickeln, was wir natürlich nicht möchten.

Fakt ist, du kannst die Array-Grösse nicht mit einer Varaiblen (Konstanten) angeben, NUR durch einen expliziten Zahlenwert.
Das Problem hierbei liegt einerseits bei der S7 an sich, da keine dynamische Speicherverwaltung möglich ist.
Eine Definition mittels einer Konstanten aber hat nichts mit dynamischer Speicherverwaltung zu tun, der SCL Compiler unterstützt das nur leider nicht (wie so vieles andere, was nützlich wäre).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
....
Fakt ist, du kannst die Array-Grösse nicht mit einer Varaiblen (Konstanten) angeben, NUR durch einen expliziten Zahlenwert.
.....
Das mit den Array-Grössen hatte ich in den vorhergehenden Beiträgen überlesen... Da hast Du natürlich recht.:oops:

Aber ursprünglich ging es ja in diesem Thread um "globale Konstanten"....:D
.
 
Dieses Thema scheint sich zu einem Glaubenskampf zu entwickeln, was wir natürlich nicht möchten.

Fakt ist, du kannst die Array-Grösse nicht mit einer Varaiblen (Konstanten) angeben, NUR durch einen expliziten Zahlenwert.
Das Problem hierbei liegt einerseits bei der S7 an sich, da keine dynamische Speicherverwaltung möglich ist.
Eine Definition mittels einer Konstanten aber hat nichts mit dynamischer Speicherverwaltung zu tun, der SCL Compiler unterstützt das nur leider nicht (wie so vieles andere, was nützlich wäre).

So ist das nun mal und wer genau hinsieht, wird entdecken, daß ist überall im Leben so :ROFLMAO: Man kann nicht immer alle Vorteile genießen, muß auch Nachteile hinnehmen.

Ich kann damit Leben, habe bisher niemals unbedingt und um jeden Preis dynamische Array benötigt (außer in Delphi und das ist nun mal kein SPS-Programm).

Wer hat nicht schon den sturen, reichlich dummen SCL-Compiler verflucht. Den kann Siemens ruhig mal renovieren, dabei meine ich nicht einmal den Compiler an sich (ok, Debugmeldungen, Fehlermeldungen etc. dürfen ausführlicher sein), sondern vor Allem den Editor. Codevervollständigung, kontextsensitive Hilfe, farbliche Texthervorhebungen, etc. das wäre mir persönlich durchaus wichtiger, als Veränderungen an der Sprache an sich.

Ich empfinde das auch nicht als Glaubenskrieg, hoffe aber immer noch inständig, daß die SPS-Programmiererei nicht den Hochsprachenprogrammierern in die Hände fällt. Denn, Speicherlecks, Progammabstürze, nicht durchschaubare Abläufe im Programm, Bluescreens bis hinunter zum Stillstand des Betriebssystems , all das ist bei einer normalen SPS und einem soliden Programm ebend nicht so leicht möglich, wie bei einem hochkomplexen Gigabytegroßen Betriebssystem inkl. Anwendungsprogramm. Und je mehr das Gespann Betriebssystem/Programm können muß, desto komplexer und fehleranfälliger wird das Ganze.
 
Schreibschutz

Jetzt hab ich mir den Eigenschafts-Kontaxt nochmal genauer angeschaut - und festgestellt, dass man da einen Schreibschutz anlegen kann.:oops:
Also noch ein Schritt in diese Richtung.

Hier noch ein Quellcode-Beispiel, für die Erstellung eine Parameter-DB, teilweise sind die Anfangswerte definiert, wenn nicht setzt sie S7 auf 0, bzw. FALSE.
(Allerdings wäre das Beispiel für mich kein Fall von Konstanten)


Code:
DATA_BLOCK "AnalogInParameter"
TITLE =
VERSION : 0.1


  STRUCT 	
   Par10B1 : STRUCT 	//Parameter 10B1
    FreigabeGW : BOOL ;	
    Fehler : BOOL ;	
    Bipolar : BOOL ;	
    ScalMax : REAL  := 1.500000e+002;	
    ScalMin : REAL ;	
    KSteigung : REAL  := 1.000000e+000;	
    KOffset : REAL ;	
    GW_AlarmH : REAL  := 9.500000e+001;	
    GW_AlarmL : REAL  := 5.000000e+001;	
    GW_WarnH : REAL  := 8.000000e+001;	
    GW_WarnL : REAL  := 6.000000e+001;	
    Hysterese : REAL  := 5.000000e-001;	
    Ersatz : REAL  := 2.000000e+001;	
   END_STRUCT ;

Alle Klarheiten beseitigt ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,

danke für eure Antworten. Ich werd mir hier wohl ähnlich behelfen müssen wie bei anderen Dingen die bei Siemens schrottig sind.

Hab mir schon ein Tool gebastelt das dass diese Unzulänglichkeiten etwas abmildert und das wird diese Funktion demnächst auch haben. Genauso wie die Suche nach doppelt angegeben CASE-Fällen...

Gruß

Herdi
 
Zurück
Oben