TIA Großes Array initialisieren?

sunny22

Level-2
Beiträge
261
Reaktionspunkte
52
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich müsste ein Array of Bool mit 611x58 Elementen in einem DB mit vorgegebenen Werten initialisieren. Ab einer bestimmten Größe verschwindet im TIA aber die Möglichkeit dies zu tun. Hat da jemand eine andere Idee außer das Array in mehrere kleinere aufzuteilen?
Grüße Oliver
 
Moin sunny22,

ich hatte auch mal ein Array, das >10.000 Zeilen war. Ab Zeile 10.000 war das Array nicht mehr aufklapp- bzw. darstellbar.

Trotzdem konnte man wie gewohnt im Code auf das Array zugreifen.
Das einfachste ist, wenn Du in einem Baustein eine temporäre Variable verwendest, die den gleichen Datentypen (Array) hat. Diese wird von TIA zur Laufzeit mit 0 initialisiert (braucht man nicht mehr explizit zu machen, auch wenn das guter Programmierstil ist).

Dann einfach zuweisen:

Code:
"DB".myARRAY := tempMyArray;

Darf ich fragen, warum die erste Dimension des Arrays ungerade ist? Ich würde auf 612 "aufstocken" (die 58 Bool (geht auch 56 oder 64?) tun doch nicht weh).
Also
611 * 58 = 35.438

612 * 56 = 34.272
612 * 64 = 39.168

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das einfachste ist, wenn Du in einem Baustein eine temporäre Variable verwendest, die den gleichen Datentypen (Array) hat. Diese wird von TIA zur Laufzeit mit 0 initialisiert
Aber nur wenn der Baustein auf "optimierter Bausteinzugriff" eingestellt ist, und nur bei S7-1x00 ab bestimmter Firmware.

Harald
 
Aber nur wenn der Baustein auf "optimierter Bausteinzugriff" eingestellt ist, und nur bei S7-1x00 ab bestimmter Firmware.
Da hast Du natürlich recht.

Ich muss zugeben, dass ich, wenn keine Angaben gemacht werden, immer von optimierten Bausteinen (ich nutze gar keine anderen) und aktueller Firmware ausgehe.

@sunny22 : Du hast nicht geschrieben, welche Steuerung, welche Firmware, welches Tia, ....

VG

MFreiberger
 
Die Frage ist halt ob man diese Funktionalität wirklich nutzen sollte, nur weil es in bestimmten Fällen geht. Geht schon los, dass man so eigentlich keine Standardbausteine verwenden kann, weil man nie zu 100% weiß ob alle nötigen Bedingungen erfüllt sind. Und zusätzlich muss es einem Programmierer/Instandhalter auch bewusst sein, der später an die Anlage kommt. Sonst schimpft der auch nur über den Ursprungsprogrammierer und wundert sich, wie das jemals funktioniert haben kann.

Eine offensichtliche Initialisierung von temp Variablen hingegen wird immer nachvollziehbar sein. Speicher etc. ist ja auch nicht mehr das Riesenthema, vor allem nicht, wenn dadurch besser wartbarer Code erzeugt wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Frage ist halt ob man diese Funktionalität wirklich nutzen sollte, nur weil es in bestimmten Fällen geht. Geht schon los, dass man so eigentlich keine Standardbausteine verwenden kann, weil man nie zu 100% weiß ob alle nötigen Bedingungen erfüllt sind. Und zusätzlich muss es einem Programmierer/Instandhalter auch bewusst sein, der später an die Anlage kommt. Sonst schimpft der auch nur über den Ursprungsprogrammierer und wundert sich, wie das jemals funktioniert haben kann.
Ja, das stimmt natürlich. Ich selber initialisiere temp-Variablen immer und wollte auch nur eine (möglichst einfache) Möglichkeit nennen. Aber, wenn ich die temp-Variable zuerst initialisiere, ist das natürlich Quatsch. Dann kann ich auch gleich das DB-Array initialisieren.

Weitere Möglichkeit ist, ein "Delete"-Array in einem DB anzulegen und dann die Zuweisung zu programmieren (wenn genug Speicher zur Verfügung steht).
Oder per Schleife "false" zuweisen. Dann wäre es natürlich schön, wenn man die Schleifenanzahl reduzieren könnte.

Beispielsweise ein Array[0..4429] of Byte anlegen, mit einer Schleife ablöschen und dann mit deserialize auf das Bool-Array umkopieren.

Oder ein Array[0..1107] of Dword anlegen, mit einer Schleife ablöschen, dann mit serialize auf eine Byte-Array und mit dem deserialize auf das Bool-Array umkopieren.
ACHTUNG: wenn man Serialize/Deserialize direkt hintereinander nutz (z.B. um von einer Struktur auf eine ander Struktur umzukopieren), dass muss die Variable (die muss groß genug sein) POS immer vorher mit 0 vorbelegt werden. Ich erwähne das nur, weil ich Schussel am Anfang eine Variable mit 0 vorbelegt habe und dann Serialize aufgerufen habe. Direkt danach Deserialize. Da war die Variable dann mit dem Wert, der bei Serialize rauskam vorbelegt... 🥸

VG

MFreiberger
 
Zuletzt bearbeitet:
Beispielsweise ein Array[0..4429] of Byte anlegen, mit einer Schleife ablöschen und dann mit deserialize auf das Bool-Array umkopieren.

Oder ein Array[0..1107] od Dword anlegen, mit einer Schleife ablöschen, dann mit serialize auf eine Byte-Array und mit dem deserialize auf das Bool-Array umkopieren.
ACHTUNG: wenn man Serialize/Deserialize direkt hintereinander nutz (z.B. um von einer Struktur auf eine ander Struktur umzukopieren), dass muss die Variable (die muss groß genug sein) POS immer vorher mit 0 vorbelegt werden. Ich erwähne das nur, weil ich Schussel am Anfang eine Variable mit 0 vorbelegt habe und dann Serialize aufgerufen habe. Direkt danach Deserialize. Da war die Variable dann mit dem Wert, der bei Serialize rauskam vorbelegt... 🥸

VG

MFreiberger
Wäre es nicht einfacher für das initialisieren des Arrays zwei ineinander verschachtelte for-Schleifen zu verwenden?
Wenn man die Zählvariablen mit Upperbound und Lowerbound vorher bestimmt ist man somit auch immer auf der sicheren Seite, wenn sich die Array Größe mal ändert.

LG Flo
 
Warnt TIA V16 oder V17 eigentlich beim Übersetzen, wenn man in Bausteinen mit Standard-Zugriff TEMP-Variablen liest, ohne sie vorher explizit initialisiert/beschrieben zu haben? TIA V15.1 tut das nicht.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre es nicht einfacher für das initialisieren des Arrays zwei ineinander verschachtelte for-Schleifen zu verwenden?
Wenn man die Zählvariablen mit Upperbound und Lowerbound vorher bestimmt ist man somit auch immer auf der sicheren Seite, wenn sich die Array Größe mal ändert.

LG Flo
Sicher kann man das machen. Aber dann hat man halt >35.000 Schleifendurchgänge.
 
Warnt TIA V16 oder V17 eigentlich beim Übersetzen, wenn man in Bausteinen mit Standard-Zugriff TEMP-Variablen liest, ohne sie vorher explizit initialisiert/beschrieben zu haben? TIA V15.1 tut das nicht.

Harald
Grade ausprobiert, TIA 16 Upd4 bei mir nicht. Noch ein Grund das nicht einzusetzen.
 
Warnt TIA V16 oder V17 eigentlich beim Übersetzen, wenn man in Bausteinen mit Standard-Zugriff TEMP-Variablen liest, ohne sie vorher explizit initialisiert/beschrieben zu haben? TIA V15.1 tut das nicht.

V17 warnt hier auch nicht, warnt aber immer noch wenn man ein UDT auf Hardware anlegt, die eigentlich eine ungerade Byteanzahl groß ist aber das UDT hier von Siemens auf gerade Bytezahl aufgerundet wird, dass die Adressen nicht existieren würden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erst einmal vielen Dank für eure Antworten.
Punkt1: Es handelt sich um eine aktuelle 1200er Steuerung die mit TIA V17 programmiert wird.
Punkt2: Die Array-Größe ergibt sich aus der Anzahl der zu steuernden Aktoren im Gesamtsystem
Daraus ergibt sich auch Punkt 3: Das Array muss nicht einfach nur initialisiert werden. Es handelt sich dabei um eine Steuermatrix bei der jedes Element mit einem vorgegebenen Wert belegt werden muss.
Ich habe das jetzt mit einer Quelle gelöst. Im Editor lässt sich das Array zwar trotzdem nicht öffnen, die Quelle wird aber korrekt übersetzt und im Programm kann man auf die Daten zugreifen.
 
Zurück
Oben