TIA TIA Portal V14

Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 34182

... ich kann jetzt (egal ob Funktionsbaustein, Beobachtunstabelle, Kurvenscheibeneditor, ...) aus dem Framework rausziehen und beliebig anordnen.
Für mich ein wichtiges / das wichtigste Feature bzgl. Usability - also auch bildschirmübergreifendes Arbeiten.

Wenn man ein Programmfenster rauszieht, gehen dann die Querverweise für dieses Fenster, wenn man das Querverweisfenster nicht rauszieht?
Das funktionierte vorher leider nicht!
 
bitte mal im ganzen satz, was meinst du?

Ich meine man kann nun in SCL FB instanzen im Array deklarieren.
screenshot.56.jpg


Das ging in V13 soweit ich weiss nur in FUP.

mfG René
 
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
 
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.

ArraymitSymbol.jpg

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
Elemente.png

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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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é
 
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.
 
Zurück
Oben