Sonstiges SCL Array der Länge i

Neurorancer

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

ich möchte gerne ein Array der Länge "k" anlegen.
Die Variable k ist ein Integer und hat den Wert 3.

Wenn ich es folgendermaßen umsetze, bekomme ich die Fehlermeldung:

Fehler dDW(9) : 7001 :Konstante erwartet : vor ]
Fehler dDW(9) : 7002 :Signed Integer (SINT, INT oder DINT) erwartet : vor ]

Code:
VAR_GLOBAL
        k : INT := 3;
        
        //Flags
        flag               : ARRAY [0..k] OF BOOL; 
END_VAR

Frage: Warum klappt es nicht?
 
Ich glaube das geht erst ab TIA das man die Arraygröße von einer Konstanten abhänig machen kann.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Neurorancer,

die SPS kann kein Array anlegen, bei dem zum Zeitpunkt der Übersetzung die Grenzen nicht klar sind.
Im TIA kann man bei 1200er/1500er Anwenderkonstanten (Die werden unter PLC-Variablen >> Anwenderkonstanten angelegt) anlegen.
Diese kann man dann als Arraygrenzen angeben. Aber auch hier gilt: die Grenzen sind zum Zeitpunkt des Übersetzens klar. Der Vorteil liegt darin, dass man eine zentrale Stelle hat, an der man die Grenzen projektieren kann. Danach kann man sie als Arraygrenzen und Schleifenvariablen verwenden.

VG

MFreiberger
 
ich möchte gerne ein Array der Länge "k" anlegen.
Die Variable k ist ein Integer und hat den Wert 3.

Wenn ich es folgendermaßen umsetze, bekomme ich die Fehlermeldung:

Fehler dDW(9) : 7001 :Konstante erwartet : vor ]
Fehler dDW(9) : 7002 :Signed Integer (SINT, INT oder DINT) erwartet : vor ]

Code:
VAR_GLOBAL
        k : INT := 3;
        
        //Flags
        flag               : ARRAY [0..k] OF BOOL; 
END_VAR

Frage: Warum klappt es nicht?
Weil k bei Dir eine Variable und keine Konstante ist!
Arraygrößen können bei Siemens nur mit Konstanten bei der Interpretation und nicht mit Variablen zur Laufzeit festgelegt werden.
 
Zuletzt bearbeitet:
Mal grundsätzlich dazu :
Wenn ich eine Variable (oder ein Array) erst zur Laufzeit anlegen will dann setzt dies vom System her eine dynamische Speicherverwaltung voraus. Das heißt, dass Speicher bei Bedarf reserviert werden können muss aber auch, dass der Speicher auch bei Nicht-Bedarf wieder freigegeben werden können muss. Dies würde einen im Hintergrund laufenden Mechanismus erfordern, der schon mal auf jeden Fall CPU-Leistung fressen würde (bei .Net nennt man das Garbage-Kollektor). Dies hinzubekommen würde ich allen CodeSys-Derivaten prinzipiell zutrauen (ich glaube aber auch, dass die es aktuell nicht können) - bei Siemens geht es definitiv nicht und ich hoffe auch, dass die sich mit so etwas erst dann beschäftigen, wenn Sie mit ihrem Entwicklungssystem auf dem Stand des 21. Jahrhunderts angekommen sind.

Gruß
Larry
 
(bei .Net nennt man das Garbage-Kollektor)
Entweder man braucht einen Garbage-Kollektor, oder eine disziplinierte Verwendung von new/delete. Beides hat eine Komplexität, die man in einer SPS eigentlich nicht haben will.

Nachtrag: Auch wenn ich dir dringend raten würde, deine Vorgehensweise zu überdenken, hier mal als Beispiel, wie das bei Beckhoff funktioniert
 
Zuletzt bearbeitet:
Zurück
Oben