Step 7 Dynamisches Array, Pointer

gout

Level-1
Beiträge
28
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
hab hier schon ein wenig zum Thema Dynamisches Array gelesen,
wollte es jetzt mal mit dem Pointer versuchen, mein Problem mir fehlt
leider völlig der Ansatz dazu. Also ich suche eine möglichkeit mein
Array zu vergrößer/verkleinern, ohne das ich dafür in den SCL Code reingehen
muss. Aktuell ist es bei mir über Constanten geregelt.
Ich hänge die Variablendeklaration mal dran,

FUNCTION_BLOCK FB703
CONST
n:= 24; //Festlegen der Spaltenlänge
m:= 24; //Festlegen der Zeilenlänge
p_abs := 101325.0;
R_S :=287.0;
T_n := 273.15;
pi := 3.14159265359;
END_CONST
VAR

AJMat:ARRAY [1..n , 1..m] OF INT := n(m(0));
.
.
.


Hab mich Quer durch allemöglichen Hilfen von Siemens usw. gewälzt, hab
auch das Grundprinzip des Pointers verstanden aber ich komm nicht auf drauf

Gruß
Gout
 
Hallo,
die verwendeten Konstanten werden im Zeitpunkt des Compilierens zugewiesen und entsprechend verwendet. Sie dienen eigentlich nur dazu deinen Code etwas übersichtlicher zu halten.
Ein Array kannst du nicht dynamisch umdefinieren - das Einzige was ginge wäre, dass du es auf deine Max-Anforderung dimensionierst und mal mehr und mal weniger davon nutzt.
Bedenke immer : wenn das Array noch als STAT angelegt ist dann müßte die komplette Instanz neu generiert werden.

Wofür meinst du denn, die Funktionalität zu brauchen ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja da ich nachher nach lehren Spalten und Lehren Zeilen (Also überall nur nullen) suche,
ist es schlecht mit dem zu Groß Setzten. Ist eine Physikalische eigenschaft dieser Speziellen matrix,
ist ein Projekt, wo nachher keiner mehr im Code rumfummeln darf.
 
Zur Laufzeit dynamische Arrays gibt es bei Simatic nicht, weil die meisten SPS-Programmierer damit eh' nur die CPU in Crash führen würden.
Für die wenigen Programmierer, welche wissen was sie tun und auch noch Ahnung vom Programmieren haben, steht nur die Möglichkeit zur Verfügung, eine Speicherplatz-Reservierung in der Größe des Arrays mit der maximal benötigten Größe anzulegen und dann diesen Speicherplatz logisch als kleineres Array anzusprechen.

Das Array in Deinem SCL-Codebeispiel ist kein dynamisches Array, weil damit nur zur Compilierzeit die Größe des statischen Arrays festgelegt wird.
Nach jeder Änderung der Deklaration der Arraygröße (bzw. n und m) zur Compilierzeit muß ein neuer Instanz-DB erzeugt werden.

Kurz: Dein Code kann nicht verbessert werden.

Harald
 
Naja da ich nachher nach lehren Spalten und Lehren Zeilen (Also überall nur nullen) suche,
ist es schlecht mit dem zu Groß Setzten. Ist eine Physikalische eigenschaft dieser Speziellen matrix,
ist ein Projekt, wo nachher keiner mehr im Code rumfummeln darf.

Das ist für mich keine Begründung dafür, es so machen zu wollen, wie du es vorhattest ...
Aber wie auch immer - es gibt keine dynamischen Array's in Step7 ...
Du könntest natürlich einen externen DB dynamisch verwenden - ob das die Sache dann aber besser macht ... :rolleyes:
... und durchschaubarer ... :confused:

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auf dynamische ARRAYS kann man finde ich noch einigermaßen gut verzichten, was aber richtig schlecht ist, wenn man das selbe ARRAY
in verschiedenen Bausteinen verwenden möchte und dann in jedem Baustein seine Konstanten anpassen muß. Sowas will ich an einer Stelle
in meinem Programm machen können. :sb7:

PS: Klar kann man sein ARRAY global deklarieren, mit Strukturierter Programmierung hat das dann aber nichts mehr zu tun. Will meine geschriebenen Bausteine
ja auch in anderern Projekten weiterverwenden. Richtig geil wäre es Konstanten per Schnittstelle übergeben zu können.
 
Zuletzt bearbeitet:
Naja, ich möchte meinen Baustein für verschiedene Anlagen benutzen, (bzw. meine Kollegen). Dafür muss er halt angepasst werden. Da ich aber nicht von Jedem verlangen kann SCL zu beherrschen und ich auch garnicht möchte das ein Kollege von mir in
China meinen Baustein öffnen und verändern kann, muss ich alles von außen Steuern können.
Hoffe das sagt mehr über meine Beweggründe aus.
 
Naja, ich möchte meinen Baustein für verschiedene Anlagen benutzen, (bzw. meine Kollegen). Dafür muss er halt angepasst werden. Da ich aber nicht von Jedem verlangen kann SCL zu beherrschen und ich auch garnicht möchte das ein Kollege von mir in
China meinen Baustein öffnen und verändern kann, muss ich alles von außen Steuern können.
Hoffe das sagt mehr über meine Beweggründe aus.

Jo, das ist ja auch alles gut und richtig.

Jedenfalls kannst Du von aussen (ohne Neucompilierung) nicht die Größe des Instanzdatenbausteins ändern. Eine Änderung einer Arraygröße bedeutet aber Änderung der IDB-Größe.

Also Fazit: die maximal jemals benötigte Arraygröße musst Du vorher einstellen und dann nur jeweils den benötigten Teil benützen.

Gruß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
..Jedenfalls kannst Du von aussen (ohne Neucompilierung) nicht die Größe des Instanzdatenbausteins ändern. Eine Änderung einer Arraygröße bedeutet aber Änderung der IDB-Größe...
Ich würde darüber nachdenken, das ARRAY in einem GDB abzulegen und dem FB als ANY zu übergeben. Konstanten für die Anzahl von Spalten und Zeilen als Bausteinparameter könnten im FB zur Überprüfung der DB-Länge und zur Adressierung dienen.

Gruß, Onkel
 
Ich würde darüber nachdenken, das ARRAY in einem GDB abzulegen und dem FB als ANY zu übergeben. Konstanten für die Anzahl von Spalten und Zeilen als Bausteinparameter könnten im FB zur Überprüfung der DB-Länge und zur Adressierung dienen.

Gruß, Onkel

So das wäre mal zimlich genau das wass ich möchte, so mein ansatz wäre, die Variablen als ANY deklarieren (BITTE KORRIEGIEREN wenn ich mich irre) anschließend im GDB variablen Deklarieren und mit dem POINTER auf die ANY`s "zeigen" oder bin ich da auf dem Falschen weg?
 
Du könntest natürlich einen externen DB dynamisch verwenden - ob das die Sache dann aber besser macht ... :rolleyes:
... und durchschaubarer ... :confused:

Das frage ich mich aber auch...

bedenke, dass dann dein chinesischer Kollege, welcher im SCL-FB nichts ändern darf/kann aber den GlobalDB händisch anlegen/ändern muss...

nicht alles was technisch geht, muss man auch unbedingt machen...

PS: mir erschliesst sich der Sinn überhaupt nicht. Ob ich jetzt den FB ändere oder den GlobalDB beides geht nicht zur Laufzeit. Und Änderungen im FB finde ich jetzt sogar noch übersichtlicher, weil Du da wirklich nur am Anfang Deine Konstanten m und n definieren musst. Im DB musst Du alle Arrays von Hand deklarieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das frage ich mich aber auch...
Ich weiß, hier scheiden sich die Geister. Ich kenne zwar nicht die Anwendung um die es hier geht, aber wenn man mit Arrays oder UDTs arbeitet, möchte man Daten speichern. Wenn man diese Daten im IDB ablegt und diesen neu generiert, sind die Daten weg. Für manch eine Anwendung ist das tödlich. Ich verwende hierfür grundsätzlich GDBs.

..bedenke, dass dann dein chinesischer Kollege, welcher im SCL-FB nichts ändern darf/kann aber den GlobalDB händisch anlegen/ändern muss...
..Im DB musst Du alle Arrays von Hand deklarieren...
Das ist doch eine sehr gute Alternative. Es handelt sich um ein einziges ARRAY.

..mir erschliesst sich der Sinn überhaupt nicht. Ob ich jetzt den FB ändere oder den GlobalDB beides geht nicht zur Laufzeit...
Mit einem GDB müsste es sogar zur Laufzeit gehen. Wenn es nicht unbedingt sein muss, würde ich es jedoch nicht tun, hab's auch noch nie gebraucht.


Gruß, Onkel
 
... wir rutschen jetzt wieder "ein wenig" auf die Ebene "was ist richtig" ab.
Ich denke mal, dass die Möglichkeiten ausreichend erklärt und präsentiert sind. Was die Umsetzung angeht hat da sicher jeder so seine eigenen Vorstellungen ... dabei sollten wir es m.E. belassen ...

Gruß
Larry
 
Zurück
Oben