TIA Array beschreiben

Dani71

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich will einen Eingang eines Funktionsbausteins in TIA Portal beschreiben. Der Eingang ist ein Array vom Typ Integer.
Der Array hat zum Beispiel 2 Elemente. Nun will ich den Eingang mit Zahlen beschreiben. Ich kenne das aus C-Programmierung so:

[192,195]=array;

Meine Frage ist wie das Ganze in Tia Portal funktioniert?
 
LargoD meint genau das worauf ich hinaus will. Die Initialwerte direkt an den FC übergeben ist nicht möglich oder ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist es in diesem Zusammenhang eigentlich möglich einen allgemeinen FB zu schreiben und erst beim Aufruf zu bestimmen, wieviele Array-Elemente zur Anwendung kommen sollen?

Beispiel:

FC1 enthält ein Array[0..15]. Diese soll in einem allgemein programmierten FB aufgerufen werden.

Im FB müsste ja jetzt sowas wie Array[0..n) programmiert sein, wobei für diesen Fall beim Aufruf n mit der Zahl 15 beschrieben wird. Geht sowas? :confused:f
 
Ist es in diesem Zusammenhang eigentlich möglich einen allgemeinen FB zu schreiben und erst beim Aufruf zu bestimmen, wieviele Array-Elemente zur Anwendung kommen sollen?

Beispiel:

FC1 enthält ein Array[0..15]. Diese soll in einem allgemein programmierten FB aufgerufen werden.

Im FB müsste ja jetzt sowas wie Array[0..n) programmiert sein, wobei für diesen Fall beim Aufruf n mit der Zahl 15 beschrieben wird. Geht sowas? :confused:f

Soweit Ich weiß, nein! Das wäre ja dann dynamische Speicheralokierung, und wüsste nicht das dies geht!
 
Das wäre ja dann dynamische Speicheralokierung, und wüsste nicht das dies geht!
Das muß nichts mit dynamischer Speicherallokation zu tun haben - das zu übergebende Array kann/soll durchaus schon existieren.

Direkt als Array kann man verschieden große Arrays meines Wissens auch in TIA nicht übergeben, aber als ANY oder notfalls POINTER + extra Größen-Parameter. VARIANT geht wohl auch, läßt sich aber meines Wissens zur Zeit noch nicht im Baustein auswerten, was er erhalten hat. Geht es vielleicht schon mit unterschiedlich langen STRING? Was tatsächlich geht kommt auf die verwendete CPU drauf an.

Harald
 
Zuletzt bearbeitet:
Hallo,

es gibt die Möglichkeit ein Array über Konstanten zu deklarieren. Dann kann der Zugriff Symbolisch erfolgen und man muss bei Änderung der Größe des Feldes nur an einer Stelle ändern.

Array.jpg

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist es in diesem Zusammenhang eigentlich möglich einen allgemeinen FB zu schreiben und erst beim Aufruf zu bestimmen, wieviele Array-Elemente zur Anwendung kommen sollen?

Beispiel:

FC1 enthält ein Array[0..15]. Diese soll in einem allgemein programmierten FB aufgerufen werden.

Im FB müsste ja jetzt sowas wie Array[0..n) programmiert sein, wobei für diesen Fall beim Aufruf n mit der Zahl 15 beschrieben wird. Geht sowas? :confused:f


Das ist (noch) nicht möglich. Es geht aber das Gerücht umher, dass dies geplant ist.
 
Das ist (noch) nicht möglich. Es geht aber das Gerücht umher, dass dies geplant ist.

Das dürfte richtig schwer für Siemens werden, sowas zu realisieren. Immerhin müsste ja dann auch ein IDB per Laufzeit vergrössert und verkleinert werden können und dies ohne Datenverlust von Nachfolgend deklarierten Instanzen oder Instanzvariablen. Dazu kann dann bei Fehlern sogar der Arbeitsspeicher zur neige gehen.

Ich meine sie kriegens ja noch nichtmal hin DBs ohne Reinit zu aktualisieren wenn sie alle Daten offline zur verfügung haben.

mfG René
 
Ich glaube, einige Leser missverstehen spirit. Vielleicht kann sie nochmal eindeutig erklären was sie sucht. Und warum das ein FB sein soll.

Ich verstehe das so, daß der aufgerufene Baustein zur Laufzeit verschieden große Arrays übergeben bekommen soll (per Referenz) und irgendwas damit machen soll (*). In dem Baustein wäre dann wohl eine Schleife passend zur (automatisch erkannten?) Arraygröße. Das Array liegt außerhalb des aufgerufenen Bausteins.

(*) z.B. Min-/Max-Wert oder vorgegebenen Wert suchen, Mittelwert berechnen, ...
Wäre ja toll, wenn ein Baustein das mit zur Laufzeit verschieden großen Arrays könnte.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube, einige Leser missverstehen spirit. Vielleicht kann sie nochmal eindeutig erklären was sie sucht. Und warum das ein FB sein soll.

Ich verstehe das so, daß der aufgerufene Baustein zur Laufzeit verschieden große Arrays übergeben bekommen soll (per Referenz) und irgendwas damit machen soll (*). In dem Baustein wäre dann wohl eine Schleife passend zur (automatisch erkannten?) Arraygröße. Das Array liegt außerhalb des aufgerufenen Bausteins.

(*) z.B. Min-/Max-Wert oder vorgegebenen Wert suchen, Mittelwert berechnen, ...
Wäre ja toll, wenn ein Baustein das mit zur Laufzeit verschieden großen Arrays könnte.

Harald

Ok, dann versuche ich mich nochmals ...

Es steht derzeit keine best. Anwendung dahinter; angedacht ich einfach folgende beispielhafte Situation:


- Es wird ein Baustein programmiert, der ein Kühlhaus_1 steuert
- Das Kühlhaus soll um ein Kühlhaus_2 erweitert werden; in der Zukunft evtl. noch um weitere
- Damit nicht immer wieder ein neuer Baustein programmiert werden muss, soll für alle Kühlhäuser der schon bestehende herangezogen werden
- Somit könnte man hier ja von einem Multiinstanzaufruf ausgehen

Jetzt die Problematik:

Im programmierten Baustein gibt es ein Array[0..n].

- Beim Aufruf des Bausteins für Kühlhaus_1 soll gelten: Array[0..25]
- Beim Aufruf des Bausteins für Kühlhaus_2 soll gelten: Array[0..45]

Beim Multiinstanzaufruf wird jezt bei Kühlhaus_1 für n die Zahl 25 übergeben; bei Kühlhaus_2 für n die Zahl 45.

Das wäre meine Frage gewesen ... ;)
 
Hallo Spirit,

Siemens kann keine dynamische Speicherverwaltung (und ich habe auch jetzt schon Angst vor dem Tag an dem sie es vielleicht können wollen).
Was du also sinnvollerweise nur machen könntest wäre : du integrierst in deine Instanz ein Array, das groß genug für deine maximale Anforderung ist, und benutzt mal mehr oder weniger Elemente daraus. Hierbei solltest du dann aber auch überwachen, ob an dem Zahl-Input deines FB ein legaler Wert übergeben worden ist (also einer, der im Bereich der Array-Indexe liegt) - ansonsten diesen entweder auf Default setzen oder besser noch eine Fehlermeldung (vom FB) ausgeben.
Selbstverständlich gäbe es auch noch andere Wege, dieses Vorhaben umzusetzen - ich würde für mich aber nur den vorgeschlagenen in Betracht ziehen ...

Gruß
Larry
 
Hallo Spirit,

Siemens kann keine dynamische Speicherverwaltung (und ich habe auch jetzt schon Angst vor dem Tag an dem sie es vielleicht können wollen).
Was du also sinnvollerweise nur machen könntest wäre : du integrierst in deine Instanz ein Array, das groß genug für deine maximale Anforderung ist, und benutzt mal mehr oder weniger Elemente daraus. Hierbei solltest du dann aber auch überwachen, ob an dem Zahl-Input deines FB ein legaler Wert übergeben worden ist (also einer, der im Bereich der Array-Indexe liegt) - ansonsten diesen entweder auf Default setzen oder besser noch eine Fehlermeldung (vom FB) ausgeben.
Selbstverständlich gäbe es auch noch andere Wege, dieses Vorhaben umzusetzen - ich würde für mich aber nur den vorgeschlagenen in Betracht ziehen ...

Gruß
Larry

Lieben Dank Larry,

wenn ich es richtig verstehe, dann müsste ich in dem Baustein (Kühlhaus) ein Array verwenden, das groß genug ist. In dem genannten Fall ein Array[0..45].

Nur - wie sieht dann der Aufruf für Kühlhaus_1 (Array[0..25]) aus? :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau so ... du übergibst halt nur eine kleinere Zahl und verwendest im Baustein dann halt nur einen Teil der Array-Elemente.

Wofür benötigst du so eine Funktion ? Also wofür das Array in diesem Zusammenhang ?
 
Genau so ... du übergibst halt nur eine kleinere Zahl und verwendest im Baustein dann halt nur einen Teil der Array-Elemente.

Wofür benötigst du so eine Funktion ? Also wofür das Array in diesem Zusammenhang ?

Wie geschrieben Larry,

es steht momentan keine direkte Anwendung dahinter. Ich hatte mir einfach nur überlegt, wie so etwas gehandelt werden könnte, wenn ein Multiinstanzaufruf im Zusammenhang mit verschieden langen Array's zur Anwendung kommen soll.

In diesem Fall könnte das Array ein "Array of Time" sein, um z.B. einzelne Schritte einer Kette zu überwachen.
 
... das sollte keine Kritik sein ...
Man ist halt nur mit dem Vorschlagen viiiiiel effektiver wenn man versteht, was der Andere / die Andere zu tun beabsichtigt.
Außerdem lerne ich auch immer noch gerne dazu ... 8)

Gruß
Larry
 
Zurück
Oben