TIA BLKMOV mit unterschiedlichen array

DiGo1969

Level-2
Beiträge
142
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
es geht um eine SCL-Quelle, welche ich von einer Siemens SPS 400 nach SPS 1500 kopieren möchte. Ich möchte 8 Byte einfach nach 4 Worte kopieren.


Code:
// Deklarationszeile Temp

HM_ARRAY_8BYTE:     ARRAY[0..7] of BYTE;
HM_ARRAY_4WORD:     ARRAY[0..3] of WORD;


// CODE

INT:= BLKMOV (SRCBLK := #HM_ARRAY_8BYTE
             ,DSTBLK := #HM_ARRAY_4WORD);

Im klassischem S7 hatte das funktioniert, jetzt will BLKMOVE was mit variant...


Vielen Dank schon mal vorab.
LG Dirk
 
Code:
VAR_TEMP
   HM_ARRAY_8BYTE : Array[0..7] of Byte;
   HM_ARRAY_4WORD : Array[0..3] of Word;
   HM_ARRAY_AT_4WORD AT HM_ARRAY_4WORD : Array[0..7] of Byte;
END_VAR

#HM_ARRAY_AT_4WORD := #HM_ARRAY_8BYTE;
 
Oder mit Slice-Zugriff. Dann kann der Baustein optimiert bleiben.
Code:
HM_ARRAY_4WORD[0].%B0 := HM_ARRAY_8BYTE[0];
HM_ARRAY_4WORD[0].%B1 := HM_ARRAY_8BYTE[1];
HM_ARRAY_4WORD[1].%B0 := HM_ARRAY_8BYTE[2];
HM_ARRAY_4WORD[1].%B1 := HM_ARRAY_8BYTE[3];
HM_ARRAY_4WORD[2].%B0 := HM_ARRAY_8BYTE[4];
HM_ARRAY_4WORD[2].%B1 := HM_ARRAY_8BYTE[5];
HM_ARRAY_4WORD[3].%B0 := HM_ARRAY_8BYTE[6];
HM_ARRAY_4WORD[3].%B1 := HM_ARRAY_8BYTE[7];
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die AT Funktion wird von der CPU nicht unterstützt...
Wer sagt das denn?? Eine TIA-Meldung? Wie lautet die genau?

AT ist mit allen in TIA unterstützten S7-CPU möglich. Der Speicherbereich darf allerdings nicht "optimierten" Zugriff haben. Das sollte aber kein Problem sein, wenn man solch alten Code aus S7-400 in S7-1500 weiter benutzen will.
 
Oder mit Slice-Zugriff. Dann kann der Baustein optimiert bleiben.
Code:
HM_ARRAY_4WORD[0].%B0 := HM_ARRAY_8BYTE[0];
HM_ARRAY_4WORD[0].%B1 := HM_ARRAY_8BYTE[1];
HM_ARRAY_4WORD[1].%B0 := HM_ARRAY_8BYTE[2];
HM_ARRAY_4WORD[1].%B1 := HM_ARRAY_8BYTE[3];
HM_ARRAY_4WORD[2].%B0 := HM_ARRAY_8BYTE[4];
HM_ARRAY_4WORD[2].%B1 := HM_ARRAY_8BYTE[5];
HM_ARRAY_4WORD[3].%B0 := HM_ARRAY_8BYTE[6];
HM_ARRAY_4WORD[3].%B1 := HM_ARRAY_8BYTE[7];
Da muss man allerdings noch auf die Endianness achten und genau hinschauen beim Testen.
 
Wenn der Baustein nicht optimiert ist geht das AT

AT ist mit allen in TIA unterstützten S7-CPU möglich. Der Speicherbereich darf allerdings nicht "optimierten" Zugriff haben. Das sollte aber kein Problem sein, wenn man solch alten Code aus S7-400 in S7-1500 weiter benutzen will.
AT-Sichten funktionieren auch in optimierten DBs wenn man die Variable auf "Im IDB setzen" einstellt.
1728978415450.png
(Auch wenn das für die Verwendung eines 400er Programms kaum relevant sein wird)

😲 um 8 Bytes zu kopieren?
Funktionieren würde es ¯\_(ツ)_/¯
 
Mir gefällt die Lösung mit das AT-Sicht am besten.
Ist elegant (nur meiner Meinung).
Funktioniert ohne zusätzliche Code und kein zusätzliche Speicher.
Einzigste Nachteil ist dass die Baustein nicht-optimiert sein muss.
Um in die Baustein Deklaration eine Zeile mit AT-Sicht einzutippen ist den erste Mal ziemlich nicht-intuitiv. Das muss man probieren. Hat man es gelernt ist es eine wichtige Werkzeug.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder mit Slice-Zugriff. Dann kann der Baustein optimiert bleiben.
Code:
HM_ARRAY_4WORD[0].%B0 := HM_ARRAY_8BYTE[0];
HM_ARRAY_4WORD[0].%B1 := HM_ARRAY_8BYTE[1];
HM_ARRAY_4WORD[1].%B0 := HM_ARRAY_8BYTE[2];
HM_ARRAY_4WORD[1].%B1 := HM_ARRAY_8BYTE[3];
HM_ARRAY_4WORD[2].%B0 := HM_ARRAY_8BYTE[4];
HM_ARRAY_4WORD[2].%B1 := HM_ARRAY_8BYTE[5];
HM_ARRAY_4WORD[3].%B0 := HM_ARRAY_8BYTE[6];
HM_ARRAY_4WORD[3].%B1 := HM_ARRAY_8BYTE[7];
Da muss man allerdings noch auf die Endianness achten und genau hinschauen beim Testen.
Irre ich mich wenn ich glaube das wenn man ein Baustein zwischen optimiert und nicht-optimiert wechselt, dann verhaltet die Endianness sich unterschiedlich für Variabeln die in den Baustein deklariert sind ?
Das wäre eine schöne versteckte Bombe wenn man in die Zukunft ein bestehende Baustein mit Slice-Zugriff die Zugriffsart wechselt.
 
Was spricht gegen Scatter_BLK und Gather_BLK?
Die machen das fast das gleiche wie Serialize/Deserialize, was @TP-Inc oben bereits vorgeschlagen hat.
Für diese Befehle müsstest du aber extra über ein Array of Bool gehen, kannst also nicht direkt vom Word-Array in das Byte-Array schreiben.
Außerdem sind in optimierten Speicherbereichen Bools immer ein Byte groß.
Wäre in diesem Fall vermutlich irrelevant, da wenig Daten und würde im Temp-Bereich zwischengespeichert werden.
Ob das auch hier für Speicher in TEMP hilft? Oder wenn der Code in einem FC ist?
Soweit ich weiß gehts nur mit IDBs und auch nur mit diesem pseudo nicht-optimierten Zugriff im "optimierten" DB.
Habe bisher noch keine Möglichkeit gefunden ohne Serialize/Deserialize Anwendungsfälle zu realisieren, bei denen du früher einfach ne AT drüber gebügelt hast.
Schöne, neue Welt ¯\_(ツ)_/¯
Irre ich mich wenn ich glaube das wenn man ein Baustein zwischen optimiert und nicht-optimiert wechselt, dann verhaltet die Endianness sich unterschiedlich für Variabeln die in den Baustein deklariert sind ?
Jep.
Als ob diese Endianess-Geschichte bei Kommunikation mit externen Systemen nicht schon gereicht hätte....

1728985253106.png
Wer nachlesen möchte siehe <hier>.
Das wäre eine schöne versteckte Bombe wenn man in die Zukunft ein bestehende Baustein mit Slice-Zugriff die Zugriffsart wechselt.
Jep...
Edit: hatte ich falsch im Kopf, siehe folgender Post.

Notfalls könntest du dir aus dem Code der beiden Endianess-Bausteinen der Siemens LGF-Bibliothek eine entsprechende Prüfung stricken, sofern du nur Daten aus dem Temp/Static-Bereich deines Bausteins verarbeitest.
NICHT die Bausteine selbst nehmen! Die sind intern wieder optimiert und würden eine Endianess-Änderung des aufrufenden Bausteins nicht erkennen.
Globale DBs kannst du mit ATTR_DB auf optimiert/nicht optimiert prüfen.
Aber wer treibt schon so nen Prüfungsaufwand wenn er nur mal gschwind ne Kleinigkeit in einem migrierten Programm ergänzt ¯\_(ツ)_/¯
 
Zuletzt bearbeitet:
Irre ich mich wenn ich glaube das wenn man ein Baustein zwischen optimiert und nicht-optimiert wechselt, dann verhaltet die Endianness sich unterschiedlich für Variabeln die in den Baustein deklariert sind ?
Das wäre eine schöne versteckte Bombe wenn man in die Zukunft ein bestehende Baustein mit Slice-Zugriff die Zugriffsart wechselt.

Jep.
Als ob diese Endianess-Geschichte bei Kommunikation mit externen Systemen nicht schon gereicht hätte....

Nein! Die Endianess im Speicher ändert sich zwar, aber B0 beim Slice-Zugriff bezieht sich immer auf das Low-Byte.
Siehe Screenshot im Anhang. Links ein Optimierter Baustein, rechts eine nicht Optimierte Kopie.

1728989183396.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die machen das fast das gleiche wie Serialize/Deserialize, was @TP-Inc oben bereits vorgeschlagen hat.
Für diese Befehle müsstest du aber extra über ein Array of Bool gehen, kannst also nicht direkt vom Word-Array in das Byte-Array schreiben.
Außerdem sind in optimierten Speicherbereichen Bools immer ein Byte groß.
Wäre in diesem Fall vermutlich irrelevant, da wenig Daten und würde im Temp-Bereich zwischengespeichert werden.
Ja, vermutlich wird hier sogar der Deserialize reichen, das ja schon ein Array of Byte als Quelle vorliegt.
Ich für meinen Teil empfinde das AT-Konstrukt in der S1500 als eine Krücke und bin auch immer ohne ausgekommen, ohne es zu vermissen.
 
Hallo,
vielen Dank erst einmal, nachdem ich den optimierten Bausteinzugriff raus genommen habe, konnte ich fas alles übersetzten und die kleinen Restfehler habe ich auch noch angepasst.
Jetzt muss ich den Baustein nur noch irgendwann in der neuen Anlage testen... (wenn Anlage mal aufgebaut ist)

Vielen Lieben Dank!!!
LG Dirk
 
Zurück
Oben