TIA Probleme bei Array Definition

schwimmer

Level-3
Beiträge
1.770
Reaktionspunkte
655
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
bisher habe ich Arrays eher mit festen Grenzen (Array [0...15] of Int) eingesetzt.
Ich habe für die Array-Größe auch schon lokale Konstanten als Länge vorgegeben, jetzt wollte ich die Länge über eine Variable oder zumindest Globale Konstante vorgeben, was ja laut Hilfe möglich sein sollte.
Doch egal wie ich es versuche, bei der Globalen Konstante bekomme ich die Fehlermeldung das diese nicht bekannt ist. (Array [0...#GlobaleKonstante] of Int)
Wenn ich es mit einer Variablen ((Array [0..."Variable"] of Int) versuche, kommt die Fehlermeldung Datentype nicht bekannt
Wie ist dir richtige Vorgehensweise damit die Definition klappt?

TIA V17 Upd6
CPU 1515F-2-PN
 
Variablen sind zur Deklaration von Arrays nicht zulässig.
Globale Konstanten werden nicht mit # gekennzeichnet, sondern mit " vorne und hinten. Die fügt TIA IMHO auch selbständig hinzu, wenn man nur den Namen angibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay, danke
Mit der globalen Konstante das hat schon mal geklappt.
Wie wäre denn die Vorgehensweise wenn ich ein Array mit variabler Länge benötige?
Wenn ich (Array[*] ofInt) probiere, kommt die Fehlermeldung ein Array mit variabler Länge sei nicht zulässig. Der Baustein ist aber optimiert.
 
Wie wäre denn die Vorgehensweise wenn ich ein Array mit variabler Länge benötige?

Sorry, das gibt's nicht.
Der Steuerung muss mit Übergang in Run die Speicherbereiche bekannt sein.

Was vielleicht gehen könnte wäre ein online erzeugter DB. Hat aber auch seine Tücken und Nachteile. Ob da überhaupt ein Symbolischer Zugriff möglich ist müsstest du mal nachlesen.
 
Wie wäre denn die Vorgehensweise wenn ich ein Array mit variabler Länge benötige?
Wie jetzt bereits mehrfach gesagt:
Sorry, das gibt's nicht.
Variablen sind zur Deklaration von Arrays nicht zulässig.


Der Baustein ist aber optimiert.
Und ob optimiert oder nicht, spielt bei "nicht zulässig" für die Deklaration keinerlei Rolle.

Das Einzige was geht, sind optimierte FB/FC mit einen variablen Formalparameter ARRAY[*] OF ...,
weil dort die wirkliche Größe des Arrays zum Zeitpunkt des Übersetzens durch den Aktualparameter fest steht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Soweit habe ich es verstanden
Das Einzige was geht, sind FB/FC mit einen variablen Formalparameter ARRAY[*] OF ...,
weil dort die wirkliche Größe des Arrays zum Zeitpunkt des Übersetzens durch den Aktualparameter fest steht.
Aber auch bei der Schreibweise bekomme ich einen Fehler, das ein Array mit variabler Länge sei nicht zulässig ist.
Wie mache ich es richtig und wie weise ich bei der Verwendung von ARRAY[*] die gewünschte Länge zu?
 
Aber auch bei der Schreibweise bekomme ich einen Fehler, das ein Array mit variabler Länge sei nicht zulässig ist.
Wie mache ich es richtig und wie weise ich bei der Verwendung von ARRAY[*] die gewünschte Länge zu?
Das geht nur in optimierten FB/FC!
1698495730513.png


Die Länge wird dann beim Aufruf des FB/FCs durch die Angabe des jeweiligen Aktualparameters festgelegt, z.B.:
1698496147961.png

1698496106872.png

PS:
Im FB/FC kann man dann die Array-Größe mit:
1698496813831.png
prüfen (CountOfElements ist nur für Variant).
 
Zuletzt bearbeitet:
LowerBound und UpperBound wird genutz, wenn man einen Baustein schreiben will, der mit verschieden langen Arrays am Eingang bzw. InOut umgehen kann. Aber die länge wird durch die Zuweisung eines Arrays dann von außen vorgegeben.
Ein dynamisches Array während der Laufzeit ist so nicht möglich. Liegt halt dran, dass die PLC primär ein Echtzeit System mit Zyklusüberwachung ist und mit zur Laufzeit dynamischen Arrays nur sxhwer vereinbar ist.

Neben den globalen Konstanten, kann man auch eine lokale Konstante im Baustein anlegen und als Array Definition verwenden.
 
Ich möchte Istwerte eines Prozesses in einem Array sichern um am Ende eine Trendkurve am Panel darzustellen. . Mein Ansatz war es nun z.B. alle 5sec einen Wert zu sichern, da die Prozesse aber unterschiedlich lang sein können, müsste auch das Array sich ändern.

Bin jetzt den anderen Weg gegangen, Die Länge des Array über eine Konstante definiert und passe darüber meinen Zyklus an mit dem die Daten geschrieben werden.
 
@schwimmer : du hast doch auch sicherlich eine maximale Prozesszeit. Einfach die nehmen und ggf. einen kleinen Zuschlag drauf und das für die Array-Diemensionierung verwenden.
Dazu kannst du dann ja noch zusätzlich in deine Schreib-Routine mit einbauen, dass sie das Array-Ende überwacht (und nicht versucht darüber hinaus zu schreiben) ...
 
Zurück
Oben