TIA TIA Portal V14


Wenn man ein Programmfenster rauszieht, gehen dann die Querverweise für dieses Fenster, wenn man das Querverweisfenster nicht rauszieht?
Das funktionierte vorher leider nicht!
 
Wenn man jetzt noch für den Index eine Konstante einsetzt, kann man sogar symbolisch auf ein Array zugreifen.
 
Guten Morgen,

Instanzen als Array einfügen ging doch in Step7 5.5 schon. ARRAY OF
Wir haben dann auch mittels Konstanten durchindexiert ( also nicht Variable[1] sondern Variable[Indexvariable] )

Ging das in TIA V13 nicht mehr ?

Mit Grüßen
 
Hallo Vollmi,

entschuldige, du hast recht. Ich habe noch einmal nachgeschaut und es waren Array of UDT.

Mit Grüßen
 
Einfach in der Variablentabelle unter Anwenderkonstanten Variablen mit dem gewünschten Tagnamen anlegen und denen den Indexwert als DINT (<-- laut Onlinehilfe beste performance für Indexe) zuweisen.



Nun kann man symbolisch auf das Array und seine Elemente zugreifen, sofern man Arrays außerhalb von Schleifen einsetzt.

Aber Achtung die Anzahl von Elementen in einer CPU ist begrenzt.

Hier eine 1518


https://w3.siemens.com/mcms/program...0/cpu/Documents/s7-1500_techn_data_cpu_de.pdf
Auf Seite 2,4,6,8 und 10 die anderen CPUs

Auch die lokalen Konstanten in der Schnittstelle können hierfür genutzt werden.
 
Zuletzt bearbeitet:
Oh FB Arrays gehen jetzt. Cool
Und wieder eine Möglichkeit mehr, SPS-Programme crashfreundlich zu schreiben, ohne daß ein Compiler dazwischenfunkt


Wenn man jetzt noch für den Index eine Konstante einsetzt, kann man sogar symbolisch auf ein Array zugreifen.
Da man Array-Elementen keinen Kommentar geben kann, ist das wohl die einzige Krücke, wie man ein Programm mit FB-Arrays halbwegs verständlich halten kann.

Gibt es eigentlich auch eine Möglichkeit, das Programm einer bestimmten FB-Array-Instanz zu beobachten?

Harald
 
Wenn jetzt schon Array-FBs gehen,
kann man diese dann auch in SCL in einer Schleife aufrufen, wie z.B. bei Codesys problemlos möglich?

Für etwas "komplexes" wie einen Motor-FB würde ich sowas nie verwenden, bei Codesys habe ich das aber sehr oft z.B. für ein Array Of 20 Schaltuhrbausteinen verwendet.

Mfg
Manuel
 
Für etwas "komplexes" wie einen Motor-FB würde ich sowas nie verwenden, bei Codesys ....
Angsthase , bei Codesys wird eigentlich alles in Arrays gepackt
Ich habe hier ein Array of 16 Motorbausteine oder of 24 Schrittketten (als Array of SchrittkettentypXYZ)
 
Und wieder eine Möglichkeit mehr, SPS-Programme crashfreundlich zu schreiben, ohne daß ein Compiler dazwischenfunkt

Nunja. Programmier mal 200 Auma Klappen die alle dasselbe machen nur an verschiedenen Orten der Anlage. Alle Klappen haben eine eindeutige Nummer. vom SCADA wird ebenfalls per Nummer auf ein Array in einem DB die Klappe bedient.
Mein Brandprogramm greift per Array auf die Klappen zu und öffnet per Nummer die richtige klappe (sollwert, befehl, Rückmeldung). Da in Step7 der FB nicht als Array deklariert werden konnte. War der FB aufruf eigentlich das einzige im Programm welches nicht als Array stattfand. Dementsprechend Gross war der Aufrufende FB (mehrere Minuten zum öffnen und Download auf die CPU).

Jetzt kann ich den FB in einem Array deklarieren (array[1..212] of OBJ_Brandabsaugklappe) und kann per FOR schleife durch das ganze Aufrufarray durchrattern. Der Baustein ist dann in Echt nur noch 10 Zeilen lang und macht exakt dasselbe wie der Baustein der vorher 2000 Zeilen lang war.

Ich würd sagen das ist sehr crashsicher. Und ich hab mich bei den Instanzaufrufen nicht nur einmal im Namen der Instanz vertippt und aus versehen eine Instanz der 200 Stück zweimal aufgerufen und eine keinmal. Das passiert dir in der Arrayabarbeitung nicht.

mfG René
 
Ich würd sagen das ist sehr crashsicher.
Wenn Du indirekt/indiziert auf eine nicht existierende FB-Array-Instanz zugreifst, dann merkt das das SPS-Programm erst zur Laufzeit. Ein Compiler kann Dich nicht warnen.

Und ich hab mich bei den Instanzaufrufen nicht nur einmal im Namen der Instanz vertippt und aus versehen eine Instanz der 200 Stück zweimal aufgerufen und eine keinmal. Das passiert dir in der Arrayabarbeitung nicht.
Das kann Dir aber genauso beim Bezug auf die Instanzen passieren, vor allem, wenn die Instanzen keine "sprechenden" Namen mehr haben.

Der Baustein ist dann in Echt nur noch 10 Zeilen lang und macht exakt dasselbe wie der Baustein der vorher 2000 Zeilen lang war.
Dafür ist nun vermutlich die erzeugte Codegröße und die Zykluszeit dreimal so groß.


Wie versorgst Du die FB-Array-Instanzen mit Übergabeparametern? Die müssten dann ja wohl auch alle als Array vorliegen?

Harald
 
Wenn Du indirekt/indiziert auf eine nicht existierende FB-Array-Instanz zugreifst, dann merkt das das SPS-Programm erst zur Laufzeit. Ein Compiler kann Dich nicht warnen.

Natürlich. Das ist aber bei Arrays immer der Fall und bei einem Arrayloop für FBs genau gleich schlimm wie überall sonst auch. Allerdings wäre das mit den Zyklischen Loops nur um zyklisch durch ein paar FBs zu zirkeln ja recht unproblematisch da so ein Array ja üblicherweise nur einmal angefasst wird, nämlich beim Erstellen.

Da hab ich wesentlich fiesere Möglichkeiten im Programm da Pointer falsch zu setzen. Aber auch die sieht man ja sofort wenn da Grenzen überschritten werden wenn der Baustein geladen wurde.

Das kann Dir aber genauso beim Bezug auf die Instanzen passieren, vor allem, wenn die Instanzen keine "sprechenden" Namen mehr haben.

Wenn man das Programm sozusagen Nummerisch aufbauen kann. dann ist die Nummer der Name. Mich interessiert normalerweise nicht die BMK nummer der Klappe sondern ich weiss das Brandklappe 20 sich in Brandsektor 30 befindet und von Rauchmelder 30 ausgelöst wird.

Dafür ist nun vermutlich die erzeugte Codegröße und die Zykluszeit dreimal so groß.

Wieso sollte die Codegrösse grösser werden wenn die Instanz nachher per For Schleife abgearbeitet wird? Die Codegrösse müsste ja eher 200 mal kleiner sein als wenn man jede Instanz einzeln deklariert und aufruft.

Also das für 200 klappen
Code:
      CALL  #Klp01
       LS_PAR             :="LRU_N_KLP".ABL[1]
       AumaIN             :="Nord_RU_KLP_LST->AS".Ab[1]
       WD                 :="AS Röhre Nord"._DBX_1012_5
       Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
       Gesamt_Oeffnung    :=#Gesamt_Oeffnung_Z1
       Venti_An           :=#VentiZone1
       Venti_Klein        :=
       AumaOut            :="Nord_RU_KLP_AS->LST".AbL[1]
       Tuere              :=
       Klp_Fahr           :="Brandarrays".Klp[1]
       Zonen_Oeffnung     :=#Zonen_Oeffnung_Z1
       Tuere_Bedienart    :="LRU_N_KLP".Tuere[1].BA


      CALL  #Klp02
       LS_PAR             :="LRU_N_KLP".ABL[2]
       AumaIN             :="Nord_RU_KLP_LST->AS".Ab[2]
       WD                 :="AS Röhre Nord"._DBX_1012_5
       Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
       Gesamt_Oeffnung    :=#Gesamt_Oeffnung_Z1
       Venti_An           :=#VentiZone1
       Venti_Klein        :=
       AumaOut            :="Nord_RU_KLP_AS->LST".AbL[2]
       Tuere              :=
       Klp_Fahr           :="Brandarrays".Klp[2]
       Zonen_Oeffnung     :=#Zonen_Oeffnung_Z1
       Tuere_Bedienart    :="LRU_N_KLP".Tuere[2].BA


      CALL  #Klp03
       LS_PAR             :="LRU_N_KLP".ABL[3]
       AumaIN             :="Nord_RU_KLP_LST->AS".Ab[3]
       WD                 :="AS Röhre Nord"._DBX_1012_5
       Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
       Gesamt_Oeffnung    :=#Gesamt_Oeffnung_Z1
       Venti_An           :=#VentiZone1
       Venti_Klein        :=
       AumaOut            :="Nord_RU_KLP_AS->LST".AbL[3]
       Tuere              :=
       Klp_Fahr           :="Brandarrays".Klp[3]
       Zonen_Oeffnung     :=#Zonen_Oeffnung_Z1
       Tuere_Bedienart    :="LRU_N_KLP".Tuere[3].BA

Braucht doch sicher mehr Speicher auf der CPU wie dieses
Code:
For #index 1 to 200 do
      CALL  #Klp[index]
       LS_PAR             :="LRU_N_KLP".ABL[index]
       AumaIN             :="Nord_RU_KLP_LST->AS".Ab[index]
       WD                 :="AS Röhre Nord"._DBX_1012_5
       Global_BF_Bedienart:="AS Röhre Nord"._DBW_22_0
       Gesamt_Oeffnung    :=#Gesamt_Oeffnung_Z1
       Venti_An           :=#VentiZone1
       Venti_Klein        :=
       AumaOut            :="Nord_RU_KLP_AS->LST".AbL[index]
       Tuere              :=
       Klp_Fahr           :="Brandarrays".Klp[index]
       Zonen_Oeffnung     :=#Zonen_Oeffnung_Z1
       Tuere_Bedienart    :="LRU_N_KLP".Tuere[index].BA
end_for;

Wie versorgst Du die FB-Array-Instanzen mit Übergabeparametern? Die müssten dann ja wohl auch alle als Array vorliegen?

Natürlich. Aber das tun sie üblicherweise sowieso weil ich die Berechnung eh über Arrays mache ich erkenne einen Brand in einem Sektor der Nummerisch in einem Array mit allen Parametern abgelegt ist. von diesem Ort kann ich dann rechnerisch ableiten welche Klappen um wieviel öffnen müssen um die richtige Strömung zu bekommen.
Auch Windmessung und Rauchmelder liegen in einem Array

Das meiste ermittle ich rechnerisch. Also Brandzone nr soundsoviel bringt bei der windgeschwindigkeit klappe soundso bis soundso pluss ggf ersatzklappe links oder rechts davon. Ventilator nr soviel kommt dann auch.

dazu gibts dann einfach noch einige Sonderfälle die direkt ausprogrammiert sind z.b. an Sektorengrenzen wo die klappengruppe nicht weitergeschoben wird sondern in sektor 30 bleibt bis sektor 33 erreicht wird und dann erst in sek 33 aufgehen.

mfG René
 
@Vollmi

Arbeitest du am BER mit? ;-)
Dann laß dir bitte noch viel Zeit.
 
Das beispiel von Vollmi, hat von mir eine Zustimmung für seine Anwendung.

Ich glaube nicht das er damit eine moderne 1500er in die Knie zwingen wird.

Das Programm wird kurz, knackig und überichtlich.

Ich gehe jetzt mal davon aus, das er es in der Praxis inbetrieb nehmen wird
und somit Verifizieren und Validieren. Wo soll also das Problem entstehen.
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…