TIA Any-Pointer über indirekte Adressierung in SCL auf einer S7-1500

Simon_Fa

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin gerade dabei mich in TIA einzuarbeiten und migriere gerade von S7-300 auf S7-1500. Ich habe auch bei Siemens eine Umsteigerschulung besucht, die aber nicht viel neues Wissen vermittelt hat.

Die Migration in TIA war sehr schwierig, hat aber letztendlich funktioniert. Beim Tausch von S7-300 in eine S7-1500 konnte er einige Anweisungen nicht konvertieren.

Ich habe in SCL über indirekte Adressierung einen Any-Pointer zugewiesen

Code:
#tany_CheckPosition:=WORD_TO_BLOCK_DB(#tw_DB_Number).DW(#tint_index);

Die Variable tany_CheckPosition ist ein Any-Pointer, den ich über die indirekte Adressierung die Startadresse zuweise. Über ein AT-Konstrukt, habe ich dann die benötigte Länge angepasst.

Bei der Migration wird dann der Classic-Code in Kommentaren gesetzt, und ein Verweis auf Peek and Poke gegeben. So wie ich die Befehle aber verstanden habe, werden dort nur die Werte ausgelesen (kein Zugriff auf die Adresse). Der Baustein kann so auch nicht kompiliert werden.

Fragen hierzu:
1. Ist es möglich diesen Code (bei nicht optimierten Bausteinen) irgendwie auf die S7-1500 umzusetzen?
2. Ich verwende den Code für das Kopieren (BLKMOV) einer Struktur (zur Laufzeit bestimmt) auf eine Temp-Variable der gleichen Struktur, um im Baustein symbolisch adressieren zu können.
Wie würde hierfür eine Alternative in TIA bei der S7-1500 aussehen?


Schönen Gruß,

Simon
 
Sieh dir in der Hilfe die befehle PEEK and POOK an das solte dir Weiterhelfen....
ACHTUNG geht aber nur bei "NICHT OPTIMIERTEN" Datenbausteinen.....
 
Sieh dir in der Hilfe die befehle PEEK and POOK an das solte dir Weiterhelfen....
ACHTUNG geht aber nur bei "NICHT OPTIMIERTEN" Datenbausteinen.....

Wie ich oben schon geschrieben habe, wird damit anscheinend nur der Wert an der Adresse ausgegeben, ich benötige aber die Adresse selbst.
Die folgende Anweisung wird vom Compiler als fehlerhaft gekennzeichnet:
Code:
#tany_CheckPosition:=PEEK_WORD(area:=16#84,dbNumber:=WORD_TO_UINT(#tw_DB_Number),byteOffset:=#tint_index);


Schau dir doch mal bei der 1500er die Möglichkeiten von Array-DBs an.
Evtl kannst du dir so einen Konstrukt sparen ...
Darüber habe ich auch schon nachgedacht. Grundsätzlich gehe ich gerade mein Programm durch und versuche Stellen für die Optimierung zu finden und neue Wege zu probieren.
Trotzdem würde ich gerne Wissen, ob diese Funktion noch irgendwie möglich ist, da ich sie für verschiedene Funktionen verwendet habe.

Bei den Arrays finde ich es sehr schade, dass ich diese nicht mit einem Symbol identifizieren kann wie z.B. MyArray[rot].var1. Dies würde an vielen Stellen den Programmcode vereinfachen und ich würde wohl an vielen Stellen umsteigen.
Ich habe mir schon überlegt, ob ich versuche, dass über Anwenderkonstanten zu lösen: rot =1, blau = 2 etc. Nur müsste ich das dann für jedes Array separat machen und die Deklaration befindet sich dann an einer anderen Stelle als das Array selbst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe jetzt mein Programm umgestellt und verwende jetzt an vielen Stellen Arrays of UDTs statt viele UDTs hintereinander im DB wie bisher.

Mein Problem ist jetzt, dass es mir nicht mehr möglich ist Funktionen mit variabler Länge von Arrays aufzurufen. Ich bin mir eigentlich sicher, dass es nicht geht, aber vielleicht hat ja noch jemand eine Idee.

An einer anderen Stelle im Programm habe ich es schon mal so gelöst, dass ich in der Funktion ein temporäres Array of UDT erstellt habe. Als InOut habe ich dann einen Variant verwendet. In der Funktion überprüfe ich dann, ob der Variant vom richtigen Typ ist und kopiere mittels VariantGet in das temporäre Array.

In dieser Funktion ist das Array aber vom Typ Int und nicht besonders groß und ich muss nur lesend darauf zugreifen.

Jetzt versuche ich etwas ähnliches, allerdings ist der UDT etwa 200 Byte groß und das Array besteht aus bis zu 100 Elementen. Ich will aber nur einen Wert vom UDT für alle Elemente schreiben. Mit einem Temp-Array, würde die Kopiererei zu viel Zeit benötigten.

Als Notlösung überlege ich jetzt, die Arrays an den verschiedenen Stellen alle auf den Maximalwert zu setzen, was aber natürlich viel unnötigen Speicherplatz verbraucht.

Hat irgendjemand noch eine Idee?

Schönen Gruß,
Simon
 
Zurück
Oben