TIA Ungültige Array Variable

Credofire

Level-1
Beiträge
640
Reaktionspunkte
35
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Für eine Auswertung habe ich ein UDT mit einem Array [0..3, 0..15] of Real angelegt und die Tabelle mit Werten gefüllt die ich auslesen möchte.
In meinem FB habe ich eine Variable Zuweisung vom Typ UDT angelegt.
Wenn ich jetzt die Ausgabevariable := Zuweisung[Variable1, variable2]; eingebe, dann macht er mir die Variable Zuweisung als ungültige Arrayvariable

Code:
    #Ir_klar := #Zuweisung[#PKE_Mode, #Temp1_int];

Hat jemand eine Idee? Liegt es vielleicht daran, dass ich ein UDT-Array verwende?

Ich weis man kann es auch mit DB und Adressberechnung machen, das gefällt mir aber irgendwie nicht so.
 
da fehlt nach #zuweisung noch die variable in dem udt.

also z.B. #zuweisung.variable[#PKE_Mode, #Temp1_int]

"variable" ist der name des Arrays in deinem udt.

mfG René
 
Servus,
ich kapere mal einen Thread, da meiner den identischen Titel tragen würde:

Folgende Situation:
TIA v17Upd3
FB in SCL

Ein relativ kleines bisschen Code in dem ich ein paar Arrays nutze.
Der Code selbst ist von dem erzeugten Ergebnis her nicht das Problem. Er macht genau das, was er soll.
Jetzt wird´s spannend, bitte genau mitlesen! :

Ich hab den gesamten Code mit etwa 100 Zeilen Stück für Stück zusammengeschrieben und zwischendrin immer an einer physisch vorhandenen Station getestet. So lange, bis ich zufrieden war.
Als dann alles Schick war, hab ich das Projekt gespeichert und den Baustein in meine Master-Bibliothek kopiert (Gerätebaum, rechtsklick, Kopieren -> Master Bibliothek, Gerätebaum, rechtsklick, einfügen)
INFO: Die konfigurierte Station in der Testumgebung ist zu 100% identisch mit der Station in der Master Bibliothek!

Jetzt kommt das Kuriose:
Will ich dort den 100% gleichen Baustein übersetzen, sagt er zu fast (!) allen Array-vorkommen "Ungültige Array-Variable".
Das betrifft alle Arrays, bis auf das "ptrig"-Array. Da wirft er keinen Fehler.

UND jetzt wird es noch seltsamer:
Benenne ich das/die betroffenen Array´s einfach nur um (KEINE weiteren Änderungen) lässt er mich sauber übersetzen & Laden -> alles ist wieder TOP, als wenn nichts gewesen wäre.

UND als wenn´s nicht noch komischer kommen könnte:
Sobald ich jetzt das Projekt speichere, TIA schließe, wieder öffne und das Projekt lade -> Übersetzen nicht möglich: "Ungültige Array-Variable".
Ändere ich auch nur einen Buchstaben des Array´s, kann ich wieder Übersetzen. Das Spiel kann ich ewig wiederholen.

Lustigerweise war das bei den letzten 4 Versuchen bei den Array´s "position", "setpoint" und "currsp" der Fall. Nur ein Umbenennen hat kurzfristig abhilfe geschaffen. Mitlerweile ist es so, dass es nur noch das "setpoint"-Array betrifft.


Hier das ganze als kurze Bilderstrecke:

Projekt frisch geladen: Hier heißt das Array noch "setpoint". Kein Übersetzen möglich!
1652470464493.png


Direkt den Namen geändert auf "setpoin" (ohne t). Übersetzt ohne Probleme:
1652471125637.png

Dann Projekt gespeichert, TIA geschlossen, wieder geöffnet und geladen: Bähmm.. Ungültig...
1652471738972.png

Ich hab schon ganze Stationen kopiert: Gleiches Spiel
Die Array-Remanenz geändert: Gleiches Spiel
Positionen in der Deklarationstabelle geändert: Gleiches Spiel
Attribute des FBs angepasst/geändert: Gleiches Spiel

Ich weiß nicht mehr weiter.. ich brauch das morgen früh an einer Produktionsanlage und ich kann mir Einfach keinen Reim drauf machen. Auch nicht, warum es einmal drei Array´s betrifft, dann jetzt nur eines.

Hilfe

Danke!!

Manuel


:EDIT:
Ich muss nicht mal das Projekt schließen, Baustein schließen reicht dafür schon aus.
 
Zuletzt bearbeitet:
Hört sich erst mal nach einen Bug im TIA-Portal an. Was passiert denn, wenn du an OUT eine Zwischenvariable verwendest, und diesen Wert anschließend der Variable im Array zuweist?

Unabhängig davon, würde ich die Umskalierung ohne den Umweg über eine Integervariable mit möglichem Genauigkeitsverlust vornehmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gerade getestet. Geht nicht.

ich bin sogar so weit gegangen ALLES, bis auf einer einzigen Zuweisung zu Löschen. (Deklaration, bis auf eine Temp-Variable und die Array-Variable, sowie auch den gesamten Code)
Genau das gleiche.

Da steht nur noch: (kurzform aus dem Gedächtnis)

VAR_Static
#setpoint: Array[0..1] of real;
VAR_Temp
#value: real;

Code:
#setpoint[1] := #value;

und es gibt den gleichen Fehler. Ich hab sogar ALLES in der Station gelöscht. Variablentabellen, Technologieobjekte, Systemobjekte.. alles bis auf das bisschen code..

Ich gehe auch sehr stark von einem Bug aus. Sowas hab ich noch nicht erlebt... vielleicht liegt es auch am Kopierprozess. Ich habe jetzt einen neuen FB erstellt und alles abgeschrieben. Bis jetzt sieht es gut aus.. hoffe das klappt morgen auch an der Anlage o_O
 
Die Idee ist gut, aber leider nicht plausibel.
Der jetzt abgeschriebene, neue FB hat gleich lautende Variabel in der Deklaration.
Da tritt der Bug (bisher) nicht auf.
Weiter hab ich ja wirklich alles aus dem Projekt entfernt. Und dennoch war kein übersetzen möglich.

Naja, ich hoffe es läuft jetzt auf Dauer. Vielleicht finde(-n) ich (wir) ja die Rätsels Lösung noch...
Danke schonmal 👍
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kurze Rückmeldung:
Lief heute eigentlich ganz gut.
Wie so oft war die heimische Vorarbeit mal wieder nur ein gutes Grundgerüst in dem doch deutlich mehr an die reelle Anlage angepasst werden musste als zunächst gedacht. Dafür brauchte ich noch ein paar loops und Arrays. Und es passierte wieder... "ungültige array-variable". Aber nicht sofort, erst nach dem direkten Zugriff/Zuweisung des dritten elements. Dann gingen aber alle Elemente dieses Arrays nicht mehr... Die Anderen Arrays hats glücklicherweise nicht zerhackt.

Hab das array gleich gelöscht und neu angelegt. Hat funktioniert.

Irgendwo ist da im Tia der Wurm drin..
 
Unabhängig davon, würde ich die Umskalierung ohne den Umweg über eine Integervariable mit möglichem Genauigkeitsverlust vornehmen.
Wie meinst?
Der 'OUT' vom unscale ist doch vom Typ 'int'
Der 'IN' vom scale ist doch auch vom Typ 'int'
Und meine 'norm1' variable ist auch 'int'

Hab doch keinen Genauigkeitsverlust, oder? Hilf mit auf die Sprünge 🙂

Aber ja, ich bräuchte keine vier eigenen 'int' variablen (norm1...norm4). Das ginge auch mit einer einzigen temporären Durchlauf variable, da ich unscale und scale direkt nacheinander ausführe und die Werte nirgends anders noch einzeln brauche.
 
Hab doch keinen Genauigkeitsverlust, oder? Hilf mit auf die Sprünge 🙂
Über den Zwischenschritt im Datentyp Integer wird gerundet. Die SCALE/UNSCALE Bausteine sind eigentlich dazu gedacht einen Gleitkommawert für eine Analogkarte umzurechnen. Bei dir gehen alle Wertunterschiede < 25/27648 = ca. 0,0009 unter, was bei kompletter Rechnung in Gleitkomma nicht der Fall wäre. Zudem würden einige Rechen- und Umwandlungsoperationen entfallen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,
ich kapere mal einen Thread, da meiner den identischen Titel tragen würde:

Folgende Situation:
TIA v17Upd3
FB in SCL

Ein relativ kleines bisschen Code in dem ich ein paar Arrays nutze.
Der Code selbst ist von dem erzeugten Ergebnis her nicht das Problem. Er macht genau das, was er soll.
Jetzt wird´s spannend, bitte genau mitlesen! :

Ich hab den gesamten Code mit etwa 100 Zeilen Stück für Stück zusammengeschrieben und zwischendrin immer an einer physisch vorhandenen Station getestet. So lange, bis ich zufrieden war.
Als dann alles Schick war, hab ich das Projekt gespeichert und den Baustein in meine Master-Bibliothek kopiert (Gerätebaum, rechtsklick, Kopieren -> Master Bibliothek, Gerätebaum, rechtsklick, einfügen)
INFO: Die konfigurierte Station in der Testumgebung ist zu 100% identisch mit der Station in der Master Bibliothek!

Jetzt kommt das Kuriose:
Will ich dort den 100% gleichen Baustein übersetzen, sagt er zu fast (!) allen Array-vorkommen "Ungültige Array-Variable".
Das betrifft alle Arrays, bis auf das "ptrig"-Array. Da wirft er keinen Fehler.

UND jetzt wird es noch seltsamer:
Benenne ich das/die betroffenen Array´s einfach nur um (KEINE weiteren Änderungen) lässt er mich sauber übersetzen & Laden -> alles ist wieder TOP, als wenn nichts gewesen wäre.

UND als wenn´s nicht noch komischer kommen könnte:
Sobald ich jetzt das Projekt speichere, TIA schließe, wieder öffne und das Projekt lade -> Übersetzen nicht möglich: "Ungültige Array-Variable".
Ändere ich auch nur einen Buchstaben des Array´s, kann ich wieder Übersetzen. Das Spiel kann ich ewig wiederholen.

Lustigerweise war das bei den letzten 4 Versuchen bei den Array´s "position", "setpoint" und "currsp" der Fall. Nur ein Umbenennen hat kurzfristig abhilfe geschaffen. Mitlerweile ist es so, dass es nur noch das "setpoint"-Array betrifft.


Hier das ganze als kurze Bilderstrecke:

Projekt frisch geladen: Hier heißt das Array noch "setpoint". Kein Übersetzen möglich!
Anhang anzeigen 61059


Direkt den Namen geändert auf "setpoin" (ohne t). Übersetzt ohne Probleme:
Anhang anzeigen 61060

Dann Projekt gespeichert, TIA geschlossen, wieder geöffnet und geladen: Bähmm.. Ungültig...
Anhang anzeigen 61061

Ich hab schon ganze Stationen kopiert: Gleiches Spiel
Die Array-Remanenz geändert: Gleiches Spiel
Positionen in der Deklarationstabelle geändert: Gleiches Spiel
Attribute des FBs angepasst/geändert: Gleiches Spiel

Ich weiß nicht mehr weiter.. ich brauch das morgen früh an einer Produktionsanlage und ich kann mir Einfach keinen Reim drauf machen. Auch nicht, warum es einmal drei Array´s betrifft, dann jetzt nur eines.

Hilfe

Danke!!

Manuel


:EDIT:
Ich muss nicht mal das Projekt schließen, Baustein schließen reicht dafür schon aus.
Das Array-Problem in V17 ist wohl schon seit einiger Zeit bekannt, hier mal ein Leidensgenosse:
Siemens-Forum: TIA17: Avoid using Array[*]

Er schreibt:
Der Compiler markiert manchmal fälschlicherweise ein als Array[*] zugewiesenes Tag als Fehler. Der Screenshot sollte Ihnen einen Eindruck vermitteln. Die Codezeilen 2 und 3 werden vom Compiler nicht korrekt erkannt, während die Codezeilen 4 und 5 korrekt sind.
und liefert auch gleich einen Workaround:
1. Export the SCL code to a text file.
2. Delete the control block
3. Import the SCL text file to regenerate the control block.


PS:
In dem PDF zum Update 1/2/3 von TIA V17 findet sich kein Hinweis zu dem Arrayproblem. Der Bug ist also in der aktuellen V17 noch drin ( du nutzt ja auch TIA V17 Upd. 3 ). Mal sehen ob sich da in Update 4 was tut.
 
Zuletzt bearbeitet:
Hallo zusammen,

bei mir ist das Problem ebenfalls aufgetaucht jedoch bin ich der Meinung dass ich eine Lösung gefunden habe.

Ausgangssituation: Array[] -> ungültige Arrayvariable

Schritt 1: Array umbenennen in etwas komplett anderes
z.B. Array[] of Real wird zu Siemens[] of Real
dabei ändern sich der Namen des Array im Kompletten Programm

Schritt 2: Array löschen
das Array nur aus der Variablentabelle löschen nicht aus dem Programmcode

Schritt 3: Array neu anlegen
das Array wie am Anfang gewollt mit dem alten Namen benannt und auch bei den Datentypen werden die genommen welche man
benötigt. z.B. Array[] of Real

Schritt 4: alles umbenennen
jetzt muss im Programmcode jede Variable mit dem Namen Siemens[] in den alten/neuen Namen Array[] ungenannt werden.

schritt 5: sich freuen



Hoffe dass dieser Fall nicht nur bei mir so funktioniert und ich euch somit weiterhelfen konnte.

MfG
Pascal

PS: übersetzen hat anschließen auch ohne Probleme funktioniert und nach dem schließen und anschließend wieder öffnen (einmal nur Projekt und einmal komplettes Programm) war der Fehler immer noch weg.
 
Zurück
Oben