Step 7 Array [0..30] Of String[40] (DB) -> Array [0..30] Of String[40] TEMP einschreiben

nWEBd

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten tag alle.

(Zum erst entschuldige sie meinen schlechten Deutsch Grammatik).

Wie kann ich in Step 7 (AWL) ein Array [0..30] Of String[40] (das Array ist in einen DB) ins einen TEMP variable Array [0..30] Of String[40] einlesen/einschreiben?

Bin ich noch ein "NOOB" in STEP 7 Programmierung. Mehr Erfahrung in JavaScript, Java, Python, PHP, Ruby.

Vielen dank für sein Hilfe.
 
Dein Array würde 31*42 = 1302 Bytes an Speicher benötigen

Das geht nicht bei einer S7-300, aber nur weil der Speicher für die Lokaldaten (d.h. der TEMP-Bereich) zu klein ist. Eine S7-300 hat fast immer maximal 256 Bytes Lokaldaten. Bei einer S7-400 könntest du den Speicherbereich für die Lokaldaten in der Hardwarekonfiguration entsprechend hoch einstellen. Dann könntest du das Array mittels Blockmove (SFC22) kopieren.
Warum muss es denn im Temp-Bereich sein?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Thomas_v2.1 danke für dein Antwort.

Es gehts um des das den Array von einen API bearbeitet wird (2x aufgerufen wird) und ich muss die Daten von den ersten Aufruf zwischen speichern und danach vergleichen.

Also muss ich einen neuen DB festlegen, die Werte mit einen Loop ein schreiben und mit den DB weiter bearbeiten?

In andere Prog.sprachen ist ein Array Bearbeitung viel leichter...
 
Du könntest auch einen FB verwenden und den Zwischenspeicher im Stat-Bereich anlegen, dann hast du nicht die Begrenzung mit der Größe der Lokaldaten.

Sicher ist das in anderen Sprachen leichter. Wenn du SCL verwendest wird es aber schonmal etwas komfortabler. In AWL ist das übelstes Gebastel.

Und dann wie schon geschrieben, Speicherbereiche kopieren mittels SFC22. Der macht keinen Unterschied zwischen Lokaldaten, Global-DBs oder Instanz (Stat) Daten.
 
as geht nicht bei einer S7-300, aber nur weil der Speicher für die Lokaldaten (d.h. der TEMP-Bereich) zu klein ist. Eine S7-300 hat fast immer maximal 256 Bytes Lokaldaten.

@Thomas: Die Info ist aber nicht mehr ganz taufrisch... ;)
SIEMENS S7315-2PN/DP Datenblatt schrieb:
Lokaldaten
● je Prioritätsklasse, max. 32 768 byte; max. 2048 byte pro Baustein


Die Zeiten mit den 256 sind schon lang vorbei, bei den Vipas muss man aufpassen, da sind die Modelle sehr unterschiedlich...
Da bin ich mal gestolpert als ein paar Standard-FBs von mir nimmer gingen....

Theoretisch sollte das, sofern man im FB unter 2048 bleibt, also OK sein....
Für Details müsste man aber die genaue Ziel-CPU-Type kennen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen dank für dein Hilfe und "WayPoints" :)

Probiere ich einmal und melde wie es Funktioniert hat :)

Danke nochmals.


Noch dazu:

wie ist mit die Array Indexierung?

Mein Erfahrung mit JavaScript kannst ein "For loop" nehmen und durch schpringen:

for (var i = 0; i < array.length; i++) {
console.log(array);
}

Gehts bei AWL auch so? Kann ich den Array Index mit einen Variable aufrufen? Array[_hvar] ?
 
Zuletzt bearbeitet:
Die Verwendung einer Indexvariable funktioniert mit Step7 "Classic" nur unter SCL.

Bei verwendung von AWL wirst du mit Adressregistern oder selbstgebauten ANY-Pointern arbeiten müssen.
Beispiel:
Code:
LAR1 P##MyArr[0] // Start-Adresse des ersten String im Array ins Adressregister 1 laden
L B[AR1, p#1.0] // Laden der Stringlänge des ersten Strings
...

AR1+ P#42.0 // Adressregister 1 + Max-Länge String[40]
L B[AR1, p#1.0] // Laden der genutzten Stringlänge des 2. Strings
...

Zu den Anypointern findest du nen ausführlichen Thread im FAQ.


MfG Semo
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich den TE richtig verstanden habe dann will er doch eh das ganze Array aus dem DB in ein gleiches Array in Temp kopieren.
Das kann er dann ja doch (wie von Thomas vorgeschlagen) auf einen schlag mit dem SFC20 Blockmove machen.
Da wäre nicht viel zu programmieren....

Wenns AWL sein soll...
Code:
      CALL  "BLKMOV"
       SRCBLK :="MyDb".StrArray
       RET_VAL:=tmpRetVal
       DSTBLK :=#MyTempArray
      NOP   0

[EDIT] Hab esst später gemerkt dass es schon um den nächsten Schritt (dyn. Einzeladressierung der Arraymembers ging)....
 
Zuletzt bearbeitet:
Es gehts um des das den Array von einen API bearbeitet wird (2x aufgerufen wird) und ich muss die Daten von den ersten Aufruf zwischen speichern und danach vergleichen.

Das sieht jetzt aber auch so aus, als ob der Vergleich nicht im selben Zyklus stattfindet. Darum ist der Tempbereich sowieso ungeeignet.

In SCL sind solche Arrayoperationen sehr einfach und übersichtlich. Ich würde das in der Hinsicht ins Auge fassen.

mfg René
 
Zurück
Oben