Step 7 Umwandeln Array mit Bytes in Array mit DINT oder DWORD

trabajador73

Level-2
Beiträge
112
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

es werden DBs online erzeugt mit SFC22. Danach wird mit folgendem Quellcode ein Array mit Bytes erzeugt. Zukünftig soll dieser DB mit einem Array vom Typ DINT oder DWORD erzeugt werden.

Hier muss ich irgendetwas anderes reinschreiben, aber mit DW ändert sich auch nichts und ich habe auch bisher keine Erklärung im Netz dazu gefunden.
L W#16#1002 //Typ BYTE
T LW [AR1,P#0.0]


Quellcode:

FILL: NOP 0
L 0
T #SFC21_FILL

LAR1 P##SFC21_BLOCK_ANY
L W#16#1002 //Typ BYTE
T LW [AR1,P#0.0]
L #ANZB //Anzahl Bytes
T LW [AR1,P#2.0]
L #DB_Nr //Ziel-DB
T LW [AR1,P#4.0]
L 0 //Anfang Ziel
SLD 3
OD DW#16#84000000
T LD [AR1,P#6.0]

CALL "FILL" // CALL SFC21
BVAL :=#SFC21_FILL
RET_VAL:=#SFC21_RET_VAL
BLK :=#SFC21_BLOCK_ANY



Danke für jeden Beitrag.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danach wird mit folgendem Quellcode ein Array mit Bytes erzeugt. Zukünftig soll dieser DB mit einem Array vom Typ DINT oder DWORD erzeugt werden.
Wo wird da ein Array erzeugt? :confused: Da wird lediglich der Speicherplatz des DB mit 0-Werten initialisiert
Ein mit SFC22 erzeugter DB hat keine logische/symbolische Struktur bzw. es ist immer ein Array of Byte.
Ob man auf den Speicherplatz des DB Bit-, Byte-, Word- oder DWord-weise zugreift ist egal, weil man kann in einem solchen DB nicht symbolische Variablen sondern nur die Speicheradressen adressieren.

Warum fragst Du nach DINT- oder DWORD-Array bzw. was erhoffst Du Dir? Was willst Du eigentlich erreichen?

Harald
 
Hallo Harald,
danke für Deine Ausführungen. Es werden DINT-Werte übergeben an den online erzeugten DB, Prozesswerte eben. Diese Prozedur, Übergabe von Prozesswerten an nur online erzeugte DBs, wurde nicht von mir programmiert, sondern von mir sollen Counterwerte von verschiedenen Maschinen vom Typ DINT an diese DBs weitergeleitet werden. Das dynamische Schreiben in den richtigen Adressbereich des DB funktioniert bereits, jedoch es gelingt mir nicht einen DB mit ausschließlich DINT Typen zu erzeugen.
Mit dem Quellcode wird ein DB mit einem Array vom Typ Byte (0..ANZB) angelegt. Die Erzeugung des DBs erfolgt in einem anderen Netzwerk zuvor, jedoch der Inhalt wird mit diesem Quellcode erzeugt, daher sollte auch in diesem etwas geändert werden.
Die Zeile
L W#16#1002 //Typ BYTE
T LW [AR1,P#0.0]
wurde bereits von mir geändert wie folgt:
L W#16#1005 //Typ INT
T LW [AR1,P#0.0]
oder
L W#16#5 //Typ INT
T LW [AR1,P#0.0]

Jedoch der Inhalt des DBs, Typ des Arrays, hat sich nicht geändert. Der DB wird erzeugt immer mit einem Array mit Bytes der Länge ANZB und leider nicht mit einem anderen Typ. Ich verstehe nicht, wie dies mit einem Any-Pointer funktioniert. Da als Kommentar beigefügt wurde "Typ Byte", hatte ich vermutet, dass hier der Variablentyp des Arrays bestimmt wird.
 
Jedoch der Inhalt des DBs, Typ des Arrays, hat sich nicht geändert. Der DB wird erzeugt immer mit einem Array mit Bytes der Länge ANZB und leider nicht mit einem anderen Typ. Ich verstehe nicht, wie dies mit einem Any-Pointer funktioniert.
Es ist nicht möglich, einen DB mit einem DINT-Array dynamisch zu erzeugen. Der erzeugte DB besteht immer aus einem (untypisierten) BYTE-Array.
Das DINT-Array kann man sich aber leicht in den Speicherplatz des BYTE-Arrays "hineindenken" - nur leider läßt sich Step7-classic nicht überreden, den untypisierten Speicher als DINT-Array anzuzeigen.

Dein Code kann auch nichts daran ändern, daß der DB kein DINT-Array ist. Da wird lediglich der ANY-Pointer für die Angabe des Zielbereichs der FILL-Funktion zusammengebastelt. Der FILL-Funktion ist es aber herzlich egal, ob sie einen Speicherbereich mit 100 BYTEs oder 25 DINTs mit Nullen initialisieren soll - die Gesamtlänge ist ja gleich (100 Bytes).
Achtung: Wenn Du in dem Code den Typ des ANY-Pointers von BYTE nach INT änderst, dann musst Du den Wiederholfaktor des ANY-Pointers (Anzahl aus #ANZB) halbieren oder vorher bei SFC22 die doppelte Länge (#ANZB * 2) angeben! (Je nachdem, ob bei Dir #ANZB die DB-Länge in Bytes oder die Anzahl Array-Elemente angeben soll.)

Schau Dir in der Step7 Hilfe oder hier in der FAQ den Aufbau des Parametertyps ANY an.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,
der SFC21 füllt den Speicherbereich des erzeugten DBs lediglich mit nullen und der zuvor mit dem SFC22 erzeugte DB erhält doch nur die Eingangsinfos DB-Nr. (Low- und Up-Limit) sowie die Länge des DBs (Count).
Dann wird ein DB immer nur mit dem Datentyp Byte erzeugt und es ist nicht möglich einen DB mit anderen Datentyp zu erzeugen?
PS: Danke für den FAQ zum Aufbau des Parametertyps ANY, sehr interessant inklusive enthaltenen Links.
 
Dann wird ein DB immer nur mit dem Datentyp Byte erzeugt und es ist nicht möglich einen DB mit anderen Datentyp zu erzeugen?
Richtig!
icon14.png
:D Der DB ist immer ein Byte-Array.

Harald
 
Zurück
Oben